ardo 1.2.2 → 1.2.3
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.
|
@@ -827,9 +827,11 @@ export default function MarkdownContent() {
|
|
|
827
827
|
if (typedoc) {
|
|
828
828
|
const packageRoot = findPackageRoot(process.cwd());
|
|
829
829
|
const defaultEntryPoint = packageRoot ? `${packageRoot}/src/index.ts` : "./src/index.ts";
|
|
830
|
+
const defaultTsconfig = packageRoot ? `${packageRoot}/tsconfig.json` : "./tsconfig.json";
|
|
830
831
|
const defaultTypedocConfig = {
|
|
831
832
|
enabled: true,
|
|
832
833
|
entryPoints: [defaultEntryPoint],
|
|
834
|
+
tsconfig: defaultTsconfig,
|
|
833
835
|
out: "api-reference",
|
|
834
836
|
excludePrivate: true,
|
|
835
837
|
excludeInternal: true
|
|
@@ -1143,4 +1145,4 @@ export {
|
|
|
1143
1145
|
getPageDataForRoute,
|
|
1144
1146
|
generateSidebar2 as generateSidebar
|
|
1145
1147
|
};
|
|
1146
|
-
//# sourceMappingURL=chunk-
|
|
1148
|
+
//# sourceMappingURL=chunk-JKAXHFHJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/markdown/pipeline.ts","../src/markdown/containers.ts","../src/markdown/toc.ts","../src/markdown/shiki.ts","../src/markdown/links.ts","../src/vite/routes-plugin.ts","../src/vite/plugin.ts","../src/runtime/loader.ts","../src/runtime/sidebar.ts"],"sourcesContent":["import { unified } from \"unified\"\nimport remarkParse from \"remark-parse\"\nimport remarkGfm from \"remark-gfm\"\nimport remarkFrontmatter from \"remark-frontmatter\"\nimport remarkDirective from \"remark-directive\"\nimport remarkRehype from \"remark-rehype\"\nimport rehypeStringify from \"rehype-stringify\"\nimport matter from \"gray-matter\"\nimport type { MarkdownConfig, TOCItem, PageFrontmatter } from \"../config/types\"\nimport { remarkContainers } from \"./containers\"\nimport { remarkExtractToc, type TocExtraction } from \"./toc\"\nimport { createShikiHighlighter, rehypeShikiFromHighlighter, type ShikiHighlighter } from \"./shiki\"\nimport { rehypeLinks } from \"./links\"\n\nexport interface TransformResult {\n html: string\n frontmatter: PageFrontmatter\n toc: TOCItem[]\n}\n\nexport interface TransformOptions {\n basePath?: string\n highlighter?: ShikiHighlighter\n}\n\nexport async function transformMarkdown(\n content: string,\n config: MarkdownConfig,\n options: TransformOptions = {}\n): Promise<TransformResult> {\n const { data: frontmatter, content: markdownContent } = matter(content)\n const { basePath = \"/\", highlighter: providedHighlighter } = options\n\n const tocExtraction: TocExtraction = { toc: [] }\n const highlighter = providedHighlighter ?? (await createShikiHighlighter(config))\n\n const processor = unified()\n .use(remarkParse)\n .use(remarkFrontmatter, [\"yaml\"])\n .use(remarkGfm)\n .use(remarkDirective)\n .use(remarkContainers)\n .use(remarkExtractToc, { tocExtraction, levels: config.toc?.level ?? [2, 3] })\n .use(remarkRehype, { allowDangerousHtml: true })\n .use(rehypeShikiFromHighlighter, { highlighter, config })\n .use(rehypeLinks, { basePath })\n .use(rehypeStringify, { allowDangerousHtml: true })\n\n if (config.remarkPlugins) {\n for (const plugin of config.remarkPlugins) {\n processor.use(plugin as Parameters<typeof processor.use>[0])\n }\n }\n\n if (config.rehypePlugins) {\n for (const plugin of config.rehypePlugins) {\n processor.use(plugin as Parameters<typeof processor.use>[0])\n }\n }\n\n const result = await processor.process(markdownContent)\n\n return {\n html: String(result),\n frontmatter: frontmatter as PageFrontmatter,\n toc: tocExtraction.toc,\n }\n}\n\nexport async function transformMarkdownToReact(\n content: string,\n config: MarkdownConfig\n): Promise<TransformResult> {\n return transformMarkdown(content, config)\n}\n","import type { Root } from \"mdast\"\nimport type { ContainerDirective } from \"mdast-util-directive\"\nimport { visit } from \"unist-util-visit\"\n\nconst containerTypes = [\n \"tip\",\n \"warning\",\n \"danger\",\n \"info\",\n \"note\",\n \"details\",\n \"code-group\",\n] as const\ntype ContainerType = (typeof containerTypes)[number]\n\nconst defaultTitles: Record<ContainerType, string> = {\n tip: \"TIP\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n info: \"INFO\",\n note: \"NOTE\",\n details: \"Details\",\n \"code-group\": \"\",\n}\n\nexport function remarkContainers() {\n return function (tree: Root) {\n visit(tree, \"containerDirective\", (node: ContainerDirective) => {\n const type = node.name as ContainerType\n\n if (!containerTypes.includes(type)) {\n return\n }\n\n const data = node.data || (node.data = {})\n\n const titleNode = node.children[0]\n let customTitle: string | undefined\n\n if (\n titleNode &&\n titleNode.type === \"paragraph\" &&\n titleNode.children[0]?.type === \"text\" &&\n titleNode.data?.directiveLabel\n ) {\n customTitle = (titleNode.children[0] as { value: string }).value\n node.children.shift()\n }\n\n const title = customTitle || defaultTitles[type]\n\n if (type === \"code-group\") {\n data.hName = \"div\"\n data.hProperties = {\n className: [\"press-code-group\"],\n }\n\n const tabs: Array<{ label: string; content: unknown }> = []\n\n for (const child of node.children) {\n if (child.type === \"code\") {\n const codeNode = child as { lang?: string; meta?: string; value: string }\n const meta = codeNode.meta || \"\"\n const labelMatch = meta.match(/\\[([^\\]]+)\\]/)\n const label = labelMatch ? labelMatch[1] : codeNode.lang || \"Code\"\n tabs.push({ label, content: child })\n }\n }\n\n const tabsHtml = tabs\n .map(\n (tab, i) =>\n `<button class=\"press-code-group-tab${i === 0 ? \" active\" : \"\"}\" data-index=\"${i}\">${escapeHtml(tab.label)}</button>`\n )\n .join(\"\")\n\n node.children = [\n {\n type: \"html\",\n value: `<div class=\"press-code-group-tabs\">${tabsHtml}</div>`,\n } as unknown as (typeof node.children)[number],\n {\n type: \"html\",\n value: '<div class=\"press-code-group-panels\">',\n } as unknown as (typeof node.children)[number],\n ...tabs.map(\n (tab, i) =>\n ({\n type: \"html\",\n value: `<div class=\"press-code-group-panel${i === 0 ? \" active\" : \"\"}\" data-index=\"${i}\">`,\n }) as unknown as (typeof node.children)[number]\n ),\n ...node.children.flatMap((child: (typeof node.children)[number], _i: number) => [\n child,\n {\n type: \"html\",\n value: \"</div>\",\n } as unknown as (typeof node.children)[number],\n ]),\n {\n type: \"html\",\n value: \"</div>\",\n } as unknown as (typeof node.children)[number],\n ]\n\n return\n }\n\n if (type === \"details\") {\n data.hName = \"details\"\n data.hProperties = {\n className: [\"press-details\"],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<summary class=\"press-details-summary\">${escapeHtml(title)}</summary>`,\n } as unknown as (typeof node.children)[number])\n\n return\n }\n\n data.hName = \"div\"\n data.hProperties = {\n className: [\"press-container\", `press-container-${type}`],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<p class=\"press-container-title\">${escapeHtml(title)}</p>`,\n } as unknown as (typeof node.children)[number])\n })\n }\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import type { Root, Heading } from \"mdast\"\nimport { visit } from \"unist-util-visit\"\nimport type { TOCItem } from \"../config/types\"\n\nexport interface TocExtraction {\n toc: TOCItem[]\n}\n\ninterface TocOptions {\n tocExtraction: TocExtraction\n levels: [number, number]\n}\n\nexport function remarkExtractToc(options: TocOptions) {\n const { tocExtraction, levels } = options\n const [minLevel, maxLevel] = levels\n\n return function (tree: Root) {\n const headings: Array<{ text: string; level: number; id: string }> = []\n\n visit(tree, \"heading\", (node: Heading) => {\n if (node.depth < minLevel || node.depth > maxLevel) {\n return\n }\n\n const text = getHeadingText(node)\n const id = slugify(text)\n\n headings.push({\n text,\n level: node.depth,\n id,\n })\n\n // Add id to the heading node for anchor links\n const data = node.data || (node.data = {})\n const hProperties = (data.hProperties || (data.hProperties = {})) as Record<string, string>\n hProperties.id = id\n })\n\n tocExtraction.toc = buildTocTree(headings, minLevel)\n }\n}\n\nfunction getHeadingText(node: Heading): string {\n const textParts: string[] = []\n\n function extractText(child: unknown) {\n if (!child || typeof child !== \"object\") return\n\n const typedChild = child as { type?: string; value?: string; children?: unknown[] }\n\n if (typedChild.type === \"text\") {\n textParts.push(typedChild.value || \"\")\n } else if (typedChild.type === \"inlineCode\") {\n textParts.push(typedChild.value || \"\")\n } else if (Array.isArray(typedChild.children)) {\n typedChild.children.forEach(extractText)\n }\n }\n\n node.children.forEach(extractText)\n return textParts.join(\"\")\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nfunction buildTocTree(\n headings: Array<{ text: string; level: number; id: string }>,\n _minLevel: number\n): TOCItem[] {\n const result: TOCItem[] = []\n const stack: Array<{ item: TOCItem; level: number }> = []\n\n for (const heading of headings) {\n const item: TOCItem = {\n id: heading.id,\n text: heading.text,\n level: heading.level,\n }\n\n while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {\n stack.pop()\n }\n\n if (stack.length === 0) {\n result.push(item)\n } else {\n const parent = stack[stack.length - 1].item\n if (!parent.children) {\n parent.children = []\n }\n parent.children.push(item)\n }\n\n stack.push({ item, level: heading.level })\n }\n\n return result\n}\n\nexport function flattenToc(toc: TOCItem[]): TOCItem[] {\n const result: TOCItem[] = []\n\n function flatten(items: TOCItem[]) {\n for (const item of items) {\n result.push(item)\n if (item.children) {\n flatten(item.children)\n }\n }\n }\n\n flatten(toc)\n return result\n}\n","import { createHighlighter, type Highlighter, type BundledTheme } from \"shiki\"\nimport type { Root, Element, Text } from \"hast\"\nimport { visit } from \"unist-util-visit\"\nimport type { MarkdownConfig } from \"../config/types\"\n\nexport type ShikiHighlighter = Highlighter\n\nexport async function createShikiHighlighter(config: MarkdownConfig): Promise<ShikiHighlighter> {\n const themeConfig = config.theme ?? {\n light: \"github-light\",\n dark: \"github-dark\",\n }\n\n const themes: BundledTheme[] =\n typeof themeConfig === \"string\" ? [themeConfig] : [themeConfig.light, themeConfig.dark]\n\n const highlighter = await createHighlighter({\n themes,\n langs: [\n \"javascript\",\n \"typescript\",\n \"jsx\",\n \"tsx\",\n \"json\",\n \"html\",\n \"css\",\n \"markdown\",\n \"bash\",\n \"shell\",\n \"yaml\",\n \"python\",\n \"rust\",\n \"go\",\n \"sql\",\n \"diff\",\n ],\n })\n\n return highlighter\n}\n\ninterface RehypeShikiOptions {\n highlighter: ShikiHighlighter\n config: MarkdownConfig\n}\n\nexport function rehypeShikiFromHighlighter(options: RehypeShikiOptions) {\n const { highlighter, config } = options\n\n const themeConfig = config.theme ?? {\n light: \"github-light\",\n dark: \"github-dark\",\n }\n\n return function (tree: Root) {\n visit(tree, \"element\", (node: Element, index, parent) => {\n if (\n node.tagName !== \"pre\" ||\n !node.children[0] ||\n (node.children[0] as Element).tagName !== \"code\"\n ) {\n return\n }\n\n const codeNode = node.children[0] as Element\n const className = (codeNode.properties?.className as string[]) || []\n const langClass = className.find((c) => c.startsWith(\"language-\"))\n const lang = langClass ? langClass.replace(\"language-\", \"\") : \"text\"\n\n const codeContent = getTextContent(codeNode)\n\n if (!codeContent.trim()) {\n return\n }\n\n try {\n let html: string\n\n if (typeof themeConfig === \"string\") {\n html = highlighter.codeToHtml(codeContent, {\n lang,\n theme: themeConfig,\n })\n } else {\n html = highlighter.codeToHtml(codeContent, {\n lang,\n themes: {\n light: themeConfig.light,\n dark: themeConfig.dark,\n },\n defaultColor: false,\n })\n }\n\n const metaString = (codeNode.properties?.metastring as string) || \"\"\n const lineNumbers = config.lineNumbers || metaString.includes(\"showLineNumbers\")\n const highlightLines = parseHighlightLines(metaString)\n const title = parseTitle(metaString)\n\n const wrapperHtml = buildCodeBlockHtml(html, {\n lang,\n lineNumbers,\n highlightLines,\n title,\n })\n\n if (parent && typeof index === \"number\") {\n const newNode: Element = {\n type: \"element\",\n tagName: \"div\",\n properties: {\n className: [\"press-code-block\"],\n \"data-lang\": lang,\n },\n children: [\n {\n type: \"raw\",\n value: wrapperHtml,\n } as unknown as Element,\n ],\n }\n parent.children[index] = newNode\n }\n } catch {\n // If highlighting fails, leave the node unchanged\n }\n })\n }\n}\n\nfunction getTextContent(node: Element | Text): string {\n if (node.type === \"text\") {\n return node.value\n }\n if (\"children\" in node) {\n return node.children.map((child) => getTextContent(child as Element | Text)).join(\"\")\n }\n return \"\"\n}\n\nfunction parseHighlightLines(meta: string): number[] {\n const match = meta.match(/\\{([\\d,-]+)\\}/)\n if (!match) return []\n\n const ranges = match[1].split(\",\")\n const lines: number[] = []\n\n for (const range of ranges) {\n if (range.includes(\"-\")) {\n const [start, end] = range.split(\"-\").map(Number)\n for (let i = start; i <= end; i++) {\n lines.push(i)\n }\n } else {\n lines.push(Number(range))\n }\n }\n\n return lines\n}\n\nfunction parseTitle(meta: string): string | undefined {\n const match = meta.match(/title=\"([^\"]+)\"/)\n return match ? match[1] : undefined\n}\n\ninterface CodeBlockOptions {\n lang: string\n lineNumbers: boolean\n highlightLines: number[]\n title?: string\n}\n\nfunction buildCodeBlockHtml(shikiHtml: string, options: CodeBlockOptions): string {\n const { lang, lineNumbers, highlightLines, title } = options\n\n let html = \"\"\n\n if (title) {\n html += `<div class=\"press-code-title\">${escapeHtml(title)}</div>`\n }\n\n html += `<div class=\"press-code-wrapper\" data-lang=\"${lang}\">`\n\n if (lineNumbers || highlightLines.length > 0) {\n const lines = shikiHtml.split(\"\\n\")\n const processedHtml = lines\n .map((line, i) => {\n const lineNum = i + 1\n const isHighlighted = highlightLines.includes(lineNum)\n const classes = [\"press-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n let prefix = \"\"\n if (lineNumbers) {\n prefix = `<span class=\"press-line-number\">${lineNum}</span>`\n }\n\n return `<span class=\"${classes.join(\" \")}\">${prefix}${line}</span>`\n })\n .join(\"\\n\")\n\n html += processedHtml\n } else {\n html += shikiHtml\n }\n\n html += `<button class=\"press-copy-button\" data-code=\"${encodeURIComponent(extractCodeFromHtml(shikiHtml))}\">\n <span class=\"press-copy-icon\">Copy</span>\n <span class=\"press-copied-icon\" style=\"display:none\">Copied!</span>\n </button>`\n\n html += \"</div>\"\n\n return html\n}\n\nfunction extractCodeFromHtml(html: string): string {\n return html\n .replace(/<[^>]+>/g, \"\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { visit } from \"unist-util-visit\"\nimport type { Root, Element } from \"hast\"\n\nexport interface RehypeLinkOptions {\n basePath: string\n}\n\n/**\n * Rehype plugin that rewrites internal links to include the basePath.\n * This is needed for static sites deployed to subpaths (e.g., GitHub Pages).\n */\nexport function rehypeLinks(options: RehypeLinkOptions) {\n const { basePath } = options\n\n // Normalize basePath: ensure it starts with / and doesn't end with /\n const normalizedBase = basePath === \"/\" ? \"\" : basePath.replace(/\\/$/, \"\")\n\n return (tree: Root) => {\n if (!normalizedBase) {\n // No basePath to add\n return\n }\n\n visit(tree, \"element\", (node: Element) => {\n if (node.tagName === \"a\") {\n const href = node.properties?.href\n\n if (typeof href === \"string\") {\n // Only rewrite internal links that start with /\n // Don't rewrite: external URLs, anchors, relative paths, or already prefixed paths\n if (href.startsWith(\"/\") && !href.startsWith(\"//\") && !href.startsWith(normalizedBase)) {\n node.properties = node.properties || {}\n node.properties.href = normalizedBase + href\n }\n }\n }\n })\n }\n}\n","import type { Plugin } from \"vite\"\nimport type { ResolvedConfig } from \"../config/types\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\n\nexport interface PressRoutesPluginOptions {\n /** Directory where routes should be generated */\n routesDir?: string\n /** Source directory for content (default: 'content') */\n srcDir?: string\n /**\n * Layout mode for generated routes.\n * - 'docPage': Routes use DocPage which includes Layout (backward compatible)\n * - 'layoutRoute': Routes use DocContent without Layout (for use with _layout.tsx)\n * Default: 'layoutRoute'\n */\n layoutMode?: \"docPage\" | \"layoutRoute\"\n}\n\ninterface RouteInfo {\n /** Path relative to content dir without extension (e.g., 'guide/getting-started') */\n slug: string\n /** Full path to the markdown file */\n mdPath: string\n /** Path relative to content dir with extension (e.g., 'guide/getting-started.md') */\n relativePath: string\n}\n\n/**\n * Vite plugin that generates individual route files for each markdown file\n * in the content directory. Routes include SEO head() configuration\n * using frontmatter data.\n */\nexport function pressRoutesPlugin(\n getConfig: () => ResolvedConfig,\n options: PressRoutesPluginOptions = {}\n): Plugin {\n const { layoutMode = \"layoutRoute\" } = options\n\n let routesDir: string\n let contentDir: string\n let isDevMode = false\n let hasCleanedRoutes = false\n\n function scanContentDirSync(dir: string, rootDir: string): RouteInfo[] {\n const routes: RouteInfo[] = []\n\n try {\n const entries = fsSync.readdirSync(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n const children = scanContentDirSync(fullPath, rootDir)\n routes.push(...children)\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const relativePath = path.relative(rootDir, fullPath)\n const slug = relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n } else if (entry.name === \"index.md\") {\n const parentDir = path.dirname(fullPath)\n const relativePath = path.relative(rootDir, fullPath)\n\n // Skip root index.md (handled by manual index.tsx)\n if (parentDir !== rootDir) {\n const slug = path.relative(rootDir, parentDir).replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n }\n }\n }\n } catch {\n // Content dir may not exist\n }\n\n return routes\n }\n\n function generateRouteCode(route: RouteInfo): string {\n const { slug, relativePath } = route\n\n // Calculate relative path from route file to content file\n // Route at routes/${slug}.tsx needs to reach content/${relativePath}\n const depthToProjectRoot = slug.split(\"/\").length + 1\n const toProjectRoot = \"../\".repeat(depthToProjectRoot)\n const contentImportPath = `${toProjectRoot}content/${relativePath}`\n\n // Generate component name from slug\n const componentName =\n slug\n .split(\"/\")\n .map((part) => part.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()))\n .join(\"\")\n .replace(/\\s/g, \"\") + \"Page\"\n\n // Generate route path for TanStack Router (no route group, direct path)\n const routePath = `/${slug}`\n\n // Generate default title from slug\n const defaultTitle = slug\n .split(\"/\")\n .pop()!\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n\n // Choose component based on layout mode\n const contentComponent = layoutMode === \"docPage\" ? \"DocPage\" : \"DocContent\"\n\n return `// This file is auto-generated by ardo. Do not edit manually.\nimport { createFileRoute } from '@tanstack/react-router'\nimport { ${contentComponent} } from 'ardo/theme'\nimport { PressProvider } from 'ardo/runtime'\nimport config from 'virtual:ardo/config'\nimport sidebar from 'virtual:ardo/sidebar'\nimport Content, { frontmatter, toc } from '${contentImportPath}'\n\nexport const Route = createFileRoute('${routePath}')({\n head: () => ({\n meta: [\n { title: (frontmatter.title as string) ? \\`\\${frontmatter.title} | \\${config.title}\\` : config.title },\n ...(frontmatter.description ? [{ name: 'description', content: frontmatter.description as string }] : []),\n // OpenGraph\n { property: 'og:title', content: (frontmatter.title as string) || '${defaultTitle}' },\n ...(frontmatter.description ? [{ property: 'og:description', content: frontmatter.description as string }] : []),\n { property: 'og:type', content: 'article' },\n // Twitter\n { name: 'twitter:card', content: 'summary' },\n { name: 'twitter:title', content: (frontmatter.title as string) || '${defaultTitle}' },\n ...(frontmatter.description ? [{ name: 'twitter:description', content: frontmatter.description as string }] : []),\n ],\n }),\n component: ${componentName},\n})\n\nfunction ${componentName}() {\n const pageData = {\n title: (frontmatter.title as string) || '${defaultTitle}',\n description: frontmatter.description as string | undefined,\n frontmatter,\n content: '',\n toc,\n filePath: '${relativePath}',\n relativePath: '${relativePath}',\n }\n\n return (\n <PressProvider config={config} sidebar={sidebar} currentPage={pageData}>\n <${contentComponent}>\n <Content />\n </${contentComponent}>\n </PressProvider>\n )\n}\n`\n }\n\n function writeRouteFileSync(route: RouteInfo): boolean {\n const routeFilePath = path.join(routesDir, `${route.slug}.tsx`)\n const code = generateRouteCode(route)\n\n // Only write if content changed\n try {\n const existingContent = fsSync.readFileSync(routeFilePath, \"utf-8\")\n if (existingContent === code) {\n return false\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n fsSync.mkdirSync(path.dirname(routeFilePath), { recursive: true })\n fsSync.writeFileSync(routeFilePath, code, \"utf-8\")\n return true\n }\n\n function generateAllRoutesSync(): void {\n const routes = scanContentDirSync(contentDir, contentDir)\n\n let writtenCount = 0\n for (const route of routes) {\n if (writeRouteFileSync(route)) {\n writtenCount++\n }\n }\n\n if (writtenCount > 0) {\n console.log(`[ardo] Generated ${writtenCount} content route files`)\n }\n }\n\n async function ensureDirectoryExists(dir: string): Promise<void> {\n try {\n await fs.mkdir(dir, { recursive: true })\n } catch {\n // Directory may already exist\n }\n }\n\n async function writeRouteFile(route: RouteInfo): Promise<boolean> {\n const routeFilePath = path.join(routesDir, `${route.slug}.tsx`)\n const routeFileDir = path.dirname(routeFilePath)\n\n await ensureDirectoryExists(routeFileDir)\n\n const code = generateRouteCode(route)\n\n // Only write if content changed to avoid triggering unnecessary rebuilds\n try {\n const existingContent = await fs.readFile(routeFilePath, \"utf-8\")\n if (existingContent === code) {\n return false // No change\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n await fs.writeFile(routeFilePath, code, \"utf-8\")\n return true // File was written\n }\n\n async function cleanGeneratedRoutes(): Promise<void> {\n const pressRoutesDir = routesDir\n\n try {\n const entries = await fs.readdir(pressRoutesDir, { withFileTypes: true, recursive: true })\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".tsx\") && entry.name !== \"_layout.tsx\") {\n const fullPath = path.join(entry.parentPath ?? pressRoutesDir, entry.name)\n\n // Read the file to check if it's auto-generated\n try {\n const content = await fs.readFile(fullPath, \"utf-8\")\n if (content.startsWith(\"// This file is auto-generated by ardo\")) {\n await fs.unlink(fullPath)\n }\n } catch {\n // File might have been deleted already\n }\n }\n }\n } catch {\n // Directory doesn't exist yet, nothing to clean\n }\n }\n\n async function scanContentDir(dir: string, rootDir: string): Promise<RouteInfo[]> {\n const routes: RouteInfo[] = []\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n const children = await scanContentDir(fullPath, rootDir)\n routes.push(...children)\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const relativePath = path.relative(rootDir, fullPath)\n const slug = relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n } else if (entry.name === \"index.md\") {\n const parentDir = path.dirname(fullPath)\n const relativePath = path.relative(rootDir, fullPath)\n\n // Skip root index.md (handled by manual index.tsx)\n if (parentDir !== rootDir) {\n const slug = path.relative(rootDir, parentDir).replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n }\n }\n }\n\n return routes\n }\n\n async function generateAllRoutes(): Promise<void> {\n // Clean old generated routes first (only in dev mode, and only once)\n if (isDevMode && !hasCleanedRoutes) {\n await cleanGeneratedRoutes()\n hasCleanedRoutes = true\n }\n\n const routes = await scanContentDir(contentDir, contentDir)\n\n let writtenCount = 0\n for (const route of routes) {\n if (await writeRouteFile(route)) {\n writtenCount++\n }\n }\n\n if (writtenCount > 0) {\n console.log(`[ardo] Generated ${writtenCount} content route files`)\n }\n }\n\n return {\n name: \"ardo:routes\",\n enforce: \"pre\",\n\n config(userConfig, env) {\n // Generate routes early, before TanStack Router scans the files\n const root = userConfig.root || process.cwd()\n const srcDir = path.join(root, \"src\")\n routesDir = options.routesDir || path.join(srcDir, \"routes\")\n isDevMode = env.command === \"serve\"\n\n // Use srcDir from options to resolve contentDir early\n contentDir = path.resolve(root, options.srcDir || \"content\")\n\n // Generate content routes SYNCHRONOUSLY\n // TanStack Router scans routes during config phase, so routes must exist by then\n try {\n generateAllRoutesSync()\n } catch (err) {\n console.warn(\"[ardo] Could not generate routes in config phase:\", err)\n }\n },\n\n configResolved(viteConfig) {\n // Update paths if they weren't set in config hook\n if (!routesDir) {\n routesDir = options.routesDir || path.join(viteConfig.root, \"src\", \"routes\")\n isDevMode = viteConfig.command === \"serve\"\n }\n },\n\n async buildStart() {\n // Re-generate content routes in buildStart for full async support\n const config = getConfig()\n contentDir = config.contentDir\n await generateAllRoutes()\n },\n\n configureServer(server) {\n // Watch for changes in content directory\n server.watcher.add(contentDir)\n\n server.watcher.on(\"change\", async (changedPath) => {\n if (changedPath.startsWith(contentDir) && changedPath.endsWith(\".md\")) {\n await generateAllRoutes()\n }\n })\n\n server.watcher.on(\"add\", async (addedPath) => {\n if (addedPath.startsWith(contentDir) && addedPath.endsWith(\".md\")) {\n await generateAllRoutes()\n }\n })\n\n server.watcher.on(\"unlink\", async (removedPath) => {\n if (removedPath.startsWith(contentDir) && removedPath.endsWith(\".md\")) {\n // Re-generate routes (will clean up orphaned route files)\n hasCleanedRoutes = false // Allow cleaning again\n await generateAllRoutes()\n }\n })\n },\n }\n}\n","import type { Plugin, UserConfig } from \"vite\"\nimport type { PressConfig, ResolvedConfig } from \"../config/types\"\nimport type { TypeDocConfig } from \"../typedoc/types\"\nimport { resolveConfig } from \"../config/index\"\nimport { transformMarkdown } from \"../markdown/pipeline\"\nimport { createShikiHighlighter, type ShikiHighlighter } from \"../markdown/shiki\"\nimport { pressRoutesPlugin, type PressRoutesPluginOptions } from \"./routes-plugin\"\nimport { generateApiDocs } from \"../typedoc/generator\"\nimport { tanstackStart } from \"@tanstack/react-start/plugin/vite\"\nimport react from \"@vitejs/plugin-react\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\nimport { execSync } from \"child_process\"\n\n/**\n * Finds the package root by looking for package.json in parent directories.\n * Returns the path relative to cwd, or undefined if not found.\n */\nfunction findPackageRoot(cwd: string): string | undefined {\n let dir = path.resolve(cwd)\n const root = path.parse(dir).root\n\n while (dir !== root) {\n const parentDir = path.dirname(dir)\n const packageJsonPath = path.join(parentDir, \"package.json\")\n\n if (fsSync.existsSync(packageJsonPath)) {\n // Return relative path from cwd to parent\n return path.relative(cwd, parentDir) || \".\"\n }\n\n dir = parentDir\n }\n\n return undefined\n}\n\n/**\n * Detects the GitHub repository name from git remote URL.\n * Returns the repo name (e.g., 'ardo' from 'github.com/sebastian-software/ardo')\n * or undefined if not a GitHub repo.\n */\nfunction detectGitHubRepoName(cwd: string): string | undefined {\n try {\n const remoteUrl = execSync(\"git remote get-url origin\", {\n cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim()\n\n // Parse GitHub URL (supports both HTTPS and SSH)\n // https://github.com/user/repo.git\n // git@github.com:user/repo.git\n const match = remoteUrl.match(/github\\.com[/:][\\w-]+\\/([\\w.-]+?)(?:\\.git)?$/)\n return match?.[1]\n } catch {\n return undefined\n }\n}\n\nconst VIRTUAL_MODULE_ID = \"virtual:ardo/config\"\nconst RESOLVED_VIRTUAL_MODULE_ID = \"\\0\" + VIRTUAL_MODULE_ID\n\nconst VIRTUAL_SIDEBAR_ID = \"virtual:ardo/sidebar\"\nconst RESOLVED_VIRTUAL_SIDEBAR_ID = \"\\0\" + VIRTUAL_SIDEBAR_ID\n\nexport interface ArdoPluginOptions extends Partial<PressConfig> {\n /** Options for the routes generator plugin */\n routes?: PressRoutesPluginOptions | false\n /** Options for TanStack Start prerendering */\n prerender?: {\n enabled?: boolean\n crawlLinks?: boolean\n }\n /**\n * Auto-detect GitHub repository and set base path for GitHub Pages.\n * When true, automatically sets `base: '/repo-name/'` if deploying to GitHub Pages.\n * @default true\n */\n githubPages?: boolean\n}\n\n// Use globalThis to cache the Shiki highlighter as a true singleton across all plugin instances\nconst SHIKI_CACHE_KEY = \"__ardo_shiki_highlighter__\"\nlet shikiHighlighterPromise: Promise<ShikiHighlighter> | null = null\n\nfunction getShikiHighlighter(config: ResolvedConfig): Promise<ShikiHighlighter> {\n // Check if already cached on globalThis\n if ((globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY]) {\n return Promise.resolve(\n (globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY] as ShikiHighlighter\n )\n }\n // Use promise caching to prevent multiple concurrent creations\n if (!shikiHighlighterPromise) {\n shikiHighlighterPromise = createShikiHighlighter(config.markdown).then((highlighter) => {\n ;(globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY] = highlighter\n return highlighter\n })\n }\n return shikiHighlighterPromise\n}\n\nexport function ardoPlugin(options: ArdoPluginOptions = {}): Plugin[] {\n let resolvedConfig: ResolvedConfig\n\n // Extract ardo-specific options from the rest (which is PressConfig)\n const { routes, prerender, typedoc, githubPages = true, ...pressConfig } = options\n\n const mainPlugin: Plugin = {\n name: \"ardo\",\n enforce: \"pre\",\n\n config(userConfig, env): UserConfig {\n const result: UserConfig = {\n optimizeDeps: {\n exclude: [\"ardo/theme/styles.css\"],\n },\n ssr: {\n noExternal: [\"ardo\"],\n },\n }\n\n // Auto-detect GitHub Pages base path for production builds\n if (githubPages && env.command === \"build\" && !userConfig.base) {\n const repoName = detectGitHubRepoName(userConfig.root || process.cwd())\n if (repoName) {\n result.base = `/${repoName}/`\n console.log(`[ardo] GitHub Pages detected, using base: ${result.base}`)\n }\n }\n\n return result\n },\n\n async configResolved(config) {\n const root = config.root\n const defaultConfig: PressConfig = {\n title: pressConfig.title ?? \"Ardo\",\n description: pressConfig.description ?? \"Documentation powered by Ardo\",\n }\n resolvedConfig = resolveConfig({ ...defaultConfig, ...pressConfig }, root)\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID\n }\n if (id === VIRTUAL_SIDEBAR_ID) {\n return RESOLVED_VIRTUAL_SIDEBAR_ID\n }\n },\n\n async load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const clientConfig = {\n title: resolvedConfig.title,\n description: resolvedConfig.description,\n base: resolvedConfig.base,\n lang: resolvedConfig.lang,\n themeConfig: resolvedConfig.themeConfig,\n }\n return `export default ${JSON.stringify(clientConfig)}`\n }\n\n if (id === RESOLVED_VIRTUAL_SIDEBAR_ID) {\n const sidebar = await generateSidebar(resolvedConfig)\n return `export default ${JSON.stringify(sidebar)}`\n }\n },\n }\n\n const markdownPlugin: Plugin = {\n name: \"ardo:markdown\",\n enforce: \"pre\",\n\n async transform(code, id) {\n if (!id.endsWith(\".md\")) {\n return\n }\n\n const highlighter = await getShikiHighlighter(resolvedConfig)\n\n const result = await transformMarkdown(code, resolvedConfig.markdown, {\n basePath: resolvedConfig.base,\n highlighter,\n })\n\n const componentCode = `\nimport { createElement } from 'react'\n\nexport const frontmatter = ${JSON.stringify(result.frontmatter)}\nexport const toc = ${JSON.stringify(result.toc)}\n\nexport default function MarkdownContent() {\n return createElement('div', {\n className: 'press-content',\n dangerouslySetInnerHTML: { __html: ${JSON.stringify(result.html)} }\n })\n}\n`\n\n return {\n code: componentCode,\n map: null,\n }\n },\n }\n\n const plugins: Plugin[] = [mainPlugin, markdownPlugin]\n\n // Add routes plugin unless explicitly disabled\n // Note: Routes plugin must come AFTER typedoc in the array so that\n // typedoc runs first in buildStart and generates markdown files\n if (routes !== false) {\n plugins.unshift(\n pressRoutesPlugin(() => resolvedConfig, {\n srcDir: pressConfig.srcDir,\n ...routes,\n })\n )\n }\n\n // Add TypeDoc plugin if enabled\n // Note: unshift adds to front, so typedoc will be before routes in the array\n // This ensures typedoc buildStart runs before routes buildStart\n if (typedoc) {\n // Find package root to use as default entry point base\n const packageRoot = findPackageRoot(process.cwd())\n const defaultEntryPoint = packageRoot ? `${packageRoot}/src/index.ts` : \"./src/index.ts\"\n\n const defaultTypedocConfig: TypeDocConfig = {\n enabled: true,\n entryPoints: [defaultEntryPoint],\n out: \"api-reference\",\n excludePrivate: true,\n excludeInternal: true,\n }\n\n const typedocConfig: TypeDocConfig =\n typedoc === true ? defaultTypedocConfig : { ...defaultTypedocConfig, ...typedoc }\n\n let hasGenerated = false\n\n const typedocPlugin: Plugin = {\n name: \"ardo:typedoc\",\n\n async buildStart() {\n if (!hasGenerated && typedocConfig.enabled) {\n console.log(\"[ardo] Generating API documentation with TypeDoc...\")\n const startTime = Date.now()\n try {\n const contentDir = pressConfig.srcDir ?? \"./content\"\n const docs = await generateApiDocs(typedocConfig, contentDir)\n const duration = Date.now() - startTime\n console.log(`[ardo] Generated ${docs.length} API documentation pages in ${duration}ms`)\n hasGenerated = true\n } catch (error) {\n // Don't crash the dev server if TypeDoc fails - just warn and continue\n // This allows users to run the dev server even if their TypeDoc config is incorrect\n console.warn(\n \"[ardo] TypeDoc generation failed. API documentation will not be available.\"\n )\n console.warn(\"[ardo] Check your typedoc.entryPoints configuration.\")\n if (error instanceof Error) {\n console.warn(`[ardo] Error: ${error.message}`)\n }\n hasGenerated = true // Prevent retry\n }\n }\n },\n }\n\n plugins.unshift(typedocPlugin)\n }\n\n // Add TanStack Start plugin\n const tanstackPlugin = tanstackStart({\n prerender: {\n enabled: prerender?.enabled ?? true,\n crawlLinks: prerender?.crawlLinks ?? false,\n },\n })\n const tanstackPlugins = (\n Array.isArray(tanstackPlugin) ? tanstackPlugin : [tanstackPlugin]\n ).filter((p): p is Plugin => p != null)\n plugins.push(...tanstackPlugins)\n\n // Add React plugin\n const reactPlugin = react()\n const reactPlugins = (Array.isArray(reactPlugin) ? reactPlugin : [reactPlugin]).filter(\n (p): p is Plugin => p != null\n )\n plugins.push(...reactPlugins)\n\n return plugins\n}\n\nasync function generateSidebar(config: ResolvedConfig) {\n const { contentDir, themeConfig } = config\n\n if (themeConfig.sidebar && !Array.isArray(themeConfig.sidebar)) {\n return themeConfig.sidebar\n }\n\n if (themeConfig.sidebar && Array.isArray(themeConfig.sidebar) && themeConfig.sidebar.length > 0) {\n return themeConfig.sidebar\n }\n\n try {\n const sidebar = await scanDirectory(contentDir, contentDir, config.base)\n return sidebar\n } catch {\n return []\n }\n}\n\nasync function scanDirectory(\n dir: string,\n rootDir: string,\n _basePath: string\n): Promise<Array<{ text: string; link?: string; items?: unknown[] }>> {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n const items: Array<{ text: string; link?: string; items?: unknown[]; order?: number }> = []\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n const relativePath = path.relative(rootDir, fullPath)\n\n if (entry.isDirectory()) {\n const children = await scanDirectory(fullPath, rootDir, _basePath)\n if (children.length > 0) {\n const indexPath = path.join(fullPath, \"index.md\")\n let link: string | undefined\n\n try {\n await fs.access(indexPath)\n // Don't include basePath - TanStack Router handles it automatically\n link = \"/\" + relativePath.replace(/\\\\/g, \"/\")\n } catch {\n // No index.md\n }\n\n items.push({\n text: formatTitle(entry.name),\n link,\n items: children,\n })\n }\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const frontmatterMatch = fileContent.match(/^---\\n([\\s\\S]*?)\\n---/)\n\n let title = formatTitle(entry.name.replace(/\\.md$/, \"\"))\n let order: number | undefined\n\n if (frontmatterMatch) {\n const frontmatterText = frontmatterMatch[1]\n const titleMatch = frontmatterText.match(/title:\\s*[\"']?([^\"'\\n]+)[\"']?/)\n const orderMatch = frontmatterText.match(/order:\\s*(\\d+)/)\n\n if (titleMatch) {\n title = titleMatch[1].trim()\n }\n if (orderMatch) {\n order = parseInt(orderMatch[1], 10)\n }\n }\n\n // Don't include basePath - TanStack Router handles it automatically\n const link = \"/\" + relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n items.push({\n text: title,\n link,\n order,\n })\n }\n }\n\n items.sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) {\n return a.order - b.order\n }\n if (a.order !== undefined) return -1\n if (b.order !== undefined) return 1\n return a.text.localeCompare(b.text)\n })\n\n return items.map(({ order: _order, ...item }) => item)\n}\n\nfunction formatTitle(name: string): string {\n return name.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport default ardoPlugin\n","import fs from \"fs/promises\"\nimport path from \"path\"\nimport type { PageData, PageFrontmatter, TOCItem, ResolvedConfig } from \"../config/types\"\nimport { transformMarkdown } from \"../markdown/pipeline\"\n\nexport interface LoadDocOptions {\n slug: string\n contentDir: string\n config: ResolvedConfig\n}\n\nexport interface LoadDocResult {\n content: string\n frontmatter: PageFrontmatter\n toc: TOCItem[]\n filePath: string\n relativePath: string\n lastUpdated?: number\n}\n\nexport async function loadDoc(options: LoadDocOptions): Promise<LoadDocResult | null> {\n const { slug, contentDir, config } = options\n\n const possiblePaths = [\n path.join(contentDir, `${slug}.md`),\n path.join(contentDir, slug, \"index.md\"),\n ]\n\n let filePath: string | null = null\n let fileContent: string | null = null\n\n for (const tryPath of possiblePaths) {\n try {\n fileContent = await fs.readFile(tryPath, \"utf-8\")\n filePath = tryPath\n break\n } catch {\n continue\n }\n }\n\n if (!filePath || !fileContent) {\n return null\n }\n\n const result = await transformMarkdown(fileContent, config.markdown)\n const relativePath = path.relative(contentDir, filePath)\n\n let lastUpdated: number | undefined\n try {\n const stat = await fs.stat(filePath)\n lastUpdated = stat.mtimeMs\n } catch {\n // Ignore stat errors\n }\n\n return {\n content: result.html,\n frontmatter: result.frontmatter,\n toc: result.toc,\n filePath,\n relativePath,\n lastUpdated,\n }\n}\n\nexport async function loadAllDocs(contentDir: string, config: ResolvedConfig): Promise<PageData[]> {\n const docs: PageData[] = []\n\n async function scanDir(dir: string) {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n await scanDir(fullPath)\n } else if (entry.name.endsWith(\".md\")) {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const result = await transformMarkdown(fileContent, config.markdown)\n const relativePath = path.relative(contentDir, fullPath)\n\n let lastUpdated: number | undefined\n try {\n const stat = await fs.stat(fullPath)\n lastUpdated = stat.mtimeMs\n } catch {\n // Ignore stat errors\n }\n\n docs.push({\n title: result.frontmatter.title || formatTitle(entry.name.replace(/\\.md$/, \"\")),\n description: result.frontmatter.description,\n frontmatter: result.frontmatter,\n content: result.html,\n toc: result.toc,\n filePath: fullPath,\n relativePath,\n lastUpdated,\n })\n }\n }\n }\n\n await scanDir(contentDir)\n return docs\n}\n\nfunction formatTitle(name: string): string {\n return name.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport function getSlugFromPath(relativePath: string): string {\n return relativePath\n .replace(/\\.md$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/\\\\/g, \"/\")\n}\n\nexport function getPageDataForRoute(docs: PageData[], slug: string): PageData | undefined {\n return docs.find((doc) => {\n const docSlug = getSlugFromPath(doc.relativePath)\n return docSlug === slug || docSlug === `${slug}/index`\n })\n}\n","import fs from \"fs/promises\"\nimport type { Dirent } from \"fs\"\nimport path from \"path\"\nimport matter from \"gray-matter\"\nimport type { SidebarItem, ResolvedConfig } from \"../config/types\"\n\nexport interface SidebarGenerationOptions {\n contentDir: string\n basePath: string\n config: ResolvedConfig\n}\n\nexport async function generateSidebar(options: SidebarGenerationOptions): Promise<SidebarItem[]> {\n const { contentDir, basePath, config } = options\n\n const configSidebar = config.themeConfig.sidebar\n\n if (configSidebar) {\n if (Array.isArray(configSidebar) && configSidebar.length > 0) {\n return configSidebar\n }\n if (!Array.isArray(configSidebar)) {\n return []\n }\n }\n\n return await scanDirectoryForSidebar(contentDir, contentDir, basePath)\n}\n\nasync function scanDirectoryForSidebar(\n dir: string,\n rootDir: string,\n _basePath: string\n): Promise<SidebarItem[]> {\n let entries: Dirent[]\n\n try {\n entries = (await fs.readdir(dir, { withFileTypes: true })) as Dirent[]\n } catch {\n return []\n }\n\n interface SidebarItemWithOrder extends SidebarItem {\n order?: number\n }\n\n const items: SidebarItemWithOrder[] = []\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n const relativePath = path.relative(rootDir, fullPath)\n\n if (entry.name.startsWith(\".\") || entry.name.startsWith(\"_\")) {\n continue\n }\n\n if (entry.isDirectory()) {\n const children = await scanDirectoryForSidebar(fullPath, rootDir, _basePath)\n\n if (children.length > 0) {\n const indexPath = path.join(fullPath, \"index.md\")\n let link: string | undefined\n let title = formatTitle(entry.name)\n let order: number | undefined\n\n try {\n const indexContent = await fs.readFile(indexPath, \"utf-8\")\n const { data: frontmatter } = matter(indexContent)\n\n if (frontmatter.title) {\n title = frontmatter.title\n }\n if (typeof frontmatter.order === \"number\") {\n order = frontmatter.order\n }\n\n // Don't include basePath - TanStack Router handles it automatically\n link = normalizePath(relativePath)\n } catch {\n // No index.md file\n }\n\n items.push({\n text: title,\n link,\n collapsed: false,\n items: children,\n order,\n })\n }\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const { data: frontmatter } = matter(fileContent)\n\n if (frontmatter.sidebar === false) {\n continue\n }\n\n const title = frontmatter.title || formatTitle(entry.name.replace(/\\.md$/, \"\"))\n const order = typeof frontmatter.order === \"number\" ? frontmatter.order : undefined\n\n // Don't include basePath - TanStack Router handles it automatically\n const link = normalizePath(relativePath.replace(/\\.md$/, \"\"))\n\n items.push({\n text: title,\n link,\n order,\n })\n }\n }\n\n items.sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) {\n return a.order - b.order\n }\n if (a.order !== undefined) return -1\n if (b.order !== undefined) return 1\n return a.text.localeCompare(b.text)\n })\n\n return items.map(({ order: _order, ...item }) => item)\n}\n\nfunction formatTitle(name: string): string {\n return name\n .replace(/^\\d+-/, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nfunction normalizePath(p: string): string {\n return \"/\" + p.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\")\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,eAAe;AACxB,OAAO,iBAAiB;AACxB,OAAO,eAAe;AACtB,OAAO,uBAAuB;AAC9B,OAAO,qBAAqB;AAC5B,OAAO,kBAAkB;AACzB,OAAO,qBAAqB;AAC5B,OAAO,YAAY;;;ACLnB,SAAS,aAAa;AAEtB,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAGA,IAAM,gBAA+C;AAAA,EACnD,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AAAA,EACT,cAAc;AAChB;AAEO,SAAS,mBAAmB;AACjC,SAAO,SAAU,MAAY;AAC3B,UAAM,MAAM,sBAAsB,CAAC,SAA6B;AAC9D,YAAM,OAAO,KAAK;AAElB,UAAI,CAAC,eAAe,SAAS,IAAI,GAAG;AAClC;AAAA,MACF;AAEA,YAAM,OAAO,KAAK,SAAS,KAAK,OAAO,CAAC;AAExC,YAAM,YAAY,KAAK,SAAS,CAAC;AACjC,UAAI;AAEJ,UACE,aACA,UAAU,SAAS,eACnB,UAAU,SAAS,CAAC,GAAG,SAAS,UAChC,UAAU,MAAM,gBAChB;AACA,sBAAe,UAAU,SAAS,CAAC,EAAwB;AAC3D,aAAK,SAAS,MAAM;AAAA,MACtB;AAEA,YAAM,QAAQ,eAAe,cAAc,IAAI;AAE/C,UAAI,SAAS,cAAc;AACzB,aAAK,QAAQ;AACb,aAAK,cAAc;AAAA,UACjB,WAAW,CAAC,kBAAkB;AAAA,QAChC;AAEA,cAAM,OAAmD,CAAC;AAE1D,mBAAW,SAAS,KAAK,UAAU;AACjC,cAAI,MAAM,SAAS,QAAQ;AACzB,kBAAM,WAAW;AACjB,kBAAM,OAAO,SAAS,QAAQ;AAC9B,kBAAM,aAAa,KAAK,MAAM,cAAc;AAC5C,kBAAM,QAAQ,aAAa,WAAW,CAAC,IAAI,SAAS,QAAQ;AAC5D,iBAAK,KAAK,EAAE,OAAO,SAAS,MAAM,CAAC;AAAA,UACrC;AAAA,QACF;AAEA,cAAM,WAAW,KACd;AAAA,UACC,CAAC,KAAK,MACJ,sCAAsC,MAAM,IAAI,YAAY,EAAE,iBAAiB,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC;AAAA,QAC9G,EACC,KAAK,EAAE;AAEV,aAAK,WAAW;AAAA,UACd;AAAA,YACE,MAAM;AAAA,YACN,OAAO,sCAAsC,QAAQ;AAAA,UACvD;AAAA,UACA;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,UACA,GAAG,KAAK;AAAA,YACN,CAAC,KAAK,OACH;AAAA,cACC,MAAM;AAAA,cACN,OAAO,qCAAqC,MAAM,IAAI,YAAY,EAAE,iBAAiB,CAAC;AAAA,YACxF;AAAA,UACJ;AAAA,UACA,GAAG,KAAK,SAAS,QAAQ,CAAC,OAAuC,OAAe;AAAA,YAC9E;AAAA,YACA;AAAA,cACE,MAAM;AAAA,cACN,OAAO;AAAA,YACT;AAAA,UACF,CAAC;AAAA,UACD;AAAA,YACE,MAAM;AAAA,YACN,OAAO;AAAA,UACT;AAAA,QACF;AAEA;AAAA,MACF;AAEA,UAAI,SAAS,WAAW;AACtB,aAAK,QAAQ;AACb,aAAK,cAAc;AAAA,UACjB,WAAW,CAAC,eAAe;AAAA,QAC7B;AAEA,aAAK,SAAS,QAAQ;AAAA,UACpB,MAAM;AAAA,UACN,OAAO,0CAA0C,WAAW,KAAK,CAAC;AAAA,QACpE,CAA8C;AAE9C;AAAA,MACF;AAEA,WAAK,QAAQ;AACb,WAAK,cAAc;AAAA,QACjB,WAAW,CAAC,mBAAmB,mBAAmB,IAAI,EAAE;AAAA,MAC1D;AAEA,WAAK,SAAS,QAAQ;AAAA,QACpB,MAAM;AAAA,QACN,OAAO,oCAAoC,WAAW,KAAK,CAAC;AAAA,MAC9D,CAA8C;AAAA,IAChD,CAAC;AAAA,EACH;AACF;AAEA,SAAS,WAAW,MAAsB;AACxC,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;;;AC7IA,SAAS,SAAAA,cAAa;AAYf,SAAS,iBAAiB,SAAqB;AACpD,QAAM,EAAE,eAAe,OAAO,IAAI;AAClC,QAAM,CAAC,UAAU,QAAQ,IAAI;AAE7B,SAAO,SAAU,MAAY;AAC3B,UAAM,WAA+D,CAAC;AAEtE,IAAAA,OAAM,MAAM,WAAW,CAAC,SAAkB;AACxC,UAAI,KAAK,QAAQ,YAAY,KAAK,QAAQ,UAAU;AAClD;AAAA,MACF;AAEA,YAAM,OAAO,eAAe,IAAI;AAChC,YAAM,KAAK,QAAQ,IAAI;AAEvB,eAAS,KAAK;AAAA,QACZ;AAAA,QACA,OAAO,KAAK;AAAA,QACZ;AAAA,MACF,CAAC;AAGD,YAAM,OAAO,KAAK,SAAS,KAAK,OAAO,CAAC;AACxC,YAAM,cAAe,KAAK,gBAAgB,KAAK,cAAc,CAAC;AAC9D,kBAAY,KAAK;AAAA,IACnB,CAAC;AAED,kBAAc,MAAM,aAAa,UAAU,QAAQ;AAAA,EACrD;AACF;AAEA,SAAS,eAAe,MAAuB;AAC7C,QAAM,YAAsB,CAAC;AAE7B,WAAS,YAAY,OAAgB;AACnC,QAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AAEzC,UAAM,aAAa;AAEnB,QAAI,WAAW,SAAS,QAAQ;AAC9B,gBAAU,KAAK,WAAW,SAAS,EAAE;AAAA,IACvC,WAAW,WAAW,SAAS,cAAc;AAC3C,gBAAU,KAAK,WAAW,SAAS,EAAE;AAAA,IACvC,WAAW,MAAM,QAAQ,WAAW,QAAQ,GAAG;AAC7C,iBAAW,SAAS,QAAQ,WAAW;AAAA,IACzC;AAAA,EACF;AAEA,OAAK,SAAS,QAAQ,WAAW;AACjC,SAAO,UAAU,KAAK,EAAE;AAC1B;AAEA,SAAS,QAAQ,MAAsB;AACrC,SAAO,KACJ,YAAY,EACZ,KAAK,EACL,QAAQ,aAAa,EAAE,EACvB,QAAQ,YAAY,GAAG,EACvB,QAAQ,YAAY,EAAE;AAC3B;AAEA,SAAS,aACP,UACA,WACW;AACX,QAAM,SAAoB,CAAC;AAC3B,QAAM,QAAiD,CAAC;AAExD,aAAW,WAAW,UAAU;AAC9B,UAAM,OAAgB;AAAA,MACpB,IAAI,QAAQ;AAAA,MACZ,MAAM,QAAQ;AAAA,MACd,OAAO,QAAQ;AAAA,IACjB;AAEA,WAAO,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,QAAQ,OAAO;AACzE,YAAM,IAAI;AAAA,IACZ;AAEA,QAAI,MAAM,WAAW,GAAG;AACtB,aAAO,KAAK,IAAI;AAAA,IAClB,OAAO;AACL,YAAM,SAAS,MAAM,MAAM,SAAS,CAAC,EAAE;AACvC,UAAI,CAAC,OAAO,UAAU;AACpB,eAAO,WAAW,CAAC;AAAA,MACrB;AACA,aAAO,SAAS,KAAK,IAAI;AAAA,IAC3B;AAEA,UAAM,KAAK,EAAE,MAAM,OAAO,QAAQ,MAAM,CAAC;AAAA,EAC3C;AAEA,SAAO;AACT;;;AC1GA,SAAS,yBAA8D;AAEvE,SAAS,SAAAC,cAAa;AAKtB,eAAsB,uBAAuB,QAAmD;AAC9F,QAAM,cAAc,OAAO,SAAS;AAAA,IAClC,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAEA,QAAM,SACJ,OAAO,gBAAgB,WAAW,CAAC,WAAW,IAAI,CAAC,YAAY,OAAO,YAAY,IAAI;AAExF,QAAM,cAAc,MAAM,kBAAkB;AAAA,IAC1C;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAOO,SAAS,2BAA2B,SAA6B;AACtE,QAAM,EAAE,aAAa,OAAO,IAAI;AAEhC,QAAM,cAAc,OAAO,SAAS;AAAA,IAClC,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAEA,SAAO,SAAU,MAAY;AAC3B,IAAAA,OAAM,MAAM,WAAW,CAAC,MAAe,OAAO,WAAW;AACvD,UACE,KAAK,YAAY,SACjB,CAAC,KAAK,SAAS,CAAC,KACf,KAAK,SAAS,CAAC,EAAc,YAAY,QAC1C;AACA;AAAA,MACF;AAEA,YAAM,WAAW,KAAK,SAAS,CAAC;AAChC,YAAM,YAAa,SAAS,YAAY,aAA0B,CAAC;AACnE,YAAM,YAAY,UAAU,KAAK,CAAC,MAAM,EAAE,WAAW,WAAW,CAAC;AACjE,YAAM,OAAO,YAAY,UAAU,QAAQ,aAAa,EAAE,IAAI;AAE9D,YAAM,cAAc,eAAe,QAAQ;AAE3C,UAAI,CAAC,YAAY,KAAK,GAAG;AACvB;AAAA,MACF;AAEA,UAAI;AACF,YAAI;AAEJ,YAAI,OAAO,gBAAgB,UAAU;AACnC,iBAAO,YAAY,WAAW,aAAa;AAAA,YACzC;AAAA,YACA,OAAO;AAAA,UACT,CAAC;AAAA,QACH,OAAO;AACL,iBAAO,YAAY,WAAW,aAAa;AAAA,YACzC;AAAA,YACA,QAAQ;AAAA,cACN,OAAO,YAAY;AAAA,cACnB,MAAM,YAAY;AAAA,YACpB;AAAA,YACA,cAAc;AAAA,UAChB,CAAC;AAAA,QACH;AAEA,cAAM,aAAc,SAAS,YAAY,cAAyB;AAClE,cAAM,cAAc,OAAO,eAAe,WAAW,SAAS,iBAAiB;AAC/E,cAAM,iBAAiB,oBAAoB,UAAU;AACrD,cAAM,QAAQ,WAAW,UAAU;AAEnC,cAAM,cAAc,mBAAmB,MAAM;AAAA,UAC3C;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,UAAU,OAAO,UAAU,UAAU;AACvC,gBAAM,UAAmB;AAAA,YACvB,MAAM;AAAA,YACN,SAAS;AAAA,YACT,YAAY;AAAA,cACV,WAAW,CAAC,kBAAkB;AAAA,cAC9B,aAAa;AAAA,YACf;AAAA,YACA,UAAU;AAAA,cACR;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AACA,iBAAO,SAAS,KAAK,IAAI;AAAA,QAC3B;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEA,SAAS,eAAe,MAA8B;AACpD,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,KAAK;AAAA,EACd;AACA,MAAI,cAAc,MAAM;AACtB,WAAO,KAAK,SAAS,IAAI,CAAC,UAAU,eAAe,KAAuB,CAAC,EAAE,KAAK,EAAE;AAAA,EACtF;AACA,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAwB;AACnD,QAAM,QAAQ,KAAK,MAAM,eAAe;AACxC,MAAI,CAAC,MAAO,QAAO,CAAC;AAEpB,QAAM,SAAS,MAAM,CAAC,EAAE,MAAM,GAAG;AACjC,QAAM,QAAkB,CAAC;AAEzB,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,GAAG,GAAG;AACvB,YAAM,CAAC,OAAO,GAAG,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM;AAChD,eAAS,IAAI,OAAO,KAAK,KAAK,KAAK;AACjC,cAAM,KAAK,CAAC;AAAA,MACd;AAAA,IACF,OAAO;AACL,YAAM,KAAK,OAAO,KAAK,CAAC;AAAA,IAC1B;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,WAAW,MAAkC;AACpD,QAAM,QAAQ,KAAK,MAAM,iBAAiB;AAC1C,SAAO,QAAQ,MAAM,CAAC,IAAI;AAC5B;AASA,SAAS,mBAAmB,WAAmB,SAAmC;AAChF,QAAM,EAAE,MAAM,aAAa,gBAAgB,MAAM,IAAI;AAErD,MAAI,OAAO;AAEX,MAAI,OAAO;AACT,YAAQ,iCAAiCC,YAAW,KAAK,CAAC;AAAA,EAC5D;AAEA,UAAQ,8CAA8C,IAAI;AAE1D,MAAI,eAAe,eAAe,SAAS,GAAG;AAC5C,UAAM,QAAQ,UAAU,MAAM,IAAI;AAClC,UAAM,gBAAgB,MACnB,IAAI,CAAC,MAAM,MAAM;AAChB,YAAM,UAAU,IAAI;AACpB,YAAM,gBAAgB,eAAe,SAAS,OAAO;AACrD,YAAM,UAAU,CAAC,iBAAiB;AAClC,UAAI,cAAe,SAAQ,KAAK,aAAa;AAE7C,UAAI,SAAS;AACb,UAAI,aAAa;AACf,iBAAS,mCAAmC,OAAO;AAAA,MACrD;AAEA,aAAO,gBAAgB,QAAQ,KAAK,GAAG,CAAC,KAAK,MAAM,GAAG,IAAI;AAAA,IAC5D,CAAC,EACA,KAAK,IAAI;AAEZ,YAAQ;AAAA,EACV,OAAO;AACL,YAAQ;AAAA,EACV;AAEA,UAAQ,gDAAgD,mBAAmB,oBAAoB,SAAS,CAAC,CAAC;AAAA;AAAA;AAAA;AAK1G,UAAQ;AAER,SAAO;AACT;AAEA,SAAS,oBAAoB,MAAsB;AACjD,SAAO,KACJ,QAAQ,YAAY,EAAE,EACtB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,GAAG,EACpB,QAAQ,UAAU,GAAG,EACrB,QAAQ,WAAW,GAAG,EACtB,QAAQ,UAAU,GAAG;AAC1B;AAEA,SAASA,YAAW,MAAsB;AACxC,SAAO,KACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,OAAO;AAC1B;;;AC1OA,SAAS,SAAAC,cAAa;AAWf,SAAS,YAAY,SAA4B;AACtD,QAAM,EAAE,SAAS,IAAI;AAGrB,QAAM,iBAAiB,aAAa,MAAM,KAAK,SAAS,QAAQ,OAAO,EAAE;AAEzE,SAAO,CAAC,SAAe;AACrB,QAAI,CAAC,gBAAgB;AAEnB;AAAA,IACF;AAEA,IAAAA,OAAM,MAAM,WAAW,CAAC,SAAkB;AACxC,UAAI,KAAK,YAAY,KAAK;AACxB,cAAM,OAAO,KAAK,YAAY;AAE9B,YAAI,OAAO,SAAS,UAAU;AAG5B,cAAI,KAAK,WAAW,GAAG,KAAK,CAAC,KAAK,WAAW,IAAI,KAAK,CAAC,KAAK,WAAW,cAAc,GAAG;AACtF,iBAAK,aAAa,KAAK,cAAc,CAAC;AACtC,iBAAK,WAAW,OAAO,iBAAiB;AAAA,UAC1C;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;AJbA,eAAsB,kBACpB,SACA,QACA,UAA4B,CAAC,GACH;AAC1B,QAAM,EAAE,MAAM,aAAa,SAAS,gBAAgB,IAAI,OAAO,OAAO;AACtE,QAAM,EAAE,WAAW,KAAK,aAAa,oBAAoB,IAAI;AAE7D,QAAM,gBAA+B,EAAE,KAAK,CAAC,EAAE;AAC/C,QAAM,cAAc,uBAAwB,MAAM,uBAAuB,MAAM;AAE/E,QAAM,YAAY,QAAQ,EACvB,IAAI,WAAW,EACf,IAAI,mBAAmB,CAAC,MAAM,CAAC,EAC/B,IAAI,SAAS,EACb,IAAI,eAAe,EACnB,IAAI,gBAAgB,EACpB,IAAI,kBAAkB,EAAE,eAAe,QAAQ,OAAO,KAAK,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAC5E,IAAI,cAAc,EAAE,oBAAoB,KAAK,CAAC,EAC9C,IAAI,4BAA4B,EAAE,aAAa,OAAO,CAAC,EACvD,IAAI,aAAa,EAAE,SAAS,CAAC,EAC7B,IAAI,iBAAiB,EAAE,oBAAoB,KAAK,CAAC;AAEpD,MAAI,OAAO,eAAe;AACxB,eAAW,UAAU,OAAO,eAAe;AACzC,gBAAU,IAAI,MAA6C;AAAA,IAC7D;AAAA,EACF;AAEA,MAAI,OAAO,eAAe;AACxB,eAAW,UAAU,OAAO,eAAe;AACzC,gBAAU,IAAI,MAA6C;AAAA,IAC7D;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,UAAU,QAAQ,eAAe;AAEtD,SAAO;AAAA,IACL,MAAM,OAAO,MAAM;AAAA,IACnB;AAAA,IACA,KAAK,cAAc;AAAA,EACrB;AACF;AAEA,eAAsB,yBACpB,SACA,QAC0B;AAC1B,SAAO,kBAAkB,SAAS,MAAM;AAC1C;;;AKxEA,OAAO,QAAQ;AACf,OAAO,YAAY;AACnB,OAAO,UAAU;AA8BV,SAAS,kBACd,WACA,UAAoC,CAAC,GAC7B;AACR,QAAM,EAAE,aAAa,cAAc,IAAI;AAEvC,MAAI;AACJ,MAAI;AACJ,MAAI,YAAY;AAChB,MAAI,mBAAmB;AAEvB,WAAS,mBAAmB,KAAa,SAA8B;AACrE,UAAM,SAAsB,CAAC;AAE7B,QAAI;AACF,YAAM,UAAU,OAAO,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAE/D,iBAAW,SAAS,SAAS;AAC3B,cAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAE1C,YAAI,MAAM,YAAY,GAAG;AACvB,gBAAM,WAAW,mBAAmB,UAAU,OAAO;AACrD,iBAAO,KAAK,GAAG,QAAQ;AAAA,QACzB,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AAClE,gBAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AACpD,gBAAM,OAAO,aAAa,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,GAAG;AAEjE,iBAAO,KAAK;AAAA,YACV;AAAA,YACA,QAAQ;AAAA,YACR,cAAc,aAAa,QAAQ,OAAO,GAAG;AAAA,UAC/C,CAAC;AAAA,QACH,WAAW,MAAM,SAAS,YAAY;AACpC,gBAAM,YAAY,KAAK,QAAQ,QAAQ;AACvC,gBAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AAGpD,cAAI,cAAc,SAAS;AACzB,kBAAM,OAAO,KAAK,SAAS,SAAS,SAAS,EAAE,QAAQ,OAAO,GAAG;AAEjE,mBAAO,KAAK;AAAA,cACV;AAAA,cACA,QAAQ;AAAA,cACR,cAAc,aAAa,QAAQ,OAAO,GAAG;AAAA,YAC/C,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,kBAAkB,OAA0B;AACnD,UAAM,EAAE,MAAM,aAAa,IAAI;AAI/B,UAAM,qBAAqB,KAAK,MAAM,GAAG,EAAE,SAAS;AACpD,UAAM,gBAAgB,MAAM,OAAO,kBAAkB;AACrD,UAAM,oBAAoB,GAAG,aAAa,WAAW,YAAY;AAGjE,UAAM,gBACJ,KACG,MAAM,GAAG,EACT,IAAI,CAAC,SAAS,KAAK,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,EACjF,KAAK,EAAE,EACP,QAAQ,OAAO,EAAE,IAAI;AAG1B,UAAM,YAAY,IAAI,IAAI;AAG1B,UAAM,eAAe,KAClB,MAAM,GAAG,EACT,IAAI,EACJ,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAG1C,UAAM,mBAAmB,eAAe,YAAY,YAAY;AAEhE,WAAO;AAAA;AAAA,WAEA,gBAAgB;AAAA;AAAA;AAAA;AAAA,6CAIkB,iBAAiB;AAAA;AAAA,wCAEtB,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2EAM0B,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,4EAKX,YAAY;AAAA;AAAA;AAAA;AAAA,eAIzE,aAAa;AAAA;AAAA;AAAA,WAGjB,aAAa;AAAA;AAAA,+CAEuB,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,iBAK1C,YAAY;AAAA,qBACR,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA,SAKxB,gBAAgB;AAAA;AAAA,UAEf,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKxB;AAEA,WAAS,mBAAmB,OAA2B;AACrD,UAAM,gBAAgB,KAAK,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM;AAC9D,UAAM,OAAO,kBAAkB,KAAK;AAGpC,QAAI;AACF,YAAM,kBAAkB,OAAO,aAAa,eAAe,OAAO;AAClE,UAAI,oBAAoB,MAAM;AAC5B,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,WAAO,UAAU,KAAK,QAAQ,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AACjE,WAAO,cAAc,eAAe,MAAM,OAAO;AACjD,WAAO;AAAA,EACT;AAEA,WAAS,wBAA8B;AACrC,UAAM,SAAS,mBAAmB,YAAY,UAAU;AAExD,QAAI,eAAe;AACnB,eAAW,SAAS,QAAQ;AAC1B,UAAI,mBAAmB,KAAK,GAAG;AAC7B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,eAAe,GAAG;AACpB,cAAQ,IAAI,oBAAoB,YAAY,sBAAsB;AAAA,IACpE;AAAA,EACF;AAEA,iBAAe,sBAAsB,KAA4B;AAC/D,QAAI;AACF,YAAM,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACzC,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,iBAAe,eAAe,OAAoC;AAChE,UAAM,gBAAgB,KAAK,KAAK,WAAW,GAAG,MAAM,IAAI,MAAM;AAC9D,UAAM,eAAe,KAAK,QAAQ,aAAa;AAE/C,UAAM,sBAAsB,YAAY;AAExC,UAAM,OAAO,kBAAkB,KAAK;AAGpC,QAAI;AACF,YAAM,kBAAkB,MAAM,GAAG,SAAS,eAAe,OAAO;AAChE,UAAI,oBAAoB,MAAM;AAC5B,eAAO;AAAA,MACT;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,UAAM,GAAG,UAAU,eAAe,MAAM,OAAO;AAC/C,WAAO;AAAA,EACT;AAEA,iBAAe,uBAAsC;AACnD,UAAM,iBAAiB;AAEvB,QAAI;AACF,YAAM,UAAU,MAAM,GAAG,QAAQ,gBAAgB,EAAE,eAAe,MAAM,WAAW,KAAK,CAAC;AAEzF,iBAAW,SAAS,SAAS;AAC3B,YAAI,MAAM,OAAO,KAAK,MAAM,KAAK,SAAS,MAAM,KAAK,MAAM,SAAS,eAAe;AACjF,gBAAM,WAAW,KAAK,KAAK,MAAM,cAAc,gBAAgB,MAAM,IAAI;AAGzE,cAAI;AACF,kBAAM,UAAU,MAAM,GAAG,SAAS,UAAU,OAAO;AACnD,gBAAI,QAAQ,WAAW,wCAAwC,GAAG;AAChE,oBAAM,GAAG,OAAO,QAAQ;AAAA,YAC1B;AAAA,UACF,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,iBAAe,eAAe,KAAa,SAAuC;AAChF,UAAM,SAAsB,CAAC;AAC7B,UAAM,UAAU,MAAM,GAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,KAAK,KAAK,MAAM,IAAI;AAE1C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,WAAW,MAAM,eAAe,UAAU,OAAO;AACvD,eAAO,KAAK,GAAG,QAAQ;AAAA,MACzB,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AAClE,cAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AACpD,cAAM,OAAO,aAAa,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,GAAG;AAEjE,eAAO,KAAK;AAAA,UACV;AAAA,UACA,QAAQ;AAAA,UACR,cAAc,aAAa,QAAQ,OAAO,GAAG;AAAA,QAC/C,CAAC;AAAA,MACH,WAAW,MAAM,SAAS,YAAY;AACpC,cAAM,YAAY,KAAK,QAAQ,QAAQ;AACvC,cAAM,eAAe,KAAK,SAAS,SAAS,QAAQ;AAGpD,YAAI,cAAc,SAAS;AACzB,gBAAM,OAAO,KAAK,SAAS,SAAS,SAAS,EAAE,QAAQ,OAAO,GAAG;AAEjE,iBAAO,KAAK;AAAA,YACV;AAAA,YACA,QAAQ;AAAA,YACR,cAAc,aAAa,QAAQ,OAAO,GAAG;AAAA,UAC/C,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,iBAAe,oBAAmC;AAEhD,QAAI,aAAa,CAAC,kBAAkB;AAClC,YAAM,qBAAqB;AAC3B,yBAAmB;AAAA,IACrB;AAEA,UAAM,SAAS,MAAM,eAAe,YAAY,UAAU;AAE1D,QAAI,eAAe;AACnB,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,eAAe,KAAK,GAAG;AAC/B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,eAAe,GAAG;AACpB,cAAQ,IAAI,oBAAoB,YAAY,sBAAsB;AAAA,IACpE;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IAET,OAAO,YAAY,KAAK;AAEtB,YAAM,OAAO,WAAW,QAAQ,QAAQ,IAAI;AAC5C,YAAM,SAAS,KAAK,KAAK,MAAM,KAAK;AACpC,kBAAY,QAAQ,aAAa,KAAK,KAAK,QAAQ,QAAQ;AAC3D,kBAAY,IAAI,YAAY;AAG5B,mBAAa,KAAK,QAAQ,MAAM,QAAQ,UAAU,SAAS;AAI3D,UAAI;AACF,8BAAsB;AAAA,MACxB,SAAS,KAAK;AACZ,gBAAQ,KAAK,qDAAqD,GAAG;AAAA,MACvE;AAAA,IACF;AAAA,IAEA,eAAe,YAAY;AAEzB,UAAI,CAAC,WAAW;AACd,oBAAY,QAAQ,aAAa,KAAK,KAAK,WAAW,MAAM,OAAO,QAAQ;AAC3E,oBAAY,WAAW,YAAY;AAAA,MACrC;AAAA,IACF;AAAA,IAEA,MAAM,aAAa;AAEjB,YAAM,SAAS,UAAU;AACzB,mBAAa,OAAO;AACpB,YAAM,kBAAkB;AAAA,IAC1B;AAAA,IAEA,gBAAgB,QAAQ;AAEtB,aAAO,QAAQ,IAAI,UAAU;AAE7B,aAAO,QAAQ,GAAG,UAAU,OAAO,gBAAgB;AACjD,YAAI,YAAY,WAAW,UAAU,KAAK,YAAY,SAAS,KAAK,GAAG;AACrE,gBAAM,kBAAkB;AAAA,QAC1B;AAAA,MACF,CAAC;AAED,aAAO,QAAQ,GAAG,OAAO,OAAO,cAAc;AAC5C,YAAI,UAAU,WAAW,UAAU,KAAK,UAAU,SAAS,KAAK,GAAG;AACjE,gBAAM,kBAAkB;AAAA,QAC1B;AAAA,MACF,CAAC;AAED,aAAO,QAAQ,GAAG,UAAU,OAAO,gBAAgB;AACjD,YAAI,YAAY,WAAW,UAAU,KAAK,YAAY,SAAS,KAAK,GAAG;AAErE,6BAAmB;AACnB,gBAAM,kBAAkB;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;;;ACpXA,SAAS,qBAAqB;AAC9B,OAAO,WAAW;AAClB,OAAOC,SAAQ;AACf,OAAOC,aAAY;AACnB,OAAOC,WAAU;AACjB,SAAS,gBAAgB;AAMzB,SAAS,gBAAgB,KAAiC;AACxD,MAAI,MAAMA,MAAK,QAAQ,GAAG;AAC1B,QAAM,OAAOA,MAAK,MAAM,GAAG,EAAE;AAE7B,SAAO,QAAQ,MAAM;AACnB,UAAM,YAAYA,MAAK,QAAQ,GAAG;AAClC,UAAM,kBAAkBA,MAAK,KAAK,WAAW,cAAc;AAE3D,QAAID,QAAO,WAAW,eAAe,GAAG;AAEtC,aAAOC,MAAK,SAAS,KAAK,SAAS,KAAK;AAAA,IAC1C;AAEA,UAAM;AAAA,EACR;AAEA,SAAO;AACT;AAOA,SAAS,qBAAqB,KAAiC;AAC7D,MAAI;AACF,UAAM,YAAY,SAAS,6BAA6B;AAAA,MACtD;AAAA,MACA,UAAU;AAAA,MACV,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,IAChC,CAAC,EAAE,KAAK;AAKR,UAAM,QAAQ,UAAU,MAAM,8CAA8C;AAC5E,WAAO,QAAQ,CAAC;AAAA,EAClB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,IAAM,oBAAoB;AAC1B,IAAM,6BAA6B,OAAO;AAE1C,IAAM,qBAAqB;AAC3B,IAAM,8BAA8B,OAAO;AAmB3C,IAAM,kBAAkB;AACxB,IAAI,0BAA4D;AAEhE,SAAS,oBAAoB,QAAmD;AAE9E,MAAK,WAAuC,eAAe,GAAG;AAC5D,WAAO,QAAQ;AAAA,MACZ,WAAuC,eAAe;AAAA,IACzD;AAAA,EACF;AAEA,MAAI,CAAC,yBAAyB;AAC5B,8BAA0B,uBAAuB,OAAO,QAAQ,EAAE,KAAK,CAAC,gBAAgB;AACtF;AAAC,MAAC,WAAuC,eAAe,IAAI;AAC5D,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,SAAS,WAAW,UAA6B,CAAC,GAAa;AACpE,MAAI;AAGJ,QAAM,EAAE,QAAQ,WAAW,SAAS,cAAc,MAAM,GAAG,YAAY,IAAI;AAE3E,QAAM,aAAqB;AAAA,IACzB,MAAM;AAAA,IACN,SAAS;AAAA,IAET,OAAO,YAAY,KAAiB;AAClC,YAAM,SAAqB;AAAA,QACzB,cAAc;AAAA,UACZ,SAAS,CAAC,uBAAuB;AAAA,QACnC;AAAA,QACA,KAAK;AAAA,UACH,YAAY,CAAC,MAAM;AAAA,QACrB;AAAA,MACF;AAGA,UAAI,eAAe,IAAI,YAAY,WAAW,CAAC,WAAW,MAAM;AAC9D,cAAM,WAAW,qBAAqB,WAAW,QAAQ,QAAQ,IAAI,CAAC;AACtE,YAAI,UAAU;AACZ,iBAAO,OAAO,IAAI,QAAQ;AAC1B,kBAAQ,IAAI,6CAA6C,OAAO,IAAI,EAAE;AAAA,QACxE;AAAA,MACF;AAEA,aAAO;AAAA,IACT;AAAA,IAEA,MAAM,eAAe,QAAQ;AAC3B,YAAM,OAAO,OAAO;AACpB,YAAM,gBAA6B;AAAA,QACjC,OAAO,YAAY,SAAS;AAAA,QAC5B,aAAa,YAAY,eAAe;AAAA,MAC1C;AACA,uBAAiB,cAAc,EAAE,GAAG,eAAe,GAAG,YAAY,GAAG,IAAI;AAAA,IAC3E;AAAA,IAEA,UAAU,IAAI;AACZ,UAAI,OAAO,mBAAmB;AAC5B,eAAO;AAAA,MACT;AACA,UAAI,OAAO,oBAAoB;AAC7B,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IAEA,MAAM,KAAK,IAAI;AACb,UAAI,OAAO,4BAA4B;AACrC,cAAM,eAAe;AAAA,UACnB,OAAO,eAAe;AAAA,UACtB,aAAa,eAAe;AAAA,UAC5B,MAAM,eAAe;AAAA,UACrB,MAAM,eAAe;AAAA,UACrB,aAAa,eAAe;AAAA,QAC9B;AACA,eAAO,kBAAkB,KAAK,UAAU,YAAY,CAAC;AAAA,MACvD;AAEA,UAAI,OAAO,6BAA6B;AACtC,cAAM,UAAU,MAAM,gBAAgB,cAAc;AACpD,eAAO,kBAAkB,KAAK,UAAU,OAAO,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAyB;AAAA,IAC7B,MAAM;AAAA,IACN,SAAS;AAAA,IAET,MAAM,UAAU,MAAM,IAAI;AACxB,UAAI,CAAC,GAAG,SAAS,KAAK,GAAG;AACvB;AAAA,MACF;AAEA,YAAM,cAAc,MAAM,oBAAoB,cAAc;AAE5D,YAAM,SAAS,MAAM,kBAAkB,MAAM,eAAe,UAAU;AAAA,QACpE,UAAU,eAAe;AAAA,QACzB;AAAA,MACF,CAAC;AAED,YAAM,gBAAgB;AAAA;AAAA;AAAA,6BAGC,KAAK,UAAU,OAAO,WAAW,CAAC;AAAA,qBAC1C,KAAK,UAAU,OAAO,GAAG,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA,yCAKN,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA;AAAA;AAAA;AAK9D,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAEA,QAAM,UAAoB,CAAC,YAAY,cAAc;AAKrD,MAAI,WAAW,OAAO;AACpB,YAAQ;AAAA,MACN,kBAAkB,MAAM,gBAAgB;AAAA,QACtC,QAAQ,YAAY;AAAA,QACpB,GAAG;AAAA,MACL,CAAC;AAAA,IACH;AAAA,EACF;AAKA,MAAI,SAAS;AAEX,UAAM,cAAc,gBAAgB,QAAQ,IAAI,CAAC;AACjD,UAAM,oBAAoB,cAAc,GAAG,WAAW,kBAAkB;AAExE,UAAM,uBAAsC;AAAA,MAC1C,SAAS;AAAA,MACT,aAAa,CAAC,iBAAiB;AAAA,MAC/B,KAAK;AAAA,MACL,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,IACnB;AAEA,UAAM,gBACJ,YAAY,OAAO,uBAAuB,EAAE,GAAG,sBAAsB,GAAG,QAAQ;AAElF,QAAI,eAAe;AAEnB,UAAM,gBAAwB;AAAA,MAC5B,MAAM;AAAA,MAEN,MAAM,aAAa;AACjB,YAAI,CAAC,gBAAgB,cAAc,SAAS;AAC1C,kBAAQ,IAAI,qDAAqD;AACjE,gBAAM,YAAY,KAAK,IAAI;AAC3B,cAAI;AACF,kBAAM,aAAa,YAAY,UAAU;AACzC,kBAAM,OAAO,MAAM,gBAAgB,eAAe,UAAU;AAC5D,kBAAM,WAAW,KAAK,IAAI,IAAI;AAC9B,oBAAQ,IAAI,oBAAoB,KAAK,MAAM,+BAA+B,QAAQ,IAAI;AACtF,2BAAe;AAAA,UACjB,SAAS,OAAO;AAGd,oBAAQ;AAAA,cACN;AAAA,YACF;AACA,oBAAQ,KAAK,sDAAsD;AACnE,gBAAI,iBAAiB,OAAO;AAC1B,sBAAQ,KAAK,iBAAiB,MAAM,OAAO,EAAE;AAAA,YAC/C;AACA,2BAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,YAAQ,QAAQ,aAAa;AAAA,EAC/B;AAGA,QAAM,iBAAiB,cAAc;AAAA,IACnC,WAAW;AAAA,MACT,SAAS,WAAW,WAAW;AAAA,MAC/B,YAAY,WAAW,cAAc;AAAA,IACvC;AAAA,EACF,CAAC;AACD,QAAM,mBACJ,MAAM,QAAQ,cAAc,IAAI,iBAAiB,CAAC,cAAc,GAChE,OAAO,CAAC,MAAmB,KAAK,IAAI;AACtC,UAAQ,KAAK,GAAG,eAAe;AAG/B,QAAM,cAAc,MAAM;AAC1B,QAAM,gBAAgB,MAAM,QAAQ,WAAW,IAAI,cAAc,CAAC,WAAW,GAAG;AAAA,IAC9E,CAAC,MAAmB,KAAK;AAAA,EAC3B;AACA,UAAQ,KAAK,GAAG,YAAY;AAE5B,SAAO;AACT;AAEA,eAAe,gBAAgB,QAAwB;AACrD,QAAM,EAAE,YAAY,YAAY,IAAI;AAEpC,MAAI,YAAY,WAAW,CAAC,MAAM,QAAQ,YAAY,OAAO,GAAG;AAC9D,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI,YAAY,WAAW,MAAM,QAAQ,YAAY,OAAO,KAAK,YAAY,QAAQ,SAAS,GAAG;AAC/F,WAAO,YAAY;AAAA,EACrB;AAEA,MAAI;AACF,UAAM,UAAU,MAAM,cAAc,YAAY,YAAY,OAAO,IAAI;AACvE,WAAO;AAAA,EACT,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;AAEA,eAAe,cACb,KACA,SACA,WACoE;AACpE,QAAM,UAAU,MAAMF,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAC7D,QAAM,QAAmF,CAAC;AAE1F,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWE,MAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAM,eAAeA,MAAK,SAAS,SAAS,QAAQ;AAEpD,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,WAAW,MAAM,cAAc,UAAU,SAAS,SAAS;AACjE,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,YAAYA,MAAK,KAAK,UAAU,UAAU;AAChD,YAAI;AAEJ,YAAI;AACF,gBAAMF,IAAG,OAAO,SAAS;AAEzB,iBAAO,MAAM,aAAa,QAAQ,OAAO,GAAG;AAAA,QAC9C,QAAQ;AAAA,QAER;AAEA,cAAM,KAAK;AAAA,UACT,MAAM,YAAY,MAAM,IAAI;AAAA,UAC5B;AAAA,UACA,OAAO;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AAClE,YAAM,cAAc,MAAMA,IAAG,SAAS,UAAU,OAAO;AACvD,YAAM,mBAAmB,YAAY,MAAM,uBAAuB;AAElE,UAAI,QAAQ,YAAY,MAAM,KAAK,QAAQ,SAAS,EAAE,CAAC;AACvD,UAAI;AAEJ,UAAI,kBAAkB;AACpB,cAAM,kBAAkB,iBAAiB,CAAC;AAC1C,cAAM,aAAa,gBAAgB,MAAM,+BAA+B;AACxE,cAAM,aAAa,gBAAgB,MAAM,gBAAgB;AAEzD,YAAI,YAAY;AACd,kBAAQ,WAAW,CAAC,EAAE,KAAK;AAAA,QAC7B;AACA,YAAI,YAAY;AACd,kBAAQ,SAAS,WAAW,CAAC,GAAG,EAAE;AAAA,QACpC;AAAA,MACF;AAGA,YAAM,OAAO,MAAM,aAAa,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,GAAG;AAEvE,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,KAAK,CAAC,GAAG,MAAM;AACnB,QAAI,EAAE,UAAU,UAAa,EAAE,UAAU,QAAW;AAClD,aAAO,EAAE,QAAQ,EAAE;AAAA,IACrB;AACA,QAAI,EAAE,UAAU,OAAW,QAAO;AAClC,QAAI,EAAE,UAAU,OAAW,QAAO;AAClC,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AAED,SAAO,MAAM,IAAI,CAAC,EAAE,OAAO,QAAQ,GAAG,KAAK,MAAM,IAAI;AACvD;AAEA,SAAS,YAAY,MAAsB;AACzC,SAAO,KAAK,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAC3E;;;AC3YA,OAAOG,SAAQ;AACf,OAAOC,WAAU;AAmBjB,eAAsB,QAAQ,SAAwD;AACpF,QAAM,EAAE,MAAM,YAAY,OAAO,IAAI;AAErC,QAAM,gBAAgB;AAAA,IACpBC,MAAK,KAAK,YAAY,GAAG,IAAI,KAAK;AAAA,IAClCA,MAAK,KAAK,YAAY,MAAM,UAAU;AAAA,EACxC;AAEA,MAAI,WAA0B;AAC9B,MAAI,cAA6B;AAEjC,aAAW,WAAW,eAAe;AACnC,QAAI;AACF,oBAAc,MAAMC,IAAG,SAAS,SAAS,OAAO;AAChD,iBAAW;AACX;AAAA,IACF,QAAQ;AACN;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,CAAC,aAAa;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,MAAM,kBAAkB,aAAa,OAAO,QAAQ;AACnE,QAAM,eAAeD,MAAK,SAAS,YAAY,QAAQ;AAEvD,MAAI;AACJ,MAAI;AACF,UAAM,OAAO,MAAMC,IAAG,KAAK,QAAQ;AACnC,kBAAc,KAAK;AAAA,EACrB,QAAQ;AAAA,EAER;AAEA,SAAO;AAAA,IACL,SAAS,OAAO;AAAA,IAChB,aAAa,OAAO;AAAA,IACpB,KAAK,OAAO;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,YAAY,YAAoB,QAA6C;AACjG,QAAM,OAAmB,CAAC;AAE1B,iBAAe,QAAQ,KAAa;AAClC,UAAM,UAAU,MAAMA,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAE7D,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWD,MAAK,KAAK,KAAK,MAAM,IAAI;AAE1C,UAAI,MAAM,YAAY,GAAG;AACvB,cAAM,QAAQ,QAAQ;AAAA,MACxB,WAAW,MAAM,KAAK,SAAS,KAAK,GAAG;AACrC,cAAM,cAAc,MAAMC,IAAG,SAAS,UAAU,OAAO;AACvD,cAAM,SAAS,MAAM,kBAAkB,aAAa,OAAO,QAAQ;AACnE,cAAM,eAAeD,MAAK,SAAS,YAAY,QAAQ;AAEvD,YAAI;AACJ,YAAI;AACF,gBAAM,OAAO,MAAMC,IAAG,KAAK,QAAQ;AACnC,wBAAc,KAAK;AAAA,QACrB,QAAQ;AAAA,QAER;AAEA,aAAK,KAAK;AAAA,UACR,OAAO,OAAO,YAAY,SAASC,aAAY,MAAM,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,UAC9E,aAAa,OAAO,YAAY;AAAA,UAChC,aAAa,OAAO;AAAA,UACpB,SAAS,OAAO;AAAA,UAChB,KAAK,OAAO;AAAA,UACZ,UAAU;AAAA,UACV;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,UAAU;AACxB,SAAO;AACT;AAEA,SAASA,aAAY,MAAsB;AACzC,SAAO,KAAK,QAAQ,SAAS,GAAG,EAAE,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAC3E;AAEO,SAAS,gBAAgB,cAA8B;AAC5D,SAAO,aACJ,QAAQ,SAAS,EAAE,EACnB,QAAQ,YAAY,EAAE,EACtB,QAAQ,OAAO,GAAG;AACvB;AAEO,SAAS,oBAAoB,MAAkB,MAAoC;AACxF,SAAO,KAAK,KAAK,CAAC,QAAQ;AACxB,UAAM,UAAU,gBAAgB,IAAI,YAAY;AAChD,WAAO,YAAY,QAAQ,YAAY,GAAG,IAAI;AAAA,EAChD,CAAC;AACH;;;AC5HA,OAAOC,SAAQ;AAEf,OAAOC,WAAU;AACjB,OAAOC,aAAY;AASnB,eAAsBC,iBAAgB,SAA2D;AAC/F,QAAM,EAAE,YAAY,UAAU,OAAO,IAAI;AAEzC,QAAM,gBAAgB,OAAO,YAAY;AAEzC,MAAI,eAAe;AACjB,QAAI,MAAM,QAAQ,aAAa,KAAK,cAAc,SAAS,GAAG;AAC5D,aAAO;AAAA,IACT;AACA,QAAI,CAAC,MAAM,QAAQ,aAAa,GAAG;AACjC,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AAEA,SAAO,MAAM,wBAAwB,YAAY,YAAY,QAAQ;AACvE;AAEA,eAAe,wBACb,KACA,SACA,WACwB;AACxB,MAAI;AAEJ,MAAI;AACF,cAAW,MAAMH,IAAG,QAAQ,KAAK,EAAE,eAAe,KAAK,CAAC;AAAA,EAC1D,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AAMA,QAAM,QAAgC,CAAC;AAEvC,aAAW,SAAS,SAAS;AAC3B,UAAM,WAAWC,MAAK,KAAK,KAAK,MAAM,IAAI;AAC1C,UAAM,eAAeA,MAAK,SAAS,SAAS,QAAQ;AAEpD,QAAI,MAAM,KAAK,WAAW,GAAG,KAAK,MAAM,KAAK,WAAW,GAAG,GAAG;AAC5D;AAAA,IACF;AAEA,QAAI,MAAM,YAAY,GAAG;AACvB,YAAM,WAAW,MAAM,wBAAwB,UAAU,SAAS,SAAS;AAE3E,UAAI,SAAS,SAAS,GAAG;AACvB,cAAM,YAAYA,MAAK,KAAK,UAAU,UAAU;AAChD,YAAI;AACJ,YAAI,QAAQG,aAAY,MAAM,IAAI;AAClC,YAAI;AAEJ,YAAI;AACF,gBAAM,eAAe,MAAMJ,IAAG,SAAS,WAAW,OAAO;AACzD,gBAAM,EAAE,MAAM,YAAY,IAAIE,QAAO,YAAY;AAEjD,cAAI,YAAY,OAAO;AACrB,oBAAQ,YAAY;AAAA,UACtB;AACA,cAAI,OAAO,YAAY,UAAU,UAAU;AACzC,oBAAQ,YAAY;AAAA,UACtB;AAGA,iBAAO,cAAc,YAAY;AAAA,QACnC,QAAQ;AAAA,QAER;AAEA,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN;AAAA,UACA,WAAW;AAAA,UACX,OAAO;AAAA,UACP;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,MAAM,KAAK,SAAS,KAAK,KAAK,MAAM,SAAS,YAAY;AAClE,YAAM,cAAc,MAAMF,IAAG,SAAS,UAAU,OAAO;AACvD,YAAM,EAAE,MAAM,YAAY,IAAIE,QAAO,WAAW;AAEhD,UAAI,YAAY,YAAY,OAAO;AACjC;AAAA,MACF;AAEA,YAAM,QAAQ,YAAY,SAASE,aAAY,MAAM,KAAK,QAAQ,SAAS,EAAE,CAAC;AAC9E,YAAM,QAAQ,OAAO,YAAY,UAAU,WAAW,YAAY,QAAQ;AAG1E,YAAM,OAAO,cAAc,aAAa,QAAQ,SAAS,EAAE,CAAC;AAE5D,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,KAAK,CAAC,GAAG,MAAM;AACnB,QAAI,EAAE,UAAU,UAAa,EAAE,UAAU,QAAW;AAClD,aAAO,EAAE,QAAQ,EAAE;AAAA,IACrB;AACA,QAAI,EAAE,UAAU,OAAW,QAAO;AAClC,QAAI,EAAE,UAAU,OAAW,QAAO;AAClC,WAAO,EAAE,KAAK,cAAc,EAAE,IAAI;AAAA,EACpC,CAAC;AAED,SAAO,MAAM,IAAI,CAAC,EAAE,OAAO,QAAQ,GAAG,KAAK,MAAM,IAAI;AACvD;AAEA,SAASA,aAAY,MAAsB;AACzC,SAAO,KACJ,QAAQ,SAAS,EAAE,EACnB,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;AAC5C;AAEA,SAAS,cAAc,GAAmB;AACxC,SAAO,MAAM,EAAE,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AACvD;","names":["visit","visit","escapeHtml","visit","fs","fsSync","path","fs","path","path","fs","formatTitle","fs","path","matter","generateSidebar","formatTitle"]}
|
|
1
|
+
{"version":3,"sources":["../src/markdown/pipeline.ts","../src/markdown/containers.ts","../src/markdown/toc.ts","../src/markdown/shiki.ts","../src/markdown/links.ts","../src/vite/routes-plugin.ts","../src/vite/plugin.ts","../src/runtime/loader.ts","../src/runtime/sidebar.ts"],"sourcesContent":["import { unified } from \"unified\"\nimport remarkParse from \"remark-parse\"\nimport remarkGfm from \"remark-gfm\"\nimport remarkFrontmatter from \"remark-frontmatter\"\nimport remarkDirective from \"remark-directive\"\nimport remarkRehype from \"remark-rehype\"\nimport rehypeStringify from \"rehype-stringify\"\nimport matter from \"gray-matter\"\nimport type { MarkdownConfig, TOCItem, PageFrontmatter } from \"../config/types\"\nimport { remarkContainers } from \"./containers\"\nimport { remarkExtractToc, type TocExtraction } from \"./toc\"\nimport { createShikiHighlighter, rehypeShikiFromHighlighter, type ShikiHighlighter } from \"./shiki\"\nimport { rehypeLinks } from \"./links\"\n\nexport interface TransformResult {\n html: string\n frontmatter: PageFrontmatter\n toc: TOCItem[]\n}\n\nexport interface TransformOptions {\n basePath?: string\n highlighter?: ShikiHighlighter\n}\n\nexport async function transformMarkdown(\n content: string,\n config: MarkdownConfig,\n options: TransformOptions = {}\n): Promise<TransformResult> {\n const { data: frontmatter, content: markdownContent } = matter(content)\n const { basePath = \"/\", highlighter: providedHighlighter } = options\n\n const tocExtraction: TocExtraction = { toc: [] }\n const highlighter = providedHighlighter ?? (await createShikiHighlighter(config))\n\n const processor = unified()\n .use(remarkParse)\n .use(remarkFrontmatter, [\"yaml\"])\n .use(remarkGfm)\n .use(remarkDirective)\n .use(remarkContainers)\n .use(remarkExtractToc, { tocExtraction, levels: config.toc?.level ?? [2, 3] })\n .use(remarkRehype, { allowDangerousHtml: true })\n .use(rehypeShikiFromHighlighter, { highlighter, config })\n .use(rehypeLinks, { basePath })\n .use(rehypeStringify, { allowDangerousHtml: true })\n\n if (config.remarkPlugins) {\n for (const plugin of config.remarkPlugins) {\n processor.use(plugin as Parameters<typeof processor.use>[0])\n }\n }\n\n if (config.rehypePlugins) {\n for (const plugin of config.rehypePlugins) {\n processor.use(plugin as Parameters<typeof processor.use>[0])\n }\n }\n\n const result = await processor.process(markdownContent)\n\n return {\n html: String(result),\n frontmatter: frontmatter as PageFrontmatter,\n toc: tocExtraction.toc,\n }\n}\n\nexport async function transformMarkdownToReact(\n content: string,\n config: MarkdownConfig\n): Promise<TransformResult> {\n return transformMarkdown(content, config)\n}\n","import type { Root } from \"mdast\"\nimport type { ContainerDirective } from \"mdast-util-directive\"\nimport { visit } from \"unist-util-visit\"\n\nconst containerTypes = [\n \"tip\",\n \"warning\",\n \"danger\",\n \"info\",\n \"note\",\n \"details\",\n \"code-group\",\n] as const\ntype ContainerType = (typeof containerTypes)[number]\n\nconst defaultTitles: Record<ContainerType, string> = {\n tip: \"TIP\",\n warning: \"WARNING\",\n danger: \"DANGER\",\n info: \"INFO\",\n note: \"NOTE\",\n details: \"Details\",\n \"code-group\": \"\",\n}\n\nexport function remarkContainers() {\n return function (tree: Root) {\n visit(tree, \"containerDirective\", (node: ContainerDirective) => {\n const type = node.name as ContainerType\n\n if (!containerTypes.includes(type)) {\n return\n }\n\n const data = node.data || (node.data = {})\n\n const titleNode = node.children[0]\n let customTitle: string | undefined\n\n if (\n titleNode &&\n titleNode.type === \"paragraph\" &&\n titleNode.children[0]?.type === \"text\" &&\n titleNode.data?.directiveLabel\n ) {\n customTitle = (titleNode.children[0] as { value: string }).value\n node.children.shift()\n }\n\n const title = customTitle || defaultTitles[type]\n\n if (type === \"code-group\") {\n data.hName = \"div\"\n data.hProperties = {\n className: [\"press-code-group\"],\n }\n\n const tabs: Array<{ label: string; content: unknown }> = []\n\n for (const child of node.children) {\n if (child.type === \"code\") {\n const codeNode = child as { lang?: string; meta?: string; value: string }\n const meta = codeNode.meta || \"\"\n const labelMatch = meta.match(/\\[([^\\]]+)\\]/)\n const label = labelMatch ? labelMatch[1] : codeNode.lang || \"Code\"\n tabs.push({ label, content: child })\n }\n }\n\n const tabsHtml = tabs\n .map(\n (tab, i) =>\n `<button class=\"press-code-group-tab${i === 0 ? \" active\" : \"\"}\" data-index=\"${i}\">${escapeHtml(tab.label)}</button>`\n )\n .join(\"\")\n\n node.children = [\n {\n type: \"html\",\n value: `<div class=\"press-code-group-tabs\">${tabsHtml}</div>`,\n } as unknown as (typeof node.children)[number],\n {\n type: \"html\",\n value: '<div class=\"press-code-group-panels\">',\n } as unknown as (typeof node.children)[number],\n ...tabs.map(\n (tab, i) =>\n ({\n type: \"html\",\n value: `<div class=\"press-code-group-panel${i === 0 ? \" active\" : \"\"}\" data-index=\"${i}\">`,\n }) as unknown as (typeof node.children)[number]\n ),\n ...node.children.flatMap((child: (typeof node.children)[number], _i: number) => [\n child,\n {\n type: \"html\",\n value: \"</div>\",\n } as unknown as (typeof node.children)[number],\n ]),\n {\n type: \"html\",\n value: \"</div>\",\n } as unknown as (typeof node.children)[number],\n ]\n\n return\n }\n\n if (type === \"details\") {\n data.hName = \"details\"\n data.hProperties = {\n className: [\"press-details\"],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<summary class=\"press-details-summary\">${escapeHtml(title)}</summary>`,\n } as unknown as (typeof node.children)[number])\n\n return\n }\n\n data.hName = \"div\"\n data.hProperties = {\n className: [\"press-container\", `press-container-${type}`],\n }\n\n node.children.unshift({\n type: \"html\",\n value: `<p class=\"press-container-title\">${escapeHtml(title)}</p>`,\n } as unknown as (typeof node.children)[number])\n })\n }\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import type { Root, Heading } from \"mdast\"\nimport { visit } from \"unist-util-visit\"\nimport type { TOCItem } from \"../config/types\"\n\nexport interface TocExtraction {\n toc: TOCItem[]\n}\n\ninterface TocOptions {\n tocExtraction: TocExtraction\n levels: [number, number]\n}\n\nexport function remarkExtractToc(options: TocOptions) {\n const { tocExtraction, levels } = options\n const [minLevel, maxLevel] = levels\n\n return function (tree: Root) {\n const headings: Array<{ text: string; level: number; id: string }> = []\n\n visit(tree, \"heading\", (node: Heading) => {\n if (node.depth < minLevel || node.depth > maxLevel) {\n return\n }\n\n const text = getHeadingText(node)\n const id = slugify(text)\n\n headings.push({\n text,\n level: node.depth,\n id,\n })\n\n // Add id to the heading node for anchor links\n const data = node.data || (node.data = {})\n const hProperties = (data.hProperties || (data.hProperties = {})) as Record<string, string>\n hProperties.id = id\n })\n\n tocExtraction.toc = buildTocTree(headings, minLevel)\n }\n}\n\nfunction getHeadingText(node: Heading): string {\n const textParts: string[] = []\n\n function extractText(child: unknown) {\n if (!child || typeof child !== \"object\") return\n\n const typedChild = child as { type?: string; value?: string; children?: unknown[] }\n\n if (typedChild.type === \"text\") {\n textParts.push(typedChild.value || \"\")\n } else if (typedChild.type === \"inlineCode\") {\n textParts.push(typedChild.value || \"\")\n } else if (Array.isArray(typedChild.children)) {\n typedChild.children.forEach(extractText)\n }\n }\n\n node.children.forEach(extractText)\n return textParts.join(\"\")\n}\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .trim()\n .replace(/[^\\w\\s-]/g, \"\")\n .replace(/[\\s_-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nfunction buildTocTree(\n headings: Array<{ text: string; level: number; id: string }>,\n _minLevel: number\n): TOCItem[] {\n const result: TOCItem[] = []\n const stack: Array<{ item: TOCItem; level: number }> = []\n\n for (const heading of headings) {\n const item: TOCItem = {\n id: heading.id,\n text: heading.text,\n level: heading.level,\n }\n\n while (stack.length > 0 && stack[stack.length - 1].level >= heading.level) {\n stack.pop()\n }\n\n if (stack.length === 0) {\n result.push(item)\n } else {\n const parent = stack[stack.length - 1].item\n if (!parent.children) {\n parent.children = []\n }\n parent.children.push(item)\n }\n\n stack.push({ item, level: heading.level })\n }\n\n return result\n}\n\nexport function flattenToc(toc: TOCItem[]): TOCItem[] {\n const result: TOCItem[] = []\n\n function flatten(items: TOCItem[]) {\n for (const item of items) {\n result.push(item)\n if (item.children) {\n flatten(item.children)\n }\n }\n }\n\n flatten(toc)\n return result\n}\n","import { createHighlighter, type Highlighter, type BundledTheme } from \"shiki\"\nimport type { Root, Element, Text } from \"hast\"\nimport { visit } from \"unist-util-visit\"\nimport type { MarkdownConfig } from \"../config/types\"\n\nexport type ShikiHighlighter = Highlighter\n\nexport async function createShikiHighlighter(config: MarkdownConfig): Promise<ShikiHighlighter> {\n const themeConfig = config.theme ?? {\n light: \"github-light\",\n dark: \"github-dark\",\n }\n\n const themes: BundledTheme[] =\n typeof themeConfig === \"string\" ? [themeConfig] : [themeConfig.light, themeConfig.dark]\n\n const highlighter = await createHighlighter({\n themes,\n langs: [\n \"javascript\",\n \"typescript\",\n \"jsx\",\n \"tsx\",\n \"json\",\n \"html\",\n \"css\",\n \"markdown\",\n \"bash\",\n \"shell\",\n \"yaml\",\n \"python\",\n \"rust\",\n \"go\",\n \"sql\",\n \"diff\",\n ],\n })\n\n return highlighter\n}\n\ninterface RehypeShikiOptions {\n highlighter: ShikiHighlighter\n config: MarkdownConfig\n}\n\nexport function rehypeShikiFromHighlighter(options: RehypeShikiOptions) {\n const { highlighter, config } = options\n\n const themeConfig = config.theme ?? {\n light: \"github-light\",\n dark: \"github-dark\",\n }\n\n return function (tree: Root) {\n visit(tree, \"element\", (node: Element, index, parent) => {\n if (\n node.tagName !== \"pre\" ||\n !node.children[0] ||\n (node.children[0] as Element).tagName !== \"code\"\n ) {\n return\n }\n\n const codeNode = node.children[0] as Element\n const className = (codeNode.properties?.className as string[]) || []\n const langClass = className.find((c) => c.startsWith(\"language-\"))\n const lang = langClass ? langClass.replace(\"language-\", \"\") : \"text\"\n\n const codeContent = getTextContent(codeNode)\n\n if (!codeContent.trim()) {\n return\n }\n\n try {\n let html: string\n\n if (typeof themeConfig === \"string\") {\n html = highlighter.codeToHtml(codeContent, {\n lang,\n theme: themeConfig,\n })\n } else {\n html = highlighter.codeToHtml(codeContent, {\n lang,\n themes: {\n light: themeConfig.light,\n dark: themeConfig.dark,\n },\n defaultColor: false,\n })\n }\n\n const metaString = (codeNode.properties?.metastring as string) || \"\"\n const lineNumbers = config.lineNumbers || metaString.includes(\"showLineNumbers\")\n const highlightLines = parseHighlightLines(metaString)\n const title = parseTitle(metaString)\n\n const wrapperHtml = buildCodeBlockHtml(html, {\n lang,\n lineNumbers,\n highlightLines,\n title,\n })\n\n if (parent && typeof index === \"number\") {\n const newNode: Element = {\n type: \"element\",\n tagName: \"div\",\n properties: {\n className: [\"press-code-block\"],\n \"data-lang\": lang,\n },\n children: [\n {\n type: \"raw\",\n value: wrapperHtml,\n } as unknown as Element,\n ],\n }\n parent.children[index] = newNode\n }\n } catch {\n // If highlighting fails, leave the node unchanged\n }\n })\n }\n}\n\nfunction getTextContent(node: Element | Text): string {\n if (node.type === \"text\") {\n return node.value\n }\n if (\"children\" in node) {\n return node.children.map((child) => getTextContent(child as Element | Text)).join(\"\")\n }\n return \"\"\n}\n\nfunction parseHighlightLines(meta: string): number[] {\n const match = meta.match(/\\{([\\d,-]+)\\}/)\n if (!match) return []\n\n const ranges = match[1].split(\",\")\n const lines: number[] = []\n\n for (const range of ranges) {\n if (range.includes(\"-\")) {\n const [start, end] = range.split(\"-\").map(Number)\n for (let i = start; i <= end; i++) {\n lines.push(i)\n }\n } else {\n lines.push(Number(range))\n }\n }\n\n return lines\n}\n\nfunction parseTitle(meta: string): string | undefined {\n const match = meta.match(/title=\"([^\"]+)\"/)\n return match ? match[1] : undefined\n}\n\ninterface CodeBlockOptions {\n lang: string\n lineNumbers: boolean\n highlightLines: number[]\n title?: string\n}\n\nfunction buildCodeBlockHtml(shikiHtml: string, options: CodeBlockOptions): string {\n const { lang, lineNumbers, highlightLines, title } = options\n\n let html = \"\"\n\n if (title) {\n html += `<div class=\"press-code-title\">${escapeHtml(title)}</div>`\n }\n\n html += `<div class=\"press-code-wrapper\" data-lang=\"${lang}\">`\n\n if (lineNumbers || highlightLines.length > 0) {\n const lines = shikiHtml.split(\"\\n\")\n const processedHtml = lines\n .map((line, i) => {\n const lineNum = i + 1\n const isHighlighted = highlightLines.includes(lineNum)\n const classes = [\"press-code-line\"]\n if (isHighlighted) classes.push(\"highlighted\")\n\n let prefix = \"\"\n if (lineNumbers) {\n prefix = `<span class=\"press-line-number\">${lineNum}</span>`\n }\n\n return `<span class=\"${classes.join(\" \")}\">${prefix}${line}</span>`\n })\n .join(\"\\n\")\n\n html += processedHtml\n } else {\n html += shikiHtml\n }\n\n html += `<button class=\"press-copy-button\" data-code=\"${encodeURIComponent(extractCodeFromHtml(shikiHtml))}\">\n <span class=\"press-copy-icon\">Copy</span>\n <span class=\"press-copied-icon\" style=\"display:none\">Copied!</span>\n </button>`\n\n html += \"</div>\"\n\n return html\n}\n\nfunction extractCodeFromHtml(html: string): string {\n return html\n .replace(/<[^>]+>/g, \"\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/&/g, \"&\")\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n}\n\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\n}\n","import { visit } from \"unist-util-visit\"\nimport type { Root, Element } from \"hast\"\n\nexport interface RehypeLinkOptions {\n basePath: string\n}\n\n/**\n * Rehype plugin that rewrites internal links to include the basePath.\n * This is needed for static sites deployed to subpaths (e.g., GitHub Pages).\n */\nexport function rehypeLinks(options: RehypeLinkOptions) {\n const { basePath } = options\n\n // Normalize basePath: ensure it starts with / and doesn't end with /\n const normalizedBase = basePath === \"/\" ? \"\" : basePath.replace(/\\/$/, \"\")\n\n return (tree: Root) => {\n if (!normalizedBase) {\n // No basePath to add\n return\n }\n\n visit(tree, \"element\", (node: Element) => {\n if (node.tagName === \"a\") {\n const href = node.properties?.href\n\n if (typeof href === \"string\") {\n // Only rewrite internal links that start with /\n // Don't rewrite: external URLs, anchors, relative paths, or already prefixed paths\n if (href.startsWith(\"/\") && !href.startsWith(\"//\") && !href.startsWith(normalizedBase)) {\n node.properties = node.properties || {}\n node.properties.href = normalizedBase + href\n }\n }\n }\n })\n }\n}\n","import type { Plugin } from \"vite\"\nimport type { ResolvedConfig } from \"../config/types\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\n\nexport interface PressRoutesPluginOptions {\n /** Directory where routes should be generated */\n routesDir?: string\n /** Source directory for content (default: 'content') */\n srcDir?: string\n /**\n * Layout mode for generated routes.\n * - 'docPage': Routes use DocPage which includes Layout (backward compatible)\n * - 'layoutRoute': Routes use DocContent without Layout (for use with _layout.tsx)\n * Default: 'layoutRoute'\n */\n layoutMode?: \"docPage\" | \"layoutRoute\"\n}\n\ninterface RouteInfo {\n /** Path relative to content dir without extension (e.g., 'guide/getting-started') */\n slug: string\n /** Full path to the markdown file */\n mdPath: string\n /** Path relative to content dir with extension (e.g., 'guide/getting-started.md') */\n relativePath: string\n}\n\n/**\n * Vite plugin that generates individual route files for each markdown file\n * in the content directory. Routes include SEO head() configuration\n * using frontmatter data.\n */\nexport function pressRoutesPlugin(\n getConfig: () => ResolvedConfig,\n options: PressRoutesPluginOptions = {}\n): Plugin {\n const { layoutMode = \"layoutRoute\" } = options\n\n let routesDir: string\n let contentDir: string\n let isDevMode = false\n let hasCleanedRoutes = false\n\n function scanContentDirSync(dir: string, rootDir: string): RouteInfo[] {\n const routes: RouteInfo[] = []\n\n try {\n const entries = fsSync.readdirSync(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n const children = scanContentDirSync(fullPath, rootDir)\n routes.push(...children)\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const relativePath = path.relative(rootDir, fullPath)\n const slug = relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n } else if (entry.name === \"index.md\") {\n const parentDir = path.dirname(fullPath)\n const relativePath = path.relative(rootDir, fullPath)\n\n // Skip root index.md (handled by manual index.tsx)\n if (parentDir !== rootDir) {\n const slug = path.relative(rootDir, parentDir).replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n }\n }\n }\n } catch {\n // Content dir may not exist\n }\n\n return routes\n }\n\n function generateRouteCode(route: RouteInfo): string {\n const { slug, relativePath } = route\n\n // Calculate relative path from route file to content file\n // Route at routes/${slug}.tsx needs to reach content/${relativePath}\n const depthToProjectRoot = slug.split(\"/\").length + 1\n const toProjectRoot = \"../\".repeat(depthToProjectRoot)\n const contentImportPath = `${toProjectRoot}content/${relativePath}`\n\n // Generate component name from slug\n const componentName =\n slug\n .split(\"/\")\n .map((part) => part.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase()))\n .join(\"\")\n .replace(/\\s/g, \"\") + \"Page\"\n\n // Generate route path for TanStack Router (no route group, direct path)\n const routePath = `/${slug}`\n\n // Generate default title from slug\n const defaultTitle = slug\n .split(\"/\")\n .pop()!\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n\n // Choose component based on layout mode\n const contentComponent = layoutMode === \"docPage\" ? \"DocPage\" : \"DocContent\"\n\n return `// This file is auto-generated by ardo. Do not edit manually.\nimport { createFileRoute } from '@tanstack/react-router'\nimport { ${contentComponent} } from 'ardo/theme'\nimport { PressProvider } from 'ardo/runtime'\nimport config from 'virtual:ardo/config'\nimport sidebar from 'virtual:ardo/sidebar'\nimport Content, { frontmatter, toc } from '${contentImportPath}'\n\nexport const Route = createFileRoute('${routePath}')({\n head: () => ({\n meta: [\n { title: (frontmatter.title as string) ? \\`\\${frontmatter.title} | \\${config.title}\\` : config.title },\n ...(frontmatter.description ? [{ name: 'description', content: frontmatter.description as string }] : []),\n // OpenGraph\n { property: 'og:title', content: (frontmatter.title as string) || '${defaultTitle}' },\n ...(frontmatter.description ? [{ property: 'og:description', content: frontmatter.description as string }] : []),\n { property: 'og:type', content: 'article' },\n // Twitter\n { name: 'twitter:card', content: 'summary' },\n { name: 'twitter:title', content: (frontmatter.title as string) || '${defaultTitle}' },\n ...(frontmatter.description ? [{ name: 'twitter:description', content: frontmatter.description as string }] : []),\n ],\n }),\n component: ${componentName},\n})\n\nfunction ${componentName}() {\n const pageData = {\n title: (frontmatter.title as string) || '${defaultTitle}',\n description: frontmatter.description as string | undefined,\n frontmatter,\n content: '',\n toc,\n filePath: '${relativePath}',\n relativePath: '${relativePath}',\n }\n\n return (\n <PressProvider config={config} sidebar={sidebar} currentPage={pageData}>\n <${contentComponent}>\n <Content />\n </${contentComponent}>\n </PressProvider>\n )\n}\n`\n }\n\n function writeRouteFileSync(route: RouteInfo): boolean {\n const routeFilePath = path.join(routesDir, `${route.slug}.tsx`)\n const code = generateRouteCode(route)\n\n // Only write if content changed\n try {\n const existingContent = fsSync.readFileSync(routeFilePath, \"utf-8\")\n if (existingContent === code) {\n return false\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n fsSync.mkdirSync(path.dirname(routeFilePath), { recursive: true })\n fsSync.writeFileSync(routeFilePath, code, \"utf-8\")\n return true\n }\n\n function generateAllRoutesSync(): void {\n const routes = scanContentDirSync(contentDir, contentDir)\n\n let writtenCount = 0\n for (const route of routes) {\n if (writeRouteFileSync(route)) {\n writtenCount++\n }\n }\n\n if (writtenCount > 0) {\n console.log(`[ardo] Generated ${writtenCount} content route files`)\n }\n }\n\n async function ensureDirectoryExists(dir: string): Promise<void> {\n try {\n await fs.mkdir(dir, { recursive: true })\n } catch {\n // Directory may already exist\n }\n }\n\n async function writeRouteFile(route: RouteInfo): Promise<boolean> {\n const routeFilePath = path.join(routesDir, `${route.slug}.tsx`)\n const routeFileDir = path.dirname(routeFilePath)\n\n await ensureDirectoryExists(routeFileDir)\n\n const code = generateRouteCode(route)\n\n // Only write if content changed to avoid triggering unnecessary rebuilds\n try {\n const existingContent = await fs.readFile(routeFilePath, \"utf-8\")\n if (existingContent === code) {\n return false // No change\n }\n } catch {\n // File doesn't exist, will be created\n }\n\n await fs.writeFile(routeFilePath, code, \"utf-8\")\n return true // File was written\n }\n\n async function cleanGeneratedRoutes(): Promise<void> {\n const pressRoutesDir = routesDir\n\n try {\n const entries = await fs.readdir(pressRoutesDir, { withFileTypes: true, recursive: true })\n\n for (const entry of entries) {\n if (entry.isFile() && entry.name.endsWith(\".tsx\") && entry.name !== \"_layout.tsx\") {\n const fullPath = path.join(entry.parentPath ?? pressRoutesDir, entry.name)\n\n // Read the file to check if it's auto-generated\n try {\n const content = await fs.readFile(fullPath, \"utf-8\")\n if (content.startsWith(\"// This file is auto-generated by ardo\")) {\n await fs.unlink(fullPath)\n }\n } catch {\n // File might have been deleted already\n }\n }\n }\n } catch {\n // Directory doesn't exist yet, nothing to clean\n }\n }\n\n async function scanContentDir(dir: string, rootDir: string): Promise<RouteInfo[]> {\n const routes: RouteInfo[] = []\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n const children = await scanContentDir(fullPath, rootDir)\n routes.push(...children)\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const relativePath = path.relative(rootDir, fullPath)\n const slug = relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n } else if (entry.name === \"index.md\") {\n const parentDir = path.dirname(fullPath)\n const relativePath = path.relative(rootDir, fullPath)\n\n // Skip root index.md (handled by manual index.tsx)\n if (parentDir !== rootDir) {\n const slug = path.relative(rootDir, parentDir).replace(/\\\\/g, \"/\")\n\n routes.push({\n slug,\n mdPath: fullPath,\n relativePath: relativePath.replace(/\\\\/g, \"/\"),\n })\n }\n }\n }\n\n return routes\n }\n\n async function generateAllRoutes(): Promise<void> {\n // Clean old generated routes first (only in dev mode, and only once)\n if (isDevMode && !hasCleanedRoutes) {\n await cleanGeneratedRoutes()\n hasCleanedRoutes = true\n }\n\n const routes = await scanContentDir(contentDir, contentDir)\n\n let writtenCount = 0\n for (const route of routes) {\n if (await writeRouteFile(route)) {\n writtenCount++\n }\n }\n\n if (writtenCount > 0) {\n console.log(`[ardo] Generated ${writtenCount} content route files`)\n }\n }\n\n return {\n name: \"ardo:routes\",\n enforce: \"pre\",\n\n config(userConfig, env) {\n // Generate routes early, before TanStack Router scans the files\n const root = userConfig.root || process.cwd()\n const srcDir = path.join(root, \"src\")\n routesDir = options.routesDir || path.join(srcDir, \"routes\")\n isDevMode = env.command === \"serve\"\n\n // Use srcDir from options to resolve contentDir early\n contentDir = path.resolve(root, options.srcDir || \"content\")\n\n // Generate content routes SYNCHRONOUSLY\n // TanStack Router scans routes during config phase, so routes must exist by then\n try {\n generateAllRoutesSync()\n } catch (err) {\n console.warn(\"[ardo] Could not generate routes in config phase:\", err)\n }\n },\n\n configResolved(viteConfig) {\n // Update paths if they weren't set in config hook\n if (!routesDir) {\n routesDir = options.routesDir || path.join(viteConfig.root, \"src\", \"routes\")\n isDevMode = viteConfig.command === \"serve\"\n }\n },\n\n async buildStart() {\n // Re-generate content routes in buildStart for full async support\n const config = getConfig()\n contentDir = config.contentDir\n await generateAllRoutes()\n },\n\n configureServer(server) {\n // Watch for changes in content directory\n server.watcher.add(contentDir)\n\n server.watcher.on(\"change\", async (changedPath) => {\n if (changedPath.startsWith(contentDir) && changedPath.endsWith(\".md\")) {\n await generateAllRoutes()\n }\n })\n\n server.watcher.on(\"add\", async (addedPath) => {\n if (addedPath.startsWith(contentDir) && addedPath.endsWith(\".md\")) {\n await generateAllRoutes()\n }\n })\n\n server.watcher.on(\"unlink\", async (removedPath) => {\n if (removedPath.startsWith(contentDir) && removedPath.endsWith(\".md\")) {\n // Re-generate routes (will clean up orphaned route files)\n hasCleanedRoutes = false // Allow cleaning again\n await generateAllRoutes()\n }\n })\n },\n }\n}\n","import type { Plugin, UserConfig } from \"vite\"\nimport type { PressConfig, ResolvedConfig } from \"../config/types\"\nimport type { TypeDocConfig } from \"../typedoc/types\"\nimport { resolveConfig } from \"../config/index\"\nimport { transformMarkdown } from \"../markdown/pipeline\"\nimport { createShikiHighlighter, type ShikiHighlighter } from \"../markdown/shiki\"\nimport { pressRoutesPlugin, type PressRoutesPluginOptions } from \"./routes-plugin\"\nimport { generateApiDocs } from \"../typedoc/generator\"\nimport { tanstackStart } from \"@tanstack/react-start/plugin/vite\"\nimport react from \"@vitejs/plugin-react\"\nimport fs from \"fs/promises\"\nimport fsSync from \"fs\"\nimport path from \"path\"\nimport { execSync } from \"child_process\"\n\n/**\n * Finds the package root by looking for package.json in parent directories.\n * Returns the path relative to cwd, or undefined if not found.\n */\nfunction findPackageRoot(cwd: string): string | undefined {\n let dir = path.resolve(cwd)\n const root = path.parse(dir).root\n\n while (dir !== root) {\n const parentDir = path.dirname(dir)\n const packageJsonPath = path.join(parentDir, \"package.json\")\n\n if (fsSync.existsSync(packageJsonPath)) {\n // Return relative path from cwd to parent\n return path.relative(cwd, parentDir) || \".\"\n }\n\n dir = parentDir\n }\n\n return undefined\n}\n\n/**\n * Detects the GitHub repository name from git remote URL.\n * Returns the repo name (e.g., 'ardo' from 'github.com/sebastian-software/ardo')\n * or undefined if not a GitHub repo.\n */\nfunction detectGitHubRepoName(cwd: string): string | undefined {\n try {\n const remoteUrl = execSync(\"git remote get-url origin\", {\n cwd,\n encoding: \"utf-8\",\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }).trim()\n\n // Parse GitHub URL (supports both HTTPS and SSH)\n // https://github.com/user/repo.git\n // git@github.com:user/repo.git\n const match = remoteUrl.match(/github\\.com[/:][\\w-]+\\/([\\w.-]+?)(?:\\.git)?$/)\n return match?.[1]\n } catch {\n return undefined\n }\n}\n\nconst VIRTUAL_MODULE_ID = \"virtual:ardo/config\"\nconst RESOLVED_VIRTUAL_MODULE_ID = \"\\0\" + VIRTUAL_MODULE_ID\n\nconst VIRTUAL_SIDEBAR_ID = \"virtual:ardo/sidebar\"\nconst RESOLVED_VIRTUAL_SIDEBAR_ID = \"\\0\" + VIRTUAL_SIDEBAR_ID\n\nexport interface ArdoPluginOptions extends Partial<PressConfig> {\n /** Options for the routes generator plugin */\n routes?: PressRoutesPluginOptions | false\n /** Options for TanStack Start prerendering */\n prerender?: {\n enabled?: boolean\n crawlLinks?: boolean\n }\n /**\n * Auto-detect GitHub repository and set base path for GitHub Pages.\n * When true, automatically sets `base: '/repo-name/'` if deploying to GitHub Pages.\n * @default true\n */\n githubPages?: boolean\n}\n\n// Use globalThis to cache the Shiki highlighter as a true singleton across all plugin instances\nconst SHIKI_CACHE_KEY = \"__ardo_shiki_highlighter__\"\nlet shikiHighlighterPromise: Promise<ShikiHighlighter> | null = null\n\nfunction getShikiHighlighter(config: ResolvedConfig): Promise<ShikiHighlighter> {\n // Check if already cached on globalThis\n if ((globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY]) {\n return Promise.resolve(\n (globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY] as ShikiHighlighter\n )\n }\n // Use promise caching to prevent multiple concurrent creations\n if (!shikiHighlighterPromise) {\n shikiHighlighterPromise = createShikiHighlighter(config.markdown).then((highlighter) => {\n ;(globalThis as Record<string, unknown>)[SHIKI_CACHE_KEY] = highlighter\n return highlighter\n })\n }\n return shikiHighlighterPromise\n}\n\nexport function ardoPlugin(options: ArdoPluginOptions = {}): Plugin[] {\n let resolvedConfig: ResolvedConfig\n\n // Extract ardo-specific options from the rest (which is PressConfig)\n const { routes, prerender, typedoc, githubPages = true, ...pressConfig } = options\n\n const mainPlugin: Plugin = {\n name: \"ardo\",\n enforce: \"pre\",\n\n config(userConfig, env): UserConfig {\n const result: UserConfig = {\n optimizeDeps: {\n exclude: [\"ardo/theme/styles.css\"],\n },\n ssr: {\n noExternal: [\"ardo\"],\n },\n }\n\n // Auto-detect GitHub Pages base path for production builds\n if (githubPages && env.command === \"build\" && !userConfig.base) {\n const repoName = detectGitHubRepoName(userConfig.root || process.cwd())\n if (repoName) {\n result.base = `/${repoName}/`\n console.log(`[ardo] GitHub Pages detected, using base: ${result.base}`)\n }\n }\n\n return result\n },\n\n async configResolved(config) {\n const root = config.root\n const defaultConfig: PressConfig = {\n title: pressConfig.title ?? \"Ardo\",\n description: pressConfig.description ?? \"Documentation powered by Ardo\",\n }\n resolvedConfig = resolveConfig({ ...defaultConfig, ...pressConfig }, root)\n },\n\n resolveId(id) {\n if (id === VIRTUAL_MODULE_ID) {\n return RESOLVED_VIRTUAL_MODULE_ID\n }\n if (id === VIRTUAL_SIDEBAR_ID) {\n return RESOLVED_VIRTUAL_SIDEBAR_ID\n }\n },\n\n async load(id) {\n if (id === RESOLVED_VIRTUAL_MODULE_ID) {\n const clientConfig = {\n title: resolvedConfig.title,\n description: resolvedConfig.description,\n base: resolvedConfig.base,\n lang: resolvedConfig.lang,\n themeConfig: resolvedConfig.themeConfig,\n }\n return `export default ${JSON.stringify(clientConfig)}`\n }\n\n if (id === RESOLVED_VIRTUAL_SIDEBAR_ID) {\n const sidebar = await generateSidebar(resolvedConfig)\n return `export default ${JSON.stringify(sidebar)}`\n }\n },\n }\n\n const markdownPlugin: Plugin = {\n name: \"ardo:markdown\",\n enforce: \"pre\",\n\n async transform(code, id) {\n if (!id.endsWith(\".md\")) {\n return\n }\n\n const highlighter = await getShikiHighlighter(resolvedConfig)\n\n const result = await transformMarkdown(code, resolvedConfig.markdown, {\n basePath: resolvedConfig.base,\n highlighter,\n })\n\n const componentCode = `\nimport { createElement } from 'react'\n\nexport const frontmatter = ${JSON.stringify(result.frontmatter)}\nexport const toc = ${JSON.stringify(result.toc)}\n\nexport default function MarkdownContent() {\n return createElement('div', {\n className: 'press-content',\n dangerouslySetInnerHTML: { __html: ${JSON.stringify(result.html)} }\n })\n}\n`\n\n return {\n code: componentCode,\n map: null,\n }\n },\n }\n\n const plugins: Plugin[] = [mainPlugin, markdownPlugin]\n\n // Add routes plugin unless explicitly disabled\n // Note: Routes plugin must come AFTER typedoc in the array so that\n // typedoc runs first in buildStart and generates markdown files\n if (routes !== false) {\n plugins.unshift(\n pressRoutesPlugin(() => resolvedConfig, {\n srcDir: pressConfig.srcDir,\n ...routes,\n })\n )\n }\n\n // Add TypeDoc plugin if enabled\n // Note: unshift adds to front, so typedoc will be before routes in the array\n // This ensures typedoc buildStart runs before routes buildStart\n if (typedoc) {\n // Find package root to use as default entry point and tsconfig base\n const packageRoot = findPackageRoot(process.cwd())\n const defaultEntryPoint = packageRoot ? `${packageRoot}/src/index.ts` : \"./src/index.ts\"\n const defaultTsconfig = packageRoot ? `${packageRoot}/tsconfig.json` : \"./tsconfig.json\"\n\n const defaultTypedocConfig: TypeDocConfig = {\n enabled: true,\n entryPoints: [defaultEntryPoint],\n tsconfig: defaultTsconfig,\n out: \"api-reference\",\n excludePrivate: true,\n excludeInternal: true,\n }\n\n const typedocConfig: TypeDocConfig =\n typedoc === true ? defaultTypedocConfig : { ...defaultTypedocConfig, ...typedoc }\n\n let hasGenerated = false\n\n const typedocPlugin: Plugin = {\n name: \"ardo:typedoc\",\n\n async buildStart() {\n if (!hasGenerated && typedocConfig.enabled) {\n console.log(\"[ardo] Generating API documentation with TypeDoc...\")\n const startTime = Date.now()\n try {\n const contentDir = pressConfig.srcDir ?? \"./content\"\n const docs = await generateApiDocs(typedocConfig, contentDir)\n const duration = Date.now() - startTime\n console.log(`[ardo] Generated ${docs.length} API documentation pages in ${duration}ms`)\n hasGenerated = true\n } catch (error) {\n // Don't crash the dev server if TypeDoc fails - just warn and continue\n // This allows users to run the dev server even if their TypeDoc config is incorrect\n console.warn(\n \"[ardo] TypeDoc generation failed. API documentation will not be available.\"\n )\n console.warn(\"[ardo] Check your typedoc.entryPoints configuration.\")\n if (error instanceof Error) {\n console.warn(`[ardo] Error: ${error.message}`)\n }\n hasGenerated = true // Prevent retry\n }\n }\n },\n }\n\n plugins.unshift(typedocPlugin)\n }\n\n // Add TanStack Start plugin\n const tanstackPlugin = tanstackStart({\n prerender: {\n enabled: prerender?.enabled ?? true,\n crawlLinks: prerender?.crawlLinks ?? false,\n },\n })\n const tanstackPlugins = (\n Array.isArray(tanstackPlugin) ? tanstackPlugin : [tanstackPlugin]\n ).filter((p): p is Plugin => p != null)\n plugins.push(...tanstackPlugins)\n\n // Add React plugin\n const reactPlugin = react()\n const reactPlugins = (Array.isArray(reactPlugin) ? reactPlugin : [reactPlugin]).filter(\n (p): p is Plugin => p != null\n )\n plugins.push(...reactPlugins)\n\n return plugins\n}\n\nasync function generateSidebar(config: ResolvedConfig) {\n const { contentDir, themeConfig } = config\n\n if (themeConfig.sidebar && !Array.isArray(themeConfig.sidebar)) {\n return themeConfig.sidebar\n }\n\n if (themeConfig.sidebar && Array.isArray(themeConfig.sidebar) && themeConfig.sidebar.length > 0) {\n return themeConfig.sidebar\n }\n\n try {\n const sidebar = await scanDirectory(contentDir, contentDir, config.base)\n return sidebar\n } catch {\n return []\n }\n}\n\nasync function scanDirectory(\n dir: string,\n rootDir: string,\n _basePath: string\n): Promise<Array<{ text: string; link?: string; items?: unknown[] }>> {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n const items: Array<{ text: string; link?: string; items?: unknown[]; order?: number }> = []\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n const relativePath = path.relative(rootDir, fullPath)\n\n if (entry.isDirectory()) {\n const children = await scanDirectory(fullPath, rootDir, _basePath)\n if (children.length > 0) {\n const indexPath = path.join(fullPath, \"index.md\")\n let link: string | undefined\n\n try {\n await fs.access(indexPath)\n // Don't include basePath - TanStack Router handles it automatically\n link = \"/\" + relativePath.replace(/\\\\/g, \"/\")\n } catch {\n // No index.md\n }\n\n items.push({\n text: formatTitle(entry.name),\n link,\n items: children,\n })\n }\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const frontmatterMatch = fileContent.match(/^---\\n([\\s\\S]*?)\\n---/)\n\n let title = formatTitle(entry.name.replace(/\\.md$/, \"\"))\n let order: number | undefined\n\n if (frontmatterMatch) {\n const frontmatterText = frontmatterMatch[1]\n const titleMatch = frontmatterText.match(/title:\\s*[\"']?([^\"'\\n]+)[\"']?/)\n const orderMatch = frontmatterText.match(/order:\\s*(\\d+)/)\n\n if (titleMatch) {\n title = titleMatch[1].trim()\n }\n if (orderMatch) {\n order = parseInt(orderMatch[1], 10)\n }\n }\n\n // Don't include basePath - TanStack Router handles it automatically\n const link = \"/\" + relativePath.replace(/\\.md$/, \"\").replace(/\\\\/g, \"/\")\n\n items.push({\n text: title,\n link,\n order,\n })\n }\n }\n\n items.sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) {\n return a.order - b.order\n }\n if (a.order !== undefined) return -1\n if (b.order !== undefined) return 1\n return a.text.localeCompare(b.text)\n })\n\n return items.map(({ order: _order, ...item }) => item)\n}\n\nfunction formatTitle(name: string): string {\n return name.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport default ardoPlugin\n","import fs from \"fs/promises\"\nimport path from \"path\"\nimport type { PageData, PageFrontmatter, TOCItem, ResolvedConfig } from \"../config/types\"\nimport { transformMarkdown } from \"../markdown/pipeline\"\n\nexport interface LoadDocOptions {\n slug: string\n contentDir: string\n config: ResolvedConfig\n}\n\nexport interface LoadDocResult {\n content: string\n frontmatter: PageFrontmatter\n toc: TOCItem[]\n filePath: string\n relativePath: string\n lastUpdated?: number\n}\n\nexport async function loadDoc(options: LoadDocOptions): Promise<LoadDocResult | null> {\n const { slug, contentDir, config } = options\n\n const possiblePaths = [\n path.join(contentDir, `${slug}.md`),\n path.join(contentDir, slug, \"index.md\"),\n ]\n\n let filePath: string | null = null\n let fileContent: string | null = null\n\n for (const tryPath of possiblePaths) {\n try {\n fileContent = await fs.readFile(tryPath, \"utf-8\")\n filePath = tryPath\n break\n } catch {\n continue\n }\n }\n\n if (!filePath || !fileContent) {\n return null\n }\n\n const result = await transformMarkdown(fileContent, config.markdown)\n const relativePath = path.relative(contentDir, filePath)\n\n let lastUpdated: number | undefined\n try {\n const stat = await fs.stat(filePath)\n lastUpdated = stat.mtimeMs\n } catch {\n // Ignore stat errors\n }\n\n return {\n content: result.html,\n frontmatter: result.frontmatter,\n toc: result.toc,\n filePath,\n relativePath,\n lastUpdated,\n }\n}\n\nexport async function loadAllDocs(contentDir: string, config: ResolvedConfig): Promise<PageData[]> {\n const docs: PageData[] = []\n\n async function scanDir(dir: string) {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n\n if (entry.isDirectory()) {\n await scanDir(fullPath)\n } else if (entry.name.endsWith(\".md\")) {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const result = await transformMarkdown(fileContent, config.markdown)\n const relativePath = path.relative(contentDir, fullPath)\n\n let lastUpdated: number | undefined\n try {\n const stat = await fs.stat(fullPath)\n lastUpdated = stat.mtimeMs\n } catch {\n // Ignore stat errors\n }\n\n docs.push({\n title: result.frontmatter.title || formatTitle(entry.name.replace(/\\.md$/, \"\")),\n description: result.frontmatter.description,\n frontmatter: result.frontmatter,\n content: result.html,\n toc: result.toc,\n filePath: fullPath,\n relativePath,\n lastUpdated,\n })\n }\n }\n }\n\n await scanDir(contentDir)\n return docs\n}\n\nfunction formatTitle(name: string): string {\n return name.replace(/[-_]/g, \" \").replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nexport function getSlugFromPath(relativePath: string): string {\n return relativePath\n .replace(/\\.md$/, \"\")\n .replace(/\\/index$/, \"\")\n .replace(/\\\\/g, \"/\")\n}\n\nexport function getPageDataForRoute(docs: PageData[], slug: string): PageData | undefined {\n return docs.find((doc) => {\n const docSlug = getSlugFromPath(doc.relativePath)\n return docSlug === slug || docSlug === `${slug}/index`\n })\n}\n","import fs from \"fs/promises\"\nimport type { Dirent } from \"fs\"\nimport path from \"path\"\nimport matter from \"gray-matter\"\nimport type { SidebarItem, ResolvedConfig } from \"../config/types\"\n\nexport interface SidebarGenerationOptions {\n contentDir: string\n basePath: string\n config: ResolvedConfig\n}\n\nexport async function generateSidebar(options: SidebarGenerationOptions): Promise<SidebarItem[]> {\n const { contentDir, basePath, config } = options\n\n const configSidebar = config.themeConfig.sidebar\n\n if (configSidebar) {\n if (Array.isArray(configSidebar) && configSidebar.length > 0) {\n return configSidebar\n }\n if (!Array.isArray(configSidebar)) {\n return []\n }\n }\n\n return await scanDirectoryForSidebar(contentDir, contentDir, basePath)\n}\n\nasync function scanDirectoryForSidebar(\n dir: string,\n rootDir: string,\n _basePath: string\n): Promise<SidebarItem[]> {\n let entries: Dirent[]\n\n try {\n entries = (await fs.readdir(dir, { withFileTypes: true })) as Dirent[]\n } catch {\n return []\n }\n\n interface SidebarItemWithOrder extends SidebarItem {\n order?: number\n }\n\n const items: SidebarItemWithOrder[] = []\n\n for (const entry of entries) {\n const fullPath = path.join(dir, entry.name)\n const relativePath = path.relative(rootDir, fullPath)\n\n if (entry.name.startsWith(\".\") || entry.name.startsWith(\"_\")) {\n continue\n }\n\n if (entry.isDirectory()) {\n const children = await scanDirectoryForSidebar(fullPath, rootDir, _basePath)\n\n if (children.length > 0) {\n const indexPath = path.join(fullPath, \"index.md\")\n let link: string | undefined\n let title = formatTitle(entry.name)\n let order: number | undefined\n\n try {\n const indexContent = await fs.readFile(indexPath, \"utf-8\")\n const { data: frontmatter } = matter(indexContent)\n\n if (frontmatter.title) {\n title = frontmatter.title\n }\n if (typeof frontmatter.order === \"number\") {\n order = frontmatter.order\n }\n\n // Don't include basePath - TanStack Router handles it automatically\n link = normalizePath(relativePath)\n } catch {\n // No index.md file\n }\n\n items.push({\n text: title,\n link,\n collapsed: false,\n items: children,\n order,\n })\n }\n } else if (entry.name.endsWith(\".md\") && entry.name !== \"index.md\") {\n const fileContent = await fs.readFile(fullPath, \"utf-8\")\n const { data: frontmatter } = matter(fileContent)\n\n if (frontmatter.sidebar === false) {\n continue\n }\n\n const title = frontmatter.title || formatTitle(entry.name.replace(/\\.md$/, \"\"))\n const order = typeof frontmatter.order === \"number\" ? frontmatter.order : undefined\n\n // Don't include basePath - TanStack Router handles it automatically\n const link = normalizePath(relativePath.replace(/\\.md$/, \"\"))\n\n items.push({\n text: title,\n link,\n order,\n })\n }\n }\n\n items.sort((a, b) => {\n if (a.order !== undefined && b.order !== undefined) {\n return a.order - b.order\n }\n if (a.order !== undefined) return -1\n if (b.order !== undefined) return 1\n return a.text.localeCompare(b.text)\n })\n\n return items.map(({ order: _order, ...item }) => item)\n}\n\nfunction formatTitle(name: string): string {\n return name\n .replace(/^\\d+-/, \"\")\n .replace(/[-_]/g, \" \")\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n}\n\nfunction normalizePath(p: string): string {\n return \"/\" + p.replace(/\\\\/g, \"/\").replace(/^\\/+/, \"\")\n}\n"],"mappings":"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","names":["visit","visit","escapeHtml","visit","fs","fsSync","path","fs","path","path","fs","formatTitle","fs","path","matter","generateSidebar","formatTitle"]}
|
package/dist/index.js
CHANGED
package/dist/vite/index.js
CHANGED