bejamas 0.2.10 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/dist/{generate-mdx-C1y987mC.js → generate-mdx-C8gXBOHp.js} +3 -3
- package/dist/{generate-mdx-C1y987mC.js.map → generate-mdx-C8gXBOHp.js.map} +1 -1
- package/dist/index.js +95 -35
- package/dist/index.js.map +1 -1
- package/dist/{utils-gYZJgF4G.js → utils-Dr0kJLcx.js} +6 -103
- package/dist/utils-Dr0kJLcx.js.map +1 -0
- package/package.json +1 -1
- package/dist/utils-gYZJgF4G.js.map +0 -1
package/README.md
CHANGED
|
@@ -8,6 +8,8 @@ Use the `init` command to initialize dependencies for a new project.
|
|
|
8
8
|
|
|
9
9
|
The `init` command installs dependencies, adds the `cn` util, and configures CSS variables for the project.
|
|
10
10
|
|
|
11
|
+
`--base-color` is deprecated and ignored on current shadcn-backed init flows. If you want a different base color, update `tailwind.baseColor` in `components.json` after initialization.
|
|
12
|
+
|
|
11
13
|
```bash
|
|
12
14
|
npx bejamas init
|
|
13
15
|
```
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { a as extractComponentTagsFromMDX,
|
|
1
|
+
import { a as extractComponentTagsFromMDX, c as extractPropsFromDeclaredProps, d as parseJsDocMetadata, f as resolveOutDir, g as getConfig, h as toIdentifier, i as discoverExamples, l as normalizeBlockMDX, m as slugify, n as createSourceFileFromFrontmatter, o as extractFrontmatter, p as resolveUiRoot, r as detectHasImportTopLevel, s as extractPropsFromAstroProps, t as RESERVED_COMPONENTS, u as normalizeUsageMDX, v as spinner, y as logger } from "./utils-Dr0kJLcx.js";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
|
-
import { dirname, extname, join, relative } from "path";
|
|
4
3
|
import { existsSync, mkdirSync } from "fs";
|
|
4
|
+
import { dirname, extname, join, relative } from "path";
|
|
5
5
|
import { readFile, readdir, writeFile } from "fs/promises";
|
|
6
6
|
|
|
7
7
|
//#region rolldown:runtime
|
|
@@ -1160,4 +1160,4 @@ if (process.env.BEJAMAS_SKIP_AUTO_RUN !== "1" && process.env.BEJAMAS_SKIP_AUTO_R
|
|
|
1160
1160
|
|
|
1161
1161
|
//#endregion
|
|
1162
1162
|
export { runDocsGenerator };
|
|
1163
|
-
//# sourceMappingURL=generate-mdx-
|
|
1163
|
+
//# sourceMappingURL=generate-mdx-C8gXBOHp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generate-mdx-C1y987mC.js","names":["fences: ParsedFenceBlock[]","active:\n | {\n startLine: number;\n openLine: string;\n lang: string;\n flags: Set<string>;\n bodyLines: string[];\n }\n | null","consoleScripts: string[]","sections: ParsedExampleSection[]","currentSection: MutableSection | null","currentItem: MutableItem | null","match: RegExpExecArray | null","fenceBody: string[]","path","lines: string[]","mainImportLine: string | null","extractTags","m: RegExpExecArray | null","external: string[]","internal: string[]","scripts: string[]","out: string[]","fenceBody: string[]","blocks: string[]","renderedExampleSections: string[]","sectionParts: string[]","itemHeadingLevel: \"###\" | \"####\"","entries: ComponentEntry[]","map: Record<string, string>","exports: string[]","match: RegExpExecArray | null","exampleRelPaths: string[]","examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }>"],"sources":["../src/docs/generate-mdx/examples.ts","../src/docs/generate-mdx/mdx-builder.ts","../src/docs/generate-mdx/index.ts"],"sourcesContent":["export interface ParsedExampleItem {\n title: string;\n body: string;\n}\n\nexport interface ParsedExampleSection {\n /**\n * Null means \"implicit section\" (no explicit ## heading in @examples).\n */\n title: string | null;\n /**\n * Markdown text that appears between a ## section heading and the first ### item.\n * For implicit sections, this is content before the first ### heading.\n */\n introMD: string;\n items: ParsedExampleItem[];\n}\n\nexport interface PreparedExampleContent {\n descriptionMD: string;\n /**\n * Renderable snippet used in preview (markup only).\n */\n snippet: string;\n /**\n * Source code shown in the code block.\n */\n sourceCode: string;\n /**\n * True when source came from an explicit ```astro fenced block.\n */\n sourceFromFence: boolean;\n /**\n * True when the fenced astro block includes the `nopreview` flag.\n */\n skipPreview: boolean;\n /**\n * True when the fenced astro block includes the `console` flag.\n */\n enableConsolePanel: boolean;\n /**\n * Explicit console scripts sourced from an adjacent JS/TS fence.\n */\n consoleScripts: string[];\n /**\n * Raw markdown for a paired source fence that should render after the astro block.\n */\n companionSourceMD: string;\n /**\n * Markdown that appears between the astro fence and its paired JS/TS fence.\n */\n companionIntroMD: string;\n /**\n * Markdown that appears after a paired JS/TS fence.\n */\n trailingDescriptionMD: string;\n /**\n * True when the paired JS/TS fence had no prose between it and the astro fence.\n */\n mergeCompanionWithSource: boolean;\n}\n\nexport interface FenceInfo {\n lang: string;\n flags: Set<string>;\n}\n\ninterface PreviewRenderConfig {\n defaultPreview?: boolean;\n}\n\ntype MutableSection = {\n title: string | null;\n intro: string[];\n items: Array<{ title: string; body: string[] }>;\n};\n\ntype MutableItem = { title: string; body: string[] };\n\nfunction createImplicitSection(): MutableSection {\n return { title: null, intro: [], items: [] };\n}\n\nfunction normalizeSection(section: MutableSection): ParsedExampleSection {\n return {\n title: section.title,\n introMD: section.intro.join(\"\\n\").trim(),\n items: section.items.map((item) => ({\n title: item.title,\n body: item.body.join(\"\\n\").trim(),\n })),\n };\n}\n\nfunction pushItem(section: MutableSection | null, item: MutableItem | null): void {\n if (!section || !item) return;\n if (!item.title.trim().length && !item.body.join(\"\\n\").trim().length) return;\n section.items.push(item);\n}\n\nfunction pushSection(\n sections: ParsedExampleSection[],\n section: MutableSection | null,\n): void {\n if (!section) return;\n const normalized = normalizeSection(section);\n if (\n !normalized.title &&\n !normalized.introMD.length &&\n normalized.items.length === 0\n ) {\n return;\n }\n sections.push(normalized);\n}\n\nfunction extractHeading(line: string, level: 2 | 3): string | null {\n const pattern = level === 2 ? /^##(?!#)\\s+(.+)$/ : /^###(?!#)\\s+(.+)$/;\n const match = line.trim().match(pattern);\n return match ? match[1].trim() : null;\n}\n\nfunction splitDescriptionAndSnippetRaw(body: string): {\n descriptionMD: string;\n snippet: string;\n} {\n if (!body || !body.trim().length) return { descriptionMD: \"\", snippet: \"\" };\n const lines = body.split(\"\\n\");\n let snippetStartIdx = -1;\n for (let i = 0; i < lines.length; i += 1) {\n const ln = lines[i];\n if (!ln.trim().length) continue;\n if (/^\\s*[<{]/.test(ln)) {\n snippetStartIdx = i;\n break;\n }\n }\n if (snippetStartIdx <= 0) {\n return { descriptionMD: \"\", snippet: body.trim() };\n }\n return {\n descriptionMD: lines.slice(0, snippetStartIdx).join(\"\\n\").trim(),\n snippet: lines.slice(snippetStartIdx).join(\"\\n\").trim(),\n };\n}\n\nfunction splitAstroFrontmatter(sourceCode: string): {\n frontmatter: string;\n markup: string;\n} {\n const match = sourceCode.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: \"\", markup: sourceCode.trim() };\n }\n return {\n frontmatter: match[1].trim(),\n markup: match[2].trim(),\n };\n}\n\nfunction stripFrontmatterComments(frontmatter: string): string {\n if (!frontmatter || !frontmatter.length) return \"\";\n return frontmatter\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\\n\")\n .replace(/^[ \\t]*\\/\\/.*$/gm, \"\")\n .trim();\n}\n\nfunction isImportOnlyFrontmatter(frontmatter: string): boolean {\n const cleaned = stripFrontmatterComments(frontmatter);\n if (!cleaned.length) return true;\n\n let remaining = cleaned;\n const importFromPattern =\n /(?:^|\\n)\\s*import\\s+(?:type\\s+)?[\\s\\S]*?\\s+from\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n const importSideEffectPattern =\n /(?:^|\\n)\\s*import\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n const exportFromPattern =\n /(?:^|\\n)\\s*export\\s+(?:\\*\\s+from|\\{[\\s\\S]*?\\}\\s+from)\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n\n remaining = remaining\n .replace(importFromPattern, \"\\n\")\n .replace(importSideEffectPattern, \"\\n\")\n .replace(exportFromPattern, \"\\n\")\n .trim();\n\n return remaining.replace(/[;\\s]/g, \"\").length === 0;\n}\n\nfunction isAstroFrontmatterPreviewUnsafe(frontmatter: string): boolean {\n const cleaned = stripFrontmatterComments(frontmatter);\n if (!cleaned.length) return false;\n\n const runtimeTokenPattern =\n /\\b(?:const|let|var|function|class|if|for|while|switch|try|catch|return|throw|await|new)\\b|=>|Astro\\./;\n if (runtimeTokenPattern.test(cleaned)) return true;\n\n return !isImportOnlyFrontmatter(cleaned);\n}\n\nexport function parseFenceInfo(infoRaw: string): FenceInfo {\n const parts = (infoRaw || \"\")\n .trim()\n .split(/\\s+/)\n .filter((v) => v.length)\n .map((v) => v.toLowerCase());\n if (!parts.length) return { lang: \"\", flags: new Set<string>() };\n const [lang, ...flags] = parts;\n return { lang, flags: new Set(flags) };\n}\n\nexport function decodeEscapedScriptTags(source: string): string {\n if (!source || !source.length) return source;\n return source\n .replace(/<script>/gi, \"<script>\")\n .replace(/<\\/script>/gi, \"</script>\");\n}\n\ntype ParsedFenceBlock = {\n openLine: string;\n closeLine: string;\n lang: string;\n flags: Set<string>;\n body: string;\n startLine: number;\n endLine: number;\n};\n\nconst CONSOLE_SCRIPT_FENCE_LANGS = new Set([\n \"js\",\n \"ts\",\n \"javascript\",\n \"typescript\",\n]);\n\nfunction parseFenceBlocks(body: string): {\n lines: string[];\n fences: ParsedFenceBlock[];\n} {\n const lines = body.split(\"\\n\");\n const fences: ParsedFenceBlock[] = [];\n let active:\n | {\n startLine: number;\n openLine: string;\n lang: string;\n flags: Set<string>;\n bodyLines: string[];\n }\n | null = null;\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"```\")) {\n if (active) active.bodyLines.push(line);\n continue;\n }\n\n if (!active) {\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n active = {\n startLine: i,\n openLine: line,\n lang: parsed.lang,\n flags: parsed.flags,\n bodyLines: [],\n };\n continue;\n }\n\n fences.push({\n openLine: active.openLine,\n closeLine: line,\n lang: active.lang,\n flags: active.flags,\n body: active.bodyLines.join(\"\\n\"),\n startLine: active.startLine,\n endLine: i,\n });\n active = null;\n }\n\n return { lines, fences };\n}\n\nfunction serializeFenceBlock(fence: ParsedFenceBlock): string {\n const parts = [fence.openLine];\n if (fence.body.length) parts.push(fence.body);\n parts.push(fence.closeLine);\n return parts.join(\"\\n\");\n}\n\nfunction buildRemainingMarkdown(\n lines: string[],\n fences: ParsedFenceBlock[],\n consumedFenceIndexes: Set<number>,\n): string {\n const skippedLines = new Set<number>();\n for (const [index, fence] of fences.entries()) {\n if (!consumedFenceIndexes.has(index)) continue;\n for (let line = fence.startLine; line <= fence.endLine; line += 1) {\n skippedLines.add(line);\n }\n }\n\n return lines\n .filter((_, index) => !skippedLines.has(index))\n .join(\"\\n\")\n .trim();\n}\n\nfunction extractFirstAstroFence(body: string): {\n sourceCode: string;\n descriptionMD: string;\n skipPreview: boolean;\n enableConsolePanel: boolean;\n consoleScripts: string[];\n companionSourceMD: string;\n companionIntroMD: string;\n trailingDescriptionMD: string;\n mergeCompanionWithSource: boolean;\n} | null {\n if (!body || !body.trim().length) return null;\n const { lines, fences } = parseFenceBlocks(body);\n const astroFenceIndex = fences.findIndex((fence) => fence.lang === \"astro\");\n if (astroFenceIndex === -1) return null;\n\n const astroFence = fences[astroFenceIndex];\n const consumedFenceIndexes = new Set<number>([astroFenceIndex]);\n let companionSourceMD = \"\";\n let consoleScripts: string[] = [];\n let companionIntroMD = \"\";\n let trailingDescriptionMD = \"\";\n let mergeCompanionWithSource = false;\n\n if (astroFence.flags.has(\"console\")) {\n const nextFence = fences[astroFenceIndex + 1];\n if (nextFence && CONSOLE_SCRIPT_FENCE_LANGS.has(nextFence.lang)) {\n consumedFenceIndexes.add(astroFenceIndex + 1);\n companionSourceMD = serializeFenceBlock(nextFence);\n companionIntroMD = lines\n .slice(astroFence.endLine + 1, nextFence.startLine)\n .join(\"\\n\")\n .trim();\n trailingDescriptionMD = lines.slice(nextFence.endLine + 1).join(\"\\n\").trim();\n mergeCompanionWithSource = companionIntroMD.length === 0;\n const normalizedScript = nextFence.body.trim();\n if (normalizedScript.length) {\n consoleScripts = [normalizedScript];\n }\n }\n }\n\n const descriptionMD = companionSourceMD.length\n ? lines.slice(0, astroFence.startLine).join(\"\\n\").trim()\n : buildRemainingMarkdown(lines, fences, consumedFenceIndexes);\n\n return {\n sourceCode: decodeEscapedScriptTags(astroFence.body.trim()),\n descriptionMD,\n skipPreview: astroFence.flags.has(\"nopreview\"),\n enableConsolePanel: astroFence.flags.has(\"console\"),\n consoleScripts,\n companionSourceMD,\n companionIntroMD,\n trailingDescriptionMD,\n mergeCompanionWithSource,\n };\n}\n\nexport function parseExamplesSections(examplesMDX: string): ParsedExampleSection[] {\n if (!examplesMDX || !examplesMDX.trim().length) return [];\n\n const sections: ParsedExampleSection[] = [];\n const lines = examplesMDX.split(\"\\n\");\n let currentSection: MutableSection | null = null;\n let currentItem: MutableItem | null = null;\n let inFence = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith(\"```\")) {\n inFence = !inFence;\n if (!currentSection) currentSection = createImplicitSection();\n if (currentItem) currentItem.body.push(line);\n else currentSection.intro.push(line);\n continue;\n }\n\n if (!inFence) {\n const h2 = extractHeading(line, 2);\n if (h2) {\n pushItem(currentSection, currentItem);\n currentItem = null;\n pushSection(sections, currentSection);\n currentSection = { title: h2, intro: [], items: [] };\n continue;\n }\n\n const h3 = extractHeading(line, 3);\n if (h3) {\n if (!currentSection) currentSection = createImplicitSection();\n pushItem(currentSection, currentItem);\n currentItem = { title: h3, body: [] };\n continue;\n }\n }\n\n if (!currentSection) currentSection = createImplicitSection();\n if (currentItem) currentItem.body.push(line);\n else currentSection.intro.push(line);\n }\n\n pushItem(currentSection, currentItem);\n pushSection(sections, currentSection);\n return sections;\n}\n\nexport function prepareExampleContent(body: string): PreparedExampleContent {\n if (!body || !body.trim().length) {\n return {\n descriptionMD: \"\",\n snippet: \"\",\n sourceCode: \"\",\n sourceFromFence: false,\n skipPreview: false,\n enableConsolePanel: false,\n consoleScripts: [],\n companionSourceMD: \"\",\n companionIntroMD: \"\",\n trailingDescriptionMD: \"\",\n mergeCompanionWithSource: false,\n };\n }\n\n const fenced = extractFirstAstroFence(body);\n if (fenced) {\n const { frontmatter, markup } = splitAstroFrontmatter(fenced.sourceCode);\n const unsafeFrontmatter = isAstroFrontmatterPreviewUnsafe(frontmatter);\n return {\n descriptionMD: fenced.descriptionMD,\n snippet: markup,\n sourceCode: fenced.sourceCode,\n sourceFromFence: true,\n skipPreview: fenced.skipPreview || unsafeFrontmatter,\n enableConsolePanel: fenced.enableConsolePanel,\n consoleScripts: fenced.consoleScripts,\n companionSourceMD: fenced.companionSourceMD,\n companionIntroMD: fenced.companionIntroMD,\n trailingDescriptionMD: fenced.trailingDescriptionMD,\n mergeCompanionWithSource: fenced.mergeCompanionWithSource,\n };\n }\n\n const split = splitDescriptionAndSnippetRaw(body);\n return {\n descriptionMD: split.descriptionMD,\n snippet: split.snippet,\n sourceCode: split.snippet,\n sourceFromFence: false,\n skipPreview: false,\n enableConsolePanel: false,\n consoleScripts: [],\n companionSourceMD: \"\",\n companionIntroMD: \"\",\n trailingDescriptionMD: \"\",\n mergeCompanionWithSource: false,\n };\n}\n\nfunction extractTags(block: string): string[] {\n if (!block || !block.length) return [];\n const found = new Set<string>();\n const tagRegex = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n let match: RegExpExecArray | null;\n while ((match = tagRegex.exec(block)) !== null) {\n found.add(match[1]);\n }\n return Array.from(found);\n}\n\nexport function extractComponentTagsFromPreviewMarkdown(\n block: string,\n config: PreviewRenderConfig = {},\n): string[] {\n if (!block || !block.length) return [];\n const { defaultPreview = true } = config;\n const found = new Set<string>();\n const lines = block.split(\"\\n\");\n let inFence = false;\n let fenceOpen = \"\";\n let currentFenceLang = \"\";\n let currentFenceFlags = new Set<string>();\n const fenceBody: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n if (!inFence) {\n inFence = true;\n fenceOpen = line;\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n currentFenceLang = parsed.lang;\n currentFenceFlags = parsed.flags;\n fenceBody.length = 0;\n continue;\n }\n\n if (currentFenceLang === \"astro\") {\n const sourceCode = fenceBody.join(\"\\n\").trim();\n const prepared = prepareExampleContent(\n `${fenceOpen}\\n${sourceCode}\\n${line}`,\n );\n const hasForcedPreviewFlag =\n currentFenceFlags.has(\"preview\") || currentFenceFlags.has(\"console\");\n const shouldPreview =\n !prepared.skipPreview && (defaultPreview || hasForcedPreviewFlag);\n if (shouldPreview) {\n for (const tag of extractTags(prepared.snippet)) found.add(tag);\n }\n }\n\n inFence = false;\n fenceOpen = \"\";\n currentFenceLang = \"\";\n currentFenceFlags = new Set<string>();\n fenceBody.length = 0;\n continue;\n }\n\n if (inFence) {\n fenceBody.push(line);\n continue;\n }\n\n for (const tag of extractTags(line)) found.add(tag);\n }\n\n return Array.from(found);\n}\n\nexport function extractComponentTagsFromExamplesSections(\n sections: ParsedExampleSection[],\n): string[] {\n if (!sections?.length) return [];\n const found = new Set<string>();\n for (const section of sections) {\n for (const tag of extractComponentTagsFromPreviewMarkdown(section.introMD)) {\n found.add(tag);\n }\n for (const item of section.items) {\n const prepared = prepareExampleContent(item.body);\n if (prepared.skipPreview) continue;\n for (const tag of extractTags(prepared.snippet)) found.add(tag);\n }\n }\n return Array.from(found);\n}\n","import {\n decodeEscapedScriptTags,\n parseFenceInfo,\n prepareExampleContent,\n type ParsedExampleSection,\n} from \"./examples\";\n\n/**\n * Check if an import path uses the new barrel export pattern (no .astro extension)\n */\nfunction isBarrelImport(path: string): boolean {\n return !path.endsWith(\".astro\");\n}\n\n/**\n * Convert a PascalCase component name to its folder path (kebab-case).\n * Examples:\n * - \"Card\" → \"card\"\n * - \"CardHeader\" → \"card\"\n * - \"InputGroup\" → \"input-group\"\n * - \"InputGroupAddon\" → \"input-group\"\n * - \"StickySurface\" → \"sticky-surface\"\n * - \"RadioGroup\" → \"radio-group\"\n * - \"RadioGroupItem\" → \"radio-group\"\n */\nfunction componentToFolder(name: string): string {\n // Known multi-word component families (in PascalCase order)\n // These map to kebab-case folder names\n const multiWordFamilies = [\n \"InputGroup\",\n \"LinkGroup\",\n \"RadioGroup\",\n \"ButtonGroup\",\n \"StickySurface\",\n ];\n\n // Check for multi-word families first (order matters - longer matches first)\n const sortedFamilies = multiWordFamilies.sort((a, b) => b.length - a.length);\n for (const family of sortedFamilies) {\n if (name === family || name.startsWith(family)) {\n // InputGroup → input-group\n return family.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n }\n }\n\n // For regular names, extract the base component (first PascalCase word)\n // CardHeader → Card → card\n // AvatarFallback → Avatar → avatar\n const baseMatch = name.match(/^[A-Z][a-z]*/);\n return baseMatch ? baseMatch[0].toLowerCase() : name.toLowerCase();\n}\n\nfunction resolveComponentFolder(\n name: string,\n componentFolderMap?: Record<string, string>,\n): string {\n if (!componentFolderMap) return componentToFolder(name);\n const direct = componentFolderMap[name];\n if (direct && direct.length) return direct;\n\n // Fallback: try the longest mapped prefix (e.g. InputGroup* -> input-group)\n const prefixMatch = Object.keys(componentFolderMap)\n .filter((key) => name.startsWith(key))\n .sort((a, b) => b.length - a.length)[0];\n if (prefixMatch) return componentFolderMap[prefixMatch];\n\n return componentToFolder(name);\n}\n\n/**\n * Group component names by their folder path\n */\nfunction groupComponentsByFolder(\n components: string[],\n componentFolderMap?: Record<string, string>,\n): Map<string, string[]> {\n const groups = new Map<string, string[]>();\n for (const comp of components) {\n const folder = resolveComponentFolder(comp, componentFolderMap);\n if (!groups.has(folder)) {\n groups.set(folder, []);\n }\n groups.get(folder)!.push(comp);\n }\n return groups;\n}\n\n/**\n * Generate import lines for UI components using the barrel import pattern\n */\nfunction generateBarrelImports(\n components: string[],\n componentsAlias: string,\n componentFolderMap?: Record<string, string>,\n): string[] {\n const groups = groupComponentsByFolder(components, componentFolderMap);\n const lines: string[] = [];\n\n // Sort folders alphabetically for consistent output\n const sortedFolders = Array.from(groups.keys()).sort();\n\n for (const folder of sortedFolders) {\n const names = groups.get(folder)!.sort();\n lines.push(\n `import { ${names.join(\", \")} } from '${componentsAlias}/${folder}';`,\n );\n }\n\n return lines;\n}\n\n/**\n * Generate import lines for UI components using the old default import pattern\n */\nfunction generateDefaultImports(\n components: string[],\n componentsAlias: string,\n): string[] {\n return components\n .slice()\n .sort()\n .map((name) => `import ${name} from '${componentsAlias}/${name}.astro';`);\n}\n\nexport function buildMdx(params: {\n importName: string;\n importPath: string;\n title: string;\n description: string;\n descriptionBodyMDX?: string;\n figmaUrl?: string;\n usageMDX: string;\n hasImport: boolean;\n propsList: string;\n propsTable?: Array<{\n name: string;\n type?: string;\n required?: boolean;\n defaultValue?: string | null;\n description?: string | null;\n }>;\n examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }>;\n examplesSections: ParsedExampleSection[];\n componentFolderMap?: Record<string, string>;\n autoImports: string[];\n lucideIcons: string[];\n primaryExampleMDX: string;\n componentSource: string;\n commandName: string;\n componentsAlias: string;\n /**\n * Optional: additional named exports from the main component's barrel.\n * Used when the main component has subcomponents (e.g., Card, CardHeader, CardTitle).\n * If provided, these will be included in the main import statement.\n */\n namedExports?: string[];\n /**\n * Optional: API reference documentation (events, programmatic control, data attributes).\n */\n apiMDX?: string;\n}): string {\n const {\n importName,\n importPath,\n title,\n description,\n descriptionBodyMDX,\n usageMDX,\n hasImport,\n propsList,\n propsTable,\n examples,\n examplesSections,\n componentFolderMap,\n autoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource,\n commandName,\n figmaUrl,\n componentsAlias,\n namedExports,\n apiMDX,\n } = params;\n\n // Detect if we should use the new barrel import pattern\n const useBarrelPattern = isBarrelImport(importPath);\n\n const sortedLucide = (lucideIcons ?? []).slice().sort();\n const lucideTopLine = sortedLucide.length\n ? `import { ${sortedLucide.join(\", \")} } from '@lucide/astro';`\n : null;\n const externalTopImports = [\n `import { Tabs as DocsTabs, TabItem as DocsTabItem } from '@astrojs/starlight/components';`,\n lucideTopLine,\n ]\n .filter((v) => v != null)\n .slice()\n .sort((a, b) => String(a).localeCompare(String(b)));\n\n const sortedUiAuto = (autoImports ?? []).slice().sort();\n\n // Generate UI component imports based on pattern\n const uiAutoLines = useBarrelPattern\n ? generateBarrelImports(sortedUiAuto, componentsAlias, componentFolderMap)\n : generateDefaultImports(sortedUiAuto, componentsAlias);\n\n const exampleLines = (examples ?? [])\n .map((ex) => `import ${ex.importName} from '${ex.importPath}';`)\n .sort((a, b) => a.localeCompare(b));\n\n // Build main component import\n let mainImportLine: string | null = null;\n if (!hasImport) {\n if (useBarrelPattern) {\n // New pattern: named exports\n const exports = [importName, ...(namedExports ?? [])].sort();\n mainImportLine = `import { ${exports.join(\", \")} } from '${importPath}';`;\n } else {\n // Old pattern: default export\n mainImportLine = `import ${importName} from '${importPath}';`;\n }\n }\n\n const internalTopImports = [mainImportLine, ...uiAutoLines, ...exampleLines]\n .filter((v) => v != null)\n .slice()\n .sort((a, b) => String(a).localeCompare(String(b)));\n\n const importLines = [\n ...externalTopImports,\n externalTopImports.length && internalTopImports.length ? \"\" : null,\n ...internalTopImports,\n ].filter((v) => v !== null && v !== undefined);\n\n // Helper: build per-snippet imports so code fences are minimal and copy-pasteable\n const extractTags = (snippet: string): Set<string> => {\n const found = new Set<string>();\n const tagRegex = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n let m: RegExpExecArray | null;\n while ((m = tagRegex.exec(snippet)) !== null) {\n found.add(m[1]);\n }\n return found;\n };\n\n const buildSnippetImportLines = (snippet: string): string[] => {\n if (!snippet || !snippet.length) return [];\n const used = extractTags(snippet);\n const usedIcons = sortedLucide.filter((n) => used.has(n));\n\n // Find UI components used in snippet\n const usedUi = (autoImports ?? []).filter((n) => used.has(n));\n\n // Check if main component (and its subcomponents) are used\n const includeMain = !hasImport && used.has(importName);\n\n // For new pattern, also check for subcomponents from the main barrel\n const usedNamedExports =\n useBarrelPattern && namedExports\n ? namedExports.filter((n) => used.has(n))\n : [];\n\n const external: string[] = [];\n if (usedIcons.length) {\n external.push(`import { ${usedIcons.join(\", \")} } from '@lucide/astro';`);\n }\n\n const internal: string[] = [];\n\n if (useBarrelPattern) {\n // New pattern: group by folder and use named imports\n\n // Main component and its subcomponents\n if (includeMain || usedNamedExports.length > 0) {\n const mainExports = [\n ...(includeMain ? [importName] : []),\n ...usedNamedExports,\n ].sort();\n internal.push(\n `import { ${mainExports.join(\", \")} } from '${importPath}';`,\n );\n }\n\n // Other UI components grouped by folder\n if (usedUi.length > 0) {\n internal.push(\n ...generateBarrelImports(usedUi, componentsAlias, componentFolderMap),\n );\n }\n } else {\n // Old pattern: default imports\n if (includeMain) {\n internal.push(`import ${importName} from '${importPath}';`);\n }\n internal.push(\n ...usedUi\n .slice()\n .sort()\n .map(\n (name) => `import ${name} from '${componentsAlias}/${name}.astro';`,\n ),\n );\n }\n\n const externalSorted = external.slice().sort((a, b) => a.localeCompare(b));\n const internalSorted = internal.slice().sort((a, b) => a.localeCompare(b));\n return [\n ...externalSorted,\n externalSorted.length && internalSorted.length ? \"\" : null,\n ...internalSorted,\n ].filter((v) => v !== null && v !== undefined) as string[];\n };\n\n let consolePreviewCounter = 0;\n\n const wrapTextNodes = (snippet: string): string => {\n if (!snippet) return snippet;\n return snippet.replace(/>([^<]+)</g, (match, inner) => {\n const trimmed = inner.trim();\n if (!trimmed.length) return match;\n // Skip if the entire trimmed content is a JSX expression\n if (/^\\{[\\s\\S]*\\}$/.test(trimmed)) return match;\n // Skip if the content already contains JSX expressions (e.g., \"Use{\\\" \\\"}\" or mixed content)\n // This prevents double-wrapping and breaking inline JSX whitespace expressions\n if (/\\{[^}]*\\}/.test(inner)) return match;\n return `>{${JSON.stringify(inner)}}<`;\n });\n };\n\n /**\n * Normalize whitespace in preview content.\n * This collapses ALL newlines and multiple spaces into single spaces to prevent\n * MDX parsing issues. In particular, a '>' at the start of a line is interpreted\n * as a block quote marker by MDX, which causes \"Unexpected lazy line\" errors.\n */\n const normalizeInlineWhitespace = (snippet: string): string => {\n if (!snippet) return snippet;\n // Collapse ALL newlines and multiple whitespace into single spaces\n // This prevents MDX from interpreting '>' at start of line as block quote\n return snippet.replace(/\\s+/g, \" \").trim();\n };\n\n /**\n * Convert <p> tags that contain component tags to <span> tags.\n * This is necessary because components may render as block elements (like <div>),\n * and HTML doesn't allow block elements inside <p>. The browser would automatically\n * close the <p> before any block element, breaking the layout.\n */\n const convertParagraphsWithComponents = (snippet: string): string => {\n if (!snippet) return snippet;\n // Detect if a <p> tag contains component tags (PascalCase like <KbdGroup>)\n // If so, convert <p> to <span> to allow block-level children\n return snippet.replace(\n /<p(\\s[^>]*)?>([^]*?)<\\/p>/gi,\n (match, attrs, content) => {\n // Check if content contains component tags (PascalCase)\n if (/<[A-Z][A-Za-z0-9]*/.test(content)) {\n // Convert to span with inline-block display to preserve paragraph-like behavior\n const spanAttrs = attrs || \"\";\n return `<span${spanAttrs} style=\"display:block\">${content}</span>`;\n }\n return match;\n },\n );\n };\n\n type PreviewRenderOptions = {\n enableConsolePanel?: boolean;\n consoleScripts?: string[];\n };\n\n type MarkdownPreviewConfig = {\n defaultPreview?: boolean;\n };\n\n const extractInlineScripts = (snippet: string): {\n markup: string;\n scripts: string[];\n } => {\n if (!snippet) return { markup: snippet, scripts: [] };\n const scripts: string[] = [];\n const markup = snippet.replace(\n /<script\\b[^>]*>([\\s\\S]*?)<\\/script>/gi,\n (_, scriptBody: string) => {\n scripts.push((scriptBody || \"\").trim());\n return \"\";\n },\n );\n return { markup, scripts };\n };\n\n const toMdxPreview = (\n snippet: string,\n options: PreviewRenderOptions = {},\n ): { markup: string; scripts: string[] } => {\n if (!snippet) return { markup: \"\", scripts: [] };\n const { enableConsolePanel = false, consoleScripts = [] } = options;\n const extracted = extractInlineScripts(snippet);\n const resolvedConsoleScripts =\n enableConsolePanel && consoleScripts.length\n ? consoleScripts\n : enableConsolePanel\n ? extracted.scripts\n : [];\n const withoutScripts = extracted.markup;\n // Convert HTML comments to MDX comment blocks for preview sections\n const withoutComments = withoutScripts.replace(\n /<!--([\\s\\S]*?)-->/g,\n \"{/*$1*/}\",\n );\n // Convert <p> tags containing components to <span> to avoid HTML validity issues\n const withConvertedParagraphs =\n convertParagraphsWithComponents(withoutComments);\n // If the snippet contains user-defined <p> elements, preserve structure as-is\n if (/<p[\\s>]/i.test(withConvertedParagraphs)) {\n return {\n markup: normalizeInlineWhitespace(withConvertedParagraphs),\n scripts: resolvedConsoleScripts,\n };\n }\n // Normalize whitespace to prevent MDX from splitting inline text into paragraphs\n const normalized = normalizeInlineWhitespace(withConvertedParagraphs);\n return {\n markup: wrapTextNodes(normalized),\n scripts: resolvedConsoleScripts,\n };\n };\n\n const buildConsoleRuntimeSource = (\n rootId: string,\n panelId: string,\n userScript: string,\n ): string => {\n const serializedRootId = JSON.stringify(rootId);\n const serializedPanelId = JSON.stringify(panelId);\n const serializedUserScript = JSON.stringify(userScript);\n\n return `(function () {\n var root = document.getElementById(${serializedRootId});\n var panel = document.getElementById(${serializedPanelId});\n if (!root || !panel) return;\n\n var placeholder = panel.textContent || \"Waiting for logs...\";\n var hasLogs = false;\n\n var toText = function (value) {\n if (typeof value === \"string\") return value;\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n try {\n return JSON.stringify(value);\n } catch (_error) {\n return String(value);\n }\n };\n\n var append = function (level, args) {\n var stamp = new Date().toLocaleTimeString();\n var body = Array.prototype.map.call(args, toText).join(\" \");\n var line = \"[\" + stamp + \"] \" + String(level).toUpperCase() + \": \" + body;\n var current = panel.textContent || \"\";\n if (!hasLogs && current.trim() === placeholder.trim()) {\n panel.textContent = line;\n } else {\n panel.textContent = current ? current + \"\\\\n\" + line : line;\n }\n hasLogs = true;\n panel.scrollTop = panel.scrollHeight;\n };\n\n var methods = [\"log\", \"info\", \"warn\", \"error\"];\n var proxyConsole = Object.create(console);\n for (var i = 0; i < methods.length; i += 1) {\n (function (methodName) {\n var fallback = typeof console.log === \"function\" ? console.log.bind(console) : function () {};\n var original =\n typeof console[methodName] === \"function\"\n ? console[methodName].bind(console)\n : fallback;\n proxyConsole[methodName] = function () {\n var args = Array.prototype.slice.call(arguments);\n original.apply(console, args);\n append(methodName, args);\n };\n })(methods[i]);\n }\n\n try {\n var run = new Function(\"console\", \"root\", \"panel\", ${serializedUserScript});\n run(proxyConsole, root, panel);\n } catch (error) {\n var fallbackError = typeof console.error === \"function\" ? console.error.bind(console) : function () {};\n fallbackError(error);\n append(\"error\", [error]);\n }\n})();`;\n };\n\n const renderConsoleScripts = (\n rootId: string,\n panelId: string,\n scripts: string[],\n ): string => {\n if (!scripts.length) return \"\";\n return scripts\n .filter((script) => script && script.trim().length)\n .map((script) => {\n const runtimeSource = buildConsoleRuntimeSource(\n rootId,\n panelId,\n script,\n );\n const encoded = encodeURIComponent(runtimeSource);\n return `<script type=\"module\" src=\"data:text/javascript;charset=utf-8,${encoded}\"></script>`;\n })\n .join(\"\\n\");\n };\n\n const renderCompanionSourceMD = (sourceMD: string): string => {\n if (!sourceMD || !sourceMD.trim().length) return \"\";\n const normalizedSourceMD = sourceMD.trim();\n const match = normalizedSourceMD.match(/^```(\\S*)([^\\n]*)\\n([\\s\\S]*?)\\n```$/);\n if (!match) return sourceMD;\n\n const [, langRaw = \"\", flagsRaw = \"\", body = \"\"] = match;\n const lang = langRaw.trim().toLowerCase();\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(lang)) {\n return sourceMD;\n }\n\n const astroInfo = [\"astro\", flagsRaw.trim()].filter(Boolean).join(\" \");\n const scriptBody = body.replace(/\\s+$/, \"\");\n return [\n `\\`\\`\\`${astroInfo}`,\n \"<script>\",\n scriptBody,\n \"</script>\",\n \"```\",\n ].join(\"\\n\");\n };\n\n const extractCompanionScriptBody = (sourceMD: string): string => {\n if (!sourceMD || !sourceMD.trim().length) return \"\";\n const normalizedSourceMD = sourceMD.trim();\n const match = normalizedSourceMD.match(/^```(\\S*)([^\\n]*)\\n([\\s\\S]*?)\\n```$/);\n if (!match) return \"\";\n\n const [, langRaw = \"\", , body = \"\"] = match;\n const lang = langRaw.trim().toLowerCase();\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(lang)) {\n return \"\";\n }\n\n return body.replace(/\\s+$/, \"\");\n };\n\n const renderMergedAstroSourceMD = (\n fenceOpen: string,\n sourceBody: string,\n companionSourceMD: string,\n ): string => {\n const scriptBody = extractCompanionScriptBody(companionSourceMD);\n if (!scriptBody.length) {\n return [fenceOpen, sourceBody, \"```\"].filter(Boolean).join(\"\\n\");\n }\n\n const normalizedSourceBody = sourceBody.replace(/\\s+$/, \"\");\n const parts = [fenceOpen];\n if (normalizedSourceBody.length) {\n parts.push(normalizedSourceBody, \"\");\n }\n parts.push(\"<script>\", scriptBody, \"</script>\", \"```\");\n return parts.join(\"\\n\");\n };\n\n const renderPreviewBlock = (\n snippet: string,\n options: PreviewRenderOptions = {},\n ): string => {\n const { enableConsolePanel = false } = options;\n const preparedPreview = toMdxPreview(snippet, options);\n if (!preparedPreview.markup || !preparedPreview.markup.length) return \"\";\n\n if (!enableConsolePanel) {\n return `<div class=\"not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center\">\n${preparedPreview.markup}\n</div>`;\n }\n\n consolePreviewCounter += 1;\n const rootId = `sl-bejamas-console-preview-${consolePreviewCounter}`;\n const panelId = `${rootId}-output`;\n const scriptTags = renderConsoleScripts(\n rootId,\n panelId,\n preparedPreview.scripts,\n );\n const parts = [\n `<div id=\"${rootId}\" class=\"not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center\">`,\n preparedPreview.markup,\n \"</div>\",\n `<div class=\"not-content sl-bejamas-console-log-shell px-4 md:px-10 py-4 border border-border border-t-0\">`,\n `<pre id=\"${panelId}\" data-slot=\"event-log\" class=\"sl-bejamas-console-log w-full p-3 rounded-md bg-muted text-xs font-mono text-muted-foreground min-h-[80px] max-h-[200px] overflow-y-auto\">Waiting for logs...</pre>`,\n scriptTags && scriptTags.length ? scriptTags : null,\n \"</div>\",\n ].filter((part) => part !== null) as string[];\n\n return parts.join(\"\\n\");\n };\n\n const renderAstroPreviewsInMarkdown = (\n block: string,\n config: MarkdownPreviewConfig = {},\n ): string => {\n if (!block || !block.length) return block;\n const { defaultPreview = true } = config;\n\n const lines = block.split(\"\\n\");\n const out: string[] = [];\n let inFence = false;\n let fenceOpen = \"\";\n let currentFenceLang = \"\";\n let currentFenceFlags = new Set<string>();\n const fenceBody: string[] = [];\n\n const findCompanionConsoleFence = (\n startIndex: number,\n ): { start: number; end: number } | null => {\n let index = startIndex;\n while (index < lines.length) {\n const currentLine = lines[index];\n const trimmedLine = currentLine.trim();\n if (!trimmedLine.length || !trimmedLine.startsWith(\"```\")) {\n index += 1;\n continue;\n }\n\n const parsed = parseFenceInfo(trimmedLine.slice(3).trim());\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(parsed.lang)) {\n return null;\n }\n\n let end = index + 1;\n while (end < lines.length) {\n if (lines[end].trim().startsWith(\"```\")) {\n return { start: index, end };\n }\n end += 1;\n }\n\n return null;\n }\n return null;\n };\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex];\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n if (!inFence) {\n inFence = true;\n fenceOpen = line;\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n currentFenceLang = parsed.lang;\n currentFenceFlags = parsed.flags;\n fenceBody.length = 0;\n continue;\n }\n\n if (currentFenceLang === \"astro\") {\n const sourceCode = decodeEscapedScriptTags(fenceBody.join(\"\\n\").trim());\n const companionConsoleFence = currentFenceFlags.has(\"console\")\n ? findCompanionConsoleFence(lineIndex + 1)\n : null;\n const companionMarkdown = companionConsoleFence\n ? lines.slice(lineIndex + 1, companionConsoleFence.end + 1).join(\"\\n\")\n : \"\";\n const prepared = prepareExampleContent(\n companionMarkdown.length\n ? `${fenceOpen}\\n${sourceCode}\\n${line}\\n${companionMarkdown}`\n : `${fenceOpen}\\n${sourceCode}\\n${line}`,\n );\n const hasForcedPreviewFlag =\n currentFenceFlags.has(\"preview\") || currentFenceFlags.has(\"console\");\n const shouldPreview =\n !prepared.skipPreview && (defaultPreview || hasForcedPreviewFlag);\n if (\n prepared.snippet &&\n prepared.snippet.length &&\n shouldPreview\n ) {\n const previewBlock = renderPreviewBlock(prepared.snippet, {\n enableConsolePanel: prepared.enableConsolePanel,\n consoleScripts: prepared.consoleScripts,\n });\n if (previewBlock.length) {\n out.push(previewBlock);\n }\n out.push(\"\");\n }\n }\n\n if (currentFenceLang === \"astro\") {\n const normalizedFenceBody = decodeEscapedScriptTags(\n fenceBody.join(\"\\n\"),\n );\n const companionConsoleFence = currentFenceFlags.has(\"console\")\n ? findCompanionConsoleFence(lineIndex + 1)\n : null;\n const companionMarkdown = companionConsoleFence\n ? lines\n .slice(lineIndex + 1, companionConsoleFence.end + 1)\n .join(\"\\n\")\n : \"\";\n const prepared = companionMarkdown.length\n ? prepareExampleContent(\n `${fenceOpen}\\n${normalizedFenceBody}\\n${line}\\n${companionMarkdown}`,\n )\n : null;\n\n if (\n prepared?.companionSourceMD &&\n prepared.companionSourceMD.length &&\n prepared.mergeCompanionWithSource\n ) {\n out.push(\n renderMergedAstroSourceMD(\n fenceOpen,\n normalizedFenceBody,\n prepared.companionSourceMD,\n ),\n );\n if (companionConsoleFence) {\n lineIndex = companionConsoleFence.end;\n }\n } else {\n out.push(fenceOpen);\n if (normalizedFenceBody.length) {\n out.push(...normalizedFenceBody.split(\"\\n\"));\n }\n out.push(line);\n\n if (\n prepared?.companionSourceMD &&\n prepared.companionSourceMD.length &&\n companionConsoleFence\n ) {\n const companionIntro = lines\n .slice(lineIndex + 1, companionConsoleFence.start)\n .join(\"\\n\");\n if (companionIntro.length) {\n out.push(companionIntro);\n }\n out.push(renderCompanionSourceMD(prepared.companionSourceMD));\n lineIndex = companionConsoleFence.end;\n }\n }\n } else {\n out.push(fenceOpen);\n if (fenceBody.length) {\n out.push(...fenceBody);\n }\n out.push(line);\n }\n\n inFence = false;\n fenceOpen = \"\";\n currentFenceLang = \"\";\n currentFenceFlags = new Set<string>();\n fenceBody.length = 0;\n continue;\n }\n\n if (inFence) {\n fenceBody.push(line);\n continue;\n }\n\n out.push(line);\n }\n\n if (inFence) {\n out.push(fenceOpen);\n if (currentFenceLang === \"astro\") {\n const normalizedFenceBody = decodeEscapedScriptTags(\n fenceBody.join(\"\\n\"),\n );\n if (normalizedFenceBody.length) {\n out.push(...normalizedFenceBody.split(\"\\n\"));\n }\n } else if (fenceBody.length) {\n out.push(...fenceBody);\n }\n }\n\n return out.join(\"\\n\").trim();\n };\n\n const renderedDescriptionBodyMDX = renderAstroPreviewsInMarkdown(\n descriptionBodyMDX || \"\",\n );\n const renderedUsageMDX = renderAstroPreviewsInMarkdown(usageMDX || \"\", {\n defaultPreview: false,\n });\n const renderedApiMDX = renderAstroPreviewsInMarkdown(apiMDX || \"\");\n\n const primaryExampleSection =\n primaryExampleMDX && primaryExampleMDX.length\n ? `${renderPreviewBlock(primaryExampleMDX)}\n\n\\`\\`\\`astro\n${(() => {\n const lines = buildSnippetImportLines(primaryExampleMDX);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n})()}${primaryExampleMDX}\n\\`\\`\\``\n : null;\n\n const renderExampleItem = (\n headingLevel: \"###\" | \"####\",\n headingTitle: string,\n body: string,\n ): string => {\n const prepared = prepareExampleContent(body);\n const titleLine = `${headingLevel} ${headingTitle}`;\n const blocks: string[] = [titleLine];\n if (prepared.descriptionMD && prepared.descriptionMD.length) {\n blocks.push(prepared.descriptionMD);\n }\n\n if (\n prepared.snippet &&\n prepared.snippet.length &&\n prepared.sourceCode &&\n prepared.sourceCode.length &&\n !prepared.skipPreview\n ) {\n blocks.push(\n renderPreviewBlock(prepared.snippet, {\n enableConsolePanel: prepared.enableConsolePanel,\n consoleScripts: prepared.consoleScripts,\n }),\n );\n }\n\n if (prepared.sourceCode && prepared.sourceCode.length) {\n const sourceBlock = prepared.sourceFromFence\n ? prepared.sourceCode\n : `${(() => {\n const lines = buildSnippetImportLines(prepared.sourceCode);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n })()}${prepared.sourceCode}`;\n if (\n prepared.companionSourceMD &&\n prepared.companionSourceMD.length &&\n prepared.mergeCompanionWithSource\n ) {\n blocks.push(\n renderMergedAstroSourceMD(\"```astro\", sourceBlock, prepared.companionSourceMD),\n );\n } else {\n blocks.push(`\\`\\`\\`astro\n${sourceBlock}\n\\`\\`\\``);\n }\n if (\n prepared.companionIntroMD &&\n prepared.companionIntroMD.length &&\n !prepared.mergeCompanionWithSource\n ) {\n blocks.push(prepared.companionIntroMD);\n }\n if (\n prepared.companionSourceMD &&\n prepared.companionSourceMD.length &&\n !prepared.mergeCompanionWithSource\n ) {\n blocks.push(renderCompanionSourceMD(prepared.companionSourceMD));\n }\n if (prepared.trailingDescriptionMD && prepared.trailingDescriptionMD.length) {\n blocks.push(prepared.trailingDescriptionMD);\n }\n }\n\n return blocks.join(\"\\n\\n\");\n };\n\n const renderedExampleSections: string[] = [];\n if (examplesSections && examplesSections.length) {\n let implicitExampleCounter = 1;\n\n for (const section of examplesSections) {\n const sectionParts: string[] = [];\n const hasSectionTitle = !!(section.title && section.title.length);\n if (hasSectionTitle) {\n sectionParts.push(`### ${section.title}`);\n }\n\n if (section.introMD && section.introMD.length) {\n sectionParts.push(section.introMD);\n }\n\n if (section.items && section.items.length) {\n const itemHeadingLevel: \"###\" | \"####\" = hasSectionTitle\n ? \"####\"\n : \"###\";\n for (const item of section.items) {\n sectionParts.push(\n renderExampleItem(itemHeadingLevel, item.title, item.body),\n );\n }\n } else if (!hasSectionTitle && section.introMD && section.introMD.length) {\n const prepared = prepareExampleContent(section.introMD);\n if (prepared.snippet && prepared.snippet.length) {\n sectionParts.length = 0;\n sectionParts.push(\n renderExampleItem(\n \"###\",\n `Example ${implicitExampleCounter}`,\n section.introMD,\n ),\n );\n implicitExampleCounter += 1;\n }\n }\n\n if (sectionParts.length) {\n renderedExampleSections.push(sectionParts.join(\"\\n\\n\").trim());\n }\n }\n }\n if (examples && examples.length) {\n for (const ex of examples) {\n renderedExampleSections.push(\n `### ${ex.title}\n\n<div class=\"not-content\">\n <${ex.importName} />\n</div>\n\n\\`\\`\\`astro\n${ex.source}\n\\`\\`\\``,\n );\n }\n }\n\n const formatDefault = (val: unknown): string => {\n if (val == null) return \"\";\n let raw = String(val).trim();\n if (!raw.length) return \"\";\n // Normalize curly quotes to ASCII\n raw = raw\n .replace(/[\\u201C\\u201D\\u201E\\u201F]/g, '\"')\n .replace(/[\\u2018\\u2019]/g, \"'\");\n const isSingleQuoted = /^'[^']*'$/.test(raw);\n const isDoubleQuoted = /^\"[^\"]*\"$/.test(raw);\n const isBacktickSimple = /^`[^`]*`$/.test(raw) && raw.indexOf(\"${\") === -1;\n\n let content = raw;\n if (isSingleQuoted || isDoubleQuoted || isBacktickSimple) {\n const inner = raw.slice(1, -1);\n // Re-quote with standard double quotes\n content = `\"${inner}\"`;\n }\n // Escape table pipes\n content = content.replace(/\\|/g, \"\\\\|\");\n // Choose a backtick fence that doesn't appear in content\n const hasTick = content.includes(\"`\");\n const hasDoubleTick = content.includes(\"``\");\n const fence = !hasTick ? \"`\" : !hasDoubleTick ? \"``\" : \"```\";\n return `${fence}${content}${fence}`;\n };\n\n const installationSection = `## Installation\n\n<DocsTabs syncKey=\"pkg\">\n <DocsTabItem label=\"bun\">\n \\`\\`\\`bash\n bunx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"npm\">\n \\`\\`\\`bash\n npx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"pnpm\">\n \\`\\`\\`bash\n pnpm dlx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"yarn\">\n \\`\\`\\`bash\n yarn dlx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n</DocsTabs>`;\n\n const serializeFrontmatter = (\n label: string,\n value?: string,\n ): string | null => {\n if (!value || !value.length) return null;\n return `${label}: ${JSON.stringify(value)}`;\n };\n\n const lines = [\n \"---\",\n serializeFrontmatter(\"title\", title),\n serializeFrontmatter(\"description\", description),\n serializeFrontmatter(\"figmaUrl\", figmaUrl),\n \"---\",\n \"\",\n ...importLines,\n importLines.length ? \"\" : null,\n renderedDescriptionBodyMDX && renderedDescriptionBodyMDX.length\n ? renderedDescriptionBodyMDX\n : null,\n renderedDescriptionBodyMDX && renderedDescriptionBodyMDX.length ? \"\" : null,\n primaryExampleSection,\n primaryExampleSection ? \"\" : null,\n installationSection,\n \"\",\n renderedUsageMDX && renderedUsageMDX.length\n ? `## Usage\\n\\n${renderedUsageMDX}`\n : null,\n \"\",\n propsTable && propsTable.length\n ? `## Props\\n\\n| Prop | Type | Default |\\n|---|---|---|\\n${propsTable\n .map(\n (p) =>\n `| <code>${p.name}</code> | \\`${(p.type || \"\").replace(/\\|/g, \"\\\\|\")}\\` | ${formatDefault(p.defaultValue)} |`,\n )\n .join(\"\\n\")}`\n : propsList\n ? `## Props\\n\\n${propsList}`\n : null,\n (propsTable && propsTable.length) || propsList ? \"\" : null,\n renderedExampleSections.length\n ? `## Examples\\n\\n` + renderedExampleSections.join(\"\\n\\n\")\n : null,\n renderedExampleSections.length ? \"\" : null,\n renderedApiMDX && renderedApiMDX.length\n ? `## API Reference\\n\\n${renderedApiMDX}`\n : null,\n ].filter((v) => v !== null && v !== undefined);\n\n return lines.join(\"\\n\").trim() + \"\\n\";\n}\n","import { mkdirSync, existsSync } from \"fs\";\nimport { readdir, readFile, writeFile } from \"fs/promises\";\nimport { join, extname, dirname, relative, basename } from \"path\";\nimport {\n RESERVED_COMPONENTS,\n slugify,\n extractFrontmatter,\n toIdentifier,\n parseJsDocMetadata,\n extractPropsFromAstroProps,\n extractPropsFromDeclaredProps,\n resolveUiRoot,\n resolveOutDir,\n normalizeUsageMDX,\n normalizeBlockMDX,\n detectHasImportTopLevel,\n discoverExamples,\n extractComponentTagsFromMDX,\n createSourceFileFromFrontmatter,\n} from \"./utils\";\nimport {\n parseExamplesSections,\n extractComponentTagsFromPreviewMarkdown,\n extractComponentTagsFromExamplesSections,\n} from \"./examples\";\nimport { buildMdx } from \"./mdx-builder\";\nimport { logger } from \"@/src/utils/logger\";\nimport { spinner } from \"@/src/utils/spinner\";\nimport { getConfig } from \"@/src/utils/get-config\";\n\ninterface ComponentEntry {\n /** The main component name (PascalCase), e.g., \"Card\" */\n name: string;\n /** Path to the main .astro file */\n filePath: string;\n /** The folder name (lowercase/kebab-case), e.g., \"card\" */\n folderName: string;\n /** Whether this is a folder-based component with barrel exports */\n isFolder: boolean;\n /** List of subcomponent names exported from the barrel, e.g., [\"CardHeader\", \"CardTitle\"] */\n namedExports: string[];\n}\n\n/**\n * Discover components in the components directory.\n * Supports both:\n * - Old pattern: flat .astro files in components/\n * - New pattern: folders with index.ts barrel exports\n */\nasync function discoverComponents(\n componentsDir: string,\n): Promise<ComponentEntry[]> {\n const entries: ComponentEntry[] = [];\n const dirEntries = await readdir(componentsDir, { withFileTypes: true });\n\n for (const entry of dirEntries) {\n if (entry.isDirectory()) {\n // New pattern: folder with barrel exports\n const folderPath = join(componentsDir, entry.name);\n const indexPath = join(folderPath, \"index.ts\");\n\n if (existsSync(indexPath)) {\n // Parse the barrel file to find exports\n const indexContent = await readFile(indexPath, \"utf-8\");\n const namedExports = parseBarrelExports(indexContent);\n\n // Find the main component (first export or the one matching folder name)\n const mainComponentName = findMainComponent(namedExports, entry.name);\n\n if (mainComponentName) {\n const mainFilePath = join(folderPath, `${mainComponentName}.astro`);\n\n if (existsSync(mainFilePath)) {\n // Filter out the main component from namedExports (it will be imported separately)\n const subComponents = namedExports.filter(\n (n) => n !== mainComponentName,\n );\n\n entries.push({\n name: mainComponentName,\n filePath: mainFilePath,\n folderName: entry.name,\n isFolder: true,\n namedExports: subComponents,\n });\n }\n }\n }\n } else if (entry.isFile() && extname(entry.name).toLowerCase() === \".astro\") {\n // Old pattern: flat .astro file\n const componentName = entry.name.replace(/\\.astro$/i, \"\");\n entries.push({\n name: componentName,\n filePath: join(componentsDir, entry.name),\n folderName: \"\",\n isFolder: false,\n namedExports: [],\n });\n }\n }\n\n return entries;\n}\n\nfunction buildComponentFolderMap(\n components: ComponentEntry[],\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const component of components) {\n if (!component.isFolder || !component.folderName) continue;\n map[component.name] = component.folderName;\n for (const sub of component.namedExports) {\n map[sub] = component.folderName;\n }\n }\n return map;\n}\n\n/**\n * Parse a barrel (index.ts) file to extract named exports.\n * Handles patterns like:\n * - export { default as Card } from \"./Card.astro\";\n * - export { default as CardHeader } from \"./CardHeader.astro\";\n */\nfunction parseBarrelExports(content: string): string[] {\n const exports: string[] = [];\n\n // Match: export { default as ComponentName } from \"...\"\n const exportRegex = /export\\s*\\{\\s*default\\s+as\\s+(\\w+)\\s*\\}/g;\n let match: RegExpExecArray | null;\n\n while ((match = exportRegex.exec(content)) !== null) {\n exports.push(match[1]);\n }\n\n return exports;\n}\n\n/**\n * Find the main component from a list of exports.\n * The main component is typically the one that matches the folder name (PascalCase).\n */\nfunction findMainComponent(\n exports: string[],\n folderName: string,\n): string | null {\n if (exports.length === 0) return null;\n\n // Convert folder name to PascalCase for comparison\n // e.g., \"card\" -> \"Card\", \"input-group\" -> \"InputGroup\"\n const expectedName = folderName\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n\n // First, try to find exact match\n const exactMatch = exports.find((e) => e === expectedName);\n if (exactMatch) return exactMatch;\n\n // Otherwise, return the first export (usually the main component)\n return exports[0];\n}\n\nasync function main() {\n const DEBUG =\n process.env.BEJAMAS_DEBUG === \"1\" || process.env.BEJAMAS_DEBUG === \"true\";\n const cwd =\n process.env.BEJAMAS_DOCS_CWD && process.env.BEJAMAS_DOCS_CWD.length\n ? (process.env.BEJAMAS_DOCS_CWD as string)\n : process.cwd();\n const config = await getConfig(cwd);\n const componentsAlias = (\n config?.aliases?.ui ||\n config?.aliases?.components ||\n \"@bejamas/ui/components\"\n ).replace(/\\/$/, \"\");\n const componentsDirFromConfig =\n config?.resolvedPaths?.ui || config?.resolvedPaths?.components;\n let uiRoot = resolveUiRoot(cwd);\n let componentsDir = join(uiRoot, \"src\", \"components\");\n if (componentsDirFromConfig) {\n componentsDir = componentsDirFromConfig;\n uiRoot = dirname(dirname(componentsDirFromConfig));\n }\n if (!existsSync(componentsDir)) {\n // Fallback to ui package components if the configured path is missing.\n componentsDir = join(uiRoot, \"src\", \"components\");\n }\n const outDir = resolveOutDir(cwd);\n mkdirSync(outDir, { recursive: true });\n\n if (DEBUG) {\n logger.info(`[docs-generator] cwd: ${cwd}`);\n logger.info(`[docs-generator] uiRoot: ${uiRoot}`);\n logger.info(`[docs-generator] componentsDir: ${componentsDir}`);\n logger.info(`[docs-generator] outDir: ${outDir}`);\n }\n\n // Discover all components (both flat files and folders)\n const components = await discoverComponents(componentsDir);\n const componentFolderMap = buildComponentFolderMap(components);\n\n if (DEBUG) {\n logger.info(`[docs-generator] components found: ${components.length}`);\n if (components.length) {\n logger.info(\n `[docs-generator] first few: ${components\n .slice(0, 5)\n .map((c) => c.name)\n .join(\", \")}`,\n );\n }\n }\n\n let generatedCount = 0;\n const total = components.length;\n const spin = spinner(`Generating docs (0/${total})`).start();\n\n for (const component of components) {\n const { name: pascal, filePath, folderName, isFolder, namedExports } = component;\n\n const astroFile = await readFile(filePath, \"utf-8\");\n const frontmatterCode = extractFrontmatter(astroFile);\n const sourceFile = createSourceFileFromFrontmatter(frontmatterCode);\n const meta = parseJsDocMetadata(frontmatterCode);\n const declaredProps = extractPropsFromDeclaredProps(sourceFile);\n const destructuredProps = extractPropsFromAstroProps(sourceFile);\n\n // Build props table preferring declared types; merge defaults from destructuring\n const defaultsMap = new Map<string, string | null>();\n for (const p of destructuredProps) {\n if (p.name && p.hasDefault) {\n defaultsMap.set(p.name, p.defaultValue || null);\n }\n }\n\n const propsTable = (declaredProps.length ? declaredProps : []).map((p) => ({\n name: p.name,\n type: p.type,\n required: !p.optional,\n defaultValue: defaultsMap.has(p.name) ? defaultsMap.get(p.name)! : null,\n }));\n\n const slug = slugify(pascal);\n const title = meta.title || meta.name || pascal;\n const description = meta.description || \"\";\n const descriptionBodyMDX = (meta as any).descriptionBodyMDX || \"\";\n const figmaUrl = (meta as any).figmaUrl || \"\";\n // Do not display props if there is no declared Props\n const propsList = \"\";\n\n const importName = pascal;\n // Use folder-based barrel import for new pattern, file-based for old pattern\n const importPath = isFolder\n ? `${componentsAlias}/${folderName}`\n : `${componentsAlias}/${pascal}.astro`;\n\n const { text: usageMDX, hasImport: hasImportUsage } = normalizeUsageMDX(\n meta.usageMDX || \"\",\n pascal,\n );\n const primaryExampleMDX = normalizeBlockMDX(\n meta.primaryExampleMDX || \"\",\n ).trim();\n const examplesMDX = normalizeBlockMDX(meta.examplesMDX || \"\").trim();\n const apiMDX = normalizeBlockMDX(meta.apiMDX || \"\").trim();\n const hasImportExamples = detectHasImportTopLevel(examplesMDX, pascal);\n const hasImportPrimary = detectHasImportTopLevel(primaryExampleMDX, pascal);\n const hasImport = hasImportUsage || hasImportExamples || hasImportPrimary;\n\n let exampleRelPaths: string[] = [];\n let examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }> = [];\n const parsedExamplesSections = parseExamplesSections(examplesMDX);\n if (parsedExamplesSections.length === 0) {\n exampleRelPaths = await discoverExamples(filePath, componentsDir);\n examples = (exampleRelPaths || []).map((rel) => {\n const posixRel = rel\n .split(require(\"path\").sep)\n .join(require(\"path\").posix.sep);\n const importPathEx = `${componentsAlias}/${posixRel}`;\n const abs = join(componentsDir, rel);\n const source = require(\"fs\").readFileSync(abs, \"utf-8\");\n const base = toIdentifier(\n require(\"path\").basename(rel, require(\"path\").extname(rel)),\n );\n const importNameEx = `${pascal}${base}`;\n const titleEx = base;\n return { importName: importNameEx, importPath: importPathEx, title: titleEx, source };\n });\n }\n\n const usedInUsage = extractComponentTagsFromPreviewMarkdown(usageMDX, {\n defaultPreview: false,\n }).filter((n) => n !== pascal);\n const usedInDescription = extractComponentTagsFromPreviewMarkdown(\n descriptionBodyMDX,\n ).filter((n) => n !== pascal);\n const usedInExamples = extractComponentTagsFromExamplesSections(\n parsedExamplesSections,\n ).filter((n) => n !== pascal);\n const usedInPrimary = extractComponentTagsFromMDX(primaryExampleMDX).filter(\n (n) => n !== pascal,\n );\n const usedInApi = extractComponentTagsFromPreviewMarkdown(apiMDX).filter(\n (n) => n !== pascal,\n );\n const autoSet = new Set<string>([\n ...usedInUsage,\n ...usedInDescription,\n ...usedInExamples,\n ...usedInPrimary,\n ...usedInApi,\n ]);\n\n // For folder-based components, add subcomponents used in examples to namedExports\n const usedNamedExports = isFolder\n ? namedExports.filter((n) => autoSet.has(n))\n : [];\n\n // Remove subcomponents from autoSet (they'll be included via namedExports)\n if (isFolder) {\n for (const n of namedExports) {\n autoSet.delete(n);\n }\n }\n\n const autoImports = Array.from(autoSet)\n .filter((name) => !RESERVED_COMPONENTS.has(name))\n .filter((name) => true);\n\n const lucideIcons = autoImports.filter((n) => /Icon$/.test(n));\n const uiAutoImports = autoImports.filter((n) => !/Icon$/.test(n));\n\n const mdx = buildMdx({\n importName,\n importPath,\n title,\n description,\n usageMDX,\n hasImport,\n propsList,\n propsTable,\n examples,\n examplesSections: parsedExamplesSections,\n componentFolderMap,\n autoImports: uiAutoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource: astroFile.trim(),\n commandName: slug,\n figmaUrl,\n descriptionBodyMDX,\n componentsAlias,\n // Pass subcomponents as named exports for folder-based components\n namedExports: isFolder ? usedNamedExports : undefined,\n apiMDX,\n });\n const outFile = join(outDir, `${slug}.mdx`);\n mkdirSync(dirname(outFile), { recursive: true });\n await writeFile(outFile, mdx, \"utf-8\");\n generatedCount += 1;\n spin.text = `Generating docs (${generatedCount}/${total}) - ${title}`;\n if (DEBUG) logger.info(`Generated ${outFile}`);\n }\n spin.succeed(\n `Created ${generatedCount} file${generatedCount === 1 ? \"\" : \"s\"}:`,\n );\n // log all files with relative paths, sorted alphabetically\n const relPaths = components\n .map((c) => {\n const slug = slugify(c.name);\n const outFile = join(outDir, `${slug}.mdx`);\n return relative(cwd, outFile);\n })\n .sort((a, b) => a.localeCompare(b));\n relPaths.forEach((p) => {\n logger.log(` - ${p}`);\n });\n logger.break();\n}\n\nexport async function runDocsGenerator(): Promise<void> {\n await main();\n}\n\nif (\n process.env.BEJAMAS_SKIP_AUTO_RUN !== \"1\" &&\n process.env.BEJAMAS_SKIP_AUTO_RUN !== \"true\"\n) {\n runDocsGenerator().catch((err) => {\n logger.error(String(err));\n process.exit(1);\n });\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"generate-mdx-C8gXBOHp.js","names":["fences: ParsedFenceBlock[]","active:\n | {\n startLine: number;\n openLine: string;\n lang: string;\n flags: Set<string>;\n bodyLines: string[];\n }\n | null","consoleScripts: string[]","sections: ParsedExampleSection[]","currentSection: MutableSection | null","currentItem: MutableItem | null","match: RegExpExecArray | null","fenceBody: string[]","path","lines: string[]","mainImportLine: string | null","extractTags","m: RegExpExecArray | null","external: string[]","internal: string[]","scripts: string[]","out: string[]","fenceBody: string[]","blocks: string[]","renderedExampleSections: string[]","sectionParts: string[]","itemHeadingLevel: \"###\" | \"####\"","entries: ComponentEntry[]","map: Record<string, string>","exports: string[]","match: RegExpExecArray | null","exampleRelPaths: string[]","examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }>"],"sources":["../src/docs/generate-mdx/examples.ts","../src/docs/generate-mdx/mdx-builder.ts","../src/docs/generate-mdx/index.ts"],"sourcesContent":["export interface ParsedExampleItem {\n title: string;\n body: string;\n}\n\nexport interface ParsedExampleSection {\n /**\n * Null means \"implicit section\" (no explicit ## heading in @examples).\n */\n title: string | null;\n /**\n * Markdown text that appears between a ## section heading and the first ### item.\n * For implicit sections, this is content before the first ### heading.\n */\n introMD: string;\n items: ParsedExampleItem[];\n}\n\nexport interface PreparedExampleContent {\n descriptionMD: string;\n /**\n * Renderable snippet used in preview (markup only).\n */\n snippet: string;\n /**\n * Source code shown in the code block.\n */\n sourceCode: string;\n /**\n * True when source came from an explicit ```astro fenced block.\n */\n sourceFromFence: boolean;\n /**\n * True when the fenced astro block includes the `nopreview` flag.\n */\n skipPreview: boolean;\n /**\n * True when the fenced astro block includes the `console` flag.\n */\n enableConsolePanel: boolean;\n /**\n * Explicit console scripts sourced from an adjacent JS/TS fence.\n */\n consoleScripts: string[];\n /**\n * Raw markdown for a paired source fence that should render after the astro block.\n */\n companionSourceMD: string;\n /**\n * Markdown that appears between the astro fence and its paired JS/TS fence.\n */\n companionIntroMD: string;\n /**\n * Markdown that appears after a paired JS/TS fence.\n */\n trailingDescriptionMD: string;\n /**\n * True when the paired JS/TS fence had no prose between it and the astro fence.\n */\n mergeCompanionWithSource: boolean;\n}\n\nexport interface FenceInfo {\n lang: string;\n flags: Set<string>;\n}\n\ninterface PreviewRenderConfig {\n defaultPreview?: boolean;\n}\n\ntype MutableSection = {\n title: string | null;\n intro: string[];\n items: Array<{ title: string; body: string[] }>;\n};\n\ntype MutableItem = { title: string; body: string[] };\n\nfunction createImplicitSection(): MutableSection {\n return { title: null, intro: [], items: [] };\n}\n\nfunction normalizeSection(section: MutableSection): ParsedExampleSection {\n return {\n title: section.title,\n introMD: section.intro.join(\"\\n\").trim(),\n items: section.items.map((item) => ({\n title: item.title,\n body: item.body.join(\"\\n\").trim(),\n })),\n };\n}\n\nfunction pushItem(section: MutableSection | null, item: MutableItem | null): void {\n if (!section || !item) return;\n if (!item.title.trim().length && !item.body.join(\"\\n\").trim().length) return;\n section.items.push(item);\n}\n\nfunction pushSection(\n sections: ParsedExampleSection[],\n section: MutableSection | null,\n): void {\n if (!section) return;\n const normalized = normalizeSection(section);\n if (\n !normalized.title &&\n !normalized.introMD.length &&\n normalized.items.length === 0\n ) {\n return;\n }\n sections.push(normalized);\n}\n\nfunction extractHeading(line: string, level: 2 | 3): string | null {\n const pattern = level === 2 ? /^##(?!#)\\s+(.+)$/ : /^###(?!#)\\s+(.+)$/;\n const match = line.trim().match(pattern);\n return match ? match[1].trim() : null;\n}\n\nfunction splitDescriptionAndSnippetRaw(body: string): {\n descriptionMD: string;\n snippet: string;\n} {\n if (!body || !body.trim().length) return { descriptionMD: \"\", snippet: \"\" };\n const lines = body.split(\"\\n\");\n let snippetStartIdx = -1;\n for (let i = 0; i < lines.length; i += 1) {\n const ln = lines[i];\n if (!ln.trim().length) continue;\n if (/^\\s*[<{]/.test(ln)) {\n snippetStartIdx = i;\n break;\n }\n }\n if (snippetStartIdx <= 0) {\n return { descriptionMD: \"\", snippet: body.trim() };\n }\n return {\n descriptionMD: lines.slice(0, snippetStartIdx).join(\"\\n\").trim(),\n snippet: lines.slice(snippetStartIdx).join(\"\\n\").trim(),\n };\n}\n\nfunction splitAstroFrontmatter(sourceCode: string): {\n frontmatter: string;\n markup: string;\n} {\n const match = sourceCode.match(/^---\\n([\\s\\S]*?)\\n---\\n?([\\s\\S]*)$/);\n if (!match) {\n return { frontmatter: \"\", markup: sourceCode.trim() };\n }\n return {\n frontmatter: match[1].trim(),\n markup: match[2].trim(),\n };\n}\n\nfunction stripFrontmatterComments(frontmatter: string): string {\n if (!frontmatter || !frontmatter.length) return \"\";\n return frontmatter\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\\n\")\n .replace(/^[ \\t]*\\/\\/.*$/gm, \"\")\n .trim();\n}\n\nfunction isImportOnlyFrontmatter(frontmatter: string): boolean {\n const cleaned = stripFrontmatterComments(frontmatter);\n if (!cleaned.length) return true;\n\n let remaining = cleaned;\n const importFromPattern =\n /(?:^|\\n)\\s*import\\s+(?:type\\s+)?[\\s\\S]*?\\s+from\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n const importSideEffectPattern =\n /(?:^|\\n)\\s*import\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n const exportFromPattern =\n /(?:^|\\n)\\s*export\\s+(?:\\*\\s+from|\\{[\\s\\S]*?\\}\\s+from)\\s+['\"][^'\"]+['\"]\\s*;?(?=\\n|$)/g;\n\n remaining = remaining\n .replace(importFromPattern, \"\\n\")\n .replace(importSideEffectPattern, \"\\n\")\n .replace(exportFromPattern, \"\\n\")\n .trim();\n\n return remaining.replace(/[;\\s]/g, \"\").length === 0;\n}\n\nfunction isAstroFrontmatterPreviewUnsafe(frontmatter: string): boolean {\n const cleaned = stripFrontmatterComments(frontmatter);\n if (!cleaned.length) return false;\n\n const runtimeTokenPattern =\n /\\b(?:const|let|var|function|class|if|for|while|switch|try|catch|return|throw|await|new)\\b|=>|Astro\\./;\n if (runtimeTokenPattern.test(cleaned)) return true;\n\n return !isImportOnlyFrontmatter(cleaned);\n}\n\nexport function parseFenceInfo(infoRaw: string): FenceInfo {\n const parts = (infoRaw || \"\")\n .trim()\n .split(/\\s+/)\n .filter((v) => v.length)\n .map((v) => v.toLowerCase());\n if (!parts.length) return { lang: \"\", flags: new Set<string>() };\n const [lang, ...flags] = parts;\n return { lang, flags: new Set(flags) };\n}\n\nexport function decodeEscapedScriptTags(source: string): string {\n if (!source || !source.length) return source;\n return source\n .replace(/<script>/gi, \"<script>\")\n .replace(/<\\/script>/gi, \"</script>\");\n}\n\ntype ParsedFenceBlock = {\n openLine: string;\n closeLine: string;\n lang: string;\n flags: Set<string>;\n body: string;\n startLine: number;\n endLine: number;\n};\n\nconst CONSOLE_SCRIPT_FENCE_LANGS = new Set([\n \"js\",\n \"ts\",\n \"javascript\",\n \"typescript\",\n]);\n\nfunction parseFenceBlocks(body: string): {\n lines: string[];\n fences: ParsedFenceBlock[];\n} {\n const lines = body.split(\"\\n\");\n const fences: ParsedFenceBlock[] = [];\n let active:\n | {\n startLine: number;\n openLine: string;\n lang: string;\n flags: Set<string>;\n bodyLines: string[];\n }\n | null = null;\n\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"```\")) {\n if (active) active.bodyLines.push(line);\n continue;\n }\n\n if (!active) {\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n active = {\n startLine: i,\n openLine: line,\n lang: parsed.lang,\n flags: parsed.flags,\n bodyLines: [],\n };\n continue;\n }\n\n fences.push({\n openLine: active.openLine,\n closeLine: line,\n lang: active.lang,\n flags: active.flags,\n body: active.bodyLines.join(\"\\n\"),\n startLine: active.startLine,\n endLine: i,\n });\n active = null;\n }\n\n return { lines, fences };\n}\n\nfunction serializeFenceBlock(fence: ParsedFenceBlock): string {\n const parts = [fence.openLine];\n if (fence.body.length) parts.push(fence.body);\n parts.push(fence.closeLine);\n return parts.join(\"\\n\");\n}\n\nfunction buildRemainingMarkdown(\n lines: string[],\n fences: ParsedFenceBlock[],\n consumedFenceIndexes: Set<number>,\n): string {\n const skippedLines = new Set<number>();\n for (const [index, fence] of fences.entries()) {\n if (!consumedFenceIndexes.has(index)) continue;\n for (let line = fence.startLine; line <= fence.endLine; line += 1) {\n skippedLines.add(line);\n }\n }\n\n return lines\n .filter((_, index) => !skippedLines.has(index))\n .join(\"\\n\")\n .trim();\n}\n\nfunction extractFirstAstroFence(body: string): {\n sourceCode: string;\n descriptionMD: string;\n skipPreview: boolean;\n enableConsolePanel: boolean;\n consoleScripts: string[];\n companionSourceMD: string;\n companionIntroMD: string;\n trailingDescriptionMD: string;\n mergeCompanionWithSource: boolean;\n} | null {\n if (!body || !body.trim().length) return null;\n const { lines, fences } = parseFenceBlocks(body);\n const astroFenceIndex = fences.findIndex((fence) => fence.lang === \"astro\");\n if (astroFenceIndex === -1) return null;\n\n const astroFence = fences[astroFenceIndex];\n const consumedFenceIndexes = new Set<number>([astroFenceIndex]);\n let companionSourceMD = \"\";\n let consoleScripts: string[] = [];\n let companionIntroMD = \"\";\n let trailingDescriptionMD = \"\";\n let mergeCompanionWithSource = false;\n\n if (astroFence.flags.has(\"console\")) {\n const nextFence = fences[astroFenceIndex + 1];\n if (nextFence && CONSOLE_SCRIPT_FENCE_LANGS.has(nextFence.lang)) {\n consumedFenceIndexes.add(astroFenceIndex + 1);\n companionSourceMD = serializeFenceBlock(nextFence);\n companionIntroMD = lines\n .slice(astroFence.endLine + 1, nextFence.startLine)\n .join(\"\\n\")\n .trim();\n trailingDescriptionMD = lines.slice(nextFence.endLine + 1).join(\"\\n\").trim();\n mergeCompanionWithSource = companionIntroMD.length === 0;\n const normalizedScript = nextFence.body.trim();\n if (normalizedScript.length) {\n consoleScripts = [normalizedScript];\n }\n }\n }\n\n const descriptionMD = companionSourceMD.length\n ? lines.slice(0, astroFence.startLine).join(\"\\n\").trim()\n : buildRemainingMarkdown(lines, fences, consumedFenceIndexes);\n\n return {\n sourceCode: decodeEscapedScriptTags(astroFence.body.trim()),\n descriptionMD,\n skipPreview: astroFence.flags.has(\"nopreview\"),\n enableConsolePanel: astroFence.flags.has(\"console\"),\n consoleScripts,\n companionSourceMD,\n companionIntroMD,\n trailingDescriptionMD,\n mergeCompanionWithSource,\n };\n}\n\nexport function parseExamplesSections(examplesMDX: string): ParsedExampleSection[] {\n if (!examplesMDX || !examplesMDX.trim().length) return [];\n\n const sections: ParsedExampleSection[] = [];\n const lines = examplesMDX.split(\"\\n\");\n let currentSection: MutableSection | null = null;\n let currentItem: MutableItem | null = null;\n let inFence = false;\n\n for (const line of lines) {\n const trimmed = line.trim();\n\n if (trimmed.startsWith(\"```\")) {\n inFence = !inFence;\n if (!currentSection) currentSection = createImplicitSection();\n if (currentItem) currentItem.body.push(line);\n else currentSection.intro.push(line);\n continue;\n }\n\n if (!inFence) {\n const h2 = extractHeading(line, 2);\n if (h2) {\n pushItem(currentSection, currentItem);\n currentItem = null;\n pushSection(sections, currentSection);\n currentSection = { title: h2, intro: [], items: [] };\n continue;\n }\n\n const h3 = extractHeading(line, 3);\n if (h3) {\n if (!currentSection) currentSection = createImplicitSection();\n pushItem(currentSection, currentItem);\n currentItem = { title: h3, body: [] };\n continue;\n }\n }\n\n if (!currentSection) currentSection = createImplicitSection();\n if (currentItem) currentItem.body.push(line);\n else currentSection.intro.push(line);\n }\n\n pushItem(currentSection, currentItem);\n pushSection(sections, currentSection);\n return sections;\n}\n\nexport function prepareExampleContent(body: string): PreparedExampleContent {\n if (!body || !body.trim().length) {\n return {\n descriptionMD: \"\",\n snippet: \"\",\n sourceCode: \"\",\n sourceFromFence: false,\n skipPreview: false,\n enableConsolePanel: false,\n consoleScripts: [],\n companionSourceMD: \"\",\n companionIntroMD: \"\",\n trailingDescriptionMD: \"\",\n mergeCompanionWithSource: false,\n };\n }\n\n const fenced = extractFirstAstroFence(body);\n if (fenced) {\n const { frontmatter, markup } = splitAstroFrontmatter(fenced.sourceCode);\n const unsafeFrontmatter = isAstroFrontmatterPreviewUnsafe(frontmatter);\n return {\n descriptionMD: fenced.descriptionMD,\n snippet: markup,\n sourceCode: fenced.sourceCode,\n sourceFromFence: true,\n skipPreview: fenced.skipPreview || unsafeFrontmatter,\n enableConsolePanel: fenced.enableConsolePanel,\n consoleScripts: fenced.consoleScripts,\n companionSourceMD: fenced.companionSourceMD,\n companionIntroMD: fenced.companionIntroMD,\n trailingDescriptionMD: fenced.trailingDescriptionMD,\n mergeCompanionWithSource: fenced.mergeCompanionWithSource,\n };\n }\n\n const split = splitDescriptionAndSnippetRaw(body);\n return {\n descriptionMD: split.descriptionMD,\n snippet: split.snippet,\n sourceCode: split.snippet,\n sourceFromFence: false,\n skipPreview: false,\n enableConsolePanel: false,\n consoleScripts: [],\n companionSourceMD: \"\",\n companionIntroMD: \"\",\n trailingDescriptionMD: \"\",\n mergeCompanionWithSource: false,\n };\n}\n\nfunction extractTags(block: string): string[] {\n if (!block || !block.length) return [];\n const found = new Set<string>();\n const tagRegex = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n let match: RegExpExecArray | null;\n while ((match = tagRegex.exec(block)) !== null) {\n found.add(match[1]);\n }\n return Array.from(found);\n}\n\nexport function extractComponentTagsFromPreviewMarkdown(\n block: string,\n config: PreviewRenderConfig = {},\n): string[] {\n if (!block || !block.length) return [];\n const { defaultPreview = true } = config;\n const found = new Set<string>();\n const lines = block.split(\"\\n\");\n let inFence = false;\n let fenceOpen = \"\";\n let currentFenceLang = \"\";\n let currentFenceFlags = new Set<string>();\n const fenceBody: string[] = [];\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n if (!inFence) {\n inFence = true;\n fenceOpen = line;\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n currentFenceLang = parsed.lang;\n currentFenceFlags = parsed.flags;\n fenceBody.length = 0;\n continue;\n }\n\n if (currentFenceLang === \"astro\") {\n const sourceCode = fenceBody.join(\"\\n\").trim();\n const prepared = prepareExampleContent(\n `${fenceOpen}\\n${sourceCode}\\n${line}`,\n );\n const hasForcedPreviewFlag =\n currentFenceFlags.has(\"preview\") || currentFenceFlags.has(\"console\");\n const shouldPreview =\n !prepared.skipPreview && (defaultPreview || hasForcedPreviewFlag);\n if (shouldPreview) {\n for (const tag of extractTags(prepared.snippet)) found.add(tag);\n }\n }\n\n inFence = false;\n fenceOpen = \"\";\n currentFenceLang = \"\";\n currentFenceFlags = new Set<string>();\n fenceBody.length = 0;\n continue;\n }\n\n if (inFence) {\n fenceBody.push(line);\n continue;\n }\n\n for (const tag of extractTags(line)) found.add(tag);\n }\n\n return Array.from(found);\n}\n\nexport function extractComponentTagsFromExamplesSections(\n sections: ParsedExampleSection[],\n): string[] {\n if (!sections?.length) return [];\n const found = new Set<string>();\n for (const section of sections) {\n for (const tag of extractComponentTagsFromPreviewMarkdown(section.introMD)) {\n found.add(tag);\n }\n for (const item of section.items) {\n const prepared = prepareExampleContent(item.body);\n if (prepared.skipPreview) continue;\n for (const tag of extractTags(prepared.snippet)) found.add(tag);\n }\n }\n return Array.from(found);\n}\n","import {\n decodeEscapedScriptTags,\n parseFenceInfo,\n prepareExampleContent,\n type ParsedExampleSection,\n} from \"./examples\";\n\n/**\n * Check if an import path uses the new barrel export pattern (no .astro extension)\n */\nfunction isBarrelImport(path: string): boolean {\n return !path.endsWith(\".astro\");\n}\n\n/**\n * Convert a PascalCase component name to its folder path (kebab-case).\n * Examples:\n * - \"Card\" → \"card\"\n * - \"CardHeader\" → \"card\"\n * - \"InputGroup\" → \"input-group\"\n * - \"InputGroupAddon\" → \"input-group\"\n * - \"StickySurface\" → \"sticky-surface\"\n * - \"RadioGroup\" → \"radio-group\"\n * - \"RadioGroupItem\" → \"radio-group\"\n */\nfunction componentToFolder(name: string): string {\n // Known multi-word component families (in PascalCase order)\n // These map to kebab-case folder names\n const multiWordFamilies = [\n \"InputGroup\",\n \"LinkGroup\",\n \"RadioGroup\",\n \"ButtonGroup\",\n \"StickySurface\",\n ];\n\n // Check for multi-word families first (order matters - longer matches first)\n const sortedFamilies = multiWordFamilies.sort((a, b) => b.length - a.length);\n for (const family of sortedFamilies) {\n if (name === family || name.startsWith(family)) {\n // InputGroup → input-group\n return family.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase();\n }\n }\n\n // For regular names, extract the base component (first PascalCase word)\n // CardHeader → Card → card\n // AvatarFallback → Avatar → avatar\n const baseMatch = name.match(/^[A-Z][a-z]*/);\n return baseMatch ? baseMatch[0].toLowerCase() : name.toLowerCase();\n}\n\nfunction resolveComponentFolder(\n name: string,\n componentFolderMap?: Record<string, string>,\n): string {\n if (!componentFolderMap) return componentToFolder(name);\n const direct = componentFolderMap[name];\n if (direct && direct.length) return direct;\n\n // Fallback: try the longest mapped prefix (e.g. InputGroup* -> input-group)\n const prefixMatch = Object.keys(componentFolderMap)\n .filter((key) => name.startsWith(key))\n .sort((a, b) => b.length - a.length)[0];\n if (prefixMatch) return componentFolderMap[prefixMatch];\n\n return componentToFolder(name);\n}\n\n/**\n * Group component names by their folder path\n */\nfunction groupComponentsByFolder(\n components: string[],\n componentFolderMap?: Record<string, string>,\n): Map<string, string[]> {\n const groups = new Map<string, string[]>();\n for (const comp of components) {\n const folder = resolveComponentFolder(comp, componentFolderMap);\n if (!groups.has(folder)) {\n groups.set(folder, []);\n }\n groups.get(folder)!.push(comp);\n }\n return groups;\n}\n\n/**\n * Generate import lines for UI components using the barrel import pattern\n */\nfunction generateBarrelImports(\n components: string[],\n componentsAlias: string,\n componentFolderMap?: Record<string, string>,\n): string[] {\n const groups = groupComponentsByFolder(components, componentFolderMap);\n const lines: string[] = [];\n\n // Sort folders alphabetically for consistent output\n const sortedFolders = Array.from(groups.keys()).sort();\n\n for (const folder of sortedFolders) {\n const names = groups.get(folder)!.sort();\n lines.push(\n `import { ${names.join(\", \")} } from '${componentsAlias}/${folder}';`,\n );\n }\n\n return lines;\n}\n\n/**\n * Generate import lines for UI components using the old default import pattern\n */\nfunction generateDefaultImports(\n components: string[],\n componentsAlias: string,\n): string[] {\n return components\n .slice()\n .sort()\n .map((name) => `import ${name} from '${componentsAlias}/${name}.astro';`);\n}\n\nexport function buildMdx(params: {\n importName: string;\n importPath: string;\n title: string;\n description: string;\n descriptionBodyMDX?: string;\n figmaUrl?: string;\n usageMDX: string;\n hasImport: boolean;\n propsList: string;\n propsTable?: Array<{\n name: string;\n type?: string;\n required?: boolean;\n defaultValue?: string | null;\n description?: string | null;\n }>;\n examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }>;\n examplesSections: ParsedExampleSection[];\n componentFolderMap?: Record<string, string>;\n autoImports: string[];\n lucideIcons: string[];\n primaryExampleMDX: string;\n componentSource: string;\n commandName: string;\n componentsAlias: string;\n /**\n * Optional: additional named exports from the main component's barrel.\n * Used when the main component has subcomponents (e.g., Card, CardHeader, CardTitle).\n * If provided, these will be included in the main import statement.\n */\n namedExports?: string[];\n /**\n * Optional: API reference documentation (events, programmatic control, data attributes).\n */\n apiMDX?: string;\n}): string {\n const {\n importName,\n importPath,\n title,\n description,\n descriptionBodyMDX,\n usageMDX,\n hasImport,\n propsList,\n propsTable,\n examples,\n examplesSections,\n componentFolderMap,\n autoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource,\n commandName,\n figmaUrl,\n componentsAlias,\n namedExports,\n apiMDX,\n } = params;\n\n // Detect if we should use the new barrel import pattern\n const useBarrelPattern = isBarrelImport(importPath);\n\n const sortedLucide = (lucideIcons ?? []).slice().sort();\n const lucideTopLine = sortedLucide.length\n ? `import { ${sortedLucide.join(\", \")} } from '@lucide/astro';`\n : null;\n const externalTopImports = [\n `import { Tabs as DocsTabs, TabItem as DocsTabItem } from '@astrojs/starlight/components';`,\n lucideTopLine,\n ]\n .filter((v) => v != null)\n .slice()\n .sort((a, b) => String(a).localeCompare(String(b)));\n\n const sortedUiAuto = (autoImports ?? []).slice().sort();\n\n // Generate UI component imports based on pattern\n const uiAutoLines = useBarrelPattern\n ? generateBarrelImports(sortedUiAuto, componentsAlias, componentFolderMap)\n : generateDefaultImports(sortedUiAuto, componentsAlias);\n\n const exampleLines = (examples ?? [])\n .map((ex) => `import ${ex.importName} from '${ex.importPath}';`)\n .sort((a, b) => a.localeCompare(b));\n\n // Build main component import\n let mainImportLine: string | null = null;\n if (!hasImport) {\n if (useBarrelPattern) {\n // New pattern: named exports\n const exports = [importName, ...(namedExports ?? [])].sort();\n mainImportLine = `import { ${exports.join(\", \")} } from '${importPath}';`;\n } else {\n // Old pattern: default export\n mainImportLine = `import ${importName} from '${importPath}';`;\n }\n }\n\n const internalTopImports = [mainImportLine, ...uiAutoLines, ...exampleLines]\n .filter((v) => v != null)\n .slice()\n .sort((a, b) => String(a).localeCompare(String(b)));\n\n const importLines = [\n ...externalTopImports,\n externalTopImports.length && internalTopImports.length ? \"\" : null,\n ...internalTopImports,\n ].filter((v) => v !== null && v !== undefined);\n\n // Helper: build per-snippet imports so code fences are minimal and copy-pasteable\n const extractTags = (snippet: string): Set<string> => {\n const found = new Set<string>();\n const tagRegex = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n let m: RegExpExecArray | null;\n while ((m = tagRegex.exec(snippet)) !== null) {\n found.add(m[1]);\n }\n return found;\n };\n\n const buildSnippetImportLines = (snippet: string): string[] => {\n if (!snippet || !snippet.length) return [];\n const used = extractTags(snippet);\n const usedIcons = sortedLucide.filter((n) => used.has(n));\n\n // Find UI components used in snippet\n const usedUi = (autoImports ?? []).filter((n) => used.has(n));\n\n // Check if main component (and its subcomponents) are used\n const includeMain = !hasImport && used.has(importName);\n\n // For new pattern, also check for subcomponents from the main barrel\n const usedNamedExports =\n useBarrelPattern && namedExports\n ? namedExports.filter((n) => used.has(n))\n : [];\n\n const external: string[] = [];\n if (usedIcons.length) {\n external.push(`import { ${usedIcons.join(\", \")} } from '@lucide/astro';`);\n }\n\n const internal: string[] = [];\n\n if (useBarrelPattern) {\n // New pattern: group by folder and use named imports\n\n // Main component and its subcomponents\n if (includeMain || usedNamedExports.length > 0) {\n const mainExports = [\n ...(includeMain ? [importName] : []),\n ...usedNamedExports,\n ].sort();\n internal.push(\n `import { ${mainExports.join(\", \")} } from '${importPath}';`,\n );\n }\n\n // Other UI components grouped by folder\n if (usedUi.length > 0) {\n internal.push(\n ...generateBarrelImports(usedUi, componentsAlias, componentFolderMap),\n );\n }\n } else {\n // Old pattern: default imports\n if (includeMain) {\n internal.push(`import ${importName} from '${importPath}';`);\n }\n internal.push(\n ...usedUi\n .slice()\n .sort()\n .map(\n (name) => `import ${name} from '${componentsAlias}/${name}.astro';`,\n ),\n );\n }\n\n const externalSorted = external.slice().sort((a, b) => a.localeCompare(b));\n const internalSorted = internal.slice().sort((a, b) => a.localeCompare(b));\n return [\n ...externalSorted,\n externalSorted.length && internalSorted.length ? \"\" : null,\n ...internalSorted,\n ].filter((v) => v !== null && v !== undefined) as string[];\n };\n\n let consolePreviewCounter = 0;\n\n const wrapTextNodes = (snippet: string): string => {\n if (!snippet) return snippet;\n return snippet.replace(/>([^<]+)</g, (match, inner) => {\n const trimmed = inner.trim();\n if (!trimmed.length) return match;\n // Skip if the entire trimmed content is a JSX expression\n if (/^\\{[\\s\\S]*\\}$/.test(trimmed)) return match;\n // Skip if the content already contains JSX expressions (e.g., \"Use{\\\" \\\"}\" or mixed content)\n // This prevents double-wrapping and breaking inline JSX whitespace expressions\n if (/\\{[^}]*\\}/.test(inner)) return match;\n return `>{${JSON.stringify(inner)}}<`;\n });\n };\n\n /**\n * Normalize whitespace in preview content.\n * This collapses ALL newlines and multiple spaces into single spaces to prevent\n * MDX parsing issues. In particular, a '>' at the start of a line is interpreted\n * as a block quote marker by MDX, which causes \"Unexpected lazy line\" errors.\n */\n const normalizeInlineWhitespace = (snippet: string): string => {\n if (!snippet) return snippet;\n // Collapse ALL newlines and multiple whitespace into single spaces\n // This prevents MDX from interpreting '>' at start of line as block quote\n return snippet.replace(/\\s+/g, \" \").trim();\n };\n\n /**\n * Convert <p> tags that contain component tags to <span> tags.\n * This is necessary because components may render as block elements (like <div>),\n * and HTML doesn't allow block elements inside <p>. The browser would automatically\n * close the <p> before any block element, breaking the layout.\n */\n const convertParagraphsWithComponents = (snippet: string): string => {\n if (!snippet) return snippet;\n // Detect if a <p> tag contains component tags (PascalCase like <KbdGroup>)\n // If so, convert <p> to <span> to allow block-level children\n return snippet.replace(\n /<p(\\s[^>]*)?>([^]*?)<\\/p>/gi,\n (match, attrs, content) => {\n // Check if content contains component tags (PascalCase)\n if (/<[A-Z][A-Za-z0-9]*/.test(content)) {\n // Convert to span with inline-block display to preserve paragraph-like behavior\n const spanAttrs = attrs || \"\";\n return `<span${spanAttrs} style=\"display:block\">${content}</span>`;\n }\n return match;\n },\n );\n };\n\n type PreviewRenderOptions = {\n enableConsolePanel?: boolean;\n consoleScripts?: string[];\n };\n\n type MarkdownPreviewConfig = {\n defaultPreview?: boolean;\n };\n\n const extractInlineScripts = (snippet: string): {\n markup: string;\n scripts: string[];\n } => {\n if (!snippet) return { markup: snippet, scripts: [] };\n const scripts: string[] = [];\n const markup = snippet.replace(\n /<script\\b[^>]*>([\\s\\S]*?)<\\/script>/gi,\n (_, scriptBody: string) => {\n scripts.push((scriptBody || \"\").trim());\n return \"\";\n },\n );\n return { markup, scripts };\n };\n\n const toMdxPreview = (\n snippet: string,\n options: PreviewRenderOptions = {},\n ): { markup: string; scripts: string[] } => {\n if (!snippet) return { markup: \"\", scripts: [] };\n const { enableConsolePanel = false, consoleScripts = [] } = options;\n const extracted = extractInlineScripts(snippet);\n const resolvedConsoleScripts =\n enableConsolePanel && consoleScripts.length\n ? consoleScripts\n : enableConsolePanel\n ? extracted.scripts\n : [];\n const withoutScripts = extracted.markup;\n // Convert HTML comments to MDX comment blocks for preview sections\n const withoutComments = withoutScripts.replace(\n /<!--([\\s\\S]*?)-->/g,\n \"{/*$1*/}\",\n );\n // Convert <p> tags containing components to <span> to avoid HTML validity issues\n const withConvertedParagraphs =\n convertParagraphsWithComponents(withoutComments);\n // If the snippet contains user-defined <p> elements, preserve structure as-is\n if (/<p[\\s>]/i.test(withConvertedParagraphs)) {\n return {\n markup: normalizeInlineWhitespace(withConvertedParagraphs),\n scripts: resolvedConsoleScripts,\n };\n }\n // Normalize whitespace to prevent MDX from splitting inline text into paragraphs\n const normalized = normalizeInlineWhitespace(withConvertedParagraphs);\n return {\n markup: wrapTextNodes(normalized),\n scripts: resolvedConsoleScripts,\n };\n };\n\n const buildConsoleRuntimeSource = (\n rootId: string,\n panelId: string,\n userScript: string,\n ): string => {\n const serializedRootId = JSON.stringify(rootId);\n const serializedPanelId = JSON.stringify(panelId);\n const serializedUserScript = JSON.stringify(userScript);\n\n return `(function () {\n var root = document.getElementById(${serializedRootId});\n var panel = document.getElementById(${serializedPanelId});\n if (!root || !panel) return;\n\n var placeholder = panel.textContent || \"Waiting for logs...\";\n var hasLogs = false;\n\n var toText = function (value) {\n if (typeof value === \"string\") return value;\n if (value === undefined) return \"undefined\";\n if (value === null) return \"null\";\n try {\n return JSON.stringify(value);\n } catch (_error) {\n return String(value);\n }\n };\n\n var append = function (level, args) {\n var stamp = new Date().toLocaleTimeString();\n var body = Array.prototype.map.call(args, toText).join(\" \");\n var line = \"[\" + stamp + \"] \" + String(level).toUpperCase() + \": \" + body;\n var current = panel.textContent || \"\";\n if (!hasLogs && current.trim() === placeholder.trim()) {\n panel.textContent = line;\n } else {\n panel.textContent = current ? current + \"\\\\n\" + line : line;\n }\n hasLogs = true;\n panel.scrollTop = panel.scrollHeight;\n };\n\n var methods = [\"log\", \"info\", \"warn\", \"error\"];\n var proxyConsole = Object.create(console);\n for (var i = 0; i < methods.length; i += 1) {\n (function (methodName) {\n var fallback = typeof console.log === \"function\" ? console.log.bind(console) : function () {};\n var original =\n typeof console[methodName] === \"function\"\n ? console[methodName].bind(console)\n : fallback;\n proxyConsole[methodName] = function () {\n var args = Array.prototype.slice.call(arguments);\n original.apply(console, args);\n append(methodName, args);\n };\n })(methods[i]);\n }\n\n try {\n var run = new Function(\"console\", \"root\", \"panel\", ${serializedUserScript});\n run(proxyConsole, root, panel);\n } catch (error) {\n var fallbackError = typeof console.error === \"function\" ? console.error.bind(console) : function () {};\n fallbackError(error);\n append(\"error\", [error]);\n }\n})();`;\n };\n\n const renderConsoleScripts = (\n rootId: string,\n panelId: string,\n scripts: string[],\n ): string => {\n if (!scripts.length) return \"\";\n return scripts\n .filter((script) => script && script.trim().length)\n .map((script) => {\n const runtimeSource = buildConsoleRuntimeSource(\n rootId,\n panelId,\n script,\n );\n const encoded = encodeURIComponent(runtimeSource);\n return `<script type=\"module\" src=\"data:text/javascript;charset=utf-8,${encoded}\"></script>`;\n })\n .join(\"\\n\");\n };\n\n const renderCompanionSourceMD = (sourceMD: string): string => {\n if (!sourceMD || !sourceMD.trim().length) return \"\";\n const normalizedSourceMD = sourceMD.trim();\n const match = normalizedSourceMD.match(/^```(\\S*)([^\\n]*)\\n([\\s\\S]*?)\\n```$/);\n if (!match) return sourceMD;\n\n const [, langRaw = \"\", flagsRaw = \"\", body = \"\"] = match;\n const lang = langRaw.trim().toLowerCase();\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(lang)) {\n return sourceMD;\n }\n\n const astroInfo = [\"astro\", flagsRaw.trim()].filter(Boolean).join(\" \");\n const scriptBody = body.replace(/\\s+$/, \"\");\n return [\n `\\`\\`\\`${astroInfo}`,\n \"<script>\",\n scriptBody,\n \"</script>\",\n \"```\",\n ].join(\"\\n\");\n };\n\n const extractCompanionScriptBody = (sourceMD: string): string => {\n if (!sourceMD || !sourceMD.trim().length) return \"\";\n const normalizedSourceMD = sourceMD.trim();\n const match = normalizedSourceMD.match(/^```(\\S*)([^\\n]*)\\n([\\s\\S]*?)\\n```$/);\n if (!match) return \"\";\n\n const [, langRaw = \"\", , body = \"\"] = match;\n const lang = langRaw.trim().toLowerCase();\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(lang)) {\n return \"\";\n }\n\n return body.replace(/\\s+$/, \"\");\n };\n\n const renderMergedAstroSourceMD = (\n fenceOpen: string,\n sourceBody: string,\n companionSourceMD: string,\n ): string => {\n const scriptBody = extractCompanionScriptBody(companionSourceMD);\n if (!scriptBody.length) {\n return [fenceOpen, sourceBody, \"```\"].filter(Boolean).join(\"\\n\");\n }\n\n const normalizedSourceBody = sourceBody.replace(/\\s+$/, \"\");\n const parts = [fenceOpen];\n if (normalizedSourceBody.length) {\n parts.push(normalizedSourceBody, \"\");\n }\n parts.push(\"<script>\", scriptBody, \"</script>\", \"```\");\n return parts.join(\"\\n\");\n };\n\n const renderPreviewBlock = (\n snippet: string,\n options: PreviewRenderOptions = {},\n ): string => {\n const { enableConsolePanel = false } = options;\n const preparedPreview = toMdxPreview(snippet, options);\n if (!preparedPreview.markup || !preparedPreview.markup.length) return \"\";\n\n if (!enableConsolePanel) {\n return `<div class=\"not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center\">\n${preparedPreview.markup}\n</div>`;\n }\n\n consolePreviewCounter += 1;\n const rootId = `sl-bejamas-console-preview-${consolePreviewCounter}`;\n const panelId = `${rootId}-output`;\n const scriptTags = renderConsoleScripts(\n rootId,\n panelId,\n preparedPreview.scripts,\n );\n const parts = [\n `<div id=\"${rootId}\" class=\"not-content sl-bejamas-component-preview flex justify-center px-4 md:px-10 py-12 border border-border rounded-t-lg min-h-72 items-center\">`,\n preparedPreview.markup,\n \"</div>\",\n `<div class=\"not-content sl-bejamas-console-log-shell px-4 md:px-10 py-4 border border-border border-t-0\">`,\n `<pre id=\"${panelId}\" data-slot=\"event-log\" class=\"sl-bejamas-console-log w-full p-3 rounded-md bg-muted text-xs font-mono text-muted-foreground min-h-[80px] max-h-[200px] overflow-y-auto\">Waiting for logs...</pre>`,\n scriptTags && scriptTags.length ? scriptTags : null,\n \"</div>\",\n ].filter((part) => part !== null) as string[];\n\n return parts.join(\"\\n\");\n };\n\n const renderAstroPreviewsInMarkdown = (\n block: string,\n config: MarkdownPreviewConfig = {},\n ): string => {\n if (!block || !block.length) return block;\n const { defaultPreview = true } = config;\n\n const lines = block.split(\"\\n\");\n const out: string[] = [];\n let inFence = false;\n let fenceOpen = \"\";\n let currentFenceLang = \"\";\n let currentFenceFlags = new Set<string>();\n const fenceBody: string[] = [];\n\n const findCompanionConsoleFence = (\n startIndex: number,\n ): { start: number; end: number } | null => {\n let index = startIndex;\n while (index < lines.length) {\n const currentLine = lines[index];\n const trimmedLine = currentLine.trim();\n if (!trimmedLine.length || !trimmedLine.startsWith(\"```\")) {\n index += 1;\n continue;\n }\n\n const parsed = parseFenceInfo(trimmedLine.slice(3).trim());\n if (![\"js\", \"ts\", \"javascript\", \"typescript\"].includes(parsed.lang)) {\n return null;\n }\n\n let end = index + 1;\n while (end < lines.length) {\n if (lines[end].trim().startsWith(\"```\")) {\n return { start: index, end };\n }\n end += 1;\n }\n\n return null;\n }\n return null;\n };\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex += 1) {\n const line = lines[lineIndex];\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n if (!inFence) {\n inFence = true;\n fenceOpen = line;\n const parsed = parseFenceInfo(trimmed.slice(3).trim());\n currentFenceLang = parsed.lang;\n currentFenceFlags = parsed.flags;\n fenceBody.length = 0;\n continue;\n }\n\n if (currentFenceLang === \"astro\") {\n const sourceCode = decodeEscapedScriptTags(fenceBody.join(\"\\n\").trim());\n const companionConsoleFence = currentFenceFlags.has(\"console\")\n ? findCompanionConsoleFence(lineIndex + 1)\n : null;\n const companionMarkdown = companionConsoleFence\n ? lines.slice(lineIndex + 1, companionConsoleFence.end + 1).join(\"\\n\")\n : \"\";\n const prepared = prepareExampleContent(\n companionMarkdown.length\n ? `${fenceOpen}\\n${sourceCode}\\n${line}\\n${companionMarkdown}`\n : `${fenceOpen}\\n${sourceCode}\\n${line}`,\n );\n const hasForcedPreviewFlag =\n currentFenceFlags.has(\"preview\") || currentFenceFlags.has(\"console\");\n const shouldPreview =\n !prepared.skipPreview && (defaultPreview || hasForcedPreviewFlag);\n if (\n prepared.snippet &&\n prepared.snippet.length &&\n shouldPreview\n ) {\n const previewBlock = renderPreviewBlock(prepared.snippet, {\n enableConsolePanel: prepared.enableConsolePanel,\n consoleScripts: prepared.consoleScripts,\n });\n if (previewBlock.length) {\n out.push(previewBlock);\n }\n out.push(\"\");\n }\n }\n\n if (currentFenceLang === \"astro\") {\n const normalizedFenceBody = decodeEscapedScriptTags(\n fenceBody.join(\"\\n\"),\n );\n const companionConsoleFence = currentFenceFlags.has(\"console\")\n ? findCompanionConsoleFence(lineIndex + 1)\n : null;\n const companionMarkdown = companionConsoleFence\n ? lines\n .slice(lineIndex + 1, companionConsoleFence.end + 1)\n .join(\"\\n\")\n : \"\";\n const prepared = companionMarkdown.length\n ? prepareExampleContent(\n `${fenceOpen}\\n${normalizedFenceBody}\\n${line}\\n${companionMarkdown}`,\n )\n : null;\n\n if (\n prepared?.companionSourceMD &&\n prepared.companionSourceMD.length &&\n prepared.mergeCompanionWithSource\n ) {\n out.push(\n renderMergedAstroSourceMD(\n fenceOpen,\n normalizedFenceBody,\n prepared.companionSourceMD,\n ),\n );\n if (companionConsoleFence) {\n lineIndex = companionConsoleFence.end;\n }\n } else {\n out.push(fenceOpen);\n if (normalizedFenceBody.length) {\n out.push(...normalizedFenceBody.split(\"\\n\"));\n }\n out.push(line);\n\n if (\n prepared?.companionSourceMD &&\n prepared.companionSourceMD.length &&\n companionConsoleFence\n ) {\n const companionIntro = lines\n .slice(lineIndex + 1, companionConsoleFence.start)\n .join(\"\\n\");\n if (companionIntro.length) {\n out.push(companionIntro);\n }\n out.push(renderCompanionSourceMD(prepared.companionSourceMD));\n lineIndex = companionConsoleFence.end;\n }\n }\n } else {\n out.push(fenceOpen);\n if (fenceBody.length) {\n out.push(...fenceBody);\n }\n out.push(line);\n }\n\n inFence = false;\n fenceOpen = \"\";\n currentFenceLang = \"\";\n currentFenceFlags = new Set<string>();\n fenceBody.length = 0;\n continue;\n }\n\n if (inFence) {\n fenceBody.push(line);\n continue;\n }\n\n out.push(line);\n }\n\n if (inFence) {\n out.push(fenceOpen);\n if (currentFenceLang === \"astro\") {\n const normalizedFenceBody = decodeEscapedScriptTags(\n fenceBody.join(\"\\n\"),\n );\n if (normalizedFenceBody.length) {\n out.push(...normalizedFenceBody.split(\"\\n\"));\n }\n } else if (fenceBody.length) {\n out.push(...fenceBody);\n }\n }\n\n return out.join(\"\\n\").trim();\n };\n\n const renderedDescriptionBodyMDX = renderAstroPreviewsInMarkdown(\n descriptionBodyMDX || \"\",\n );\n const renderedUsageMDX = renderAstroPreviewsInMarkdown(usageMDX || \"\", {\n defaultPreview: false,\n });\n const renderedApiMDX = renderAstroPreviewsInMarkdown(apiMDX || \"\");\n\n const primaryExampleSection =\n primaryExampleMDX && primaryExampleMDX.length\n ? `${renderPreviewBlock(primaryExampleMDX)}\n\n\\`\\`\\`astro\n${(() => {\n const lines = buildSnippetImportLines(primaryExampleMDX);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n})()}${primaryExampleMDX}\n\\`\\`\\``\n : null;\n\n const renderExampleItem = (\n headingLevel: \"###\" | \"####\",\n headingTitle: string,\n body: string,\n ): string => {\n const prepared = prepareExampleContent(body);\n const titleLine = `${headingLevel} ${headingTitle}`;\n const blocks: string[] = [titleLine];\n if (prepared.descriptionMD && prepared.descriptionMD.length) {\n blocks.push(prepared.descriptionMD);\n }\n\n if (\n prepared.snippet &&\n prepared.snippet.length &&\n prepared.sourceCode &&\n prepared.sourceCode.length &&\n !prepared.skipPreview\n ) {\n blocks.push(\n renderPreviewBlock(prepared.snippet, {\n enableConsolePanel: prepared.enableConsolePanel,\n consoleScripts: prepared.consoleScripts,\n }),\n );\n }\n\n if (prepared.sourceCode && prepared.sourceCode.length) {\n const sourceBlock = prepared.sourceFromFence\n ? prepared.sourceCode\n : `${(() => {\n const lines = buildSnippetImportLines(prepared.sourceCode);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n })()}${prepared.sourceCode}`;\n if (\n prepared.companionSourceMD &&\n prepared.companionSourceMD.length &&\n prepared.mergeCompanionWithSource\n ) {\n blocks.push(\n renderMergedAstroSourceMD(\"```astro\", sourceBlock, prepared.companionSourceMD),\n );\n } else {\n blocks.push(`\\`\\`\\`astro\n${sourceBlock}\n\\`\\`\\``);\n }\n if (\n prepared.companionIntroMD &&\n prepared.companionIntroMD.length &&\n !prepared.mergeCompanionWithSource\n ) {\n blocks.push(prepared.companionIntroMD);\n }\n if (\n prepared.companionSourceMD &&\n prepared.companionSourceMD.length &&\n !prepared.mergeCompanionWithSource\n ) {\n blocks.push(renderCompanionSourceMD(prepared.companionSourceMD));\n }\n if (prepared.trailingDescriptionMD && prepared.trailingDescriptionMD.length) {\n blocks.push(prepared.trailingDescriptionMD);\n }\n }\n\n return blocks.join(\"\\n\\n\");\n };\n\n const renderedExampleSections: string[] = [];\n if (examplesSections && examplesSections.length) {\n let implicitExampleCounter = 1;\n\n for (const section of examplesSections) {\n const sectionParts: string[] = [];\n const hasSectionTitle = !!(section.title && section.title.length);\n if (hasSectionTitle) {\n sectionParts.push(`### ${section.title}`);\n }\n\n if (section.introMD && section.introMD.length) {\n sectionParts.push(section.introMD);\n }\n\n if (section.items && section.items.length) {\n const itemHeadingLevel: \"###\" | \"####\" = hasSectionTitle\n ? \"####\"\n : \"###\";\n for (const item of section.items) {\n sectionParts.push(\n renderExampleItem(itemHeadingLevel, item.title, item.body),\n );\n }\n } else if (!hasSectionTitle && section.introMD && section.introMD.length) {\n const prepared = prepareExampleContent(section.introMD);\n if (prepared.snippet && prepared.snippet.length) {\n sectionParts.length = 0;\n sectionParts.push(\n renderExampleItem(\n \"###\",\n `Example ${implicitExampleCounter}`,\n section.introMD,\n ),\n );\n implicitExampleCounter += 1;\n }\n }\n\n if (sectionParts.length) {\n renderedExampleSections.push(sectionParts.join(\"\\n\\n\").trim());\n }\n }\n }\n if (examples && examples.length) {\n for (const ex of examples) {\n renderedExampleSections.push(\n `### ${ex.title}\n\n<div class=\"not-content\">\n <${ex.importName} />\n</div>\n\n\\`\\`\\`astro\n${ex.source}\n\\`\\`\\``,\n );\n }\n }\n\n const formatDefault = (val: unknown): string => {\n if (val == null) return \"\";\n let raw = String(val).trim();\n if (!raw.length) return \"\";\n // Normalize curly quotes to ASCII\n raw = raw\n .replace(/[\\u201C\\u201D\\u201E\\u201F]/g, '\"')\n .replace(/[\\u2018\\u2019]/g, \"'\");\n const isSingleQuoted = /^'[^']*'$/.test(raw);\n const isDoubleQuoted = /^\"[^\"]*\"$/.test(raw);\n const isBacktickSimple = /^`[^`]*`$/.test(raw) && raw.indexOf(\"${\") === -1;\n\n let content = raw;\n if (isSingleQuoted || isDoubleQuoted || isBacktickSimple) {\n const inner = raw.slice(1, -1);\n // Re-quote with standard double quotes\n content = `\"${inner}\"`;\n }\n // Escape table pipes\n content = content.replace(/\\|/g, \"\\\\|\");\n // Choose a backtick fence that doesn't appear in content\n const hasTick = content.includes(\"`\");\n const hasDoubleTick = content.includes(\"``\");\n const fence = !hasTick ? \"`\" : !hasDoubleTick ? \"``\" : \"```\";\n return `${fence}${content}${fence}`;\n };\n\n const installationSection = `## Installation\n\n<DocsTabs syncKey=\"pkg\">\n <DocsTabItem label=\"bun\">\n \\`\\`\\`bash\n bunx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"npm\">\n \\`\\`\\`bash\n npx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"pnpm\">\n \\`\\`\\`bash\n pnpm dlx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n <DocsTabItem label=\"yarn\">\n \\`\\`\\`bash\n yarn dlx bejamas add ${commandName}\n \\`\\`\\`\n </DocsTabItem>\n</DocsTabs>`;\n\n const serializeFrontmatter = (\n label: string,\n value?: string,\n ): string | null => {\n if (!value || !value.length) return null;\n return `${label}: ${JSON.stringify(value)}`;\n };\n\n const lines = [\n \"---\",\n serializeFrontmatter(\"title\", title),\n serializeFrontmatter(\"description\", description),\n serializeFrontmatter(\"figmaUrl\", figmaUrl),\n \"---\",\n \"\",\n ...importLines,\n importLines.length ? \"\" : null,\n renderedDescriptionBodyMDX && renderedDescriptionBodyMDX.length\n ? renderedDescriptionBodyMDX\n : null,\n renderedDescriptionBodyMDX && renderedDescriptionBodyMDX.length ? \"\" : null,\n primaryExampleSection,\n primaryExampleSection ? \"\" : null,\n installationSection,\n \"\",\n renderedUsageMDX && renderedUsageMDX.length\n ? `## Usage\\n\\n${renderedUsageMDX}`\n : null,\n \"\",\n propsTable && propsTable.length\n ? `## Props\\n\\n| Prop | Type | Default |\\n|---|---|---|\\n${propsTable\n .map(\n (p) =>\n `| <code>${p.name}</code> | \\`${(p.type || \"\").replace(/\\|/g, \"\\\\|\")}\\` | ${formatDefault(p.defaultValue)} |`,\n )\n .join(\"\\n\")}`\n : propsList\n ? `## Props\\n\\n${propsList}`\n : null,\n (propsTable && propsTable.length) || propsList ? \"\" : null,\n renderedExampleSections.length\n ? `## Examples\\n\\n` + renderedExampleSections.join(\"\\n\\n\")\n : null,\n renderedExampleSections.length ? \"\" : null,\n renderedApiMDX && renderedApiMDX.length\n ? `## API Reference\\n\\n${renderedApiMDX}`\n : null,\n ].filter((v) => v !== null && v !== undefined);\n\n return lines.join(\"\\n\").trim() + \"\\n\";\n}\n","import { mkdirSync, existsSync } from \"fs\";\nimport { readdir, readFile, writeFile } from \"fs/promises\";\nimport { join, extname, dirname, relative, basename } from \"path\";\nimport {\n RESERVED_COMPONENTS,\n slugify,\n extractFrontmatter,\n toIdentifier,\n parseJsDocMetadata,\n extractPropsFromAstroProps,\n extractPropsFromDeclaredProps,\n resolveUiRoot,\n resolveOutDir,\n normalizeUsageMDX,\n normalizeBlockMDX,\n detectHasImportTopLevel,\n discoverExamples,\n extractComponentTagsFromMDX,\n createSourceFileFromFrontmatter,\n} from \"./utils\";\nimport {\n parseExamplesSections,\n extractComponentTagsFromPreviewMarkdown,\n extractComponentTagsFromExamplesSections,\n} from \"./examples\";\nimport { buildMdx } from \"./mdx-builder\";\nimport { logger } from \"@/src/utils/logger\";\nimport { spinner } from \"@/src/utils/spinner\";\nimport { getConfig } from \"@/src/utils/get-config\";\n\ninterface ComponentEntry {\n /** The main component name (PascalCase), e.g., \"Card\" */\n name: string;\n /** Path to the main .astro file */\n filePath: string;\n /** The folder name (lowercase/kebab-case), e.g., \"card\" */\n folderName: string;\n /** Whether this is a folder-based component with barrel exports */\n isFolder: boolean;\n /** List of subcomponent names exported from the barrel, e.g., [\"CardHeader\", \"CardTitle\"] */\n namedExports: string[];\n}\n\n/**\n * Discover components in the components directory.\n * Supports both:\n * - Old pattern: flat .astro files in components/\n * - New pattern: folders with index.ts barrel exports\n */\nasync function discoverComponents(\n componentsDir: string,\n): Promise<ComponentEntry[]> {\n const entries: ComponentEntry[] = [];\n const dirEntries = await readdir(componentsDir, { withFileTypes: true });\n\n for (const entry of dirEntries) {\n if (entry.isDirectory()) {\n // New pattern: folder with barrel exports\n const folderPath = join(componentsDir, entry.name);\n const indexPath = join(folderPath, \"index.ts\");\n\n if (existsSync(indexPath)) {\n // Parse the barrel file to find exports\n const indexContent = await readFile(indexPath, \"utf-8\");\n const namedExports = parseBarrelExports(indexContent);\n\n // Find the main component (first export or the one matching folder name)\n const mainComponentName = findMainComponent(namedExports, entry.name);\n\n if (mainComponentName) {\n const mainFilePath = join(folderPath, `${mainComponentName}.astro`);\n\n if (existsSync(mainFilePath)) {\n // Filter out the main component from namedExports (it will be imported separately)\n const subComponents = namedExports.filter(\n (n) => n !== mainComponentName,\n );\n\n entries.push({\n name: mainComponentName,\n filePath: mainFilePath,\n folderName: entry.name,\n isFolder: true,\n namedExports: subComponents,\n });\n }\n }\n }\n } else if (entry.isFile() && extname(entry.name).toLowerCase() === \".astro\") {\n // Old pattern: flat .astro file\n const componentName = entry.name.replace(/\\.astro$/i, \"\");\n entries.push({\n name: componentName,\n filePath: join(componentsDir, entry.name),\n folderName: \"\",\n isFolder: false,\n namedExports: [],\n });\n }\n }\n\n return entries;\n}\n\nfunction buildComponentFolderMap(\n components: ComponentEntry[],\n): Record<string, string> {\n const map: Record<string, string> = {};\n for (const component of components) {\n if (!component.isFolder || !component.folderName) continue;\n map[component.name] = component.folderName;\n for (const sub of component.namedExports) {\n map[sub] = component.folderName;\n }\n }\n return map;\n}\n\n/**\n * Parse a barrel (index.ts) file to extract named exports.\n * Handles patterns like:\n * - export { default as Card } from \"./Card.astro\";\n * - export { default as CardHeader } from \"./CardHeader.astro\";\n */\nfunction parseBarrelExports(content: string): string[] {\n const exports: string[] = [];\n\n // Match: export { default as ComponentName } from \"...\"\n const exportRegex = /export\\s*\\{\\s*default\\s+as\\s+(\\w+)\\s*\\}/g;\n let match: RegExpExecArray | null;\n\n while ((match = exportRegex.exec(content)) !== null) {\n exports.push(match[1]);\n }\n\n return exports;\n}\n\n/**\n * Find the main component from a list of exports.\n * The main component is typically the one that matches the folder name (PascalCase).\n */\nfunction findMainComponent(\n exports: string[],\n folderName: string,\n): string | null {\n if (exports.length === 0) return null;\n\n // Convert folder name to PascalCase for comparison\n // e.g., \"card\" -> \"Card\", \"input-group\" -> \"InputGroup\"\n const expectedName = folderName\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\");\n\n // First, try to find exact match\n const exactMatch = exports.find((e) => e === expectedName);\n if (exactMatch) return exactMatch;\n\n // Otherwise, return the first export (usually the main component)\n return exports[0];\n}\n\nasync function main() {\n const DEBUG =\n process.env.BEJAMAS_DEBUG === \"1\" || process.env.BEJAMAS_DEBUG === \"true\";\n const cwd =\n process.env.BEJAMAS_DOCS_CWD && process.env.BEJAMAS_DOCS_CWD.length\n ? (process.env.BEJAMAS_DOCS_CWD as string)\n : process.cwd();\n const config = await getConfig(cwd);\n const componentsAlias = (\n config?.aliases?.ui ||\n config?.aliases?.components ||\n \"@bejamas/ui/components\"\n ).replace(/\\/$/, \"\");\n const componentsDirFromConfig =\n config?.resolvedPaths?.ui || config?.resolvedPaths?.components;\n let uiRoot = resolveUiRoot(cwd);\n let componentsDir = join(uiRoot, \"src\", \"components\");\n if (componentsDirFromConfig) {\n componentsDir = componentsDirFromConfig;\n uiRoot = dirname(dirname(componentsDirFromConfig));\n }\n if (!existsSync(componentsDir)) {\n // Fallback to ui package components if the configured path is missing.\n componentsDir = join(uiRoot, \"src\", \"components\");\n }\n const outDir = resolveOutDir(cwd);\n mkdirSync(outDir, { recursive: true });\n\n if (DEBUG) {\n logger.info(`[docs-generator] cwd: ${cwd}`);\n logger.info(`[docs-generator] uiRoot: ${uiRoot}`);\n logger.info(`[docs-generator] componentsDir: ${componentsDir}`);\n logger.info(`[docs-generator] outDir: ${outDir}`);\n }\n\n // Discover all components (both flat files and folders)\n const components = await discoverComponents(componentsDir);\n const componentFolderMap = buildComponentFolderMap(components);\n\n if (DEBUG) {\n logger.info(`[docs-generator] components found: ${components.length}`);\n if (components.length) {\n logger.info(\n `[docs-generator] first few: ${components\n .slice(0, 5)\n .map((c) => c.name)\n .join(\", \")}`,\n );\n }\n }\n\n let generatedCount = 0;\n const total = components.length;\n const spin = spinner(`Generating docs (0/${total})`).start();\n\n for (const component of components) {\n const { name: pascal, filePath, folderName, isFolder, namedExports } = component;\n\n const astroFile = await readFile(filePath, \"utf-8\");\n const frontmatterCode = extractFrontmatter(astroFile);\n const sourceFile = createSourceFileFromFrontmatter(frontmatterCode);\n const meta = parseJsDocMetadata(frontmatterCode);\n const declaredProps = extractPropsFromDeclaredProps(sourceFile);\n const destructuredProps = extractPropsFromAstroProps(sourceFile);\n\n // Build props table preferring declared types; merge defaults from destructuring\n const defaultsMap = new Map<string, string | null>();\n for (const p of destructuredProps) {\n if (p.name && p.hasDefault) {\n defaultsMap.set(p.name, p.defaultValue || null);\n }\n }\n\n const propsTable = (declaredProps.length ? declaredProps : []).map((p) => ({\n name: p.name,\n type: p.type,\n required: !p.optional,\n defaultValue: defaultsMap.has(p.name) ? defaultsMap.get(p.name)! : null,\n }));\n\n const slug = slugify(pascal);\n const title = meta.title || meta.name || pascal;\n const description = meta.description || \"\";\n const descriptionBodyMDX = (meta as any).descriptionBodyMDX || \"\";\n const figmaUrl = (meta as any).figmaUrl || \"\";\n // Do not display props if there is no declared Props\n const propsList = \"\";\n\n const importName = pascal;\n // Use folder-based barrel import for new pattern, file-based for old pattern\n const importPath = isFolder\n ? `${componentsAlias}/${folderName}`\n : `${componentsAlias}/${pascal}.astro`;\n\n const { text: usageMDX, hasImport: hasImportUsage } = normalizeUsageMDX(\n meta.usageMDX || \"\",\n pascal,\n );\n const primaryExampleMDX = normalizeBlockMDX(\n meta.primaryExampleMDX || \"\",\n ).trim();\n const examplesMDX = normalizeBlockMDX(meta.examplesMDX || \"\").trim();\n const apiMDX = normalizeBlockMDX(meta.apiMDX || \"\").trim();\n const hasImportExamples = detectHasImportTopLevel(examplesMDX, pascal);\n const hasImportPrimary = detectHasImportTopLevel(primaryExampleMDX, pascal);\n const hasImport = hasImportUsage || hasImportExamples || hasImportPrimary;\n\n let exampleRelPaths: string[] = [];\n let examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }> = [];\n const parsedExamplesSections = parseExamplesSections(examplesMDX);\n if (parsedExamplesSections.length === 0) {\n exampleRelPaths = await discoverExamples(filePath, componentsDir);\n examples = (exampleRelPaths || []).map((rel) => {\n const posixRel = rel\n .split(require(\"path\").sep)\n .join(require(\"path\").posix.sep);\n const importPathEx = `${componentsAlias}/${posixRel}`;\n const abs = join(componentsDir, rel);\n const source = require(\"fs\").readFileSync(abs, \"utf-8\");\n const base = toIdentifier(\n require(\"path\").basename(rel, require(\"path\").extname(rel)),\n );\n const importNameEx = `${pascal}${base}`;\n const titleEx = base;\n return { importName: importNameEx, importPath: importPathEx, title: titleEx, source };\n });\n }\n\n const usedInUsage = extractComponentTagsFromPreviewMarkdown(usageMDX, {\n defaultPreview: false,\n }).filter((n) => n !== pascal);\n const usedInDescription = extractComponentTagsFromPreviewMarkdown(\n descriptionBodyMDX,\n ).filter((n) => n !== pascal);\n const usedInExamples = extractComponentTagsFromExamplesSections(\n parsedExamplesSections,\n ).filter((n) => n !== pascal);\n const usedInPrimary = extractComponentTagsFromMDX(primaryExampleMDX).filter(\n (n) => n !== pascal,\n );\n const usedInApi = extractComponentTagsFromPreviewMarkdown(apiMDX).filter(\n (n) => n !== pascal,\n );\n const autoSet = new Set<string>([\n ...usedInUsage,\n ...usedInDescription,\n ...usedInExamples,\n ...usedInPrimary,\n ...usedInApi,\n ]);\n\n // For folder-based components, add subcomponents used in examples to namedExports\n const usedNamedExports = isFolder\n ? namedExports.filter((n) => autoSet.has(n))\n : [];\n\n // Remove subcomponents from autoSet (they'll be included via namedExports)\n if (isFolder) {\n for (const n of namedExports) {\n autoSet.delete(n);\n }\n }\n\n const autoImports = Array.from(autoSet)\n .filter((name) => !RESERVED_COMPONENTS.has(name))\n .filter((name) => true);\n\n const lucideIcons = autoImports.filter((n) => /Icon$/.test(n));\n const uiAutoImports = autoImports.filter((n) => !/Icon$/.test(n));\n\n const mdx = buildMdx({\n importName,\n importPath,\n title,\n description,\n usageMDX,\n hasImport,\n propsList,\n propsTable,\n examples,\n examplesSections: parsedExamplesSections,\n componentFolderMap,\n autoImports: uiAutoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource: astroFile.trim(),\n commandName: slug,\n figmaUrl,\n descriptionBodyMDX,\n componentsAlias,\n // Pass subcomponents as named exports for folder-based components\n namedExports: isFolder ? usedNamedExports : undefined,\n apiMDX,\n });\n const outFile = join(outDir, `${slug}.mdx`);\n mkdirSync(dirname(outFile), { recursive: true });\n await writeFile(outFile, mdx, \"utf-8\");\n generatedCount += 1;\n spin.text = `Generating docs (${generatedCount}/${total}) - ${title}`;\n if (DEBUG) logger.info(`Generated ${outFile}`);\n }\n spin.succeed(\n `Created ${generatedCount} file${generatedCount === 1 ? \"\" : \"s\"}:`,\n );\n // log all files with relative paths, sorted alphabetically\n const relPaths = components\n .map((c) => {\n const slug = slugify(c.name);\n const outFile = join(outDir, `${slug}.mdx`);\n return relative(cwd, outFile);\n })\n .sort((a, b) => a.localeCompare(b));\n relPaths.forEach((p) => {\n logger.log(` - ${p}`);\n });\n logger.break();\n}\n\nexport async function runDocsGenerator(): Promise<void> {\n await main();\n}\n\nif (\n process.env.BEJAMAS_SKIP_AUTO_RUN !== \"1\" &&\n process.env.BEJAMAS_SKIP_AUTO_RUN !== \"true\"\n) {\n runDocsGenerator().catch((err) => {\n logger.error(String(err));\n process.exit(1);\n });\n}\n"],"mappings":"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"}
|