bejamas 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{generate-mdx-CPI1OKtC.js → generate-mdx-2KXXUsF1.js} +57 -74
- package/dist/generate-mdx-2KXXUsF1.js.map +1 -0
- package/dist/index.js +24 -33
- package/dist/index.js.map +1 -1
- package/dist/{utils-BA01hKci.js → utils-BXyPCddm.js} +6 -12
- package/dist/{utils-BA01hKci.js.map → utils-BXyPCddm.js.map} +1 -1
- package/package.json +1 -1
- package/dist/generate-mdx-CPI1OKtC.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils-BA01hKci.js","names":["BUILTIN_REGISTRIES: z.infer<typeof registryConfigSchema>","fs","type: ProjectInfo","fs","resolvedAliases: any","key","RESERVED_COMPONENTS: Set<string>","meta: Record<string, any>","usageLines: string[]","examplesLines: string[]","primaryExampleLines: string[]","descriptionBodyLines: string[]","current: any","nameNode: any","defaultValue: string | undefined","match: RegExpExecArray | null","found: string[]","pathPosix"],"sources":["../src/registry/constants.ts","../src/utils/highlighter.ts","../src/utils/logger.ts","../src/utils/spinner.ts","../src/utils/get-package-info.ts","../src/utils/get-project-info.ts","../src/utils/resolve-import.ts","../src/utils/get-config.ts","../src/docs/generate-mdx/utils.ts"],"sourcesContent":["import { registryConfigSchema } from \"shadcn/schema\";\nimport { z } from \"zod\";\n\nexport const REGISTRY_URL =\n process.env.REGISTRY_URL ?? \"http://localhost:4321/r\";\n\nexport const FALLBACK_STYLE = \"new-york-v4\";\n\nexport const BASE_COLORS = [\n {\n name: \"neutral\",\n label: \"Neutral\",\n },\n {\n name: \"gray\",\n label: \"Gray\",\n },\n {\n name: \"zinc\",\n label: \"Zinc\",\n },\n {\n name: \"stone\",\n label: \"Stone\",\n },\n {\n name: \"slate\",\n label: \"Slate\",\n },\n] as const;\n\n// Built-in registries that are always available and cannot be overridden\nexport const BUILTIN_REGISTRIES: z.infer<typeof registryConfigSchema> = {\n \"@bejamas\": `${REGISTRY_URL}/{name}.json`,\n};\n\nexport const BUILTIN_MODULES = new Set([\n [\n // Node.js built-in modules\n // From https://github.com/sindresorhus/builtin-modules.\n \"node:assert\",\n \"assert\",\n \"node:assert/strict\",\n \"assert/strict\",\n \"node:async_hooks\",\n \"async_hooks\",\n \"node:buffer\",\n \"buffer\",\n \"node:child_process\",\n \"child_process\",\n \"node:cluster\",\n \"cluster\",\n \"node:console\",\n \"console\",\n \"node:constants\",\n \"constants\",\n \"node:crypto\",\n \"crypto\",\n \"node:dgram\",\n \"dgram\",\n \"node:diagnostics_channel\",\n \"diagnostics_channel\",\n \"node:dns\",\n \"dns\",\n \"node:dns/promises\",\n \"dns/promises\",\n \"node:domain\",\n \"domain\",\n \"node:events\",\n \"events\",\n \"node:fs\",\n \"fs\",\n \"node:fs/promises\",\n \"fs/promises\",\n \"node:http\",\n \"http\",\n \"node:http2\",\n \"http2\",\n \"node:https\",\n \"https\",\n \"node:inspector\",\n \"inspector\",\n \"node:inspector/promises\",\n \"inspector/promises\",\n \"node:module\",\n \"module\",\n \"node:net\",\n \"net\",\n \"node:os\",\n \"os\",\n \"node:path\",\n \"path\",\n \"node:path/posix\",\n \"path/posix\",\n \"node:path/win32\",\n \"path/win32\",\n \"node:perf_hooks\",\n \"perf_hooks\",\n \"node:process\",\n \"process\",\n \"node:querystring\",\n \"querystring\",\n \"node:quic\",\n \"node:readline\",\n \"readline\",\n \"node:readline/promises\",\n \"readline/promises\",\n \"node:repl\",\n \"repl\",\n \"node:sea\",\n \"node:sqlite\",\n \"node:stream\",\n \"stream\",\n \"node:stream/consumers\",\n \"stream/consumers\",\n \"node:stream/promises\",\n \"stream/promises\",\n \"node:stream/web\",\n \"stream/web\",\n \"node:string_decoder\",\n \"string_decoder\",\n \"node:test\",\n \"node:test/reporters\",\n \"node:timers\",\n \"timers\",\n \"node:timers/promises\",\n \"timers/promises\",\n \"node:tls\",\n \"tls\",\n \"node:trace_events\",\n \"trace_events\",\n \"node:tty\",\n \"tty\",\n \"node:url\",\n \"url\",\n \"node:util\",\n \"util\",\n \"node:util/types\",\n \"util/types\",\n \"node:v8\",\n \"v8\",\n \"node:vm\",\n \"vm\",\n \"node:wasi\",\n \"wasi\",\n \"node:worker_threads\",\n \"worker_threads\",\n \"node:zlib\",\n \"zlib\",\n\n // Bun built-in modules.\n \"bun\",\n \"bun:test\",\n \"bun:sqlite\",\n \"bun:ffi\",\n \"bun:jsc\",\n \"bun:internal\",\n ],\n]);\n\nexport const DEPRECATED_COMPONENTS = [\n {\n name: \"toast\",\n deprecatedBy: \"sonner\",\n message:\n \"The toast component is deprecated. Use the sonner component instead.\",\n },\n {\n name: \"toaster\",\n deprecatedBy: \"sonner\",\n message:\n \"The toaster component is deprecated. Use the sonner component instead.\",\n },\n];\n","import { cyan, green, red, yellow } from \"kleur/colors\";\n\nexport const highlighter = {\n error: red,\n warn: yellow,\n info: cyan,\n success: green,\n};\n","import { highlighter } from \"@/src/utils/highlighter\";\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")));\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")));\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")));\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")));\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"));\n },\n break() {\n console.log(\"\");\n },\n};\n","import ora, { type Options } from \"ora\";\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean;\n },\n) {\n return ora({\n text,\n isSilent: options?.silent,\n });\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport { type PackageJson } from \"type-fest\";\n\nexport function getPackageInfo(\n cwd: string = \"\",\n shouldThrow: boolean = true,\n): PackageJson | null {\n const packageJsonPath = path.join(cwd, \"package.json\");\n\n return fs.readJSONSync(packageJsonPath, {\n throws: shouldThrow,\n }) as PackageJson;\n}\n","import path from \"path\";\nimport { rawConfigSchema } from \"shadcn/schema\";\nimport { Config, getConfig, resolveConfigPaths } from \"@/src/utils/get-config\";\nimport { getPackageInfo } from \"@/src/utils/get-package-info\";\nimport fg from \"fast-glob\";\nimport fs from \"fs-extra\";\nimport { loadConfig } from \"tsconfig-paths\";\nimport { z } from \"zod\";\n\nexport type TailwindVersion = \"v3\" | \"v4\" | null;\n\nexport type ProjectInfo = {\n isAstro: boolean;\n tailwindConfigFile: string | null;\n tailwindCssFile: string | null;\n tailwindVersion: TailwindVersion;\n aliasPrefix: string | null;\n};\n\nconst PROJECT_SHARED_IGNORE = [\n \"**/node_modules/**\",\n \".astro\",\n \"public\",\n \"dist\",\n \"build\",\n];\n\nconst TS_CONFIG_SCHEMA = z.object({\n compilerOptions: z.object({\n paths: z.record(z.string().or(z.array(z.string()))),\n }),\n});\n\nexport async function getProjectInfo(cwd: string): Promise<ProjectInfo | null> {\n const [\n configFiles,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n packageJson,\n ] = await Promise.all([\n fg.glob(\n \"**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*\",\n {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n },\n ),\n getTailwindConfigFile(cwd),\n getTailwindCssFile(cwd),\n getTailwindVersion(cwd),\n getTsConfigAliasPrefix(cwd),\n getPackageInfo(cwd, false),\n ]);\n\n const type: ProjectInfo = {\n isAstro: false,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n };\n\n // Astro.\n if (configFiles.find((file) => file.startsWith(\"astro.config.\"))?.length) {\n type.isAstro = true;\n return type;\n }\n\n return type;\n}\n\nexport async function getTailwindVersion(\n cwd: string,\n): Promise<ProjectInfo[\"tailwindVersion\"]> {\n const [packageInfo, config] = await Promise.all([\n getPackageInfo(cwd, false),\n getConfig(cwd),\n ]);\n\n // If the config file is empty, we can assume that it's a v4 project.\n if (config?.tailwind?.config === \"\") {\n return \"v4\";\n }\n\n if (\n !packageInfo?.dependencies?.tailwindcss &&\n !packageInfo?.devDependencies?.tailwindcss\n ) {\n return null;\n }\n\n if (\n /^(?:\\^|~)?3(?:\\.\\d+)*(?:-.*)?$/.test(\n packageInfo?.dependencies?.tailwindcss ||\n packageInfo?.devDependencies?.tailwindcss ||\n \"\",\n )\n ) {\n return \"v3\";\n }\n\n return \"v4\";\n}\n\nexport async function getTailwindCssFile(cwd: string) {\n const [files, tailwindVersion] = await Promise.all([\n fg.glob([\"**/*.css\", \"**/*.scss\"], {\n cwd,\n deep: 5,\n ignore: PROJECT_SHARED_IGNORE,\n }),\n getTailwindVersion(cwd),\n ]);\n\n if (!files.length) {\n return null;\n }\n\n const needle =\n tailwindVersion === \"v4\" ? `@import \"tailwindcss\"` : \"@tailwind base\";\n for (const file of files) {\n const contents = await fs.readFile(path.resolve(cwd, file), \"utf8\");\n if (\n contents.includes(`@import \"tailwindcss\"`) ||\n contents.includes(`@import 'tailwindcss'`) ||\n contents.includes(`@tailwind base`)\n ) {\n return file;\n }\n }\n\n return null;\n}\n\nexport async function getTailwindConfigFile(cwd: string) {\n const files = await fg.glob(\"tailwind.config.*\", {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n });\n\n if (!files.length) {\n return null;\n }\n\n return files[0];\n}\n\nexport async function getTsConfigAliasPrefix(cwd: string) {\n const tsConfig = await loadConfig(cwd);\n\n if (\n tsConfig?.resultType === \"failed\" ||\n !Object.entries(tsConfig?.paths).length\n ) {\n return null;\n }\n\n // This assume that the first alias is the prefix.\n for (const [alias, paths] of Object.entries(tsConfig.paths)) {\n if (\n paths.includes(\"./*\") ||\n paths.includes(\"./src/*\") ||\n paths.includes(\"./app/*\") ||\n paths.includes(\"./resources/js/*\") // Laravel.\n ) {\n return alias.replace(/\\/\\*$/, \"\") ?? null;\n }\n }\n\n // Use the first alias as the prefix.\n return Object.keys(tsConfig?.paths)?.[0].replace(/\\/\\*$/, \"\") ?? null;\n}\n\nexport async function isTypeScriptProject(cwd: string) {\n const files = await fg.glob(\"tsconfig.*\", {\n cwd,\n deep: 1,\n ignore: PROJECT_SHARED_IGNORE,\n });\n\n return files.length > 0;\n}\n\nexport async function getTsConfig(cwd: string) {\n for (const fallback of [\n \"tsconfig.json\",\n \"tsconfig.web.json\",\n \"tsconfig.app.json\",\n ]) {\n const filePath = path.resolve(cwd, fallback);\n if (!(await fs.pathExists(filePath))) {\n continue;\n }\n\n // We can't use fs.readJSON because it doesn't support comments.\n const contents = await fs.readFile(filePath, \"utf8\");\n const cleanedContents = contents.replace(/\\/\\*\\s*\\*\\//g, \"\");\n const result = TS_CONFIG_SCHEMA.safeParse(JSON.parse(cleanedContents));\n\n if (result.error) {\n continue;\n }\n\n return result.data;\n }\n\n return null;\n}\n\nexport async function getProjectConfig(\n cwd: string,\n defaultProjectInfo: ProjectInfo | null = null,\n): Promise<Config | null> {\n // Check for existing component config.\n const [existingConfig, projectInfo] = await Promise.all([\n getConfig(cwd),\n !defaultProjectInfo\n ? getProjectInfo(cwd)\n : Promise.resolve(defaultProjectInfo),\n ]);\n\n if (existingConfig) {\n return existingConfig;\n }\n\n if (\n !projectInfo ||\n !projectInfo.tailwindCssFile ||\n (projectInfo.tailwindVersion === \"v3\" && !projectInfo.tailwindConfigFile)\n ) {\n return null;\n }\n\n const config: z.infer<typeof rawConfigSchema> = {\n $schema: \"https://ui.shadcn.com/schema.json\",\n style: \"new-york\",\n tailwind: {\n config: projectInfo.tailwindConfigFile ?? \"\",\n baseColor: \"zinc\",\n css: projectInfo.tailwindCssFile,\n cssVariables: true,\n prefix: \"\",\n },\n iconLibrary: \"lucide\",\n aliases: {\n components: `${projectInfo.aliasPrefix}/components`,\n ui: `${projectInfo.aliasPrefix}/components/ui`,\n lib: `${projectInfo.aliasPrefix}/lib`,\n utils: `${projectInfo.aliasPrefix}/lib/utils`,\n },\n };\n\n return await resolveConfigPaths(cwd, config);\n}\n\nexport async function getProjectTailwindVersionFromConfig(config: {\n resolvedPaths: Pick<Config[\"resolvedPaths\"], \"cwd\">;\n}): Promise<TailwindVersion> {\n if (!config.resolvedPaths?.cwd) {\n return \"v3\";\n }\n\n const projectInfo = await getProjectInfo(config.resolvedPaths.cwd);\n\n if (!projectInfo?.tailwindVersion) {\n return null;\n }\n\n return projectInfo.tailwindVersion;\n}\n","import {\n createMatchPath,\n type ConfigLoaderSuccessResult,\n} from \"tsconfig-paths\";\n\nexport async function resolveImport(\n importPath: string,\n config: Pick<ConfigLoaderSuccessResult, \"absoluteBaseUrl\" | \"paths\">,\n) {\n return createMatchPath(config.absoluteBaseUrl, config.paths)(\n importPath,\n undefined,\n () => true,\n [\".ts\", \".tsx\", \".jsx\", \".js\", \".css\"],\n );\n}\n","import path from \"path\";\nimport { BUILTIN_REGISTRIES } from \"@/src/registry/constants\";\nimport {\n configSchema,\n rawConfigSchema,\n workspaceConfigSchema,\n} from \"shadcn/schema\";\nimport { getProjectInfo } from \"@/src/utils/get-project-info\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { resolveImport } from \"@/src/utils/resolve-import\";\nimport { cosmiconfig } from \"cosmiconfig\";\nimport fg from \"fast-glob\";\nimport { loadConfig } from \"tsconfig-paths\";\nimport { z } from \"zod\";\n\nexport const DEFAULT_STYLE = \"default\";\nexport const DEFAULT_COMPONENTS = \"@/components\";\nexport const DEFAULT_UTILS = \"@/lib/utils\";\nexport const DEFAULT_TAILWIND_CSS = \"app/globals.css\";\nexport const DEFAULT_TAILWIND_CONFIG = \"tailwind.config.js\";\nexport const DEFAULT_TAILWIND_BASE_COLOR = \"slate\";\n\n// TODO: Figure out if we want to support all cosmiconfig formats.\n// A simple components.json file would be nice.\nexport const explorer = cosmiconfig(\"components\", {\n searchPlaces: [\"components.json\"],\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nexport async function getConfig(cwd: string) {\n const config = await getRawConfig(cwd);\n\n if (!config) {\n return null;\n }\n\n // Set default icon library if not provided.\n if (!config.iconLibrary) {\n config.iconLibrary = config.style === \"new-york\" ? \"radix\" : \"lucide\";\n }\n\n return await resolveConfigPaths(cwd, config);\n}\n\nexport async function resolveConfigPaths(\n cwd: string,\n config: z.infer<typeof rawConfigSchema>,\n) {\n // Merge built-in registries with user registries\n config.registries = {\n ...BUILTIN_REGISTRIES,\n ...(config.registries || {}),\n };\n\n // Read tsconfig.json.\n const tsConfig = await loadConfig(cwd);\n\n if (tsConfig.resultType === \"failed\") {\n throw new Error(\n `Failed to load ${config.tsx ? \"tsconfig\" : \"jsconfig\"}.json. ${\n tsConfig.message ?? \"\"\n }`.trim(),\n );\n }\n\n return configSchema.parse({\n ...config,\n resolvedPaths: {\n cwd,\n tailwindConfig: config.tailwind.config\n ? path.resolve(cwd, config.tailwind.config)\n : \"\",\n tailwindCss: path.resolve(cwd, config.tailwind.css),\n utils: await resolveImport(config.aliases[\"utils\"], tsConfig),\n components: await resolveImport(config.aliases[\"components\"], tsConfig),\n ui: config.aliases[\"ui\"]\n ? await resolveImport(config.aliases[\"ui\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"ui\",\n ),\n // TODO: Make this configurable.\n // For now, we assume the lib and hooks directories are one level up from the components directory.\n lib: config.aliases[\"lib\"]\n ? await resolveImport(config.aliases[\"lib\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"utils\"], tsConfig)) ?? cwd,\n \"..\",\n ),\n hooks: config.aliases[\"hooks\"]\n ? await resolveImport(config.aliases[\"hooks\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"..\",\n \"hooks\",\n ),\n },\n });\n}\n\nexport async function getRawConfig(\n cwd: string,\n): Promise<z.infer<typeof rawConfigSchema> | null> {\n try {\n const configResult = await explorer.search(cwd);\n\n if (!configResult) {\n return null;\n }\n\n const config = rawConfigSchema.parse(configResult.config);\n\n // Check if user is trying to override built-in registries\n if (config.registries) {\n for (const registryName of Object.keys(config.registries)) {\n if (registryName in BUILTIN_REGISTRIES) {\n throw new Error(\n `\"${registryName}\" is a built-in registry and cannot be overridden.`,\n );\n }\n }\n }\n\n return config;\n } catch (error) {\n const componentPath = `${cwd}/components.json`;\n if (error instanceof Error && error.message.includes(\"reserved registry\")) {\n throw error;\n }\n throw new Error(\n `Invalid configuration found in ${highlighter.info(componentPath)}.`,\n );\n }\n}\n\n// Note: we can check for -workspace.yaml or \"workspace\" in package.json.\n// Since cwd is not necessarily the root of the project.\n// We'll instead check if ui aliases resolve to a different root.\nexport async function getWorkspaceConfig(config: Config) {\n let resolvedAliases: any = {};\n\n for (const key of Object.keys(config.aliases)) {\n if (!isAliasKey(key, config)) {\n continue;\n }\n\n const resolvedPath = config.resolvedPaths[key];\n const packageRoot = await findPackageRoot(\n config.resolvedPaths.cwd,\n resolvedPath,\n );\n\n if (!packageRoot) {\n resolvedAliases[key] = config;\n continue;\n }\n\n resolvedAliases[key] = await getConfig(packageRoot);\n }\n\n const result = workspaceConfigSchema.safeParse(resolvedAliases);\n if (!result.success) {\n return null;\n }\n\n return result.data;\n}\n\nexport async function findPackageRoot(cwd: string, resolvedPath: string) {\n const commonRoot = findCommonRoot(cwd, resolvedPath);\n const relativePath = path.relative(commonRoot, resolvedPath);\n\n const packageRoots = await fg.glob(\"**/package.json\", {\n cwd: commonRoot,\n deep: 3,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/public/**\"],\n });\n\n const matchingPackageRoot = packageRoots\n .map((pkgPath) => path.dirname(pkgPath))\n .find((pkgDir) => relativePath.startsWith(pkgDir));\n\n return matchingPackageRoot\n ? path.join(commonRoot, matchingPackageRoot)\n : null;\n}\n\nfunction isAliasKey(\n key: string,\n config: Config,\n): key is keyof Config[\"aliases\"] {\n return Object.keys(config.resolvedPaths)\n .filter((key) => key !== \"utils\")\n .includes(key);\n}\n\nexport function findCommonRoot(cwd: string, resolvedPath: string) {\n const parts1 = cwd.split(path.sep);\n const parts2 = resolvedPath.split(path.sep);\n const commonParts = [];\n\n for (let i = 0; i < Math.min(parts1.length, parts2.length); i++) {\n if (parts1[i] !== parts2[i]) {\n break;\n }\n commonParts.push(parts1[i]);\n }\n\n return commonParts.join(path.sep);\n}\n\n// TODO: Cache this call.\nexport async function getTargetStyleFromConfig(cwd: string, fallback: string) {\n const projectInfo = await getProjectInfo(cwd);\n return projectInfo?.tailwindVersion === \"v4\" ? \"new-york-v4\" : fallback;\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Creates a config object with sensible defaults.\n * Useful for universal registry items that bypass framework detection.\n *\n * @param partial - Partial config values to override defaults\n * @returns A complete Config object\n */\nexport function createConfig(partial?: DeepPartial<Config>): Config {\n const defaultConfig: Config = {\n resolvedPaths: {\n cwd: process.cwd(),\n tailwindConfig: \"\",\n tailwindCss: \"\",\n utils: \"\",\n components: \"\",\n ui: \"\",\n lib: \"\",\n hooks: \"\",\n },\n style: \"\",\n tailwind: {\n config: \"\",\n css: \"\",\n baseColor: \"\",\n cssVariables: false,\n },\n rsc: false,\n tsx: true,\n aliases: {\n components: \"\",\n utils: \"\",\n },\n registries: {\n ...BUILTIN_REGISTRIES,\n },\n };\n\n // Deep merge the partial config with defaults\n if (partial) {\n return {\n ...defaultConfig,\n ...partial,\n resolvedPaths: {\n ...defaultConfig.resolvedPaths,\n ...(partial.resolvedPaths || {}),\n },\n tailwind: {\n ...defaultConfig.tailwind,\n ...(partial.tailwind || {}),\n },\n aliases: {\n ...defaultConfig.aliases,\n ...(partial.aliases || {}),\n },\n registries: {\n ...defaultConfig.registries,\n ...(partial.registries || {}),\n },\n };\n }\n\n return defaultConfig;\n}\n","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 let captureDescriptionBody = false;\n const usageLines: string[] = [];\n const examplesLines: string[] = [];\n const primaryExampleLines: string[] = [];\n const descriptionBodyLines: 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 (captureDescriptionBody) {\n if (line.trim().startsWith(\"@\")) {\n captureDescriptionBody = false;\n } else {\n descriptionBodyLines.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 captureDescriptionBody = true;\n continue;\n } else if (line.trim().startsWith(\"@figmaUrl\"))\n meta.figmaUrl = line.replace(\"@figmaUrl\", \"\").trim();\n // Backward compatibility: support @figma but map to figmaUrl\n else if (line.trim().startsWith(\"@figma\"))\n meta.figmaUrl = line.replace(\"@figma\", \"\").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(\"@preview\")) {\n inPrimaryExample = true;\n continue;\n } else if (line.trim().startsWith(\"@example\")) {\n // backward compatibility with older docs\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 if (descriptionBodyLines.length)\n meta.descriptionBodyMDX = descriptionBodyLines.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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils-BXyPCddm.js","names":["BUILTIN_REGISTRIES: z.infer<typeof registryConfigSchema>","fs","type: ProjectInfo","fs","resolvedAliases: any","key","RESERVED_COMPONENTS: Set<string>","meta: Record<string, any>","usageLines: string[]","examplesLines: string[]","primaryExampleLines: string[]","descriptionBodyLines: string[]","current: any","nameNode: any","defaultValue: string | undefined","match: RegExpExecArray | null","found: string[]","pathPosix"],"sources":["../src/registry/constants.ts","../src/utils/highlighter.ts","../src/utils/logger.ts","../src/utils/spinner.ts","../src/utils/get-package-info.ts","../src/utils/get-project-info.ts","../src/utils/resolve-import.ts","../src/utils/get-config.ts","../src/docs/generate-mdx/utils.ts"],"sourcesContent":["import { registryConfigSchema } from \"shadcn/schema\";\nimport { z } from \"zod\";\n\nexport const REGISTRY_URL =\n process.env.REGISTRY_URL ?? \"http://localhost:4321/r\";\n\nexport const FALLBACK_STYLE = \"new-york-v4\";\n\nexport const BASE_COLORS = [\n {\n name: \"neutral\",\n label: \"Neutral\",\n },\n {\n name: \"gray\",\n label: \"Gray\",\n },\n {\n name: \"zinc\",\n label: \"Zinc\",\n },\n {\n name: \"stone\",\n label: \"Stone\",\n },\n {\n name: \"slate\",\n label: \"Slate\",\n },\n] as const;\n\n// Built-in registries that are always available and cannot be overridden\nexport const BUILTIN_REGISTRIES: z.infer<typeof registryConfigSchema> = {\n \"@bejamas\": `${REGISTRY_URL}/{name}.json`,\n};\n\nexport const BUILTIN_MODULES = new Set([\n [\n // Node.js built-in modules\n // From https://github.com/sindresorhus/builtin-modules.\n \"node:assert\",\n \"assert\",\n \"node:assert/strict\",\n \"assert/strict\",\n \"node:async_hooks\",\n \"async_hooks\",\n \"node:buffer\",\n \"buffer\",\n \"node:child_process\",\n \"child_process\",\n \"node:cluster\",\n \"cluster\",\n \"node:console\",\n \"console\",\n \"node:constants\",\n \"constants\",\n \"node:crypto\",\n \"crypto\",\n \"node:dgram\",\n \"dgram\",\n \"node:diagnostics_channel\",\n \"diagnostics_channel\",\n \"node:dns\",\n \"dns\",\n \"node:dns/promises\",\n \"dns/promises\",\n \"node:domain\",\n \"domain\",\n \"node:events\",\n \"events\",\n \"node:fs\",\n \"fs\",\n \"node:fs/promises\",\n \"fs/promises\",\n \"node:http\",\n \"http\",\n \"node:http2\",\n \"http2\",\n \"node:https\",\n \"https\",\n \"node:inspector\",\n \"inspector\",\n \"node:inspector/promises\",\n \"inspector/promises\",\n \"node:module\",\n \"module\",\n \"node:net\",\n \"net\",\n \"node:os\",\n \"os\",\n \"node:path\",\n \"path\",\n \"node:path/posix\",\n \"path/posix\",\n \"node:path/win32\",\n \"path/win32\",\n \"node:perf_hooks\",\n \"perf_hooks\",\n \"node:process\",\n \"process\",\n \"node:querystring\",\n \"querystring\",\n \"node:quic\",\n \"node:readline\",\n \"readline\",\n \"node:readline/promises\",\n \"readline/promises\",\n \"node:repl\",\n \"repl\",\n \"node:sea\",\n \"node:sqlite\",\n \"node:stream\",\n \"stream\",\n \"node:stream/consumers\",\n \"stream/consumers\",\n \"node:stream/promises\",\n \"stream/promises\",\n \"node:stream/web\",\n \"stream/web\",\n \"node:string_decoder\",\n \"string_decoder\",\n \"node:test\",\n \"node:test/reporters\",\n \"node:timers\",\n \"timers\",\n \"node:timers/promises\",\n \"timers/promises\",\n \"node:tls\",\n \"tls\",\n \"node:trace_events\",\n \"trace_events\",\n \"node:tty\",\n \"tty\",\n \"node:url\",\n \"url\",\n \"node:util\",\n \"util\",\n \"node:util/types\",\n \"util/types\",\n \"node:v8\",\n \"v8\",\n \"node:vm\",\n \"vm\",\n \"node:wasi\",\n \"wasi\",\n \"node:worker_threads\",\n \"worker_threads\",\n \"node:zlib\",\n \"zlib\",\n\n // Bun built-in modules.\n \"bun\",\n \"bun:test\",\n \"bun:sqlite\",\n \"bun:ffi\",\n \"bun:jsc\",\n \"bun:internal\",\n ],\n]);\n\nexport const DEPRECATED_COMPONENTS = [\n {\n name: \"toast\",\n deprecatedBy: \"sonner\",\n message:\n \"The toast component is deprecated. Use the sonner component instead.\",\n },\n {\n name: \"toaster\",\n deprecatedBy: \"sonner\",\n message:\n \"The toaster component is deprecated. Use the sonner component instead.\",\n },\n];\n","import { cyan, green, red, yellow } from \"kleur/colors\";\n\nexport const highlighter = {\n error: red,\n warn: yellow,\n info: cyan,\n success: green,\n};\n","import { highlighter } from \"@/src/utils/highlighter\";\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")));\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")));\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")));\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")));\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"));\n },\n break() {\n console.log(\"\");\n },\n};\n","import ora, { type Options } from \"ora\";\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean;\n },\n) {\n return ora({\n text,\n isSilent: options?.silent,\n });\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport { type PackageJson } from \"type-fest\";\n\nexport function getPackageInfo(\n cwd: string = \"\",\n shouldThrow: boolean = true,\n): PackageJson | null {\n const packageJsonPath = path.join(cwd, \"package.json\");\n\n return fs.readJSONSync(packageJsonPath, {\n throws: shouldThrow,\n }) as PackageJson;\n}\n","import path from \"path\";\nimport { rawConfigSchema } from \"shadcn/schema\";\nimport { Config, getConfig, resolveConfigPaths } from \"@/src/utils/get-config\";\nimport { getPackageInfo } from \"@/src/utils/get-package-info\";\nimport fg from \"fast-glob\";\nimport fs from \"fs-extra\";\nimport { loadConfig } from \"tsconfig-paths\";\nimport { z } from \"zod\";\n\nexport type TailwindVersion = \"v3\" | \"v4\" | null;\n\nexport type ProjectInfo = {\n isAstro: boolean;\n tailwindConfigFile: string | null;\n tailwindCssFile: string | null;\n tailwindVersion: TailwindVersion;\n aliasPrefix: string | null;\n};\n\nconst PROJECT_SHARED_IGNORE = [\n \"**/node_modules/**\",\n \".astro\",\n \"public\",\n \"dist\",\n \"build\",\n];\n\nconst TS_CONFIG_SCHEMA = z.object({\n compilerOptions: z.object({\n paths: z.record(z.string().or(z.array(z.string()))),\n }),\n});\n\nexport async function getProjectInfo(cwd: string): Promise<ProjectInfo | null> {\n const [\n configFiles,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n packageJson,\n ] = await Promise.all([\n fg.glob(\n \"**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*\",\n {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n },\n ),\n getTailwindConfigFile(cwd),\n getTailwindCssFile(cwd),\n getTailwindVersion(cwd),\n getTsConfigAliasPrefix(cwd),\n getPackageInfo(cwd, false),\n ]);\n\n const type: ProjectInfo = {\n isAstro: false,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n };\n\n // Astro.\n if (configFiles.find((file) => file.startsWith(\"astro.config.\"))?.length) {\n type.isAstro = true;\n return type;\n }\n\n return type;\n}\n\nexport async function getTailwindVersion(\n cwd: string,\n): Promise<ProjectInfo[\"tailwindVersion\"]> {\n const [packageInfo, config] = await Promise.all([\n getPackageInfo(cwd, false),\n getConfig(cwd),\n ]);\n\n // If the config file is empty, we can assume that it's a v4 project.\n if (config?.tailwind?.config === \"\") {\n return \"v4\";\n }\n\n if (\n !packageInfo?.dependencies?.tailwindcss &&\n !packageInfo?.devDependencies?.tailwindcss\n ) {\n return null;\n }\n\n if (\n /^(?:\\^|~)?3(?:\\.\\d+)*(?:-.*)?$/.test(\n packageInfo?.dependencies?.tailwindcss ||\n packageInfo?.devDependencies?.tailwindcss ||\n \"\",\n )\n ) {\n return \"v3\";\n }\n\n return \"v4\";\n}\n\nexport async function getTailwindCssFile(cwd: string) {\n const [files, tailwindVersion] = await Promise.all([\n fg.glob([\"**/*.css\", \"**/*.scss\"], {\n cwd,\n deep: 5,\n ignore: PROJECT_SHARED_IGNORE,\n }),\n getTailwindVersion(cwd),\n ]);\n\n if (!files.length) {\n return null;\n }\n\n const needle =\n tailwindVersion === \"v4\" ? `@import \"tailwindcss\"` : \"@tailwind base\";\n for (const file of files) {\n const contents = await fs.readFile(path.resolve(cwd, file), \"utf8\");\n if (\n contents.includes(`@import \"tailwindcss\"`) ||\n contents.includes(`@import 'tailwindcss'`) ||\n contents.includes(`@tailwind base`)\n ) {\n return file;\n }\n }\n\n return null;\n}\n\nexport async function getTailwindConfigFile(cwd: string) {\n const files = await fg.glob(\"tailwind.config.*\", {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n });\n\n if (!files.length) {\n return null;\n }\n\n return files[0];\n}\n\nexport async function getTsConfigAliasPrefix(cwd: string) {\n const tsConfig = await loadConfig(cwd);\n\n if (\n tsConfig?.resultType === \"failed\" ||\n !Object.entries(tsConfig?.paths).length\n ) {\n return null;\n }\n\n // This assume that the first alias is the prefix.\n for (const [alias, paths] of Object.entries(tsConfig.paths)) {\n if (\n paths.includes(\"./*\") ||\n paths.includes(\"./src/*\") ||\n paths.includes(\"./app/*\") ||\n paths.includes(\"./resources/js/*\") // Laravel.\n ) {\n return alias.replace(/\\/\\*$/, \"\") ?? null;\n }\n }\n\n // Use the first alias as the prefix.\n return Object.keys(tsConfig?.paths)?.[0].replace(/\\/\\*$/, \"\") ?? null;\n}\n\nexport async function isTypeScriptProject(cwd: string) {\n const files = await fg.glob(\"tsconfig.*\", {\n cwd,\n deep: 1,\n ignore: PROJECT_SHARED_IGNORE,\n });\n\n return files.length > 0;\n}\n\nexport async function getTsConfig(cwd: string) {\n for (const fallback of [\n \"tsconfig.json\",\n \"tsconfig.web.json\",\n \"tsconfig.app.json\",\n ]) {\n const filePath = path.resolve(cwd, fallback);\n if (!(await fs.pathExists(filePath))) {\n continue;\n }\n\n // We can't use fs.readJSON because it doesn't support comments.\n const contents = await fs.readFile(filePath, \"utf8\");\n const cleanedContents = contents.replace(/\\/\\*\\s*\\*\\//g, \"\");\n const result = TS_CONFIG_SCHEMA.safeParse(JSON.parse(cleanedContents));\n\n if (result.error) {\n continue;\n }\n\n return result.data;\n }\n\n return null;\n}\n\nexport async function getProjectConfig(\n cwd: string,\n defaultProjectInfo: ProjectInfo | null = null,\n): Promise<Config | null> {\n // Check for existing component config.\n const [existingConfig, projectInfo] = await Promise.all([\n getConfig(cwd),\n !defaultProjectInfo\n ? getProjectInfo(cwd)\n : Promise.resolve(defaultProjectInfo),\n ]);\n\n if (existingConfig) {\n return existingConfig;\n }\n\n if (\n !projectInfo ||\n !projectInfo.tailwindCssFile ||\n (projectInfo.tailwindVersion === \"v3\" && !projectInfo.tailwindConfigFile)\n ) {\n return null;\n }\n\n const config: z.infer<typeof rawConfigSchema> = {\n $schema: \"https://ui.shadcn.com/schema.json\",\n style: \"new-york\",\n tailwind: {\n config: projectInfo.tailwindConfigFile ?? \"\",\n baseColor: \"zinc\",\n css: projectInfo.tailwindCssFile,\n cssVariables: true,\n prefix: \"\",\n },\n iconLibrary: \"lucide\",\n aliases: {\n components: `${projectInfo.aliasPrefix}/components`,\n ui: `${projectInfo.aliasPrefix}/components/ui`,\n lib: `${projectInfo.aliasPrefix}/lib`,\n utils: `${projectInfo.aliasPrefix}/lib/utils`,\n },\n };\n\n return await resolveConfigPaths(cwd, config);\n}\n\nexport async function getProjectTailwindVersionFromConfig(config: {\n resolvedPaths: Pick<Config[\"resolvedPaths\"], \"cwd\">;\n}): Promise<TailwindVersion> {\n if (!config.resolvedPaths?.cwd) {\n return \"v3\";\n }\n\n const projectInfo = await getProjectInfo(config.resolvedPaths.cwd);\n\n if (!projectInfo?.tailwindVersion) {\n return null;\n }\n\n return projectInfo.tailwindVersion;\n}\n","import {\n createMatchPath,\n type ConfigLoaderSuccessResult,\n} from \"tsconfig-paths\";\n\nexport async function resolveImport(\n importPath: string,\n config: Pick<ConfigLoaderSuccessResult, \"absoluteBaseUrl\" | \"paths\">,\n) {\n return createMatchPath(config.absoluteBaseUrl, config.paths)(\n importPath,\n undefined,\n () => true,\n [\".ts\", \".tsx\", \".jsx\", \".js\", \".css\"],\n );\n}\n","import path from \"path\";\nimport { BUILTIN_REGISTRIES } from \"@/src/registry/constants\";\nimport {\n configSchema,\n rawConfigSchema,\n workspaceConfigSchema,\n} from \"shadcn/schema\";\nimport { getProjectInfo } from \"@/src/utils/get-project-info\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { resolveImport } from \"@/src/utils/resolve-import\";\nimport { cosmiconfig } from \"cosmiconfig\";\nimport fg from \"fast-glob\";\nimport { loadConfig } from \"tsconfig-paths\";\nimport { z } from \"zod\";\n\nexport const DEFAULT_STYLE = \"default\";\nexport const DEFAULT_COMPONENTS = \"@/components\";\nexport const DEFAULT_UTILS = \"@/lib/utils\";\nexport const DEFAULT_TAILWIND_CSS = \"app/globals.css\";\nexport const DEFAULT_TAILWIND_CONFIG = \"tailwind.config.js\";\nexport const DEFAULT_TAILWIND_BASE_COLOR = \"slate\";\n\n// TODO: Figure out if we want to support all cosmiconfig formats.\n// A simple components.json file would be nice.\nexport const explorer = cosmiconfig(\"components\", {\n searchPlaces: [\"components.json\"],\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\nexport async function getConfig(cwd: string) {\n const config = await getRawConfig(cwd);\n\n if (!config) {\n return null;\n }\n\n // Set default icon library if not provided.\n if (!config.iconLibrary) {\n config.iconLibrary = config.style === \"new-york\" ? \"radix\" : \"lucide\";\n }\n\n return await resolveConfigPaths(cwd, config);\n}\n\nexport async function resolveConfigPaths(\n cwd: string,\n config: z.infer<typeof rawConfigSchema>,\n) {\n // Merge built-in registries with user registries\n config.registries = {\n ...BUILTIN_REGISTRIES,\n ...(config.registries || {}),\n };\n\n // Read tsconfig.json.\n const tsConfig = await loadConfig(cwd);\n\n if (tsConfig.resultType === \"failed\") {\n throw new Error(\n `Failed to load ${config.tsx ? \"tsconfig\" : \"jsconfig\"}.json. ${\n tsConfig.message ?? \"\"\n }`.trim(),\n );\n }\n\n return configSchema.parse({\n ...config,\n resolvedPaths: {\n cwd,\n tailwindConfig: config.tailwind.config\n ? path.resolve(cwd, config.tailwind.config)\n : \"\",\n tailwindCss: path.resolve(cwd, config.tailwind.css),\n utils: await resolveImport(config.aliases[\"utils\"], tsConfig),\n components: await resolveImport(config.aliases[\"components\"], tsConfig),\n ui: config.aliases[\"ui\"]\n ? await resolveImport(config.aliases[\"ui\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"ui\",\n ),\n // TODO: Make this configurable.\n // For now, we assume the lib and hooks directories are one level up from the components directory.\n lib: config.aliases[\"lib\"]\n ? await resolveImport(config.aliases[\"lib\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"utils\"], tsConfig)) ?? cwd,\n \"..\",\n ),\n hooks: config.aliases[\"hooks\"]\n ? await resolveImport(config.aliases[\"hooks\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"..\",\n \"hooks\",\n ),\n },\n });\n}\n\nexport async function getRawConfig(\n cwd: string,\n): Promise<z.infer<typeof rawConfigSchema> | null> {\n try {\n const configResult = await explorer.search(cwd);\n\n if (!configResult) {\n return null;\n }\n\n const config = rawConfigSchema.parse(configResult.config);\n\n // Check if user is trying to override built-in registries\n if (config.registries) {\n for (const registryName of Object.keys(config.registries)) {\n if (registryName in BUILTIN_REGISTRIES) {\n throw new Error(\n `\"${registryName}\" is a built-in registry and cannot be overridden.`,\n );\n }\n }\n }\n\n return config;\n } catch (error) {\n const componentPath = `${cwd}/components.json`;\n if (error instanceof Error && error.message.includes(\"reserved registry\")) {\n throw error;\n }\n throw new Error(\n `Invalid configuration found in ${highlighter.info(componentPath)}.`,\n );\n }\n}\n\n// Note: we can check for -workspace.yaml or \"workspace\" in package.json.\n// Since cwd is not necessarily the root of the project.\n// We'll instead check if ui aliases resolve to a different root.\nexport async function getWorkspaceConfig(config: Config) {\n let resolvedAliases: any = {};\n\n for (const key of Object.keys(config.aliases)) {\n if (!isAliasKey(key, config)) {\n continue;\n }\n\n const resolvedPath = config.resolvedPaths[key];\n const packageRoot = await findPackageRoot(\n config.resolvedPaths.cwd,\n resolvedPath,\n );\n\n if (!packageRoot) {\n resolvedAliases[key] = config;\n continue;\n }\n\n resolvedAliases[key] = await getConfig(packageRoot);\n }\n\n const result = workspaceConfigSchema.safeParse(resolvedAliases);\n if (!result.success) {\n return null;\n }\n\n return result.data;\n}\n\nexport async function findPackageRoot(cwd: string, resolvedPath: string) {\n const commonRoot = findCommonRoot(cwd, resolvedPath);\n const relativePath = path.relative(commonRoot, resolvedPath);\n\n const packageRoots = await fg.glob(\"**/package.json\", {\n cwd: commonRoot,\n deep: 3,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/public/**\"],\n });\n\n const matchingPackageRoot = packageRoots\n .map((pkgPath) => path.dirname(pkgPath))\n .find((pkgDir) => relativePath.startsWith(pkgDir));\n\n return matchingPackageRoot\n ? path.join(commonRoot, matchingPackageRoot)\n : null;\n}\n\nfunction isAliasKey(\n key: string,\n config: Config,\n): key is keyof Config[\"aliases\"] {\n return Object.keys(config.resolvedPaths)\n .filter((key) => key !== \"utils\")\n .includes(key);\n}\n\nexport function findCommonRoot(cwd: string, resolvedPath: string) {\n const parts1 = cwd.split(path.sep);\n const parts2 = resolvedPath.split(path.sep);\n const commonParts = [];\n\n for (let i = 0; i < Math.min(parts1.length, parts2.length); i++) {\n if (parts1[i] !== parts2[i]) {\n break;\n }\n commonParts.push(parts1[i]);\n }\n\n return commonParts.join(path.sep);\n}\n\n// TODO: Cache this call.\nexport async function getTargetStyleFromConfig(cwd: string, fallback: string) {\n const projectInfo = await getProjectInfo(cwd);\n return projectInfo?.tailwindVersion === \"v4\" ? \"new-york-v4\" : fallback;\n}\n\ntype DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * Creates a config object with sensible defaults.\n * Useful for universal registry items that bypass framework detection.\n *\n * @param partial - Partial config values to override defaults\n * @returns A complete Config object\n */\nexport function createConfig(partial?: DeepPartial<Config>): Config {\n const defaultConfig: Config = {\n resolvedPaths: {\n cwd: process.cwd(),\n tailwindConfig: \"\",\n tailwindCss: \"\",\n utils: \"\",\n components: \"\",\n ui: \"\",\n lib: \"\",\n hooks: \"\",\n },\n style: \"\",\n tailwind: {\n config: \"\",\n css: \"\",\n baseColor: \"\",\n cssVariables: false,\n },\n rsc: false,\n tsx: true,\n aliases: {\n components: \"\",\n utils: \"\",\n },\n registries: {\n ...BUILTIN_REGISTRIES,\n },\n };\n\n // Deep merge the partial config with defaults\n if (partial) {\n return {\n ...defaultConfig,\n ...partial,\n resolvedPaths: {\n ...defaultConfig.resolvedPaths,\n ...(partial.resolvedPaths || {}),\n },\n tailwind: {\n ...defaultConfig.tailwind,\n ...(partial.tailwind || {}),\n },\n aliases: {\n ...defaultConfig.aliases,\n ...(partial.aliases || {}),\n },\n registries: {\n ...defaultConfig.registries,\n ...(partial.registries || {}),\n },\n };\n }\n\n return defaultConfig;\n}\n","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 let captureDescriptionBody = false;\n const usageLines: string[] = [];\n const examplesLines: string[] = [];\n const primaryExampleLines: string[] = [];\n const descriptionBodyLines: 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 (captureDescriptionBody) {\n if (line.trim().startsWith(\"@\")) {\n captureDescriptionBody = false;\n } else {\n descriptionBodyLines.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 captureDescriptionBody = true;\n continue;\n } else if (line.trim().startsWith(\"@figmaUrl\"))\n meta.figmaUrl = line.replace(\"@figmaUrl\", \"\").trim();\n // Backward compatibility: support @figma but map to figmaUrl\n else if (line.trim().startsWith(\"@figma\"))\n meta.figmaUrl = line.replace(\"@figma\", \"\").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(\"@preview\")) {\n inPrimaryExample = true;\n continue;\n } else if (line.trim().startsWith(\"@example\")) {\n // backward compatibility with older docs\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 if (descriptionBodyLines.length)\n meta.descriptionBodyMDX = descriptionBodyLines.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"],"mappings":";;;;;;;;;;;;;;;AAGA,MAAa,eACX,QAAQ,IAAI,gBAAgB;AAI9B,MAAa,cAAc;CACzB;EACE,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACR;CACD;EACE,MAAM;EACN,OAAO;EACR;CACF;AAGD,MAAaA,qBAA2D,EACtE,YAAY,GAAG,aAAa,eAC7B;;;;AChCD,MAAa,cAAc;CACzB,OAAO;CACP,MAAM;CACN,MAAM;CACN,SAAS;CACV;;;;ACLD,MAAa,SAAS;CACpB,MAAM,GAAG,MAAiB;AACxB,UAAQ,IAAI,YAAY,MAAM,KAAK,KAAK,IAAI,CAAC,CAAC;;CAEhD,KAAK,GAAG,MAAiB;AACvB,UAAQ,IAAI,YAAY,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;;CAE/C,KAAK,GAAG,MAAiB;AACvB,UAAQ,IAAI,YAAY,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC;;CAE/C,QAAQ,GAAG,MAAiB;AAC1B,UAAQ,IAAI,YAAY,QAAQ,KAAK,KAAK,IAAI,CAAC,CAAC;;CAElD,IAAI,GAAG,MAAiB;AACtB,UAAQ,IAAI,KAAK,KAAK,IAAI,CAAC;;CAE7B,QAAQ;AACN,UAAQ,IAAI,GAAG;;CAElB;;;;ACnBD,SAAgB,QACd,MACA,SAGA;AACA,QAAO,IAAI;EACT;EACA,UAAU,SAAS;EACpB,CAAC;;;;;ACPJ,SAAgB,eACd,MAAc,IACd,cAAuB,MACH;CACpB,MAAM,kBAAkB,KAAK,KAAK,KAAK,eAAe;AAEtD,QAAOC,QAAG,aAAa,iBAAiB,EACtC,QAAQ,aACT,CAAC;;;;;ACOJ,MAAM,wBAAwB;CAC5B;CACA;CACA;CACA;CACA;CACD;AAED,MAAM,mBAAmB,EAAE,OAAO,EAChC,iBAAiB,EAAE,OAAO,EACxB,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EACpD,CAAC,EACH,CAAC;AAEF,eAAsB,eAAe,KAA0C;CAC7E,MAAM,CACJ,aACA,oBACA,iBACA,iBACA,aACA,eACE,MAAM,QAAQ,IAAI;EACpB,GAAG,KACD,yFACA;GACE;GACA,MAAM;GACN,QAAQ;GACT,CACF;EACD,sBAAsB,IAAI;EAC1B,mBAAmB,IAAI;EACvB,mBAAmB,IAAI;EACvB,uBAAuB,IAAI;EAC3B,eAAe,KAAK,MAAM;EAC3B,CAAC;CAEF,MAAMC,OAAoB;EACxB,SAAS;EACT;EACA;EACA;EACA;EACD;AAGD,KAAI,YAAY,MAAM,SAAS,KAAK,WAAW,gBAAgB,CAAC,EAAE,QAAQ;AACxE,OAAK,UAAU;AACf,SAAO;;AAGT,QAAO;;AAGT,eAAsB,mBACpB,KACyC;CACzC,MAAM,CAAC,aAAa,UAAU,MAAM,QAAQ,IAAI,CAC9C,eAAe,KAAK,MAAM,EAC1B,UAAU,IAAI,CACf,CAAC;AAGF,KAAI,QAAQ,UAAU,WAAW,GAC/B,QAAO;AAGT,KACE,CAAC,aAAa,cAAc,eAC5B,CAAC,aAAa,iBAAiB,YAE/B,QAAO;AAGT,KACE,iCAAiC,KAC/B,aAAa,cAAc,eACzB,aAAa,iBAAiB,eAC9B,GACH,CAED,QAAO;AAGT,QAAO;;AAGT,eAAsB,mBAAmB,KAAa;CACpD,MAAM,CAAC,OAAO,mBAAmB,MAAM,QAAQ,IAAI,CACjD,GAAG,KAAK,CAAC,YAAY,YAAY,EAAE;EACjC;EACA,MAAM;EACN,QAAQ;EACT,CAAC,EACF,mBAAmB,IAAI,CACxB,CAAC;AAEF,KAAI,CAAC,MAAM,OACT,QAAO;AAKT,MAAK,MAAM,QAAQ,OAAO;EACxB,MAAM,WAAW,MAAMC,QAAG,SAAS,KAAK,QAAQ,KAAK,KAAK,EAAE,OAAO;AACnE,MACE,SAAS,SAAS,wBAAwB,IAC1C,SAAS,SAAS,wBAAwB,IAC1C,SAAS,SAAS,iBAAiB,CAEnC,QAAO;;AAIX,QAAO;;AAGT,eAAsB,sBAAsB,KAAa;CACvD,MAAM,QAAQ,MAAM,GAAG,KAAK,qBAAqB;EAC/C;EACA,MAAM;EACN,QAAQ;EACT,CAAC;AAEF,KAAI,CAAC,MAAM,OACT,QAAO;AAGT,QAAO,MAAM;;AAGf,eAAsB,uBAAuB,KAAa;CACxD,MAAM,WAAW,MAAM,WAAW,IAAI;AAEtC,KACE,UAAU,eAAe,YACzB,CAAC,OAAO,QAAQ,UAAU,MAAM,CAAC,OAEjC,QAAO;AAIT,MAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,SAAS,MAAM,CACzD,KACE,MAAM,SAAS,MAAM,IACrB,MAAM,SAAS,UAAU,IACzB,MAAM,SAAS,UAAU,IACzB,MAAM,SAAS,mBAAmB,CAElC,QAAO,MAAM,QAAQ,SAAS,GAAG,IAAI;AAKzC,QAAO,OAAO,KAAK,UAAU,MAAM,GAAG,GAAG,QAAQ,SAAS,GAAG,IAAI;;;;;ACzKnE,eAAsB,cACpB,YACA,QACA;AACA,QAAO,gBAAgB,OAAO,iBAAiB,OAAO,MAAM,CAC1D,YACA,cACM,MACN;EAAC;EAAO;EAAQ;EAAQ;EAAO;EAAO,CACvC;;;;;ACUH,MAAa,WAAW,YAAY,cAAc,EAChD,cAAc,CAAC,kBAAkB,EAClC,CAAC;AAIF,eAAsB,UAAU,KAAa;CAC3C,MAAM,SAAS,MAAM,aAAa,IAAI;AAEtC,KAAI,CAAC,OACH,QAAO;AAIT,KAAI,CAAC,OAAO,YACV,QAAO,cAAc,OAAO,UAAU,aAAa,UAAU;AAG/D,QAAO,MAAM,mBAAmB,KAAK,OAAO;;AAG9C,eAAsB,mBACpB,KACA,QACA;AAEA,QAAO,aAAa;EAClB,GAAG;EACH,GAAI,OAAO,cAAc,EAAE;EAC5B;CAGD,MAAM,WAAW,MAAM,WAAW,IAAI;AAEtC,KAAI,SAAS,eAAe,SAC1B,OAAM,IAAI,MACR,kBAAkB,OAAO,MAAM,aAAa,WAAW,SACrD,SAAS,WAAW,KACnB,MAAM,CACV;AAGH,QAAO,aAAa,MAAM;EACxB,GAAG;EACH,eAAe;GACb;GACA,gBAAgB,OAAO,SAAS,SAC5B,KAAK,QAAQ,KAAK,OAAO,SAAS,OAAO,GACzC;GACJ,aAAa,KAAK,QAAQ,KAAK,OAAO,SAAS,IAAI;GACnD,OAAO,MAAM,cAAc,OAAO,QAAQ,UAAU,SAAS;GAC7D,YAAY,MAAM,cAAc,OAAO,QAAQ,eAAe,SAAS;GACvE,IAAI,OAAO,QAAQ,QACf,MAAM,cAAc,OAAO,QAAQ,OAAO,SAAS,GACnD,KAAK,QACF,MAAM,cAAc,OAAO,QAAQ,eAAe,SAAS,IAC1D,KACF,KACD;GAGL,KAAK,OAAO,QAAQ,SAChB,MAAM,cAAc,OAAO,QAAQ,QAAQ,SAAS,GACpD,KAAK,QACF,MAAM,cAAc,OAAO,QAAQ,UAAU,SAAS,IAAK,KAC5D,KACD;GACL,OAAO,OAAO,QAAQ,WAClB,MAAM,cAAc,OAAO,QAAQ,UAAU,SAAS,GACtD,KAAK,QACF,MAAM,cAAc,OAAO,QAAQ,eAAe,SAAS,IAC1D,KACF,MACA,QACD;GACN;EACF,CAAC;;AAGJ,eAAsB,aACpB,KACiD;AACjD,KAAI;EACF,MAAM,eAAe,MAAM,SAAS,OAAO,IAAI;AAE/C,MAAI,CAAC,aACH,QAAO;EAGT,MAAM,SAAS,gBAAgB,MAAM,aAAa,OAAO;AAGzD,MAAI,OAAO,YACT;QAAK,MAAM,gBAAgB,OAAO,KAAK,OAAO,WAAW,CACvD,KAAI,gBAAgB,mBAClB,OAAM,IAAI,MACR,IAAI,aAAa,oDAClB;;AAKP,SAAO;UACA,OAAO;EACd,MAAM,gBAAgB,GAAG,IAAI;AAC7B,MAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,oBAAoB,CACvE,OAAM;AAER,QAAM,IAAI,MACR,kCAAkC,YAAY,KAAK,cAAc,CAAC,GACnE;;;AAOL,eAAsB,mBAAmB,QAAgB;CACvD,IAAIC,kBAAuB,EAAE;AAE7B,MAAK,MAAM,OAAO,OAAO,KAAK,OAAO,QAAQ,EAAE;AAC7C,MAAI,CAAC,WAAW,KAAK,OAAO,CAC1B;EAGF,MAAM,eAAe,OAAO,cAAc;EAC1C,MAAM,cAAc,MAAM,gBACxB,OAAO,cAAc,KACrB,aACD;AAED,MAAI,CAAC,aAAa;AAChB,mBAAgB,OAAO;AACvB;;AAGF,kBAAgB,OAAO,MAAM,UAAU,YAAY;;CAGrD,MAAM,SAAS,sBAAsB,UAAU,gBAAgB;AAC/D,KAAI,CAAC,OAAO,QACV,QAAO;AAGT,QAAO,OAAO;;AAGhB,eAAsB,gBAAgB,KAAa,cAAsB;CACvE,MAAM,aAAa,eAAe,KAAK,aAAa;CACpD,MAAM,eAAe,KAAK,SAAS,YAAY,aAAa;CAQ5D,MAAM,uBANe,MAAM,GAAG,KAAK,mBAAmB;EACpD,KAAK;EACL,MAAM;EACN,QAAQ;GAAC;GAAsB;GAAc;GAAe;GAAe;EAC5E,CAAC,EAGC,KAAK,YAAY,KAAK,QAAQ,QAAQ,CAAC,CACvC,MAAM,WAAW,aAAa,WAAW,OAAO,CAAC;AAEpD,QAAO,sBACH,KAAK,KAAK,YAAY,oBAAoB,GAC1C;;AAGN,SAAS,WACP,KACA,QACgC;AAChC,QAAO,OAAO,KAAK,OAAO,cAAc,CACrC,QAAQ,UAAQC,UAAQ,QAAQ,CAChC,SAAS,IAAI;;AAGlB,SAAgB,eAAe,KAAa,cAAsB;CAChE,MAAM,SAAS,IAAI,MAAM,KAAK,IAAI;CAClC,MAAM,SAAS,aAAa,MAAM,KAAK,IAAI;CAC3C,MAAM,cAAc,EAAE;AAEtB,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,QAAQ,OAAO,OAAO,EAAE,KAAK;AAC/D,MAAI,OAAO,OAAO,OAAO,GACvB;AAEF,cAAY,KAAK,OAAO,GAAG;;AAG7B,QAAO,YAAY,KAAK,KAAK,IAAI;;;;;AC7MnC,MAAaC,sBAAmC,IAAI,IAAI;CACtD;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAgB,QAAQ,OAAuB;AAC7C,QAAO,MACJ,QAAQ,oCAAoC,GAAG,CAC/C,QAAQ,sBAAsB,QAAQ,CACtC,QAAQ,QAAQ,IAAI,CACpB,QAAQ,OAAO,IAAI,CACnB,aAAa;;AAGlB,SAAgB,mBAAmB,QAAwB;CACzD,MAAM,QAAQ,OAAO,MAAM,wBAAwB;AACnD,QAAQ,SAAS,MAAM,MAAO;;AAGhC,SAAgB,aAAa,MAAsB;CACjD,MAAM,OAAO,KACV,QAAQ,YAAY,GAAG,CACvB,QAAQ,kBAAkB,IAAI,CAC9B,MAAM,CACN,QAAQ,UAAU,MAAM,EAAE,aAAa,CAAC,CACxC,QAAQ,QAAQ,GAAG;AACtB,QAAO,aAAa,KAAK,KAAK,GAAG,OAAO,KAAK;;AAG/C,SAAgB,mBACd,iBACqB;CACrB,MAAM,aAAa,gBAAgB,MAAM,uBAAuB;AAChE,KAAI,CAAC,WAAY,QAAO,EAAE;CAE1B,MAAM,QADU,WAAW,GACL,MAAM,KAAK,CAAC,KAAK,MAAM,EAAE,QAAQ,aAAa,GAAG,CAAC;CACxE,MAAMC,OAA4B,EAAE;CACpC,IAAI,UAAU;CACd,IAAI,aAAa;CACjB,IAAI,mBAAmB;CACvB,IAAI,yBAAyB;CAC7B,MAAMC,aAAuB,EAAE;CAC/B,MAAMC,gBAA0B,EAAE;CAClC,MAAMC,sBAAgC,EAAE;CACxC,MAAMC,uBAAiC,EAAE;AACzC,MAAK,MAAM,WAAW,OAAO;EAC3B,MAAM,OAAO;AACb,MAAI,QACF,KAAI,KAAK,MAAM,CAAC,WAAW,IAAI,CAC7B,WAAU;OACL;AACL,cAAW,KAAK,KAAK;AACrB;;AAGJ,MAAI,iBACF,KAAI,KAAK,MAAM,CAAC,WAAW,IAAI,CAC7B,oBAAmB;OACd;AACL,uBAAoB,KAAK,KAAK;AAC9B;;AAGJ,MAAI,WACF,KAAI,KAAK,MAAM,CAAC,WAAW,IAAI,CAC7B,cAAa;OACR;AACL,iBAAc,KAAK,KAAK;AACxB;;AAGJ,MAAI,uBACF,KAAI,KAAK,MAAM,CAAC,WAAW,IAAI,CAC7B,0BAAyB;OACpB;AACL,wBAAqB,KAAK,KAAK;AAC/B;;AAGJ,MAAI,KAAK,MAAM,CAAC,WAAW,aAAa,CACtC,MAAK,OAAO,KAAK,QAAQ,cAAc,GAAG,CAAC,MAAM;WAC1C,KAAK,MAAM,CAAC,WAAW,SAAS,CACvC,MAAK,QAAQ,KAAK,QAAQ,UAAU,GAAG,CAAC,MAAM;WACvC,KAAK,MAAM,CAAC,WAAW,eAAe,EAAE;AAC/C,QAAK,cAAc,KAAK,QAAQ,gBAAgB,GAAG,CAAC,MAAM;AAC1D,4BAAyB;AACzB;aACS,KAAK,MAAM,CAAC,WAAW,YAAY,CAC5C,MAAK,WAAW,KAAK,QAAQ,aAAa,GAAG,CAAC,MAAM;WAE7C,KAAK,MAAM,CAAC,WAAW,SAAS,CACvC,MAAK,WAAW,KAAK,QAAQ,UAAU,GAAG,CAAC,MAAM;WAC1C,KAAK,MAAM,CAAC,WAAW,SAAS,EAAE;AACzC,aAAU;AACV;aACS,KAAK,MAAM,CAAC,WAAW,YAAY,EAAE;AAC9C,gBAAa;AACb;aACS,KAAK,MAAM,CAAC,WAAW,WAAW,EAAE;AAC7C,sBAAmB;AACnB;aACS,KAAK,MAAM,CAAC,WAAW,WAAW,EAAE;AAE7C,sBAAmB;AACnB;;;AAGJ,KAAI,WAAW,OAAQ,MAAK,WAAW,WAAW,KAAK,KAAK,CAAC,MAAM;AACnE,KAAI,cAAc,OAAQ,MAAK,cAAc,cAAc,KAAK,KAAK,CAAC,MAAM;AAC5E,KAAI,oBAAoB,OACtB,MAAK,oBAAoB,oBAAoB,KAAK,KAAK,CAAC,MAAM;AAChE,KAAI,qBAAqB,OACvB,MAAK,qBAAqB,qBAAqB,KAAK,KAAK,CAAC,MAAM;AAClE,QAAO;;AAGT,SAAgB,2BAA2B,YAMxC;CAID,SAAS,iBAAiB,MAAuB;EAC/C,IAAIC,UAAe;AAKnB,OAAK,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG;GAC9B,MAAM,OAAO,QAAQ,SAAS;AAC9B,OAAI,SAAS,WAAW,0BAA0B;IAChD,MAAM,OAAO,QAAQ,eAAe;AACpC,QACE,QACA,KAAK,SAAS,KAAK,WACnB,QAAQ,SAAS,KAAK,QAEtB,QAAO;AAET,WAAO;;AAET,OACE,SAAS,WAAW,gBACpB,SAAS,WAAW,iBAEpB,SAAU,WAAmB,uBAC7B,SAAS,WAAW,qBACpB,SAAS,WAAW,yBACpB;IACA,MAAM,OAAO,QAAQ,iBAAiB,QAAQ,eAAe;AAC7D,QAAI,CAAC,KAAM,QAAO;AAClB,cAAU;AACV;;AAEF,UAAO;;AAET,SAAO;;CAMT,MAAM,SAHe,WAAW,qBAC9B,WAAW,oBACZ,CAC2B,MAAM,SAAS;EACzC,MAAM,OAAO,KAAK,gBAAgB;AAClC,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,CAAC,CAAC,iBAAiB,KAAK;GAC/B;AACF,KAAI,CAAC,OAAQ,QAAO,EAAE;CACtB,MAAMC,WAAgB,OAAO,aAAa;AAC1C,KAAI,CAAC,YAAY,SAAS,SAAS,KAAK,WAAW,qBACjD,QAAO,EAAE;AAEX,QADY,SAAS,cAAc,WAAW,qBAAqB,CACxD,aAAa,CAAC,KAAK,OAAY;AAExC,MADe,CAAC,CAAC,GAAG,mBAAmB,CAC3B,QAAO;GAAE,QAAQ;GAAM,YAAY;GAAO,OAAO,GAAG,SAAS;GAAE;EAC3E,MAAM,mBAAmB,GAAG,qBAAqB;EACjD,MAAM,OAAO,GAAG,SAAS;EACzB,MAAM,WAAW,mBAAmB,iBAAiB,SAAS,GAAG;EACjE,MAAM,cAAc,GAAG,gBAAgB;EACvC,IAAIC;AACJ,MAAI,YAAa,gBAAe,YAAY,SAAS;AACrD,SAAO;GAAE,MAAM;GAAU,YAAY,eAAe;GAAM;GAAc;GACxE;;AAGJ,SAAgB,8BAA8B,YAI3C;CACD,SAAS,kBAAkB,MAAkC;AAC3D,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,QAAQ,QAAQ,IAAI,CAAC,QAAQ,SAAS,GAAG,CAAC,MAAM;;CAG9D,MAAM,QAAQ,WAAW,aAAa,QAAQ;AAC9C,KAAI,MAEF,QADmB,MAAM,eAAe,CACtB,KAAK,SAAS;EAC9B,MAAM,OAAO,KAAK,SAAS;EAC3B,MAAM,WAAW,KAAK,aAAa;AAInC,SAAO;GAAE;GAAM,MAFE,kBADD,WAAW,SAAS,SAAS,GAAG,KAAK,SAAS,CAAC,SAAS,CAC7B;GAEZ,UADd,KAAK,kBAAkB;GACC;GACzC;CAIJ,MAAM,YAAY,WAAW,aAAa,QAAQ;AAClD,KAAI,WAAW;EACb,MAAM,WAAW,UAAU,aAAa;AACxC,MAAI,YAAY,SAAS,SAAS,KAAK,WAAW,YAGhD,QAFgB,SAAS,cAAc,WAAW,YAAY,CACnC,eAAe,CACxB,KAAK,SAAS;GAC9B,MAAM,OAAO,KAAK,SAAS;GAC3B,MAAM,KAAK,KAAK,aAAa;AAI7B,UAAO;IAAE;IAAM,MAFE,kBADD,KAAK,GAAG,SAAS,GAAG,KAAK,SAAS,CAAC,SAAS,CACjB;IAEZ,UADd,KAAK,kBAAkB;IACC;IACzC;;AAIN,QAAO,EAAE;;AAGX,SAAgB,cAAc,KAAqB;CACjD,MAAM,UAAU,cAAc,OAAO,KAAK,IAAI;CAE9C,MAAM,UAAU,QAAQ,IAAI;AAC5B,KAAI,WAAW,WAAW,KAAK,KAAK,SAAS,eAAe,CAAC,CAC3D,QAAO;AAGT,KAAI;EACF,MAAM,UAAU,QAAQ,QAAQ,4BAA4B,EAC1D,OAAO,CAAC,IAAI,EACb,CAAC;AACF,SAAO,KAAK,QAAQ,QAAQ;SACtB;CAER,IAAI,UAAU;AACd,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG;EAC7B,MAAM,YAAY,KAAK,KAAK,SAAS,YAAY,MAAM,eAAe;AACtE,MAAI,WAAW,UAAU,CAAE,QAAO,KAAK,QAAQ,UAAU;EACzD,MAAM,SAAS,KAAK,QAAQ,QAAQ;AACpC,MAAI,WAAW,QAAS;AACxB,YAAU;;AAGZ,KAAI;EACF,MAAM,WAAW,QAAQ,QAAQ,iBAAiB,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;AACnE,SAAO,KAAK,QAAQ,UAAU,MAAM,KAAK;SACnC;AAER,OAAM,IAAI,MAAM,gDAAgD;;AAGlE,SAAgB,cAAc,KAAqB;CACjD,MAAM,SAAS,QAAQ,IAAI;AAC3B,KAAI,UAAU,OAAO,OACnB,QAAO,KAAK,WAAW,OAAO,GAAG,SAAS,KAAK,QAAQ,KAAK,OAAO;AAErE,QAAO,KAAK,QAAQ,KAAK,6CAA6C;;AAGxE,SAAgB,wBACd,OACA,YACS;AACT,KAAI,CAAC,MAAO,QAAO;CACnB,IAAI,UAAU;CACd,MAAM,kCAAkB,IAAI,OAC1B,4CAA4C,WAAW,cACxD;AACD,MAAK,MAAM,QAAQ,MAAM,MAAM,KAAK,EAAE;AAEpC,MADgB,KAAK,MAAM,CACf,WAAW,MAAM,EAAE;AAC7B,aAAU,CAAC;AACX;;AAEF,MAAI,CAAC,WAAW,gBAAgB,KAAK,KAAK,CAAE,QAAO;;AAErD,QAAO;;AA6BT,SAAgB,kBAAkB,OAAuB;AACvD,KAAI,CAAC,MAAO,QAAO;AACnB,QAAO,MAAM,QACX,mCACA,gCACD;;AA6BH,SAAgB,kBACd,UACA,YACsC;CACtC,MAAM,aAAa,kBAAkB,SAAS;CAC9C,MAAM,YAAY,wBAAwB,YAAY,WAAW;AACjE,QAAO;EAAE,MAAM,WAAW,MAAM;EAAE;EAAW;;AAG/C,SAAgB,4BAA4B,OAAyB;AACnE,KAAI,CAAC,MAAO,QAAO,EAAE;CACrB,IAAI,UAAU;CACd,MAAM,wBAAQ,IAAI,KAAa;CAC/B,MAAM,WAAW;AACjB,MAAK,MAAM,QAAQ,MAAM,MAAM,KAAK,EAAE;AAEpC,MADgB,KAAK,MAAM,CACf,WAAW,MAAM,EAAE;AAC7B,aAAU,CAAC;AACX;;AAEF,MAAI,QAAS;EACb,IAAIC;AACJ,UAAQ,QAAQ,SAAS,KAAK,KAAK,MAAM,MAAM;GAC7C,MAAM,OAAO,MAAM;AACnB,SAAM,IAAI,KAAK;;;AAGnB,QAAO,MAAM,KAAK,MAAM;;AAG1B,eAAsB,iBACpB,mBACA,eACmB;CACnB,MAAM,WAAW,KAAK,SACpB,mBACA,KAAK,QAAQ,kBAAkB,CAChC;CACD,MAAM,YAAY,QAAQ,SAAS;CACnC,MAAM,aAAa,CACjB,KAAK,QAAQ,kBAAkB,EAAE,GAAG,SAAS,WAAW,EACxD,KAAK,QAAQ,kBAAkB,EAAE,GAAG,UAAU,WAAW,CAC1D;CACD,MAAMC,QAAkB,EAAE;AAC1B,MAAK,MAAM,OAAO,WAChB,KAAI;EACF,MAAM,QAAQ,MAAM,QAAQ,KAAK,EAAE,eAAe,MAAM,CAAC;AACzD,OAAK,MAAM,MAAM,MACf,KAAI,GAAG,QAAQ,IAAI,QAAQ,GAAG,KAAK,CAAC,aAAa,KAAK,UAAU;GAC9D,MAAM,MAAM,KAAK,KAAK,GAAG,KAAK;GAC9B,MAAM,oBAAoB,KACvB,SAAS,eAAe,IAAI,CAC5B,MAAM,KAAK,IAAI,CACf,KAAKC,MAAU,IAAI;AACtB,SAAM,KAAK,kBAAkB;;SAG3B;AAEV,QAAO;;AAGT,SAAgB,gCACd,iBACY;AAEZ,QADgB,IAAI,QAAQ,EAAE,uBAAuB,MAAM,CAAC,CAC7C,iBAAiB,gBAAgB,iBAAiB,EAC/D,WAAW,MACZ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"generate-mdx-CPI1OKtC.js","names":["path","lines: string[]","mainImportLine: string | null","m: RegExpExecArray | null","external: string[]","internal: string[]","exampleSections: string[]","entries: ComponentEntry[]","exports: string[]","match: RegExpExecArray | null","exampleRelPaths: string[]","examples: Array<{\n importName: string;\n importPath: string;\n title: string;\n source: string;\n }>","blocks: Array<{ title: string; body: string[] }>","current: { title: string; body: string[] }"],"sources":["../src/docs/generate-mdx/mdx-builder.ts","../src/docs/generate-mdx/index.ts"],"sourcesContent":["/**\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\n/**\n * Group component names by their folder path\n */\nfunction groupComponentsByFolder(components: string[]): Map<string, string[]> {\n const groups = new Map<string, string[]>();\n for (const comp of components) {\n const folder = componentToFolder(comp);\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): string[] {\n const groups = groupComponentsByFolder(components);\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 examplesBlocks: Array<{ title: string; body: 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}): string {\n const {\n importName,\n importPath,\n title,\n description,\n descriptionBodyMDX,\n usageMDX,\n hasImport,\n propsList,\n propsTable,\n examples,\n examplesBlocks,\n autoImports,\n lucideIcons,\n primaryExampleMDX,\n componentSource,\n commandName,\n figmaUrl,\n componentsAlias,\n namedExports,\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)\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(...generateBarrelImports(usedUi, componentsAlias));\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 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 if (/^\\{[\\s\\S]*\\}$/.test(trimmed)) return match;\n return `>{${JSON.stringify(inner)}}<`;\n });\n };\n\n const toMdxPreview = (snippet: string): string => {\n if (!snippet) return snippet;\n // Convert HTML comments to MDX comment blocks for preview sections\n const withoutComments = snippet.replace(/<!--([\\s\\S]*?)-->/g, \"{/*$1*/}\");\n return wrapTextNodes(withoutComments);\n };\n\n // Split an example body into leading markdown description (paragraphs)\n // and the Astro/HTML snippet that should be rendered in Preview/Source tabs\n const splitDescriptionAndSnippet = (\n body: string,\n ): { descriptionMD: string; snippet: string } => {\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++) {\n const ln = lines[i];\n // Skip empty lines before first meaningful content\n if (!ln.trim().length) continue;\n // Heuristic: consider this line the start of the snippet if it looks like Astro/HTML/JSX\n // e.g. starts with '<' or '{'\n if (/^\\s*[<{]/.test(ln)) {\n snippetStartIdx = i;\n break;\n }\n // Otherwise it's part of markdown description; keep looking until we hit markup\n }\n if (snippetStartIdx <= 0) {\n // No clear description or snippet starts at the very beginning → treat all as snippet\n return { descriptionMD: \"\", snippet: body.trim() };\n }\n const descriptionMD = lines.slice(0, snippetStartIdx).join(\"\\n\").trim();\n const snippet = lines.slice(snippetStartIdx).join(\"\\n\").trim();\n return { descriptionMD, snippet };\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 px-10 py-12 border border-border rounded-md min-h-[450px] items-center [&_input]:max-w-xs\">\n${toMdxPreview(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 const { descriptionMD, snippet } = splitDescriptionAndSnippet(blk.body);\n const previewBody = toMdxPreview(snippet);\n\n // If there's no snippet, render only header + description\n if (!snippet || !snippet.length) {\n exampleSections.push(\n `### ${blk.title}\n\n${descriptionMD}`.trim(),\n );\n continue;\n }\n\n exampleSections.push(\n `### ${blk.title}\n\n${descriptionMD ? `${descriptionMD}\\n\\n` : \"\"}<DocsTabs>\n <DocsTabItem label=\"Preview\">\n <div class=\"not-content sl-bejamas-component-preview flex justify-center px-10 py-12 border border-border rounded-md min-h-[450px] items-center [&_input]:max-w-xs\">\n${previewBody}\n </div>\n </DocsTabItem>\n <DocsTabItem label=\"Source\">\n\n\\`\\`\\`astro\n${(() => {\n const lines = buildSnippetImportLines(snippet);\n return lines.length ? `---\\n${lines.join(\"\\n\")}\\n---\\n\\n` : \"\";\n})()}${snippet}\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 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 descriptionBodyMDX && descriptionBodyMDX.length ? descriptionBodyMDX : null,\n descriptionBodyMDX && descriptionBodyMDX.length ? \"\" : 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, 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 { 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\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\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 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 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 = 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\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 examplesBlocks: parseExamplesBlocks(examplesBlocksRaw),\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 });\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 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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"}
|