bejamas 0.2.12 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/{generate-mdx-BejBMCLk.js → generate-mdx-PPNpe9_J.js} +2 -7
- package/dist/{generate-mdx-BejBMCLk.js.map → generate-mdx-PPNpe9_J.js.map} +1 -1
- package/dist/index.js +1603 -320
- package/dist/index.js.map +1 -1
- package/dist/utils-BCEkpKMO.js +9277 -0
- package/dist/utils-BCEkpKMO.js.map +1 -0
- package/package.json +16 -3
- package/src/tailwind.css +104 -0
- package/dist/utils-BfJTJvcy.js +0 -431
- package/dist/utils-BfJTJvcy.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["errors: Record<string, boolean>","ERRORS.MISSING_DIR_OR_EMPTY_PROJECT","context: RegistryContext","template: keyof typeof TEMPLATES","projectName: string","TEMPLATE_TAR_SUBPATH: Record<keyof typeof TEMPLATES, string>","headers: Record<string, string>","DEFAULT_REGISTRY_URL","ERRORS.MISSING_DIR_OR_EMPTY_PROJECT","baseUrl: string","paths: Record<string, string[] | string>","probe: string | null","mapped: string","uiAbs: string | null","cssAbs: string | null","outResolved: string | null","relative","err: any","FIELD_LABELS: Record<string, string>","missingRequired: string[]","missingRecommended: string[]","status: \"complete\" | \"incomplete\" | \"missing\"","probe: string | null","mapped: string","uiAbs: string | null","cssAbs: string | null","uiRoot: string","join","extname","results: ComponentDocStatus[]","checkResult: CheckResult","err: any","fs","path","dirname","path","fs","result: ReorganizeResult","forwarded: string[]","addIndex","rest","forwarded","files: string[]","path","currentSubfolder: string | null","components: { name: string; type?: string }[]","result: ParsedOutput","allPaths: string[]","autoFlags: string[]"],"sources":["../src/utils/errors.ts","../src/preflights/preflight-init.ts","../src/registry/context.ts","../src/utils/get-package-manager.ts","../src/registry/errors.ts","../src/utils/handle-error.ts","../src/utils/create-project.ts","../src/utils/shadcn-cli.ts","../src/commands/init.ts","../src/utils/tsconfig-utils.ts","../src/commands/docs.ts","../src/commands/docs-check.ts","../src/utils/astro-imports.ts","../src/utils/reorganize-components.ts","../src/commands/add.ts","../src/index.ts"],"sourcesContent":["export const MISSING_DIR_OR_EMPTY_PROJECT = \"1\";\nexport const EXISTING_CONFIG = \"2\";\nexport const MISSING_CONFIG = \"3\";\nexport const FAILED_CONFIG_READ = \"4\";\nexport const TAILWIND_NOT_CONFIGURED = \"5\";\nexport const IMPORT_ALIAS_MISSING = \"6\";\nexport const UNSUPPORTED_FRAMEWORK = \"7\";\nexport const COMPONENT_URL_NOT_FOUND = \"8\";\nexport const COMPONENT_URL_UNAUTHORIZED = \"9\";\nexport const COMPONENT_URL_FORBIDDEN = \"10\";\nexport const COMPONENT_URL_BAD_REQUEST = \"11\";\nexport const COMPONENT_URL_INTERNAL_SERVER_ERROR = \"12\";\nexport const BUILD_MISSING_REGISTRY_FILE = \"13\";\n","import path from \"path\";\nimport { initOptionsSchema } from \"@/src/commands/init\";\nimport * as ERRORS from \"@/src/utils/errors\";\nimport fs from \"fs-extra\";\nimport { z } from \"zod\";\n\nexport async function preFlightInit(\n options: z.infer<typeof initOptionsSchema>,\n) {\n const errors: Record<string, boolean> = {};\n\n // Ensure target directory exists.\n // Check for empty project. We assume if no package.json exists, the project is empty.\n if (\n !fs.existsSync(options.cwd) ||\n !fs.existsSync(path.resolve(options.cwd, \"package.json\"))\n ) {\n errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT] = true;\n return {\n errors,\n projectInfo: null,\n };\n }\n\n return {\n errors,\n projectInfo: null,\n };\n}\n","interface RegistryContext {\n headers: Record<string, Record<string, string>>;\n}\n\nlet context: RegistryContext = {\n headers: {},\n};\n\nexport function setRegistryHeaders(\n headers: Record<string, Record<string, string>>,\n) {\n // Merge new headers with existing ones to preserve headers for nested dependencies\n context.headers = { ...context.headers, ...headers };\n}\n\nexport function getRegistryHeadersFromContext(\n url: string,\n): Record<string, string> {\n return context.headers[url] || {};\n}\n\nexport function clearRegistryContext() {\n context.headers = {};\n}\n","import { detect } from \"@antfu/ni\";\n\nexport async function getPackageManager(\n targetDir: string,\n { withFallback }: { withFallback?: boolean } = {\n withFallback: false,\n },\n): Promise<\"yarn\" | \"pnpm\" | \"bun\" | \"npm\" | \"deno\"> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir });\n\n if (packageManager === \"yarn@berry\") return \"yarn\";\n if (packageManager === \"pnpm@6\") return \"pnpm\";\n if (packageManager === \"bun\") return \"bun\";\n if (packageManager === \"deno\") return \"deno\";\n if (!withFallback) {\n return packageManager ?? \"npm\";\n }\n\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || \"\";\n\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\";\n }\n\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\";\n }\n\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\";\n }\n\n return \"npm\";\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd);\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\";\n\n if (packageManager === \"bun\") return \"bunx\";\n\n return \"npx\";\n}\n","import { z } from \"zod\";\n\n// Error codes for programmatic error handling\nexport const RegistryErrorCode = {\n // Network errors\n NETWORK_ERROR: \"NETWORK_ERROR\",\n NOT_FOUND: \"NOT_FOUND\",\n UNAUTHORIZED: \"UNAUTHORIZED\",\n FORBIDDEN: \"FORBIDDEN\",\n FETCH_ERROR: \"FETCH_ERROR\",\n\n // Configuration errors\n NOT_CONFIGURED: \"NOT_CONFIGURED\",\n INVALID_CONFIG: \"INVALID_CONFIG\",\n MISSING_ENV_VARS: \"MISSING_ENV_VARS\",\n\n // File system errors\n LOCAL_FILE_ERROR: \"LOCAL_FILE_ERROR\",\n\n // Parsing errors\n PARSE_ERROR: \"PARSE_ERROR\",\n VALIDATION_ERROR: \"VALIDATION_ERROR\",\n\n // Generic errors\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type RegistryErrorCode =\n (typeof RegistryErrorCode)[keyof typeof RegistryErrorCode];\n\nexport class RegistryError extends Error {\n public readonly code: RegistryErrorCode;\n public readonly statusCode?: number;\n public readonly context?: Record<string, unknown>;\n public readonly suggestion?: string;\n public readonly timestamp: Date;\n public readonly cause?: unknown;\n\n constructor(\n message: string,\n options: {\n code?: RegistryErrorCode;\n statusCode?: number;\n cause?: unknown;\n context?: Record<string, unknown>;\n suggestion?: string;\n } = {},\n ) {\n super(message);\n this.name = \"RegistryError\";\n this.code = options.code || RegistryErrorCode.UNKNOWN_ERROR;\n this.statusCode = options.statusCode;\n this.cause = options.cause;\n this.context = options.context;\n this.suggestion = options.suggestion;\n this.timestamp = new Date();\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n context: this.context,\n suggestion: this.suggestion,\n timestamp: this.timestamp,\n stack: this.stack,\n };\n }\n}\n\nexport class RegistryNotFoundError extends RegistryError {\n constructor(\n public readonly url: string,\n cause?: unknown,\n ) {\n const message = `The item at ${url} was not found. It may not exist at the registry.`;\n\n super(message, {\n code: RegistryErrorCode.NOT_FOUND,\n statusCode: 404,\n cause,\n context: { url },\n suggestion:\n \"Check if the item name is correct and the registry URL is accessible.\",\n });\n this.name = \"RegistryNotFoundError\";\n }\n}\n\nexport class RegistryUnauthorizedError extends RegistryError {\n constructor(\n public readonly url: string,\n cause?: unknown,\n ) {\n const message = `You are not authorized to access the item at ${url}. If this is a remote registry, you may need to authenticate.`;\n\n super(message, {\n code: RegistryErrorCode.UNAUTHORIZED,\n statusCode: 401,\n cause,\n context: { url },\n suggestion:\n \"Check your authentication credentials and environment variables.\",\n });\n this.name = \"RegistryUnauthorizedError\";\n }\n}\n\nexport class RegistryForbiddenError extends RegistryError {\n constructor(\n public readonly url: string,\n cause?: unknown,\n ) {\n const message = `You are not authorized to access the item at ${url}. If this is a remote registry, you may need to authenticate.`;\n\n super(message, {\n code: RegistryErrorCode.FORBIDDEN,\n statusCode: 403,\n cause,\n context: { url },\n suggestion:\n \"Check your authentication credentials and environment variables.\",\n });\n this.name = \"RegistryForbiddenError\";\n }\n}\n\nexport class RegistryFetchError extends RegistryError {\n constructor(\n public readonly url: string,\n statusCode?: number,\n public readonly responseBody?: string,\n cause?: unknown,\n ) {\n // Use the error detail from the server if available\n const baseMessage = statusCode\n ? `Failed to fetch from registry (${statusCode}): ${url}`\n : `Failed to fetch from registry: ${url}`;\n\n const message =\n typeof cause === \"string\" && cause\n ? `${baseMessage} - ${cause}`\n : baseMessage;\n\n let suggestion = \"Check your network connection and try again.\";\n if (statusCode === 404) {\n suggestion =\n \"The requested resource was not found. Check the URL or item name.\";\n } else if (statusCode === 500) {\n suggestion = \"The registry server encountered an error. Try again later.\";\n } else if (statusCode && statusCode >= 400 && statusCode < 500) {\n suggestion = \"There was a client error. Check your request parameters.\";\n }\n\n super(message, {\n code: RegistryErrorCode.FETCH_ERROR,\n statusCode,\n cause,\n context: { url, responseBody },\n suggestion,\n });\n this.name = \"RegistryFetchError\";\n }\n}\n\nexport class RegistryNotConfiguredError extends RegistryError {\n constructor(public readonly registryName: string | null) {\n const message = registryName\n ? `Unknown registry \"${registryName}\". Make sure it is defined in components.json as follows:\n{\n \"registries\": {\n \"${registryName}\": \"[URL_TO_REGISTRY]\"\n }\n}`\n : `Unknown registry. Make sure it is defined in components.json under \"registries\".`;\n\n super(message, {\n code: RegistryErrorCode.NOT_CONFIGURED,\n context: { registryName },\n suggestion:\n \"Add the registry configuration to your components.json file. Consult the registry documentation for the correct format.\",\n });\n this.name = \"RegistryNotConfiguredError\";\n }\n}\n\nexport class RegistryLocalFileError extends RegistryError {\n constructor(\n public readonly filePath: string,\n cause?: unknown,\n ) {\n super(`Failed to read local registry file: ${filePath}`, {\n code: RegistryErrorCode.LOCAL_FILE_ERROR,\n cause,\n context: { filePath },\n suggestion: \"Check if the file exists and you have read permissions.\",\n });\n this.name = \"RegistryLocalFileError\";\n }\n}\n\nexport class RegistryParseError extends RegistryError {\n public readonly parseError: unknown;\n\n constructor(\n public readonly item: string,\n parseError: unknown,\n ) {\n let message = `Failed to parse registry item: ${item}`;\n\n if (parseError instanceof z.ZodError) {\n message = `Failed to parse registry item: ${item}\\n${parseError.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}`;\n }\n\n super(message, {\n code: RegistryErrorCode.PARSE_ERROR,\n cause: parseError,\n context: { item },\n suggestion:\n \"The registry item may be corrupted or have an invalid format. Please make sure it returns a valid JSON object. See https://ui.shadcn.com/schema/registry-item.json.\",\n });\n\n this.parseError = parseError;\n this.name = \"RegistryParseError\";\n }\n}\n\nexport class RegistryMissingEnvironmentVariablesError extends RegistryError {\n constructor(\n public readonly registryName: string,\n public readonly missingVars: string[],\n ) {\n const message =\n `Registry \"${registryName}\" requires the following environment variables:\\n\\n` +\n missingVars.map((v) => ` • ${v}`).join(\"\\n\");\n\n super(message, {\n code: RegistryErrorCode.MISSING_ENV_VARS,\n context: { registryName, missingVars },\n suggestion:\n \"Set the required environment variables to your .env or .env.local file.\",\n });\n this.name = \"RegistryMissingEnvironmentVariablesError\";\n }\n}\n\nexport class RegistryInvalidNamespaceError extends RegistryError {\n constructor(public readonly name: string) {\n const message = `Invalid registry namespace: \"${name}\". Registry names must start with @ (e.g., @shadcn, @v0).`;\n\n super(message, {\n code: RegistryErrorCode.VALIDATION_ERROR,\n context: { name },\n suggestion:\n \"Use a valid registry name starting with @ or provide a direct URL to the registry.\",\n });\n this.name = \"RegistryInvalidNamespaceError\";\n }\n}\n\nexport class ConfigMissingError extends RegistryError {\n constructor(public readonly cwd: string) {\n const message = `No components.json found in ${cwd} or parent directories.`;\n\n super(message, {\n code: RegistryErrorCode.NOT_CONFIGURED,\n context: { cwd },\n suggestion:\n \"Run 'npx bejamas init' to create a components.json file, or check that you're in the correct directory.\",\n });\n this.name = \"ConfigMissingError\";\n }\n}\n\nexport class ConfigParseError extends RegistryError {\n constructor(\n public readonly cwd: string,\n parseError: unknown,\n ) {\n let message = `Invalid components.json configuration in ${cwd}.`;\n\n if (parseError instanceof z.ZodError) {\n message = `Invalid components.json configuration in ${cwd}:\\n${parseError.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}`;\n }\n\n super(message, {\n code: RegistryErrorCode.INVALID_CONFIG,\n cause: parseError,\n context: { cwd },\n suggestion:\n \"Check your components.json file for syntax errors or invalid configuration. Run 'npx bejamas init' to regenerate a valid configuration.\",\n });\n this.name = \"ConfigParseError\";\n }\n}\n","import { RegistryError } from \"@/src/registry/errors\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { logger } from \"@/src/utils/logger\";\nimport { z } from \"zod\";\n\nexport function handleError(error: unknown) {\n logger.break();\n logger.error(\n `Something went wrong. Please check the error below for more details.`,\n );\n logger.error(\n `If the problem persists, please open an issue on GitHub: https://github.com/bejamas/ui/issues`,\n );\n logger.error(\"\");\n if (typeof error === \"string\") {\n logger.error(error);\n logger.break();\n process.exit(1);\n }\n\n if (error instanceof RegistryError) {\n if (error.message) {\n logger.error(error.cause ? \"Error:\" : \"Message:\");\n logger.error(error.message);\n }\n\n if (error.cause) {\n logger.error(\"\\nMessage:\");\n logger.error(error.cause);\n }\n\n if (error.suggestion) {\n logger.error(\"\\nSuggestion:\");\n logger.error(error.suggestion);\n }\n logger.break();\n process.exit(1);\n }\n\n if (error instanceof z.ZodError) {\n logger.error(\"Validation failed:\");\n for (const [key, value] of Object.entries(error.flatten().fieldErrors)) {\n logger.error(`- ${highlighter.info(key)}: ${value}`);\n }\n logger.break();\n process.exit(1);\n }\n\n if (error instanceof Error) {\n logger.error(error.message);\n logger.break();\n process.exit(1);\n }\n\n logger.break();\n process.exit(1);\n}\n","import os from \"os\";\nimport path from \"path\";\nimport dotenv from \"dotenv\";\nimport { initOptionsSchema } from \"@/src/commands/init\";\nimport { getPackageManager } from \"@/src/utils/get-package-manager\";\nimport { handleError } from \"@/src/utils/handle-error\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { logger } from \"@/src/utils/logger\";\nimport { spinner } from \"@/src/utils/spinner\";\nimport { execa } from \"execa\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport { z } from \"zod\";\n\nexport const TEMPLATES = {\n astro: \"astro\",\n \"astro-monorepo\": \"astro-monorepo\",\n \"astro-with-component-docs-monorepo\": \"astro-with-component-docs-monorepo\",\n} as const;\n\nconst MONOREPO_TEMPLATE_URL =\n \"https://codeload.github.com/bejamas/ui/tar.gz/main\";\n\nexport async function createProject(\n options: Pick<\n z.infer<typeof initOptionsSchema>,\n \"cwd\" | \"force\" | \"srcDir\" | \"components\" | \"template\"\n >,\n) {\n options = {\n srcDir: false,\n ...options,\n };\n\n let template: keyof typeof TEMPLATES =\n options.template && TEMPLATES[options.template as keyof typeof TEMPLATES]\n ? (options.template as keyof typeof TEMPLATES)\n : \"astro\";\n\n let projectName: string = \"my-app\";\n\n const isRemoteComponent =\n options.components?.length === 1 &&\n !!options.components[0].match(/\\/chat\\/b\\//);\n\n if (!options.force) {\n const { type, name } = await prompts([\n {\n type: options.template || isRemoteComponent ? null : \"select\",\n name: \"type\",\n message: `The path ${highlighter.info(\n options.cwd,\n )} does not contain a package.json file.\\n Would you like to start a new project?`,\n choices: [\n { title: \"Astro\", value: \"astro\" },\n { title: \"Astro (Monorepo)\", value: \"astro-monorepo\" },\n {\n title: \"Astro with Component Docs (Monorepo)\",\n value: \"astro-with-component-docs-monorepo\",\n },\n ],\n initial: 0,\n },\n {\n type: \"text\",\n name: \"name\",\n message: \"What is your project named?\",\n initial: (_prev: any, values: any) => {\n const selectedTemplate: string =\n (options.template &&\n TEMPLATES[options.template as keyof typeof TEMPLATES] &&\n options.template) ||\n values.type ||\n template;\n return selectedTemplate?.endsWith(\"monorepo\")\n ? \"my-monorepo\"\n : \"my-app\";\n },\n format: (value: string) => value.trim(),\n validate: (value: string) =>\n value.length > 128\n ? `Name should be less than 128 characters.`\n : true,\n },\n ]);\n\n template = type ?? template;\n projectName = name;\n }\n\n const packageManager = await getPackageManager(options.cwd, {\n withFallback: true,\n });\n\n const projectPath = `${options.cwd}/${projectName}`;\n\n // Check if path is writable.\n try {\n await fs.access(options.cwd, fs.constants.W_OK);\n } catch (error) {\n logger.break();\n logger.error(`The path ${highlighter.info(options.cwd)} is not writable.`);\n logger.error(\n `It is likely you do not have write permissions for this folder or the path ${highlighter.info(\n options.cwd,\n )} does not exist.`,\n );\n logger.break();\n process.exit(1);\n }\n\n if (fs.existsSync(path.resolve(options.cwd, projectName, \"package.json\"))) {\n logger.break();\n logger.error(\n `A project with the name ${highlighter.info(projectName)} already exists.`,\n );\n logger.error(`Please choose a different name and try again.`);\n logger.break();\n process.exit(1);\n }\n\n await createProjectFromTemplate(projectPath, {\n templateKey: template,\n packageManager,\n cwd: options.cwd,\n });\n\n return {\n projectPath,\n projectName,\n template,\n };\n}\n\nasync function createProjectFromTemplate(\n projectPath: string,\n options: {\n templateKey: keyof typeof TEMPLATES;\n packageManager: string;\n cwd: string;\n },\n) {\n const createSpinner = spinner(\n `Creating a new project from template. This may take a few minutes.`,\n ).start();\n\n const TEMPLATE_TAR_SUBPATH: Record<keyof typeof TEMPLATES, string> = {\n astro: \"ui-main/templates/astro\",\n \"astro-monorepo\": \"ui-main/templates/monorepo-astro\",\n \"astro-with-component-docs-monorepo\":\n \"ui-main/templates/monorepo-astro-with-docs\",\n };\n\n try {\n // Load local .env if present to allow GITHUB_TOKEN/GH_TOKEN\n dotenv.config({ quiet: true });\n const templatePath = path.join(\n os.tmpdir(),\n `bejamas-template-${Date.now()}`,\n );\n await fs.ensureDir(templatePath);\n\n // Auth via environment variables (.env supported)\n const authToken = process.env.GITHUB_TOKEN || process.env.GH_TOKEN;\n const usedAuth = Boolean(authToken);\n const headers: Record<string, string> = {\n \"User-Agent\": \"bejamas-cli\",\n };\n if (authToken) {\n headers[\"Authorization\"] = `Bearer ${authToken}`;\n }\n\n const response = await fetch(MONOREPO_TEMPLATE_URL, { headers });\n if (!response.ok) {\n if (\n response.status === 401 ||\n response.status === 403 ||\n (!usedAuth && response.status === 404)\n ) {\n throw new Error(\n \"Unauthorized to access private template. Set GITHUB_TOKEN or GH_TOKEN (in .env or env) with repo access and try again.\",\n );\n }\n if (response.status === 404) {\n throw new Error(\"Failed to download template: not found.\");\n }\n throw new Error(\n `Failed to download template: ${response.status} ${response.statusText}`,\n );\n }\n\n const tarPath = path.resolve(templatePath, \"template.tar.gz\");\n await fs.writeFile(tarPath, Buffer.from(await response.arrayBuffer()));\n\n const tarSubpath = TEMPLATE_TAR_SUBPATH[options.templateKey];\n const leafName = tarSubpath.split(\"/\").pop() as string;\n\n await execa(\"tar\", [\n \"-xzf\",\n tarPath,\n \"-C\",\n templatePath,\n \"--strip-components=2\",\n tarSubpath,\n ]);\n\n const extractedPath = path.resolve(templatePath, leafName);\n await fs.move(extractedPath, projectPath);\n await fs.remove(templatePath);\n\n await execa(options.packageManager, [\"install\"], {\n cwd: projectPath,\n });\n\n try {\n // Detect if we're inside an existing git repo; if yes, skip initializing a nested repo\n const { stdout } = await execa(\n \"git\",\n [\"rev-parse\", \"--is-inside-work-tree\"],\n { cwd: projectPath },\n );\n const insideExistingRepo = stdout.trim() === \"true\";\n\n if (!insideExistingRepo) {\n await execa(\"git\", [\"init\"], { cwd: projectPath });\n await execa(\"git\", [\"add\", \"-A\"], { cwd: projectPath });\n await execa(\"git\", [\"commit\", \"-m\", \"Initial commit\"], {\n cwd: projectPath,\n });\n }\n } catch (_) {\n // ignore git detection/initialization failures\n }\n\n createSpinner?.succeed(\"Creating a new project from template.\");\n } catch (error) {\n createSpinner?.fail(\n \"Something went wrong creating a new project from template.\",\n );\n handleError(error);\n }\n}\n","import { createRequire } from \"module\";\n\nconst require = createRequire(import.meta.url);\n\nexport const PINNED_SHADCN_VERSION = \"3.8.5\";\nexport const PINNED_SHADCN_PACKAGE = `shadcn@${PINNED_SHADCN_VERSION}`;\n\nexport interface ShadcnInvocation {\n cmd: string;\n args: string[];\n source: \"bundled\" | \"fallback\";\n}\n\nexport function resolveBundledShadcnEntrypoint() {\n try {\n return require.resolve(\"shadcn\");\n } catch {\n return null;\n }\n}\n\nexport function buildPinnedShadcnInvocation(\n shadcnArgs: string[],\n bundledEntrypoint = resolveBundledShadcnEntrypoint(),\n): ShadcnInvocation {\n if (bundledEntrypoint) {\n return {\n cmd: process.execPath,\n args: [bundledEntrypoint, ...shadcnArgs],\n source: \"bundled\",\n };\n }\n\n return {\n cmd: \"npx\",\n args: [\"-y\", PINNED_SHADCN_PACKAGE, ...shadcnArgs],\n source: \"fallback\",\n };\n}\n","import path from \"path\";\nimport { preFlightInit } from \"@/src/preflights/preflight-init\";\n\nimport { clearRegistryContext } from \"@/src/registry/context\";\n\nimport { TEMPLATES, createProject } from \"@/src/utils/create-project\";\nimport * as ERRORS from \"@/src/utils/errors\";\nimport { getConfig } from \"@/src/utils/get-config\";\nimport { handleError } from \"@/src/utils/handle-error\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { logger } from \"@/src/utils/logger\";\nimport { buildPinnedShadcnInvocation } from \"@/src/utils/shadcn-cli\";\nimport { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport { z } from \"zod\";\n\n// process.on(\"exit\", (code) => {\n// const filePath = path.resolve(process.cwd(), \"components.json\")\n\n// // Delete backup if successful.\n// if (code === 0) {\n// return deleteFileBackup(filePath)\n// }\n\n// // Restore backup if error.\n// return restoreFileBackup(filePath)\n// })\n\n// Default fallback registry endpoint for shadcn (expects /r)\nconst DEFAULT_REGISTRY_URL = \"https://ui.bejamas.com/r\";\nexport const DEFAULT_COMPONENTS_BASE_COLOR = \"neutral\";\n\nexport const initOptionsSchema = z.object({\n cwd: z.string(),\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n defaults: z.boolean(),\n force: z.boolean(),\n silent: z.boolean(),\n isNewProject: z.boolean(),\n srcDir: z.boolean().optional(),\n cssVariables: z.boolean(),\n template: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (val) {\n return TEMPLATES[val as keyof typeof TEMPLATES];\n }\n return true;\n },\n {\n message: \"Invalid template. Please use 'next' or 'next-monorepo'.\",\n },\n ),\n baseColor: z.string().optional(),\n baseStyle: z.boolean(),\n});\n\nexport function buildShadcnInitArgs(\n baseColor = DEFAULT_COMPONENTS_BASE_COLOR,\n) {\n return [\"init\", \"--base-color\", baseColor];\n}\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project and install dependencies\")\n .argument(\"[components...]\", \"names, url or local path to component\")\n .option(\n \"-t, --template <template>\",\n \"the template to use. (next, next-monorepo)\",\n )\n .option(\n \"-b, --base-color <base-color>\",\n \"the base color to use. (neutral, gray, zinc, stone, slate)\",\n undefined,\n )\n .option(\"-y, --yes\", \"skip confirmation prompt.\", true)\n .option(\"-d, --defaults,\", \"use default configuration.\", false)\n .option(\"-f, --force\", \"force overwrite of existing configuration.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .option(\"-s, --silent\", \"mute output.\", false)\n .option(\n \"--src-dir\",\n \"use the src directory when creating a new project.\",\n false,\n )\n .option(\n \"--no-src-dir\",\n \"do not use the src directory when creating a new project.\",\n )\n .option(\"--css-variables\", \"use css variables for theming.\", true)\n .option(\"--no-css-variables\", \"do not use css variables for theming.\")\n .option(\"--no-base-style\", \"do not install the base shadcn style.\")\n .action(async (_components, opts) => {\n try {\n await runInit(opts);\n } catch (error) {\n logger.break();\n handleError(error);\n } finally {\n clearRegistryContext();\n }\n });\n\nexport async function runInit(\n options: z.infer<typeof initOptionsSchema> & {\n skipPreflight?: boolean;\n },\n) {\n let newProjectTemplate;\n if (!options.skipPreflight) {\n const preflight = await preFlightInit(options);\n\n if (preflight.errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT]) {\n const { projectPath, template } = await createProject(options);\n if (!projectPath) {\n process.exit(1);\n }\n options.cwd = projectPath;\n options.isNewProject = true;\n newProjectTemplate = template;\n }\n }\n\n if (newProjectTemplate) {\n const projectPath = {\n \"astro-monorepo\": \"apps/web\",\n \"astro-with-component-docs-monorepo\": \"apps/web\",\n astro: \"\",\n } as const;\n options.cwd = path.resolve(options.cwd, projectPath[newProjectTemplate]);\n\n logger.log(\n `${highlighter.success(\n \"Success!\",\n )} Project initialization completed.\\nYou may now add components.`,\n );\n\n return await getConfig(options.cwd);\n }\n\n // const projectConfig = await getProjectConfig(options.cwd, projectInfo);\n\n try {\n const env = {\n ...process.env,\n REGISTRY_URL: process.env.REGISTRY_URL || DEFAULT_REGISTRY_URL,\n };\n const invocation = buildPinnedShadcnInvocation(\n buildShadcnInitArgs(options.baseColor ?? DEFAULT_COMPONENTS_BASE_COLOR),\n );\n\n await execa(invocation.cmd, invocation.args, {\n stdio: \"inherit\",\n cwd: options.cwd,\n env,\n });\n } catch (err) {\n // shadcn already printed the detailed error to stdio, avoid double-reporting\n process.exit(1);\n }\n}\n","import { resolve } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\n\n/**\n * Read and parse tsconfig.json from the project root\n */\nexport function readTsConfig(projectRoot: string): any | null {\n try {\n const tsconfigPath = resolve(projectRoot, \"tsconfig.json\");\n if (!existsSync(tsconfigPath)) return null;\n const raw = readFileSync(tsconfigPath, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve an alias path (like @/components) using tsconfig.json paths\n */\nexport function resolveAliasPathUsingTsConfig(\n inputPath: string,\n projectRoot: string,\n): string | null {\n const cfg = readTsConfig(projectRoot);\n if (!cfg || !cfg.compilerOptions) return null;\n const baseUrl: string = cfg.compilerOptions.baseUrl || \".\";\n const paths: Record<string, string[] | string> =\n cfg.compilerOptions.paths || {};\n for (const [key, values] of Object.entries(paths)) {\n const pattern = key.replace(/\\*/g, \"(.*)\");\n const re = new RegExp(`^${pattern}$`);\n const match = inputPath.match(re);\n if (!match) continue;\n const wildcard = match[1] || \"\";\n const first = Array.isArray(values) ? values[0] : values;\n if (!first) continue;\n const target = String(first).replace(/\\*/g, wildcard);\n return resolve(projectRoot, baseUrl, target);\n }\n return null;\n}\n","import { Command } from \"commander\";\nimport { resolve, isAbsolute, relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { logger } from \"@/src/utils/logger\";\nimport { resolveAliasPathUsingTsConfig } from \"@/src/utils/tsconfig-utils\";\nimport prompts from \"prompts\";\n\nasync function generateDocs({\n cwd,\n outDir,\n verbose,\n}: {\n cwd?: string;\n outDir?: string;\n verbose?: boolean;\n}) {\n const DEBUG =\n process.env.BEJAMAS_DEBUG === \"1\" ||\n process.env.BEJAMAS_DEBUG === \"true\" ||\n verbose;\n\n try {\n const shellCwd = process.cwd();\n\n // Probe for components.json up the directory tree starting from shell CWD\n let projectRoot = shellCwd;\n let probe: string | null = shellCwd;\n for (let i = 0; i < 6 && probe; i += 1) {\n const candidate = resolve(probe, \"components.json\");\n if (existsSync(candidate)) {\n projectRoot = probe;\n try {\n const raw = readFileSync(candidate, \"utf-8\");\n const config = JSON.parse(raw);\n // If UI root not provided via CLI, try to infer from aliases.ui first\n if (!cwd && !process.env.BEJAMAS_UI_ROOT && config?.aliases?.ui) {\n const mapped: string = String(config.aliases.ui);\n let uiAbs: string | null = null;\n if (\n mapped.startsWith(\"./\") ||\n mapped.startsWith(\"../\") ||\n isAbsolute(mapped)\n ) {\n uiAbs = resolve(projectRoot, mapped);\n } else {\n uiAbs = resolveAliasPathUsingTsConfig(mapped, projectRoot);\n }\n if (!uiAbs && mapped.startsWith(\"@/\")) {\n uiAbs = resolve(projectRoot, \"src\", mapped.slice(2));\n }\n if (uiAbs) {\n process.env.BEJAMAS_UI_ROOT = uiAbs;\n }\n }\n // Fallback: infer UI root from tailwind.css\n if (!cwd && !process.env.BEJAMAS_UI_ROOT && config?.tailwind?.css) {\n const cssRaw = String(config.tailwind.css);\n let cssAbs: string | null = null;\n if (\n cssRaw.startsWith(\"./\") ||\n cssRaw.startsWith(\"../\") ||\n isAbsolute(cssRaw)\n ) {\n cssAbs = resolve(projectRoot, cssRaw);\n } else {\n cssAbs = resolveAliasPathUsingTsConfig(cssRaw, projectRoot);\n }\n if (!cssAbs && cssRaw.startsWith(\"@/\")) {\n cssAbs = resolve(projectRoot, \"src\", cssRaw.slice(2));\n }\n if (cssAbs) {\n const uiRootFromCss = resolve(cssAbs, \"..\", \"..\", \"..\");\n process.env.BEJAMAS_UI_ROOT = uiRootFromCss;\n }\n }\n // If out dir not provided via CLI, try to infer from aliases.docs\n if (!outDir && config?.aliases?.docs) {\n const mapped: string = String(config.aliases.docs);\n let outResolved: string | null = null;\n if (\n mapped.startsWith(\"./\") ||\n mapped.startsWith(\"../\") ||\n isAbsolute(mapped)\n ) {\n outResolved = mapped;\n } else {\n const abs = resolveAliasPathUsingTsConfig(mapped, projectRoot);\n if (abs) outResolved = relative(projectRoot, abs);\n }\n if (!outResolved && mapped.startsWith(\"@/\")) {\n outResolved = mapped.replace(/^@\\//, \"src/\");\n }\n // As a last resort, use the mapped value as-is so we do not prompt for output\n const finalOut = outResolved ?? mapped;\n if (finalOut && !process.env.BEJAMAS_DOCS_OUT_DIR) {\n process.env.BEJAMAS_DOCS_OUT_DIR = finalOut;\n process.env.BEJAMAS_DOCS_CWD = projectRoot;\n }\n }\n } catch {}\n break;\n }\n const parent = resolve(probe, \"..\");\n probe = parent === probe ? null : parent;\n }\n\n // Defaults if not already set from components.json\n if (!process.env.BEJAMAS_DOCS_CWD) {\n process.env.BEJAMAS_DOCS_CWD = shellCwd;\n }\n if (!process.env.BEJAMAS_UI_ROOT) {\n // Ask user for @bejamas/ui root when not inferred\n const defaultGuess = (() => {\n // Try local monorepo style packages/ui\n let current = shellCwd;\n for (let i = 0; i < 6; i += 1) {\n const cand = resolve(current, \"packages/ui/package.json\");\n if (existsSync(cand)) {\n const abs = resolve(current, \"packages/ui\");\n const rel = relative(shellCwd, abs);\n return rel || abs;\n }\n const parent = resolve(current, \"..\");\n if (parent === current) break;\n current = parent;\n }\n // Try installed node_modules fallback\n const nm = resolve(shellCwd, \"node_modules/@bejamas/ui/package.json\");\n if (existsSync(nm)) {\n const abs = resolve(shellCwd, \"node_modules/@bejamas/ui\");\n const rel = relative(shellCwd, abs);\n return rel || abs;\n }\n // Last resort: suggest a common local path\n return \"packages/ui\";\n })();\n const { uiRoot } = await prompts({\n type: \"text\",\n name: \"uiRoot\",\n message: \"Path to @bejamas/ui package root:\",\n initial: defaultGuess,\n validate: (val: string) => {\n const p = resolve(shellCwd, val);\n return existsSync(resolve(p, \"package.json\"))\n ? true\n : `No package.json found in ${p}`;\n },\n });\n if (!uiRoot) {\n logger.error(\"@bejamas/ui root is required to generate docs.\");\n process.exit(1);\n }\n process.env.BEJAMAS_UI_ROOT = resolve(shellCwd, uiRoot);\n }\n\n // CLI overrides take precedence\n if (cwd && cwd.length) {\n process.env.BEJAMAS_UI_ROOT = resolve(cwd);\n }\n if (outDir && outDir.length) {\n // Pass through exactly as provided; the generator will resolve against BEJAMAS_DOCS_CWD if needed.\n process.env.BEJAMAS_DOCS_OUT_DIR = outDir;\n }\n\n // If output dir still not defined, prompt the user\n if (!process.env.BEJAMAS_DOCS_OUT_DIR) {\n const { out } = await prompts({\n type: \"text\",\n name: \"out\",\n message: \"Where should we output docs (relative to project root)?\",\n initial: \"src/content/docs/components\",\n });\n if (!out) {\n logger.error(\"An output directory is required to generate docs.\");\n process.exit(1);\n }\n process.env.BEJAMAS_DOCS_OUT_DIR = out;\n process.env.BEJAMAS_DOCS_CWD = process.env.BEJAMAS_DOCS_CWD || shellCwd;\n }\n // Ensure the generator does not auto-run upon import; we'll invoke it explicitly\n process.env.BEJAMAS_SKIP_AUTO_RUN = \"1\";\n logger.info(`Generating docs...`);\n if (DEBUG) {\n logger.info(`Generator entry: @/src/docs/generate-mdx/index`);\n if (process.env.BEJAMAS_UI_ROOT)\n logger.info(`UI root: ${process.env.BEJAMAS_UI_ROOT}`);\n if (process.env.BEJAMAS_DOCS_CWD)\n logger.info(`Docs CWD: ${process.env.BEJAMAS_DOCS_CWD}`);\n if (process.env.BEJAMAS_DOCS_OUT_DIR)\n logger.info(`Docs out: ${process.env.BEJAMAS_DOCS_OUT_DIR}`);\n }\n const mod = await import(\"@/src/docs/generate-mdx/index\");\n if (typeof mod.runDocsGenerator === \"function\") {\n await mod.runDocsGenerator();\n } else {\n throw new Error(\n \"Failed to load docs generator. Export 'runDocsGenerator' not found.\",\n );\n }\n } catch (err: any) {\n logger.error(err?.message || String(err));\n process.exit(1);\n }\n}\n\nexport const docs = new Command()\n .name(\"docs:build\")\n .alias(\"docs\")\n .description(\"generate docs from @bejamas/ui components\")\n .option(\"-c, --cwd <cwd>\", \"path to UI working directory\")\n .option(\"-o, --out <outDir>\", \"output directory for generated MDX files\")\n .action(async (opts) => {\n await generateDocs({\n cwd: opts.cwd,\n outDir: opts.out,\n verbose: Boolean(opts.verbose),\n });\n });\n","import { Command } from \"commander\";\nimport { resolve, isAbsolute, join, extname } from \"node:path\";\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport {\n cyan,\n green,\n red,\n yellow,\n dim,\n bold,\n magenta,\n white,\n} from \"kleur/colors\";\nimport { logger } from \"@/src/utils/logger\";\nimport { resolveAliasPathUsingTsConfig } from \"@/src/utils/tsconfig-utils\";\nimport {\n extractFrontmatter,\n parseJsDocMetadata,\n resolveUiRoot,\n} from \"@/src/docs/generate-mdx/utils\";\n\ninterface ComponentDocStatus {\n name: string;\n file: string;\n status: \"complete\" | \"incomplete\" | \"missing\";\n missingRequired: string[];\n missingRecommended: string[];\n}\n\ninterface CheckResult {\n total: number;\n complete: ComponentDocStatus[];\n incomplete: ComponentDocStatus[];\n missing: ComponentDocStatus[];\n}\n\nconst REQUIRED_FIELDS = [\"name\", \"title\", \"description\"] as const;\nconst RECOMMENDED_FIELDS = [\n \"primaryExampleMDX\",\n \"usageMDX\",\n \"figmaUrl\",\n] as const;\n\nconst FIELD_LABELS: Record<string, string> = {\n name: \"@component\",\n title: \"@title\",\n description: \"@description\",\n primaryExampleMDX: \"@preview\",\n usageMDX: \"@usage\",\n figmaUrl: \"@figmaUrl\",\n};\n\nfunction checkComponentDocs(\n filePath: string,\n fileName: string,\n): ComponentDocStatus {\n const content = readFileSync(filePath, \"utf-8\");\n const frontmatter = extractFrontmatter(content);\n const meta = parseJsDocMetadata(frontmatter);\n\n const componentName = fileName.replace(/\\.astro$/i, \"\");\n const missingRequired: string[] = [];\n const missingRecommended: string[] = [];\n\n for (const field of REQUIRED_FIELDS) {\n const value = meta[field];\n if (!value || (typeof value === \"string\" && !value.trim())) {\n missingRequired.push(FIELD_LABELS[field] || field);\n }\n }\n\n for (const field of RECOMMENDED_FIELDS) {\n const value = meta[field];\n if (!value || (typeof value === \"string\" && !value.trim())) {\n missingRecommended.push(FIELD_LABELS[field] || field);\n }\n }\n\n let status: \"complete\" | \"incomplete\" | \"missing\";\n if (missingRequired.length > 0) {\n status = \"missing\";\n } else if (missingRecommended.length > 0) {\n status = \"incomplete\";\n } else {\n status = \"complete\";\n }\n\n return {\n name: componentName,\n file: fileName,\n status,\n missingRequired,\n missingRecommended,\n };\n}\n\nasync function checkDocs({\n cwd,\n json,\n}: {\n cwd?: string;\n json?: boolean;\n}): Promise<void> {\n try {\n const shellCwd = process.cwd();\n\n // Probe for components.json up the directory tree starting from shell CWD\n let projectRoot = shellCwd;\n let probe: string | null = shellCwd;\n for (let i = 0; i < 6 && probe; i += 1) {\n const candidate = resolve(probe, \"components.json\");\n if (existsSync(candidate)) {\n projectRoot = probe;\n try {\n const raw = readFileSync(candidate, \"utf-8\");\n const config = JSON.parse(raw);\n // If UI root not provided via CLI, try to infer from aliases.ui first\n if (!cwd && !process.env.BEJAMAS_UI_ROOT && config?.aliases?.ui) {\n const mapped: string = String(config.aliases.ui);\n let uiAbs: string | null = null;\n if (\n mapped.startsWith(\"./\") ||\n mapped.startsWith(\"../\") ||\n isAbsolute(mapped)\n ) {\n uiAbs = resolve(projectRoot, mapped);\n } else {\n uiAbs = resolveAliasPathUsingTsConfig(mapped, projectRoot);\n }\n if (!uiAbs && mapped.startsWith(\"@/\")) {\n uiAbs = resolve(projectRoot, \"src\", mapped.slice(2));\n }\n if (uiAbs) {\n process.env.BEJAMAS_UI_ROOT = uiAbs;\n }\n }\n // Fallback: infer UI root from tailwind.css\n if (!cwd && !process.env.BEJAMAS_UI_ROOT && config?.tailwind?.css) {\n const cssRaw = String(config.tailwind.css);\n let cssAbs: string | null = null;\n if (\n cssRaw.startsWith(\"./\") ||\n cssRaw.startsWith(\"../\") ||\n isAbsolute(cssRaw)\n ) {\n cssAbs = resolve(projectRoot, cssRaw);\n } else {\n cssAbs = resolveAliasPathUsingTsConfig(cssRaw, projectRoot);\n }\n if (!cssAbs && cssRaw.startsWith(\"@/\")) {\n cssAbs = resolve(projectRoot, \"src\", cssRaw.slice(2));\n }\n if (cssAbs) {\n const uiRootFromCss = resolve(cssAbs, \"..\", \"..\", \"..\");\n process.env.BEJAMAS_UI_ROOT = uiRootFromCss;\n }\n }\n } catch {}\n break;\n }\n const parent = resolve(probe, \"..\");\n probe = parent === probe ? null : parent;\n }\n\n // CLI override takes precedence\n if (cwd && cwd.length) {\n process.env.BEJAMAS_UI_ROOT = resolve(cwd);\n }\n\n let uiRoot: string;\n try {\n uiRoot = resolveUiRoot(shellCwd);\n } catch {\n logger.error(\n \"Unable to locate @bejamas/ui. Use --cwd to specify the UI package path.\",\n );\n process.exit(1);\n }\n\n const componentsDir = join(uiRoot, \"src\", \"components\");\n if (!existsSync(componentsDir)) {\n logger.error(\n `Components directory not found: ${componentsDir}\\n\\n` +\n `Expected structure: <uiRoot>/src/components/*.astro\\n` +\n `Use --cwd to specify a different UI package root.`,\n );\n process.exit(1);\n }\n\n const files = readdirSync(componentsDir, { withFileTypes: true })\n .filter((e) => e.isFile() && extname(e.name).toLowerCase() === \".astro\")\n .map((e) => e.name)\n .sort();\n\n if (files.length === 0) {\n logger.warn(\"No .astro component files found.\");\n process.exit(0);\n }\n\n const results: ComponentDocStatus[] = [];\n for (const file of files) {\n const filePath = join(componentsDir, file);\n const status = checkComponentDocs(filePath, file);\n results.push(status);\n }\n\n const complete = results.filter((r) => r.status === \"complete\");\n const incomplete = results.filter((r) => r.status === \"incomplete\");\n const missing = results.filter((r) => r.status === \"missing\");\n\n const checkResult: CheckResult = {\n total: results.length,\n complete,\n incomplete,\n missing,\n };\n\n if (json) {\n console.log(JSON.stringify(checkResult, null, 2));\n // Exit with error code if there are components missing required docs\n if (missing.length > 0) {\n process.exit(1);\n }\n return;\n }\n\n // Print formatted report\n const termWidth = Math.min(80, process.stdout.columns || 80);\n const headerLine = \"━\".repeat(termWidth);\n\n logger.break();\n console.log(dim(\"┌\" + \"─\".repeat(termWidth - 2) + \"┐\"));\n console.log(\n dim(\"│\") +\n bold(cyan(\" docs:check\")) +\n dim(\" — Component Documentation Status\") +\n \" \".repeat(Math.max(0, termWidth - 47)) +\n dim(\"│\"),\n );\n console.log(dim(\"└\" + \"─\".repeat(termWidth - 2) + \"┘\"));\n logger.break();\n\n // Helper to format tags with color\n const formatTag = (tag: string) => magenta(tag);\n const formatComponentName = (name: string) => bold(white(name));\n\n // Complete components\n if (complete.length > 0) {\n console.log(\n green(\n `✓ Complete (${complete.length} component${complete.length === 1 ? \"\" : \"s\"}):`,\n ),\n );\n const names = complete\n .map((c) => formatComponentName(c.name))\n .join(dim(\", \"));\n console.log(` ${names}`);\n logger.break();\n }\n\n // Incomplete components (missing recommended fields)\n if (incomplete.length > 0) {\n console.log(\n yellow(\n `⚠ Incomplete (${incomplete.length} component${incomplete.length === 1 ? \"\" : \"s\"}):`,\n ),\n );\n for (const comp of incomplete) {\n const missingFields = comp.missingRecommended\n .map(formatTag)\n .join(dim(\", \"));\n console.log(\n ` ${formatComponentName(comp.name)} ${dim(\"-\")} ${dim(\"missing:\")} ${missingFields}`,\n );\n }\n logger.break();\n }\n\n // Missing docs (missing required fields)\n if (missing.length > 0) {\n console.log(\n red(\n `✗ Missing Docs (${missing.length} component${missing.length === 1 ? \"\" : \"s\"}):`,\n ),\n );\n for (const comp of missing) {\n const missingFields = comp.missingRequired\n .map(formatTag)\n .join(dim(\", \"));\n console.log(\n ` ${formatComponentName(comp.name)} ${dim(\"-\")} ${dim(\"missing:\")} ${missingFields}`,\n );\n }\n logger.break();\n }\n\n // Summary\n console.log(dim(headerLine));\n const completeText = green(`${complete.length}/${results.length} complete`);\n const incompleteText =\n incomplete.length > 0\n ? yellow(`${incomplete.length} incomplete`)\n : dim(`${incomplete.length} incomplete`);\n const missingText =\n missing.length > 0\n ? red(`${missing.length} missing docs`)\n : dim(`${missing.length} missing docs`);\n console.log(\n `${bold(\"Summary:\")} ${completeText} ${dim(\"|\")} ${incompleteText} ${dim(\"|\")} ${missingText}`,\n );\n logger.break();\n\n // Exit with error code if there are components missing required docs\n if (missing.length > 0) {\n process.exit(1);\n }\n } catch (err: any) {\n logger.error(err?.message || String(err));\n process.exit(1);\n }\n}\n\nexport const docsCheck = new Command()\n .name(\"docs:check\")\n .description(\"check documentation status for all components\")\n .option(\"-c, --cwd <cwd>\", \"path to UI working directory\")\n .option(\"--json\", \"output results as JSON\")\n .action(async (opts) => {\n await checkDocs({\n cwd: opts.cwd,\n json: Boolean(opts.json),\n });\n });\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { logger } from \"@/src/utils/logger\";\nimport { Config, getConfig } from \"@/src/utils/get-config\";\n\nexport function updateImportAliases(\n moduleSpecifier: string,\n config: Config,\n isRemote: boolean = false,\n) {\n // Not a local import.\n if (!moduleSpecifier.startsWith(\"@/\") && !isRemote) {\n return moduleSpecifier;\n }\n\n // This treats the remote as coming from a faux registry.\n let specifier = moduleSpecifier;\n if (isRemote && specifier.startsWith(\"@/\")) {\n specifier = specifier.replace(/^@\\//, \"@/registry/new-york/\");\n }\n\n // Not a registry import.\n if (!specifier.startsWith(\"@/registry/\")) {\n // We fix the alias and return.\n const alias = config.aliases.components.split(\"/\")[0];\n return specifier.replace(/^@\\//, `${alias}/`);\n }\n\n if (specifier.match(/^@\\/registry\\/(.+)\\/ui/)) {\n return specifier.replace(\n /^@\\/registry\\/(.+)\\/ui/,\n config.aliases.ui ?? `${config.aliases.components}/ui`,\n );\n }\n\n if (\n config.aliases.components &&\n specifier.match(/^@\\/registry\\/(.+)\\/components/)\n ) {\n return specifier.replace(\n /^@\\/registry\\/(.+)\\/components/,\n config.aliases.components,\n );\n }\n\n if (config.aliases.lib && specifier.match(/^@\\/registry\\/(.+)\\/lib/)) {\n return specifier.replace(/^@\\/registry\\/(.+)\\/lib/, config.aliases.lib);\n }\n\n if (config.aliases.hooks && specifier.match(/^@\\/registry\\/(.+)\\/hooks/)) {\n return specifier.replace(/^@\\/registry\\/(.+)\\/hooks/, config.aliases.hooks);\n }\n\n return specifier.replace(/^@\\/registry\\/[^/]+/, config.aliases.components);\n}\n\nexport function rewriteAstroImports(content: string, config: Config) {\n let updated = content;\n\n const utilsAlias = config.aliases?.utils;\n const workspaceAlias =\n typeof utilsAlias === \"string\" && utilsAlias.includes(\"/\")\n ? utilsAlias.split(\"/\")[0]\n : \"@\";\n const utilsImport = `${workspaceAlias}/lib/utils`;\n\n // Handle standard imports with specifiers, e.g. `import { x } from \"path\"`\n updated = updated.replace(\n /import\\s+([\\s\\S]*?)\\s+from\\s+[\"']([^\"']+)[\"']/g,\n (full, importsPart, specifier) => {\n const next = updateImportAliases(specifier, config, false);\n\n let finalSpec = next;\n const includesCn =\n typeof importsPart === \"string\" &&\n importsPart.split(/[{},\\s]/).some((part: string) => part === \"cn\");\n\n if (\n includesCn &&\n config.aliases.utils &&\n (next === utilsImport || next === \"@/lib/utils\")\n ) {\n finalSpec =\n utilsImport === next\n ? next.replace(utilsImport, config.aliases.utils)\n : config.aliases.utils;\n }\n\n if (finalSpec === specifier) return full;\n return full.replace(specifier, finalSpec);\n },\n );\n\n // Handle bare imports, e.g. `import \"path\"`\n updated = updated.replace(/import\\s+[\"']([^\"']+)[\"']/g, (full, specifier) => {\n const next = updateImportAliases(specifier, config, false);\n if (next === specifier) return full;\n return full.replace(specifier, next);\n });\n\n return updated;\n}\n\nexport async function fixAstroImports(cwd: string, isVerbose: boolean) {\n const config = await getConfig(cwd);\n if (!config) return;\n\n const searchRoots = new Set<string>([\n config.resolvedPaths.components,\n config.resolvedPaths.ui,\n ]);\n\n for (const root of Array.from(searchRoots)) {\n if (!root) continue;\n const astroFiles = await fg(\"**/*.astro\", {\n cwd: root,\n absolute: true,\n dot: false,\n });\n\n for (const filePath of astroFiles) {\n const original = await fs.readFile(filePath, \"utf8\");\n const rewritten = rewriteAstroImports(original, config);\n if (rewritten === original) continue;\n await fs.writeFile(filePath, rewritten, \"utf8\");\n if (isVerbose) {\n logger.info(\n `[bejamas-ui] fixed imports in ${path.relative(cwd, filePath)}`,\n );\n }\n }\n }\n}\n\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { logger } from \"@/src/utils/logger\";\n\nexport interface RegistryFile {\n path: string;\n content: string;\n type: string;\n target?: string;\n}\n\nexport interface RegistryItem {\n name: string;\n type: string;\n files: RegistryFile[];\n dependencies?: string[];\n devDependencies?: string[];\n registryDependencies?: string[];\n}\n\n/** Maps filename to subfolder/filename for path rewriting */\nexport type PathRewriteMap = Map<string, string>;\n\n/**\n * Fetches a registry item JSON from the registry URL.\n */\nexport async function fetchRegistryItem(\n componentName: string,\n registryUrl: string,\n): Promise<RegistryItem | null> {\n // Handle style-prefixed URLs (e.g., styles/new-york-v4/avatar.json)\n const url = `${registryUrl}/styles/new-york-v4/${componentName}.json`;\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n // Try without styles prefix as fallback\n const fallbackUrl = `${registryUrl}/${componentName}.json`;\n const fallbackResponse = await fetch(fallbackUrl);\n if (!fallbackResponse.ok) {\n return null;\n }\n return (await fallbackResponse.json()) as RegistryItem;\n }\n return (await response.json()) as RegistryItem;\n } catch {\n return null;\n }\n}\n\n/**\n * Extracts the subfolder name from registry file paths.\n * E.g., \"components/ui/avatar/Avatar.astro\" → \"avatar\"\n */\nexport function getSubfolderFromPaths(files: RegistryFile[]): string | null {\n // Only consider registry:ui files\n const uiFiles = files.filter((f) => f.type === \"registry:ui\");\n if (uiFiles.length < 2) {\n // Single file components don't need subfolders\n return null;\n }\n\n const subfolders = new Set<string>();\n\n for (const file of uiFiles) {\n const parts = file.path.split(\"/\");\n // Look for pattern: .../ui/<subfolder>/<filename>\n const uiIndex = parts.indexOf(\"ui\");\n if (uiIndex !== -1 && parts.length > uiIndex + 2) {\n // There's at least one folder after \"ui\" before the filename\n subfolders.add(parts[uiIndex + 1]);\n }\n }\n\n // If all files share the same subfolder, use it\n if (subfolders.size === 1) {\n return Array.from(subfolders)[0];\n }\n\n // Fallback: use the component name from the first file's parent directory\n if (uiFiles.length > 0) {\n const firstPath = uiFiles[0].path;\n const dirname = path.dirname(firstPath);\n const folderName = path.basename(dirname);\n // Only use if it's not \"ui\" itself\n if (folderName && folderName !== \"ui\") {\n return folderName;\n }\n }\n\n return null;\n}\n\n/**\n * Checks if a path exists.\n */\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Builds a map of path rewrites for components that will be reorganized.\n * Call this BEFORE shadcn runs to know how to rewrite output paths.\n */\nexport async function buildPathRewriteMap(\n components: string[],\n uiDir: string,\n registryUrl: string,\n): Promise<PathRewriteMap> {\n const rewrites: PathRewriteMap = new Map();\n\n if (!uiDir || components.length === 0) {\n return rewrites;\n }\n\n for (const componentName of components) {\n try {\n const registryItem = await fetchRegistryItem(componentName, registryUrl);\n if (!registryItem) continue;\n\n const subfolder = getSubfolderFromPaths(registryItem.files);\n if (!subfolder) continue;\n\n // Get the UI files that will be reorganized\n const uiFiles = registryItem.files.filter(\n (f) => f.type === \"registry:ui\",\n );\n\n for (const file of uiFiles) {\n const filename = path.basename(file.path);\n // Map: \"Avatar.astro\" → \"avatar/Avatar.astro\"\n rewrites.set(filename, `${subfolder}/${filename}`);\n }\n } catch {\n // Ignore errors, just skip this component\n }\n }\n\n return rewrites;\n}\n\n/**\n * Rewrites file paths in shadcn output to reflect reorganized structure.\n * Replaces flat paths like \"/ui/Avatar.astro\" with \"/ui/avatar/Avatar.astro\"\n */\nexport function rewriteOutputPaths(\n output: string,\n rewrites: PathRewriteMap,\n): string {\n let result = output;\n\n for (const [filename, newPath] of rewrites) {\n // Match paths ending with the filename (handles various path formats)\n // e.g., \"packages/ui/src/components/Avatar.astro\" → \"packages/ui/src/components/avatar/Avatar.astro\"\n const escapedFilename = filename.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n const pattern = new RegExp(`(/[^/\\\\s]+)/${escapedFilename}(?=\\\\s|$|\\\\n)`, \"g\");\n result = result.replace(pattern, `$1/${newPath}`);\n }\n\n return result;\n}\n\nexport interface ReorganizeResult {\n totalMoved: number;\n movedFiles: string[]; // e.g., [\"avatar/Avatar.astro\", \"avatar/index.ts\"]\n skippedFiles: string[]; // Files that already existed in subfolder (flat duplicate removed)\n}\n\n/**\n * Reorganizes multi-file components into correct subfolders.\n * Only moves files from FLAT location to subfolder.\n * Does NOT touch files already in subfolders.\n * E.g., moves `uiDir/Avatar.astro` to `uiDir/avatar/Avatar.astro`.\n * Returns info about moved files for display purposes.\n */\nexport async function reorganizeComponents(\n components: string[],\n uiDir: string,\n registryUrl: string,\n verbose: boolean,\n): Promise<ReorganizeResult> {\n const result: ReorganizeResult = { totalMoved: 0, movedFiles: [], skippedFiles: [] };\n\n if (!uiDir || components.length === 0) {\n return result;\n }\n\n for (const componentName of components) {\n try {\n const registryItem = await fetchRegistryItem(componentName, registryUrl);\n if (!registryItem) {\n if (verbose) {\n logger.info(\n `[bejamas-ui] Could not fetch registry for ${componentName}, skipping reorganization`,\n );\n }\n continue;\n }\n\n const subfolder = getSubfolderFromPaths(registryItem.files);\n if (!subfolder) {\n // Single-file component or no subfolder detected, skip\n if (verbose) {\n logger.info(\n `[bejamas-ui] ${componentName} is single-file or has no subfolder, skipping`,\n );\n }\n continue;\n }\n\n // Get the UI files that need to be moved\n const uiFiles = registryItem.files.filter(\n (f) => f.type === \"registry:ui\",\n );\n\n const targetDir = path.join(uiDir, subfolder);\n let movedCount = 0;\n\n for (const file of uiFiles) {\n const filename = path.basename(file.path);\n // Only look for files in FLAT location (directly in uiDir)\n const flatPath = path.join(uiDir, filename);\n const targetPath = path.join(targetDir, filename);\n\n // Check if file exists in flat location\n if (!(await pathExists(flatPath))) {\n // Not in flat location, skip (may already be in subfolder)\n continue;\n }\n\n // Check if target already exists (don't overwrite, but clean up flat duplicate)\n if (await pathExists(targetPath)) {\n // Target exists in subfolder - delete the flat duplicate shadcn just created\n try {\n await fs.unlink(flatPath);\n result.skippedFiles.push(`${subfolder}/${filename}`);\n if (verbose) {\n logger.info(\n `[bejamas-ui] Removed flat duplicate: ${filename} (${subfolder}/${filename} exists)`,\n );\n }\n } catch {\n // Flat file might not exist or already deleted, but still counts as skipped\n result.skippedFiles.push(`${subfolder}/${filename}`);\n }\n continue;\n }\n\n // Create target directory if needed\n await fs.mkdir(targetDir, { recursive: true });\n\n // Move file from flat to subfolder\n await fs.rename(flatPath, targetPath);\n movedCount++;\n result.totalMoved++;\n result.movedFiles.push(`${subfolder}/${filename}`);\n\n if (verbose) {\n logger.info(`[bejamas-ui] Moved ${filename} → ${subfolder}/${filename}`);\n }\n }\n\n if (movedCount > 0 && verbose) {\n logger.info(\n `[bejamas-ui] Reorganized ${componentName} into ${subfolder}/`,\n );\n }\n } catch (err) {\n // Non-fatal: log and continue with other components\n if (verbose) {\n logger.warn(\n `[bejamas-ui] Failed to reorganize ${componentName}: ${err}`,\n );\n }\n }\n }\n\n return result;\n}\n\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport prompts from \"prompts\";\nimport { logger } from \"@/src/utils/logger\";\nimport { spinner } from \"@/src/utils/spinner\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { fixAstroImports } from \"@/src/utils/astro-imports\";\nimport { getConfig, getWorkspaceConfig } from \"@/src/utils/get-config\";\nimport { buildPinnedShadcnInvocation } from \"@/src/utils/shadcn-cli\";\nimport {\n reorganizeComponents,\n fetchRegistryItem,\n getSubfolderFromPaths,\n} from \"@/src/utils/reorganize-components\";\n\ninterface ParsedOutput {\n created: string[];\n updated: string[];\n skipped: string[];\n}\n\n// Default fallback registry endpoint for shadcn (expects /r)\nconst DEFAULT_REGISTRY_URL = \"https://ui.bejamas.com/r\";\n\n// Derive only the user-provided flags for shadcn to avoid losing options\nfunction extractOptionsForShadcn(rawArgv: string[], cmd: Command): string[] {\n // Prefer commander metadata when available so we only forward options that\n // were explicitly set (avoids defaults and keeps aliases consistent).\n if (typeof cmd.getOptionValueSource === \"function\") {\n const opts = cmd.optsWithGlobals() as Record<string, unknown>;\n const forwarded: string[] = [];\n const getSource = (key: string) => cmd.getOptionValueSource(key);\n\n const addBoolean = (key: string, flag: string, negateFlag?: string) => {\n if (getSource(key) !== \"cli\") return;\n const value = opts[key];\n if (typeof value !== \"boolean\") return;\n if (value) {\n forwarded.push(flag);\n } else if (negateFlag) {\n forwarded.push(negateFlag);\n }\n };\n\n const addString = (key: string, flag: string) => {\n if (getSource(key) !== \"cli\") return;\n const value = opts[key];\n if (typeof value === \"string\") {\n forwarded.push(flag, value);\n }\n };\n\n addBoolean(\"yes\", \"--yes\");\n addBoolean(\"overwrite\", \"--overwrite\");\n addString(\"cwd\", \"--cwd\");\n addBoolean(\"all\", \"--all\");\n addString(\"path\", \"--path\");\n addBoolean(\"silent\", \"--silent\");\n addBoolean(\"srcDir\", \"--src-dir\", \"--no-src-dir\");\n\n // Preserve any explicit passthrough after \"--\" for shadcn.\n const addIndex = rawArgv.findIndex((arg) => arg === \"add\");\n if (addIndex !== -1) {\n const rest = rawArgv.slice(addIndex + 1);\n const doubleDashIndex = rest.indexOf(\"--\");\n if (doubleDashIndex !== -1) {\n forwarded.push(...rest.slice(doubleDashIndex));\n }\n }\n\n return forwarded;\n }\n\n // Fallback: lightweight parser that only forwards known options.\n const addIndex = rawArgv.findIndex((arg) => arg === \"add\");\n if (addIndex === -1) return [];\n const rest = rawArgv.slice(addIndex + 1);\n const forwarded: string[] = [];\n const optionsWithValues = new Set([\"-c\", \"--cwd\", \"-p\", \"--path\"]);\n const filteredFlags = new Set([\"-v\", \"--verbose\"]);\n\n for (let i = 0; i < rest.length; i += 1) {\n const token = rest[i];\n if (token === \"--\") {\n forwarded.push(\"--\", ...rest.slice(i + 1));\n break;\n }\n if (!token.startsWith(\"-\")) continue;\n if (filteredFlags.has(token)) continue;\n\n forwarded.push(token);\n if (token.includes(\"=\")) continue;\n\n if (optionsWithValues.has(token)) {\n const next = rest[i + 1];\n if (next) {\n forwarded.push(next);\n i += 1;\n }\n }\n }\n return forwarded;\n}\n\ninterface ComponentFileInfo {\n subfolder: string;\n files: string[]; // All filenames for this component\n}\n\ninterface SubfolderMapResult {\n // Maps unique filename -> subfolder/filename\n uniqueMap: Map<string, string>;\n // Maps component subfolder -> all its files (for grouping)\n componentInfo: Map<string, ComponentFileInfo>;\n // Set of shared filenames (like index.ts) that appear in multiple components\n sharedFilenames: Set<string>;\n}\n\n/** Build maps for path rewriting, handling filename collisions */\nasync function buildSubfolderMap(\n components: string[],\n registryUrl: string,\n): Promise<SubfolderMapResult> {\n const filenameToSubfolders = new Map<string, string[]>();\n const componentInfo = new Map<string, ComponentFileInfo>();\n\n // First pass: collect all filename -> subfolder mappings\n for (const componentName of components) {\n const registryItem = await fetchRegistryItem(componentName, registryUrl);\n if (!registryItem) continue;\n\n const subfolder = getSubfolderFromPaths(registryItem.files);\n if (!subfolder) continue;\n\n const files: string[] = [];\n for (const file of registryItem.files) {\n if (file.type === \"registry:ui\") {\n const filename = path.basename(file.path);\n files.push(filename);\n\n // Track which subfolders each filename appears in\n const subfolders = filenameToSubfolders.get(filename) || [];\n subfolders.push(subfolder);\n filenameToSubfolders.set(filename, subfolders);\n }\n }\n\n componentInfo.set(subfolder, { subfolder, files });\n }\n\n // Build the unique map (only filenames that appear once)\n const uniqueMap = new Map<string, string>();\n const sharedFilenames = new Set<string>();\n\n filenameToSubfolders.forEach((subfolders, filename) => {\n if (subfolders.length === 1) {\n // Unique filename - safe to map directly\n uniqueMap.set(filename, `${subfolders[0]}/${filename}`);\n } else {\n // Shared filename (like index.ts) - track for context-based rewriting\n sharedFilenames.add(filename);\n }\n });\n\n return { uniqueMap, componentInfo, sharedFilenames };\n}\n\n/**\n * Rewrite file paths to include correct subfolders.\n * Handles shared filenames (like index.ts) by tracking current component context.\n */\nfunction rewritePaths(\n paths: string[],\n mapResult: SubfolderMapResult,\n): string[] {\n const { uniqueMap, componentInfo, sharedFilenames } = mapResult;\n let currentSubfolder: string | null = null;\n\n return paths.map((filePath) => {\n const filename = path.basename(filePath);\n const parentDir = path.basename(path.dirname(filePath));\n\n // Check if this is a unique filename (can map directly)\n const uniqueMapping = uniqueMap.get(filename);\n if (uniqueMapping) {\n const expectedSubfolder = path.dirname(uniqueMapping);\n\n // Update current context for subsequent shared files\n currentSubfolder = expectedSubfolder;\n\n // Only rewrite if not already in the correct subfolder\n if (parentDir !== expectedSubfolder) {\n const dir = path.dirname(filePath);\n return `${dir}/${uniqueMapping}`;\n }\n return filePath;\n }\n\n // Check if this is a shared filename (like index.ts)\n if (sharedFilenames.has(filename) && currentSubfolder) {\n // Use the current component context\n const expectedSubfolder = currentSubfolder;\n\n // Only rewrite if not already in the correct subfolder\n if (parentDir !== expectedSubfolder) {\n const dir = path.dirname(filePath);\n return `${dir}/${expectedSubfolder}/${filename}`;\n }\n }\n\n return filePath;\n });\n}\n\n/** Fetch available components from the registry */\nasync function fetchAvailableComponents(\n registryUrl: string,\n): Promise<{ name: string; type?: string }[]> {\n const indexUrl = `${registryUrl}/index.json`;\n const response = await fetch(indexUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch registry index: ${response.statusText}`);\n }\n const data = await response.json();\n // Registry index is an array of objects with at least a name property\n return Array.isArray(data) ? data : [];\n}\n\n/** Prompt user to select components interactively */\nasync function promptForComponents(\n registryUrl: string,\n): Promise<string[] | null> {\n const checkingSpinner = spinner(\"Checking registry.\").start();\n\n let components: { name: string; type?: string }[];\n try {\n components = await fetchAvailableComponents(registryUrl);\n checkingSpinner.succeed();\n } catch (error) {\n checkingSpinner.fail();\n logger.error(\"Failed to fetch available components from registry.\");\n return null;\n }\n\n if (components.length === 0) {\n logger.warn(\"No components available in registry.\");\n return null;\n }\n\n // Filter to only ui:* type components if type info is available\n const uiComponents = components.filter(\n (c) => !c.type || c.type === \"registry:ui\",\n );\n\n const choices = uiComponents.map((c) => ({\n title: c.name,\n value: c.name,\n }));\n\n const { selected } = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"selected\",\n message: \"Which components would you like to add?\",\n choices,\n hint: \"- Space to select. Return to submit.\",\n instructions: false,\n });\n\n // User cancelled (Ctrl+C)\n if (!selected) {\n return null;\n }\n\n return selected;\n}\n\n/** Parse shadcn output to extract file lists (stdout has paths, stderr has headers) */\nfunction parseShadcnOutput(stdout: string, stderr: string): ParsedOutput {\n const result: ParsedOutput = { created: [], updated: [], skipped: [] };\n\n // Remove ANSI escape codes for parsing\n const cleanStderr = stderr.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n const cleanStdout = stdout.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n\n // Extract counts from stderr headers\n // Matches patterns like \"✔ Created 4 files:\" or \"ℹ Skipped 2 files:\"\n const createdMatch = cleanStderr.match(/Created\\s+(\\d+)\\s+file/i);\n const updatedMatch = cleanStderr.match(/Updated\\s+(\\d+)\\s+file/i);\n const skippedMatch = cleanStderr.match(/Skipped\\s+(\\d+)\\s+file/i);\n\n const createdCount = createdMatch ? parseInt(createdMatch[1], 10) : 0;\n const updatedCount = updatedMatch ? parseInt(updatedMatch[1], 10) : 0;\n const skippedCount = skippedMatch ? parseInt(skippedMatch[1], 10) : 0;\n\n // Extract file paths from stdout (lines starting with \" - \")\n const allPaths: string[] = [];\n for (const line of cleanStdout.split(\"\\n\")) {\n const match = line.match(/^\\s+-\\s+(.+)$/);\n if (match) {\n allPaths.push(match[1].trim());\n }\n }\n\n // Also check stderr for file paths (some shadcn versions output there)\n for (const line of cleanStderr.split(\"\\n\")) {\n const match = line.match(/^\\s+-\\s+(.+)$/);\n if (match) {\n const filePath = match[1].trim();\n // Avoid duplicates\n if (!allPaths.includes(filePath)) {\n allPaths.push(filePath);\n }\n }\n }\n\n // Assign paths to sections based on counts (order: created, updated, skipped)\n let idx = 0;\n for (let i = 0; i < createdCount && idx < allPaths.length; i++) {\n result.created.push(allPaths[idx++]);\n }\n for (let i = 0; i < updatedCount && idx < allPaths.length; i++) {\n result.updated.push(allPaths[idx++]);\n }\n for (let i = 0; i < skippedCount && idx < allPaths.length; i++) {\n result.skipped.push(allPaths[idx++]);\n }\n\n return result;\n}\n\nasync function addComponents(\n packages: string[],\n forwardedOptions: string[],\n isVerbose: boolean,\n isSilent: boolean,\n subfolderMapResult: SubfolderMapResult,\n): Promise<ParsedOutput> {\n const env = {\n ...process.env,\n REGISTRY_URL: process.env.REGISTRY_URL || DEFAULT_REGISTRY_URL,\n };\n const shadcnArgs = buildShadcnAddArgs(packages, forwardedOptions);\n const invocation = buildPinnedShadcnInvocation(shadcnArgs);\n\n if (isVerbose) {\n logger.info(`[bejamas-ui] ${invocation.cmd} ${invocation.args.join(\" \")}`);\n }\n\n // Show our own spinner for checking registry\n const registrySpinner = spinner(\"Checking registry.\", { silent: isSilent });\n registrySpinner.start();\n\n try {\n // Run shadcn and capture output\n // Pipe \"n\" to stdin to answer \"no\" to any overwrite prompts (respects user customizations)\n const result = await execa(invocation.cmd, invocation.args, {\n env,\n input: \"n\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\n\", // Answer \"no\" to up to 10 overwrite prompts\n stdout: \"pipe\",\n stderr: \"pipe\",\n reject: false,\n });\n\n registrySpinner.succeed();\n\n // Show installing spinner (already done at this point)\n const installSpinner = spinner(\"Installing components.\", {\n silent: isSilent,\n });\n installSpinner.succeed();\n\n // Parse the output to get file lists (stdout has paths, stderr has headers)\n const stdout = result.stdout || \"\";\n const stderr = result.stderr || \"\";\n\n if (isVerbose) {\n logger.info(`[bejamas-ui] Raw stdout: ${stdout}`);\n logger.info(`[bejamas-ui] Raw stderr: ${stderr}`);\n }\n\n const parsed = parseShadcnOutput(stdout, stderr);\n\n // Return parsed data - display is handled by caller after reorganization\n // This allows accurate reporting (shadcn says \"created\" but we may skip)\n\n if (result.exitCode !== 0) {\n // Show any error output\n if (result.stderr) {\n logger.error(result.stderr);\n }\n process.exit(result.exitCode);\n }\n\n return parsed;\n } catch (err) {\n registrySpinner.fail();\n logger.error(\"Failed to add components\");\n process.exit(1);\n }\n}\n\nexport function buildShadcnAddArgs(\n packages: string[],\n forwardedOptions: string[],\n) {\n // Always pass --yes for non-interactive mode (skips \"Add components?\" confirmation)\n // Note: we don't pass --overwrite by default to respect user customizations\n const autoFlags: string[] = [];\n if (!forwardedOptions.includes(\"--yes\")) {\n autoFlags.push(\"--yes\");\n }\n\n return [\n \"add\",\n ...packages,\n ...autoFlags,\n ...forwardedOptions,\n ];\n}\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"Add components via the pinned shadcn registry flow\")\n .argument(\"[components...]\", \"Component package names to add\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .option(\"-a, --all\", \"add all available components\", false)\n .option(\"-p, --path <path>\", \"the path to add the component to.\")\n .option(\"-s, --silent\", \"mute output.\", false)\n .option(\n \"--src-dir\",\n \"use the src directory when creating a new project.\",\n false,\n )\n .option(\n \"--no-src-dir\",\n \"do not use the src directory when creating a new project.\",\n )\n // .option(\"--css-variables\", \"use css variables for theming.\", true)\n // .option(\"--no-css-variables\", \"do not use css variables for theming.\")\n .action(async function action(packages: string[], _opts, cmd) {\n const root = cmd?.parent;\n const verbose = Boolean(root?.opts?.().verbose);\n const rawArgv = process.argv.slice(2);\n const forwardedOptions = extractOptionsForShadcn(rawArgv, cmd);\n const opts =\n typeof cmd.optsWithGlobals === \"function\"\n ? cmd.optsWithGlobals()\n : (cmd.opts?.() ?? {});\n const cwd = opts.cwd || process.cwd();\n\n let componentsToAdd = packages || [];\n const wantsAll = Boolean(opts.all);\n const isSilent = opts.silent || false;\n const registryUrl = process.env.REGISTRY_URL || DEFAULT_REGISTRY_URL;\n\n // Handle --all flag: fetch all available components\n if (wantsAll && componentsToAdd.length === 0) {\n const fetchingSpinner = spinner(\"Fetching available components.\", {\n silent: isSilent,\n }).start();\n try {\n const allComponents = await fetchAvailableComponents(registryUrl);\n const uiComponents = allComponents.filter(\n (c) => !c.type || c.type === \"registry:ui\",\n );\n componentsToAdd = uiComponents.map((c) => c.name);\n fetchingSpinner.succeed();\n } catch (error) {\n fetchingSpinner.fail();\n logger.error(\"Failed to fetch available components from registry.\");\n process.exit(1);\n }\n }\n\n // Interactive mode: prompt user to select components\n if (componentsToAdd.length === 0) {\n const selected = await promptForComponents(registryUrl);\n if (!selected || selected.length === 0) {\n // User cancelled or no selection\n return;\n }\n componentsToAdd = selected;\n }\n\n // Get config for resolved paths (needed for reorganization)\n // In monorepos, we need to follow the alias chain to find the actual UI package config\n const config = await getConfig(cwd);\n\n // Try to get workspace config (follows aliases to find package-specific configs)\n let uiDir = config?.resolvedPaths?.ui || \"\";\n let uiConfig = config;\n\n if (config) {\n const workspaceConfig = await getWorkspaceConfig(config);\n if (workspaceConfig?.ui) {\n // Use the UI package's own config (e.g., packages/ui/components.json)\n uiConfig = workspaceConfig.ui;\n uiDir = uiConfig.resolvedPaths?.ui || uiDir;\n }\n }\n\n if (verbose) {\n logger.info(`[bejamas-ui] cwd: ${cwd}`);\n logger.info(`[bejamas-ui] uiDir: ${uiDir}`);\n logger.info(\n `[bejamas-ui] aliases.ui: ${uiConfig?.aliases?.ui || \"not set\"}`,\n );\n }\n\n // Process components ONE AT A TIME to avoid index.ts conflicts\n // When shadcn runs with multiple components, files with same name overwrite each other\n const totalComponents = componentsToAdd.length;\n\n for (let i = 0; i < componentsToAdd.length; i++) {\n const component = componentsToAdd[i];\n\n // Show component header when adding multiple\n if (totalComponents > 1 && !isSilent) {\n logger.break();\n logger.info(\n highlighter.info(`[${i + 1}/${totalComponents}]`) +\n ` Adding ${highlighter.success(component)}...`,\n );\n }\n\n // Build subfolder map for this single component\n const subfolderMapResult = await buildSubfolderMap(\n [component],\n registryUrl,\n );\n\n // Run shadcn for just this component\n const parsed = await addComponents(\n [component],\n forwardedOptions,\n verbose,\n isSilent,\n subfolderMapResult,\n );\n\n // Immediately reorganize this component's files before the next one\n let skippedCount = 0;\n if (uiDir) {\n const reorgResult = await reorganizeComponents(\n [component],\n uiDir,\n registryUrl,\n verbose,\n );\n skippedCount = reorgResult.skippedFiles.length;\n }\n\n // Display accurate results (accounting for files we skipped after shadcn \"created\" them)\n if (!isSilent) {\n const relativeUiDir = uiDir ? path.relative(cwd, uiDir) : \"\";\n\n // Files that were actually created (shadcn created minus our skipped)\n const actuallyCreated = Math.max(\n 0,\n parsed.created.length - skippedCount,\n );\n\n if (actuallyCreated > 0) {\n const createdPaths = rewritePaths(\n parsed.created.slice(0, actuallyCreated),\n subfolderMapResult,\n );\n logger.success(\n `Created ${createdPaths.length} file${createdPaths.length > 1 ? \"s\" : \"\"}:`,\n );\n for (const file of createdPaths) {\n logger.log(` ${highlighter.info(\"-\")} ${file}`);\n }\n }\n\n // Updated files (globals.css etc)\n if (parsed.updated.length > 0) {\n const uniqueUpdated = Array.from(new Set(parsed.updated));\n const updatedPaths = rewritePaths(uniqueUpdated, subfolderMapResult);\n logger.info(\n `Updated ${updatedPaths.length} file${updatedPaths.length > 1 ? \"s\" : \"\"}:`,\n );\n for (const file of updatedPaths) {\n logger.log(` ${highlighter.info(\"-\")} ${file}`);\n }\n }\n\n // Files skipped because they already exist in subfolder\n if (skippedCount > 0) {\n logger.info(\n `Skipped ${skippedCount} file${skippedCount > 1 ? \"s\" : \"\"}: (already exists)`,\n );\n }\n\n // Files shadcn skipped (different from our reorganization skip)\n if (parsed.skipped.length > 0) {\n const skippedPaths = rewritePaths(parsed.skipped, subfolderMapResult);\n logger.info(\n `Skipped ${skippedPaths.length} file${skippedPaths.length > 1 ? \"s\" : \"\"}: (use --overwrite)`,\n );\n for (const file of skippedPaths) {\n logger.log(` ${highlighter.info(\"-\")} ${file}`);\n }\n }\n\n // Nothing happened\n if (\n actuallyCreated === 0 &&\n parsed.updated.length === 0 &&\n skippedCount === 0 &&\n parsed.skipped.length === 0\n ) {\n logger.info(\"Already up to date.\");\n }\n }\n }\n\n // Fix aliases inside Astro files until upstream adds .astro support.\n await fixAstroImports(cwd, verbose);\n });\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { createRequire } from \"module\";\nimport { init } from \"@/src/commands/init\";\nimport { docs } from \"@/src/commands/docs\";\nimport { docsCheck } from \"@/src/commands/docs-check\";\nimport { add } from \"@/src/commands/add\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\nconst program = new Command()\n .name(\"bejamas\")\n .description(\"bejamas/ui cli\")\n .configureHelp({\n helpWidth: Math.min(100, process.stdout.columns || 100),\n })\n .version(pkg.version, \"-v, --version\", \"output the version number\");\n\nprogram.addCommand(init);\nprogram.addCommand(add);\nprogram.addCommand(docs);\nprogram.addCommand(docsCheck);\n\nprogram.parse(process.argv);\n\nexport default program;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["context: RegistryContext","errors: Record<string, boolean>","path","ERRORS.MISSING_DIR_OR_EMPTY_PROJECT","compactSource","escapeRegExp","subsets: ManagedAstroFontSubsets","quote: '\"' | \"'\" | \"`\" | null","TEMPLATE_I18N_SOURCES: Record<TemplateI18nVariant, string>","next","iconUsages: IconUsage[]","semanticIconImports: string[]","keptImports: string[]","transformed: string[]","fs","path","template: keyof typeof TEMPLATES","projectName: string","TEMPLATE_DIRNAME: Record<keyof typeof TEMPLATES, string>","pathExists","fs","dirname","fs","result: ReorganizeResult","os","fs","forwarded: string[]","initIndex","rest","forwarded","ERRORS.MISSING_DIR_OR_EMPTY_PROJECT","baseUrl: string","paths: Record<string, string[] | string>","probe: string | null","mapped: string","uiAbs: string | null","cssAbs: string | null","outResolved: string | null","err: any","FIELD_LABELS: Record<string, string>","missingRequired: string[]","missingRecommended: string[]","status: \"complete\" | \"incomplete\" | \"missing\"","probe: string | null","mapped: string","uiAbs: string | null","cssAbs: string | null","uiRoot: string","results: ComponentDocStatus[]","checkResult: CheckResult","err: any","forwarded: string[]","addIndex","rest","forwarded","currentSubfolder: string | null","components: { name: string; type?: string }[]","result: ParsedOutput","allPaths: string[]","autoFlags: string[]"],"sources":["../src/registry/context.ts","../src/utils/errors.ts","../src/preflights/preflight-init.ts","../src/utils/astro-fonts.ts","../src/utils/apply-design-system.ts","../src/utils/icon-transform.ts","../src/utils/menu-transform.ts","../src/utils/astro-imports.ts","../src/utils/get-package-manager.ts","../src/registry/errors.ts","../src/utils/handle-error.ts","../src/utils/create-project.ts","../src/utils/installed-ui-components.ts","../src/utils/reorganize-components.ts","../src/utils/shadcn-cli.ts","../src/utils/shadcn-command.ts","../src/commands/init.ts","../src/commands/docs.ts","../src/utils/tsconfig-utils.ts","../src/commands/docs-build.ts","../src/commands/docs-check.ts","../src/commands/add.ts","../src/commands/info.ts","../src/index.ts"],"sourcesContent":["interface RegistryContext {\n headers: Record<string, Record<string, string>>;\n}\n\nlet context: RegistryContext = {\n headers: {},\n};\n\nexport function setRegistryHeaders(\n headers: Record<string, Record<string, string>>,\n) {\n // Merge new headers with existing ones to preserve headers for nested dependencies\n context.headers = { ...context.headers, ...headers };\n}\n\nexport function getRegistryHeadersFromContext(\n url: string,\n): Record<string, string> {\n return context.headers[url] || {};\n}\n\nexport function clearRegistryContext() {\n context.headers = {};\n}\n","export const MISSING_DIR_OR_EMPTY_PROJECT = \"1\";\nexport const EXISTING_CONFIG = \"2\";\nexport const MISSING_CONFIG = \"3\";\nexport const FAILED_CONFIG_READ = \"4\";\nexport const TAILWIND_NOT_CONFIGURED = \"5\";\nexport const IMPORT_ALIAS_MISSING = \"6\";\nexport const UNSUPPORTED_FRAMEWORK = \"7\";\nexport const COMPONENT_URL_NOT_FOUND = \"8\";\nexport const COMPONENT_URL_UNAUTHORIZED = \"9\";\nexport const COMPONENT_URL_FORBIDDEN = \"10\";\nexport const COMPONENT_URL_BAD_REQUEST = \"11\";\nexport const COMPONENT_URL_INTERNAL_SERVER_ERROR = \"12\";\nexport const BUILD_MISSING_REGISTRY_FILE = \"13\";\n","import path from \"path\";\nimport { initOptionsSchema } from \"@/src/commands/init\";\nimport * as ERRORS from \"@/src/utils/errors\";\nimport fs from \"fs-extra\";\nimport { z } from \"zod\";\n\nexport async function preFlightInit(\n options: z.infer<typeof initOptionsSchema>,\n) {\n const errors: Record<string, boolean> = {};\n\n // Ensure target directory exists.\n // Check for empty project. We assume if no package.json exists, the project is empty.\n if (\n !fs.existsSync(options.cwd) ||\n !fs.existsSync(path.resolve(options.cwd, \"package.json\"))\n ) {\n errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT] = true;\n return {\n errors,\n projectInfo: null,\n };\n }\n\n return {\n errors,\n projectInfo: null,\n };\n}\n","import path from \"node:path\";\nimport fg from \"fast-glob\";\nimport fs from \"fs-extra\";\nimport {\n fonts,\n getFontPackageName,\n getFontValue,\n getHeadingFontValue,\n type DesignSystemConfig,\n} from \"@bejamas/create-config/server\";\n\nconst ASTRO_CONFIG_BLOCK_START = \"// bejamas:astro-fonts:start\";\nconst ASTRO_CONFIG_BLOCK_END = \"// bejamas:astro-fonts:end\";\nconst ASTRO_LAYOUT_BLOCK_START = \"<!-- bejamas:astro-fonts:start -->\";\nconst ASTRO_LAYOUT_BLOCK_END = \"<!-- bejamas:astro-fonts:end -->\";\nconst ASTRO_FONT_CONSTANT = \"BEJAMAS_ASTRO_FONTS\";\n\nconst ASTRO_CONFIG_CANDIDATES = [\n \"astro.config.mjs\",\n \"apps/web/astro.config.mjs\",\n \"apps/docs/astro.config.mjs\",\n] as const;\n\nconst ASTRO_LAYOUT_CANDIDATES = [\n \"src/layouts/Layout.astro\",\n \"apps/web/src/layouts/Layout.astro\",\n] as const;\n\nconst STARLIGHT_HEAD_RELATIVE_PATH = \"apps/docs/src/components/Head.astro\";\n\nconst ASTRO_FONT_PROVIDERS = [\"fontsource\", \"google\"] as const;\nconst ASTRO_FONTSOURCE_FONT_NAMES = new Set<DesignSystemConfig[\"font\"]>([\n \"geist\",\n \"geist-mono\",\n]);\nconst MANAGED_BODY_FONT_CLASSES = new Set([\"font-mono\", \"font-serif\"]);\n\ntype ManagedAstroFontProvider = (typeof ASTRO_FONT_PROVIDERS)[number];\ntype ManagedAstroFontSubsets = [string, ...string[]];\n\nexport type ManagedAstroFont = {\n cssVariable: string;\n name: string;\n provider: ManagedAstroFontProvider;\n subsets: ManagedAstroFontSubsets;\n};\n\nfunction compactSource(source: string) {\n return source.replace(/\\n{3,}/g, \"\\n\\n\").trimEnd() + \"\\n\";\n}\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction upsertImport(\n source: string,\n moduleName: string,\n importedName: string,\n fallbackNames: string[] = [],\n) {\n const importPattern = new RegExp(\n `import\\\\s*\\\\{([^}]+)\\\\}\\\\s*from\\\\s*[\"']${escapeRegExp(moduleName)}[\"'];?`,\n );\n\n if (importPattern.test(source)) {\n return source.replace(importPattern, (_match, importsSource) => {\n const imports = importsSource\n .split(\",\")\n .map((value: string) => value.trim())\n .filter(Boolean);\n\n if (!imports.includes(importedName)) {\n imports.push(importedName);\n }\n\n for (const name of fallbackNames) {\n if (!imports.includes(name)) {\n imports.unshift(name);\n }\n }\n\n return `import { ${Array.from(new Set(imports)).join(\", \")} } from \"${moduleName}\";`;\n });\n }\n\n const importLine = `import { ${Array.from(\n new Set([...fallbackNames, importedName]),\n ).join(\", \")} } from \"${moduleName}\";`;\n\n const frontmatterEnd = source.indexOf(\"---\", 3);\n if (source.startsWith(\"---\") && frontmatterEnd !== -1) {\n return `${source.slice(0, frontmatterEnd).trimEnd()}\\n${importLine}\\n${source.slice(frontmatterEnd)}`;\n }\n\n return `${importLine}\\n${source}`;\n}\n\nfunction buildAstroConfigFontBlock(fontsToSerialize: ManagedAstroFont[]) {\n const body =\n fontsToSerialize.length === 0\n ? \"\"\n : `\\n${fontsToSerialize\n .map(\n (font) =>\n ` {\\n provider: fontProviders.${font.provider}(),\\n name: ${JSON.stringify(font.name)},\\n cssVariable: ${JSON.stringify(font.cssVariable)},\\n subsets: ${JSON.stringify(font.subsets)},\\n },`,\n )\n .join(\"\\n\")}\\n`;\n\n return `${ASTRO_CONFIG_BLOCK_START}\\n/** @type {NonNullable<import(\"astro/config\").AstroUserConfig[\"fonts\"]>} */\\nconst ${ASTRO_FONT_CONSTANT} = [${body}];\\n${ASTRO_CONFIG_BLOCK_END}`;\n}\n\nfunction buildAstroLayoutFontBlock(fontsToSerialize: ManagedAstroFont[]) {\n const body = fontsToSerialize\n .map((font) => `<Font cssVariable=\"${font.cssVariable}\" />`)\n .join(\"\\n\");\n\n return `${ASTRO_LAYOUT_BLOCK_START}\\n${body}\\n${ASTRO_LAYOUT_BLOCK_END}`;\n}\n\nfunction bodyFontClassFromCssVariable(cssVariable?: string) {\n if (cssVariable === \"--font-mono\" || cssVariable === \"--font-serif\") {\n return fontClassFromCssVariable(cssVariable);\n }\n\n return \"\";\n}\n\nfunction upsertManagedBodyFontClass(source: string, cssVariable?: string) {\n const bodyClass = bodyFontClassFromCssVariable(cssVariable);\n const bodyTagPattern = /<body\\b([^>]*?)(\\/?)>/m;\n\n if (!bodyTagPattern.test(source)) {\n return source;\n }\n\n return source.replace(bodyTagPattern, (_match, attrs, selfClosing) => {\n const classPattern = /\\sclass=([\"'])(.*?)\\1/m;\n const classMatch = attrs.match(classPattern);\n const quote = classMatch?.[1] ?? '\"';\n const existingClasses = (classMatch?.[2] ?? \"\")\n .split(/\\s+/)\n .filter(Boolean)\n .filter((className) => !MANAGED_BODY_FONT_CLASSES.has(className));\n const nextClasses = bodyClass\n ? Array.from(new Set([...existingClasses, bodyClass]))\n : existingClasses;\n\n let nextAttrs = attrs.replace(classPattern, \"\");\n\n if (nextClasses.length > 0) {\n nextAttrs = `${nextAttrs} class=${quote}${nextClasses.join(\" \")}${quote}`;\n }\n\n return `<body${nextAttrs}${selfClosing}>`;\n });\n}\n\nexport function parseManagedAstroFonts(source: string) {\n const markerPattern = new RegExp(\n `${escapeRegExp(ASTRO_CONFIG_BLOCK_START)}[\\\\s\\\\S]*?const\\\\s+${ASTRO_FONT_CONSTANT}\\\\s*=\\\\s*\\\\[([\\\\s\\\\S]*?)\\\\];[\\\\s\\\\S]*?${escapeRegExp(ASTRO_CONFIG_BLOCK_END)}`,\n );\n const match = source.match(markerPattern);\n if (!match) {\n return [] as ManagedAstroFont[];\n }\n\n const objectMatches = match[1].match(/\\{[\\s\\S]*?\\}/g) ?? [];\n\n return objectMatches\n .map((entry) => {\n const name = entry.match(/name:\\s*\"([^\"]+)\"/)?.[1];\n const cssVariable = entry.match(/cssVariable:\\s*\"([^\"]+)\"/)?.[1];\n const provider = entry.match(/provider:\\s*fontProviders\\.([a-z]+)\\(\\)/)?.[1];\n const subsetsSource = entry.match(/subsets:\\s*(\\[[^\\]]*\\])/s)?.[1];\n\n if (\n !name ||\n !cssVariable ||\n !provider ||\n !ASTRO_FONT_PROVIDERS.includes(provider as ManagedAstroFontProvider)\n ) {\n return null;\n }\n\n let subsets: ManagedAstroFontSubsets = [\"latin\"];\n if (subsetsSource) {\n try {\n const parsed = JSON.parse(subsetsSource);\n if (\n Array.isArray(parsed) &&\n parsed.length > 0 &&\n parsed.every((value) => typeof value === \"string\")\n ) {\n subsets = parsed as ManagedAstroFontSubsets;\n }\n } catch {\n subsets = [\"latin\"];\n }\n }\n\n return {\n name,\n cssVariable,\n provider: provider as ManagedAstroFontProvider,\n subsets,\n };\n })\n .filter((value): value is ManagedAstroFont => value !== null);\n}\n\nfunction normalizeManagedAstroFontSubsets(\n subsets: string[] | undefined,\n): ManagedAstroFontSubsets {\n if (!subsets?.length) {\n return [\"latin\"];\n }\n\n return [subsets[0], ...subsets.slice(1)];\n}\n\nfunction replaceManagedBlock(\n source: string,\n nextBlock: string,\n start: string,\n end: string,\n) {\n const blockPattern = new RegExp(\n `${escapeRegExp(start)}[\\\\s\\\\S]*?${escapeRegExp(end)}`,\n \"m\",\n );\n\n if (blockPattern.test(source)) {\n return source.replace(blockPattern, nextBlock);\n }\n\n return null;\n}\n\nfunction stripExperimentalFontsProperty(source: string) {\n const experimentalMatch = source.match(/experimental\\s*:\\s*\\{/);\n if (!experimentalMatch || experimentalMatch.index === undefined) {\n return source;\n }\n\n const propertyStart = experimentalMatch.index;\n const openingBraceIndex =\n propertyStart + experimentalMatch[0].lastIndexOf(\"{\");\n\n let depth = 0;\n let closingBraceIndex = -1;\n let quote: '\"' | \"'\" | \"`\" | null = null;\n\n for (let index = openingBraceIndex; index < source.length; index += 1) {\n const character = source[index];\n const previousCharacter = index > 0 ? source[index - 1] : \"\";\n\n if (quote) {\n if (character === quote && previousCharacter !== \"\\\\\") {\n quote = null;\n }\n continue;\n }\n\n if (character === '\"' || character === \"'\" || character === \"`\") {\n quote = character;\n continue;\n }\n\n if (character === \"{\") {\n depth += 1;\n continue;\n }\n\n if (character === \"}\") {\n depth -= 1;\n if (depth === 0) {\n closingBraceIndex = index;\n break;\n }\n }\n }\n\n if (closingBraceIndex === -1) {\n return source;\n }\n\n const blockContent = source.slice(openingBraceIndex + 1, closingBraceIndex);\n const nextBlockContent = blockContent\n .replace(/(^|\\n)\\s*fonts\\s*:\\s*BEJAMAS_ASTRO_FONTS\\s*,?\\s*(?=\\n|$)/g, \"$1\")\n .replace(/\\n{3,}/g, \"\\n\\n\");\n\n let propertyEnd = closingBraceIndex + 1;\n while (propertyEnd < source.length && /\\s/.test(source[propertyEnd])) {\n propertyEnd += 1;\n }\n if (source[propertyEnd] === \",\") {\n propertyEnd += 1;\n }\n\n if (nextBlockContent.trim().length === 0) {\n return `${source.slice(0, propertyStart)}${source.slice(propertyEnd)}`;\n }\n\n const rebuiltProperty = `experimental: {${nextBlockContent}\\n }`;\n return `${source.slice(0, propertyStart)}${rebuiltProperty}${source.slice(closingBraceIndex + 1)}`;\n}\n\nexport function patchAstroConfigSource(\n source: string,\n fontsToSerialize: ManagedAstroFont[],\n options: { starlightHeadOverride?: boolean } = {},\n) {\n let next = upsertImport(source, \"astro/config\", \"fontProviders\", [\n \"defineConfig\",\n ]);\n\n const fontBlock = buildAstroConfigFontBlock(fontsToSerialize);\n const replacedBlock = replaceManagedBlock(\n next,\n fontBlock,\n ASTRO_CONFIG_BLOCK_START,\n ASTRO_CONFIG_BLOCK_END,\n );\n if (replacedBlock) {\n next = replacedBlock;\n } else {\n const imports = Array.from(next.matchAll(/^import .*$/gm));\n const lastImport = imports.at(-1);\n if (lastImport?.index !== undefined) {\n const insertAt = lastImport.index + lastImport[0].length;\n next = `${next.slice(0, insertAt)}\\n\\n${fontBlock}${next.slice(insertAt)}`;\n } else {\n next = `${fontBlock}\\n\\n${next}`;\n }\n }\n\n next = stripExperimentalFontsProperty(next);\n\n if (!/^\\s*fonts:\\s*BEJAMAS_ASTRO_FONTS\\b/m.test(next)) {\n next = next.replace(\n /defineConfig\\(\\s*\\{/,\n `defineConfig({\\n fonts: ${ASTRO_FONT_CONSTANT},`,\n );\n }\n\n if (options.starlightHeadOverride) {\n if (next.includes('Head: \"./src/components/Head.astro\"')) {\n return compactSource(next);\n }\n\n const starlightComponentsPattern =\n /starlight\\(\\{\\s*([\\s\\S]*?)components:\\s*\\{([\\s\\S]*?)\\}/m;\n\n if (starlightComponentsPattern.test(next)) {\n next = next.replace(\n starlightComponentsPattern,\n (_match, before, inner) =>\n `starlight({${before}components: {\\n Head: \"./src/components/Head.astro\",${inner ? `${inner}` : \"\"}\\n }`,\n );\n } else {\n next = next.replace(\n /starlight\\(\\s*\\{/,\n `starlight({\\n components: {\\n Head: \"./src/components/Head.astro\",\\n },`,\n );\n }\n }\n\n return compactSource(next);\n}\n\nexport function patchAstroLayoutSource(\n source: string,\n fontsToSerialize: ManagedAstroFont[],\n activeFontCssVariable?: string,\n) {\n let next = upsertImport(source, \"astro:assets\", \"Font\");\n const fontBlock = buildAstroLayoutFontBlock(fontsToSerialize);\n const replacedBlock = replaceManagedBlock(\n next,\n fontBlock,\n ASTRO_LAYOUT_BLOCK_START,\n ASTRO_LAYOUT_BLOCK_END,\n );\n if (replacedBlock) {\n next = replacedBlock;\n } else if (next.includes(\"<head>\")) {\n next = next.replace(\n \"<head>\",\n `<head>\\n ${fontBlock.replace(/\\n/g, \"\\n \")}`,\n );\n } else if (next.includes(\"</head>\")) {\n next = next.replace(\n \"</head>\",\n ` ${fontBlock.replace(/\\n/g, \"\\n \")}\\n</head>`,\n );\n } else {\n next = `${next}\\n${fontBlock}\\n`;\n }\n\n next = upsertManagedBodyFontClass(next, activeFontCssVariable);\n\n return compactSource(next);\n}\n\nexport function patchStarlightHeadSource(\n source: string,\n fontsToSerialize: ManagedAstroFont[],\n) {\n let next = upsertImport(\n source,\n \"@astrojs/starlight/components/Head.astro\",\n \"DefaultHead\",\n );\n next = upsertImport(next, \"astro:assets\", \"Font\");\n\n const fontBlock = buildAstroLayoutFontBlock(fontsToSerialize);\n const replacedBlock = replaceManagedBlock(\n next,\n fontBlock,\n ASTRO_LAYOUT_BLOCK_START,\n ASTRO_LAYOUT_BLOCK_END,\n );\n if (replacedBlock) {\n next = replacedBlock;\n } else if (next.includes(\"<DefaultHead\")) {\n next = next.replace(\n /<DefaultHead[^>]*\\/>/,\n (match) => `${match}\\n${fontBlock}`,\n );\n } else {\n next = `${next.trimEnd()}\\n\\n<DefaultHead />\\n${fontBlock}\\n`;\n }\n\n return compactSource(next);\n}\n\nexport function toManagedAstroFont(\n fontName: string,\n): ManagedAstroFont | null {\n const normalized = fontName.replace(/^font-heading-/, \"\").replace(/^font-/, \"\");\n const font =\n fontName.startsWith(\"font-heading-\")\n ? getHeadingFontValue(\n normalized as Exclude<DesignSystemConfig[\"fontHeading\"], \"inherit\">,\n )\n : getFontValue(normalized as DesignSystemConfig[\"font\"]);\n if (\n !font ||\n font.type !== \"registry:font\" ||\n !ASTRO_FONT_PROVIDERS.includes(\n font.font.provider as ManagedAstroFontProvider,\n )\n ) {\n return null;\n }\n\n return {\n name:\n font.title?.replace(/\\s+\\(Heading\\)$/, \"\") ??\n font.font.import.replace(/_/g, \" \"),\n cssVariable: font.font.variable,\n provider: ASTRO_FONTSOURCE_FONT_NAMES.has(\n normalized as DesignSystemConfig[\"font\"],\n )\n ? \"fontsource\"\n : \"google\",\n subsets: normalizeManagedAstroFontSubsets(font.font.subsets),\n };\n}\n\nexport function mergeManagedAstroFonts(\n currentFonts: ManagedAstroFont[],\n nextFont: ManagedAstroFont,\n) {\n const withoutSameSlot = currentFonts.filter(\n (font) => font.cssVariable !== nextFont.cssVariable,\n );\n\n return [...withoutSameSlot, nextFont].sort((left, right) =>\n left.cssVariable.localeCompare(right.cssVariable),\n );\n}\n\nexport function fontClassFromCssVariable(cssVariable: string) {\n const suffix = cssVariable.replace(/^--font-/, \"\");\n return `font-${suffix}`;\n}\n\nasync function patchFileIfExists(\n filePath: string,\n transformer: (source: string) => string,\n) {\n if (!(await fs.pathExists(filePath))) {\n return;\n }\n\n const current = await fs.readFile(filePath, \"utf8\");\n const next = transformer(current);\n if (next !== current) {\n await fs.writeFile(filePath, next, \"utf8\");\n }\n}\n\nasync function collectPackageJsonsFromComponents(projectPath: string) {\n const componentJsonFiles = await fg(\"**/components.json\", {\n cwd: projectPath,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.astro/**\"],\n });\n\n const packageJsonFiles = new Set<string>();\n\n for (const relativePath of componentJsonFiles) {\n const absolutePath = path.resolve(projectPath, relativePath);\n const current = await fs.readJson(absolutePath);\n const cssPath = current?.tailwind?.css;\n if (typeof cssPath !== \"string\" || cssPath.length === 0) {\n continue;\n }\n\n let currentDir = path.dirname(\n path.resolve(path.dirname(absolutePath), cssPath),\n );\n while (true) {\n const packageJsonPath = path.resolve(currentDir, \"package.json\");\n if (await fs.pathExists(packageJsonPath)) {\n packageJsonFiles.add(packageJsonPath);\n break;\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n }\n\n return packageJsonFiles;\n}\n\nasync function upsertStarlightHeadFile(\n projectPath: string,\n fontsToSerialize: ManagedAstroFont[],\n) {\n const headPath = path.resolve(projectPath, STARLIGHT_HEAD_RELATIVE_PATH);\n const next = patchStarlightHeadSource(\n (await fs.pathExists(headPath))\n ? await fs.readFile(headPath, \"utf8\")\n : '---\\nimport DefaultHead from \"@astrojs/starlight/components/Head.astro\";\\nimport { Font } from \"astro:assets\";\\n---\\n\\n<DefaultHead />\\n',\n fontsToSerialize,\n );\n\n await fs.ensureDir(path.dirname(headPath));\n await fs.writeFile(headPath, next, \"utf8\");\n}\n\nexport async function readManagedAstroFontsFromProject(projectPath: string) {\n for (const relativePath of ASTRO_CONFIG_CANDIDATES) {\n const absolutePath = path.resolve(projectPath, relativePath);\n if (!(await fs.pathExists(absolutePath))) {\n continue;\n }\n\n const source = await fs.readFile(absolutePath, \"utf8\");\n const parsed = parseManagedAstroFonts(source);\n if (parsed.length > 0) {\n return parsed;\n }\n }\n\n return [] as ManagedAstroFont[];\n}\n\nexport async function cleanupAstroFontPackages(projectPath: string) {\n const managedPackages = new Set(\n fonts\n .filter((font) => font.type === \"registry:font\")\n .map((font) =>\n getFontPackageName(\n font.name\n .replace(/^font-heading-/, \"\")\n .replace(/^font-/, \"\") as DesignSystemConfig[\"font\"],\n ),\n ),\n );\n\n const packageJsonFiles = await collectPackageJsonsFromComponents(projectPath);\n\n await Promise.all(\n Array.from(packageJsonFiles).map(async (absolutePath) => {\n const current = await fs.readJson(absolutePath);\n let changed = false;\n\n for (const bucket of [\"dependencies\", \"devDependencies\"] as const) {\n const currentBucket = current[bucket];\n if (!currentBucket || typeof currentBucket !== \"object\") {\n continue;\n }\n\n for (const packageName of managedPackages) {\n if (packageName in currentBucket) {\n delete currentBucket[packageName];\n changed = true;\n }\n }\n\n if (Object.keys(currentBucket).length === 0) {\n delete current[bucket];\n changed = true;\n }\n }\n\n if (changed) {\n await fs.writeJson(absolutePath, current, { spaces: 2 });\n }\n }),\n );\n}\n\nexport async function syncAstroFontsInProject(\n projectPath: string,\n fontsToSerialize: ManagedAstroFont[],\n activeFontCssVariable?: string,\n) {\n await Promise.all(\n ASTRO_CONFIG_CANDIDATES.map((relativePath) =>\n patchFileIfExists(path.resolve(projectPath, relativePath), (source) =>\n patchAstroConfigSource(source, fontsToSerialize, {\n starlightHeadOverride: relativePath === \"apps/docs/astro.config.mjs\",\n }),\n ),\n ),\n );\n\n await Promise.all(\n ASTRO_LAYOUT_CANDIDATES.map((relativePath) =>\n patchFileIfExists(path.resolve(projectPath, relativePath), (source) =>\n patchAstroLayoutSource(\n source,\n fontsToSerialize,\n activeFontCssVariable,\n ),\n ),\n ),\n );\n\n const docsConfigPath = path.resolve(\n projectPath,\n \"apps/docs/astro.config.mjs\",\n );\n if (await fs.pathExists(docsConfigPath)) {\n await upsertStarlightHeadFile(projectPath, fontsToSerialize);\n }\n}\n","import path from \"node:path\";\nimport fs from \"fs-extra\";\nimport fg from \"fast-glob\";\nimport {\n buildRegistryTheme,\n getDocumentDirection,\n getDocumentLanguage,\n getFontValue,\n getStyleId,\n type DesignSystemConfig,\n} from \"@bejamas/create-config/server\";\nimport {\n cleanupAstroFontPackages,\n fontClassFromCssVariable,\n syncAstroFontsInProject,\n toManagedAstroFont,\n} from \"@/src/utils/astro-fonts\";\nimport { BEJAMAS_COMPONENTS_SCHEMA_URL } from \"@/src/schema\";\n\nconst CREATE_BLOCK_START = \"/* bejamas:create:start */\";\nconst CREATE_BLOCK_END = \"/* bejamas:create:end */\";\nconst SHADCN_TAILWIND_IMPORT = '@import \"shadcn/tailwind.css\";';\nconst BEJAMAS_TAILWIND_IMPORT = '@import \"bejamas/tailwind.css\";';\nconst MANAGED_TAILWIND_IMPORTS = new Set([\n SHADCN_TAILWIND_IMPORT,\n BEJAMAS_TAILWIND_IMPORT,\n]);\nconst TEMPLATE_APP_UI_IMPORT = 'import { appUi } from \"@/i18n/ui\";';\n\ntype TemplateI18nVariant = \"astro\" | \"monorepo\";\n\ntype ThemeVars = ReturnType<typeof buildRegistryTheme>[\"cssVars\"];\n\nconst TEMPLATE_I18N_SOURCES: Record<TemplateI18nVariant, string> = {\n astro: `const RTL_LANGUAGES = [\"ar\", \"fa\", \"he\"] as const;\n\nexport type TemplateLanguage = \"en\" | (typeof RTL_LANGUAGES)[number];\n\nexport const CURRENT_LANGUAGE: TemplateLanguage = \"en\";\n\nconst ui = {\n en: {\n metadataTitle: \"bejamas/ui Astro project\",\n welcomeMessage: \"Welcome to {project} Astro project.\",\n getStartedMessage: \"Get started by editing src/pages/index.astro.\",\n readDocs: \"Read docs\",\n getCustomDemo: \"Get custom demo\",\n },\n ar: {\n metadataTitle: \"مشروع Astro من bejamas/ui\",\n welcomeMessage: \"مرحبًا بك في مشروع Astro الخاص بـ {project}.\",\n getStartedMessage: \"ابدأ بتحرير src/pages/index.astro.\",\n readDocs: \"اقرأ التوثيق\",\n getCustomDemo: \"احصل على عرض توضيحي مخصص\",\n },\n fa: {\n metadataTitle: \"پروژه Astro با bejamas/ui\",\n welcomeMessage: \"به پروژه Astro با {project} خوش آمدید.\",\n getStartedMessage: \"برای شروع src/pages/index.astro را ویرایش کنید.\",\n readDocs: \"مطالعه مستندات\",\n getCustomDemo: \"درخواست دموی سفارشی\",\n },\n he: {\n metadataTitle: \"פרויקט Astro עם bejamas/ui\",\n welcomeMessage: \"ברוכים הבאים לפרויקט Astro של {project}.\",\n getStartedMessage: \"התחילו בעריכת src/pages/index.astro.\",\n readDocs: \"קריאת התיעוד\",\n getCustomDemo: \"קבלת דמו מותאם\",\n },\n} as const satisfies Record<TemplateLanguage, Record<string, string>>;\n\nexport const appUi = {\n lang: CURRENT_LANGUAGE,\n dir: RTL_LANGUAGES.includes(\n CURRENT_LANGUAGE as (typeof RTL_LANGUAGES)[number],\n )\n ? \"rtl\"\n : \"ltr\",\n ...ui[CURRENT_LANGUAGE],\n};\n`,\n monorepo: `const RTL_LANGUAGES = [\"ar\", \"fa\", \"he\"] as const;\n\nexport type TemplateLanguage = \"en\" | (typeof RTL_LANGUAGES)[number];\n\nexport const CURRENT_LANGUAGE: TemplateLanguage = \"en\";\n\nconst ui = {\n en: {\n metadataTitle: \"bejamas/ui Astro project\",\n welcomeMessage: \"Welcome to {project} Astro monorepo.\",\n getStartedMessage: \"Get started by editing apps/web/src/pages/index.astro.\",\n readDocs: \"Read docs\",\n getCustomDemo: \"Get custom demo\",\n },\n ar: {\n metadataTitle: \"مشروع Astro من bejamas/ui\",\n welcomeMessage: \"مرحبًا بك في مشروع Astro الأحادي من {project}.\",\n getStartedMessage: \"ابدأ بتحرير apps/web/src/pages/index.astro.\",\n readDocs: \"اقرأ التوثيق\",\n getCustomDemo: \"احصل على عرض توضيحي مخصص\",\n },\n fa: {\n metadataTitle: \"پروژه Astro با bejamas/ui\",\n welcomeMessage: \"به مونوریپوی Astro با {project} خوش آمدید.\",\n getStartedMessage:\n \"برای شروع apps/web/src/pages/index.astro را ویرایش کنید.\",\n readDocs: \"مطالعه مستندات\",\n getCustomDemo: \"درخواست دموی سفارشی\",\n },\n he: {\n metadataTitle: \"פרויקט Astro עם bejamas/ui\",\n welcomeMessage: \"ברוכים הבאים למונורפו Astro של {project}.\",\n getStartedMessage: \"התחילו בעריכת apps/web/src/pages/index.astro.\",\n readDocs: \"קריאת התיעוד\",\n getCustomDemo: \"קבלת דמו מותאם\",\n },\n} as const satisfies Record<TemplateLanguage, Record<string, string>>;\n\nexport const appUi = {\n lang: CURRENT_LANGUAGE,\n dir: RTL_LANGUAGES.includes(\n CURRENT_LANGUAGE as (typeof RTL_LANGUAGES)[number],\n )\n ? \"rtl\"\n : \"ltr\",\n ...ui[CURRENT_LANGUAGE],\n};\n`,\n};\n\nconst TEMPLATE_PAGE_VARIANTS = [\n {\n matchers: [\n 'import { Button } from \"@/ui/button\";',\n \"Astro project.\",\n \"Get started by editing src/pages/index.astro.\",\n ],\n i18nSource: `---\nimport Layout from \"@/layouts/Layout.astro\";\nimport { appUi } from \"@/i18n/ui\";\nimport { Button } from \"@/ui/button\";\n\nconst [welcomePrefix, welcomeSuffix = \"\"] =\n appUi.welcomeMessage.split(\"{project}\");\n---\n\n<Layout>\n <div\n class=\"grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20\"\n >\n <div class=\"flex flex-col gap-6 row-start-2 items-center sm:items-start\">\n <img src=\"/bejamas.svg\" alt=\"bejamas/ui\" class=\"w-8 dark:invert\" />\n <div class=\"space-y-2\">\n <p class=\"text-sm\">\n {welcomePrefix}<code\n class=\"font-bold relative bg-muted rounded p-1\"\n >@bejamas/ui</code\n >{welcomeSuffix}\n </p>\n <p class=\"text-sm\">\n {appUi.getStartedMessage}\n </p>\n </div>\n <div class=\"flex gap-2\">\n <Button as=\"a\" href=\"https://ui.bejamas.com/docs\"\n >{appUi.readDocs}</Button\n >\n <Button as=\"a\" href=\"https://bejamas.com/get-in-touch\" variant=\"outline\"\n >{appUi.getCustomDemo}</Button\n >\n </div>\n </div>\n </div>\n</Layout>\n`,\n },\n {\n matchers: [\n 'import { Button } from \"@repo/ui/components/button\";',\n 'width=\"32\"',\n \"Astro monorepo.\",\n \"Get started by editing apps/web/src/pages/index.astro.\",\n ],\n i18nSource: `---\nimport Layout from \"@/layouts/Layout.astro\";\nimport { appUi } from \"@/i18n/ui\";\nimport { Button } from \"@repo/ui/components/button\";\n\nconst [welcomePrefix, welcomeSuffix = \"\"] =\n appUi.welcomeMessage.split(\"{project}\");\n---\n\n<Layout>\n <div\n class=\"grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20\"\n >\n <div class=\"flex flex-col gap-6 row-start-2 items-center sm:items-start\">\n <img\n src=\"/bejamas.svg\"\n alt=\"bejamas/ui\"\n class=\"w-8 dark:invert\"\n width=\"32\"\n height=\"32\"\n alt=\"bejamas/ui logo\"\n />\n <div class=\"space-y-2\">\n <p class=\"text-sm\">\n {welcomePrefix}<code\n class=\"font-bold relative bg-muted rounded p-1\"\n >@bejamas/ui</code\n >{welcomeSuffix}\n </p>\n <p class=\"text-sm\">\n {appUi.getStartedMessage}\n </p>\n </div>\n <div class=\"flex gap-2\">\n <Button as=\"a\" href=\"https://ui.bejamas.com/docs\"\n >{appUi.readDocs}</Button\n >\n <Button as=\"a\" href=\"https://bejamas.com/get-in-touch\" variant=\"outline\"\n >{appUi.getCustomDemo}</Button\n >\n </div>\n </div>\n </div>\n</Layout>\n`,\n },\n {\n matchers: [\n 'import { Button } from \"@repo/ui/components/button\";',\n '<img src=\"/bejamas.svg\" alt=\"bejamas/ui\" class=\"w-8 dark:invert\" />',\n \"Astro monorepo.\",\n \"Get started by editing apps/web/src/pages/index.astro.\",\n ],\n i18nSource: `---\nimport Layout from \"@/layouts/Layout.astro\";\nimport { appUi } from \"@/i18n/ui\";\nimport { Button } from \"@repo/ui/components/button\";\n\nconst [welcomePrefix, welcomeSuffix = \"\"] =\n appUi.welcomeMessage.split(\"{project}\");\n---\n\n<Layout>\n <div\n class=\"grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20\"\n >\n <div class=\"flex flex-col gap-6 row-start-2 items-center sm:items-start\">\n <img src=\"/bejamas.svg\" alt=\"bejamas/ui\" class=\"w-8 dark:invert\" />\n <div class=\"space-y-2\">\n <p class=\"text-sm\">\n {welcomePrefix}<code\n class=\"font-bold relative bg-muted rounded p-1\"\n >@bejamas/ui</code\n >{welcomeSuffix}\n </p>\n <p class=\"text-sm\">\n {appUi.getStartedMessage}\n </p>\n </div>\n <div class=\"flex gap-2\">\n <Button as=\"a\" href=\"https://ui.bejamas.com/docs\"\n >{appUi.readDocs}</Button\n >\n <Button as=\"a\" href=\"https://bejamas.com/get-in-touch\" variant=\"outline\"\n >{appUi.getCustomDemo}</Button\n >\n </div>\n </div>\n </div>\n</Layout>\n`,\n },\n];\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction compactCss(source: string) {\n return source.replace(/\\n{3,}/g, \"\\n\\n\").trimEnd() + \"\\n\";\n}\n\nfunction compactSource(source: string) {\n return (\n source\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trimEnd() + \"\\n\"\n );\n}\n\nfunction stripLegacyCreateBlock(source: string) {\n const fullBlockPattern = new RegExp(\n `\\\\n*${escapeRegExp(CREATE_BLOCK_START)}[\\\\s\\\\S]*?${escapeRegExp(CREATE_BLOCK_END)}\\\\n*`,\n \"m\",\n );\n const danglingBlockPattern = new RegExp(\n `\\\\n*${escapeRegExp(CREATE_BLOCK_START)}[\\\\s\\\\S]*$`,\n \"m\",\n );\n\n return compactCss(\n source\n .replace(fullBlockPattern, \"\\n\\n\")\n .replace(danglingBlockPattern, \"\\n\\n\"),\n );\n}\n\nfunction buildCssVarBlock(selector: string, vars: Record<string, string>) {\n return [\n `${selector} {`,\n ...Object.entries(vars).map(([key, value]) => ` --${key}: ${value};`),\n \"}\",\n ].join(\"\\n\");\n}\n\nfunction replaceTopLevelBlock(\n source: string,\n selector: string,\n nextBlock: string,\n) {\n const pattern = new RegExp(\n `^${escapeRegExp(selector)}\\\\s*\\\\{[\\\\s\\\\S]*?^\\\\}`,\n \"m\",\n );\n\n if (pattern.test(source)) {\n return source.replace(pattern, nextBlock);\n }\n\n const layerIndex = source.indexOf(\"@layer base\");\n if (layerIndex !== -1) {\n return `${source.slice(0, layerIndex).trimEnd()}\\n\\n${nextBlock}\\n\\n${source\n .slice(layerIndex)\n .trimStart()}`;\n }\n\n return `${source.trimEnd()}\\n\\n${nextBlock}\\n`;\n}\n\nfunction upsertImports(source: string, imports: string[]) {\n const lines = source.split(\"\\n\");\n const cleanedLines = lines.filter((line) => {\n const trimmed = line.trim();\n if (MANAGED_TAILWIND_IMPORTS.has(trimmed)) {\n return false;\n }\n\n return !trimmed.startsWith('@import \"@fontsource-variable/');\n });\n\n let insertAt = -1;\n for (let index = 0; index < cleanedLines.length; index += 1) {\n if (cleanedLines[index].trim().startsWith(\"@import \")) {\n insertAt = index;\n continue;\n }\n\n if (insertAt !== -1 && cleanedLines[index].trim() !== \"\") {\n break;\n }\n }\n\n const uniqueImports = imports.filter(\n (line, index) => imports.indexOf(line) === index,\n );\n\n if (insertAt === -1) {\n return compactCss([...uniqueImports, \"\", ...cleanedLines].join(\"\\n\"));\n }\n\n cleanedLines.splice(insertAt + 1, 0, ...uniqueImports);\n return compactCss(cleanedLines.join(\"\\n\"));\n}\n\nfunction upsertManagedTailwindImport(source: string) {\n const nextImport = resolveManagedTailwindImport(source);\n const lines = source.split(\"\\n\");\n const cleanedLines = lines.filter(\n (line) => !MANAGED_TAILWIND_IMPORTS.has(line.trim()),\n );\n\n let insertAt = -1;\n for (let index = 0; index < cleanedLines.length; index += 1) {\n if (cleanedLines[index].trim().startsWith(\"@import \")) {\n insertAt = index;\n continue;\n }\n\n if (insertAt !== -1 && cleanedLines[index].trim() !== \"\") {\n break;\n }\n }\n\n if (insertAt === -1) {\n return compactCss([nextImport, \"\", ...cleanedLines].join(\"\\n\"));\n }\n\n cleanedLines.splice(insertAt + 1, 0, nextImport);\n return compactCss(cleanedLines.join(\"\\n\"));\n}\n\nfunction resolveManagedTailwindImport(source: string) {\n if (source.includes(SHADCN_TAILWIND_IMPORT)) {\n return SHADCN_TAILWIND_IMPORT;\n }\n\n if (source.includes(BEJAMAS_TAILWIND_IMPORT)) {\n return BEJAMAS_TAILWIND_IMPORT;\n }\n\n return BEJAMAS_TAILWIND_IMPORT;\n}\n\nfunction normalizeSourceForComparison(source: string) {\n return source.replace(/\\r\\n/g, \"\\n\").replace(/\\s+/g, \" \").trim();\n}\n\nfunction upsertFrontmatterImport(source: string, importLine: string) {\n if (source.includes(importLine)) {\n return source;\n }\n\n const frontmatterEnd = source.indexOf(\"\\n---\", 3);\n if (source.startsWith(\"---\\n\") && frontmatterEnd !== -1) {\n return `${source.slice(0, frontmatterEnd).trimEnd()}\\n${importLine}${source.slice(frontmatterEnd)}`;\n }\n\n return `${importLine}\\n${source}`;\n}\n\nfunction getTemplateI18nVariant(filepath: string): TemplateI18nVariant {\n return filepath.includes(`${path.sep}apps${path.sep}web${path.sep}`)\n ? \"monorepo\"\n : \"astro\";\n}\n\nfunction buildTemplateI18nSource(\n variant: TemplateI18nVariant,\n language: string,\n) {\n return compactSource(\n TEMPLATE_I18N_SOURCES[variant].replace(\n 'export const CURRENT_LANGUAGE: TemplateLanguage = \"en\";',\n `export const CURRENT_LANGUAGE: TemplateLanguage = \"${language}\";`,\n ),\n );\n}\n\nfunction transformTemplateLayoutToI18n(source: string) {\n if (source.includes(TEMPLATE_APP_UI_IMPORT)) {\n return source;\n }\n\n let next = upsertFrontmatterImport(source, TEMPLATE_APP_UI_IMPORT);\n next = next\n .replace(/<html([^>]*?)\\slang=(\\\"[^\\\"]*\\\"|\\{[^}]+\\})([^>]*)>/, \"<html$1$3>\")\n .replace(/<html([^>]*?)\\sdir=(\\\"[^\\\"]*\\\"|\\{[^}]+\\})([^>]*)>/, \"<html$1$3>\");\n next = next.replace(\n /<html([^>]*)>/,\n \"<html$1 lang={appUi.lang} dir={appUi.dir}>\",\n );\n next = next.replace(\n /<title>[\\s\\S]*?<\\/title>/,\n \"<title>{appUi.metadataTitle}</title>\",\n );\n\n return compactSource(next);\n}\n\nfunction transformStarterPageToI18n(source: string) {\n if (source.includes(TEMPLATE_APP_UI_IMPORT)) {\n return source;\n }\n\n const normalized = normalizeSourceForComparison(source);\n const match = TEMPLATE_PAGE_VARIANTS.find((variant) =>\n variant.matchers.every((matcher) =>\n normalized.includes(normalizeSourceForComparison(matcher)),\n ),\n );\n\n if (!match) {\n return source;\n }\n\n return compactSource(match.i18nSource);\n}\n\nfunction upsertThemeInlineFont(source: string, fontVariable?: string) {\n const pattern = /@theme inline\\s*\\{[\\s\\S]*?\\n\\}/m;\n\n if (!pattern.test(source)) {\n const declarations = [\n fontVariable ? ` ${fontVariable}: var(${fontVariable});` : null,\n \" --font-heading: var(--font-heading);\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n const block = `@theme inline {\\n${declarations}\\n}`;\n const customVariantIndex = source.indexOf(\"@custom-variant\");\n\n if (customVariantIndex !== -1) {\n const nextLineIndex = source.indexOf(\"\\n\", customVariantIndex);\n return `${source.slice(0, nextLineIndex + 1).trimEnd()}\\n\\n${block}\\n\\n${source\n .slice(nextLineIndex + 1)\n .trimStart()}`;\n }\n\n return `${block}\\n\\n${source.trimStart()}`;\n }\n\n return source.replace(pattern, (block) => {\n const withoutManagedFonts = block\n .replace(/\\n\\s*--font-(sans|serif|mono|heading):[^\\n]+/g, \"\")\n .replace(/\\n\\s*--bejamas-font-family:[^\\n]+/g, \"\")\n .replace(/@theme inline\\s*\\{\\n?/, \"@theme inline {\\n\");\n const declarations = [\n fontVariable ? ` ${fontVariable}: var(${fontVariable});` : null,\n \" --font-heading: var(--font-heading);\",\n ]\n .filter(Boolean)\n .join(\"\\n\");\n\n return withoutManagedFonts.replace(\n \"@theme inline {\\n\",\n `@theme inline {\\n${declarations}\\n`,\n );\n });\n}\n\nfunction upsertBaseLayerHtmlFont(source: string, fontClass: string) {\n const pattern = /@layer base\\s*\\{[\\s\\S]*?\\n\\}/m;\n\n if (!pattern.test(source)) {\n return `${source.trimEnd()}\\n\\n@layer base {\\n .cn-font-heading {\\n @apply font-heading;\\n }\\n html {\\n @apply ${fontClass};\\n }\\n}\\n`;\n }\n\n return source.replace(pattern, (block) => {\n const htmlRulePattern = /\\n\\s*html\\s*\\{[\\s\\S]*?\\n\\s*\\}/m;\n const headingRulePattern = /\\n\\s*\\.cn-font-heading\\s*\\{[\\s\\S]*?\\n\\s*\\}/m;\n const cleanedBlock = block\n .replace(htmlRulePattern, \"\")\n .replace(headingRulePattern, \"\");\n return cleanedBlock.replace(\n /\\n\\}$/,\n `\\n .cn-font-heading {\\n @apply font-heading;\\n }\\n html {\\n @apply ${fontClass};\\n }\\n}`,\n );\n });\n}\n\nexport function transformDesignSystemCss(\n source: string,\n config: DesignSystemConfig,\n themeVars?: ThemeVars,\n) {\n const effectiveThemeVars = themeVars ?? buildRegistryTheme(config).cssVars;\n const rootVars = {\n ...Object.fromEntries(\n Object.entries(effectiveThemeVars.theme ?? {}).filter(\n ([key]) => key !== \"bejamas-font-family\",\n ),\n ),\n ...(effectiveThemeVars.light ?? {}),\n };\n const darkVars = {\n ...(effectiveThemeVars.dark ?? {}),\n };\n const font = getFontValue(config.font);\n const tailwindImport = resolveManagedTailwindImport(source);\n let next = stripLegacyCreateBlock(source);\n\n next = upsertImports(next, [tailwindImport]);\n next = replaceTopLevelBlock(\n next,\n \":root\",\n buildCssVarBlock(\":root\", rootVars),\n );\n next = replaceTopLevelBlock(\n next,\n \".dark\",\n buildCssVarBlock(\".dark\", darkVars),\n );\n next = upsertThemeInlineFont(next, font?.font.variable);\n\n if (font) {\n next = upsertBaseLayerHtmlFont(\n next,\n fontClassFromCssVariable(font.font.variable),\n );\n }\n\n return compactCss(next);\n}\n\nexport function transformAstroManagedFontCss(\n source: string,\n fontVariable?: string,\n) {\n const tailwindImport = resolveManagedTailwindImport(source);\n let next = stripLegacyCreateBlock(source);\n\n next = upsertImports(next, [tailwindImport]);\n next = upsertThemeInlineFont(next, fontVariable);\n\n if (fontVariable) {\n next = upsertBaseLayerHtmlFont(\n next,\n fontClassFromCssVariable(fontVariable),\n );\n }\n\n return compactCss(next);\n}\n\nexport function transformManagedTailwindImportCss(source: string) {\n return upsertManagedTailwindImport(source);\n}\n\nasync function patchComponentsJson(\n filepath: string,\n config: DesignSystemConfig,\n) {\n const current = await fs.readJson(filepath);\n const { rsc: _rsc, tsx: _tsx, ...normalizedCurrent } = current;\n const next = {\n ...normalizedCurrent,\n $schema: BEJAMAS_COMPONENTS_SCHEMA_URL,\n style: getStyleId(config.style),\n iconLibrary: config.iconLibrary,\n rtl: config.rtl,\n tailwind: {\n ...(current.tailwind ?? {}),\n baseColor: config.baseColor,\n cssVariables: true,\n },\n };\n\n await fs.writeJson(filepath, next, { spaces: 2 });\n}\n\nasync function patchCssFileWithTheme(\n filepath: string,\n config: DesignSystemConfig,\n themeVars?: ThemeVars,\n) {\n const current = await fs.readFile(filepath, \"utf8\");\n const next = transformDesignSystemCss(current, config, themeVars);\n await fs.writeFile(filepath, next, \"utf8\");\n}\n\nasync function patchCssFileWithAstroFont(\n filepath: string,\n fontVariable?: string,\n) {\n const current = await fs.readFile(filepath, \"utf8\");\n const next = transformAstroManagedFontCss(current, fontVariable);\n await fs.writeFile(filepath, next, \"utf8\");\n}\n\nasync function patchCssFileManagedTailwindImport(filepath: string) {\n const current = await fs.readFile(filepath, \"utf8\");\n const next = transformManagedTailwindImportCss(current);\n await fs.writeFile(filepath, next, \"utf8\");\n}\n\nexport async function syncManagedTailwindCss(projectPath: string) {\n const componentJsonFiles = await fg(\"**/components.json\", {\n cwd: projectPath,\n absolute: true,\n ignore: [\"**/node_modules/**\"],\n });\n\n await Promise.all(\n componentJsonFiles.map(async (componentJsonPath) => {\n const componentJson = await fs.readJson(componentJsonPath);\n const cssRelativePath = componentJson?.tailwind?.css;\n\n if (typeof cssRelativePath !== \"string\" || cssRelativePath.length === 0) {\n return;\n }\n\n const cssPath = path.resolve(\n path.dirname(componentJsonPath),\n cssRelativePath,\n );\n\n if (!(await fs.pathExists(cssPath))) {\n return;\n }\n\n await patchCssFileManagedTailwindImport(cssPath);\n }),\n );\n}\n\nexport async function syncAstroManagedFontCss(\n projectPath: string,\n fontVariable?: string,\n) {\n const componentJsonFiles = await fg(\"**/components.json\", {\n cwd: projectPath,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.astro/**\"],\n });\n\n const cssFiles = new Set<string>();\n\n for (const relativePath of componentJsonFiles) {\n const absolutePath = path.resolve(projectPath, relativePath);\n const json = await fs.readJson(absolutePath);\n const cssPath = json?.tailwind?.css;\n if (typeof cssPath === \"string\" && cssPath.length > 0) {\n cssFiles.add(path.resolve(path.dirname(absolutePath), cssPath));\n }\n }\n\n await Promise.all(\n Array.from(cssFiles).map((filepath) =>\n patchCssFileWithAstroFont(filepath, fontVariable),\n ),\n );\n}\n\nasync function patchTemplateI18nFile(\n filepath: string,\n config: DesignSystemConfig,\n) {\n if (!config.rtl) {\n return;\n }\n\n const nextLanguage = getDocumentLanguage(config);\n const variant = getTemplateI18nVariant(filepath);\n const nextSource = buildTemplateI18nSource(variant, nextLanguage);\n\n if (!(await fs.pathExists(filepath))) {\n await fs.ensureDir(path.dirname(filepath));\n await fs.writeFile(filepath, nextSource, \"utf8\");\n return;\n }\n\n const current = await fs.readFile(filepath, \"utf8\");\n const next = current.includes(\"export const CURRENT_LANGUAGE\")\n ? current.replace(\n /export const CURRENT_LANGUAGE: TemplateLanguage = \"[^\"]+\";/,\n `export const CURRENT_LANGUAGE: TemplateLanguage = \"${nextLanguage}\";`,\n )\n : nextSource;\n\n if (next !== current) {\n await fs.writeFile(filepath, next, \"utf8\");\n }\n}\n\nasync function patchLayoutFile(filepath: string, config: DesignSystemConfig) {\n if (!(await fs.pathExists(filepath))) {\n return;\n }\n\n const current = await fs.readFile(filepath, \"utf8\");\n if (current.includes('from \"@/i18n/ui\"')) {\n return;\n }\n\n if (config.rtl) {\n const next = transformTemplateLayoutToI18n(current);\n\n if (next !== current) {\n await fs.writeFile(filepath, next, \"utf8\");\n }\n\n return;\n }\n\n const nextLanguage = getDocumentLanguage(config);\n const nextDirection = getDocumentDirection(config);\n let next = current\n .replace(/<html([^>]*?)lang=\"[^\"]*\"([^>]*)>/, \"<html$1$2>\")\n .replace(/<html([^>]*?)dir=\"[^\"]*\"([^>]*)>/, \"<html$1$2>\");\n\n next = next.replace(\n /<html([^>]*)>/,\n `<html$1 lang=\"${nextLanguage}\"${config.rtl ? ` dir=\"${nextDirection}\"` : \"\"}>`,\n );\n\n if (next !== current) {\n await fs.writeFile(filepath, next, \"utf8\");\n }\n}\n\nasync function patchStarterPageFile(\n filepath: string,\n config: DesignSystemConfig,\n) {\n if (!config.rtl || !(await fs.pathExists(filepath))) {\n return;\n }\n\n const current = await fs.readFile(filepath, \"utf8\");\n const next = transformStarterPageToI18n(current);\n\n if (next !== current) {\n await fs.writeFile(filepath, next, \"utf8\");\n }\n}\n\nexport async function applyDesignSystemToProject(\n projectPath: string,\n config: DesignSystemConfig,\n options: {\n themeVars?: ThemeVars;\n } = {},\n) {\n const componentJsonFiles = await fg(\"**/components.json\", {\n cwd: projectPath,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/.astro/**\"],\n });\n\n const cssFiles = new Set<string>();\n\n for (const relativePath of componentJsonFiles) {\n const absolutePath = path.resolve(projectPath, relativePath);\n await patchComponentsJson(absolutePath, config);\n\n const json = await fs.readJson(absolutePath);\n const cssPath = json?.tailwind?.css;\n if (typeof cssPath === \"string\" && cssPath.length > 0) {\n const absoluteCssPath = path.resolve(path.dirname(absolutePath), cssPath);\n cssFiles.add(absoluteCssPath);\n }\n }\n\n await Promise.all(\n Array.from(cssFiles).map((filepath) =>\n patchCssFileWithTheme(filepath, config, options.themeVars),\n ),\n );\n await Promise.all(\n [\n path.resolve(projectPath, \"src/i18n/ui.ts\"),\n path.resolve(projectPath, \"apps/web/src/i18n/ui.ts\"),\n ].map((filepath) => patchTemplateI18nFile(filepath, config)),\n );\n\n await Promise.all(\n [\n path.resolve(projectPath, \"src/layouts/Layout.astro\"),\n path.resolve(projectPath, \"apps/web/src/layouts/Layout.astro\"),\n ].map((filepath) => patchLayoutFile(filepath, config)),\n );\n await Promise.all(\n [\n path.resolve(projectPath, \"src/pages/index.astro\"),\n path.resolve(projectPath, \"apps/web/src/pages/index.astro\"),\n ].map((filepath) => patchStarterPageFile(filepath, config)),\n );\n\n const managedFonts = [\n toManagedAstroFont(config.font),\n config.fontHeading !== \"inherit\"\n ? toManagedAstroFont(`font-heading-${config.fontHeading}`)\n : null,\n ].filter((font): font is NonNullable<typeof font> => font !== null);\n const managedFont = managedFonts.find(\n (font) => font.cssVariable !== \"--font-heading\",\n );\n\n if (managedFonts.length > 0 && managedFont) {\n await syncAstroFontsInProject(\n projectPath,\n managedFonts,\n managedFont.cssVariable,\n );\n await cleanupAstroFontPackages(projectPath);\n }\n}\n","import {\n ICON_LIBRARY_COLLECTIONS,\n SEMANTIC_ICON_NAMES,\n getSemanticIconNameFromLucideExport,\n getSemanticIconNameFromLucidePath,\n renderSemanticIconSvgWithAttributeString,\n type IconLibraryName,\n type SemanticIconName,\n} from \"@bejamas/semantic-icons\";\n\nconst FRONTMATTER_PATTERN = /^---\\s*\\n([\\s\\S]*?)\\n---/;\n\ntype IconUsage = {\n localName: string;\n semanticName: ReturnType<typeof getSemanticIconNameFromLucideExport>;\n};\n\nexport function rewriteAstroIcons(content: string, iconLibrary: string) {\n if (!(iconLibrary in ICON_LIBRARY_COLLECTIONS)) {\n return content;\n }\n\n const library = iconLibrary as IconLibraryName;\n const shouldRewriteLucideImports = library !== \"lucide\";\n const frontmatterMatch = content.match(FRONTMATTER_PATTERN);\n\n if (!frontmatterMatch) {\n return content;\n }\n\n let frontmatter = frontmatterMatch[1];\n let body = content.slice(frontmatterMatch[0].length);\n const iconUsages: IconUsage[] = [];\n const semanticIconImports: string[] = [];\n\n if (shouldRewriteLucideImports) {\n frontmatter = frontmatter.replace(\n /^\\s*import\\s+([A-Za-z0-9_$]+)\\s+from\\s+[\"']@lucide\\/astro\\/icons\\/([^\"']+)[\"'];?\\s*$/gm,\n (full, localName, iconPath) => {\n const semanticName = getSemanticIconNameFromLucidePath(iconPath);\n\n if (!semanticName) {\n return full;\n }\n\n iconUsages.push({ localName, semanticName });\n return \"\";\n },\n );\n\n frontmatter = frontmatter.replace(\n /import\\s+\\{([^}]*)\\}\\s+from\\s+[\"']@lucide\\/astro[\"'];?/g,\n (full, importsBlock) => {\n const keptImports: string[] = [];\n\n for (const rawImport of importsBlock.split(\",\")) {\n const trimmedImport = rawImport.trim();\n if (!trimmedImport) {\n continue;\n }\n\n const aliasMatch = trimmedImport.match(\n /^([A-Za-z0-9_$]+)(?:\\s+as\\s+([A-Za-z0-9_$]+))?$/,\n );\n\n if (!aliasMatch) {\n keptImports.push(trimmedImport);\n continue;\n }\n\n const [, importedName, localAlias] = aliasMatch;\n const semanticName = getSemanticIconNameFromLucideExport(importedName);\n\n if (!semanticName) {\n keptImports.push(trimmedImport);\n continue;\n }\n\n iconUsages.push({\n localName: localAlias ?? importedName,\n semanticName,\n });\n }\n\n if (!keptImports.length) {\n return \"\";\n }\n\n return `import { ${keptImports.join(\", \")} } from \"@lucide/astro\";`;\n },\n );\n }\n\n frontmatter = frontmatter.replace(\n /^\\s*import\\s+([A-Za-z0-9_$]+)\\s+from\\s+[\"'][^\"']*SemanticIcon\\.astro[\"'];?\\s*$/gm,\n (_full, localName) => {\n semanticIconImports.push(localName);\n return \"\";\n },\n );\n\n if (!iconUsages.length && !semanticIconImports.length) {\n return content;\n }\n\n for (const { localName, semanticName } of iconUsages.sort(\n (left, right) => right.localName.length - left.localName.length,\n )) {\n const selfClosingPattern = new RegExp(\n `<${localName}(\\\\s[^>]*?)?\\\\s*/>`,\n \"g\",\n );\n const pairedPattern = new RegExp(\n `<${localName}(\\\\s[^>]*?)?>([\\\\s\\\\S]*?)<\\\\/${localName}>`,\n \"g\",\n );\n\n body = body.replace(selfClosingPattern, (_full, attributeString = \"\") =>\n renderSemanticIconSvgWithAttributeString(\n library,\n semanticName,\n attributeString,\n ),\n );\n\n body = body.replace(pairedPattern, (_full, attributeString = \"\") =>\n renderSemanticIconSvgWithAttributeString(\n library,\n semanticName,\n attributeString,\n ),\n );\n }\n\n for (const localName of semanticIconImports.sort(\n (left, right) => right.length - left.length,\n )) {\n const selfClosingPattern = new RegExp(\n `<${localName}(\\\\s[^>]*?)?\\\\s*/>`,\n \"g\",\n );\n const pairedPattern = new RegExp(\n `<${localName}(\\\\s[^>]*?)?>([\\\\s\\\\S]*?)<\\\\/${localName}>`,\n \"g\",\n );\n\n body = body.replace(selfClosingPattern, (full, attributeString = \"\") =>\n renderSemanticIconUsage(full, library, attributeString),\n );\n\n body = body.replace(pairedPattern, (full, attributeString = \"\") =>\n renderSemanticIconUsage(full, library, attributeString),\n );\n }\n\n const normalizedFrontmatter = frontmatter\n .split(\"\\n\")\n .filter((line, index, lines) => {\n if (line.trim().length > 0) {\n return true;\n }\n\n const previousLine = lines[index - 1];\n return previousLine?.trim().length > 0;\n })\n .join(\"\\n\")\n .trim();\n\n return `---\\n${normalizedFrontmatter}\\n---${body}`;\n}\n\nfunction renderSemanticIconUsage(\n original: string,\n library: IconLibraryName,\n attributeString = \"\",\n) {\n const semanticName = attributeString.match(\n /\\sname=([\"'])([^\"']+)\\1/,\n )?.[2] as SemanticIconName | undefined;\n\n if (!semanticName || !SEMANTIC_ICON_NAMES.includes(semanticName)) {\n return original;\n }\n\n const normalizedAttributeString = attributeString\n .replace(/\\sname=([\"'])[^\"']+\\1/g, \"\")\n .replace(/\\slibrary=([\"'])[^\"']+\\1/g, \"\")\n .replace(/\\sdata-icon-library=([\"'])[^\"']+\\1/g, \"\")\n .trim();\n\n return renderSemanticIconSvgWithAttributeString(\n library,\n semanticName,\n normalizedAttributeString,\n );\n}\n","const TRANSLUCENT_CLASSES = [\n \"animate-none!\",\n \"relative\",\n \"bg-popover/70\",\n \"before:pointer-events-none\",\n \"before:absolute\",\n \"before:inset-0\",\n \"before:-z-1\",\n \"before:rounded-[inherit]\",\n \"before:backdrop-blur-2xl\",\n \"before:backdrop-saturate-150\",\n \"**:data-[slot$=-item]:focus:bg-foreground/10\",\n \"**:data-[slot$=-item]:data-highlighted:bg-foreground/10\",\n \"**:data-[slot$=-separator]:bg-foreground/5\",\n \"**:data-[slot$=-trigger]:focus:bg-foreground/10\",\n \"**:data-[slot$=-trigger]:aria-expanded:bg-foreground/10!\",\n \"**:data-[variant=destructive]:focus:bg-foreground/10!\",\n \"**:data-[variant=destructive]:text-accent-foreground!\",\n \"**:data-[variant=destructive]:**:text-accent-foreground!\",\n];\n\nfunction transformMenuTokens(tokens: string[], menuColor?: string) {\n const transformed: string[] = [];\n\n for (const token of tokens) {\n if (token === \"cn-menu-target\") {\n if (menuColor === \"inverted\") {\n transformed.push(\"dark\");\n } else if (menuColor === \"default-translucent\") {\n transformed.push(...TRANSLUCENT_CLASSES);\n } else if (menuColor === \"inverted-translucent\") {\n transformed.push(\"dark\", ...TRANSLUCENT_CLASSES);\n }\n continue;\n }\n\n if (token === \"cn-menu-translucent\") {\n if (\n menuColor === \"default-translucent\" ||\n menuColor === \"inverted-translucent\"\n ) {\n transformed.push(...TRANSLUCENT_CLASSES);\n }\n continue;\n }\n\n transformed.push(token);\n }\n\n return Array.from(new Set(transformed));\n}\n\nexport function rewriteAstroMenus(content: string, menuColor?: string) {\n if (\n !content.includes(\"cn-menu-target\") &&\n !content.includes(\"cn-menu-translucent\")\n ) {\n return content;\n }\n\n return content.replace(/([\"'])([^\"']*\\bcn-menu-(?:target|translucent)\\b[^\"']*)\\1/g, (_match, quote, classes) => {\n const transformed = transformMenuTokens(\n String(classes)\n .split(/\\s+/)\n .filter(Boolean),\n menuColor,\n );\n\n return `${quote}${transformed.join(\" \")}${quote}`;\n });\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport fg from \"fast-glob\";\nimport { logger } from \"@/src/utils/logger\";\nimport { Config, getConfig } from \"@/src/utils/get-config\";\nimport { rewriteAstroIcons } from \"@/src/utils/icon-transform\";\nimport { rewriteAstroMenus } from \"@/src/utils/menu-transform\";\n\nexport function updateImportAliases(\n moduleSpecifier: string,\n config: Config,\n isRemote: boolean = false,\n) {\n // Not a local import.\n if (!moduleSpecifier.startsWith(\"@/\") && !isRemote) {\n return moduleSpecifier;\n }\n\n // This treats the remote as coming from a faux registry.\n let specifier = moduleSpecifier;\n if (isRemote && specifier.startsWith(\"@/\")) {\n specifier = specifier.replace(\n /^@\\//,\n `@/registry/${config.style || \"bejamas-juno\"}/`,\n );\n }\n\n // Not a registry import.\n if (!specifier.startsWith(\"@/registry/\")) {\n // We fix the alias and return.\n const alias = config.aliases.components.split(\"/\")[0];\n return specifier.replace(/^@\\//, `${alias}/`);\n }\n\n if (specifier.match(/^@\\/registry\\/(.+)\\/ui/)) {\n return specifier.replace(\n /^@\\/registry\\/(.+)\\/ui/,\n config.aliases.ui ?? `${config.aliases.components}/ui`,\n );\n }\n\n if (\n config.aliases.components &&\n specifier.match(/^@\\/registry\\/(.+)\\/components/)\n ) {\n return specifier.replace(\n /^@\\/registry\\/(.+)\\/components/,\n config.aliases.components,\n );\n }\n\n if (config.aliases.lib && specifier.match(/^@\\/registry\\/(.+)\\/lib/)) {\n return specifier.replace(/^@\\/registry\\/(.+)\\/lib/, config.aliases.lib);\n }\n\n if (config.aliases.hooks && specifier.match(/^@\\/registry\\/(.+)\\/hooks/)) {\n return specifier.replace(/^@\\/registry\\/(.+)\\/hooks/, config.aliases.hooks);\n }\n\n return specifier.replace(/^@\\/registry\\/[^/]+/, config.aliases.components);\n}\n\nexport function rewriteAstroImports(content: string, config: Config) {\n let updated = content;\n\n const utilsAlias = config.aliases?.utils;\n const workspaceAlias =\n typeof utilsAlias === \"string\" && utilsAlias.includes(\"/\")\n ? utilsAlias.split(\"/\")[0]\n : \"@\";\n const utilsImport = `${workspaceAlias}/lib/utils`;\n\n // Handle standard imports with specifiers, e.g. `import { x } from \"path\"`\n updated = updated.replace(\n /import\\s+([\\s\\S]*?)\\s+from\\s+[\"']([^\"']+)[\"']/g,\n (full, importsPart, specifier) => {\n const next = updateImportAliases(specifier, config, false);\n\n let finalSpec = next;\n const includesCn =\n typeof importsPart === \"string\" &&\n importsPart.split(/[{},\\s]/).some((part: string) => part === \"cn\");\n\n if (\n includesCn &&\n config.aliases.utils &&\n (next === utilsImport || next === \"@/lib/utils\")\n ) {\n finalSpec =\n utilsImport === next\n ? next.replace(utilsImport, config.aliases.utils)\n : config.aliases.utils;\n }\n\n if (finalSpec === specifier) return full;\n return full.replace(specifier, finalSpec);\n },\n );\n\n // Handle bare imports, e.g. `import \"path\"`\n updated = updated.replace(/import\\s+[\"']([^\"']+)[\"']/g, (full, specifier) => {\n const next = updateImportAliases(specifier, config, false);\n if (next === specifier) return full;\n return full.replace(specifier, next);\n });\n\n updated = rewriteAstroMenus(updated, config.menuColor);\n\n return rewriteAstroIcons(updated, config.iconLibrary);\n}\n\nexport async function fixAstroImports(cwd: string, isVerbose: boolean) {\n const config = await getConfig(cwd);\n if (!config) return;\n\n const searchRoots = new Set<string>([\n config.resolvedPaths.components,\n config.resolvedPaths.ui,\n ]);\n\n for (const root of Array.from(searchRoots)) {\n if (!root) continue;\n const astroFiles = await fg(\"**/*.astro\", {\n cwd: root,\n absolute: true,\n dot: false,\n });\n\n for (const filePath of astroFiles) {\n const original = await fs.readFile(filePath, \"utf8\");\n const rewritten = rewriteAstroImports(original, config);\n if (rewritten === original) continue;\n await fs.writeFile(filePath, rewritten, \"utf8\");\n if (isVerbose) {\n logger.info(\n `[bejamas-ui] fixed imports in ${path.relative(cwd, filePath)}`,\n );\n }\n }\n }\n}\n","import { detect } from \"@antfu/ni\";\n\nexport async function getPackageManager(\n targetDir: string,\n { withFallback }: { withFallback?: boolean } = {\n withFallback: false,\n },\n): Promise<\"yarn\" | \"pnpm\" | \"bun\" | \"npm\" | \"deno\"> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir });\n\n if (packageManager === \"yarn@berry\") return \"yarn\";\n if (packageManager === \"pnpm@6\") return \"pnpm\";\n if (packageManager === \"bun\") return \"bun\";\n if (packageManager === \"deno\") return \"deno\";\n if (!withFallback) {\n return packageManager ?? \"npm\";\n }\n\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || \"\";\n\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\";\n }\n\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\";\n }\n\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\";\n }\n\n return \"npm\";\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd);\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\";\n\n if (packageManager === \"bun\") return \"bunx\";\n\n return \"npx\";\n}\n","import { z } from \"zod\";\n\n// Error codes for programmatic error handling\nexport const RegistryErrorCode = {\n // Network errors\n NETWORK_ERROR: \"NETWORK_ERROR\",\n NOT_FOUND: \"NOT_FOUND\",\n UNAUTHORIZED: \"UNAUTHORIZED\",\n FORBIDDEN: \"FORBIDDEN\",\n FETCH_ERROR: \"FETCH_ERROR\",\n\n // Configuration errors\n NOT_CONFIGURED: \"NOT_CONFIGURED\",\n INVALID_CONFIG: \"INVALID_CONFIG\",\n MISSING_ENV_VARS: \"MISSING_ENV_VARS\",\n\n // File system errors\n LOCAL_FILE_ERROR: \"LOCAL_FILE_ERROR\",\n\n // Parsing errors\n PARSE_ERROR: \"PARSE_ERROR\",\n VALIDATION_ERROR: \"VALIDATION_ERROR\",\n\n // Generic errors\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type RegistryErrorCode =\n (typeof RegistryErrorCode)[keyof typeof RegistryErrorCode];\n\nexport class RegistryError extends Error {\n public readonly code: RegistryErrorCode;\n public readonly statusCode?: number;\n public readonly context?: Record<string, unknown>;\n public readonly suggestion?: string;\n public readonly timestamp: Date;\n public readonly cause?: unknown;\n\n constructor(\n message: string,\n options: {\n code?: RegistryErrorCode;\n statusCode?: number;\n cause?: unknown;\n context?: Record<string, unknown>;\n suggestion?: string;\n } = {},\n ) {\n super(message);\n this.name = \"RegistryError\";\n this.code = options.code || RegistryErrorCode.UNKNOWN_ERROR;\n this.statusCode = options.statusCode;\n this.cause = options.cause;\n this.context = options.context;\n this.suggestion = options.suggestion;\n this.timestamp = new Date();\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n context: this.context,\n suggestion: this.suggestion,\n timestamp: this.timestamp,\n stack: this.stack,\n };\n }\n}\n\nexport class RegistryNotFoundError extends RegistryError {\n constructor(\n public readonly url: string,\n cause?: unknown,\n ) {\n const message = `The item at ${url} was not found. It may not exist at the registry.`;\n\n super(message, {\n code: RegistryErrorCode.NOT_FOUND,\n statusCode: 404,\n cause,\n context: { url },\n suggestion:\n \"Check if the item name is correct and the registry URL is accessible.\",\n });\n this.name = \"RegistryNotFoundError\";\n }\n}\n\nexport class RegistryUnauthorizedError extends RegistryError {\n constructor(\n public readonly url: string,\n cause?: unknown,\n ) {\n const message = `You are not authorized to access the item at ${url}. If this is a remote registry, you may need to authenticate.`;\n\n super(message, {\n code: RegistryErrorCode.UNAUTHORIZED,\n statusCode: 401,\n cause,\n context: { url },\n suggestion:\n \"Check your authentication credentials and environment variables.\",\n });\n this.name = \"RegistryUnauthorizedError\";\n }\n}\n\nexport class RegistryForbiddenError extends RegistryError {\n constructor(\n public readonly url: string,\n cause?: unknown,\n ) {\n const message = `You are not authorized to access the item at ${url}. If this is a remote registry, you may need to authenticate.`;\n\n super(message, {\n code: RegistryErrorCode.FORBIDDEN,\n statusCode: 403,\n cause,\n context: { url },\n suggestion:\n \"Check your authentication credentials and environment variables.\",\n });\n this.name = \"RegistryForbiddenError\";\n }\n}\n\nexport class RegistryFetchError extends RegistryError {\n constructor(\n public readonly url: string,\n statusCode?: number,\n public readonly responseBody?: string,\n cause?: unknown,\n ) {\n // Use the error detail from the server if available\n const baseMessage = statusCode\n ? `Failed to fetch from registry (${statusCode}): ${url}`\n : `Failed to fetch from registry: ${url}`;\n\n const message =\n typeof cause === \"string\" && cause\n ? `${baseMessage} - ${cause}`\n : baseMessage;\n\n let suggestion = \"Check your network connection and try again.\";\n if (statusCode === 404) {\n suggestion =\n \"The requested resource was not found. Check the URL or item name.\";\n } else if (statusCode === 500) {\n suggestion = \"The registry server encountered an error. Try again later.\";\n } else if (statusCode && statusCode >= 400 && statusCode < 500) {\n suggestion = \"There was a client error. Check your request parameters.\";\n }\n\n super(message, {\n code: RegistryErrorCode.FETCH_ERROR,\n statusCode,\n cause,\n context: { url, responseBody },\n suggestion,\n });\n this.name = \"RegistryFetchError\";\n }\n}\n\nexport class RegistryNotConfiguredError extends RegistryError {\n constructor(public readonly registryName: string | null) {\n const message = registryName\n ? `Unknown registry \"${registryName}\". Make sure it is defined in components.json as follows:\n{\n \"registries\": {\n \"${registryName}\": \"[URL_TO_REGISTRY]\"\n }\n}`\n : `Unknown registry. Make sure it is defined in components.json under \"registries\".`;\n\n super(message, {\n code: RegistryErrorCode.NOT_CONFIGURED,\n context: { registryName },\n suggestion:\n \"Add the registry configuration to your components.json file. Consult the registry documentation for the correct format.\",\n });\n this.name = \"RegistryNotConfiguredError\";\n }\n}\n\nexport class RegistryLocalFileError extends RegistryError {\n constructor(\n public readonly filePath: string,\n cause?: unknown,\n ) {\n super(`Failed to read local registry file: ${filePath}`, {\n code: RegistryErrorCode.LOCAL_FILE_ERROR,\n cause,\n context: { filePath },\n suggestion: \"Check if the file exists and you have read permissions.\",\n });\n this.name = \"RegistryLocalFileError\";\n }\n}\n\nexport class RegistryParseError extends RegistryError {\n public readonly parseError: unknown;\n\n constructor(\n public readonly item: string,\n parseError: unknown,\n ) {\n let message = `Failed to parse registry item: ${item}`;\n\n if (parseError instanceof z.ZodError) {\n message = `Failed to parse registry item: ${item}\\n${parseError.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}`;\n }\n\n super(message, {\n code: RegistryErrorCode.PARSE_ERROR,\n cause: parseError,\n context: { item },\n suggestion:\n \"The registry item may be corrupted or have an invalid format. Please make sure it returns a valid JSON object. See https://ui.shadcn.com/schema/registry-item.json.\",\n });\n\n this.parseError = parseError;\n this.name = \"RegistryParseError\";\n }\n}\n\nexport class RegistryMissingEnvironmentVariablesError extends RegistryError {\n constructor(\n public readonly registryName: string,\n public readonly missingVars: string[],\n ) {\n const message =\n `Registry \"${registryName}\" requires the following environment variables:\\n\\n` +\n missingVars.map((v) => ` • ${v}`).join(\"\\n\");\n\n super(message, {\n code: RegistryErrorCode.MISSING_ENV_VARS,\n context: { registryName, missingVars },\n suggestion:\n \"Set the required environment variables to your .env or .env.local file.\",\n });\n this.name = \"RegistryMissingEnvironmentVariablesError\";\n }\n}\n\nexport class RegistryInvalidNamespaceError extends RegistryError {\n constructor(public readonly name: string) {\n const message = `Invalid registry namespace: \"${name}\". Registry names must start with @ (e.g., @shadcn, @v0).`;\n\n super(message, {\n code: RegistryErrorCode.VALIDATION_ERROR,\n context: { name },\n suggestion:\n \"Use a valid registry name starting with @ or provide a direct URL to the registry.\",\n });\n this.name = \"RegistryInvalidNamespaceError\";\n }\n}\n\nexport class ConfigMissingError extends RegistryError {\n constructor(public readonly cwd: string) {\n const message = `No components.json found in ${cwd} or parent directories.`;\n\n super(message, {\n code: RegistryErrorCode.NOT_CONFIGURED,\n context: { cwd },\n suggestion:\n \"Run 'npx bejamas init' to create a components.json file, or check that you're in the correct directory.\",\n });\n this.name = \"ConfigMissingError\";\n }\n}\n\nexport class ConfigParseError extends RegistryError {\n constructor(\n public readonly cwd: string,\n parseError: unknown,\n ) {\n let message = `Invalid components.json configuration in ${cwd}.`;\n\n if (parseError instanceof z.ZodError) {\n message = `Invalid components.json configuration in ${cwd}:\\n${parseError.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}`;\n }\n\n super(message, {\n code: RegistryErrorCode.INVALID_CONFIG,\n cause: parseError,\n context: { cwd },\n suggestion:\n \"Check your components.json file for syntax errors or invalid configuration. Run 'npx bejamas init' to regenerate a valid configuration.\",\n });\n this.name = \"ConfigParseError\";\n }\n}\n","import { RegistryError } from \"@/src/registry/errors\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { logger } from \"@/src/utils/logger\";\nimport { z } from \"zod\";\n\nexport function handleError(error: unknown) {\n logger.break();\n logger.error(\n `Something went wrong. Please check the error below for more details.`,\n );\n logger.error(\n `If the problem persists, please open an issue on GitHub: https://github.com/bejamas/ui/issues`,\n );\n logger.error(\"\");\n if (typeof error === \"string\") {\n logger.error(error);\n logger.break();\n process.exit(1);\n }\n\n if (error instanceof RegistryError) {\n if (error.message) {\n logger.error(error.cause ? \"Error:\" : \"Message:\");\n logger.error(error.message);\n }\n\n if (error.cause) {\n logger.error(\"\\nMessage:\");\n logger.error(error.cause);\n }\n\n if (error.suggestion) {\n logger.error(\"\\nSuggestion:\");\n logger.error(error.suggestion);\n }\n logger.break();\n process.exit(1);\n }\n\n if (error instanceof z.ZodError) {\n logger.error(\"Validation failed:\");\n for (const [key, value] of Object.entries(error.flatten().fieldErrors)) {\n logger.error(`- ${highlighter.info(key)}: ${value}`);\n }\n logger.break();\n process.exit(1);\n }\n\n if (error instanceof Error) {\n logger.error(error.message);\n logger.break();\n process.exit(1);\n }\n\n logger.break();\n process.exit(1);\n}\n","import os from \"os\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\nimport dotenv from \"dotenv\";\nimport { initOptionsSchema } from \"@/src/commands/init\";\nimport { getPackageManager } from \"@/src/utils/get-package-manager\";\nimport { handleError } from \"@/src/utils/handle-error\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { logger } from \"@/src/utils/logger\";\nimport { spinner } from \"@/src/utils/spinner\";\nimport { execa } from \"execa\";\nimport fg from \"fast-glob\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport { z } from \"zod\";\n\nexport const TEMPLATES = {\n astro: \"astro\",\n \"astro-monorepo\": \"astro-monorepo\",\n \"astro-with-component-docs-monorepo\": \"astro-with-component-docs-monorepo\",\n} as const;\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = path.dirname(__filename);\n\nfunction resolveLocalTemplatesDir() {\n for (const relativePath of [\n \"../../../../templates\",\n \"../../../templates\",\n \"../../templates\",\n ]) {\n const candidate = path.resolve(__dirname, relativePath);\n if (fs.existsSync(candidate)) {\n return candidate;\n }\n }\n\n return path.resolve(__dirname, \"../../../../templates\");\n}\n\nconst LOCAL_TEMPLATES_DIR = resolveLocalTemplatesDir();\n\nasync function applyLocalPackageOverrides(projectPath: string) {\n const bejamasPackageOverride = process.env.BEJAMAS_PACKAGE_OVERRIDE;\n\n if (!bejamasPackageOverride) {\n return;\n }\n\n const packageJsonPaths = await fg(\"**/package.json\", {\n cwd: projectPath,\n absolute: true,\n ignore: [\"**/node_modules/**\"],\n });\n const normalizedOverride = bejamasPackageOverride.replace(/\\\\/g, \"/\");\n\n await Promise.all(\n packageJsonPaths.map(async (packageJsonPath) => {\n const packageJson = await fs.readJson(packageJsonPath);\n let changed = false;\n\n for (const field of [\"dependencies\", \"devDependencies\"] as const) {\n if (packageJson[field]?.bejamas) {\n packageJson[field].bejamas = `file:${normalizedOverride}`;\n changed = true;\n }\n }\n\n if (changed) {\n await fs.writeJson(packageJsonPath, packageJson, { spaces: 2 });\n }\n }),\n );\n}\n\nexport async function createProject(\n options: Pick<\n z.infer<typeof initOptionsSchema>,\n \"cwd\" | \"force\" | \"srcDir\" | \"components\" | \"template\"\n >,\n) {\n options = {\n srcDir: false,\n ...options,\n };\n\n let template: keyof typeof TEMPLATES =\n options.template && TEMPLATES[options.template as keyof typeof TEMPLATES]\n ? (options.template as keyof typeof TEMPLATES)\n : \"astro\";\n\n let projectName: string = \"my-app\";\n\n const isRemoteComponent =\n options.components?.length === 1 &&\n !!options.components[0].match(/\\/chat\\/b\\//);\n\n if (!options.force) {\n const { type, name } = await prompts([\n {\n type: options.template || isRemoteComponent ? null : \"select\",\n name: \"type\",\n message: `The path ${highlighter.info(\n options.cwd,\n )} does not contain a package.json file.\\n Would you like to start a new project?`,\n choices: [\n { title: \"Astro\", value: \"astro\" },\n { title: \"Astro (Monorepo)\", value: \"astro-monorepo\" },\n {\n title: \"Astro with Component Docs (Monorepo)\",\n value: \"astro-with-component-docs-monorepo\",\n },\n ],\n initial: 0,\n },\n {\n type: \"text\",\n name: \"name\",\n message: \"What is your project named?\",\n initial: (_prev: any, values: any) => {\n const selectedTemplate: string =\n (options.template &&\n TEMPLATES[options.template as keyof typeof TEMPLATES] &&\n options.template) ||\n values.type ||\n template;\n return selectedTemplate?.endsWith(\"monorepo\")\n ? \"my-monorepo\"\n : \"my-app\";\n },\n format: (value: string) => value.trim(),\n validate: (value: string) =>\n value.length > 128\n ? `Name should be less than 128 characters.`\n : true,\n },\n ]);\n\n template = type ?? template;\n projectName = name;\n }\n\n const packageManager = await getPackageManager(options.cwd, {\n withFallback: true,\n });\n\n const projectPath = `${options.cwd}/${projectName}`;\n\n // Check if path is writable.\n try {\n await fs.access(options.cwd, fs.constants.W_OK);\n } catch (error) {\n logger.break();\n logger.error(`The path ${highlighter.info(options.cwd)} is not writable.`);\n logger.error(\n `It is likely you do not have write permissions for this folder or the path ${highlighter.info(\n options.cwd,\n )} does not exist.`,\n );\n logger.break();\n process.exit(1);\n }\n\n if (fs.existsSync(path.resolve(options.cwd, projectName, \"package.json\"))) {\n logger.break();\n logger.error(\n `A project with the name ${highlighter.info(projectName)} already exists.`,\n );\n logger.error(`Please choose a different name and try again.`);\n logger.break();\n process.exit(1);\n }\n\n await createProjectFromTemplate(projectPath, {\n templateKey: template,\n packageManager,\n cwd: options.cwd,\n });\n\n return {\n projectPath,\n projectName,\n template,\n };\n}\n\nasync function createProjectFromTemplate(\n projectPath: string,\n options: {\n templateKey: keyof typeof TEMPLATES;\n packageManager: string;\n cwd: string;\n },\n) {\n const createSpinner = spinner(\n `Creating a new project from template. This may take a few minutes.`,\n ).start();\n\n const TEMPLATE_DIRNAME: Record<keyof typeof TEMPLATES, string> = {\n astro: \"astro\",\n \"astro-monorepo\": \"monorepo-astro\",\n \"astro-with-component-docs-monorepo\": \"monorepo-astro-with-docs\",\n };\n\n try {\n dotenv.config({ quiet: true });\n const templatePath = path.join(\n os.tmpdir(),\n `bejamas-template-${Date.now()}`,\n );\n const templateSource = path.resolve(\n LOCAL_TEMPLATES_DIR,\n TEMPLATE_DIRNAME[options.templateKey],\n );\n\n if (!(await fs.pathExists(templateSource))) {\n throw new Error(`Local template not found: ${templateSource}`);\n }\n\n await fs.copy(templateSource, projectPath, {\n filter: (source) => {\n const basename = path.basename(source);\n return basename !== \"node_modules\" && basename !== \".astro\";\n },\n });\n\n await removeEmptyTemplateI18nDirs(projectPath);\n\n await applyLocalPackageOverrides(projectPath);\n\n await fs.remove(templatePath);\n\n await execa(options.packageManager, [\"install\"], {\n cwd: projectPath,\n });\n\n try {\n // Detect if we're inside an existing git repo; if yes, skip initializing a nested repo\n const { stdout } = await execa(\n \"git\",\n [\"rev-parse\", \"--is-inside-work-tree\"],\n { cwd: projectPath },\n );\n const insideExistingRepo = stdout.trim() === \"true\";\n\n if (!insideExistingRepo) {\n await execa(\"git\", [\"init\"], { cwd: projectPath });\n await execa(\"git\", [\"add\", \"-A\"], { cwd: projectPath });\n await execa(\"git\", [\"commit\", \"-m\", \"Initial commit\"], {\n cwd: projectPath,\n });\n }\n } catch (_) {\n // ignore git detection/initialization failures\n }\n\n createSpinner?.succeed(\"Creating a new project from template.\");\n } catch (error) {\n createSpinner?.fail(\n \"Something went wrong creating a new project from template.\",\n );\n handleError(error);\n }\n}\n\nasync function removeEmptyTemplateI18nDirs(projectPath: string) {\n const candidates = [\n path.resolve(projectPath, \"src/i18n\"),\n path.resolve(projectPath, \"apps/web/src/i18n\"),\n ];\n\n await Promise.all(\n candidates.map(async (candidate) => {\n if (!(await fs.pathExists(candidate))) {\n return;\n }\n\n const entries = await fs.readdir(candidate);\n if (entries.length === 0) {\n await fs.remove(candidate);\n }\n }),\n );\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\nimport { getConfig } from \"@/src/utils/get-config\";\n\nfunction toRegistryName(filename: string) {\n return filename\n .replace(/\\.[^.]+$/, \"\")\n .replace(/([a-z0-9])([A-Z])/g, \"$1-$2\")\n .toLowerCase();\n}\n\nasync function pathExists(filepath: string) {\n try {\n await fs.access(filepath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function detectInstalledUiComponents(uiDir: string) {\n if (!(await pathExists(uiDir))) {\n return [];\n }\n\n const entries = await fs.readdir(uiDir, { withFileTypes: true });\n const components = new Set<string>();\n\n for (const entry of entries) {\n if (entry.name.startsWith(\".\")) {\n continue;\n }\n\n const entryPath = path.resolve(uiDir, entry.name);\n\n if (entry.isDirectory()) {\n const childEntries = await fs.readdir(entryPath, { withFileTypes: true });\n const hasComponentFile = childEntries.some(\n (child) =>\n child.isFile() &&\n (/\\.(astro|tsx|jsx)$/.test(child.name) ||\n /^(index\\.(ts|js|tsx|jsx))$/.test(child.name)),\n );\n\n if (hasComponentFile) {\n components.add(entry.name);\n }\n\n continue;\n }\n\n if (\n entry.isFile() &&\n /\\.(astro|tsx|jsx)$/.test(entry.name) &&\n !entry.name.startsWith(\"index.\")\n ) {\n components.add(toRegistryName(entry.name));\n }\n }\n\n return Array.from(components).sort();\n}\n\nexport async function getInstalledUiComponents(cwd: string) {\n const config = await getConfig(cwd);\n if (!config) {\n return [];\n }\n\n return detectInstalledUiComponents(config.resolvedPaths.ui);\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { logger } from \"@/src/utils/logger\";\n\nexport interface RegistryFile {\n path: string;\n content: string;\n type: string;\n target?: string;\n}\n\nexport interface RegistryItem {\n name: string;\n type: string;\n files?: RegistryFile[];\n dependencies?: string[];\n devDependencies?: string[];\n registryDependencies?: string[];\n}\n\nexport async function fetchRegistryItem(\n componentName: string,\n registryUrl: string,\n style = \"bejamas-juno\",\n): Promise<RegistryItem | null> {\n const url = `${registryUrl}/styles/${style}/${componentName}.json`;\n\n try {\n const response = await fetch(url);\n if (!response.ok) {\n const fallbackUrl = `${registryUrl}/${componentName}.json`;\n const fallbackResponse = await fetch(fallbackUrl);\n if (!fallbackResponse.ok) {\n return null;\n }\n return (await fallbackResponse.json()) as RegistryItem;\n }\n return (await response.json()) as RegistryItem;\n } catch {\n return null;\n }\n}\n\nexport function getSubfolderFromPaths(files?: RegistryFile[]): string | null {\n if (!files || files.length === 0) {\n return null;\n }\n\n const uiFiles = files.filter((file) => file.type === \"registry:ui\");\n if (uiFiles.length < 2) {\n return null;\n }\n\n const subfolders = new Set<string>();\n\n for (const file of uiFiles) {\n const parts = file.path.split(\"/\");\n const uiIndex = parts.indexOf(\"ui\");\n if (uiIndex !== -1 && parts.length > uiIndex + 2) {\n subfolders.add(parts[uiIndex + 1]);\n }\n }\n\n if (subfolders.size === 1) {\n return Array.from(subfolders)[0];\n }\n\n if (uiFiles.length > 0) {\n const dirname = path.dirname(uiFiles[0].path);\n const folderName = path.basename(dirname);\n if (folderName && folderName !== \"ui\") {\n return folderName;\n }\n }\n\n return null;\n}\n\nasync function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolveShadcnUiRelativePath(filePath: string, uiDir: string) {\n const normalizedFilePath = filePath.replace(/^\\/|\\/$/g, \"\");\n const lastTargetSegment = path.basename(uiDir.replace(/^\\/|\\/$/g, \"\"));\n\n if (!lastTargetSegment) {\n return path.basename(normalizedFilePath);\n }\n\n const fileSegments = normalizedFilePath.split(\"/\");\n const commonDirIndex = fileSegments.findIndex(\n (segment) => segment === lastTargetSegment,\n );\n\n if (commonDirIndex === -1) {\n return fileSegments[fileSegments.length - 1];\n }\n\n return fileSegments.slice(commonDirIndex + 1).join(\"/\");\n}\n\n/**\n * Current upstream shadcn workspace installs flatten `ui/foo/Bar.astro` when\n * the resolved ui target ends in a segment like `components` instead of `ui`.\n * We keep reorganization only for that compatibility case.\n */\nexport function shouldReorganizeRegistryUiFiles(\n files: RegistryFile[] | undefined,\n uiDir: string,\n) {\n if (!uiDir) {\n return false;\n }\n\n const subfolder = getSubfolderFromPaths(files);\n if (!subfolder) {\n return false;\n }\n\n const uiFiles = files.filter((file) => file.type === \"registry:ui\");\n\n return uiFiles.some((file) => {\n const relativePath = resolveShadcnUiRelativePath(file.path, uiDir);\n return !relativePath.includes(\"/\");\n });\n}\n\nexport interface ReorganizeResult {\n totalMoved: number;\n movedFiles: string[];\n skippedFiles: string[];\n}\n\n/**\n * Reorganizes one multi-file registry:ui item from flat output into its\n * expected subfolder. This is the filesystem-level compatibility shim.\n */\nexport async function reorganizeRegistryUiFiles(\n files: RegistryFile[] | undefined,\n uiDir: string,\n verbose: boolean,\n overwriteExisting = false,\n): Promise<ReorganizeResult> {\n const result: ReorganizeResult = {\n totalMoved: 0,\n movedFiles: [],\n skippedFiles: [],\n };\n\n if (!uiDir || !files || files.length === 0) {\n return result;\n }\n\n const subfolder = getSubfolderFromPaths(files);\n if (!subfolder) {\n return result;\n }\n\n const uiFiles = files.filter((file) => file.type === \"registry:ui\");\n const targetDir = path.join(uiDir, subfolder);\n\n for (const file of uiFiles) {\n const filename = path.basename(file.path);\n const flatPath = path.join(uiDir, filename);\n const targetPath = path.join(targetDir, filename);\n\n if (!(await pathExists(flatPath))) {\n continue;\n }\n\n if (await pathExists(targetPath)) {\n if (overwriteExisting) {\n await fs.mkdir(targetDir, { recursive: true });\n await fs.unlink(targetPath);\n await fs.rename(flatPath, targetPath);\n result.totalMoved++;\n result.movedFiles.push(`${subfolder}/${filename}`);\n\n if (verbose) {\n logger.info(\n `[bejamas-ui] Replaced ${subfolder}/${filename} with the reinstalled version`,\n );\n }\n continue;\n }\n\n try {\n await fs.unlink(flatPath);\n result.skippedFiles.push(`${subfolder}/${filename}`);\n if (verbose) {\n logger.info(\n `[bejamas-ui] Removed flat duplicate: ${filename} (${subfolder}/${filename} exists)`,\n );\n }\n } catch {\n result.skippedFiles.push(`${subfolder}/${filename}`);\n }\n continue;\n }\n\n await fs.mkdir(targetDir, { recursive: true });\n await fs.rename(flatPath, targetPath);\n result.totalMoved++;\n result.movedFiles.push(`${subfolder}/${filename}`);\n\n if (verbose) {\n logger.info(`[bejamas-ui] Moved ${filename} -> ${subfolder}/${filename}`);\n }\n }\n\n return result;\n}\n\nexport async function reorganizeComponents(\n components: string[],\n uiDir: string,\n registryUrl: string,\n verbose: boolean,\n style = \"bejamas-juno\",\n overwriteExisting = false,\n): Promise<ReorganizeResult> {\n const result: ReorganizeResult = {\n totalMoved: 0,\n movedFiles: [],\n skippedFiles: [],\n };\n\n if (!uiDir || components.length === 0) {\n return result;\n }\n\n for (const componentName of components) {\n try {\n const registryItem = await fetchRegistryItem(\n componentName,\n registryUrl,\n style,\n );\n if (!registryItem) {\n if (verbose) {\n logger.info(\n `[bejamas-ui] Could not fetch registry for ${componentName}, skipping reorganization`,\n );\n }\n continue;\n }\n\n if (!shouldReorganizeRegistryUiFiles(registryItem.files, uiDir)) {\n continue;\n }\n\n const componentResult = await reorganizeRegistryUiFiles(\n registryItem.files,\n uiDir,\n verbose,\n overwriteExisting,\n );\n\n result.totalMoved += componentResult.totalMoved;\n result.movedFiles.push(...componentResult.movedFiles);\n result.skippedFiles.push(...componentResult.skippedFiles);\n\n if (componentResult.totalMoved > 0 && verbose) {\n const subfolder = getSubfolderFromPaths(registryItem.files);\n logger.info(\n `[bejamas-ui] Reorganized ${componentName} into ${subfolder}/`,\n );\n }\n } catch (err) {\n if (verbose) {\n logger.warn(\n `[bejamas-ui] Failed to reorganize ${componentName}: ${err}`,\n );\n }\n }\n }\n\n return result;\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport fs from \"node:fs/promises\";\n\nexport const PINNED_SHADCN_VERSION = \"4.1.1\";\nexport const PINNED_SHADCN_PACKAGE = `shadcn@${PINNED_SHADCN_VERSION}`;\nexport const PINNED_SHADCN_EXEC_PREFIX = path.join(\n os.tmpdir(),\n \"bejamas-shadcn\",\n PINNED_SHADCN_VERSION,\n);\n\nexport interface ShadcnInvocation {\n cmd: string;\n args: string[];\n source: \"isolated\";\n}\n\nexport async function ensurePinnedShadcnExecPrefix() {\n await fs.mkdir(PINNED_SHADCN_EXEC_PREFIX, { recursive: true });\n return PINNED_SHADCN_EXEC_PREFIX;\n}\n\nfunction getNpmExecutable() {\n return process.platform === \"win32\" ? \"npm.cmd\" : \"npm\";\n}\n\nexport function buildPinnedShadcnInvocation(\n shadcnArgs: string[],\n): ShadcnInvocation {\n return {\n cmd: getNpmExecutable(),\n args: [\n \"exec\",\n \"--yes\",\n \"--prefix\",\n PINNED_SHADCN_EXEC_PREFIX,\n `--package=${PINNED_SHADCN_PACKAGE}`,\n \"--\",\n \"shadcn\",\n ...shadcnArgs,\n ],\n source: \"isolated\",\n };\n}\n","import { execa } from \"execa\";\nimport {\n buildPinnedShadcnInvocation,\n ensurePinnedShadcnExecPrefix,\n} from \"@/src/utils/shadcn-cli\";\n\nexport function extractPassthroughArgs(rawArgv: string[], commandName: string) {\n const commandIndex = rawArgv.findIndex((arg) => arg === commandName);\n if (commandIndex === -1) {\n return [];\n }\n\n const rest = rawArgv.slice(commandIndex + 1);\n const doubleDashIndex = rest.indexOf(\"--\");\n\n if (doubleDashIndex === -1) {\n return [];\n }\n\n return rest.slice(doubleDashIndex + 1);\n}\n\nexport async function runShadcnCommand({\n cwd,\n args,\n env,\n}: {\n cwd: string;\n args: string[];\n env?: NodeJS.ProcessEnv;\n}) {\n await ensurePinnedShadcnExecPrefix();\n const invocation = buildPinnedShadcnInvocation(args);\n\n await execa(invocation.cmd, invocation.args, {\n cwd,\n env: {\n ...process.env,\n ...env,\n },\n stdio: \"inherit\",\n });\n}\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport { z } from \"zod\";\nimport {\n DEFAULT_DESIGN_SYSTEM_CONFIG,\n decodePreset,\n designSystemConfigSchema,\n encodePreset,\n isPresetCode,\n normalizeDesignSystemConfig,\n RTL_LANGUAGE_VALUES,\n type DesignSystemConfig,\n} from \"@bejamas/create-config/server\";\nimport type { RegistryItem } from \"shadcn/schema\";\n\nimport { BASE_COLORS } from \"@/src/registry/constants\";\nimport { clearRegistryContext } from \"@/src/registry/context\";\nimport { preFlightInit } from \"@/src/preflights/preflight-init\";\nimport {\n applyDesignSystemToProject,\n syncAstroManagedFontCss,\n syncManagedTailwindCss,\n} from \"@/src/utils/apply-design-system\";\nimport {\n cleanupAstroFontPackages,\n syncAstroFontsInProject,\n toManagedAstroFont,\n} from \"@/src/utils/astro-fonts\";\nimport { fixAstroImports } from \"@/src/utils/astro-imports\";\nimport { TEMPLATES, createProject } from \"@/src/utils/create-project\";\nimport * as ERRORS from \"@/src/utils/errors\";\nimport { getConfig } from \"@/src/utils/get-config\";\nimport { handleError } from \"@/src/utils/handle-error\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { getInstalledUiComponents } from \"@/src/utils/installed-ui-components\";\nimport { logger } from \"@/src/utils/logger\";\nimport { reorganizeComponents } from \"@/src/utils/reorganize-components\";\nimport { runShadcnCommand } from \"@/src/utils/shadcn-command\";\nimport { buildUiUrl, resolveRegistryUrl } from \"@/src/utils/ui-base-url\";\n\nexport function resolveDesignSystemConfig(\n options: Pick<\n z.infer<typeof initOptionsSchema>,\n \"preset\" | \"template\" | \"rtl\" | \"baseColor\" | \"lang\"\n >,\n): DesignSystemConfig {\n const rtlLanguage =\n options.rtl && options.lang\n ? (options.lang as DesignSystemConfig[\"rtlLanguage\"])\n : DEFAULT_DESIGN_SYSTEM_CONFIG.rtlLanguage;\n\n if (options.preset && isPresetCode(options.preset)) {\n const decoded = decodePreset(options.preset);\n if (decoded) {\n return normalizeDesignSystemConfig(\n designSystemConfigSchema.parse({\n ...DEFAULT_DESIGN_SYSTEM_CONFIG,\n ...decoded,\n template: options.template ?? DEFAULT_DESIGN_SYSTEM_CONFIG.template,\n rtl: options.rtl ?? false,\n rtlLanguage,\n }),\n );\n }\n }\n\n const baseColor = options.baseColor ?? DEFAULT_DESIGN_SYSTEM_CONFIG.baseColor;\n\n return normalizeDesignSystemConfig(\n designSystemConfigSchema.parse({\n ...DEFAULT_DESIGN_SYSTEM_CONFIG,\n template: options.template ?? DEFAULT_DESIGN_SYSTEM_CONFIG.template,\n rtl: options.rtl ?? false,\n rtlLanguage,\n baseColor,\n theme:\n baseColor === DEFAULT_DESIGN_SYSTEM_CONFIG.baseColor\n ? DEFAULT_DESIGN_SYSTEM_CONFIG.theme\n : baseColor,\n }),\n );\n}\n\nexport function buildInitUrl(\n config: DesignSystemConfig,\n themeRef?: string,\n env: NodeJS.ProcessEnv = process.env,\n) {\n const params = new URLSearchParams({\n preset: encodePreset(config),\n template: config.template,\n });\n\n if (config.rtl) {\n params.set(\"rtl\", \"true\");\n params.set(\"lang\", config.rtlLanguage);\n }\n\n if (themeRef) {\n params.set(\"themeRef\", themeRef);\n }\n\n return `${buildUiUrl(\"/init\", env)}?${params.toString()}`;\n}\n\nfunction buildThemeVarsFromRegistryItem(item: RegistryItem | null) {\n return item?.cssVars ?? null;\n}\n\nasync function fetchInitThemeVars(initUrl: string) {\n const response = await fetch(initUrl);\n if (!response.ok) {\n return null;\n }\n\n const item = (await response.json()) as RegistryItem;\n return buildThemeVarsFromRegistryItem(item);\n}\n\nexport const initOptionsSchema = z.object({\n cwd: z.string(),\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n reinstall: z.boolean().optional(),\n defaults: z.boolean(),\n force: z.boolean(),\n silent: z.boolean(),\n isNewProject: z.boolean(),\n srcDir: z.boolean().optional(),\n cssVariables: z.boolean(),\n template: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (val) {\n return TEMPLATES[val as keyof typeof TEMPLATES];\n }\n return true;\n },\n {\n message:\n \"Invalid template. Please use 'astro', 'astro-monorepo', or 'astro-with-component-docs-monorepo'.\",\n },\n ),\n preset: z.string().optional(),\n baseColor: z\n .string()\n .optional()\n .refine(\n (val) => {\n if (val) {\n return BASE_COLORS.find((color) => color.name === val);\n }\n\n return true;\n },\n {\n message: `Invalid base color. Please use '${BASE_COLORS.map(\n (color) => color.name,\n ).join(\"', '\")}'`,\n },\n ),\n baseStyle: z.boolean(),\n rtl: z.boolean().default(false),\n lang: z.enum(RTL_LANGUAGE_VALUES).optional(),\n themeRef: z.string().optional(),\n});\n\nexport function shouldReinstallExistingComponents(\n options: Pick<z.infer<typeof initOptionsSchema>, \"preset\" | \"reinstall\">,\n) {\n return options.reinstall ?? Boolean(options.preset);\n}\n\nexport function ensureShadcnReinstallFlag(\n forwardedOptions: string[],\n shouldReinstall: boolean,\n) {\n if (\n !shouldReinstall ||\n forwardedOptions.includes(\"--reinstall\") ||\n forwardedOptions.includes(\"--no-reinstall\")\n ) {\n return forwardedOptions;\n }\n\n const passthroughIndex = forwardedOptions.indexOf(\"--\");\n if (passthroughIndex === -1) {\n return [...forwardedOptions, \"--reinstall\"];\n }\n\n return [\n ...forwardedOptions.slice(0, passthroughIndex),\n \"--reinstall\",\n ...forwardedOptions.slice(passthroughIndex),\n ];\n}\n\nexport function extractOptionsForShadcnInit(\n rawArgv: string[],\n cmd: Command,\n): string[] {\n if (typeof cmd.getOptionValueSource === \"function\") {\n const opts = cmd.optsWithGlobals() as Record<string, unknown>;\n const forwarded: string[] = [];\n const getSource = (key: string) => cmd.getOptionValueSource(key);\n\n const addBoolean = (key: string, flag: string, negateFlag?: string) => {\n if (getSource(key) !== \"cli\") return;\n const value = opts[key];\n if (typeof value !== \"boolean\") return;\n if (value) {\n forwarded.push(flag);\n } else if (negateFlag) {\n forwarded.push(negateFlag);\n }\n };\n\n addBoolean(\"yes\", \"--yes\");\n addBoolean(\"force\", \"--force\");\n addBoolean(\"silent\", \"--silent\");\n addBoolean(\"reinstall\", \"--reinstall\", \"--no-reinstall\");\n\n const initIndex = rawArgv.findIndex((arg) => arg === \"init\");\n if (initIndex !== -1) {\n const rest = rawArgv.slice(initIndex + 1);\n const doubleDashIndex = rest.indexOf(\"--\");\n if (doubleDashIndex !== -1) {\n forwarded.push(...rest.slice(doubleDashIndex));\n }\n }\n\n return forwarded;\n }\n\n const initIndex = rawArgv.findIndex((arg) => arg === \"init\");\n if (initIndex === -1) return [];\n const rest = rawArgv.slice(initIndex + 1);\n const forwarded: string[] = [];\n const filteredFlags = new Set([\n \"-v\",\n \"--verbose\",\n \"-t\",\n \"--template\",\n \"-b\",\n \"--base-color\",\n \"-p\",\n \"--preset\",\n \"--theme-ref\",\n \"-c\",\n \"--cwd\",\n \"-d\",\n \"--defaults\",\n \"--src-dir\",\n \"--no-src-dir\",\n \"--css-variables\",\n \"--no-css-variables\",\n \"--no-base-style\",\n \"--rtl\",\n \"--lang\",\n ]);\n\n for (let index = 0; index < rest.length; index += 1) {\n const token = rest[index];\n if (token === \"--\") {\n forwarded.push(\"--\", ...rest.slice(index + 1));\n break;\n }\n if (!token.startsWith(\"-\")) continue;\n if (filteredFlags.has(token)) continue;\n forwarded.push(token);\n }\n\n return forwarded;\n}\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project and install dependencies\")\n .argument(\"[components...]\", \"names, url or local path to component\")\n .option(\n \"-t, --template <template>\",\n \"the template to use. (astro, astro-monorepo, astro-with-component-docs-monorepo)\",\n )\n .option(\n \"-b, --base-color <base-color>\",\n \"the base color to use. (neutral, gray, zinc, stone, slate)\",\n undefined,\n )\n .option(\"-p, --preset <preset>\", \"the encoded create preset to use\")\n .option(\"--theme-ref <theme-ref>\", \"the custom theme ref to use\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\"-d, --defaults\", \"use default configuration.\", false)\n .option(\"-f, --force\", \"force overwrite of existing configuration.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .option(\"-s, --silent\", \"mute output.\", false)\n .option(\n \"--src-dir\",\n \"use the src directory when creating a new project.\",\n false,\n )\n .option(\n \"--no-src-dir\",\n \"do not use the src directory when creating a new project.\",\n )\n .option(\"--css-variables\", \"use css variables for theming.\", true)\n .option(\"--no-css-variables\", \"do not use css variables for theming.\")\n .option(\"--no-base-style\", \"do not install the base shadcn style.\")\n .option(\"--rtl\", \"enable right-to-left output\", false)\n .option(\"--lang <lang>\", \"set the RTL language. (ar, fa, he)\")\n .option(\n \"--reinstall\",\n \"re-install existing UI components. Enabled by default for preset switching.\",\n )\n .option(\n \"--no-reinstall\",\n \"do not re-install existing UI components during preset switching.\",\n )\n .action(async (_components, opts, cmd) => {\n try {\n await runInit({\n ...opts,\n forwardedOptions: extractOptionsForShadcnInit(\n process.argv.slice(2),\n cmd,\n ),\n });\n } catch (error) {\n logger.break();\n handleError(error);\n } finally {\n clearRegistryContext();\n }\n });\n\nexport async function runInit(\n options: z.infer<typeof initOptionsSchema> & {\n skipPreflight?: boolean;\n forwardedOptions?: string[];\n },\n) {\n const designConfig = resolveDesignSystemConfig(options);\n let newProjectTemplate;\n\n if (!options.skipPreflight) {\n const preflight = await preFlightInit(options);\n\n if (preflight.errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT]) {\n const { projectPath, template } = await createProject(options);\n if (!projectPath) {\n process.exit(1);\n }\n options.cwd = projectPath;\n options.isNewProject = true;\n newProjectTemplate = template;\n }\n }\n\n if (newProjectTemplate) {\n const projectPath = {\n \"astro-monorepo\": \"apps/web\",\n \"astro-with-component-docs-monorepo\": \"apps/web\",\n astro: \"\",\n } as const;\n await applyDesignSystemToProject(\n options.cwd,\n {\n ...designConfig,\n template: newProjectTemplate,\n },\n {\n themeVars: options.themeRef\n ? ((await fetchInitThemeVars(\n buildInitUrl(\n {\n ...designConfig,\n template: newProjectTemplate,\n },\n options.themeRef,\n ),\n )) ?? undefined)\n : undefined,\n },\n );\n\n options.cwd = path.resolve(options.cwd, projectPath[newProjectTemplate]);\n\n logger.log(\n `${highlighter.success(\n \"Success!\",\n )} Project initialization completed.\\nYou may now add components.`,\n );\n\n return await getConfig(options.cwd);\n }\n\n try {\n const env = {\n ...process.env,\n REGISTRY_URL: resolveRegistryUrl(),\n };\n const initUrl = buildInitUrl(designConfig, options.themeRef);\n const shouldReinstall = shouldReinstallExistingComponents(options);\n const reinstallComponents = shouldReinstall\n ? await getInstalledUiComponents(options.cwd)\n : [];\n const forwardedOptions = ensureShadcnReinstallFlag(\n options.forwardedOptions ?? [],\n shouldReinstall,\n );\n\n await runShadcnCommand({\n cwd: options.cwd,\n args: [\"init\", initUrl, ...reinstallComponents, ...forwardedOptions],\n env,\n });\n\n await syncManagedTailwindCss(options.cwd);\n\n const managedFonts = [\n toManagedAstroFont(designConfig.font),\n designConfig.fontHeading !== \"inherit\"\n ? toManagedAstroFont(`font-heading-${designConfig.fontHeading}`)\n : null,\n ].filter((font): font is NonNullable<typeof font> => font !== null);\n const managedFont = managedFonts.find(\n (font) => font.cssVariable !== \"--font-heading\",\n );\n\n if (managedFonts.length > 0 && managedFont) {\n await syncAstroFontsInProject(\n options.cwd,\n managedFonts,\n managedFont.cssVariable,\n );\n await syncAstroManagedFontCss(options.cwd, managedFont.cssVariable);\n await cleanupAstroFontPackages(options.cwd);\n }\n\n if (reinstallComponents.length > 0) {\n const config = await getConfig(options.cwd);\n const uiDir = config?.resolvedPaths.ui ?? \"\";\n const activeStyle = config?.style ?? \"bejamas-juno\";\n\n if (uiDir) {\n await reorganizeComponents(\n reinstallComponents,\n uiDir,\n resolveRegistryUrl(),\n false,\n activeStyle,\n true,\n );\n }\n\n await fixAstroImports(options.cwd, false);\n }\n } catch {\n // shadcn already printed the detailed error to stdio, avoid double-reporting\n process.exit(1);\n }\n}\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n extractPassthroughArgs,\n runShadcnCommand,\n} from \"@/src/utils/shadcn-command\";\n\nexport const docs = new Command()\n .name(\"docs\")\n .description(\"proxy to shadcn docs\")\n .argument(\"<components...>\", \"component names\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .option(\n \"-b, --base <base>\",\n \"the base to use either 'base' or 'radix'. defaults to project base.\",\n )\n .option(\"--json\", \"output as JSON.\", false)\n .action(async (components: string[], opts) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n const rawArgv = process.argv.slice(2);\n const args = [\"docs\", ...components, \"--cwd\", cwd];\n\n if (opts.base) {\n args.push(\"--base\", opts.base);\n }\n\n if (opts.json) {\n args.push(\"--json\");\n }\n\n const passthroughArgs = extractPassthroughArgs(rawArgv, \"docs\");\n if (passthroughArgs.length > 0) {\n args.push(...passthroughArgs);\n }\n\n try {\n await runShadcnCommand({ cwd, args });\n } catch {\n process.exit(1);\n }\n });\n","import { resolve } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\n\n/**\n * Read and parse tsconfig.json from the project root\n */\nexport function readTsConfig(projectRoot: string): any | null {\n try {\n const tsconfigPath = resolve(projectRoot, \"tsconfig.json\");\n if (!existsSync(tsconfigPath)) return null;\n const raw = readFileSync(tsconfigPath, \"utf-8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\n/**\n * Resolve an alias path (like @/components) using tsconfig.json paths\n */\nexport function resolveAliasPathUsingTsConfig(\n inputPath: string,\n projectRoot: string,\n): string | null {\n const cfg = readTsConfig(projectRoot);\n if (!cfg || !cfg.compilerOptions) return null;\n const baseUrl: string = cfg.compilerOptions.baseUrl || \".\";\n const paths: Record<string, string[] | string> =\n cfg.compilerOptions.paths || {};\n for (const [key, values] of Object.entries(paths)) {\n const pattern = key.replace(/\\*/g, \"(.*)\");\n const re = new RegExp(`^${pattern}$`);\n const match = inputPath.match(re);\n if (!match) continue;\n const wildcard = match[1] || \"\";\n const first = Array.isArray(values) ? values[0] : values;\n if (!first) continue;\n const target = String(first).replace(/\\*/g, wildcard);\n return resolve(projectRoot, baseUrl, target);\n }\n return null;\n}\n","import { Command } from \"commander\";\nimport { resolve, isAbsolute, relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { logger } from \"@/src/utils/logger\";\nimport { resolveAliasPathUsingTsConfig } from \"@/src/utils/tsconfig-utils\";\nimport prompts from \"prompts\";\n\nasync function generateDocs({\n cwd,\n outDir,\n verbose,\n}: {\n cwd?: string;\n outDir?: string;\n verbose?: boolean;\n}) {\n const DEBUG =\n process.env.BEJAMAS_DEBUG === \"1\" ||\n process.env.BEJAMAS_DEBUG === \"true\" ||\n verbose;\n\n try {\n const shellCwd = process.cwd();\n\n // Probe for components.json up the directory tree starting from shell CWD\n let projectRoot = shellCwd;\n let probe: string | null = shellCwd;\n for (let i = 0; i < 6 && probe; i += 1) {\n const candidate = resolve(probe, \"components.json\");\n if (existsSync(candidate)) {\n projectRoot = probe;\n try {\n const raw = readFileSync(candidate, \"utf-8\");\n const config = JSON.parse(raw);\n if (!cwd && !process.env.BEJAMAS_UI_ROOT && config?.aliases?.ui) {\n const mapped: string = String(config.aliases.ui);\n let uiAbs: string | null = null;\n if (\n mapped.startsWith(\"./\") ||\n mapped.startsWith(\"../\") ||\n isAbsolute(mapped)\n ) {\n uiAbs = resolve(projectRoot, mapped);\n } else {\n uiAbs = resolveAliasPathUsingTsConfig(mapped, projectRoot);\n }\n if (!uiAbs && mapped.startsWith(\"@/\")) {\n uiAbs = resolve(projectRoot, \"src\", mapped.slice(2));\n }\n if (uiAbs) {\n process.env.BEJAMAS_UI_ROOT = uiAbs;\n }\n }\n if (!cwd && !process.env.BEJAMAS_UI_ROOT && config?.tailwind?.css) {\n const cssRaw = String(config.tailwind.css);\n let cssAbs: string | null = null;\n if (\n cssRaw.startsWith(\"./\") ||\n cssRaw.startsWith(\"../\") ||\n isAbsolute(cssRaw)\n ) {\n cssAbs = resolve(projectRoot, cssRaw);\n } else {\n cssAbs = resolveAliasPathUsingTsConfig(cssRaw, projectRoot);\n }\n if (!cssAbs && cssRaw.startsWith(\"@/\")) {\n cssAbs = resolve(projectRoot, \"src\", cssRaw.slice(2));\n }\n if (cssAbs) {\n const uiRootFromCss = resolve(cssAbs, \"..\", \"..\", \"..\");\n process.env.BEJAMAS_UI_ROOT = uiRootFromCss;\n }\n }\n if (!outDir && config?.aliases?.docs) {\n const mapped: string = String(config.aliases.docs);\n let outResolved: string | null = null;\n if (\n mapped.startsWith(\"./\") ||\n mapped.startsWith(\"../\") ||\n isAbsolute(mapped)\n ) {\n outResolved = mapped;\n } else {\n const abs = resolveAliasPathUsingTsConfig(mapped, projectRoot);\n if (abs) outResolved = relative(projectRoot, abs);\n }\n if (!outResolved && mapped.startsWith(\"@/\")) {\n outResolved = mapped.replace(/^@\\//, \"src/\");\n }\n const finalOut = outResolved ?? mapped;\n if (finalOut && !process.env.BEJAMAS_DOCS_OUT_DIR) {\n process.env.BEJAMAS_DOCS_OUT_DIR = finalOut;\n process.env.BEJAMAS_DOCS_CWD = projectRoot;\n }\n }\n } catch {}\n break;\n }\n const parent = resolve(probe, \"..\");\n probe = parent === probe ? null : parent;\n }\n\n if (!process.env.BEJAMAS_DOCS_CWD) {\n process.env.BEJAMAS_DOCS_CWD = shellCwd;\n }\n if (!process.env.BEJAMAS_UI_ROOT) {\n const defaultGuess = (() => {\n let current = shellCwd;\n for (let i = 0; i < 6; i += 1) {\n const cand = resolve(current, \"packages/ui/package.json\");\n if (existsSync(cand)) {\n const abs = resolve(current, \"packages/ui\");\n const rel = relative(shellCwd, abs);\n return rel || abs;\n }\n const parent = resolve(current, \"..\");\n if (parent === current) break;\n current = parent;\n }\n const nm = resolve(shellCwd, \"node_modules/@bejamas/ui/package.json\");\n if (existsSync(nm)) {\n const abs = resolve(shellCwd, \"node_modules/@bejamas/ui\");\n const rel = relative(shellCwd, abs);\n return rel || abs;\n }\n return \"packages/ui\";\n })();\n const { uiRoot } = await prompts({\n type: \"text\",\n name: \"uiRoot\",\n message: \"Path to @bejamas/ui package root:\",\n initial: defaultGuess,\n validate: (val: string) => {\n const p = resolve(shellCwd, val);\n return existsSync(resolve(p, \"package.json\"))\n ? true\n : `No package.json found in ${p}`;\n },\n });\n if (!uiRoot) {\n logger.error(\"@bejamas/ui root is required to generate docs.\");\n process.exit(1);\n }\n process.env.BEJAMAS_UI_ROOT = resolve(shellCwd, uiRoot);\n }\n\n if (cwd && cwd.length) {\n process.env.BEJAMAS_UI_ROOT = resolve(cwd);\n }\n if (outDir && outDir.length) {\n process.env.BEJAMAS_DOCS_OUT_DIR = outDir;\n }\n\n if (!process.env.BEJAMAS_DOCS_OUT_DIR) {\n const { out } = await prompts({\n type: \"text\",\n name: \"out\",\n message: \"Where should we output docs (relative to project root)?\",\n initial: \"src/content/docs/components\",\n });\n if (!out) {\n logger.error(\"An output directory is required to generate docs.\");\n process.exit(1);\n }\n process.env.BEJAMAS_DOCS_OUT_DIR = out;\n process.env.BEJAMAS_DOCS_CWD = process.env.BEJAMAS_DOCS_CWD || shellCwd;\n }\n process.env.BEJAMAS_SKIP_AUTO_RUN = \"1\";\n logger.info(`Generating docs...`);\n if (DEBUG) {\n logger.info(`Generator entry: @/src/docs/generate-mdx/index`);\n if (process.env.BEJAMAS_UI_ROOT)\n logger.info(`UI root: ${process.env.BEJAMAS_UI_ROOT}`);\n if (process.env.BEJAMAS_DOCS_CWD)\n logger.info(`Docs CWD: ${process.env.BEJAMAS_DOCS_CWD}`);\n if (process.env.BEJAMAS_DOCS_OUT_DIR)\n logger.info(`Docs out: ${process.env.BEJAMAS_DOCS_OUT_DIR}`);\n }\n const mod = await import(\"@/src/docs/generate-mdx/index\");\n if (typeof mod.runDocsGenerator === \"function\") {\n await mod.runDocsGenerator();\n } else {\n throw new Error(\n \"Failed to load docs generator. Export 'runDocsGenerator' not found.\",\n );\n }\n } catch (err: any) {\n logger.error(err?.message || String(err));\n process.exit(1);\n }\n}\n\nexport const docsBuild = new Command()\n .name(\"docs:build\")\n .description(\"generate docs from @bejamas/ui components\")\n .option(\"-c, --cwd <cwd>\", \"path to UI working directory\")\n .option(\"-o, --out <outDir>\", \"output directory for generated MDX files\")\n .action(async (opts) => {\n await generateDocs({\n cwd: opts.cwd,\n outDir: opts.out,\n verbose: Boolean(opts.verbose),\n });\n });\n","import { Command } from \"commander\";\nimport { resolve, isAbsolute, join, extname } from \"node:path\";\nimport { existsSync, readFileSync, readdirSync } from \"node:fs\";\nimport {\n cyan,\n green,\n red,\n yellow,\n dim,\n bold,\n magenta,\n white,\n} from \"kleur/colors\";\nimport { logger } from \"@/src/utils/logger\";\nimport { resolveAliasPathUsingTsConfig } from \"@/src/utils/tsconfig-utils\";\nimport {\n extractFrontmatter,\n parseJsDocMetadata,\n resolveUiRoot,\n} from \"@/src/docs/generate-mdx/utils\";\n\ninterface ComponentDocStatus {\n name: string;\n file: string;\n status: \"complete\" | \"incomplete\" | \"missing\";\n missingRequired: string[];\n missingRecommended: string[];\n}\n\ninterface CheckResult {\n total: number;\n complete: ComponentDocStatus[];\n incomplete: ComponentDocStatus[];\n missing: ComponentDocStatus[];\n}\n\nconst REQUIRED_FIELDS = [\"name\", \"title\", \"description\"] as const;\nconst RECOMMENDED_FIELDS = [\n \"primaryExampleMDX\",\n \"usageMDX\",\n \"figmaUrl\",\n] as const;\n\nconst FIELD_LABELS: Record<string, string> = {\n name: \"@component\",\n title: \"@title\",\n description: \"@description\",\n primaryExampleMDX: \"@preview\",\n usageMDX: \"@usage\",\n figmaUrl: \"@figmaUrl\",\n};\n\nfunction checkComponentDocs(\n filePath: string,\n fileName: string,\n): ComponentDocStatus {\n const content = readFileSync(filePath, \"utf-8\");\n const frontmatter = extractFrontmatter(content);\n const meta = parseJsDocMetadata(frontmatter);\n\n const componentName = fileName.replace(/\\.astro$/i, \"\");\n const missingRequired: string[] = [];\n const missingRecommended: string[] = [];\n\n for (const field of REQUIRED_FIELDS) {\n const value = meta[field];\n if (!value || (typeof value === \"string\" && !value.trim())) {\n missingRequired.push(FIELD_LABELS[field] || field);\n }\n }\n\n for (const field of RECOMMENDED_FIELDS) {\n const value = meta[field];\n if (!value || (typeof value === \"string\" && !value.trim())) {\n missingRecommended.push(FIELD_LABELS[field] || field);\n }\n }\n\n let status: \"complete\" | \"incomplete\" | \"missing\";\n if (missingRequired.length > 0) {\n status = \"missing\";\n } else if (missingRecommended.length > 0) {\n status = \"incomplete\";\n } else {\n status = \"complete\";\n }\n\n return {\n name: componentName,\n file: fileName,\n status,\n missingRequired,\n missingRecommended,\n };\n}\n\nasync function checkDocs({\n cwd,\n json,\n}: {\n cwd?: string;\n json?: boolean;\n}): Promise<void> {\n try {\n const shellCwd = process.cwd();\n\n // Probe for components.json up the directory tree starting from shell CWD\n let projectRoot = shellCwd;\n let probe: string | null = shellCwd;\n for (let i = 0; i < 6 && probe; i += 1) {\n const candidate = resolve(probe, \"components.json\");\n if (existsSync(candidate)) {\n projectRoot = probe;\n try {\n const raw = readFileSync(candidate, \"utf-8\");\n const config = JSON.parse(raw);\n // If UI root not provided via CLI, try to infer from aliases.ui first\n if (!cwd && !process.env.BEJAMAS_UI_ROOT && config?.aliases?.ui) {\n const mapped: string = String(config.aliases.ui);\n let uiAbs: string | null = null;\n if (\n mapped.startsWith(\"./\") ||\n mapped.startsWith(\"../\") ||\n isAbsolute(mapped)\n ) {\n uiAbs = resolve(projectRoot, mapped);\n } else {\n uiAbs = resolveAliasPathUsingTsConfig(mapped, projectRoot);\n }\n if (!uiAbs && mapped.startsWith(\"@/\")) {\n uiAbs = resolve(projectRoot, \"src\", mapped.slice(2));\n }\n if (uiAbs) {\n process.env.BEJAMAS_UI_ROOT = uiAbs;\n }\n }\n // Fallback: infer UI root from tailwind.css\n if (!cwd && !process.env.BEJAMAS_UI_ROOT && config?.tailwind?.css) {\n const cssRaw = String(config.tailwind.css);\n let cssAbs: string | null = null;\n if (\n cssRaw.startsWith(\"./\") ||\n cssRaw.startsWith(\"../\") ||\n isAbsolute(cssRaw)\n ) {\n cssAbs = resolve(projectRoot, cssRaw);\n } else {\n cssAbs = resolveAliasPathUsingTsConfig(cssRaw, projectRoot);\n }\n if (!cssAbs && cssRaw.startsWith(\"@/\")) {\n cssAbs = resolve(projectRoot, \"src\", cssRaw.slice(2));\n }\n if (cssAbs) {\n const uiRootFromCss = resolve(cssAbs, \"..\", \"..\", \"..\");\n process.env.BEJAMAS_UI_ROOT = uiRootFromCss;\n }\n }\n } catch {}\n break;\n }\n const parent = resolve(probe, \"..\");\n probe = parent === probe ? null : parent;\n }\n\n // CLI override takes precedence\n if (cwd && cwd.length) {\n process.env.BEJAMAS_UI_ROOT = resolve(cwd);\n }\n\n let uiRoot: string;\n try {\n uiRoot = resolveUiRoot(shellCwd);\n } catch {\n logger.error(\n \"Unable to locate @bejamas/ui. Use --cwd to specify the UI package path.\",\n );\n process.exit(1);\n }\n\n const componentsDir = join(uiRoot, \"src\", \"components\");\n if (!existsSync(componentsDir)) {\n logger.error(\n `Components directory not found: ${componentsDir}\\n\\n` +\n `Expected structure: <uiRoot>/src/components/*.astro\\n` +\n `Use --cwd to specify a different UI package root.`,\n );\n process.exit(1);\n }\n\n const files = readdirSync(componentsDir, { withFileTypes: true })\n .filter((e) => e.isFile() && extname(e.name).toLowerCase() === \".astro\")\n .map((e) => e.name)\n .sort();\n\n if (files.length === 0) {\n logger.warn(\"No .astro component files found.\");\n process.exit(0);\n }\n\n const results: ComponentDocStatus[] = [];\n for (const file of files) {\n const filePath = join(componentsDir, file);\n const status = checkComponentDocs(filePath, file);\n results.push(status);\n }\n\n const complete = results.filter((r) => r.status === \"complete\");\n const incomplete = results.filter((r) => r.status === \"incomplete\");\n const missing = results.filter((r) => r.status === \"missing\");\n\n const checkResult: CheckResult = {\n total: results.length,\n complete,\n incomplete,\n missing,\n };\n\n if (json) {\n console.log(JSON.stringify(checkResult, null, 2));\n // Exit with error code if there are components missing required docs\n if (missing.length > 0) {\n process.exit(1);\n }\n return;\n }\n\n // Print formatted report\n const termWidth = Math.min(80, process.stdout.columns || 80);\n const headerLine = \"━\".repeat(termWidth);\n\n logger.break();\n console.log(dim(\"┌\" + \"─\".repeat(termWidth - 2) + \"┐\"));\n console.log(\n dim(\"│\") +\n bold(cyan(\" docs:check\")) +\n dim(\" — Component Documentation Status\") +\n \" \".repeat(Math.max(0, termWidth - 47)) +\n dim(\"│\"),\n );\n console.log(dim(\"└\" + \"─\".repeat(termWidth - 2) + \"┘\"));\n logger.break();\n\n // Helper to format tags with color\n const formatTag = (tag: string) => magenta(tag);\n const formatComponentName = (name: string) => bold(white(name));\n\n // Complete components\n if (complete.length > 0) {\n console.log(\n green(\n `✓ Complete (${complete.length} component${complete.length === 1 ? \"\" : \"s\"}):`,\n ),\n );\n const names = complete\n .map((c) => formatComponentName(c.name))\n .join(dim(\", \"));\n console.log(` ${names}`);\n logger.break();\n }\n\n // Incomplete components (missing recommended fields)\n if (incomplete.length > 0) {\n console.log(\n yellow(\n `⚠ Incomplete (${incomplete.length} component${incomplete.length === 1 ? \"\" : \"s\"}):`,\n ),\n );\n for (const comp of incomplete) {\n const missingFields = comp.missingRecommended\n .map(formatTag)\n .join(dim(\", \"));\n console.log(\n ` ${formatComponentName(comp.name)} ${dim(\"-\")} ${dim(\"missing:\")} ${missingFields}`,\n );\n }\n logger.break();\n }\n\n // Missing docs (missing required fields)\n if (missing.length > 0) {\n console.log(\n red(\n `✗ Missing Docs (${missing.length} component${missing.length === 1 ? \"\" : \"s\"}):`,\n ),\n );\n for (const comp of missing) {\n const missingFields = comp.missingRequired\n .map(formatTag)\n .join(dim(\", \"));\n console.log(\n ` ${formatComponentName(comp.name)} ${dim(\"-\")} ${dim(\"missing:\")} ${missingFields}`,\n );\n }\n logger.break();\n }\n\n // Summary\n console.log(dim(headerLine));\n const completeText = green(`${complete.length}/${results.length} complete`);\n const incompleteText =\n incomplete.length > 0\n ? yellow(`${incomplete.length} incomplete`)\n : dim(`${incomplete.length} incomplete`);\n const missingText =\n missing.length > 0\n ? red(`${missing.length} missing docs`)\n : dim(`${missing.length} missing docs`);\n console.log(\n `${bold(\"Summary:\")} ${completeText} ${dim(\"|\")} ${incompleteText} ${dim(\"|\")} ${missingText}`,\n );\n logger.break();\n\n // Exit with error code if there are components missing required docs\n if (missing.length > 0) {\n process.exit(1);\n }\n } catch (err: any) {\n logger.error(err?.message || String(err));\n process.exit(1);\n }\n}\n\nexport const docsCheck = new Command()\n .name(\"docs:check\")\n .description(\"check documentation status for all components\")\n .option(\"-c, --cwd <cwd>\", \"path to UI working directory\")\n .option(\"--json\", \"output results as JSON\")\n .action(async (opts) => {\n await checkDocs({\n cwd: opts.cwd,\n json: Boolean(opts.json),\n });\n });\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport prompts from \"prompts\";\n\nimport {\n syncAstroManagedFontCss,\n syncManagedTailwindCss,\n} from \"@/src/utils/apply-design-system\";\nimport { fixAstroImports } from \"@/src/utils/astro-imports\";\nimport {\n cleanupAstroFontPackages,\n mergeManagedAstroFonts,\n readManagedAstroFontsFromProject,\n syncAstroFontsInProject,\n toManagedAstroFont,\n} from \"@/src/utils/astro-fonts\";\nimport { getConfig, getWorkspaceConfig } from \"@/src/utils/get-config\";\nimport { highlighter } from \"@/src/utils/highlighter\";\nimport { logger } from \"@/src/utils/logger\";\nimport {\n fetchRegistryItem,\n getSubfolderFromPaths,\n reorganizeComponents,\n shouldReorganizeRegistryUiFiles,\n} from \"@/src/utils/reorganize-components\";\nimport {\n buildPinnedShadcnInvocation,\n ensurePinnedShadcnExecPrefix,\n} from \"@/src/utils/shadcn-cli\";\nimport { spinner } from \"@/src/utils/spinner\";\nimport { resolveRegistryUrl } from \"@/src/utils/ui-base-url\";\n\ninterface ParsedOutput {\n created: string[];\n updated: string[];\n skipped: string[];\n}\n\n// Derive only the user-provided flags for shadcn to avoid losing options.\nexport function extractOptionsForShadcn(\n rawArgv: string[],\n cmd: Command,\n): string[] {\n if (typeof cmd.getOptionValueSource === \"function\") {\n const opts = cmd.optsWithGlobals() as Record<string, unknown>;\n const forwarded: string[] = [];\n const getSource = (key: string) => cmd.getOptionValueSource(key);\n\n const addBoolean = (key: string, flag: string, negateFlag?: string) => {\n if (getSource(key) !== \"cli\") return;\n const value = opts[key];\n if (typeof value !== \"boolean\") return;\n if (value) {\n forwarded.push(flag);\n } else if (negateFlag) {\n forwarded.push(negateFlag);\n }\n };\n\n const addString = (key: string, flag: string) => {\n if (getSource(key) !== \"cli\") return;\n const value = opts[key];\n if (typeof value === \"string\") {\n forwarded.push(flag, value);\n }\n };\n\n const addOptionalString = (key: string, flag: string) => {\n if (getSource(key) !== \"cli\") return;\n const value = opts[key];\n if (value === true) {\n forwarded.push(flag);\n return;\n }\n if (typeof value === \"string\") {\n forwarded.push(flag, value);\n }\n };\n\n addBoolean(\"yes\", \"--yes\");\n addBoolean(\"overwrite\", \"--overwrite\");\n addBoolean(\"dryRun\", \"--dry-run\");\n addString(\"cwd\", \"--cwd\");\n addBoolean(\"all\", \"--all\");\n addString(\"path\", \"--path\");\n addBoolean(\"silent\", \"--silent\");\n addBoolean(\"srcDir\", \"--src-dir\", \"--no-src-dir\");\n addOptionalString(\"diff\", \"--diff\");\n addOptionalString(\"view\", \"--view\");\n\n const addIndex = rawArgv.findIndex((arg) => arg === \"add\");\n if (addIndex !== -1) {\n const rest = rawArgv.slice(addIndex + 1);\n const doubleDashIndex = rest.indexOf(\"--\");\n if (doubleDashIndex !== -1) {\n forwarded.push(...rest.slice(doubleDashIndex));\n }\n }\n\n return forwarded;\n }\n\n const addIndex = rawArgv.findIndex((arg) => arg === \"add\");\n if (addIndex === -1) return [];\n const rest = rawArgv.slice(addIndex + 1);\n const forwarded: string[] = [];\n const optionsWithValues = new Set([\n \"-c\",\n \"--cwd\",\n \"-p\",\n \"--path\",\n \"--diff\",\n \"--view\",\n ]);\n const filteredFlags = new Set([\"-v\", \"--verbose\"]);\n\n for (let index = 0; index < rest.length; index += 1) {\n const token = rest[index];\n if (token === \"--\") {\n forwarded.push(\"--\", ...rest.slice(index + 1));\n break;\n }\n if (!token.startsWith(\"-\")) continue;\n if (filteredFlags.has(token)) continue;\n\n forwarded.push(token);\n if (token.includes(\"=\")) continue;\n\n if (optionsWithValues.has(token)) {\n const next = rest[index + 1];\n if (next) {\n forwarded.push(next);\n index += 1;\n }\n }\n }\n\n return forwarded;\n}\n\nexport function hasInspectionFlags(forwardedOptions: string[]) {\n return (\n forwardedOptions.includes(\"--dry-run\") ||\n forwardedOptions.includes(\"--diff\") ||\n forwardedOptions.includes(\"--view\")\n );\n}\n\nexport function formatSkippedFilesHeading(\n count: number,\n overwriteUsed: boolean,\n) {\n const noun = `file${count === 1 ? \"\" : \"s\"}`;\n if (overwriteUsed) {\n return `Skipped ${count} ${noun}: (files might be identical)`;\n }\n\n return `Skipped ${count} ${noun}: (files might be identical, use --overwrite to overwrite)`;\n}\n\ninterface SubfolderMapResult {\n uniqueMap: Map<string, string>;\n sharedFilenames: Set<string>;\n requiresReorganization: boolean;\n}\n\nasync function buildSubfolderMap(\n components: string[],\n uiDir: string,\n registryUrl: string,\n style: string,\n): Promise<SubfolderMapResult> {\n const filenameToSubfolders = new Map<string, string[]>();\n let requiresReorganization = false;\n\n for (const componentName of components) {\n const registryItem = await fetchRegistryItem(\n componentName,\n registryUrl,\n style,\n );\n if (!registryItem) continue;\n\n if (shouldReorganizeRegistryUiFiles(registryItem.files, uiDir)) {\n requiresReorganization = true;\n }\n\n const subfolder = getSubfolderFromPaths(registryItem.files);\n if (!subfolder) continue;\n\n for (const file of registryItem.files) {\n if (file.type === \"registry:ui\") {\n const filename = path.basename(file.path);\n const subfolders = filenameToSubfolders.get(filename) || [];\n subfolders.push(subfolder);\n filenameToSubfolders.set(filename, subfolders);\n }\n }\n }\n\n const uniqueMap = new Map<string, string>();\n const sharedFilenames = new Set<string>();\n\n filenameToSubfolders.forEach((subfolders, filename) => {\n if (subfolders.length === 1) {\n uniqueMap.set(filename, `${subfolders[0]}/${filename}`);\n } else {\n sharedFilenames.add(filename);\n }\n });\n\n return { uniqueMap, sharedFilenames, requiresReorganization };\n}\n\nfunction rewritePaths(\n paths: string[],\n mapResult: SubfolderMapResult,\n): string[] {\n const { uniqueMap, sharedFilenames } = mapResult;\n let currentSubfolder: string | null = null;\n\n return paths.map((filePath) => {\n const filename = path.basename(filePath);\n const parentDir = path.basename(path.dirname(filePath));\n const uniqueMapping = uniqueMap.get(filename);\n\n if (uniqueMapping) {\n const expectedSubfolder = path.dirname(uniqueMapping);\n currentSubfolder = expectedSubfolder;\n\n if (parentDir !== expectedSubfolder) {\n const dir = path.dirname(filePath);\n return `${dir}/${uniqueMapping}`;\n }\n\n return filePath;\n }\n\n if (sharedFilenames.has(filename) && currentSubfolder) {\n if (parentDir !== currentSubfolder) {\n const dir = path.dirname(filePath);\n return `${dir}/${currentSubfolder}/${filename}`;\n }\n }\n\n return filePath;\n });\n}\n\nasync function fetchAvailableComponents(\n registryUrl: string,\n): Promise<{ name: string; type?: string }[]> {\n const indexUrl = `${registryUrl}/index.json`;\n const response = await fetch(indexUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch registry index: ${response.statusText}`);\n }\n\n const data = await response.json();\n return Array.isArray(data) ? data : [];\n}\n\nasync function promptForComponents(\n registryUrl: string,\n): Promise<string[] | null> {\n const checkingSpinner = spinner(\"Checking registry.\").start();\n\n let components: { name: string; type?: string }[];\n try {\n components = await fetchAvailableComponents(registryUrl);\n checkingSpinner.succeed();\n } catch {\n checkingSpinner.fail();\n logger.error(\"Failed to fetch available components from registry.\");\n return null;\n }\n\n if (components.length === 0) {\n logger.warn(\"No components available in registry.\");\n return null;\n }\n\n const uiComponents = components.filter(\n (component) => !component.type || component.type === \"registry:ui\",\n );\n\n const choices = uiComponents.map((component) => ({\n title: component.name,\n value: component.name,\n }));\n\n const { selected } = await prompts({\n type: \"autocompleteMultiselect\",\n name: \"selected\",\n message: \"Which components would you like to add?\",\n choices,\n hint: \"- Space to select. Return to submit.\",\n instructions: false,\n });\n\n if (!selected) {\n return null;\n }\n\n return selected;\n}\n\nfunction parseShadcnOutput(stdout: string, stderr: string): ParsedOutput {\n const result: ParsedOutput = { created: [], updated: [], skipped: [] };\n const cleanStderr = stderr.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n const cleanStdout = stdout.replace(/\\x1b\\[[0-9;]*m/g, \"\");\n\n const createdMatch = cleanStderr.match(/Created\\s+(\\d+)\\s+file/i);\n const updatedMatch = cleanStderr.match(/Updated\\s+(\\d+)\\s+file/i);\n const skippedMatch = cleanStderr.match(/Skipped\\s+(\\d+)\\s+file/i);\n\n const createdCount = createdMatch ? parseInt(createdMatch[1], 10) : 0;\n const updatedCount = updatedMatch ? parseInt(updatedMatch[1], 10) : 0;\n const skippedCount = skippedMatch ? parseInt(skippedMatch[1], 10) : 0;\n\n const allPaths: string[] = [];\n for (const line of cleanStdout.split(\"\\n\")) {\n const match = line.match(/^\\s+-\\s+(.+)$/);\n if (match) {\n allPaths.push(match[1].trim());\n }\n }\n\n for (const line of cleanStderr.split(\"\\n\")) {\n const match = line.match(/^\\s+-\\s+(.+)$/);\n if (match) {\n const filePath = match[1].trim();\n if (!allPaths.includes(filePath)) {\n allPaths.push(filePath);\n }\n }\n }\n\n let index = 0;\n for (\n let count = 0;\n count < createdCount && index < allPaths.length;\n count += 1\n ) {\n result.created.push(allPaths[index]);\n index += 1;\n }\n for (\n let count = 0;\n count < updatedCount && index < allPaths.length;\n count += 1\n ) {\n result.updated.push(allPaths[index]);\n index += 1;\n }\n for (\n let count = 0;\n count < skippedCount && index < allPaths.length;\n count += 1\n ) {\n result.skipped.push(allPaths[index]);\n index += 1;\n }\n\n return result;\n}\n\nasync function addComponents(\n cwd: string,\n packages: string[],\n forwardedOptions: string[],\n isVerbose: boolean,\n isSilent: boolean,\n inspectionMode: boolean,\n): Promise<ParsedOutput> {\n const env = {\n ...process.env,\n REGISTRY_URL: resolveRegistryUrl(),\n };\n await ensurePinnedShadcnExecPrefix();\n const shadcnArgs = buildShadcnAddArgs(packages, forwardedOptions);\n const invocation = buildPinnedShadcnInvocation(shadcnArgs);\n\n if (isVerbose) {\n logger.info(`[bejamas-ui] ${invocation.cmd} ${invocation.args.join(\" \")}`);\n }\n\n const registrySpinner = spinner(\"Checking registry.\", { silent: isSilent });\n registrySpinner.start();\n\n try {\n const result = await execa(invocation.cmd, invocation.args, {\n cwd,\n env,\n input: \"n\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\nn\\n\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n reject: false,\n });\n\n registrySpinner.succeed();\n\n const installSpinner = spinner(\"Installing components.\", {\n silent: isSilent,\n });\n installSpinner.succeed();\n\n const stdout = result.stdout || \"\";\n const stderr = result.stderr || \"\";\n\n if (isVerbose) {\n logger.info(`[bejamas-ui] Raw stdout: ${stdout}`);\n logger.info(`[bejamas-ui] Raw stderr: ${stderr}`);\n }\n\n if (inspectionMode) {\n if (stdout) {\n process.stdout.write(stdout.endsWith(\"\\n\") ? stdout : `${stdout}\\n`);\n }\n if (stderr) {\n process.stderr.write(stderr.endsWith(\"\\n\") ? stderr : `${stderr}\\n`);\n }\n }\n\n const parsed = inspectionMode\n ? { created: [], updated: [], skipped: [] }\n : parseShadcnOutput(stdout, stderr);\n\n if (result.exitCode !== 0) {\n if (result.stderr) {\n logger.error(result.stderr);\n }\n process.exit(result.exitCode);\n }\n\n return parsed;\n } catch {\n registrySpinner.fail();\n logger.error(\"Failed to add components\");\n process.exit(1);\n }\n}\n\nexport function buildShadcnAddArgs(\n packages: string[],\n forwardedOptions: string[],\n) {\n const autoFlags: string[] = [];\n if (!forwardedOptions.includes(\"--yes\")) {\n autoFlags.push(\"--yes\");\n }\n\n return [\"add\", ...packages, ...autoFlags, ...forwardedOptions];\n}\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"Add components via the Bejamas-managed shadcn registry flow\")\n .argument(\"[components...]\", \"Component package names to add\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\"-o, --overwrite\", \"overwrite existing files.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .option(\"-a, --all\", \"add all available components\", false)\n .option(\"-p, --path <path>\", \"the path to add the component to.\")\n .option(\"-s, --silent\", \"mute output.\", false)\n .option(\"--dry-run\", \"preview changes without writing files.\", false)\n .option(\"--diff [path]\", \"show diff for a file.\")\n .option(\"--view [path]\", \"show file contents.\")\n .option(\n \"--src-dir\",\n \"use the src directory when creating a new project.\",\n false,\n )\n .option(\n \"--no-src-dir\",\n \"do not use the src directory when creating a new project.\",\n )\n .action(async function action(packages: string[], _opts, cmd) {\n const root = cmd?.parent;\n const verbose = Boolean(root?.opts?.().verbose);\n const rawArgv = process.argv.slice(2);\n const forwardedOptions = extractOptionsForShadcn(rawArgv, cmd);\n const opts =\n typeof cmd.optsWithGlobals === \"function\"\n ? cmd.optsWithGlobals()\n : (cmd.opts?.() ?? {});\n const inspectionMode = hasInspectionFlags(forwardedOptions);\n const overwriteUsed =\n forwardedOptions.includes(\"--overwrite\") ||\n forwardedOptions.includes(\"-o\");\n const cwd = opts.cwd || process.cwd();\n\n let componentsToAdd = packages || [];\n const wantsAll = Boolean(opts.all);\n const isSilent = opts.silent || false;\n const registryUrl = resolveRegistryUrl();\n\n if (wantsAll && componentsToAdd.length === 0) {\n const fetchingSpinner = spinner(\"Fetching available components.\", {\n silent: isSilent,\n }).start();\n try {\n const allComponents = await fetchAvailableComponents(registryUrl);\n const uiComponents = allComponents.filter(\n (component) => !component.type || component.type === \"registry:ui\",\n );\n componentsToAdd = uiComponents.map((component) => component.name);\n fetchingSpinner.succeed();\n } catch {\n fetchingSpinner.fail();\n logger.error(\"Failed to fetch available components from registry.\");\n process.exit(1);\n }\n }\n\n if (componentsToAdd.length === 0) {\n const selected = await promptForComponents(registryUrl);\n if (!selected || selected.length === 0) {\n return;\n }\n componentsToAdd = selected;\n }\n\n const config = await getConfig(cwd);\n let uiDir = config?.resolvedPaths?.ui || \"\";\n let uiConfig = config;\n\n if (config) {\n const workspaceConfig = await getWorkspaceConfig(config);\n if (workspaceConfig?.ui) {\n uiConfig = workspaceConfig.ui;\n uiDir = uiConfig.resolvedPaths?.ui || uiDir;\n }\n }\n\n if (verbose) {\n logger.info(`[bejamas-ui] cwd: ${cwd}`);\n logger.info(`[bejamas-ui] uiDir: ${uiDir}`);\n logger.info(\n `[bejamas-ui] aliases.ui: ${uiConfig?.aliases?.ui || \"not set\"}`,\n );\n }\n\n const activeStyle = uiConfig?.style || config?.style || \"bejamas-juno\";\n const totalComponents = componentsToAdd.length;\n\n for (let index = 0; index < componentsToAdd.length; index += 1) {\n const component = componentsToAdd[index];\n\n if (totalComponents > 1 && !isSilent) {\n logger.break();\n logger.info(\n highlighter.info(`[${index + 1}/${totalComponents}]`) +\n ` Adding ${highlighter.success(component)}...`,\n );\n }\n\n const subfolderMapResult = inspectionMode\n ? {\n uniqueMap: new Map<string, string>(),\n sharedFilenames: new Set<string>(),\n requiresReorganization: false,\n }\n : await buildSubfolderMap([component], uiDir, registryUrl, activeStyle);\n\n const parsed = await addComponents(\n cwd,\n [component],\n forwardedOptions,\n verbose,\n isSilent,\n inspectionMode,\n );\n\n if (!inspectionMode) {\n await syncManagedTailwindCss(cwd);\n\n const registryItem = await fetchRegistryItem(\n component,\n registryUrl,\n activeStyle,\n );\n\n if (registryItem?.type === \"registry:font\") {\n const nextFont = toManagedAstroFont(registryItem.name);\n\n if (nextFont) {\n const currentFonts = await readManagedAstroFontsFromProject(cwd);\n const nextFonts = mergeManagedAstroFonts(currentFonts, nextFont);\n await syncAstroFontsInProject(cwd, nextFonts, nextFont.cssVariable);\n await syncAstroManagedFontCss(cwd, nextFont.cssVariable);\n await cleanupAstroFontPackages(cwd);\n }\n }\n }\n\n let skippedCount = 0;\n if (\n !inspectionMode &&\n uiDir &&\n subfolderMapResult.requiresReorganization\n ) {\n const reorgResult = await reorganizeComponents(\n [component],\n uiDir,\n registryUrl,\n verbose,\n activeStyle,\n );\n skippedCount = reorgResult.skippedFiles.length;\n }\n\n if (!isSilent && !inspectionMode) {\n const actuallyCreated = Math.max(\n 0,\n parsed.created.length - skippedCount,\n );\n\n if (actuallyCreated > 0) {\n const createdPaths = rewritePaths(\n parsed.created.slice(0, actuallyCreated),\n subfolderMapResult,\n );\n logger.success(\n `Created ${createdPaths.length} file${createdPaths.length > 1 ? \"s\" : \"\"}:`,\n );\n for (const file of createdPaths) {\n logger.log(` ${highlighter.info(\"-\")} ${file}`);\n }\n }\n\n if (parsed.updated.length > 0) {\n const uniqueUpdated = Array.from(new Set(parsed.updated));\n const updatedPaths = rewritePaths(uniqueUpdated, subfolderMapResult);\n logger.info(\n `Updated ${updatedPaths.length} file${updatedPaths.length > 1 ? \"s\" : \"\"}:`,\n );\n for (const file of updatedPaths) {\n logger.log(` ${highlighter.info(\"-\")} ${file}`);\n }\n }\n\n if (skippedCount > 0) {\n logger.info(\n `Skipped ${skippedCount} file${skippedCount > 1 ? \"s\" : \"\"}: (already exists)`,\n );\n }\n\n if (parsed.skipped.length > 0) {\n const skippedPaths = rewritePaths(parsed.skipped, subfolderMapResult);\n logger.info(\n formatSkippedFilesHeading(skippedPaths.length, overwriteUsed),\n );\n for (const file of skippedPaths) {\n logger.log(` ${highlighter.info(\"-\")} ${file}`);\n }\n }\n\n if (\n actuallyCreated === 0 &&\n parsed.updated.length === 0 &&\n skippedCount === 0 &&\n parsed.skipped.length === 0\n ) {\n logger.info(\"Already up to date.\");\n }\n }\n }\n\n if (!inspectionMode) {\n await fixAstroImports(cwd, verbose);\n }\n });\n","import path from \"node:path\";\nimport { Command } from \"commander\";\nimport {\n extractPassthroughArgs,\n runShadcnCommand,\n} from \"@/src/utils/shadcn-command\";\n\nexport const info = new Command()\n .name(\"info\")\n .description(\"proxy to shadcn info\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd(),\n )\n .option(\"--json\", \"output as JSON.\", false)\n .action(async (opts) => {\n const cwd = path.resolve(opts.cwd ?? process.cwd());\n const rawArgv = process.argv.slice(2);\n const args = [\"info\", \"--cwd\", cwd];\n\n if (opts.json) {\n args.push(\"--json\");\n }\n\n const passthroughArgs = extractPassthroughArgs(rawArgv, \"info\");\n if (passthroughArgs.length > 0) {\n args.push(...passthroughArgs);\n }\n\n try {\n await runShadcnCommand({ cwd, args });\n } catch {\n process.exit(1);\n }\n });\n","#!/usr/bin/env node\n\nimport { Command } from \"commander\";\nimport { createRequire } from \"module\";\nimport { init } from \"@/src/commands/init\";\nimport { docs } from \"@/src/commands/docs\";\nimport { docsBuild } from \"@/src/commands/docs-build\";\nimport { docsCheck } from \"@/src/commands/docs-check\";\nimport { add } from \"@/src/commands/add\";\nimport { info } from \"@/src/commands/info\";\n\nconst require = createRequire(import.meta.url);\nconst pkg = require(\"../package.json\");\n\nconst program = new Command()\n .name(\"bejamas\")\n .description(\"bejamas/ui cli\")\n .configureHelp({\n helpWidth: Math.min(100, process.stdout.columns || 100),\n })\n .version(pkg.version, \"-v, --version\", \"output the version number\");\n\nprogram.addCommand(init);\nprogram.addCommand(add);\nprogram.addCommand(info);\nprogram.addCommand(docs);\nprogram.addCommand(docsBuild);\nprogram.addCommand(docsCheck);\n\nprogram.parse(process.argv);\n\nexport default program;\n"],"mappings":"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"}
|