@clarify-labs/cli 0.9.3 → 0.9.4

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-Z3fYTMcb.js","names":[],"sources":["../package.json","../source/cli/package.ts","../source/core/utils.ts","../source/parsers/mdx.ts","../source/plugins/content-artifacts/artifacts.ts","../source/plugins/content-artifacts/server.ts","../source/plugins/content-artifacts/index.ts","../source/plugins/html-shell/index.ts","../source/parsers/frontmatter.ts","../source/parsers/content.ts","../source/core/hooks.ts","../source/core/content.ts","../source/parsers/routes.ts","../source/plugins/openapi/parser.ts","../source/core/virtual-modules.ts","../source/plugins/openapi/virtual-modules.ts","../source/plugins/openapi/index.ts","../source/core/search-language.ts","../source/core/temp-dir.ts","../source/plugins/search-index/index.ts","../source/plugins/seo/artifacts.ts","../source/plugins/seo/index.ts","../source/plugins/source-links/source-links.ts","../source/plugins/source-links/index.ts","../source/parsers/variables.ts","../source/plugins/variables/index.ts","../source/core/builtin.ts","../source/core/config-schema.ts","../source/core/theme.ts","../source/core/config.ts","../source/core/dev-routes.ts","../source/core/env-types.ts","../source/core/options.ts","../source/core/user-config.ts","../source/core/project-context.ts","../source/core/project-info.ts","../source/core/site.ts","../source/core/runtime-deps.ts","../source/core/ssg.ts","../source/core/startup.ts","../source/core/plugin.ts"],"sourcesContent":["{\n \"name\": \"@clarify-labs/cli\",\n \"version\": \"0.9.4\",\n \"license\": \"AGPL-3.0-only\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/taicode-labs/clarify\",\n \"directory\": \"packages/cli\"\n },\n \"main\": \"output/index.cjs\",\n \"module\": \"output/index.js\",\n \"types\": \"output/index.d.ts\",\n \"bin\": {\n \"clarify\": \"bin/clarify.js\"\n },\n \"exports\": {\n \".\": {\n \"types\": \"./output/index.d.ts\",\n \"import\": \"./output/index.js\",\n \"require\": \"./output/index.cjs\",\n \"default\": \"./output/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"files\": [\n \"LICENSE\",\n \"bin\",\n \"output\"\n ],\n \"scripts\": {\n \"dev\": \"vite build --watch\",\n \"build\": \"vite build\",\n \"lint\": \"eslint source/\",\n \"lint:fix\": \"eslint source/ --fix\",\n \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"dependencies\": {\n \"@apidevtools/swagger-parser\": \"^12.1.0\",\n \"@clarify-labs/renderer\": \"workspace:*\",\n \"@clarify-labs/templates\": \"workspace:*\",\n \"@mdx-js/mdx\": \"^3.1.1\",\n \"@mdx-js/rollup\": \"^3.1.1\",\n \"@tailwindcss/vite\": \"^4.1.11\",\n \"@vitejs/plugin-react\": \"^6.0.2\",\n \"cac\": \"^7.0.0\",\n \"github-slugger\": \"^2.0.0\",\n \"gray-matter\": \"^4.0.3\",\n \"mdast-util-to-string\": \"^4.0.0\",\n \"mermaid\": \"^11.4.0\",\n \"openapi-types\": \"^12.1.3\",\n \"pagefind\": \"^1.5.2\",\n \"react\": \"^19.1.0\",\n \"react-dom\": \"^19.1.0\",\n \"react-router\": \"^7.0.0\",\n \"react-router-dom\": \"^7.0.0\",\n \"react-zoom-pan-pinch\": \"^4.0.3\",\n \"remark\": \"^15.0.1\",\n \"remark-gfm\": \"^4.0.1\",\n \"shiki\": \"0.14.7\",\n \"unist-util-visit\": \"^5.1.0\",\n \"vite\": \"^8.0.15\",\n \"yaml\": \"^2.9.0\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@types/react\": \"^19.1.8\",\n \"typescript\": \"^5.8.3\",\n \"vite-plugin-dts\": \"^4.5.4\",\n \"vitest\": \"^4.1.9\"\n }\n}\n","import packageJson from '../../package.json' with { type: 'json' }\n\nexport const cliPackageJson = packageJson as { version?: string }\nexport const cliPackageVersion = cliPackageJson.version ?? '0.0.0'\nexport const cliPackageVersionWithCaret = `^${cliPackageVersion}`\n\nexport function readPackageVersion(): string {\n return cliPackageVersion\n}\n","export function escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&#39;')\n}\n","import { compile, type CompileOptions } from '@mdx-js/mdx'\nimport GithubSlugger from 'github-slugger'\nimport { toString } from 'mdast-util-to-string'\nimport shiki, { type Highlighter } from 'shiki'\nimport { visit } from 'unist-util-visit'\n\nimport { markdownRemarkPlugins } from '@clarify-labs/renderer'\n\nimport { escapeHtml } from '../core/utils.js'\nimport type { ContentDiagnostic } from '../types.js'\n\ntype HastNode = {\n type: string\n tagName?: string\n value?: string\n properties?: Record<string, unknown>\n children?: HastNode[]\n}\n\ntype HastParent = HastNode & {\n children: HastNode[]\n}\n\ntype ShikiRenderElementArgs = {\n children: string\n}\n\nfunction getLanguage(className: unknown): string {\n const classes = Array.isArray(className) ? className : typeof className === 'string' ? className.split(/\\s+/) : []\n const languageClass = classes.find((item): item is string => typeof item === 'string' && item.startsWith('language-'))\n return languageClass?.replace(/^language-/, '') || 'txt'\n}\n\nfunction getTextContent(node: HastNode | undefined): string {\n if (!node) return ''\n if (typeof node.value === 'string') return node.value\n return node.children?.map(getTextContent).join('') ?? ''\n}\n\nfunction renderPlainCode(code: string): string {\n return code\n .split('\\n')\n .map(line => `<span>${escapeHtml(line)}</span>`)\n .join('\\n')\n}\n\nlet highlighter: Highlighter | undefined\n\nasync function getHighlighter(): Promise<Highlighter> {\n highlighter = highlighter ?? await shiki.getHighlighter({ theme: 'css-variables' })\n return highlighter\n}\n\nexport function rehypeParseCodeBlocks() {\n return (tree: HastNode) => {\n visit(tree, 'element', (node: HastNode, _nodeIndex: number | undefined, parentNode: HastParent | undefined) => {\n if (node.tagName !== 'code' || !parentNode) return\n parentNode.properties = parentNode.properties ?? {}\n node.properties = node.properties ?? {}\n const language = getLanguage(node.properties.className)\n parentNode.properties.language = language\n node.properties.language = language\n\n for (const key of ['title', 'tag', 'label']) {\n if (node.properties[key] !== undefined) parentNode.properties[key] = node.properties[key]\n }\n })\n }\n}\n\nexport function rehypeShiki() {\n return async (tree: HastNode) => {\n const shikiHighlighter = await getHighlighter()\n\n visit(tree, 'element', (node: HastNode) => {\n if (node.tagName !== 'pre') return\n const codeNode = node.children?.[0]\n if (codeNode?.tagName !== 'code') return\n\n node.properties = node.properties ?? {}\n codeNode.properties = codeNode.properties ?? {}\n\n const code = getTextContent(codeNode)\n const language = typeof node.properties.language === 'string' ? node.properties.language : getLanguage(codeNode.properties.className)\n node.properties.code = code\n codeNode.properties.code = code\n codeNode.properties.language = language\n\n let highlighted = renderPlainCode(code)\n\n if (language && language !== 'txt') {\n try {\n const tokens = shikiHighlighter.codeToThemedTokens(code, language)\n highlighted = shiki.renderToHtml(tokens, {\n elements: {\n pre: ({ children }: ShikiRenderElementArgs) => children,\n code: ({ children }: ShikiRenderElementArgs) => children,\n line: ({ children }: ShikiRenderElementArgs) => `<span>${children}</span>`,\n },\n })\n } catch {\n highlighted = renderPlainCode(code)\n }\n }\n\n codeNode.children = [{ type: 'text', value: highlighted }]\n })\n }\n}\n\nexport function rehypeSlugSections() {\n return (tree: HastNode) => {\n const slugger = new GithubSlugger()\n\n visit(tree, 'element', (node: HastNode) => {\n if (node.tagName !== 'h2' && node.tagName !== 'h3') return\n\n node.properties = node.properties ?? {}\n if (node.properties.id) return\n\n node.properties.id = slugger.slug(toString(node))\n })\n }\n}\n\nexport const remarkPlugins: unknown[] = markdownRemarkPlugins\nexport const rehypePlugins = [rehypeSlugSections, rehypeParseCodeBlocks, rehypeShiki]\n\nfunction formatMdxDiagnostic(error: unknown): string {\n if (error instanceof Error) {\n return error.message\n }\n\n return String(error)\n}\n\nexport async function compileMdxContent(content: string, filePath?: string, projectRoot?: string): Promise<{ ok: true } | { ok: false; diagnostic: ContentDiagnostic }> {\n try {\n await compile(content, {\n jsx: true,\n providerImportSource: '@clarify-labs/renderer',\n remarkPlugins: remarkPlugins as CompileOptions['remarkPlugins'],\n rehypePlugins,\n })\n return { ok: true }\n } catch (error) {\n return {\n ok: false,\n diagnostic: {\n kind: 'mdx',\n title: 'MDX syntax error',\n message: 'This page could not be compiled. Fix the MDX syntax or component usage above, then reload the route.',\n filePath: filePath && projectRoot\n ? filePath.replace(projectRoot + '/', '').replace(/^\\/+/, '')\n : filePath ? filePath.replace(/^[A-Za-z]:\\//, '').replace(/^\\/+/, '') : undefined,\n details: formatMdxDiagnostic(error),\n },\n }\n }\n}\n","import type { ContentRoute, ResolvedProjectConfig } from '../../types.js'\n\nconst UTF8_SIGNATURE = '\\uFEFF'\n\nfunction normalizeBasePath(basePath: string): string {\n if (!basePath || basePath === '/') return ''\n return '/' + basePath.replace(/^\\/+|\\/+$/g, '')\n}\n\nfunction containsNonAscii(content: string): boolean {\n return [...content].some(character => character.codePointAt(0)! > 0x7F)\n}\n\nfunction withUtf8Signature(content: string): string {\n if (!containsNonAscii(content) || content.startsWith(UTF8_SIGNATURE)) return content\n return `${UTF8_SIGNATURE}${content}`\n}\n\nfunction shouldUseUtf8Signature(route: ContentRoute): boolean {\n if (route.kind === 'mdx') return true\n return false\n}\n\nexport function routeToMarkdownArtifactUrl(routePath: string): string {\n const normalizedPath = routePath === '/' ? '/index' : routePath.replace(/\\/$/, '')\n return `${normalizedPath}.md`\n}\n\nexport function routeToOpenAPIArtifactUrl(routePath: string): string {\n const normalizedPath = routePath === '/' ? '/index' : routePath.replace(/\\/$/, '')\n return `${normalizedPath}.openapi.json`\n}\n\nexport function attachContentArtifactUrls(routes: ContentRoute[]): void {\n for (const route of routes) {\n route.contentArtifactUrl = route.kind === 'openapi'\n ? routeToOpenAPIArtifactUrl(route.path)\n : routeToMarkdownArtifactUrl(route.path)\n }\n}\n\nexport function readRouteContent(route: ContentRoute): string {\n if (route.content !== undefined) return route.content\n throw new Error(`Route content is missing from route context: ${route.filePath}`)\n}\n\nexport function readRouteArtifactContent(route: ContentRoute): string {\n const content = readRouteContent(route)\n return shouldUseUtf8Signature(route) ? withUtf8Signature(content) : content\n}\n\nfunction isLlmsTxtRoute(route: ContentRoute): boolean {\n return !route.path.split('/').includes('404')\n}\n\nfunction llmsTxtDescription(route: ContentRoute): string | undefined {\n if (route.description) return route.description\n\n const sections = route.sections?.filter(section => section.level === 2).slice(0, 3).map(section => section.title)\n if (sections?.length) return `Covers ${sections.join(', ')}.`\n\n if (route.keywords?.length) return `Related topics: ${route.keywords.join(', ')}.`\n\n if (route.kind === 'openapi') return 'OpenAPI artifact for machine-readable API reference data.'\n\n return undefined\n}\n\nfunction llmsTxtListItem(route: ContentRoute, basePath: string): string | undefined {\n if (!route.contentArtifactUrl) return undefined\n\n const description = llmsTxtDescription(route)\n return description\n ? `- [${route.title}](${basePath}${route.contentArtifactUrl}): ${description}`\n : `- [${route.title}](${basePath}${route.contentArtifactUrl})`\n}\n\nfunction llmsTxtLocaleLabel(locale: string, projectConfig: ResolvedProjectConfig): string {\n return projectConfig.i18n?.locales.find(item => item.code === locale)?.label ?? locale\n}\n\nfunction groupRoutesByLocale(routes: ContentRoute[]): Map<string, ContentRoute[]> {\n const groups = new Map<string, ContentRoute[]>()\n for (const route of routes) {\n const key = route.locale ?? 'default'\n groups.set(key, [...(groups.get(key) ?? []), route])\n }\n return groups\n}\n\nfunction groupLlmsTxtRoutesByLocale(routes: ContentRoute[], projectConfig: ResolvedProjectConfig): Map<string, ContentRoute[]> {\n const routesBySource = new Map<string, ContentRoute>()\n const defaultLocale = projectConfig.i18n?.defaultLocale\n\n for (const route of routes) {\n const sourceKey = `${route.locale ?? defaultLocale ?? 'default'}:${route.basePath ?? route.contentArtifactUrl ?? route.path}`\n const previousRoute = routesBySource.get(sourceKey)\n\n if (!previousRoute || (previousRoute.locale && !route.locale)) {\n routesBySource.set(sourceKey, route)\n }\n }\n\n return groupRoutesByLocale([...routesBySource.values()].map(route => ({\n ...route,\n locale: route.locale ?? defaultLocale,\n })))\n}\n\nfunction llmsTxtDocsSectionTitle(locale: string, groupCount: number, projectConfig: ResolvedProjectConfig): string {\n if (groupCount <= 1) return 'Docs'\n return `Docs - ${locale === 'default' ? 'Default' : llmsTxtLocaleLabel(locale, projectConfig)}`\n}\n\nexport function createLlmsTxt(routes: ContentRoute[], projectConfig: ResolvedProjectConfig): string {\n const basePath = normalizeBasePath(projectConfig.routePrefix)\n const lines = [\n `# ${projectConfig.title}`,\n '',\n ]\n\n if (projectConfig.description) {\n lines.push(`> ${projectConfig.description}`, '')\n }\n\n lines.push('This file lists the source-ready Markdown and OpenAPI artifacts for this documentation site.', '')\n\n // Exclude bare alias routes (e.g., /path without language prefix) in multilingual sites\n const mdxRoutes = routes.filter(route => route.kind === 'mdx' && isLlmsTxtRoute(route) && !route.isBareAlias)\n if (mdxRoutes.length > 0) {\n const localizedGroups = groupLlmsTxtRoutesByLocale(mdxRoutes, projectConfig)\n for (const [locale, localeRoutes] of localizedGroups) {\n lines.push(`## ${llmsTxtDocsSectionTitle(locale, localizedGroups.size, projectConfig)}`)\n\n for (const route of localeRoutes) {\n const item = llmsTxtListItem(route, basePath)\n if (item) lines.push(item)\n }\n\n lines.push('')\n }\n }\n\n // Exclude bare alias routes (e.g., /path without language prefix) in multilingual sites\n const openApiRoutes = routes.filter(route => route.kind === 'openapi' && isLlmsTxtRoute(route) && !route.isBareAlias)\n if (openApiRoutes.length > 0) {\n if (lines.at(-1) !== '') lines.push('')\n lines.push('## OpenAPI')\n for (const route of openApiRoutes) {\n const item = llmsTxtListItem(route, basePath)\n if (item) lines.push(item)\n }\n }\n\n while (lines.at(-1) === '') lines.pop()\n return `${lines.join('\\n')}\\n`\n}\n\nexport function createLlmsTxtArtifact(routes: ContentRoute[], projectConfig: ResolvedProjectConfig): string {\n return withUtf8Signature(createLlmsTxt(routes, projectConfig))\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\n\nimport { stringify as yamlStringify } from 'yaml'\n\nimport type { ContentRoute, ResolvedProjectConfig } from '../../types.js'\n\nimport { createLlmsTxtArtifact, readRouteArtifactContent } from './artifacts.js'\n\nfunction normalizeRoutePrefix(routePrefix: string): string {\n if (!routePrefix || routePrefix === '/') return ''\n return `/${routePrefix.replace(/^\\/+|\\/+$/g, '')}`\n}\n\nexport function resolveContentArtifactPath(url: string | undefined, projectConfig: ResolvedProjectConfig): string {\n const requestPath = url?.split('?')[0] ?? ''\n const basePath = normalizeRoutePrefix(projectConfig.routePrefix)\n return basePath && requestPath.startsWith(basePath)\n ? requestPath.slice(basePath.length) || '/'\n : requestPath\n}\n\nexport function resolveContentArtifactType(route: ContentRoute): string {\n return route.kind === 'openapi'\n ? 'application/json; charset=utf-8'\n : 'text/markdown; charset=utf-8'\n}\n\nexport function serveContentArtifacts(req: IncomingMessage, res: ServerResponse, projectConfig: ResolvedProjectConfig, routes: ContentRoute[]): boolean {\n const contentPath = resolveContentArtifactPath(req.url, projectConfig)\n\n if (contentPath === '/llms.txt') {\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/plain; charset=utf-8')\n res.end(createLlmsTxtArtifact(routes, projectConfig), 'utf8')\n return true\n }\n\n // Handle YAML variant for OpenAPI routes: /api.openapi.yaml → serve YAML\n if (contentPath.endsWith('.openapi.yaml')) {\n const jsonPath = contentPath.replace(/\\.yaml$/, '.json')\n const route = routes.find(r => r.contentArtifactUrl === jsonPath)\n if (route?.kind === 'openapi' && route.content) {\n const spec = JSON.parse(route.content)\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/yaml; charset=utf-8')\n res.end(yamlStringify(spec, { lineWidth: 0 }), 'utf8')\n return true\n }\n return false\n }\n\n const route = routes.find(route => route.contentArtifactUrl === contentPath)\n if (!route) return false\n\n res.statusCode = 200\n res.setHeader('Content-Type', resolveContentArtifactType(route))\n res.end(readRouteArtifactContent(route), 'utf8')\n return true\n}\n","import type { ViteDevServer } from 'vite'\nimport { stringify as yamlStringify } from 'yaml'\n\nimport type { ClarifyEmitAsset, ClarifyPlugin } from '../../types.js'\n\nimport { attachContentArtifactUrls, createLlmsTxtArtifact, readRouteArtifactContent } from './artifacts.js'\nimport { serveContentArtifacts } from './server.js'\n\nexport function createContentArtifactsPlugin(): ClarifyPlugin {\n return {\n name: 'clarify:content-artifacts',\n hooks: {\n 'routes:resolved': (input) => {\n attachContentArtifactUrls(input.routes)\n return input\n },\n 'dev:configureServer': (server: ViteDevServer, ctx) => {\n server.middlewares.use((req, res, next) => {\n if (serveContentArtifacts(req, res, ctx.projectConfig, ctx.routes)) return\n next()\n })\n },\n 'build:assets': (ctx) => {\n const assets: ClarifyEmitAsset[] = []\n\n for (const route of ctx.routes) {\n if (!route.contentArtifactUrl) continue\n\n assets.push({\n fileName: route.contentArtifactUrl.replace(/^\\//, ''),\n source: readRouteArtifactContent(route),\n })\n\n // For OpenAPI routes, also emit a YAML variant\n if (route.kind === 'openapi' && route.content) {\n const yamlFileName = route.contentArtifactUrl.replace(/\\.json$/, '.yaml')\n const spec = JSON.parse(route.content)\n assets.push({\n fileName: yamlFileName.replace(/^\\//, ''),\n source: yamlStringify(spec, { lineWidth: 0 }),\n })\n }\n }\n\n assets.push({\n fileName: 'llms.txt',\n source: createLlmsTxtArtifact(ctx.routes, ctx.projectConfig),\n })\n\n return assets\n },\n },\n }\n}\n","import type { HtmlTagDescriptor } from 'vite'\n\nimport { themeBootstrapScript } from '@clarify-labs/renderer'\n\nimport type { ClarifyFaviconConfig, ClarifyPlugin } from '../../types.js'\n\nconst REL_ICON_RE = /<link\\s+[^>]*rel=[\"'][^\"']*\\bicon\\b[^\"']*[\"'][^>]*>/i\n\nfunction inferIconType(href: string): string | undefined {\n const path = href.split(/[?#]/, 1)[0]?.toLowerCase() ?? href.toLowerCase()\n\n if (path.endsWith('.svg')) return 'image/svg+xml'\n if (path.endsWith('.png')) return 'image/png'\n if (path.endsWith('.ico')) return 'image/x-icon'\n if (path.endsWith('.webp')) return 'image/webp'\n\n return undefined\n}\n\nfunction createIconTag(href: string, media?: string): HtmlTagDescriptor {\n return {\n tag: 'link',\n attrs: {\n rel: 'icon',\n ...(inferIconType(href) ? { type: inferIconType(href) } : {}),\n href,\n ...(media ? { media } : {}),\n },\n injectTo: 'head',\n }\n}\n\nfunction createIconTags(icon?: ClarifyFaviconConfig): HtmlTagDescriptor[] {\n if (!icon) return []\n\n if (typeof icon === 'string') return [createIconTag(icon)]\n\n const lightIcon = icon.light ?? icon.dark\n const darkIcon = icon.dark ?? icon.light\n\n if (!lightIcon || !darkIcon) return []\n if (lightIcon === darkIcon) return [createIconTag(lightIcon)]\n\n return [\n createIconTag(lightIcon, '(prefers-color-scheme: light)'),\n createIconTag(darkIcon, '(prefers-color-scheme: dark)'),\n ]\n}\n\nexport function createHtmlShellPlugin(): ClarifyPlugin {\n return {\n name: 'clarify:html-shell',\n hooks: {\n 'html:transform': (input, ctx) => ({\n html: input.html,\n tags: [\n ...input.tags,\n ...(REL_ICON_RE.test(input.html) ? [] : createIconTags(ctx.projectConfig.favicon ?? ctx.projectConfig.logo)),\n {\n tag: 'script',\n children: themeBootstrapScript(ctx.projectConfig.theme),\n injectTo: 'head-prepend',\n },\n {\n tag: 'script',\n attrs: { type: 'module', src: input.clientEntryId },\n injectTo: 'body',\n },\n ],\n clientEntryId: input.clientEntryId,\n dev: input.dev,\n }),\n },\n }\n}\n","import matter from 'gray-matter'\n\nexport type ParsedFrontmatter = {\n frontmatter: Record<string, unknown>\n content: string\n}\n\n/**\n * 在内容入口统一解析 MDX frontmatter,并返回可供后续流程复用的标准化正文。\n */\nexport function parseFrontmatter(content: string): ParsedFrontmatter {\n const parsed = matter(content)\n return {\n frontmatter: parsed.data,\n content: parsed.content.replace(/^\\r?\\n/, ''),\n }\n}\n\n/**\n * 从 MDX 文件内容中提取 frontmatter。\n * 使用 gray-matter 支持 YAML frontmatter 的标准语法和类型解析。\n */\nexport function extractFrontmatter(content: string): Record<string, unknown> {\n return parseFrontmatter(content).frontmatter\n}\n\n/**\n * 移除 MDX 文件开头的 YAML frontmatter,保留页面正文。\n */\nexport function stripFrontmatter(content: string): string {\n return parseFrontmatter(content).content\n}\n","import type { ClarifyContentKind, ClarifyContentTransformInput } from '../types.js'\n\nimport { parseFrontmatter } from './frontmatter.js'\n\nexport type ProcessedMdxContent = {\n frontmatter: Record<string, unknown>\n content: string\n}\n\nexport type ContentTransform = (input: ClarifyContentTransformInput) => Promise<ClarifyContentTransformInput> | ClarifyContentTransformInput\n\nexport type ContentProcessor = {\n processMdx(source: string, filePath?: string): Promise<ProcessedMdxContent>\n processText(source: string, kind: Exclude<ClarifyContentKind, 'mdx'>, filePath?: string): Promise<string>\n}\n\nasync function transformContent(transform: ContentTransform | undefined, input: ClarifyContentTransformInput): Promise<ClarifyContentTransformInput> {\n return transform ? await transform(input) : input\n}\n\nexport function createContentProcessor(transform?: ContentTransform): ContentProcessor {\n return {\n async processMdx(source, filePath) {\n const { frontmatter, content } = parseFrontmatter(source)\n const transformed = await transformContent(transform, {\n kind: 'mdx',\n source,\n filePath,\n frontmatter,\n content,\n })\n\n return {\n frontmatter: transformed.frontmatter,\n content: transformed.content,\n }\n },\n async processText(source, kind, filePath) {\n const transformed = await transformContent(transform, {\n kind,\n source,\n filePath,\n frontmatter: {},\n content: source,\n })\n return transformed.content\n },\n }\n}\n","import type { ViteDevServer } from 'vite'\n\nimport type { ClarifyEmitAsset, ClarifyHookContext, ClarifyHooks, ClarifyPlugin } from '../types.js'\n\nexport async function runHooks<K extends Exclude<keyof ClarifyHooks, 'build:assets' | 'build:done' | 'dev:configureServer'>>(plugins: ClarifyPlugin[], hookName: K, input: Parameters<NonNullable<ClarifyHooks[K]>>[0], ctx: ClarifyHookContext): Promise<Parameters<NonNullable<ClarifyHooks[K]>>[0]> {\n let result = input\n for (const plugin of plugins) {\n const hook = plugin.hooks?.[hookName]\n if (!hook) continue\n try {\n result = await hook(result as never, ctx) as Parameters<NonNullable<ClarifyHooks[K]>>[0]\n } catch (err) {\n throw new Error(`[clarify] plugin \"${plugin.name}\" hook \"${hookName}\" failed: ${err}`, { cause: err })\n }\n }\n return result\n}\n\nexport async function runDevConfigureServerHooks(plugins: ClarifyPlugin[], server: ViteDevServer, ctx: ClarifyHookContext): Promise<void> {\n for (const plugin of plugins) {\n const hook = plugin.hooks?.['dev:configureServer']\n if (!hook) continue\n try {\n await hook(server, ctx)\n } catch (err) {\n throw new Error(`[clarify] plugin \"${plugin.name}\" hook \"dev:configureServer\" failed: ${err}`, { cause: err })\n }\n }\n}\n\nexport async function runBuildAssetsHooks(plugins: ClarifyPlugin[], ctx: ClarifyHookContext): Promise<ClarifyEmitAsset[]> {\n const assets: ClarifyEmitAsset[] = []\n for (const plugin of plugins) {\n const hook = plugin.hooks?.['build:assets']\n if (!hook) continue\n try {\n const pluginAssets = await hook(ctx)\n assets.push(...pluginAssets)\n } catch (err) {\n throw new Error(`[clarify] plugin \"${plugin.name}\" hook \"build:assets\" failed: ${err}`, { cause: err })\n }\n }\n return assets\n}\n\nexport async function runBuildDoneHooks(plugins: ClarifyPlugin[], ctx: ClarifyHookContext): Promise<void> {\n for (const plugin of plugins) {\n const hook = plugin.hooks?.['build:done']\n if (!hook) continue\n try {\n await hook(ctx)\n } catch (err) {\n throw new Error(`[clarify] plugin \"${plugin.name}\" hook \"build:done\" failed: ${err}`, { cause: err })\n }\n }\n}\n","import { createContentProcessor, type ContentProcessor } from '../parsers/content.js'\nimport type { ClarifyHookContext, ClarifyPlugin } from '../types.js'\n\nimport { runHooks } from './hooks.js'\n\nconst contentProcessors = new WeakMap<ClarifyHookContext, ContentProcessor>()\n\nexport function createProjectContentProcessor(plugins: ClarifyPlugin[], ctx: ClarifyHookContext): ContentProcessor {\n return createContentProcessor(input => runHooks(plugins, 'content:transform', input, ctx))\n}\n\nexport function setProjectContentProcessor(ctx: ClarifyHookContext, processor: ContentProcessor): void {\n contentProcessors.set(ctx, processor)\n}\n\nexport function getProjectContentProcessor(ctx: ClarifyHookContext): ContentProcessor | undefined {\n return contentProcessors.get(ctx)\n}\n","import { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { join, relative } from 'node:path'\n\nimport GithubSlugger from 'github-slugger'\nimport { toString } from 'mdast-util-to-string'\nimport { remark } from 'remark'\nimport { visit } from 'unist-util-visit'\n\nimport type { ContentRoute, ContentSection, ClarifyNavigationNode, ClarifyPagesConfig, ClarifyPagesGroup, ClarifyPagesItem, ClarifyLocalizedText, ClarifyTabsConfig, LocalizedNavigation, LocalizedTabbedNavigation, ResolvedClarifyI18nConfig, TabbedNavigation } from '../types.js'\n\nimport { createContentProcessor, type ContentProcessor } from './content.js'\nimport { compileMdxContent } from './mdx.js'\n\nexport type FindContentRoutesOptions = {\n contentProcessor?: ContentProcessor\n}\n\nexport function kebabToTitle(str: string): string {\n return str\n .split('-')\n .map(w => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\n}\n\nfunction parseMdxTree(content: string) {\n return remark.parse(content)\n}\n\n/** 从内容中提取第一个 H1 标题 */\nfunction extractH1(content: string): string {\n const tree = parseMdxTree(content)\n let title = ''\n visit(tree, 'heading', (node) => {\n if (!title && node.depth === 1) {\n title = toString(node)\n }\n })\n return title\n}\n\n/** 从 MDX/Markdown 内容中提取 H2/H3 章节 */\nexport function extractMdxSections(content: string): ContentSection[] {\n const sections: ContentSection[] = []\n const slugger = new GithubSlugger()\n const tree = parseMdxTree(content)\n visit(tree, 'heading', (node) => {\n if (node.depth !== 2 && node.depth !== 3) return\n const title = toString(node)\n sections.push({ id: slugger.slug(title), title, level: node.depth })\n })\n return sections\n}\n\nfunction navigationSections(sections: ContentSection[]) {\n return sections.map(s => ({ id: s.id, title: s.title, level: s.level, badge: s.badge, tags: s.tags }))\n}\n\nexport function normalizePath(path: string): string {\n const clean = '/' + path.replace(/^\\/+|\\/+$/g, '')\n return clean === '/' ? '/' : clean.replace(/\\/+/g, '/')\n}\n\nfunction pathSegmentFromOpenAPITag(tag: string): string {\n return tag\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-+|-+$/g, '') || 'tag'\n}\n\nexport function openAPITagsPathSegment(tags: string[]): string {\n return tags.map(pathSegmentFromOpenAPITag).join('-')\n}\n\nexport function basePathFromRef(ref: string): string {\n const withoutExtension = ref.replace(/\\.mdx?$/, '').replace(/\\.openapi\\.(json|yaml|yml)$/, '')\n return normalizePath(withoutExtension === 'index' ? '/' : withoutExtension.replace(/\\/index$/, ''))\n}\n\nexport function openAPIPagePathFromRef(ref: string, tagFilter?: string[], explicitPath?: string): string {\n if (explicitPath) return normalizePath(explicitPath)\n const basePath = basePathFromRef(ref)\n if (!tagFilter?.length) return basePath\n return normalizePath(`${basePath}/${openAPITagsPathSegment(tagFilter)}`)\n}\n\nexport function routePathFromRef(ref: string, explicitPath?: string): string {\n return explicitPath ? normalizePath(explicitPath) : basePathFromRef(ref)\n}\n\nexport function virtualModuleIdFromRef(ref: string): string {\n return 'virtual:clarify-page/' + ref\n .replace(/\\.mdx?$/, '')\n .replace(/\\.openapi\\.(json|yaml|yml)$/, '')\n .replace(/\\/+/g, '/')\n}\n\nexport function localizedRoutePath(basePath: string, locale: string, _i18n: ResolvedClarifyI18nConfig): string {\n const normalizedBasePath = normalizePath(basePath)\n const prefix = normalizePath(locale)\n return normalizedBasePath === '/' ? prefix : normalizePath(`${prefix}${normalizedBasePath}`)\n}\n\nexport function resolveLocalizedText(text: ClarifyLocalizedText | undefined, locale: string, fallbackLocale?: string): string | undefined {\n if (typeof text === 'string') return text\n if (text === undefined) return undefined\n return text[locale] ?? (fallbackLocale ? text[fallbackLocale] : undefined) ?? Object.values(text)[0]\n}\n\nexport async function findContentRoutes(dir: string, base: string = dir, options: FindContentRoutesOptions = {}): Promise<ContentRoute[]> {\n const routes: ContentRoute[] = []\n if (!existsSync(dir)) return routes\n\n const entries = readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = join(dir, entry.name)\n if (entry.isDirectory()) {\n routes.push(...await findContentRoutes(fullPath, base, options))\n } else if (entry.isFile() && /\\.mdx?$/.test(entry.name)) {\n const relativePath = relative(base, fullPath)\n const pathParts = relativePath.replace(/\\.mdx?$/, '').split('/')\n const path = '/' + pathParts.map(p => p === 'index' ? '' : p).filter(Boolean).join('/')\n const cleanPath = path.replace(/\\/+/g, '/').replace(/\\/$/, '') || '/'\n\n const source = readFileSync(fullPath, 'utf-8')\n const { frontmatter, content } = await (options.contentProcessor ?? createContentProcessor()).processMdx(source, fullPath)\n const mdxResult = await compileMdxContent(content, fullPath, base)\n\n let title = typeof frontmatter.title === 'string' ? frontmatter.title : ''\n if (!title) {\n const lastPart = pathParts[pathParts.length - 1] ?? ''\n const stem = lastPart === 'index'\n ? (pathParts.length >= 2 ? pathParts[pathParts.length - 2]! : extractH1(content))\n : lastPart\n title = kebabToTitle(stem) || 'Untitled'\n }\n\n routes.push({\n kind: 'mdx',\n title,\n path: cleanPath,\n basePath: cleanPath,\n filePath: fullPath,\n virtualModuleId: 'virtual:clarify-page/' + relativePath.replace(/\\.mdx?$/, '').replace(/\\/+/g, '/'),\n description: typeof frontmatter.description === 'string' ? frontmatter.description : undefined,\n keywords: frontmatterKeywords(frontmatter),\n frontmatter,\n content,\n sections: extractMdxSections(content),\n diagnostic: mdxResult.ok ? undefined : mdxResult.diagnostic,\n })\n }\n }\n return routes\n}\n\nfunction virtualModuleIdForLocalizedRoute(contentRoot: string, filePath: string): string {\n return 'virtual:clarify-page/' + relative(contentRoot, filePath)\n .replace(/\\.mdx?$/, '')\n .replace(/\\.openapi\\.(json|yaml|yml)$/, '')\n .replace(/\\/+/g, '/')\n}\n\nfunction frontmatterKeywords(frontmatter: Record<string, unknown>): string[] | undefined {\n const value = frontmatter.keywords ?? frontmatter.keyword ?? frontmatter.tags\n const keywords = Array.isArray(value)\n ? value.filter((item): item is string => typeof item === 'string')\n : typeof value === 'string'\n ? value.split(',').map(keyword => keyword.trim()).filter(Boolean)\n : []\n\n return keywords.length > 0 ? keywords : undefined\n}\n\nexport function withAlternates(route: ContentRoute, routes: ContentRoute[], i18n: ResolvedClarifyI18nConfig): ContentRoute {\n const basePath = route.basePath ?? route.path\n // 排除裸路径别名,避免覆盖带 locale 前缀的路径\n const routeByLocaleAndBase = new Map(\n routes\n .filter(r => !r.locale || r.path === `/${r.locale}` || r.path.startsWith(`/${r.locale}/`))\n .map(r => [`${r.locale ?? ''}:${r.basePath ?? r.path}`, r]),\n )\n const alternates = Object.fromEntries(\n i18n.locales.flatMap((locale) => {\n const alternate = routeByLocaleAndBase.get(`${locale.code}:${basePath}`)\n return alternate ? [[locale.code, alternate.path]] : []\n })\n )\n return { ...route, alternates }\n}\n\nexport async function findLocalizedContentRoutes(contentRoot: string, i18n?: ResolvedClarifyI18nConfig, options: FindContentRoutesOptions = {}): Promise<ContentRoute[]> {\n if (!i18n) return findContentRoutes(contentRoot, contentRoot, options)\n\n const localizedRoutes: ContentRoute[] = []\n for (const locale of i18n.locales) {\n const localeRoot = join(contentRoot, locale.code)\n const discovered = await findContentRoutes(localeRoot, localeRoot, options)\n for (const route of discovered) {\n const basePath = route.basePath ?? route.path\n localizedRoutes.push({\n ...route,\n path: localizedRoutePath(basePath, locale.code, i18n),\n basePath,\n locale: locale.code,\n virtualModuleId: virtualModuleIdForLocalizedRoute(contentRoot, route.filePath),\n })\n }\n }\n\n if (i18n.missing === 'fallback') {\n const routeByLocaleAndBase = new Map(localizedRoutes.map(route => [`${route.locale ?? ''}:${route.basePath ?? route.path}`, route]))\n const defaultRoutes = localizedRoutes.filter(route => route.locale === i18n.defaultLocale)\n for (const sourceRoute of defaultRoutes) {\n const basePath = sourceRoute.basePath ?? sourceRoute.path\n for (const locale of i18n.locales) {\n const key = `${locale.code}:${basePath}`\n if (routeByLocaleAndBase.has(key)) continue\n localizedRoutes.push({\n ...sourceRoute,\n path: localizedRoutePath(basePath, locale.code, i18n),\n locale: locale.code,\n isFallback: true,\n })\n }\n }\n }\n\n const routesWithAlternates = localizedRoutes.map(route => withAlternates(route, localizedRoutes, i18n))\n\n // 为默认语言生成无前缀的裸路径别名,方便不带语言前缀的 URL 也能访问\n const bareRoutes: ContentRoute[] = []\n const seenBare = new Set(routesWithAlternates.map(r => r.path))\n for (const route of routesWithAlternates) {\n if (route.locale !== i18n.defaultLocale) continue\n const bp = route.basePath ?? route.path\n if (bp === route.path || seenBare.has(bp)) continue\n seenBare.add(bp)\n bareRoutes.push({ ...route, path: bp })\n }\n\n return [...routesWithAlternates, ...bareRoutes]\n}\n\nexport function buildNavigation(routes: ContentRoute[]): ClarifyNavigationNode[] {\n const root: ClarifyNavigationNode[] = []\n\n for (const route of routes) {\n if (route.path === '/' || (route.basePath ?? route.path) === '/404') continue // 首页和 404 不放入侧边栏\n\n const parts = route.path.replace(/^\\//, '').split('/')\n let current = root\n\n for (let i = 0; i < parts.length; i++) {\n const pathSoFar = '/' + parts.slice(0, i + 1).join('/')\n let node = current.find(n => n.path === pathSoFar)\n if (!node) {\n node = { path: pathSoFar, title: i === parts.length - 1 ? route.title : kebabToTitle(parts[i]), children: [] }\n current.push(node)\n }\n if (i === parts.length - 1 && route.sections) {\n node.sections = navigationSections(route.sections)\n }\n if (i < parts.length - 1) {\n node.children = node.children ?? []\n current = node.children\n }\n }\n }\n\n return root\n}\n\nfunction resolvePageItem(\n item: ClarifyPagesItem\n): { pageRef?: string; openapiRef?: string; openapiTagFilter?: string[]; path?: string; redirect?: string; title?: ClarifyLocalizedText; icon?: string } {\n if (typeof item === 'string') return { pageRef: item }\n if ('openapi' in item) return { openapiRef: item.openapi, openapiTagFilter: item.filter?.tags, path: item.path, title: item.title, icon: item.icon }\n return { pageRef: item.page, path: item.path, redirect: item.redirect, title: item.title, icon: item.icon }\n}\n\nfunction firstNavigationPath(nodes: ClarifyNavigationNode[]): string {\n for (const node of nodes) {\n if (node.path) return node.path\n const childPath = node.children ? firstNavigationPath(node.children) : undefined\n if (childPath) return childPath\n }\n return '/'\n}\n\nfunction collectExplicitPagePathItems(tabs?: ClarifyTabsConfig): Array<{ pageRef: string; path: string }> {\n const items: Array<{ pageRef: string; path: string }> = []\n\n for (const tab of tabs ?? []) {\n if (!tab.pages || tab.pages === 'FileTree') continue\n for (const group of tab.pages) {\n for (const item of group.pages) {\n if (typeof item !== 'string' && 'page' in item && item.path) {\n items.push({ pageRef: item.page, path: item.path })\n }\n }\n }\n }\n\n return items\n}\n\nexport function applyConfiguredPageRoutePaths(routes: ContentRoute[], tabs?: ClarifyTabsConfig, i18n?: ResolvedClarifyI18nConfig): ContentRoute[] {\n const pageItems = collectExplicitPagePathItems(tabs)\n if (!pageItems.length) return routes\n\n const additions: ContentRoute[] = []\n const existingKeys = new Set(routes.map(route => `${route.locale ?? ''}:${route.basePath ?? route.path}`))\n\n for (const item of pageItems) {\n const sourceBasePath = routePathFromRef(item.pageRef)\n const targetBasePath = routePathFromRef(item.pageRef, item.path)\n if (sourceBasePath === targetBasePath) continue\n\n for (const route of routes) {\n if (route.kind !== 'mdx' || (route.basePath ?? route.path) !== sourceBasePath) continue\n\n const key = `${route.locale ?? ''}:${targetBasePath}`\n if (existingKeys.has(key)) continue\n existingKeys.add(key)\n\n additions.push({\n ...route,\n path: route.locale && i18n ? localizedRoutePath(targetBasePath, route.locale, i18n) : targetBasePath,\n basePath: targetBasePath,\n })\n }\n }\n\n const nextRoutes = [...routes, ...additions]\n const routesWithAlternates = i18n ? nextRoutes.map(route => withAlternates(route, nextRoutes, i18n)) : nextRoutes\n\n if (!i18n) return routesWithAlternates\n\n // 为默认语言生成无前缀的裸路径别名,方便不带语言前缀的 URL 也能访问\n const bareRoutes: ContentRoute[] = []\n const seenBare = new Set(routesWithAlternates.map(r => r.path))\n for (const route of routesWithAlternates) {\n if (route.locale !== i18n.defaultLocale) continue\n const bp = route.basePath ?? route.path\n if (bp === route.path || seenBare.has(bp)) continue\n seenBare.add(bp)\n bareRoutes.push({ ...route, path: bp })\n }\n\n return [...routesWithAlternates, ...bareRoutes]\n}\n\nfunction buildNavigationFromPagesConfig(routes: ContentRoute[], config?: ClarifyPagesConfig): ClarifyNavigationNode[] {\n if (!config || config === 'FileTree') return buildNavigation(routes)\n return buildNavigationFromConfig(routes, config)\n}\n\nexport function buildNavigationFromTabsConfig(routes: ContentRoute[], tabs: ClarifyTabsConfig): TabbedNavigation {\n return {\n tabs: tabs.map(tab => {\n const children = buildNavigationFromPagesConfig(routes, tab.pages)\n return {\n type: 'tab',\n path: firstNavigationPath(children),\n title: resolveLocalizedText(tab.tab, '', '') ?? '',\n icon: tab.icon,\n children,\n }\n }),\n }\n}\n\nexport function buildNavigationFromConfig(routes: ContentRoute[], config: ClarifyPagesGroup[]): ClarifyNavigationNode[] {\n const routeMap = new Map(routes.map(r => [r.path, r]))\n\n return config.map(group => {\n const children = group.pages.map(item => {\n const { pageRef, openapiRef, openapiTagFilter, path: explicitPath, redirect, title, icon } = resolvePageItem(item)\n\n if (openapiRef) {\n const path = openAPIPagePathFromRef(openapiRef, openapiTagFilter, explicitPath)\n const route = routeMap.get(path)\n return {\n path,\n title: resolveLocalizedText(title, '', '') ?? route?.title ?? kebabToTitle(path.split('/').pop() ?? openapiRef),\n icon,\n sections: route?.sections ? navigationSections(route.sections) : undefined,\n }\n }\n\n const ref = pageRef ?? ''\n const path = routePathFromRef(ref, explicitPath)\n const route = routeMap.get(path)\n return {\n path: redirect ? normalizePath(redirect) : path,\n title: resolveLocalizedText(title, '', '') ?? route?.title ?? kebabToTitle(path.split('/').pop() ?? ref),\n icon,\n sections: route?.sections ? navigationSections(route.sections) : undefined,\n }\n })\n\n return {\n path: children[0]?.path ?? '/',\n title: resolveLocalizedText(group.group, '', '') ?? '',\n icon: group.icon,\n children,\n }\n })\n}\n\nfunction localizeNavigationPaths(nodes: ClarifyNavigationNode[], locale: string, i18n: ResolvedClarifyI18nConfig): ClarifyNavigationNode[] {\n return nodes.map(node => ({\n ...node,\n path: localizedRoutePath(node.path, locale, i18n),\n children: node.children ? localizeNavigationPaths(node.children, locale, i18n) : undefined,\n }))\n}\n\nexport function buildLocalizedNavigation(routes: ContentRoute[], config: ClarifyPagesConfig | undefined, i18n?: ResolvedClarifyI18nConfig): LocalizedNavigation | undefined {\n if (!i18n) return undefined\n\n const result: LocalizedNavigation = {}\n for (const locale of i18n.locales) {\n const localeRoutes = routes.filter(route => route.locale === locale.code)\n result[locale.code] = buildLocalizedNavigationForLocale(localeRoutes, config, locale.code, i18n)\n }\n\n return result\n}\n\nfunction buildLocalizedNavigationForLocale(routes: ContentRoute[], config: ClarifyPagesConfig | undefined, locale: string, i18n: ResolvedClarifyI18nConfig): ClarifyNavigationNode[] {\n if (!config || config === 'FileTree') {\n const baseNavigation = buildNavigation(routes.map(route => ({ ...route, path: route.basePath ?? route.path })))\n return localizeNavigationPaths(baseNavigation, locale, i18n)\n }\n\n const routeMap = new Map(routes.map(route => [route.basePath ?? route.path, route]))\n return config.map(group => {\n const children = group.pages.map(item => {\n const { pageRef, openapiRef, openapiTagFilter, path: explicitPath, redirect, title, icon } = resolvePageItem(item)\n const ref = openapiRef ?? pageRef ?? ''\n const basePath = openapiRef ? openAPIPagePathFromRef(openapiRef, openapiTagFilter, explicitPath) : routePathFromRef(ref, explicitPath)\n const route = routeMap.get(basePath)\n const path = route?.path ?? localizedRoutePath(basePath, locale, i18n)\n const redirectPath = redirect ? localizedRoutePath(routePathFromRef(redirect), locale, i18n) : undefined\n\n return {\n path: redirectPath ?? path,\n title: resolveLocalizedText(title, locale, i18n.defaultLocale) ?? route?.title ?? kebabToTitle(basePath.split('/').pop() ?? ref),\n icon,\n sections: route?.sections ? navigationSections(route.sections) : undefined,\n }\n })\n\n return {\n path: children[0]?.path ?? localizedRoutePath('/', locale, i18n),\n title: resolveLocalizedText(group.group, locale, i18n.defaultLocale) ?? '',\n icon: group.icon,\n children,\n }\n })\n}\n\nexport function buildLocalizedNavigationFromTabsConfig(routes: ContentRoute[], tabs: ClarifyTabsConfig, i18n?: ResolvedClarifyI18nConfig): LocalizedTabbedNavigation | undefined {\n if (!i18n) return undefined\n\n const result: LocalizedTabbedNavigation = {}\n for (const locale of i18n.locales) {\n const localeRoutes = routes.filter(route => route.locale === locale.code)\n result[locale.code] = {\n tabs: tabs.map(tab => {\n const children = buildLocalizedNavigationForLocale(localeRoutes, tab.pages, locale.code, i18n)\n return {\n type: 'tab',\n path: firstNavigationPath(children),\n title: resolveLocalizedText(tab.tab, locale.code, i18n.defaultLocale) ?? '',\n icon: tab.icon,\n children,\n }\n }),\n }\n }\n\n return result\n}\n","import { existsSync, readFileSync, readdirSync } from 'node:fs'\nimport { join, relative, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport SwaggerParser from '@apidevtools/swagger-parser'\nimport { slug } from 'github-slugger'\n\nimport type { ContentProcessor } from '../../parsers/content.js'\nimport { kebabToTitle, routePathFromRef, virtualModuleIdFromRef } from '../../parsers/routes.js'\nimport type { ContentDiagnostic, ContentRoute, ContentSection, OpenAPISpec } from '../../types.js'\n\nconst OPENAPI_HTTP_METHODS = ['get', 'put', 'post', 'delete', 'options', 'head', 'patch', 'trace'] as const\n\ntype ResolverFileInfo = { url: string }\n\nexport type OpenAPIParseResult =\n | { ok: true; spec: OpenAPISpec }\n | { ok: false; diagnostic: ContentDiagnostic }\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction isSameOpenAPIFile(url: string, filePath: string): boolean {\n try {\n return resolve(fileURLToPath(url)) === resolve(filePath)\n } catch {\n return resolve(url) === resolve(filePath)\n }\n}\n\nexport function findOpenAPIRoutes(dir: string, base: string = dir): ContentRoute[] {\n const routes: ContentRoute[] = []\n if (!existsSync(dir)) return routes\n\n const entries = readdirSync(dir, { withFileTypes: true })\n for (const entry of entries) {\n const fullPath = join(dir, entry.name)\n if (entry.isDirectory()) {\n routes.push(...findOpenAPIRoutes(fullPath, base))\n continue\n }\n if (!entry.isFile() || !/\\.openapi\\.(json|yaml|yml)$/.test(entry.name)) continue\n\n const ref = relative(base, fullPath)\n const cleanPath = routePathFromRef(ref)\n routes.push({\n path: cleanPath,\n basePath: cleanPath,\n filePath: fullPath,\n virtualModuleId: virtualModuleIdFromRef(ref),\n title: kebabToTitle(cleanPath.split('/').pop() ?? 'API'),\n kind: 'openapi',\n })\n }\n\n return routes\n}\n\nfunction operationMatchesTags(operationTags: string[] | undefined, filterTags: string[] | undefined): boolean {\n if (!filterTags?.length) return true\n return operationTags?.some(tag => filterTags.includes(tag)) ?? false\n}\n\n/** Filter an OpenAPI spec to only include paths that have at least one operation matching the given tags. */\nexport function filterSpecByTags(spec: OpenAPISpec, tags: string[]): OpenAPISpec {\n const filteredPaths: Record<string, unknown> = {}\n const paths = (spec.paths ?? {}) as Record<string, unknown>\n for (const path of Object.keys(paths)) {\n const pathItem = paths[path] as Record<string, unknown> | undefined\n if (!pathItem) continue\n const ops = Object.values(pathItem)\n const hasMatch = ops.some(op => op && typeof op === 'object' && operationMatchesTags((op as Record<string, unknown>).tags as string[] | undefined, tags))\n if (hasMatch) filteredPaths[path] = pathItem\n }\n return { ...spec, paths: filteredPaths } as OpenAPISpec\n}\n\n/** Extract endpoint operations from an OpenAPI spec as page sections. */\nexport function extractOpenAPISections(spec: OpenAPISpec, filterTags?: string[]): ContentSection[] {\n const sections: ContentSection[] = []\n const paths = spec.paths ?? {}\n for (const [path, pathItem] of Object.entries(paths)) {\n if (!pathItem) continue\n for (const method of OPENAPI_HTTP_METHODS) {\n const op = pathItem[method]\n if (!op || !operationMatchesTags(op.tags, filterTags)) continue\n const title = op.summary ?? `${method.toUpperCase()} ${path}`\n sections.push({ id: slug(`${method} ${path}`), title, level: 2, badge: method.toUpperCase(), tags: op.tags })\n }\n }\n return sections\n}\n\nexport async function readOpenAPISpec(filePath: string, contentProcessor?: ContentProcessor): Promise<OpenAPIParseResult> {\n try {\n if (!contentProcessor) return { ok: true, spec: await SwaggerParser.dereference(filePath) as OpenAPISpec }\n\n const source = readFileSync(filePath, 'utf-8')\n const transformedSource = await contentProcessor.processText(source, 'openapi', filePath)\n if (transformedSource === source) return { ok: true, spec: await SwaggerParser.dereference(filePath) as OpenAPISpec }\n\n return {\n ok: true,\n spec: await SwaggerParser.dereference(filePath, {\n resolve: {\n transformedOpenAPISource: {\n order: 1,\n canRead: (file: ResolverFileInfo) => isSameOpenAPIFile(file.url, filePath),\n read: () => transformedSource,\n },\n },\n }) as OpenAPISpec,\n }\n } catch (error) {\n return {\n ok: false,\n diagnostic: {\n kind: 'openapi',\n title: 'OpenAPI spec parse failed',\n message: `Clarify could not parse ${filePath}.`,\n filePath,\n details: errorMessage(error),\n },\n }\n }\n}\n","import type { UISlotRegistration } from '@clarify-labs/renderer'\n\nimport { buildLocalizedNavigationFromTabsConfig, buildNavigation, buildNavigationFromTabsConfig } from '../parsers/routes.js'\nimport type { ClarifyPlugin, ContentDiagnostic, ContentRoute, NavigationTree, ResolvedBuildOptions, ResolvedProjectConfig } from '../types.js'\n\n// 新的虚拟模块命名 - 更清晰的职责划分\nexport const VIRTUAL_CONFIG = 'virtual:clarify/config'\nexport const VIRTUAL_ROUTES = 'virtual:clarify/routes'\nexport const VIRTUAL_SERVER_ROUTES = 'virtual:clarify/routes/server'\nexport const VIRTUAL_OPENAPI = 'virtual:clarify/openapi'\nexport const VIRTUAL_SLOTS = 'virtual:clarify/slots'\nexport const VIRTUAL_SLOT = 'virtual:clarify/slot'\nexport const VIRTUAL_CLIENT_ENTRY = 'virtual:clarify/entry-client'\nexport const RESOLVED_CLIENT_ENTRY = '\\0' + VIRTUAL_CLIENT_ENTRY\n\nexport type VirtualModules = Map<string, string>\n\ntype BuildVirtualModulesArgs = {\n generateOptions: ResolvedBuildOptions\n projectConfig: ResolvedProjectConfig\n routes: ContentRoute[]\n version?: string\n plugins?: ClarifyPlugin[]\n navigation?: NavigationTree\n themeEditor?: boolean\n}\n\ntype CreateClientEntryModuleOptions = {\n themeEditor?: boolean\n}\n\nexport function resolveVirtualId(id: string): string {\n return '\\0' + id\n}\n\nexport function stripVirtualPrefix(id: string): string {\n return id.startsWith('\\0') ? id.slice(1) : id\n}\n\nexport function generateConfigModule(projectConfig: ResolvedProjectConfig, buildOptions: ResolvedBuildOptions, version?: string): string {\n const runtimeConfig: Record<string, unknown> = { ...projectConfig, ...buildOptions }\n if (version) {\n runtimeConfig.version = version\n }\n return `export const config = ${JSON.stringify(runtimeConfig)};`\n}\n\nfunction moduleSpecifier(value: string): string {\n return JSON.stringify(value)\n}\n\nexport function generateRoutesModule(routes: ContentRoute[], resolvedNavigation?: NavigationTree, projectConfig?: ResolvedProjectConfig, mode: 'client' | 'server' = 'client'): string {\n const imports = mode === 'server'\n ? routes.map((r, i) => `import Page${i} from ${moduleSpecifier(r.virtualModuleId)};`).join('\\n')\n : `import { createContentDiagnosticComponent } from '@clarify-labs/renderer';`\n const routesArray = routes.map((r, i) => {\n const sections = r.sections && r.sections.length > 0\n ? `, sections: ${JSON.stringify(r.sections.map(s => ({ id: s.id, title: s.title, level: s.level, badge: s.badge, tags: s.tags })))}`\n : ''\n const contentArtifactUrl = r.contentArtifactUrl ? `, contentArtifactUrl: ${JSON.stringify(r.contentArtifactUrl)}` : ''\n const basePath = r.basePath ? `, basePath: ${JSON.stringify(r.basePath)}` : ''\n const locale = r.locale ? `, locale: ${JSON.stringify(r.locale)}` : ''\n const isFallback = r.isFallback ? ', isFallback: true' : ''\n const isBareAlias = r.isBareAlias ? ', isBareAlias: true' : ''\n const alternates = r.alternates ? `, alternates: ${JSON.stringify(r.alternates)}` : ''\n const description = r.description ? `, description: ${JSON.stringify(r.description)}` : ''\n const keywords = r.keywords && r.keywords.length > 0 ? `, keywords: ${JSON.stringify(r.keywords)}` : ''\n const sourceUrl = r.sourceUrl ? `, sourceUrl: ${JSON.stringify(r.sourceUrl)}` : ''\n const component = mode === 'server'\n ? `Page${i}`\n : `() => import(${moduleSpecifier(r.virtualModuleId)}).catch((error) => Promise.resolve({ default: createContentDiagnosticComponent({ kind: 'route-load', title: 'This page could not be loaded', message: error instanceof Error ? error.message : String(error), details: error instanceof Error ? error.stack : undefined }) }))`\n const lazy = mode === 'client' ? ', lazy: true' : ''\n return ` { path: ${JSON.stringify(r.path)}, title: ${JSON.stringify(r.title)}, component: ${component}${lazy}, kind: ${JSON.stringify(r.kind)}${basePath}${locale}${isFallback}${isBareAlias}${alternates}${description}${keywords}${sections}${contentArtifactUrl}${sourceUrl} }`\n }).join(',\\n')\n\n const navigation = resolvedNavigation ?? (projectConfig?.tabs\n ? projectConfig.i18n\n ? (buildLocalizedNavigationFromTabsConfig(routes, projectConfig.tabs, projectConfig.i18n) ?? {})\n : buildNavigationFromTabsConfig(routes, projectConfig.tabs)\n : buildNavigation(routes))\n\n return `${imports}\\n\\nexport const routes = [\\n${routesArray}\\n];\\n\\nexport const navigation = ${JSON.stringify(navigation, null, 2)};\\n`\n}\n\nexport function createClientEntryModule(options: CreateClientEntryModuleOptions = {}): string {\n return `\nimport '@clarify-labs/renderer/style.css';\nimport { render } from '@clarify-labs/renderer/client';\nimport { routes, navigation } from '${VIRTUAL_ROUTES}';\nimport { config } from '${VIRTUAL_CONFIG}';\nimport { openApis } from '${VIRTUAL_OPENAPI}';\nimport { runtimeSlots } from '${VIRTUAL_SLOTS}';\nrender({ config, routes, navigation, openApis, runtimeSlots, themeEditor: ${JSON.stringify(options.themeEditor ?? false)} });`\n}\n\n/**\n * Collect every plugin's `slots` declarations into a single runtime registry\n * module. Component modules are exported as lazy import factories so the\n * renderer can decide whether to code-split (client) or pre-resolve (SSR).\n *\n * Relative component paths are resolved against the project `root` so that\n * the generated `import()` call uses an absolute specifier — Vite cannot\n * resolve relative imports from virtual modules.\n *\n * Slot name validity is enforced at compile time by the `UISlotName`\n * type — no runtime validation is needed.\n */\nexport function createRuntimeSlotsModule(plugins: ClarifyPlugin[] = [], root: string = process.cwd()): string {\n const registrations: { plugin: string; slot: UISlotRegistration }[] = []\n for (const plugin of plugins) {\n for (const slot of plugin.slots ?? []) {\n registrations.push({ plugin: plugin.name, slot })\n }\n }\n\n if (registrations.length === 0) {\n return 'export const runtimeSlots = {};\\n'\n }\n\n const grouped = new Map<string, string[]>()\n for (const { plugin, slot } of registrations) {\n // Warn when multiple plugins register the same replace slot — only the\n // last one takes effect, which is almost certainly a configuration error.\n if (slot.name.endsWith('.replace')) {\n const existing = grouped.get(slot.name)\n if (existing) {\n console.warn(`[clarify] Multiple plugins register slot \"${slot.name}\": \"${plugin}\" overrides \"${existing[existing.length - 1]}\". Only the last registration is used.`)\n }\n }\n\n // Resolve `/`-prefixed paths relative to the project root so that\n // Vite can resolve the import from the virtual module.\n if (!slot.component.startsWith('/')) {\n throw new Error(`[clarify] Plugin \"${plugin}\" slot \"${slot.name}\" has an invalid component path \"${slot.component}\". Component paths must start with \"/\" to reference the project root.`)\n }\n const componentPath = root + slot.component\n const entry = `{ plugin: ${JSON.stringify(plugin)}, component: () => import(${moduleSpecifier(componentPath)}) }`\n const list = grouped.get(slot.name) ?? []\n list.push(entry)\n grouped.set(slot.name, list)\n }\n\n const entries = [...grouped.entries()]\n .map(([name, list]) => ` ${JSON.stringify(name)}: [\\n ${list.join(',\\n ')}\\n ]`)\n .join(',\\n')\n\n return `export const runtimeSlots = {\\n${entries}\\n};\\n`\n}\n\n/**\n * Re-exports the slot context hook from the renderer so plugin components can\n * `import { useSlot } from 'virtual:clarify/slot'` without depending on\n * renderer internals directly.\n */\nexport function createSlotModule(): string {\n return `export { useSlot } from '@clarify-labs/renderer';\\n`\n}\n\nexport function generateMdxErrorModule(diagnostic: ContentDiagnostic): string {\n return `import { createContentDiagnosticComponent } from '@clarify-labs/renderer';\n\nexport const contentDiagnostic = ${JSON.stringify({\n kind: diagnostic.kind ?? 'mdx',\n title: diagnostic.title,\n message: diagnostic.message,\n filePath: diagnostic.filePath,\n details: diagnostic.details,\n })};\n\nexport default createContentDiagnosticComponent(contentDiagnostic);\n`\n}\n\nexport function buildVirtualModules(args: BuildVirtualModulesArgs): VirtualModules {\n const modules: VirtualModules = new Map()\n const clientEntryModule = createClientEntryModule({ themeEditor: args.themeEditor })\n \n // Collect all plugins\n const allPlugins: ClarifyPlugin[] = [...(args.plugins ?? [])]\n \n modules.set(VIRTUAL_CONFIG, generateConfigModule(args.projectConfig, args.generateOptions, args.version))\n modules.set(VIRTUAL_ROUTES, generateRoutesModule(args.routes, args.navigation, args.projectConfig, 'client'))\n modules.set(VIRTUAL_SERVER_ROUTES, generateRoutesModule(args.routes, args.navigation, args.projectConfig, 'server'))\n modules.set(VIRTUAL_SLOTS, createRuntimeSlotsModule(allPlugins, args.generateOptions.projectRoot))\n modules.set(VIRTUAL_OPENAPI, generateOpenApiModule())\n modules.set(VIRTUAL_SLOT, createSlotModule())\n modules.set(VIRTUAL_CLIENT_ENTRY, clientEntryModule)\n modules.set(RESOLVED_CLIENT_ENTRY, clientEntryModule)\n\n for (const route of args.routes) {\n const moduleContent = route.diagnostic\n ? generateMdxErrorModule(route.diagnostic)\n : `export { default } from ${moduleSpecifier(route.filePath)};`\n modules.set(route.virtualModuleId, moduleContent)\n }\n\n return modules\n}\n\n// 新的 OpenAPI 模块生成函数 - 独立出来\nexport function generateOpenApiModule(): string {\n return `export const openApis = {};`\n}\n","import { VIRTUAL_OPENAPI } from '../../core/virtual-modules.js'\nimport type { ContentDiagnostic, OpenAPISpec } from '../../types.js'\n\nexport const openApiRegistryModuleId = VIRTUAL_OPENAPI\nexport const OPENAPI_SPEC_PREFIX = 'virtual:clarify/openapi-spec/'\n\nexport function specVirtualModuleId(specKey: string): string {\n return `${OPENAPI_SPEC_PREFIX}${specKey}`\n}\n\nexport function generateOpenAPIRegistryModule(openApis: Record<string, OpenAPISpec>): string {\n return `export const openApis = ${JSON.stringify(openApis)};`\n}\n\n/** Generate a virtual module that exports a single spec as default. */\nexport function generateOpenAPISpecModule(spec: OpenAPISpec): string {\n return `export default ${JSON.stringify(spec)};`\n}\n\ntype OpenAPIPageModuleOptions = {\n spec: OpenAPISpec\n tagFilter?: string[]\n}\n\nexport function generateOpenAPIPageModule(opts: OpenAPIPageModuleOptions): string {\n return `import { createOpenApiRouteComponent } from '@clarify-labs/renderer';\n\nexport const routeData = ${JSON.stringify({ spec: opts.spec, tagFilter: opts.tagFilter })};\n\nexport default createOpenApiRouteComponent(routeData);\n`\n}\n\nexport function generateOpenAPIErrorModule(diagnostic: ContentDiagnostic): string {\n return `import { createContentDiagnosticComponent } from '@clarify-labs/renderer';\n\nexport const contentDiagnostic = ${JSON.stringify({\n kind: diagnostic.kind ?? 'openapi',\n title: diagnostic.title,\n message: diagnostic.message,\n filePath: diagnostic.filePath,\n details: diagnostic.details,\n })};\n\nexport default createContentDiagnosticComponent(contentDiagnostic);\n`\n}\n","import { relative } from 'node:path'\n\nimport { getProjectContentProcessor } from '../../core/content.js'\nimport { localizedRoutePath, openAPIPagePathFromRef, withAlternates } from '../../parsers/routes.js'\nimport type { ClarifyPagesConfig, ClarifyPagesItem, ClarifyPlugin, ContentRoute, OpenAPISpec, ResolvedProjectConfig } from '../../types.js'\n\nimport { extractOpenAPISections, filterSpecByTags, findOpenAPIRoutes, readOpenAPISpec } from './parser.js'\nimport { generateOpenAPIErrorModule, generateOpenAPIPageModule, generateOpenAPIRegistryModule, generateOpenAPISpecModule, openApiRegistryModuleId, specVirtualModuleId } from './virtual-modules.js'\n\ntype OpenAPISpecEntry = {\n spec: OpenAPISpec\n /** Source spec file path – used as deduplication key across routes. */\n filePath: string\n}\n\nfunction collectOpenAPIPageItems(config: ResolvedProjectConfig): Array<Extract<ClarifyPagesItem, { openapi: string }>> {\n const items: Array<Extract<ClarifyPagesItem, { openapi: string }>> = []\n\n function visitPages(pages?: ClarifyPagesConfig) {\n if (!pages || pages === 'FileTree') return\n for (const group of pages) {\n for (const item of group.pages) {\n if (typeof item !== 'string' && 'openapi' in item && (item.path || item.filter?.tags?.length)) items.push(item)\n }\n }\n }\n\n for (const tab of config.tabs ?? []) visitPages(tab.pages)\n\n return items\n}\n\nfunction virtualModuleIdFromPath(path: string): string {\n return `virtual:clarify-page/${path.replace(/^\\/+/, '') || 'index'}`\n}\n\nfunction createConfiguredOpenAPIRoutes(routes: ContentRoute[], config: ResolvedProjectConfig): ContentRoute[] {\n const pageItems = collectOpenAPIPageItems(config)\n if (!pageItems.length) return routes\n\n const additions: ContentRoute[] = []\n const existingKeys = new Set(routes.map(route => `${route.locale ?? ''}:${route.basePath ?? route.path}`))\n\n for (const item of pageItems) {\n const tagFilter = item.filter?.tags?.filter(Boolean)\n const sourceBasePath = openAPIPagePathFromRef(item.openapi)\n const targetBasePath = openAPIPagePathFromRef(item.openapi, tagFilter, item.path)\n if (sourceBasePath === targetBasePath && !tagFilter?.length) continue\n\n for (const route of routes) {\n if (route.kind !== 'openapi' || (route.basePath ?? route.path) !== sourceBasePath) continue\n\n const key = `${route.locale ?? ''}:${targetBasePath}`\n if (existingKeys.has(key)) continue\n existingKeys.add(key)\n\n additions.push({\n ...route,\n path: route.locale && config.i18n ? localizedRoutePath(targetBasePath, route.locale, config.i18n) : targetBasePath,\n basePath: targetBasePath,\n title: route.title,\n virtualModuleId: virtualModuleIdFromPath(targetBasePath),\n openapiTagFilter: tagFilter?.length ? tagFilter : undefined,\n })\n }\n }\n\n const nextRoutes = [...routes, ...additions]\n return config.i18n ? nextRoutes.map(route => withAlternates(route, nextRoutes, config.i18n!)) : nextRoutes\n}\n\n/** Derive a stable, deduplicated key from an absolute spec file path. */\nfunction specFileKeyFromPath(filePath: string, projectRoot: string): string {\n return relative(projectRoot, filePath).replace(/[^a-zA-Z0-9_-]/g, '_').replace(/_+/g, '_').replace(/^_|_$/g, '')\n}\n\nexport function createOpenAPIPlugin(): ClarifyPlugin {\n /** specs keyed by specFileKey (deduplicated per source file). */\n const specs = new Map<string, OpenAPISpecEntry>()\n\n return {\n name: 'clarify:openapi',\n hooks: {\n 'routes:discover': (input) => ({\n ...input,\n routes: [...input.routes, ...findOpenAPIRoutes(input.contentRoot)],\n }),\n 'routes:discovered': async (routes, ctx) => {\n specs.clear()\n\n const nextRoutes = createConfiguredOpenAPIRoutes(routes, ctx.projectConfig)\n const specByFilePath = new Map<string, OpenAPISpec>()\n\n for (const route of nextRoutes.filter(route => route.kind === 'openapi')) {\n const specFromCache = specByFilePath.get(route.filePath)\n const result = specFromCache ? { ok: true as const, spec: specFromCache } : await readOpenAPISpec(route.filePath, getProjectContentProcessor(ctx))\n if (!result.ok) {\n route.diagnostic = result.diagnostic\n route.title = route.title || 'OpenAPI parse error'\n route.sections = []\n continue\n }\n\n const spec = result.spec\n specByFilePath.set(route.filePath, spec)\n\n // Derive a stable dedup key from the spec file path\n const specKey = specFileKeyFromPath(route.filePath, ctx.generateOptions.projectRoot)\n route.specFileKey = specKey\n\n specs.set(specKey, { spec, filePath: route.filePath })\n route.title = spec.info?.title ?? route.title\n route.description = spec.info?.description ?? route.description\n route.sections = extractOpenAPISections(spec, route.openapiTagFilter)\n\n // Set route.content to filtered or full JSON for the content-artifacts plugin\n const pageSpec = route.openapiTagFilter?.length\n ? filterSpecByTags(spec, route.openapiTagFilter)\n : spec\n route.content = JSON.stringify(pageSpec)\n }\n\n return nextRoutes\n },\n 'modules:before': (modules, ctx) => {\n // ── Registry module (used by SSR to populate OpenApisContext) ──\n // Keys are unified in namespace 3 (virtual:clarify-page/…)\n // so both page modules and embedded components (useOpenApiSpec)\n // look up specs the same way.\n const registryEntries: Record<string, OpenAPISpec> = {}\n\n for (const route of ctx.routes) {\n if (route.kind !== 'openapi' || !route.specFileKey) continue\n const spec = specs.get(route.specFileKey)?.spec\n if (!spec) continue\n\n const base = (route.basePath ?? route.path).replace(/^\\//, '')\n\n // Always use an explicit locale-prefixed key so no two routes\n // can overwrite each other. Falls back to bare path only when\n // i18n is disabled (no locale on the route).\n const registryKey = route.locale\n ? `virtual:clarify-page/${route.locale}/${base}`\n : `virtual:clarify-page/${base}`\n registryEntries[registryKey] = spec\n }\n\n modules.set(openApiRegistryModuleId, generateOpenAPIRegistryModule(registryEntries))\n\n // ── Per-spec virtual modules (lazy-loaded by page modules at runtime) ──\n for (const [specKey, entry] of specs) {\n modules.set(specVirtualModuleId(specKey), generateOpenAPISpecModule(entry.spec))\n }\n\n // ── Per-route page modules ──\n for (const route of ctx.routes) {\n if (route.kind !== 'openapi') continue\n if (route.diagnostic) {\n modules.set(route.virtualModuleId, generateOpenAPIErrorModule(route.diagnostic))\n } else if (route.specFileKey) {\n const entry = specs.get(route.specFileKey)\n if (!entry) continue\n\n modules.set(route.virtualModuleId, generateOpenAPIPageModule({\n spec: entry.spec,\n tagFilter: route.openapiTagFilter,\n }))\n }\n }\n\n return modules\n },\n },\n }\n}\n","export function toPagefindLanguage(locale: string | undefined): string {\n const normalizedLocale = locale\n ?.trim()\n .replace(/_/g, '-')\n .split('-')\n .filter(Boolean)\n .join('-')\n // Pagefind's browser runtime lowercases the detected <html lang> value\n // before resolving the language-specific index. Keep Clarify's public\n // locale codes canonical (for example en-US / zh-CN), but use lowercase\n // BCP 47 tags internally so custom dev indexes match Pagefind runtime.\n .toLowerCase()\n\n return normalizedLocale || 'en'\n}\n","import { mkdtempSync, rmSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { join } from 'node:path'\n\nexport function createClarifyTempDir(name: string): string {\n return mkdtempSync(join(tmpdir(), `clarify-${name}-`))\n}\n\nexport function removeClarifyTempDir(path: string | undefined): void {\n if (!path) return\n rmSync(path, { recursive: true, force: true })\n}\n","import { createReadStream, existsSync } from 'node:fs'\nimport { extname, join, relative, resolve } from 'node:path'\n\nimport type { ViteDevServer } from 'vite'\n\nimport { toPagefindLanguage } from '../../core/search-language.js'\nimport { createClarifyTempDir, removeClarifyTempDir } from '../../core/temp-dir.js'\nimport type { ClarifyHookContext, ClarifyPlugin, ContentRoute } from '../../types.js'\n\ntype PagefindModule = typeof import('pagefind')\n\ntype GeneratePagefindIndexOptions = {\n outputRoot: string\n sourceRoot?: string\n}\n\nconst pagefindContentTypes: Record<string, string> = {\n '.css': 'text/css; charset=utf-8',\n '.js': 'text/javascript; charset=utf-8',\n '.json': 'application/json; charset=utf-8',\n '.wasm': 'application/wasm',\n}\n\nfunction assertNoPagefindErrors(action: string, errors: string[] | undefined): void {\n if (!errors?.length) return\n throw new Error(`[clarify] Pagefind ${action} failed:\\n${errors.join('\\n')}`)\n}\n\nasync function generatePagefindIndex(options: GeneratePagefindIndexOptions): Promise<number> {\n const pagefind = await import('pagefind') as PagefindModule\n const { errors, index } = await pagefind.createIndex({\n excludeSelectors: [\n '[data-pagefind-ignore]',\n 'script',\n 'style',\n 'svg',\n ],\n includeCharacters: '._-/#:@',\n keepIndexUrl: false,\n verbose: false,\n writePlayground: false,\n })\n\n assertNoPagefindErrors('createIndex', errors)\n if (!index) throw new Error('[clarify] Pagefind did not create an index.')\n\n try {\n const addResult = await index.addDirectory({ path: options.sourceRoot ?? options.outputRoot, glob: '**/*.html' })\n assertNoPagefindErrors('addDirectory', addResult.errors)\n\n const writeResult = await index.writeFiles({ outputPath: join(options.outputRoot, 'pagefind') })\n assertNoPagefindErrors('writeFiles', writeResult.errors)\n\n return addResult.page_count\n } finally {\n await index.deleteIndex()\n await pagefind.close()\n }\n}\n\nfunction routeSearchContent(route: ContentRoute): string {\n return [\n route.title,\n route.description,\n route.keywords?.join(' '),\n route.sections?.map(section => section.title).join(' '),\n route.content,\n ].filter(Boolean).join('\\n\\n')\n}\n\nasync function generateDevSearchIndex(ctx: ClarifyHookContext, root: string): Promise<void> {\n const pagefind = await import('pagefind') as PagefindModule\n const { errors, index } = await pagefind.createIndex({\n includeCharacters: '._-/#:@',\n keepIndexUrl: false,\n verbose: false,\n writePlayground: false,\n })\n\n assertNoPagefindErrors('createIndex', errors)\n if (!index) throw new Error('[clarify] Pagefind did not create an index.')\n\n try {\n let pageCount = 0\n for (const route of ctx.routes) {\n // Skip bare alias routes (e.g., /path) to avoid indexing duplicates in multilingual sites\n // Only index the full path with locale prefix (e.g., /locale/path)\n if (route.isBareAlias) continue\n \n const content = routeSearchContent(route)\n if (!content.trim()) continue\n const result = await index.addCustomRecord({\n url: route.path,\n content,\n language: toPagefindLanguage(route.locale ?? ctx.projectConfig.i18n?.defaultLocale),\n meta: {\n title: route.title,\n },\n })\n assertNoPagefindErrors(`addCustomRecord ${route.path}`, result.errors)\n pageCount += 1\n }\n\n const writeResult = await index.writeFiles({ outputPath: join(root, 'pagefind') })\n assertNoPagefindErrors('writeFiles', writeResult.errors)\n console.log(`[clarify] Dev search index generated for ${pageCount} pages.`)\n } finally {\n await index.deleteIndex()\n await pagefind.close()\n }\n}\n\nfunction normalizeDevPagefindPath(rawUrl: string | undefined, routePrefix: string): string | undefined {\n const pathname = rawUrl?.split('?')[0]\n if (!pathname) return undefined\n\n const normalizedPrefix = routePrefix && routePrefix !== '/' ? `/${routePrefix.replace(/^\\/+|\\/+$/g, '')}` : ''\n const pagefindPath = normalizedPrefix && pathname.startsWith(`${normalizedPrefix}/pagefind/`)\n ? pathname.slice(normalizedPrefix.length)\n : pathname\n\n return pagefindPath.startsWith('/pagefind/') ? pagefindPath : undefined\n}\n\nfunction serveDevPagefind(server: ViteDevServer, getRoot: () => string | undefined, ctx: ClarifyHookContext): void {\n server.middlewares.use((req, res, next) => {\n const root = getRoot()\n const pagefindPath = normalizeDevPagefindPath(req.url, ctx.projectConfig.routePrefix)\n if (!root || !pagefindPath) {\n next()\n return\n }\n\n const filePath = join(root, pagefindPath)\n const relativePath = relative(root, filePath)\n if (relativePath.startsWith('..') || relativePath === '' || !existsSync(filePath)) {\n next()\n return\n }\n\n const contentType = pagefindContentTypes[extname(filePath)] ?? 'application/octet-stream'\n res.setHeader('Content-Type', contentType)\n createReadStream(filePath).pipe(res)\n })\n}\n\nexport function createSearchIndexPlugin(): ClarifyPlugin {\n return {\n name: 'clarify:search-index',\n hooks: {\n async 'dev:configureServer'(server, ctx) {\n let currentRoot: string | undefined\n const staleRoots = new Set<string>()\n\n const replaceDevIndex = async () => {\n const nextRoot = createClarifyTempDir('pagefind')\n await generateDevSearchIndex(ctx, nextRoot)\n const previousRoot = currentRoot\n currentRoot = nextRoot\n if (previousRoot) {\n staleRoots.add(previousRoot)\n setTimeout(() => {\n staleRoots.delete(previousRoot)\n removeClarifyTempDir(previousRoot)\n }, 30_000).unref?.()\n }\n }\n\n serveDevPagefind(server, () => currentRoot, ctx)\n await replaceDevIndex()\n\n let regenerateTimer: ReturnType<typeof setTimeout> | undefined\n const regenerate = (filePath: string) => {\n if (!/\\.(md|mdx|json|ya?ml)$/i.test(filePath)) return\n if (regenerateTimer) clearTimeout(regenerateTimer)\n regenerateTimer = setTimeout(() => {\n void replaceDevIndex().catch((err: unknown) => {\n console.error('[clarify] Failed to regenerate dev search index:', err)\n })\n }, 100)\n }\n\n server.watcher.on('add', regenerate)\n server.watcher.on('change', regenerate)\n server.watcher.on('unlink', regenerate)\n\n server.httpServer?.once('close', () => {\n if (regenerateTimer) clearTimeout(regenerateTimer)\n removeClarifyTempDir(currentRoot)\n for (const staleRoot of staleRoots) removeClarifyTempDir(staleRoot)\n })\n },\n async 'build:done'(ctx) {\n const outputDirectory = ctx.generateOptions.outputDirectory\n if (!outputDirectory) return\n\n const outputRoot = resolve(ctx.generateOptions.projectRoot, outputDirectory)\n const pageCount = await generatePagefindIndex({ outputRoot })\n console.log(`[clarify] Search index generated for ${pageCount} pages.`)\n },\n },\n }\n}\n","import type { ContentRoute, ResolvedProjectConfig } from '../../types.js'\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, '')\n}\n\nfunction normalizeRoutePrefix(routePrefix: string): string {\n if (!routePrefix || routePrefix === '/') return ''\n return `/${routePrefix.replace(/^\\/+|\\/+$/g, '')}`\n}\n\nfunction routeUrl(siteUrl: string, routePrefix: string, routePath: string): string {\n const base = trimTrailingSlash(siteUrl)\n const prefix = normalizeRoutePrefix(routePrefix)\n const path = routePath === '/' ? '' : routePath.replace(/^\\/+/, '/')\n return `${base}${prefix}${path}` || base\n}\n\nfunction escapeXml(value: string): string {\n return value\n .replaceAll('&', '&amp;')\n .replaceAll('<', '&lt;')\n .replaceAll('>', '&gt;')\n .replaceAll('\"', '&quot;')\n .replaceAll(\"'\", '&apos;')\n}\n\nfunction publicRoutes(routes: ContentRoute[]): ContentRoute[] {\n // Exclude 404 routes and bare alias routes (e.g., /path without language prefix) in multilingual sites\n return routes.filter(route => route.path !== '/404' && !route.isBareAlias)\n}\n\nexport function createSitemapXml(routes: ContentRoute[], config: ResolvedProjectConfig): string | undefined {\n if (!config.siteUrl) return undefined\n\n const urls = publicRoutes(routes)\n .map(route => routeUrl(config.siteUrl!, config.routePrefix, route.path))\n .filter((url, index, list) => list.indexOf(url) === index)\n .sort()\n\n return [\n '<?xml version=\"1.0\" encoding=\"UTF-8\"?>',\n '<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">',\n ...urls.map(url => ` <url><loc>${escapeXml(url)}</loc></url>`),\n '</urlset>',\n '',\n ].join('\\n')\n}\n\nexport function createRobotsTxt(config: ResolvedProjectConfig): string | undefined {\n if (!config.siteUrl) return undefined\n const sitemapUrl = routeUrl(config.siteUrl, config.routePrefix, '/sitemap.xml')\n return [\n 'User-agent: *',\n 'Allow: /',\n `Sitemap: ${sitemapUrl}`,\n '',\n ].join('\\n')\n}\n","import type { ClarifyEmitAsset, ClarifyPlugin } from '../../types.js'\n\nimport { createRobotsTxt, createSitemapXml } from './artifacts.js'\n\nexport function createSeoPlugin(): ClarifyPlugin {\n return {\n name: 'clarify:seo',\n hooks: {\n 'build:assets'(ctx) {\n const sitemap = createSitemapXml(ctx.routes, ctx.projectConfig)\n const robots = createRobotsTxt(ctx.projectConfig)\n if (!sitemap || !robots) return []\n\n const assets: ClarifyEmitAsset[] = [\n { fileName: 'sitemap.xml', source: sitemap },\n { fileName: 'robots.txt', source: robots },\n ]\n return assets\n },\n },\n }\n}\n","import { relative } from 'node:path'\n\nimport type { ClarifySourceConfig, ContentRoute } from '../../types.js'\n\nfunction trimSlashes(value: string): string {\n return value.replace(/^\\/+|\\/+$/g, '')\n}\n\nfunction normalizeRepositoryUrl(repository: string): string {\n return repository.replace(/\\.git$/, '').replace(/\\/+$/, '')\n}\n\nfunction encodePath(path: string): string {\n return path\n .split('/')\n .filter(Boolean)\n .map(segment => encodeURIComponent(segment))\n .join('/')\n}\n\nexport function createSourceUrl(filePath: string, contentRoot: string, source: ClarifySourceConfig): string {\n const repository = normalizeRepositoryUrl(source.repository)\n const branch = source.branch ?? 'main'\n const directory = source.directory ? trimSlashes(source.directory) : ''\n const relativePath = relative(contentRoot, filePath).replaceAll('\\\\', '/')\n const sourcePath = [directory, relativePath].filter(Boolean).join('/')\n return `${repository}/edit/${encodeURIComponent(branch)}/${encodePath(sourcePath)}`\n}\n\nexport function attachSourceUrls(routes: ContentRoute[], contentRoot: string, source?: ClarifySourceConfig): void {\n if (!source) return\n for (const route of routes) {\n route.sourceUrl = createSourceUrl(route.filePath, contentRoot, source)\n }\n}\n","import { join } from 'node:path'\n\nimport type { ClarifyPlugin } from '../../types.js'\n\nimport { attachSourceUrls } from './source-links.js'\n\nexport function createSourceLinksPlugin(): ClarifyPlugin {\n return {\n name: 'clarify:source-links',\n hooks: {\n 'routes:discovered': (routes, ctx) => {\n const contentRoot = join(ctx.generateOptions.projectRoot, ctx.generateOptions.rootDirectory)\n attachSourceUrls(routes, contentRoot, ctx.projectConfig.source)\n return routes\n },\n },\n }\n}\n","import type { ClarifyVariablesConfig, ClarifyVariableValue } from '../types.js'\n\nconst variablePattern = /{{\\s*([A-Za-z0-9_-]+(?:\\.[A-Za-z0-9_-]+)*)\\s*}}/g\n\nfunction getVariableValue(variables: ClarifyVariablesConfig, path: string): ClarifyVariableValue | undefined {\n let current: ClarifyVariableValue | undefined = variables\n for (const segment of path.split('.')) {\n if (!current || typeof current !== 'object' || Array.isArray(current)) return undefined\n current = current[segment]\n }\n return current\n}\n\nfunction stringifyVariableValue(variables: ClarifyVariablesConfig, path: string, stack: string[]): string | undefined {\n if (stack.includes(path)) {\n throw new Error(`[clarify] variable \"${path}\" contains a circular reference: ${[...stack, path].join(' -> ')}`)\n }\n\n const value = getVariableValue(variables, path)\n if (value === undefined || typeof value === 'object') return undefined\n if (typeof value !== 'string') return String(value)\n\n return value.replace(variablePattern, (match, nestedPath: string) => stringifyVariableValue(variables, nestedPath, [...stack, path]) ?? match)\n}\n\nexport function applyVariables(content: string, variables: ClarifyVariablesConfig = {}): string {\n return content.replace(variablePattern, (match, path: string) => stringifyVariableValue(variables, path, []) ?? match)\n}\n","import { applyVariables } from '../../parsers/variables.js'\nimport type { ClarifyVariablesConfig, ClarifyPlugin } from '../../types.js'\n\nfunction applyVariablesToFrontmatter(frontmatter: Record<string, unknown>, variables: ClarifyVariablesConfig): Record<string, unknown> {\n const nextFrontmatter = { ...frontmatter }\n for (const key of ['title', 'description'] as const) {\n if (typeof nextFrontmatter[key] !== 'string') continue\n nextFrontmatter[key] = applyVariables(nextFrontmatter[key], variables)\n }\n return nextFrontmatter\n}\n\nexport function createVariablesPlugin(): ClarifyPlugin {\n return {\n name: 'clarify:variables',\n hooks: {\n 'content:transform': (input, ctx) => ({\n ...input,\n frontmatter: applyVariablesToFrontmatter(input.frontmatter, ctx.projectConfig.variables),\n content: applyVariables(input.content, ctx.projectConfig.variables),\n }),\n },\n }\n}\n","import { createContentArtifactsPlugin } from '../plugins/content-artifacts/index.js'\nimport { createHtmlShellPlugin } from '../plugins/html-shell/index.js'\nimport { createOpenAPIPlugin } from '../plugins/openapi/index.js'\nimport { createSearchIndexPlugin } from '../plugins/search-index/index.js'\nimport { createSeoPlugin } from '../plugins/seo/index.js'\nimport { createSourceLinksPlugin } from '../plugins/source-links/index.js'\nimport { createVariablesPlugin } from '../plugins/variables/index.js'\nimport type { ClarifyPlugin } from '../types.js'\n\nexport type BuiltinPluginOptions = {\n htmlShell?: boolean\n}\n\nexport function createBuiltinPlugins(options: BuiltinPluginOptions = {}): ClarifyPlugin[] {\n const plugins = [createVariablesPlugin(), createOpenAPIPlugin(), createSourceLinksPlugin(), createContentArtifactsPlugin(), createSeoPlugin(), createSearchIndexPlugin()]\n if (options.htmlShell ?? true) plugins.push(createHtmlShellPlugin())\n return plugins\n}\n","import { z } from 'zod'\n\nimport type { ClarifyVariableValue, ClarifyProjectConfig } from '../types.js'\n\nexport const clarifyLogoConfigSchema = z.union([\n z.string(),\n z.object({\n light: z.string().optional(),\n dark: z.string().optional(),\n }),\n])\n\nexport const clarifyFaviconConfigSchema = z.union([\n z.string(),\n z.object({\n light: z.string().optional(),\n dark: z.string().optional(),\n }),\n])\n\nexport const clarifyLocalizedTextSchema = z.union([\n z.string(),\n z.record(z.string(), z.string()),\n])\n\nexport const clarifyLocaleConfigSchema = z.object({\n code: z.string(),\n label: z.string(),\n dir: z.union([z.literal('ltr'), z.literal('rtl')]).optional(),\n})\n\nexport const clarifyI18nConfigSchema = z.object({\n defaultLocale: z.string().optional(),\n missing: z.union([z.literal('fallback'), z.literal('404'), z.literal('hide')]).optional(),\n locales: z.array(clarifyLocaleConfigSchema).min(1),\n}).superRefine((config, ctx) => {\n const localeCodes = new Set<string>()\n for (const [index, locale] of config.locales.entries()) {\n if (localeCodes.has(locale.code)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Duplicate locale code \"${locale.code}\"`,\n path: ['locales', index, 'code'],\n })\n }\n localeCodes.add(locale.code)\n }\n\n if (config.defaultLocale && !localeCodes.has(config.defaultLocale)) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'defaultLocale must be one of i18n.locales',\n path: ['defaultLocale'],\n })\n }\n})\n\nexport const clarifyNavbarLinkSchema = z.object({\n label: clarifyLocalizedTextSchema,\n href: z.string(),\n external: z.boolean().optional(),\n})\n\nexport const clarifyBannerConfigOptionsSchema = z.object({\n content: clarifyLocalizedTextSchema,\n dismissible: z.boolean().optional(),\n link: clarifyNavbarLinkSchema.optional(),\n}).strict()\n\nexport const clarifyBannerConfigSchema = clarifyBannerConfigOptionsSchema\n\nexport const clarifyFooterConfigSchema = z.object({\n links: z.array(clarifyNavbarLinkSchema).optional(),\n socials: z.record(z.string(), z.string()).optional(),\n copyright: clarifyLocalizedTextSchema.optional(),\n}).strict()\n\nexport const clarifyVariableValueSchema: z.ZodType<ClarifyVariableValue> = z.lazy(() => z.union([\n z.string(),\n z.number(),\n z.boolean(),\n z.record(z.string(), clarifyVariableValueSchema),\n]))\n\nexport const clarifyVariablesConfigSchema = z.record(z.string(), clarifyVariableValueSchema)\n\nexport const clarifySourceConfigSchema = z.object({\n repository: z.string(),\n branch: z.string().optional(),\n directory: z.string().optional(),\n})\n\nexport const clarifyPagesItemSchema = z.union([\n z.string(),\n z.object({\n page: z.string(),\n path: z.string().optional(),\n title: clarifyLocalizedTextSchema.optional(),\n icon: z.string().optional(),\n redirect: z.string().optional(),\n }),\n z.object({\n openapi: z.string(),\n path: z.string().optional(),\n icon: z.string().optional(),\n title: clarifyLocalizedTextSchema.optional(),\n filter: z.object({\n tags: z.array(z.string()).optional(),\n }).optional(),\n }),\n])\n\nexport const clarifyPagesGroupSchema = z.object({\n group: clarifyLocalizedTextSchema,\n icon: z.string().optional(),\n pages: z.array(clarifyPagesItemSchema),\n})\n\nexport const clarifyPagesConfigSchema = z.union([\n z.array(clarifyPagesGroupSchema),\n z.literal('FileTree'),\n])\n\nexport const clarifyTabItemSchema = z.object({\n tab: clarifyLocalizedTextSchema,\n icon: z.string().optional(),\n pages: clarifyPagesConfigSchema.optional(),\n})\n\nexport const clarifyTabsConfigSchema = z.array(clarifyTabItemSchema)\n\nexport const clarifyThemePresetSchema = z.enum(['default', 'base'])\n\nexport const clarifyThemeModeColorValueSchema = z.object({\n light: z.string().optional(),\n dark: z.string().optional(),\n})\n\nexport const clarifyThemeColorValueSchema = z.union([z.string(), clarifyThemeModeColorValueSchema])\n\nexport const clarifyThemeColorTokensConfigSchema = z.object({\n primary: clarifyThemeColorValueSchema.optional(),\n accent: clarifyThemeColorValueSchema.optional(),\n background: clarifyThemeColorValueSchema.optional(),\n foreground: clarifyThemeColorValueSchema.optional(),\n surface: clarifyThemeColorValueSchema.optional(),\n muted: clarifyThemeColorValueSchema.optional(),\n border: clarifyThemeColorValueSchema.optional(),\n codeBackground: clarifyThemeColorValueSchema.optional(),\n})\n\nexport const clarifyThemeRadiusTokensConfigSchema = z.object({\n sm: z.string().optional(),\n md: z.string().optional(),\n lg: z.string().optional(),\n xl: z.string().optional(),\n})\n\nexport const clarifyThemeTokensConfigSchema = z.object({\n colors: clarifyThemeColorTokensConfigSchema.optional(),\n radius: clarifyThemeRadiusTokensConfigSchema.optional(),\n})\n\nexport const clarifyThemeLayoutConfigSchema = z.object({\n maxWidth: z.string().optional(),\n})\n\nexport const clarifyThemeConfigSchema = z.object({\n preset: clarifyThemePresetSchema.optional(),\n tokens: clarifyThemeTokensConfigSchema.optional(),\n layout: clarifyThemeLayoutConfigSchema.optional(),\n editor: z.boolean().optional(),\n})\n\nexport const clarifyProjectConfigSchema = z.object({\n title: z.string().optional(),\n description: z.string().optional(),\n siteUrl: z.string().optional(),\n source: clarifySourceConfigSchema.optional(),\n logo: clarifyLogoConfigSchema.optional(),\n homeUrl: z.string().optional(),\n favicon: clarifyFaviconConfigSchema.optional(),\n theme: clarifyThemeConfigSchema.optional(),\n routePrefix: z.string().optional(),\n assetPrefix: z.string().optional(),\n navbar: z.object({\n links: z.array(clarifyNavbarLinkSchema).optional(),\n }).optional(),\n banner: clarifyBannerConfigSchema.optional(),\n footer: clarifyFooterConfigSchema.optional(),\n variables: clarifyVariablesConfigSchema.optional(),\n i18n: clarifyI18nConfigSchema.optional(),\n tabs: clarifyTabsConfigSchema.optional(),\n}) satisfies z.ZodType<ClarifyProjectConfig>\n\nexport type ClarifyProjectConfigInput = z.input<typeof clarifyProjectConfigSchema>\n","import { themePresets } from '@clarify-labs/renderer'\n\nimport type { ClarifyThemeConfig, ResolvedClarifyThemeConfig } from '../types.js'\n\nexport { themePresets }\n\nexport function resolveThemeConfig(theme: ClarifyThemeConfig = {}): ResolvedClarifyThemeConfig {\n const preset = theme.preset ?? 'default'\n const presetTheme = themePresets[preset] as ResolvedClarifyThemeConfig\n\n return {\n preset,\n tokens: {\n colors: {\n ...presetTheme.tokens.colors,\n ...theme.tokens?.colors,\n },\n radius: {\n ...presetTheme.tokens.radius,\n ...theme.tokens?.radius,\n },\n },\n layout: {\n ...presetTheme.layout,\n ...theme.layout,\n },\n editor: theme.editor ?? presetTheme.editor,\n }\n}\n","import type { ZodError } from 'zod'\n\nimport type { ClarifyI18nConfig, ClarifyProjectConfig, ResolvedClarifyI18nConfig, ResolvedProjectConfig } from '../types.js'\n\nimport { clarifyProjectConfigSchema } from './config-schema.js'\nimport { resolveThemeConfig } from './theme.js'\n\nfunction formatIssuePath(path: PropertyKey[]): string {\n return path.reduce<string>((result, segment) => {\n if (typeof segment === 'number') return `${result}[${segment}]`\n const key = String(segment)\n return result ? `${result}.${key}` : key\n }, '')\n}\n\nfunction formatProjectConfigError(error: ZodError): string {\n const issue = error.issues[0]\n if (!issue) return '[clarify] config is invalid'\n\n const path = formatIssuePath(issue.path)\n if (!path) return `[clarify] config must contain an object: ${issue.message}`\n\n return `[clarify] config field \"${path}\" is invalid: ${issue.message}`\n}\n\nexport function validateProjectConfig(value: unknown): ClarifyProjectConfig {\n const result = clarifyProjectConfigSchema.safeParse(value)\n if (!result.success) {\n throw new Error(formatProjectConfigError(result.error))\n }\n return result.data\n}\n\nfunction resolveI18nConfig(i18n?: ClarifyI18nConfig): ResolvedClarifyI18nConfig | undefined {\n if (!i18n) return undefined\n\n const firstLocale = i18n.locales[0]?.code\n const defaultLocale = i18n.defaultLocale ?? firstLocale\n if (!defaultLocale) return undefined\n\n return {\n defaultLocale,\n missing: i18n.missing ?? 'fallback',\n locales: i18n.locales,\n }\n}\n\nfunction resolveRoutePrefix(routePrefix?: string): string {\n const trimmed = routePrefix?.trim()\n if (!trimmed || trimmed === '/') return '/'\n\n return `/${trimmed.replace(/^\\/+|\\/+$/g, '')}/`\n}\n\nfunction resolveAssetPrefix(assetPrefix: string | undefined, routePrefix: string): string {\n const trimmed = assetPrefix?.trim()\n if (trimmed === undefined) return routePrefix\n if (trimmed === './' || trimmed === '') return trimmed || '/'\n if (!trimmed || trimmed === '/') return '/'\n if (/^[a-z][a-z\\d+.-]*:\\/\\//i.test(trimmed)) return trimmed.endsWith('/') ? trimmed : `${trimmed}/`\n if (trimmed.startsWith('./') || trimmed.startsWith('../')) return trimmed.endsWith('/') ? trimmed : `${trimmed}/`\n\n return `/${trimmed.replace(/^\\/+|\\/+$/g, '')}/`\n}\n\nexport function resolveProjectConfig(config: ClarifyProjectConfig = {}): ResolvedProjectConfig {\n const routePrefix = resolveRoutePrefix(config.routePrefix)\n\n return {\n title: config.title ?? 'Clarify Docs',\n description: config.description ?? '',\n siteUrl: config.siteUrl,\n source: config.source,\n logo: config.logo,\n homeUrl: config.homeUrl,\n favicon: config.favicon,\n routePrefix,\n assetPrefix: resolveAssetPrefix(config.assetPrefix, routePrefix),\n theme: resolveThemeConfig(config.theme),\n navbar: config.navbar,\n banner: config.banner,\n footer: config.footer,\n variables: config.variables ?? {},\n i18n: resolveI18nConfig(config.i18n),\n tabs: config.tabs,\n }\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { relative } from 'node:path'\n\nimport { basePathFromRef, localizedRoutePath, normalizePath } from '../parsers/routes.js'\nimport type { ClarifyProjectContext, ContentRoute } from '../types.js'\n\n/**\n * Dev-only HTTP endpoint that exposes the in-memory route manifest so external\n * tools (e.g. the VS Code extension) can resolve a content file path to its\n * preview URL.\n *\n * Mounted at `POST /dev/query-preview-route`:\n * - Empty body → returns the full route list (minimal fields).\n * - `{ \"file\": \"<absPath>\" }` → returns the single matching route. When the\n * project uses i18n, the route whose locale matches the file's directory is\n * preferred; otherwise the default-locale route is returned. If the file is\n * not a registered route, a best-effort preview path is derived from the\n * file path relative to the content root.\n *\n * Uses POST + JSON body (instead of GET + query string) because file paths may\n * contain characters that are awkward to encode in a URL query parameter.\n */\nexport const CLARIFY_DEV_ROUTE_ENDPOINT = '/dev/query-preview-route'\n\nexport type DevRouteEntry = {\n path: string\n filePath: string\n locale?: string\n basePath?: string\n kind: string\n title: string\n /** Whether the route was derived from the file path rather than matched in the route manifest. */\n inferred?: boolean\n}\n\nexport type DevRouteResponse = DevRouteEntry | DevRouteEntry[] | null\n\n/** Serialize a ContentRoute into the minimal shape exposed to tooling. */\nexport function toDevRouteEntry(route: ContentRoute): DevRouteEntry {\n return {\n path: route.path,\n filePath: route.filePath,\n locale: route.locale,\n basePath: route.basePath,\n kind: route.kind,\n title: route.title,\n }\n}\n\n/**\n * Resolve a single file path to its preview route.\n *\n * Selection order:\n * 1. Routes whose `filePath` exactly matches.\n * 2. Among matches, prefer the one whose `locale` matches the file's locale\n * directory (e.g. `source/zh-CN/x.mdx` → locale `zh-CN`).\n * 3. If no locale match, fall back to the default locale (if i18n is enabled)\n * or the first match.\n */\nexport function resolveRouteForFile(filePath: string, routes: ContentRoute[], defaultLocale?: string): ContentRoute | undefined {\n const matches = routes.filter(r => r.filePath === filePath)\n if (matches.length === 0) return undefined\n if (matches.length === 1) return matches[0]\n\n const fileLocale = inferLocaleFromPath(filePath)\n if (fileLocale) {\n const localeMatch = matches.find(r => r.locale === fileLocale)\n if (localeMatch) return localeMatch\n }\n\n if (defaultLocale) {\n const defaultMatch = matches.find(r => r.locale === defaultLocale)\n if (defaultMatch) return defaultMatch\n }\n\n return matches[0]\n}\n\n/**\n * Derive a best-effort preview route for a file that is not in the route\n * manifest (e.g. a draft or newly created file). The path is computed from the\n * file's location relative to the content root, following the same convention\n * as route discovery (`source/{locale}/path/index.mdx` → `/{locale}/path`).\n *\n * Returns null when the file is outside the content root or is not a\n * recognized content file type.\n */\nexport function inferRouteForFile(filePath: string, contentRoot: string, defaultLocale?: string): DevRouteEntry | null {\n const ref = relative(contentRoot, filePath)\n if (!ref || ref.startsWith('..')) return null\n\n const isMdx = /\\.mdx?$/.test(filePath)\n const isOpenApi = /\\.openapi\\.(json|ya?ml)$/.test(filePath)\n if (!isMdx && !isOpenApi) return null\n\n const segments = ref.split('/')\n const fileLocale = inferLocaleFromPath(filePath)\n const localeSegmentIndex = fileLocale ? segments.indexOf(fileLocale) : -1\n const refWithoutLocale = localeSegmentIndex >= 0 ? segments.slice(localeSegmentIndex + 1).join('/') : ref\n\n const basePath = basePathFromRef(refWithoutLocale)\n const path = fileLocale && defaultLocale\n ? localizedRoutePath(basePath, fileLocale, { defaultLocale, missing: 'fallback', locales: [] })\n : basePath\n\n const title = segments[segments.length - 1]?.replace(/\\.(mdx?|openapi\\.(json|ya?ml))$/, '') || 'Untitled'\n\n return {\n path: normalizePath(path),\n filePath,\n locale: fileLocale,\n basePath: normalizePath(basePath),\n kind: isMdx ? 'mdx' : 'openapi',\n title,\n inferred: true,\n }\n}\n\n/** Best-effort locale inference from a file path segment like `.../zh-CN/x.mdx`. */\nfunction inferLocaleFromPath(filePath: string): string | undefined {\n const segments = filePath.split('/')\n for (const segment of segments) {\n if (/^[a-z]{2,3}(-[A-Z][a-z]{3})?(-[A-Z]{2})?$/.test(segment)) {\n return segment\n }\n }\n return undefined\n}\n\n/** Read and parse the JSON body of an IncomingMessage. */\nfunction readJsonBody(req: IncomingMessage): Promise<unknown> {\n return new Promise((resolveBody, reject) => {\n const chunks: Buffer[] = []\n req.on('data', chunk => chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)))\n req.on('error', reject)\n req.on('end', () => {\n const raw = Buffer.concat(chunks).toString('utf-8').trim()\n if (!raw) return resolveBody({})\n try {\n resolveBody(JSON.parse(raw))\n } catch (err) {\n reject(err)\n }\n })\n })\n}\n\n/**\n * Handle a request to the dev route endpoint. Pure function — does not touch\n * the network directly, only reads the request body and writes to `res`.\n */\nexport async function handleDevRouteRequest(req: IncomingMessage, res: ServerResponse, routes: ContentRoute[], context: ClarifyProjectContext): Promise<void> {\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n\n let body: unknown\n try {\n body = await readJsonBody(req)\n } catch {\n res.statusCode = 400\n res.end(JSON.stringify({ error: 'Invalid JSON body' }))\n return\n }\n\n const file = typeof body === 'object' && body !== null ? (body as { file?: unknown }).file : undefined\n\n if (typeof file === 'string' && file.length > 0) {\n const route = resolveRouteForFile(file, routes, context.projectConfig.i18n?.defaultLocale)\n if (route) {\n res.end(JSON.stringify(toDevRouteEntry(route)))\n return\n }\n const inferred = inferRouteForFile(file, context.contentRoot, context.projectConfig.i18n?.defaultLocale)\n res.end(JSON.stringify(inferred))\n return\n }\n\n res.end(JSON.stringify(routes.map(toDevRouteEntry)))\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { join } from 'node:path'\n\nimport type { ClarifyPlugin } from '../types.js'\n\nconst GENERATED_FILE_NAME = 'clarify-env.d.ts'\n\n/**\n * Template for the generated `clarify-env.d.ts` file.\n * Edit this template directly if you need to change the type declarations.\n * This avoids the complexity of reading external files at runtime after bundling.\n */\nconst CLARIFY_ENV_TEMPLATE = `// This file is generated by Clarify. Do not edit it manually.\n// It provides ambient type declarations for Clarify virtual modules used in\n// plugin and slot code, so the TypeScript language service can resolve them.\n\ndeclare module 'virtual:clarify/slot' {\n import type { SlotContext } from '@clarify-labs/cli'\n\n export function useSlot(): SlotContext\n}\n`\n\nexport function generateClarifyEnvDts(_plugins: ClarifyPlugin[]): string {\n return CLARIFY_ENV_TEMPLATE\n}\n\n/**\n * Writes `clarify-env.d.ts` into the project root. Only rewrites when content\n * changes to avoid triggering unnecessary file watchers, and never overwrites a\n * user-authored file that does not carry the generated marker.\n */\nexport function writeClarifyEnvDts(projectRoot: string, plugins: ClarifyPlugin[]): void {\n const filePath = join(projectRoot, GENERATED_FILE_NAME)\n const next = generateClarifyEnvDts(plugins)\n\n if (existsSync(filePath)) {\n const current = readFileSync(filePath, 'utf-8')\n if (current === next) return\n // Guard against clobbering a hand-written file that happens to share the name.\n if (!current.startsWith('// This file is generated by Clarify.')) return\n }\n\n writeFileSync(filePath, next, 'utf-8')\n}\n","import type { ClarifyPlugin, ClarifyProjectConfig } from '../types.js'\n\nexport type ClarifyBuildOptions = ClarifyProjectConfig & {\n /** Project root directory. Defaults to the current working directory. */\n projectRoot?: string\n /** Root directory for content sources. Default: 'source' */\n rootDirectory?: string\n /** Output directory for the built docs site. When omitted, Vite's build.outDir is used. */\n outputDirectory?: string\n /** Static generation behavior. */\n ssg?: {\n /** Fail the build when SSG fails. Default: true. */\n failOnError?: boolean\n }\n\n /** Clarify plugin extensions for translation, search, and other build-time features. */\n plugins?: ClarifyPlugin[]\n}\n\nexport type ResolvedBuildOptions = {\n projectRoot: string\n rootDirectory: string\n outputDirectory?: string\n ssg: {\n failOnError: boolean\n }\n}\n\nexport function resolveBuildOptions(options: ClarifyBuildOptions = {}): ResolvedBuildOptions {\n return {\n projectRoot: options.projectRoot ?? process.cwd(),\n rootDirectory: options.rootDirectory ?? 'source',\n outputDirectory: options.outputDirectory,\n ssg: {\n failOnError: options.ssg?.failOnError ?? true,\n },\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport { loadConfigFromFile } from 'vite'\nimport type { ConfigEnv } from 'vite'\n\nimport type { ClarifyProjectConfig } from '../types.js'\n\nimport { validateProjectConfig } from './config.js'\nimport type { ClarifyBuildOptions } from './options.js'\n\nexport type ClarifyConfig = ClarifyProjectConfig & Pick<ClarifyBuildOptions, 'plugins' | 'ssg'>\n\nexport function defineConfig(config: ClarifyConfig): ClarifyConfig {\n validateProjectConfig(config)\n return config\n}\n\n/**\n * Config filenames Clarify CLI looks for at the project root, in resolution\n * order. Exported so other modules (e.g. the dev `project-info` endpoint) can\n * surface the same list to tooling without duplicating it.\n */\nexport const CONFIG_FILENAMES = [\n 'clarify.ts',\n 'clarify.js',\n 'clarify.json',\n] as const\n\nexport function findClarifyConfigFile(root: string): string | undefined {\n for (const filename of CONFIG_FILENAMES) {\n const filePath = resolve(root, filename)\n if (existsSync(filePath)) return filePath\n }\n return undefined\n}\n\nfunction assertConfigObject(config: unknown, configFile: string): Record<string, unknown> {\n if (!config || typeof config !== 'object' || Array.isArray(config)) {\n throw new Error(`[clarify] ${configFile} must export a configuration object`)\n }\n return config as Record<string, unknown>\n}\n\nfunction loadJsonConfig(configFile: string): ClarifyConfig {\n const config = assertConfigObject(JSON.parse(readFileSync(configFile, 'utf-8')), configFile)\n const projectConfig = validateProjectConfig(config)\n const ssg = config.ssg && typeof config.ssg === 'object' && !Array.isArray(config.ssg)\n ? config.ssg as ClarifyConfig['ssg']\n : undefined\n return {\n ...projectConfig,\n ...(ssg ? { ssg } : {}),\n }\n}\n\nexport async function loadClarifyConfig(root: string, env: ConfigEnv): Promise<ClarifyConfig> {\n const configFile = findClarifyConfigFile(root)\n if (!configFile) return {}\n\n if (configFile.endsWith('.json')) {\n return loadJsonConfig(configFile)\n }\n\n const loaded = await loadConfigFromFile(env, configFile, root, 'silent')\n const config = assertConfigObject(loaded?.config, configFile)\n return config as ClarifyConfig\n}\n","import { existsSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport type { ConfigEnv } from 'vite'\n\nimport { cliPackageVersion } from '../cli/package.js'\nimport type { ClarifyHookContext, ClarifyProjectContext } from '../types.js'\n\nimport { resolveProjectConfig } from './config.js'\nimport { resolveBuildOptions, type ClarifyBuildOptions, type ResolvedBuildOptions } from './options.js'\nimport { findClarifyConfigFile, loadClarifyConfig, type ClarifyConfig } from './user-config.js'\n\nexport type ResolvedProjectContext = {\n projectRoot: string\n contentRoot: string\n configFilePath?: string\n projectConfig: ReturnType<typeof resolveProjectConfig>\n buildOptions: ResolvedBuildOptions\n config: ClarifyConfig\n hookContext: ClarifyHookContext\n projectContext: ClarifyProjectContext\n}\n\nexport async function resolveProjectContext(options: ClarifyBuildOptions = {}, env: ConfigEnv = { command: 'build', mode: 'production' }): Promise<ResolvedProjectContext> {\n const projectRoot = resolve(options.projectRoot ?? process.cwd())\n const initialBuildOptions = resolveBuildOptions(options)\n const contentRoot = join(projectRoot, initialBuildOptions.rootDirectory)\n const configFilePath = findClarifyConfigFile(projectRoot)\n const config = configFilePath && existsSync(configFilePath)\n ? await loadClarifyConfig(projectRoot, env)\n : {}\n\n const mergedOptions: ClarifyBuildOptions = {\n ...config,\n ...options,\n projectRoot,\n rootDirectory: initialBuildOptions.rootDirectory,\n outputDirectory: initialBuildOptions.outputDirectory,\n }\n const resolvedProjectConfig = resolveProjectConfig(mergedOptions)\n const resolvedBuildOptions = resolveBuildOptions(mergedOptions)\n\n const projectContext: ClarifyProjectContext = {\n projectRoot,\n contentRoot,\n version: cliPackageVersion,\n projectConfig: resolvedProjectConfig,\n generateOptions: resolvedBuildOptions,\n }\n\n const hookContext: ClarifyHookContext = {\n ...projectContext,\n routes: [],\n navigation: [],\n }\n\n return {\n projectRoot,\n contentRoot,\n configFilePath,\n projectConfig: resolvedProjectConfig,\n buildOptions: resolvedBuildOptions,\n config,\n hookContext,\n projectContext,\n }\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\n\nimport type { ClarifyProjectContext } from '../types.js'\n\nimport { CONFIG_FILENAMES } from './user-config.js'\n\n/**\n * Dev-only HTTP endpoint that exposes project metadata so external tooling\n * (e.g. the VS Code extension) can discover which files Clarify recognizes\n * without hardcoding conventions that may drift between CLI versions.\n *\n * Mounted at `GET /dev/project-info`. Returns a JSON object describing:\n * - `configFilenames`: config files Clarify looks for at the project root.\n * - `contentFileExtensions`: file extensions treated as content files.\n * - `contentRoot`: the resolved content root directory name (relative to\n * the project root, e.g. `\"source\"`).\n * - `projectRoot`: the absolute project root path.\n * - `i18n`: locale information when internationalization is configured.\n */\nexport const CLARIFY_DEV_PROJECT_INFO_ENDPOINT = '/dev/project-info'\n\n/**\n * File extensions Clarify treats as content files. Kept in sync with the\n * patterns used by route discovery in `parsers/routes.ts` and the OpenAPI\n * page generator. Exposed to tooling so the extension's \"is this a content\n * file?\" check stays accurate without duplicating the regex.\n */\nexport const CONTENT_FILE_EXTENSIONS = [\n '.md',\n '.mdx',\n '.openapi.json',\n '.openapi.yaml',\n '.openapi.yml',\n] as const\n\nexport type ProjectInfoResponse = {\n configFilenames: readonly string[]\n contentFileExtensions: readonly string[]\n contentRoot: string\n projectRoot: string\n i18n?: {\n defaultLocale: string\n locales: string[]\n }\n}\n\n/**\n * Build the project-info response payload from the resolved plugin state.\n */\nexport function buildProjectInfo(context: ClarifyProjectContext): ProjectInfoResponse {\n const { projectRoot, contentRoot, projectConfig } = context\n // `contentRoot` is an absolute path (join(root, rootDirectory)); expose the\n // relative directory name so tooling can reason about file locations\n // without assuming a specific absolute path.\n const contentRootName = contentRoot.startsWith(projectRoot)\n ? contentRoot.slice(projectRoot.length).replace(/^[/\\\\]+/, '')\n : contentRoot\n\n const response: ProjectInfoResponse = {\n configFilenames: CONFIG_FILENAMES,\n contentFileExtensions: CONTENT_FILE_EXTENSIONS,\n contentRoot: contentRootName || 'source',\n projectRoot,\n }\n\n if (projectConfig.i18n) {\n response.i18n = {\n defaultLocale: projectConfig.i18n.defaultLocale,\n locales: projectConfig.i18n.locales.map(l => l.code),\n }\n }\n\n return response\n}\n\n/**\n * Handle a request to the project-info endpoint. Responds to any method\n * (GET is typical) with the JSON payload — there is no request body to parse.\n */\nexport function handleProjectInfoRequest(_req: IncomingMessage, res: ServerResponse, context: ClarifyProjectContext): void {\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(buildProjectInfo(context)))\n}\n","import { join, relative } from 'node:path'\n\nimport { applyConfiguredPageRoutePaths, buildLocalizedNavigationFromTabsConfig, buildNavigation, buildNavigationFromTabsConfig, findContentRoutes, localizedRoutePath, virtualModuleIdFromRef, withAlternates } from '../parsers/routes.js'\nimport type { ClarifyHookContext, ClarifyPlugin, ContentRoute, NavigationTree } from '../types.js'\n\nimport { createBuiltinPlugins } from './builtin.js'\nimport { createProjectContentProcessor, getProjectContentProcessor, setProjectContentProcessor } from './content.js'\nimport { runHooks } from './hooks.js'\nimport type { ClarifyBuildOptions, ResolvedBuildOptions } from './options.js'\nimport { resolveProjectContext } from './project-context.js'\n\nexport type ResolvedClarifySite = {\n root: string\n contentRoot: string\n projectConfig: Awaited<ReturnType<typeof resolveProjectContext>>['projectConfig']\n generateOptions: ResolvedBuildOptions\n plugins: ClarifyPlugin[]\n ctx: ClarifyHookContext\n routes: ContentRoute[]\n navigation: NavigationTree\n}\n\nexport type ResolveClarifySiteOptions = {\n includeHtmlShellPlugin?: boolean\n}\n\nasync function discoverRoutesForRoot(routeRoot: string, locale: string | undefined, plugins: ClarifyPlugin[], ctx: ClarifyHookContext): Promise<ContentRoute[]> {\n const discovered = await runHooks(plugins, 'routes:discover', {\n contentRoot: routeRoot,\n locale,\n routes: await findContentRoutes(routeRoot, routeRoot, { contentProcessor: getProjectContentProcessor(ctx) }),\n }, ctx)\n return discovered.routes\n}\n\nasync function discoverRoutes(root: string, contentRoot: string, plugins: ClarifyPlugin[], ctx: ClarifyHookContext): Promise<ContentRoute[]> {\n const i18n = ctx.projectConfig.i18n\n if (!i18n) return discoverRoutesForRoot(contentRoot, undefined, plugins, ctx)\n\n const localizedRoutes: ContentRoute[] = []\n for (const locale of i18n.locales) {\n const localeRoot = join(contentRoot, locale.code)\n const discovered = await discoverRoutesForRoot(localeRoot, locale.code, plugins, ctx)\n for (const route of discovered) {\n const basePath = route.basePath ?? route.path\n localizedRoutes.push({\n ...route,\n path: localizedRoutePath(basePath, locale.code, i18n),\n basePath,\n locale: locale.code,\n virtualModuleId: virtualModuleIdFromRef(relative(contentRoot, route.filePath)),\n })\n }\n }\n\n if (i18n.missing === 'fallback') {\n const routeByLocaleAndBase = new Map(localizedRoutes.map(route => [`${route.locale ?? ''}:${route.basePath ?? route.path}`, route]))\n const defaultRoutes = localizedRoutes.filter(route => route.locale === i18n.defaultLocale)\n for (const sourceRoute of defaultRoutes) {\n const basePath = sourceRoute.basePath ?? sourceRoute.path\n for (const locale of i18n.locales) {\n const key = `${locale.code}:${basePath}`\n if (routeByLocaleAndBase.has(key)) continue\n localizedRoutes.push({\n ...sourceRoute,\n path: localizedRoutePath(basePath, locale.code, i18n),\n locale: locale.code,\n isFallback: true,\n })\n }\n }\n }\n\n const routesWithAlternates = localizedRoutes.map(route => withAlternates(route, localizedRoutes, i18n))\n\n // 为默认语言生成无前缀的裸路径别名 (/example),方便不带语言前缀的 URL 也能访问\n // 标记这些别名路由,以便搜索索引生成时过滤它们,避免重复索引\n const defaultLocale = i18n.defaultLocale\n const bareRoutes: ContentRoute[] = []\n const seenBare = new Set(routesWithAlternates.map(r => r.path))\n for (const route of routesWithAlternates) {\n if (route.locale !== defaultLocale) continue\n const bp = route.basePath ?? route.path\n if (bp === route.path || seenBare.has(bp)) continue\n seenBare.add(bp)\n bareRoutes.push({ ...route, path: bp, isBareAlias: true })\n }\n\n return [...routesWithAlternates, ...bareRoutes]\n}\n\nexport async function resolveClarifySite(options: ClarifyBuildOptions = {}, resolveOptions: ResolveClarifySiteOptions = {}): Promise<ResolvedClarifySite> {\n const context = await resolveProjectContext(options)\n const root = context.projectRoot\n const projectConfig = context.projectConfig\n const generateOptions = context.buildOptions\n const contentRoot = context.contentRoot\n const plugins = [...createBuiltinPlugins({ htmlShell: resolveOptions.includeHtmlShellPlugin }), ...(options.plugins ?? [])]\n const ctx: ClarifyHookContext = {\n ...context.hookContext,\n projectRoot: root,\n contentRoot,\n projectConfig,\n generateOptions,\n }\n setProjectContentProcessor(ctx, createProjectContentProcessor(plugins, ctx))\n\n let routes = await discoverRoutes(root, contentRoot, plugins, ctx)\n routes = await runHooks(plugins, 'routes:discovered', routes, ctx)\n routes = applyConfiguredPageRoutePaths(routes, projectConfig.tabs, projectConfig.i18n)\n\n const defaultNavigation = projectConfig.tabs\n ? projectConfig.i18n\n ? (buildLocalizedNavigationFromTabsConfig(routes, projectConfig.tabs, projectConfig.i18n) ?? {})\n : buildNavigationFromTabsConfig(routes, projectConfig.tabs)\n : buildNavigation(routes)\n const resolved = await runHooks(plugins, 'routes:resolved', { routes, navigation: defaultNavigation }, ctx)\n routes = resolved.routes\n const navigation = resolved.navigation\n ctx.routes = routes\n ctx.navigation = navigation\n\n return {\n root,\n contentRoot,\n projectConfig,\n generateOptions,\n plugins,\n ctx,\n routes,\n navigation,\n }\n}\n","import { readFileSync } from 'node:fs'\nimport { createRequire } from 'node:module'\nimport { dirname, join } from 'node:path'\n\nimport type { AliasOptions } from 'vite'\n\nconst requireFromCli = createRequire(import.meta.url)\n\nfunction resolveCliDependency(id: string): string {\n return requireFromCli.resolve(id)\n}\n\nfunction resolvePackageExport(packageName: string, subpath: string, condition: 'import' | 'require' = 'import'): string {\n const packageJsonPath = requireFromCli.resolve(`${packageName}/package.json`)\n const packageRoot = dirname(packageJsonPath)\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf-8')) as {\n exports?: Record<string, string | Record<string, string>>\n }\n const exportKey = subpath ? `./${subpath}` : '.'\n const exportEntry = packageJson.exports?.[exportKey]\n const target = typeof exportEntry === 'string'\n ? exportEntry\n : exportEntry?.[condition] ?? exportEntry?.default\n\n if (!target) {\n throw new Error(`[clarify] Unable to resolve ${packageName}/${subpath}`)\n }\n\n return join(packageRoot, target)\n}\n\n/**\n * Resolve Clarify's framework/runtime dependencies from the CLI package instead\n * of from the user's documentation project. This keeps content-only projects\n * free from React, renderer, and tsconfig requirements.\n */\nexport function createClarifyRuntimeAliases(): AliasOptions {\n return [\n { find: /^@clarify-labs\\/renderer\\/style\\.css$/, replacement: resolvePackageExport('@clarify-labs/renderer', 'style.css') },\n { find: /^@clarify-labs\\/renderer\\/client$/, replacement: resolvePackageExport('@clarify-labs/renderer', 'client') },\n { find: /^@clarify-labs\\/renderer\\/server$/, replacement: resolvePackageExport('@clarify-labs/renderer', 'server') },\n { find: /^@clarify-labs\\/renderer$/, replacement: resolvePackageExport('@clarify-labs/renderer', '') },\n { find: /^react\\/jsx-dev-runtime$/, replacement: resolveCliDependency('react/jsx-dev-runtime') },\n { find: /^react\\/jsx-runtime$/, replacement: resolveCliDependency('react/jsx-runtime') },\n { find: /^mermaid$/, replacement: resolveCliDependency('mermaid') },\n { find: /^react-zoom-pan-pinch$/, replacement: resolveCliDependency('react-zoom-pan-pinch') },\n { find: /^react$/, replacement: resolveCliDependency('react') },\n ]\n}\n","import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { join, dirname } from 'node:path'\nimport { pathToFileURL } from 'node:url'\n\nimport { build } from 'vite'\nimport type { Plugin } from 'vite'\n\nimport type { ClarifyProjectContext, ContentRoute, ResolvedProjectConfig } from '../types.js'\n\nimport { createClarifyRuntimeAliases } from './runtime-deps.js'\nimport { createClarifyTempDir } from './temp-dir.js'\nimport { escapeHtml } from './utils.js'\n\nexport function readIndexHtml(outputDirectory: string): string | undefined {\n const indexPath = join(outputDirectory, 'index.html')\n if (!existsSync(indexPath)) return undefined\n try {\n return readFileSync(indexPath, 'utf-8')\n } catch {\n return undefined\n }\n}\n\nfunction resolveProjectConfigFromContext(contextOrConfig: ClarifyProjectContext | ResolvedProjectConfig): ResolvedProjectConfig {\n return 'projectConfig' in contextOrConfig ? contextOrConfig.projectConfig : contextOrConfig\n}\n\nfunction injectHtmlLocaleAttributes(html: string, contextOrConfig: ClarifyProjectContext | ResolvedProjectConfig, route?: ContentRoute): string {\n const projectConfig = resolveProjectConfigFromContext(contextOrConfig)\n const localeCode = route?.locale ?? projectConfig.i18n?.defaultLocale\n if (!localeCode) return html\n\n const localeConfig = projectConfig.i18n?.locales.find(locale => locale.code === localeCode)\n const dir = localeConfig?.dir\n\n return html.replace(/<html\\b([^>]*)>/i, (_match, attributes: string) => {\n let nextAttributes = attributes\n .replace(/\\s+lang=(\"[^\"]*\"|'[^']*'|[^\\s>]*)/i, '')\n .replace(/\\s+dir=(\"[^\"]*\"|'[^']*'|[^\\s>]*)/i, '')\n\n nextAttributes = `${nextAttributes} lang=\"${escapeHtml(localeCode)}\"`\n if (dir) nextAttributes = `${nextAttributes} dir=\"${escapeHtml(dir)}\"`\n return `<html${nextAttributes}>`\n })\n}\n\nfunction routeTitle(contextOrConfig: ClarifyProjectContext | ResolvedProjectConfig, route?: ContentRoute): string {\n const projectConfig = resolveProjectConfigFromContext(contextOrConfig)\n const title = route?.title?.trim()\n if (!title || title === projectConfig.title) return projectConfig.title\n return `${title} - ${projectConfig.title}`\n}\n\nfunction setNamedMeta(html: string, name: string, content: string | undefined): string {\n const metaPattern = new RegExp(`<meta\\\\b(?=[^>]*\\\\bname=[\"']${name}[\"'])[^>]*>\\\\n?`, 'i')\n if (!content) return html.replace(metaPattern, '')\n\n const meta = `<meta name=\"${name}\" content=\"${escapeHtml(content)}\" />`\n if (metaPattern.test(html)) return html.replace(metaPattern, meta)\n return html.replace('</head>', ` ${meta}\\n </head>`)\n}\n\nfunction canonicalUrl(contextOrConfig: ClarifyProjectContext | ResolvedProjectConfig, route: ContentRoute): string | undefined {\n const projectConfig = resolveProjectConfigFromContext(contextOrConfig)\n if (!projectConfig.siteUrl || !route.alternates || !route.locale) return undefined\n const prefixedPath = route.alternates[route.locale]\n if (!prefixedPath || prefixedPath === route.path) return undefined\n\n const base = projectConfig.siteUrl.replace(/\\/+$/, '')\n const prefix = (!projectConfig.routePrefix || projectConfig.routePrefix === '/')\n ? ''\n : `/${projectConfig.routePrefix.replace(/^\\/+|\\/+$/g, '')}`\n return `${base}${prefix}${prefixedPath}`\n}\n\nfunction injectCanonicalUrl(html: string, contextOrConfig: ClarifyProjectContext | ResolvedProjectConfig, route?: ContentRoute): string {\n const url = route ? canonicalUrl(contextOrConfig, route) : undefined\n // Remove any existing canonical link\n html = html.replace(/<link\\b[^>]*\\brel=[\"']canonical[\"'][^>]*\\/?>\\n?/gi, '')\n if (!url) return html\n return html.replace('</head>', ` <link rel=\"canonical\" href=\"${escapeHtml(url)}\" />\\n </head>`)\n}\n\nexport function injectSSRIntoTemplate(template: string, appHtml: string, contextOrConfig: ClarifyProjectContext | ResolvedProjectConfig, route?: ContentRoute): string {\n const projectConfig = resolveProjectConfigFromContext(contextOrConfig)\n let html = injectHtmlLocaleAttributes(template, contextOrConfig, route)\n\n // Replace <title>...</title>\n html = html.replace(/<title>.*?<\\/title>/, `<title>${escapeHtml(routeTitle(contextOrConfig, route))}</title>`)\n\n html = setNamedMeta(html, 'description', route?.description ?? projectConfig.description)\n html = setNamedMeta(html, 'keywords', route?.keywords?.join(', '))\n html = injectCanonicalUrl(html, contextOrConfig, route)\n\n // Replace <div id=\"root\">...</div> with SSR rendered content\n // For bare alias routes (e.g., /path) in multilingual sites, mark the root div\n // with data-pagefind-ignore to prevent Pagefind from indexing duplicates\n const dataPagefindIgnore = route?.isBareAlias ? ' data-pagefind-ignore' : ''\n html = html.replace(/<div id=\"root\">([\\s\\S]*?)<\\/div>/, `<div id=\"root\"${dataPagefindIgnore}>${appHtml}</div>`)\n\n return html\n}\n\nexport function isNotFoundRoute(route: ContentRoute): boolean {\n return (route.basePath ?? route.path) === '/404'\n}\n\nexport function routeOutputFiles(outputDirectory: string, route: ContentRoute): string[] {\n const files = [join(outputDirectory, route.path, 'index.html')]\n if (isNotFoundRoute(route) && (!route.locale || route.path === '/404')) {\n files.push(join(outputDirectory, '404.html'))\n }\n return files\n}\n\nexport const SSR_ENTRY_CODE = `import { renderToHTML } from '@clarify-labs/renderer/server';\nimport { routes, navigation } from 'virtual:clarify/routes/server';\nimport { config } from 'virtual:clarify/config';\nimport { openApis } from 'virtual:clarify/openapi';\nimport { runtimeSlots } from 'virtual:clarify/slots';\n\nexport async function render(url) {\n // Pre-resolve every slot component factory so renderToString can use\n // them synchronously (renderToString has no Suspense support).\n const entries = Object.values(runtimeSlots).flat()\n await Promise.all(entries.map(async (entry) => {\n const mod = await entry.component()\n entry._resolved = mod.default\n }))\n return renderToHTML({ config, routes, navigation, openApis, runtimeSlots, url, themeEditor: config.theme.editor });\n}`\n\nexport function createTempEntryFile(content: string): string {\n const tempDir = createClarifyTempDir('ssr')\n const entryPath = join(tempDir, 'entry-server.ts')\n writeFileSync(entryPath, content, 'utf-8')\n return entryPath\n}\n\nexport async function buildSSRBundle(root: string, ssrEntry: string, ssrOutDir: string, plugins: Plugin[]): Promise<void> {\n await build({\n root,\n configFile: false,\n resolve: {\n alias: createClarifyRuntimeAliases(),\n },\n ssr: {\n noExternal: true,\n },\n plugins,\n build: {\n ssr: ssrEntry,\n outDir: ssrOutDir,\n emptyOutDir: true,\n rolldownOptions: {\n input: ssrEntry,\n checks: {\n pluginTimings: false,\n },\n },\n },\n })\n}\n\nexport async function renderSSGRoutes(routes: ContentRoute[], contextOrConfig: ClarifyProjectContext | ResolvedProjectConfig, outputDirectory: string, ssrBundlePath: string, failOnError: boolean = true): Promise<void> {\n const { render } = await import(pathToFileURL(ssrBundlePath).href)\n\n const template = readIndexHtml(outputDirectory)\n if (!template) {\n throw new Error(\n `[clarify] index.html not found in outputDirectory \"${outputDirectory}\". Make sure Vite build produces it.`\n )\n }\n\n for (const route of routes) {\n try {\n const appHtml = await render(route.path)\n const finalHtml = injectSSRIntoTemplate(template, appHtml, contextOrConfig, route)\n\n for (const outFile of routeOutputFiles(outputDirectory, route)) {\n mkdirSync(dirname(outFile), { recursive: true })\n writeFileSync(outFile, finalHtml, 'utf-8')\n }\n } catch (err) {\n console.error(`[clarify] Failed to render route \"${route.path}\":`, err)\n if (failOnError) {\n throw err\n }\n }\n }\n}\n","import { relative } from 'node:path'\n\nexport type StartupHintOptions = {\n projectRoot: string\n contentRoot: string\n contentDirExists: boolean\n hasRoutes: boolean\n}\n\nfunction contentDirectoryLabel(projectRoot: string, contentRoot: string): string {\n const relativePath = relative(projectRoot, contentRoot)\n return relativePath && relativePath !== '.' ? relativePath : 'source'\n}\n\nfunction contentFileExampleLabel(projectRoot: string, contentRoot: string): string {\n const label = contentDirectoryLabel(projectRoot, contentRoot)\n return label === '.' ? 'index.mdx' : `${label}/index.mdx`\n}\n\nexport function getStartupHints(options: StartupHintOptions): string[] {\n const hints: string[] = []\n\n if (!options.contentDirExists) {\n const label = contentDirectoryLabel(options.projectRoot, options.contentRoot)\n hints.push(`Content directory \"${label}\" was not found. Create it or pass --content <dir> to point Clarify at a different directory.`)\n } else if (!options.hasRoutes) {\n const example = contentFileExampleLabel(options.projectRoot, options.contentRoot)\n hints.push(`No content pages were found yet. Add ${example} to get started.`)\n }\n\n return hints\n}\n\nexport function logStartupHints(options: StartupHintOptions): void {\n const hints = getStartupHints(options)\n if (hints.length === 0) return\n\n const message = hints.map(hint => `[clarify] ${hint}`).join('\\n')\n console.warn(message)\n}\n","import { existsSync, rmSync } from 'node:fs'\nimport { isAbsolute, join, relative, resolve } from 'node:path'\n\nimport mdxPlugin, { type Options as MdxPluginOptions } from '@mdx-js/rollup'\nimport tailwindcss from '@tailwindcss/vite'\nimport react from '@vitejs/plugin-react'\nimport type { Plugin, ResolvedConfig, ViteDevServer } from 'vite'\n\nimport { cliPackageVersion } from '../cli/package.js'\nimport { rehypePlugins, remarkPlugins } from '../parsers/mdx.js'\nimport type { ClarifyHookContext, ClarifyPlugin, ContentRoute, NavigationTree } from '../types.js'\n\nimport { createBuiltinPlugins } from './builtin.js'\nimport { resolveProjectConfig } from './config.js'\nimport { CLARIFY_DEV_ROUTE_ENDPOINT, handleDevRouteRequest } from './dev-routes.js'\nimport { writeClarifyEnvDts } from './env-types.js'\nimport { runBuildAssetsHooks, runBuildDoneHooks, runDevConfigureServerHooks, runHooks } from './hooks.js'\nimport { resolveBuildOptions, type ClarifyBuildOptions } from './options.js'\nimport { resolveProjectContext } from './project-context.js'\nimport { CLARIFY_DEV_PROJECT_INFO_ENDPOINT, handleProjectInfoRequest } from './project-info.js'\nimport { resolveClarifySite } from './site.js'\nimport {\n SSR_ENTRY_CODE,\n createTempEntryFile,\n buildSSRBundle,\n renderSSGRoutes,\n} from './ssg.js'\nimport { logStartupHints } from './startup.js'\nimport { findClarifyConfigFile } from './user-config.js'\nimport {\n RESOLVED_CLIENT_ENTRY,\n VIRTUAL_CLIENT_ENTRY,\n VIRTUAL_CONFIG,\n VIRTUAL_ROUTES,\n VIRTUAL_SERVER_ROUTES,\n VIRTUAL_OPENAPI,\n VIRTUAL_SLOTS,\n VIRTUAL_SLOT,\n buildVirtualModules,\n resolveVirtualId,\n stripVirtualPrefix,\n type VirtualModules,\n} from './virtual-modules.js'\n\nfunction loadVirtualModule(id: string, modules: VirtualModules): string | null {\n const bareId = stripVirtualPrefix(id)\n return modules.get(bareId) ?? modules.get(id) ?? null\n}\n\nexport function clarifyPlugin(options: ClarifyBuildOptions = {}): Plugin[] {\n const root = resolve(options.projectRoot ?? process.cwd())\n let projectConfig = resolveProjectConfig(options)\n let generateOptions = resolveBuildOptions(options)\n let contentRoot = join(root, generateOptions.rootDirectory)\n let runtimeContext = { projectRoot: root, contentRoot, projectConfig, generateOptions, version: cliPackageVersion }\n const configFilePath = findClarifyConfigFile(root)\n let routes: ContentRoute[] = []\n\n let clarifyPlugins: ClarifyPlugin[] = [...createBuiltinPlugins(), ...(options.plugins ?? [])]\n const ctx: ClarifyHookContext = {\n projectRoot: root,\n contentRoot,\n projectConfig,\n generateOptions,\n version: cliPackageVersion,\n routes,\n navigation: [],\n }\n let viteConfig: ResolvedConfig\n let resolvedNavigation: NavigationTree = []\n let virtualModules: VirtualModules = new Map()\n\n async function resolveRoutesAndSpecs(overrides?: ClarifyBuildOptions) {\n const site = await resolveClarifySite(overrides ?? options)\n projectConfig = site.projectConfig\n generateOptions = site.generateOptions\n contentRoot = join(root, generateOptions.rootDirectory)\n runtimeContext = { projectRoot: root, contentRoot, projectConfig, generateOptions, version: cliPackageVersion }\n routes = site.routes\n resolvedNavigation = site.navigation\n clarifyPlugins = site.plugins\n ctx.projectRoot = root\n ctx.contentRoot = contentRoot\n ctx.projectConfig = projectConfig\n ctx.generateOptions = generateOptions\n ctx.version = cliPackageVersion\n ctx.routes = routes\n ctx.navigation = resolvedNavigation\n }\n\n async function rebuildVirtualModules() {\n virtualModules = buildVirtualModules({\n projectConfig,\n generateOptions,\n routes,\n navigation: resolvedNavigation,\n plugins: clarifyPlugins,\n themeEditor: viteConfig.command === 'serve' || projectConfig.theme.editor,\n version: ctx.version,\n })\n virtualModules = await runHooks(clarifyPlugins, 'modules:before', virtualModules, ctx)\n }\n\n function invalidateVirtualModules(server: ViteDevServer) {\n for (const id of virtualModules.keys()) {\n const moduleNode = server.moduleGraph.getModuleById(resolveVirtualId(id))\n if (moduleNode) server.moduleGraph.invalidateModule(moduleNode)\n }\n }\n\n async function refreshDevServer(server: ViteDevServer) {\n await resolveRoutesAndSpecs()\n await rebuildVirtualModules()\n invalidateVirtualModules(server)\n server.ws.send({ type: 'full-reload' })\n }\n\n function hasContentRouteForFile(filePath: string): boolean {\n return routes.some(route => route.filePath === filePath)\n }\n\n const normalizedMdxContentPlugin: Plugin = {\n name: 'clarify:normalized-mdx-content',\n enforce: 'pre',\n transform(_code, id) {\n if (!/\\.mdx?(?:\\?|$)/.test(id)) return null\n const filePath = id.replace(/\\?.*$/, '')\n const route = routes.find(route => route.kind === 'mdx' && route.filePath === filePath)\n if (!route || route.content === undefined) return null\n return { code: route.content, map: null }\n },\n }\n\n const mdx = mdxPlugin({\n include: ['**/*.{md,mdx}'],\n jsxImportSource: 'react',\n providerImportSource: '@clarify-labs/renderer',\n remarkPlugins: remarkPlugins as MdxPluginOptions['remarkPlugins'],\n rehypePlugins,\n })\n\n const clarifyCorePlugin: Plugin = {\n name: 'clarify:core',\n async config() {\n await resolveRoutesAndSpecs()\n logStartupHints({\n projectRoot: root,\n contentRoot,\n contentDirExists: existsSync(contentRoot),\n hasRoutes: routes.length > 0,\n })\n\n return {\n base: projectConfig.assetPrefix,\n build: {\n ...(generateOptions.outputDirectory ? { outDir: generateOptions.outputDirectory } : {}),\n manifest: true,\n },\n }\n },\n configResolved(config) {\n viteConfig = config\n // If user didn't specify outputDirectory, read it from Vite's resolved config\n if (!generateOptions.outputDirectory) {\n generateOptions.outputDirectory = config.build.outDir\n }\n },\n async buildStart() {\n await rebuildVirtualModules()\n writeClarifyEnvDts(root, clarifyPlugins)\n },\n async handleHotUpdate(ctx) {\n const changedFile = isAbsolute(ctx.file) ? ctx.file : join(root, ctx.file)\n if (configFilePath && changedFile === configFilePath) {\n const newContext = await resolveProjectContext({\n ...options,\n projectRoot: root,\n rootDirectory: options.rootDirectory,\n outputDirectory: options.outputDirectory,\n }, { command: 'serve', mode: viteConfig.mode })\n projectConfig = newContext.projectConfig\n generateOptions = newContext.buildOptions\n contentRoot = newContext.contentRoot\n await resolveRoutesAndSpecs({\n ...newContext.config,\n projectRoot: newContext.projectRoot,\n rootDirectory: newContext.buildOptions.rootDirectory,\n outputDirectory: newContext.buildOptions.outputDirectory,\n })\n await rebuildVirtualModules()\n invalidateVirtualModules(ctx.server)\n ctx.server.ws.send({ type: 'full-reload' })\n return []\n }\n\n const relativeContentFile = relative(contentRoot, changedFile)\n const isContentFile = relativeContentFile && !relativeContentFile.startsWith('..') && !isAbsolute(relativeContentFile)\n if (!isContentFile || !hasContentRouteForFile(changedFile)) return\n\n await refreshDevServer(ctx.server)\n return []\n },\n resolveId(id) {\n if (id === VIRTUAL_CLIENT_ENTRY || id === RESOLVED_CLIENT_ENTRY) return RESOLVED_CLIENT_ENTRY\n if (id === VIRTUAL_CONFIG || id === resolveVirtualId(VIRTUAL_CONFIG)) return resolveVirtualId(VIRTUAL_CONFIG)\n if (id === VIRTUAL_ROUTES || id === resolveVirtualId(VIRTUAL_ROUTES)) return resolveVirtualId(VIRTUAL_ROUTES)\n if (id === VIRTUAL_SERVER_ROUTES || id === resolveVirtualId(VIRTUAL_SERVER_ROUTES)) return resolveVirtualId(VIRTUAL_SERVER_ROUTES)\n if (id === VIRTUAL_OPENAPI || id === resolveVirtualId(VIRTUAL_OPENAPI)) return resolveVirtualId(VIRTUAL_OPENAPI)\n if (id === VIRTUAL_SLOTS || id === resolveVirtualId(VIRTUAL_SLOTS)) return resolveVirtualId(VIRTUAL_SLOTS)\n if (id === VIRTUAL_SLOT || id === resolveVirtualId(VIRTUAL_SLOT)) return resolveVirtualId(VIRTUAL_SLOT)\n const moduleId = stripVirtualPrefix(id)\n if (virtualModules.has(moduleId)) return resolveVirtualId(moduleId)\n const route = routes.find(r => r.virtualModuleId === id || r.virtualModuleId === moduleId)\n if (route) return resolveVirtualId(route.virtualModuleId)\n return null\n },\n load(id) {\n return loadVirtualModule(id, virtualModules)\n },\n async configureServer(server) {\n server.watcher.add(contentRoot)\n if (configFilePath) {\n server.watcher.add(configFilePath)\n }\n\n // Dev-only endpoints for external tooling (e.g. VS Code extension).\n // Need to match exact paths, so check req.url before handling.\n server.middlewares.use((req, res, next) => {\n if (req.url === CLARIFY_DEV_ROUTE_ENDPOINT && req.method === 'POST') {\n return handleDevRouteRequest(req, res, routes, runtimeContext)\n }\n if (req.url === CLARIFY_DEV_PROJECT_INFO_ENDPOINT && (req.method === 'GET' || req.method === 'HEAD')) {\n return handleProjectInfoRequest(req, res, runtimeContext)\n }\n next()\n })\n\n const handleContentTreeChange = async (filePath: string) => {\n const changedFile = isAbsolute(filePath) ? filePath : join(root, filePath)\n const relativeContentFile = relative(contentRoot, changedFile)\n const isContentFile = relativeContentFile && !relativeContentFile.startsWith('..') && !isAbsolute(relativeContentFile)\n if (!isContentFile) return\n await refreshDevServer(server)\n }\n\n server.watcher.on('add', handleContentTreeChange)\n server.watcher.on('unlink', handleContentTreeChange)\n await runDevConfigureServerHooks(clarifyPlugins, server, ctx)\n },\n transformIndexHtml: {\n order: 'pre',\n async handler(html, transformCtx) {\n // In dev mode, use /@id/ prefix so Vite dev server can resolve the virtual module.\n // In build mode, use the bare virtual: ID so Vite's HTML build pipeline resolves it via resolveId.\n const clientEntryId = transformCtx.server\n ? `/@id/${VIRTUAL_CLIENT_ENTRY}`\n : VIRTUAL_CLIENT_ENTRY\n const result = await runHooks(clarifyPlugins, 'html:transform', {\n html,\n tags: [],\n clientEntryId,\n dev: Boolean(transformCtx.server),\n }, ctx)\n return {\n html: result.html,\n tags: result.tags,\n }\n }\n },\n async generateBundle(_opts, _bundle) {\n // Collect assets from all plugins and emit them through Rollup so they\n // appear in the Vite manifest and build log.\n const assets = await runBuildAssetsHooks(clarifyPlugins, ctx)\n for (const asset of assets) {\n this.emitFile({\n type: 'asset',\n fileName: asset.fileName,\n source: asset.source,\n })\n }\n },\n async closeBundle() {\n // ── Phase 1: Static HTML Generation ──\n if (process.env.SKIP_CLARIFY_SSG) {\n await runBuildDoneHooks(clarifyPlugins, ctx)\n return\n }\n\n const outputDir = viteConfig.build.outDir\n const ssrOutputDir = join(outputDir, '.ssr')\n let tempEntryPath: string | undefined\n\n try {\n tempEntryPath = createTempEntryFile(SSR_ENTRY_CODE)\n\n await buildSSRBundle(root, tempEntryPath, ssrOutputDir, [\n {\n name: 'clarify:virtual-ssg',\n resolveId(id) {\n if (id === VIRTUAL_CLIENT_ENTRY) return RESOLVED_CLIENT_ENTRY\n if (id === RESOLVED_CLIENT_ENTRY) return RESOLVED_CLIENT_ENTRY\n if (id === VIRTUAL_SERVER_ROUTES) return id\n if (id === VIRTUAL_OPENAPI) return id\n if (id === VIRTUAL_CONFIG) return id\n if (id === VIRTUAL_ROUTES) return id\n if (id === VIRTUAL_SLOTS) return id\n if (id === VIRTUAL_SLOT) return id\n if (virtualModules.has(stripVirtualPrefix(id))) return stripVirtualPrefix(id)\n const route = routes.find(r => r.virtualModuleId === id)\n if (route) return id\n return null\n },\n load: id => loadVirtualModule(id, virtualModules),\n },\n normalizedMdxContentPlugin,\n mdx,\n ])\n\n const ssrBundlePath = join(ssrOutputDir, 'entry-server.js')\n await renderSSGRoutes(routes, runtimeContext, outputDir, ssrBundlePath, generateOptions.ssg.failOnError)\n } catch (err) {\n console.error('[clarify] SSG failed:', err)\n if (generateOptions.ssg.failOnError) {\n throw err\n }\n } finally {\n if (tempEntryPath) {\n try {\n rmSync(tempEntryPath, { force: true })\n } catch {\n // ignore cleanup errors\n }\n }\n }\n\n await runBuildDoneHooks(clarifyPlugins, ctx)\n },\n }\n\n return [react(), tailwindcss(), normalizedMdxContentPlugin, clarifyCorePlugin, mdx].flat().filter(Boolean) as Plugin[]\n}\n"],"mappings":"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"}
@@ -6,10 +6,7 @@ export declare function generateOpenAPIRegistryModule(openApis: Record<string, O
6
6
  /** Generate a virtual module that exports a single spec as default. */
7
7
  export declare function generateOpenAPISpecModule(spec: OpenAPISpec): string;
8
8
  type OpenAPIPageModuleOptions = {
9
- /** specFileKey used for per-spec virtual module lazy-loading (namespace 2). */
10
- specKey: string;
11
- /** virtual:clarify-page/… key used for OpenApisContext registry lookup (namespace 3). */
12
- specRegistryKey: string;
9
+ spec: OpenAPISpec;
13
10
  tagFilter?: string[];
14
11
  };
15
12
  export declare function generateOpenAPIPageModule(opts: OpenAPIPageModuleOptions): string;
package/output/types.d.ts CHANGED
@@ -220,10 +220,11 @@ export type ContentSection = {
220
220
  tags?: string[];
221
221
  };
222
222
  export type ContentDiagnostic = {
223
+ kind: string;
223
224
  title: string;
224
225
  message: string;
226
+ details?: string;
225
227
  filePath?: string;
226
- cause?: string;
227
228
  };
228
229
  export type ContentRoute = {
229
230
  path: string;
@@ -278,9 +279,14 @@ export type ClarifyNavigationNode = {
278
279
  children?: ClarifyNavigationNode[];
279
280
  sections?: Pick<ContentSection, 'id' | 'title' | 'badge' | 'tags'>[];
280
281
  };
281
- export type ClarifyHookContext = {
282
+ export type ClarifyProjectContext = {
283
+ projectRoot: string;
284
+ contentRoot: string;
282
285
  projectConfig: ResolvedProjectConfig;
283
286
  generateOptions: ResolvedBuildOptions;
287
+ version: string;
288
+ };
289
+ export type ClarifyHookContext = ClarifyProjectContext & {
284
290
  routes: ContentRoute[];
285
291
  navigation: NavigationTree;
286
292
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@clarify-labs/cli",
3
- "version": "0.9.3",
3
+ "version": "0.9.4",
4
4
  "license": "AGPL-3.0-only",
5
5
  "type": "module",
6
6
  "repository": {
@@ -39,8 +39,9 @@
39
39
  },
40
40
  "dependencies": {
41
41
  "@apidevtools/swagger-parser": "^12.1.0",
42
- "@clarify-labs/renderer": "0.9.3",
43
- "@clarify-labs/templates": "0.9.3",
42
+ "@clarify-labs/renderer": "0.9.4",
43
+ "@clarify-labs/templates": "0.9.4",
44
+ "@mdx-js/mdx": "^3.1.1",
44
45
  "@mdx-js/rollup": "^3.1.1",
45
46
  "@tailwindcss/vite": "^4.1.11",
46
47
  "@vitejs/plugin-react": "^6.0.2",
@@ -65,7 +66,6 @@
65
66
  "zod": "^4.4.3"
66
67
  },
67
68
  "devDependencies": {
68
- "@mdx-js/mdx": "^3.1.1",
69
69
  "@types/react": "^19.1.8",
70
70
  "typescript": "^5.8.3",
71
71
  "vite-plugin-dts": "^4.5.4",