bejamas 0.1.0 → 0.2.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 +2 -2
- package/dist/{generate-mdx-CR4bXlml.js → generate-mdx-5r1bKyim.js} +3 -263
- package/dist/generate-mdx-5r1bKyim.js.map +1 -0
- package/dist/index.js +188 -8
- package/dist/index.js.map +1 -1
- package/dist/utils-DfvCox_O.js +479 -0
- package/dist/utils-DfvCox_O.js.map +1 -0
- package/package.json +1 -1
- package/dist/generate-mdx-CR4bXlml.js.map +0 -1
- package/dist/get-config-CJUwQ2Xb.js +0 -217
- package/dist/get-config-CJUwQ2Xb.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["errors: Record<string, boolean>","fs","ERRORS.MISSING_DIR_OR_EMPTY_PROJECT","context: RegistryContext","template: keyof typeof TEMPLATES","projectName: string","fs","TEMPLATE_TAR_SUBPATH: Record<keyof typeof TEMPLATES, string>","headers: Record<string, string>","DEFAULT_REGISTRY_URL","ERRORS.MISSING_DIR_OR_EMPTY_PROJECT","dirname","baseUrl: string","paths: Record<string, string[] | string>","probe: string | null","mapped: string","uiAbs: string | null","cssAbs: string | null","outResolved: string | null","relative","err: any","path","forwarded: string[]","addIndex","rest","forwarded","args: 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/commands/init.ts","../src/commands/docs.ts","../src/utils/astro-imports.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 shadcn@latest 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 shadcn@latest 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 { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { preFlightInit } from \"@/src/preflights/preflight-init\";\n\nimport { BASE_COLORS, BUILTIN_REGISTRIES } from \"@/src/registry/constants\";\nimport { clearRegistryContext } from \"@/src/registry/context\";\n\nimport { TEMPLATES, createProject } from \"@/src/utils/create-project\";\nimport * as ERRORS from \"@/src/utils/errors\";\nimport { getConfig, createConfig, type Config } from \"@/src/utils/get-config\";\nimport { getProjectConfig, getProjectInfo } from \"@/src/utils/get-project-info\";\nimport { getPackageRunner } 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 { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport fsExtra from \"fs-extra\";\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\";\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\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});\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 projectInfo;\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 projectInfo = preflight.projectInfo;\n } else {\n projectInfo = await getProjectInfo(options.cwd);\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 const shadcnBin = process.platform === \"win32\" ? \"shadcn.cmd\" : \"shadcn\";\n const localShadcnPath = path.resolve(\n options.cwd,\n \"node_modules\",\n \".bin\",\n shadcnBin,\n );\n\n try {\n const env = {\n ...process.env,\n REGISTRY_URL: process.env.REGISTRY_URL || DEFAULT_REGISTRY_URL,\n };\n if (await fsExtra.pathExists(localShadcnPath)) {\n await execa(localShadcnPath, [\"init\", \"--base-color\", \"neutral\"], {\n stdio: \"inherit\",\n cwd: options.cwd,\n env,\n });\n } else {\n // Follow user's runner preference (npx, bunx, pnpm dlx)\n await execa(\n \"npx\",\n [\"-y\", \"shadcn@latest\", \"init\", \"--base-color\", \"neutral\"],\n {\n stdio: \"inherit\",\n cwd: options.cwd,\n env,\n },\n );\n }\n } catch (err) {\n // shadcn already printed the detailed error to stdio, avoid double-reporting\n process.exit(1);\n }\n}\n","import { Command } from \"commander\";\nimport { dirname, resolve, isAbsolute, relative } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { logger } from \"@/src/utils/logger\";\nimport prompts from \"prompts\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nfunction 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\nfunction 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\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 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 { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport { logger } from \"@/src/utils/logger\";\nimport { getPackageRunner } from \"@/src/utils/get-package-manager\";\nimport { fixAstroImports } from \"@/src/utils/astro-imports\";\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\nasync function addComponents(\n packages: string[],\n forwardedOptions: string[],\n isVerbose: boolean,\n) {\n // Build the command by passing through all args to shadcn\n const runner = await getPackageRunner(process.cwd());\n const env = {\n ...process.env,\n REGISTRY_URL: process.env.REGISTRY_URL || DEFAULT_REGISTRY_URL,\n };\n const baseArgs = [\"shadcn@latest\", \"add\", ...packages, ...forwardedOptions];\n\n let cmd = \"npx\";\n let args: string[] = [\"-y\", ...baseArgs];\n if (runner === \"bunx\") {\n cmd = \"bunx\";\n args = baseArgs;\n } else if (runner === \"pnpm dlx\") {\n cmd = \"pnpm\";\n args = [\"dlx\", ...baseArgs];\n } else if (runner === \"npx\") {\n cmd = \"npx\";\n args = [\"-y\", ...baseArgs];\n }\n\n if (isVerbose) {\n logger.info(`[bejamas-ui] ${cmd} ${args.join(\" \")}`);\n }\n try {\n await execa(cmd, args, { stdio: \"inherit\", env });\n } catch (err) {\n // shadcn prints detailed error to stdio; avoid double-reporting\n process.exit(1);\n }\n}\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"Add components via shadcn@latest using registry URLs\")\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 // Pass packages and all flags directly to shadcn\n await addComponents(packages || [], forwardedOptions, verbose);\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 { 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);\n\nprogram.parse(process.argv);\n\nexport default program;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["errors: Record<string, boolean>","fs","ERRORS.MISSING_DIR_OR_EMPTY_PROJECT","context: RegistryContext","template: keyof typeof TEMPLATES","projectName: string","fs","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","path","forwarded: string[]","addIndex","rest","forwarded","args: 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/commands/init.ts","../src/utils/tsconfig-utils.ts","../src/commands/docs.ts","../src/commands/docs-check.ts","../src/utils/astro-imports.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 shadcn@latest 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 shadcn@latest 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 { promises as fs } from \"fs\";\nimport path from \"path\";\nimport { preFlightInit } from \"@/src/preflights/preflight-init\";\n\nimport { BASE_COLORS, BUILTIN_REGISTRIES } from \"@/src/registry/constants\";\nimport { clearRegistryContext } from \"@/src/registry/context\";\n\nimport { TEMPLATES, createProject } from \"@/src/utils/create-project\";\nimport * as ERRORS from \"@/src/utils/errors\";\nimport { getConfig, createConfig, type Config } from \"@/src/utils/get-config\";\nimport { getProjectConfig, getProjectInfo } from \"@/src/utils/get-project-info\";\nimport { getPackageRunner } 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 { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport fsExtra from \"fs-extra\";\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\";\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\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});\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 projectInfo;\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 projectInfo = preflight.projectInfo;\n } else {\n projectInfo = await getProjectInfo(options.cwd);\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 const shadcnBin = process.platform === \"win32\" ? \"shadcn.cmd\" : \"shadcn\";\n const localShadcnPath = path.resolve(\n options.cwd,\n \"node_modules\",\n \".bin\",\n shadcnBin,\n );\n\n try {\n const env = {\n ...process.env,\n REGISTRY_URL: process.env.REGISTRY_URL || DEFAULT_REGISTRY_URL,\n };\n if (await fsExtra.pathExists(localShadcnPath)) {\n await execa(localShadcnPath, [\"init\", \"--base-color\", \"neutral\"], {\n stdio: \"inherit\",\n cwd: options.cwd,\n env,\n });\n } else {\n // Follow user's runner preference (npx, bunx, pnpm dlx)\n await execa(\n \"npx\",\n [\"-y\", \"shadcn@latest\", \"init\", \"--base-color\", \"neutral\"],\n {\n stdio: \"inherit\",\n cwd: options.cwd,\n env,\n },\n );\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 { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport { logger } from \"@/src/utils/logger\";\nimport { getPackageRunner } from \"@/src/utils/get-package-manager\";\nimport { fixAstroImports } from \"@/src/utils/astro-imports\";\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\nasync function addComponents(\n packages: string[],\n forwardedOptions: string[],\n isVerbose: boolean,\n) {\n // Build the command by passing through all args to shadcn\n const runner = await getPackageRunner(process.cwd());\n const env = {\n ...process.env,\n REGISTRY_URL: process.env.REGISTRY_URL || DEFAULT_REGISTRY_URL,\n };\n const baseArgs = [\"shadcn@latest\", \"add\", ...packages, ...forwardedOptions];\n\n let cmd = \"npx\";\n let args: string[] = [\"-y\", ...baseArgs];\n if (runner === \"bunx\") {\n cmd = \"bunx\";\n args = baseArgs;\n } else if (runner === \"pnpm dlx\") {\n cmd = \"pnpm\";\n args = [\"dlx\", ...baseArgs];\n } else if (runner === \"npx\") {\n cmd = \"npx\";\n args = [\"-y\", ...baseArgs];\n }\n\n if (isVerbose) {\n logger.info(`[bejamas-ui] ${cmd} ${args.join(\" \")}`);\n }\n try {\n await execa(cmd, args, { stdio: \"inherit\", env });\n } catch (err) {\n // shadcn prints detailed error to stdio; avoid double-reporting\n process.exit(1);\n }\n}\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"Add components via shadcn@latest using registry URLs\")\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 // Pass packages and all flags directly to shadcn\n await addComponents(packages || [], forwardedOptions, verbose);\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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"}
|