bejamas 0.0.0-canary.0f00bcf
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generate-mdx-DHm_37lA.js +574 -0
- package/dist/generate-mdx-DHm_37lA.js.map +1 -0
- package/dist/index.js +10897 -0
- package/dist/index.js.map +1 -0
- package/dist/spinner-B-Vrcyil.js +3229 -0
- package/dist/spinner-B-Vrcyil.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-mdx-DHm_37lA.js","names":["RESERVED_COMPONENTS: Set<string>","meta: Record<string, any>","usageLines: string[]","examplesLines: string[]","primaryExampleLines: string[]","current: any","nameNode: any","defaultValue: string | undefined","require","match: RegExpExecArray | null","found: string[]","pathPosix","m: RegExpExecArray | null","external: string[]","internal: string[]","exampleSections: string[]","exampleRelPaths: string[]","examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }>","importPath","blocks: Array<{ title: string; body: string[] }>","current: { title: string; body: string[] }"],"sources":["../src/docs/generate-mdx/utils.ts","../src/docs/generate-mdx/mdx-builder.ts","../src/docs/generate-mdx/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"fs\";\nimport { readdir } from \"fs/promises\";\nimport path, { dirname, extname, join, posix as pathPosix } from \"path\";\nimport { createRequire } from \"module\";\nimport { Project, SyntaxKind, SourceFile } from \"ts-morph\";\n\nexport const RESERVED_COMPONENTS: Set<string> = new Set([\n \"Fragment\",\n \"CodePackageManagers\",\n \"DocsTabs\",\n \"DocsTabItem\",\n \"DocsCodePackageManagers\",\n \"Tabs\",\n \"TabItem\",\n]);\n\nexport function slugify(input: string): string {\n return input\n .replace(/\\.(astro|md|mdx|tsx|ts|jsx|js)$/i, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .replace(/\\s+/g, \"-\")\n .replace(/_+/g, \"-\")\n .toLowerCase();\n}\n\nexport function extractFrontmatter(source: string): string {\n const match = source.match(/^---\\n([\\s\\S]*?)\\n---/);\n return (match && match[1]) || \"\";\n}\n\nexport function toIdentifier(name: string): string {\n const base = name\n .replace(/\\.[^.]+$/, \"\")\n .replace(/[^a-zA-Z0-9]+/g, \" \")\n .trim()\n .replace(/\\b\\w/g, (c) => c.toUpperCase())\n .replace(/\\s+/g, \"\");\n return /^[A-Za-z_]/.test(base) ? base : `Ex${base}`;\n}\n\nexport function parseJsDocMetadata(\n frontmatterCode: string,\n): Record<string, any> {\n const jsDocMatch = frontmatterCode.match(/\\/\\*\\*([\\s\\S]*?)\\*\\//);\n if (!jsDocMatch) return {};\n const content = jsDocMatch[1];\n const lines = content.split(\"\\n\").map((l) => l.replace(/^\\s*\\*\\s?/, \"\"));\n const meta: Record<string, any> = {};\n let inUsage = false;\n let inExamples = false;\n let inPrimaryExample = false;\n const usageLines: string[] = [];\n const examplesLines: string[] = [];\n const primaryExampleLines: string[] = [];\n for (const rawLine of lines) {\n const line = rawLine;\n if (inUsage) {\n if (line.trim().startsWith(\"@\")) {\n inUsage = false;\n } else {\n usageLines.push(line);\n continue;\n }\n }\n if (inPrimaryExample) {\n if (line.trim().startsWith(\"@\")) {\n inPrimaryExample = false;\n } else {\n primaryExampleLines.push(line);\n continue;\n }\n }\n if (inExamples) {\n if (line.trim().startsWith(\"@\")) {\n inExamples = false;\n } else {\n examplesLines.push(line);\n continue;\n }\n }\n if (line.trim().startsWith(\"@component\"))\n meta.name = line.replace(\"@component\", \"\").trim();\n else if (line.trim().startsWith(\"@title\"))\n meta.title = line.replace(\"@title\", \"\").trim();\n else if (line.trim().startsWith(\"@description\"))\n meta.description = line.replace(\"@description\", \"\").trim();\n else if (line.trim().startsWith(\"@usage\")) {\n inUsage = true;\n continue;\n } else if (line.trim().startsWith(\"@examples\")) {\n inExamples = true;\n continue;\n } else if (line.trim().startsWith(\"@example\")) {\n inPrimaryExample = true;\n continue;\n }\n }\n if (usageLines.length) meta.usageMDX = usageLines.join(\"\\n\").trim();\n if (examplesLines.length) meta.examplesMDX = examplesLines.join(\"\\n\").trim();\n if (primaryExampleLines.length)\n meta.primaryExampleMDX = primaryExampleLines.join(\"\\n\").trim();\n return meta;\n}\n\nexport function extractPropsFromAstroProps(sourceFile: SourceFile): Array<{\n name?: string;\n isRest?: boolean;\n hasDefault?: boolean;\n defaultValue?: string;\n alias?: string;\n}> {\n // Helper: unwrap expressions like `(Astro.props as Props)`, `Astro.props as Props`,\n // `<Props>Astro.props`, `(Astro.props)!`, and parenthesized variants until we reach\n // the underlying PropertyAccessExpression.\n function unwrapAstroProps(node: any): any | null {\n let current: any = node;\n // Unwrap layers that can wrap the property access\n // AsExpression, TypeAssertion, SatisfiesExpression, NonNullExpression, ParenthesizedExpression\n // Keep drilling down via getExpression()\n // Guard against cycles by limiting iterations\n for (let i = 0; i < 10; i += 1) {\n const kind = current.getKind();\n if (kind === SyntaxKind.PropertyAccessExpression) {\n const expr = current.getExpression();\n if (\n expr &&\n expr.getText() === \"Astro\" &&\n current.getName() === \"props\"\n ) {\n return current;\n }\n return null;\n }\n if (\n kind === SyntaxKind.AsExpression ||\n kind === SyntaxKind.TypeAssertion ||\n // @ts-ignore - SatisfiesExpression may not exist in older TS versions\n kind === (SyntaxKind as any).SatisfiesExpression ||\n kind === SyntaxKind.NonNullExpression ||\n kind === SyntaxKind.ParenthesizedExpression\n ) {\n const next = current.getExpression && current.getExpression();\n if (!next) return null;\n current = next;\n continue;\n }\n return null;\n }\n return null;\n }\n\n const declarations = sourceFile.getDescendantsOfKind(\n SyntaxKind.VariableDeclaration,\n );\n const target = declarations.find((decl) => {\n const init = decl.getInitializer();\n if (!init) return false;\n return !!unwrapAstroProps(init);\n });\n if (!target) return [];\n const nameNode: any = target.getNameNode();\n if (!nameNode || nameNode.getKind() !== SyntaxKind.ObjectBindingPattern)\n return [];\n const obj = nameNode.asKindOrThrow(SyntaxKind.ObjectBindingPattern);\n return obj.getElements().map((el: any) => {\n const isRest = !!el.getDotDotDotToken();\n if (isRest) return { isRest: true, hasDefault: false, alias: el.getName() };\n const propertyNameNode = el.getPropertyNameNode();\n const name = el.getName();\n const propName = propertyNameNode ? propertyNameNode.getText() : name;\n const initializer = el.getInitializer();\n let defaultValue: string | undefined;\n if (initializer) defaultValue = initializer.getText();\n return { name: propName, hasDefault: initializer != null, defaultValue };\n });\n}\n\nexport function extractPropsFromDeclaredProps(sourceFile: SourceFile): Array<{\n name: string;\n type: string;\n optional: boolean;\n}> {\n function normalizeTypeText(text: string | undefined): string {\n if (!text) return \"\";\n return text.replace(/\\s+/g, \" \").replace(/;\\s*$/, \"\").trim();\n }\n // Prefer interface Props\n const iface = sourceFile.getInterface(\"Props\");\n if (iface) {\n const properties = iface.getProperties();\n return properties.map((prop) => {\n const name = prop.getName();\n const typeNode = prop.getTypeNode();\n const rawType = typeNode ? typeNode.getText() : prop.getType().getText();\n const typeText = normalizeTypeText(rawType);\n const optional = prop.hasQuestionToken();\n return { name, type: typeText, optional };\n });\n }\n\n // Fallback: type Props = { ... }\n const typeAlias = sourceFile.getTypeAlias(\"Props\");\n if (typeAlias) {\n const typeNode = typeAlias.getTypeNode();\n if (typeNode && typeNode.getKind() === SyntaxKind.TypeLiteral) {\n const literal = typeNode.asKindOrThrow(SyntaxKind.TypeLiteral);\n const properties = literal.getProperties();\n return properties.map((prop) => {\n const name = prop.getName();\n const tn = prop.getTypeNode();\n const rawType = tn ? tn.getText() : prop.getType().getText();\n const typeText = normalizeTypeText(rawType);\n const optional = prop.hasQuestionToken();\n return { name, type: typeText, optional };\n });\n }\n }\n\n return [];\n}\n\nexport function resolveUiRoot(cwd: string): string {\n const require = createRequire(import.meta.url);\n\n const envRoot = process.env.BEJAMAS_UI_ROOT;\n if (envRoot && existsSync(path.join(envRoot, \"package.json\"))) {\n return envRoot;\n }\n\n try {\n const pkgPath = require.resolve(\"@bejamas/ui/package.json\", {\n paths: [cwd],\n });\n return path.dirname(pkgPath);\n } catch {}\n\n let current = cwd;\n for (let i = 0; i < 6; i += 1) {\n const candidate = path.join(current, \"packages\", \"ui\", \"package.json\");\n if (existsSync(candidate)) return path.dirname(candidate);\n const parent = path.dirname(current);\n if (parent === current) break;\n current = parent;\n }\n\n try {\n const anyEntry = require.resolve(\"@bejamas/ui/*\", { paths: [cwd] });\n return path.resolve(anyEntry, \"..\", \"..\");\n } catch {}\n\n throw new Error(\"Unable to locate @bejamas/ui in the workspace\");\n}\n\nexport function resolveOutDir(cwd: string): string {\n const envOut = process.env.BEJAMAS_DOCS_OUT_DIR;\n if (envOut && envOut.length) {\n return path.isAbsolute(envOut) ? envOut : path.resolve(cwd, envOut);\n }\n return path.resolve(cwd, \"../../apps/web/src/content/docs/components\");\n}\n\nexport function detectHasImportTopLevel(\n block: string,\n pascalName: string,\n): boolean {\n if (!block) return false;\n let inFence = false;\n const importLineRegex = new RegExp(\n `^\\\\s*import\\\\s+.*\\\\bfrom\\\\s+['\"][^'\"]+\\\\b${pascalName}\\\\.astro['\"]`,\n );\n for (const line of block.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n inFence = !inFence;\n continue;\n }\n if (!inFence && importLineRegex.test(line)) return true;\n }\n return false;\n}\n\nexport function hasImportOfTopLevel(\n block: string,\n componentName: string,\n): boolean {\n if (!block) return false;\n let inFence = false;\n const importRegex = new RegExp(\n `^\\\\s*import\\\\s+[^;]*\\\\b${componentName}\\\\b[^;]*from\\\\s+['\"][^'\"]*(?:/|^)${componentName}\\\\.astro['\"]`,\n );\n const lucideIconRegex = /Icon$/.test(componentName)\n ? new RegExp(\n `^\\\\s*import\\\\s+\\\\{[^}]*\\\\b${componentName}\\\\b[^}]*\\\\}\\\\s+from\\\\s+['\"]@lucide/astro['\"]`,\n )\n : null;\n for (const line of block.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n inFence = !inFence;\n continue;\n }\n if (!inFence && importRegex.test(line)) return true;\n if (!inFence && lucideIconRegex && lucideIconRegex.test(line)) return true;\n }\n return false;\n}\n\nexport function normalizeBlockMDX(block: string): string {\n if (!block) return \"\";\n return block.replace(\n /from\\s+['\"]@\\/ui\\/components\\//g,\n \"from '@bejamas/ui/components/\",\n );\n}\n\nexport function replaceDocsComponentTags(block: string): string {\n if (!block) return \"\";\n let inFence = false;\n const lines = block.split(\"\\n\");\n const out: string[] = [];\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n inFence = !inFence;\n out.push(line);\n continue;\n }\n if (inFence) {\n out.push(line);\n continue;\n }\n const replaced = line\n .replace(/<Tabs(\\b|\\s)/g, \"<DocsTabs$1\")\n .replace(/<\\/Tabs>/g, \"</DocsTabs>\")\n .replace(/<TabItem(\\b|\\s)/g, \"<DocsTabItem$1\")\n .replace(/<\\/TabItem>/g, \"</DocsTabItem>\");\n out.push(replaced);\n }\n return out.join(\"\\n\");\n}\n\nexport function normalizeUsageMDX(\n usageMDX: string,\n pascalName: string,\n): { text: string; hasImport: boolean } {\n const normalized = normalizeBlockMDX(usageMDX);\n const hasImport = detectHasImportTopLevel(normalized, pascalName);\n return { text: normalized.trim(), hasImport };\n}\n\nexport function extractComponentTagsFromMDX(block: string): string[] {\n if (!block) return [];\n let inFence = false;\n const found = new Set<string>();\n const tagRegex = /<([A-Z][A-Za-z0-9_]*)\\b/g;\n for (const line of block.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.startsWith(\"```\")) {\n inFence = !inFence;\n continue;\n }\n if (inFence) continue;\n let match: RegExpExecArray | null;\n while ((match = tagRegex.exec(line)) !== null) {\n const name = match[1];\n found.add(name);\n }\n }\n return Array.from(found);\n}\n\nexport async function discoverExamples(\n componentFilePath: string,\n componentsDir: string,\n): Promise<string[]> {\n const fileBase = path.basename(\n componentFilePath,\n path.extname(componentFilePath),\n );\n const kebabBase = slugify(fileBase);\n const candidates = [\n join(dirname(componentFilePath), `${fileBase}.examples`),\n join(dirname(componentFilePath), `${kebabBase}.examples`),\n ];\n const found: string[] = [];\n for (const dir of candidates) {\n try {\n const items = await readdir(dir, { withFileTypes: true });\n for (const it of items) {\n if (it.isFile() && extname(it.name).toLowerCase() === \".astro\") {\n const abs = join(dir, it.name);\n const relFromComponents = path\n .relative(componentsDir, abs)\n .split(path.sep)\n .join(pathPosix.sep);\n found.push(relFromComponents);\n }\n }\n } catch {}\n }\n return found;\n}\n\nexport function createSourceFileFromFrontmatter(\n frontmatterCode: string,\n): SourceFile {\n const project = new Project({ useInMemoryFileSystem: true });\n return project.createSourceFile(\"Component.ts\", frontmatterCode, {\n overwrite: true,\n });\n}\n","export function buildMdx(params: {\n importName: string;\n importPath: string;\n title: string;\n description: 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 examplesBlocks: Array<{ title: string; body: string }>;\n autoImports: string[];\n lucideIcons: string[];\n primaryExampleMDX: string;\n componentSource: string;\n commandName: string;\n}): string {\n const {\n importName,\n importPath,\n title,\n description,\n usageMDX,\n hasImport,\n propsList,\n propsTable,\n examples,\n examplesBlocks,\n autoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource,\n commandName,\n } = params;\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 const sortedUiAuto = (autoImports ?? []).slice().sort();\n const uiAutoLines = sortedUiAuto.map(\n (name) => `import ${name} from '@bejamas/ui/components/${name}.astro';`,\n );\n const exampleLines = (examples ?? [])\n .map((ex) => `import ${ex.importName} from '${ex.importPath}';`)\n .sort((a, b) => a.localeCompare(b));\n const internalTopImports = [\n !hasImport ? `import ${importName} from '${importPath}';` : null,\n ...uiAutoLines,\n ...exampleLines,\n ]\n .filter((v) => v != null)\n .slice()\n .sort((a, b) => String(a).localeCompare(String(b)));\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 const usedUi = (autoImports ?? [])\n .filter((n) => used.has(n))\n .slice()\n .sort();\n const includeMain = !hasImport && used.has(importName);\n\n const external: string[] = [];\n if (usedIcons.length) {\n external.push(`import { ${usedIcons.join(\", \")} } from '@lucide/astro';`);\n }\n const internal: string[] = [];\n if (includeMain)\n internal.push(`import ${importName} from '${importPath}';`);\n internal.push(\n ...usedUi.map(\n (name) => `import ${name} from '@bejamas/ui/components/${name}.astro';`,\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 const primaryExampleSection =\n primaryExampleMDX && primaryExampleMDX.length\n ? `<DocsTabs>\n <DocsTabItem label=\"Preview\">\n <div class=\"not-content sl-bejamas-component-preview flex justify-center p-10 border border-border rounded-xl min-h-[450px] items-center\">\n${primaryExampleMDX}\n </div>\n </DocsTabItem>\n <DocsTabItem label=\"Source\">\n\n\\`\\`\\`astro\n${(() => {\n const lines = buildSnippetImportLines(primaryExampleMDX);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n})()}${primaryExampleMDX}\n\\`\\`\\`\n </DocsTabItem>\n</DocsTabs>`\n : null;\n\n const exampleSections: string[] = [];\n if (examplesBlocks && examplesBlocks.length) {\n for (const blk of examplesBlocks) {\n exampleSections.push(\n `### ${blk.title}\n\n<DocsTabs>\n <DocsTabItem label=\"Preview\">\n <div class=\"not-content sl-bejamas-component-preview flex justify-center p-10 border border-border rounded-xl min-h-[450px] items-center\">\n${blk.body}\n </div>\n </DocsTabItem>\n <DocsTabItem label=\"Source\">\n\n\\`\\`\\`astro\n${(() => {\n const lines = buildSnippetImportLines(blk.body);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n})()}${blk.body}\n\\`\\`\\`\n </DocsTabItem>\n</DocsTabs>`,\n );\n }\n }\n if (examples && examples.length) {\n for (const ex of examples) {\n exampleSections.push(\n `### ${ex.title}\n\n<DocsTabs>\n <DocsTabItem label=\"Preview\">\n <div class=\"not-content\">\n <${ex.importName} />\n </div>\n </DocsTabItem>\n <DocsTabItem label=\"Source\">\n\n\\`\\`\\`astro\n${ex.source}\n\\`\\`\\`\n </DocsTabItem>\n</DocsTabs>`,\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<DocsTabs syncKey=\"installation\">\n <DocsTabItem label=\"CLI\">\n\n<DocsTabs syncKey=\"pkg\">\n <DocsTabItem label=\"bun\">\n\n\\`\\`\\`bash\n bunx bejamas add ${commandName}\n\\`\\`\\`\n\n </DocsTabItem>\n <DocsTabItem label=\"npm\">\n\n\\`\\`\\`bash\n npx bejamas add ${commandName}\n\\`\\`\\`\n\n </DocsTabItem>\n <DocsTabItem label=\"pnpm\">\n\n\\`\\`\\`bash\n pnpm dlx bejamas add ${commandName}\n\\`\\`\\`\n\n </DocsTabItem>\n <DocsTabItem label=\"yarn\">\n\n\\`\\`\\`bash\n yarn dlx bejamas add ${commandName}\n\\`\\`\\`\n\n </DocsTabItem>\n</DocsTabs>\n</DocsTabItem>\n<DocsTabItem label=\"Manual\">\n\n\\`\\`\\`astro\n${componentSource}\n\\`\\`\\`\n </DocsTabItem>\n</DocsTabs>`;\n\n const lines = [\n \"---\",\n `title: ${title}`,\n description ? `description: ${description}` : null,\n \"---\",\n \"\",\n ...importLines,\n importLines.length ? \"\" : null,\n description ? description : null,\n description ? \"\" : null,\n primaryExampleSection,\n primaryExampleSection ? \"\" : null,\n installationSection,\n \"\",\n usageMDX && usageMDX.length ? `## Usage\\n\\n${usageMDX}` : 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 exampleSections.length\n ? `## Examples\\n\\n` + exampleSections.join(\"\\n\\n\")\n : null,\n ].filter((v) => v !== null && v !== undefined);\n\n return lines.join(\"\\n\").trim() + \"\\n\";\n}\n","import { mkdirSync } from \"fs\";\nimport { readdir, writeFile } from \"fs/promises\";\nimport { join, extname, dirname, relative } 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 { buildMdx } from \"./mdx-builder\";\nimport { logger } from \"@/src/utils/logger\";\nimport { spinner } from \"@/src/utils/spinner\";\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 uiRoot = resolveUiRoot(cwd);\n const componentsDir = join(uiRoot, \"src\", \"components\");\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 const entriesDir = await readdir(componentsDir, { withFileTypes: true });\n const files = entriesDir.filter(\n (e) => e.isFile() && extname(e.name).toLowerCase() === \".astro\",\n );\n if (DEBUG) {\n logger.info(`[docs-generator] components found: ${files.length}`);\n if (files.length)\n logger.info(\n `[docs-generator] first few: ${files\n .slice(0, 5)\n .map((f) => f.name)\n .join(\", \")}`,\n );\n }\n\n let generatedCount = 0;\n const total = files.length;\n const spin = spinner(`Generating docs (0/${total})`).start();\n for (const f of files) {\n const filePath = join(componentsDir, f.name);\n const astroFile = await (\n await import(\"fs/promises\")\n ).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(f.name)}`;\n const pascal = f.name.replace(/\\.(astro)$/i, \"\");\n const title = meta.title || meta.name || pascal;\n const description = meta.description || \"\";\n // Do not display props if there is no declared Props\n const propsList = \"\";\n\n const importName = pascal;\n const importPath = `@bejamas/ui/components/${pascal}.astro`;\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 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 examplesBlocksRaw = examplesMDX;\n const examplesBlocks = parseExamplesBlocks(examplesBlocksRaw);\n if (examplesBlocks.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 importPath = `@bejamas/ui/components/${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 importName = `${pascal}${base}`;\n const title = base;\n return { importName, importPath, title, source };\n });\n }\n\n const usedInUsage = extractComponentTagsFromMDX(usageMDX).filter(\n (n) => n !== pascal,\n );\n const usedInExamples = extractComponentTagsFromMDX(examplesMDX).filter(\n (n) => n !== pascal,\n );\n const usedInPrimary = extractComponentTagsFromMDX(primaryExampleMDX).filter(\n (n) => n !== pascal,\n );\n const autoSet = new Set<string>([\n ...usedInUsage,\n ...usedInExamples,\n ...usedInPrimary,\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 examplesBlocks: parseExamplesBlocks(examplesBlocksRaw),\n autoImports: uiAutoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource: astroFile.trim(),\n commandName: slug,\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 = files\n .map((f) => {\n const slug = `${slugify(f.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 function parseExamplesBlocks(\n examplesMDX: string,\n): Array<{ title: string; body: string }> {\n if (!examplesMDX) return [];\n const lines = examplesMDX.split(\"\\n\");\n const blocks: Array<{ title: string; body: string[] }> = [];\n let current: { title: string; body: string[] } = { title: \"\", body: [] };\n for (const line of lines) {\n const heading = line.match(/^###\\s+(.+)$/);\n if (heading) {\n if (current.title || current.body.length) blocks.push(current);\n current = { title: heading[1].trim(), body: [] };\n continue;\n }\n current.body.push(line);\n }\n if (current.title || current.body.length) blocks.push(current);\n return blocks.map((b, idx) => ({\n title: b.title || `Example ${idx + 1}`,\n body: b.body.join(\"\\n\").trim(),\n }));\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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"}
|