shadcn 2.4.1 → 2.5.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/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/add.ts","../src/commands/init.ts","../src/preflights/preflight-init.ts","../src/utils/errors.ts","../src/utils/add-components.ts","../src/utils/updaters/update-css.ts","../src/utils/updaters/update-css-vars.ts","../src/utils/get-package-manager.ts","../src/utils/updaters/update-dependencies.ts","../src/utils/updaters/update-files.ts","../src/utils/transformers/index.ts","../src/utils/transformers/transform-css-vars.ts","../src/utils/icon-libraries.ts","../src/utils/transformers/transform-icons.ts","../src/utils/transformers/transform-import.ts","../src/utils/transformers/transform-jsx.ts","../src/utils/transformers/transform-rsc.ts","../src/utils/transformers/transform-tw-prefix.ts","../src/utils/create-project.ts","../src/utils/updaters/update-tailwind-content.ts","../src/preflights/preflight-add.ts","../src/utils/update-app-index.ts","../src/commands/build.ts","../src/preflights/preflight-build.ts","../src/commands/diff.ts","../src/commands/info.ts","../src/commands/migrate.ts","../src/migrations/migrate-icons.ts","../src/preflights/preflight-migrate.ts","../src/index.ts","../package.json"],"names":["path","fs","MISSING_DIR_OR_EMPTY_PROJECT","MISSING_CONFIG","TAILWIND_NOT_CONFIGURED","IMPORT_ALIAS_MISSING","UNSUPPORTED_FRAMEWORK","BUILD_MISSING_REGISTRY_FILE","preFlightInit","options","errors","projectSpinner","spinner","logger","highlighter","frameworkSpinner","projectInfo","getProjectInfo","tailwindSpinnerMessage","tailwindSpinner","tsConfigSpinner","postcss","updateCss","css","config","cssFilepath","cssFilepathRelative","cssSpinner","raw","output","transformCss","input","plugins","updateCssPlugin","root","selector","properties","atRuleMatch","name","params","themeInline","node","keyframesRule","step","stepProps","processRule","utilityAtRule","prop","value","existingDecl","decl","atRule","processAtRule","childSelector","childProps","nestedMatch","nestedName","nestedParams","tempRule","rule","clone","error","parent","nestedSelector","AtRule","z","updateCssVars","cssVars","cssVarsSpinner","transformCssVars","updateCssVarsPlugin","cleanupDefaultNextStylesPlugin","packageInfo","getPackageInfo","addCustomImport","addCustomVariant","updateCssVarsPluginV4","updateThemePlugin","updateTailwindConfigPlugin","updateTailwindConfigAnimationPlugin","updateTailwindConfigKeyframesPlugin","updateBaseLayerPlugin","tailwindVersion","requiredRules","baseLayer","apply","applyRule","key","vars","addOrUpdateVars","removeConflictVars","rootRule","propsToRemove","bodyRule","darkRootRule","ruleNode","newDecl","themeNode","upsertThemeNode","isLocalHSLValue","variables","themeVarNodes","variable","radiusVariables","cssVarNode","isColorValue","propValue","importNodes","variantNode","lastImport","customVariantNode","importNode","tailwindConfig","quote","getQuoteType","pluginNodes","lastPluginNode","plugin","pluginName","pluginNode","existingKeyFrameNodes","keyframeValueSchema","keyframeName","keyframeValue","parsedKeyframeValue","keyframeNode","values","existingAnimationNodes","parsedAnimationValue","animationNode","chunks","chunk","detect","getPackageManager","targetDir","withFallback","packageManager","userAgent","execa","prompts","updateDependencies","dependencies","dependenciesSpinner","flag","isUsingReact19","confirmation","existsSync","basename","tmpdir","SyntaxKind","sourceFile","baseColor","valueWithColorMapping","applyColorMapping","splitClassName","className","parts","rest","alpha","split","variant","PREFIXES","mapping","classNames","lightMode","darkMode","modifier","prefix","needle","ICON_LIBRARIES","SOURCE_LIBRARY","transformIcons","registryIcons","getRegistryIcons","sourceLibrary","targetLibrary","targetedIcons","importDeclaration","specifier","iconName","targetedIcon","iconImportDeclaration","icon","_useSemicolon","transformImport","isRemote","utilsImport","importDeclarations","moduleSpecifier","updateImportAliases","i","alias","transformFromAstSync","parse","transformTypescript","recast","PARSE_OPTIONS","transformJsx","ast","code","result","directiveRegex","transformRsc","first","Project","ScriptKind","transformTwPrefixes","defaultClassNames","applyPrefix","callExpression","arg","prefixed","project","createTempSourceFile","filename","dir","transform","opts","transformers","tempFile","transformer","updateFiles","files","filesCreatedSpinner","getRegistryBaseColor","filesCreated","filesUpdated","filesSkipped","file","filePath","resolveFilePath","findCommonRoot","f","fileName","match","existingFile","content","existingFileContent","normalizedExisting","normalizedNew","getNormalizedFileContent","overwrite","target","resolvePageTarget","resolveFileTargetDirectory","relativePath","resolveNestedFilePath","paths","normalizedPaths","p","normalizedNeedle","needleDir","needleSegments","testPath","normalizedFilePath","normalizedTargetDir","fileSegments","targetSegments","lastTargetSegment","commonDirIndex","segment","framework","addComponents","components","workspaceConfig","getWorkspaceConfig","addWorkspaceComponents","addProjectComponents","registrySpinner","tree","registryResolveItemsTree","handleError","getProjectTailwindVersionFromConfig","updateTailwindConfig","overwriteCssVars","shouldOverwriteCssVars","registryItems","resolveRegistryItems","fetchRegistry","payload","registryItemSchema","registryParentMap","getRegistryParentMap","registryTypeAliasMap","getRegistryTypeAliasMap","rootSpinner","component","registryParent","targetConfig","workspaceRoot","packageRoot","findPackageRoot","os","MONOREPO_TEMPLATE_URL","TEMPLATES","createProject","template","projectName","nextVersion","isRemoteComponent","meta","type","projectPath","createNextProject","createMonorepoProject","createSpinner","args","templatePath","response","tarPath","extractedPath","cwd","updateTailwindContent","tailwindFileRelativePath","transformTailwindContent","_createSourceFile","configObject","property","addTailwindConfigContent","quoteChar","_getQuoteChar","existingProperty","newProperty","initializer","contentItem","newValue","element","Command","initOptionsSchema","val","BASE_COLORS","color","init","isUrl","item","getRegistryItem","runInit","newProjectTemplate","preflight","getConfig","projectConfig","getProjectConfig","promptForMinimalConfig","promptForConfig","proceed","componentSpinner","targetPath","fullConfig","resolveConfigPaths","defaultConfig","styles","baseColors","getRegistryStyles","getRegistryBaseColors","style","DEFAULT_TAILWIND_CSS","DEFAULT_TAILWIND_CONFIG","DEFAULT_COMPONENTS","DEFAULT_UTILS","rawConfigSchema","cssVariables","preFlightAdd","updateAppIndex","indexPath","registryItem","DEPRECATED_COMPONENTS","addOptionsSchema","add","itemType","confirm","promptForRegistryComponents","deprecatedComponents","shouldUpdateAppIndex","registryIndex","getRegistryIndex","entry","c","preFlightBuild","resolvePaths","buildOptionsSchema","build","registry","registrySchema","buildSpinner","diffLines","updateOptionsSchema","diff","projectComponents","componentsWithUpdates","changes","diffComponent","change","printDiff","fetchTree","getItemTargetPath","fileContent","registryContent","patch","part","info","randomBytes","fg","migrateIcons","uiPath","libraryChoices","iconLibrary","migrateOptions","migrationSpinner","migrateIconsFile","iconsMapping","sourceLibraryImport","targetLibraryImport","preFlightMigrate","migrations","migrateOptionsSchema","migration","migrate","package_default","main","program"],"mappings":"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","sourcesContent":["import path from \"path\"\nimport { runInit } from \"@/src/commands/init\"\nimport { preFlightAdd } from \"@/src/preflights/preflight-add\"\nimport { getRegistryIndex, getRegistryItem, isUrl } from \"@/src/registry/api\"\nimport { registryItemTypeSchema } from \"@/src/registry/schema\"\nimport { addComponents } from \"@/src/utils/add-components\"\nimport { createProject } from \"@/src/utils/create-project\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { updateAppIndex } from \"@/src/utils/update-app-index\"\nimport { Command } from \"commander\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\n\nconst DEPRECATED_COMPONENTS = [\n {\n name: \"toast\",\n deprecatedBy: \"sonner\",\n message:\n \"The toast component is deprecated. Use the sonner component instead.\",\n },\n {\n name: \"toaster\",\n deprecatedBy: \"sonner\",\n message:\n \"The toaster component is deprecated. Use the sonner component instead.\",\n },\n]\n\nexport const addOptionsSchema = z.object({\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n overwrite: z.boolean(),\n cwd: z.string(),\n all: z.boolean(),\n path: z.string().optional(),\n silent: z.boolean(),\n srcDir: z.boolean().optional(),\n cssVariables: z.boolean(),\n})\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"add a component to your project\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\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 (components, opts) => {\n try {\n const options = addOptionsSchema.parse({\n components,\n cwd: path.resolve(opts.cwd),\n ...opts,\n })\n\n let itemType: z.infer<typeof registryItemTypeSchema> | undefined\n\n if (components.length > 0 && isUrl(components[0])) {\n const item = await getRegistryItem(components[0], \"\")\n itemType = item?.type\n }\n\n if (\n !options.yes &&\n (itemType === \"registry:style\" || itemType === \"registry:theme\")\n ) {\n logger.break()\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: highlighter.warn(\n `You are about to install a new ${itemType.replace(\n \"registry:\",\n \"\"\n )}. \\nExisting CSS variables and components will be overwritten. Continue?`\n ),\n })\n if (!confirm) {\n logger.break()\n logger.log(`Installation cancelled.`)\n logger.break()\n process.exit(1)\n }\n }\n\n if (!options.components?.length) {\n options.components = await promptForRegistryComponents(options)\n }\n\n const projectInfo = await getProjectInfo(options.cwd)\n if (projectInfo?.tailwindVersion === \"v4\") {\n const deprecatedComponents = DEPRECATED_COMPONENTS.filter((component) =>\n options.components?.includes(component.name)\n )\n\n if (deprecatedComponents?.length) {\n logger.break()\n deprecatedComponents.forEach((component) => {\n logger.warn(highlighter.warn(component.message))\n })\n logger.break()\n process.exit(1)\n }\n }\n\n let { errors, config } = await preFlightAdd(options)\n\n // No components.json file. Prompt the user to run init.\n if (errors[ERRORS.MISSING_CONFIG]) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `You need to create a ${highlighter.info(\n \"components.json\"\n )} file to add components. Proceed?`,\n initial: true,\n })\n\n if (!proceed) {\n logger.break()\n process.exit(1)\n }\n\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: false,\n silent: true,\n isNewProject: false,\n srcDir: options.srcDir,\n cssVariables: options.cssVariables,\n style: \"index\",\n })\n }\n\n let shouldUpdateAppIndex = false\n if (errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT]) {\n const { projectPath, template } = await createProject({\n cwd: options.cwd,\n force: options.overwrite,\n srcDir: options.srcDir,\n components: options.components,\n })\n if (!projectPath) {\n logger.break()\n process.exit(1)\n }\n options.cwd = projectPath\n\n if (template === \"next-monorepo\") {\n options.cwd = path.resolve(options.cwd, \"apps/web\")\n config = await getConfig(options.cwd)\n } else {\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: true,\n silent: true,\n isNewProject: true,\n srcDir: options.srcDir,\n cssVariables: options.cssVariables,\n style: \"index\",\n })\n\n shouldUpdateAppIndex =\n options.components?.length === 1 &&\n !!options.components[0].match(/\\/chat\\/b\\//)\n }\n }\n\n if (!config) {\n throw new Error(\n `Failed to read config at ${highlighter.info(options.cwd)}.`\n )\n }\n\n await addComponents(options.components, config, options)\n\n // If we're adding a single component and it's from the v0 registry,\n // let's update the app/page.tsx file to import the component.\n if (shouldUpdateAppIndex) {\n await updateAppIndex(options.components[0], config)\n }\n } catch (error) {\n logger.break()\n handleError(error)\n }\n })\n\nasync function promptForRegistryComponents(\n options: z.infer<typeof addOptionsSchema>\n) {\n const registryIndex = await getRegistryIndex()\n if (!registryIndex) {\n logger.break()\n handleError(new Error(\"Failed to fetch registry index.\"))\n return []\n }\n\n if (options.all) {\n return registryIndex\n .map((entry) => entry.name)\n .filter(\n (component) => !DEPRECATED_COMPONENTS.some((c) => c.name === component)\n )\n }\n\n if (options.components?.length) {\n return options.components\n }\n\n const { components } = await prompts({\n type: \"multiselect\",\n name: \"components\",\n message: \"Which components would you like to add?\",\n hint: \"Space to select. A to toggle all. Enter to submit.\",\n instructions: false,\n choices: registryIndex\n .filter(\n (entry) =>\n entry.type === \"registry:ui\" &&\n !DEPRECATED_COMPONENTS.some(\n (component) => component.name === entry.name\n )\n )\n .map((entry) => ({\n title: entry.name,\n value: entry.name,\n selected: options.all ? true : options.components?.includes(entry.name),\n })),\n })\n\n if (!components?.length) {\n logger.warn(\"No components selected. Exiting.\")\n logger.info(\"\")\n process.exit(1)\n }\n\n const result = z.array(z.string()).safeParse(components)\n if (!result.success) {\n logger.error(\"\")\n handleError(new Error(\"Something went wrong. Please try again.\"))\n return []\n }\n return result.data\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { preFlightInit } from \"@/src/preflights/preflight-init\"\nimport {\n BASE_COLORS,\n getRegistryBaseColors,\n getRegistryItem,\n getRegistryStyles,\n isUrl,\n} from \"@/src/registry/api\"\nimport { addComponents } from \"@/src/utils/add-components\"\nimport { TEMPLATES, createProject } from \"@/src/utils/create-project\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport {\n DEFAULT_COMPONENTS,\n DEFAULT_TAILWIND_CONFIG,\n DEFAULT_TAILWIND_CSS,\n DEFAULT_UTILS,\n getConfig,\n rawConfigSchema,\n resolveConfigPaths,\n type Config,\n} from \"@/src/utils/get-config\"\nimport {\n getProjectConfig,\n getProjectInfo,\n getProjectTailwindVersionFromConfig,\n} from \"@/src/utils/get-project-info\"\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 { updateTailwindContent } from \"@/src/utils/updaters/update-tailwind-content\"\nimport { Command } from \"commander\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\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 style: z.string(),\n})\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project and install dependencies\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\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 .action(async (components, opts) => {\n try {\n const options = initOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n isNewProject: false,\n components,\n style: \"index\",\n ...opts,\n })\n\n // We need to check if we're initializing with a new style.\n // We fetch the payload of the first item.\n // This is okay since the request is cached and deduped.\n if (components.length > 0 && isUrl(components[0])) {\n const item = await getRegistryItem(components[0], \"\")\n\n // Skip base color if style.\n // We set a default and let the style override it.\n if (item?.type === \"registry:style\") {\n options.baseColor = \"neutral\"\n options.style = item.extends ?? \"index\"\n }\n }\n\n await runInit(options)\n\n logger.log(\n `${highlighter.success(\n \"Success!\"\n )} Project initialization completed.\\nYou may now add components.`\n )\n logger.break()\n } catch (error) {\n logger.break()\n handleError(error)\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 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 === \"next-monorepo\") {\n options.cwd = path.resolve(options.cwd, \"apps/web\")\n return await getConfig(options.cwd)\n }\n\n const projectConfig = await getProjectConfig(options.cwd, projectInfo)\n const config = projectConfig\n ? await promptForMinimalConfig(projectConfig, options)\n : await promptForConfig(await getConfig(options.cwd))\n\n if (!options.yes) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `Write configuration to ${highlighter.info(\n \"components.json\"\n )}. Proceed?`,\n initial: true,\n })\n\n if (!proceed) {\n process.exit(0)\n }\n }\n\n // Write components.json.\n const componentSpinner = spinner(`Writing components.json.`).start()\n const targetPath = path.resolve(options.cwd, \"components.json\")\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), \"utf8\")\n componentSpinner.succeed()\n\n // Add components.\n const fullConfig = await resolveConfigPaths(options.cwd, config)\n const components = [\n ...(options.style === \"none\" ? [] : [options.style]),\n ...(options.components ?? []),\n ]\n await addComponents(components, fullConfig, {\n // Init will always overwrite files.\n overwrite: true,\n silent: options.silent,\n style: options.style,\n isNewProject:\n options.isNewProject || projectInfo?.framework.name === \"next-app\",\n })\n\n // If a new project is using src dir, let's update the tailwind content config.\n // TODO: Handle this per framework.\n if (options.isNewProject && options.srcDir) {\n await updateTailwindContent(\n [\"./src/**/*.{js,ts,jsx,tsx,mdx}\"],\n fullConfig,\n {\n silent: options.silent,\n }\n )\n }\n\n return fullConfig\n}\n\nasync function promptForConfig(defaultConfig: Config | null = null) {\n const [styles, baseColors] = await Promise.all([\n getRegistryStyles(),\n getRegistryBaseColors(),\n ])\n\n logger.info(\"\")\n const options = await prompts([\n {\n type: \"toggle\",\n name: \"typescript\",\n message: `Would you like to use ${highlighter.info(\n \"TypeScript\"\n )} (recommended)?`,\n initial: defaultConfig?.tsx ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n {\n type: \"select\",\n name: \"style\",\n message: `Which ${highlighter.info(\"style\")} would you like to use?`,\n choices: styles.map((style) => ({\n title: style.label,\n value: style.name,\n })),\n },\n {\n type: \"select\",\n name: \"tailwindBaseColor\",\n message: `Which color would you like to use as the ${highlighter.info(\n \"base color\"\n )}?`,\n choices: baseColors.map((color) => ({\n title: color.label,\n value: color.name,\n })),\n },\n {\n type: \"text\",\n name: \"tailwindCss\",\n message: `Where is your ${highlighter.info(\"global CSS\")} file?`,\n initial: defaultConfig?.tailwind.css ?? DEFAULT_TAILWIND_CSS,\n },\n {\n type: \"toggle\",\n name: \"tailwindCssVariables\",\n message: `Would you like to use ${highlighter.info(\n \"CSS variables\"\n )} for theming?`,\n initial: defaultConfig?.tailwind.cssVariables ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n {\n type: \"text\",\n name: \"tailwindPrefix\",\n message: `Are you using a custom ${highlighter.info(\n \"tailwind prefix eg. tw-\"\n )}? (Leave blank if not)`,\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"tailwindConfig\",\n message: `Where is your ${highlighter.info(\n \"tailwind.config.js\"\n )} located?`,\n initial: defaultConfig?.tailwind.config ?? DEFAULT_TAILWIND_CONFIG,\n },\n {\n type: \"text\",\n name: \"components\",\n message: `Configure the import alias for ${highlighter.info(\n \"components\"\n )}:`,\n initial: defaultConfig?.aliases[\"components\"] ?? DEFAULT_COMPONENTS,\n },\n {\n type: \"text\",\n name: \"utils\",\n message: `Configure the import alias for ${highlighter.info(\"utils\")}:`,\n initial: defaultConfig?.aliases[\"utils\"] ?? DEFAULT_UTILS,\n },\n {\n type: \"toggle\",\n name: \"rsc\",\n message: `Are you using ${highlighter.info(\"React Server Components\")}?`,\n initial: defaultConfig?.rsc ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n ])\n\n return rawConfigSchema.parse({\n $schema: \"https://ui.shadcn.com/schema.json\",\n style: options.style,\n tailwind: {\n config: options.tailwindConfig,\n css: options.tailwindCss,\n baseColor: options.tailwindBaseColor,\n cssVariables: options.tailwindCssVariables,\n prefix: options.tailwindPrefix,\n },\n rsc: options.rsc,\n tsx: options.typescript,\n aliases: {\n utils: options.utils,\n components: options.components,\n // TODO: fix this.\n lib: options.components.replace(/\\/components$/, \"lib\"),\n hooks: options.components.replace(/\\/components$/, \"hooks\"),\n },\n })\n}\n\nasync function promptForMinimalConfig(\n defaultConfig: Config,\n opts: z.infer<typeof initOptionsSchema>\n) {\n let style = defaultConfig.style\n let baseColor = opts.baseColor\n let cssVariables = defaultConfig.tailwind.cssVariables\n\n if (!opts.defaults) {\n const [styles, baseColors, tailwindVersion] = await Promise.all([\n getRegistryStyles(),\n getRegistryBaseColors(),\n getProjectTailwindVersionFromConfig(defaultConfig),\n ])\n\n const options = await prompts([\n {\n type: tailwindVersion === \"v4\" ? null : \"select\",\n name: \"style\",\n message: `Which ${highlighter.info(\"style\")} would you like to use?`,\n choices: styles.map((style) => ({\n title:\n style.name === \"new-york\" ? \"New York (Recommended)\" : style.label,\n value: style.name,\n })),\n initial: 0,\n },\n {\n type: opts.baseColor ? null : \"select\",\n name: \"tailwindBaseColor\",\n message: `Which color would you like to use as the ${highlighter.info(\n \"base color\"\n )}?`,\n choices: baseColors.map((color) => ({\n title: color.label,\n value: color.name,\n })),\n },\n ])\n\n style = options.style ?? \"new-york\"\n baseColor = options.tailwindBaseColor ?? baseColor\n cssVariables = opts.cssVariables\n }\n\n return rawConfigSchema.parse({\n $schema: defaultConfig?.$schema,\n style,\n tailwind: {\n ...defaultConfig?.tailwind,\n baseColor,\n cssVariables,\n },\n rsc: defaultConfig?.rsc,\n tsx: defaultConfig?.tsx,\n aliases: defaultConfig?.aliases,\n iconLibrary: defaultConfig?.iconLibrary,\n })\n}\n","import path from \"path\"\nimport { initOptionsSchema } from \"@/src/commands/init\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\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 const projectSpinner = spinner(`Preflight checks.`, {\n silent: options.silent,\n }).start()\n\n if (\n fs.existsSync(path.resolve(options.cwd, \"components.json\")) &&\n !options.force\n ) {\n projectSpinner?.fail()\n logger.break()\n logger.error(\n `A ${highlighter.info(\n \"components.json\"\n )} file already exists at ${highlighter.info(\n options.cwd\n )}.\\nTo start over, remove the ${highlighter.info(\n \"components.json\"\n )} file and run ${highlighter.info(\"init\")} again.`\n )\n logger.break()\n process.exit(1)\n }\n\n projectSpinner?.succeed()\n\n const frameworkSpinner = spinner(`Verifying framework.`, {\n silent: options.silent,\n }).start()\n const projectInfo = await getProjectInfo(options.cwd)\n if (!projectInfo || projectInfo?.framework.name === \"manual\") {\n errors[ERRORS.UNSUPPORTED_FRAMEWORK] = true\n frameworkSpinner?.fail()\n logger.break()\n if (projectInfo?.framework.links.installation) {\n logger.error(\n `We could not detect a supported framework at ${highlighter.info(\n options.cwd\n )}.\\n` +\n `Visit ${highlighter.info(\n projectInfo?.framework.links.installation\n )} to manually configure your project.\\nOnce configured, you can use the cli to add components.`\n )\n }\n logger.break()\n process.exit(1)\n }\n frameworkSpinner?.succeed(\n `Verifying framework. Found ${highlighter.info(\n projectInfo.framework.label\n )}.`\n )\n\n let tailwindSpinnerMessage = \"Validating Tailwind CSS.\"\n\n if (projectInfo.tailwindVersion === \"v4\") {\n tailwindSpinnerMessage = `Validating Tailwind CSS config. Found ${highlighter.info(\n \"v4\"\n )}.`\n }\n\n const tailwindSpinner = spinner(tailwindSpinnerMessage, {\n silent: options.silent,\n }).start()\n if (\n projectInfo.tailwindVersion === \"v3\" &&\n (!projectInfo?.tailwindConfigFile || !projectInfo?.tailwindCssFile)\n ) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true\n tailwindSpinner?.fail()\n } else if (\n projectInfo.tailwindVersion === \"v4\" &&\n !projectInfo?.tailwindCssFile\n ) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true\n tailwindSpinner?.fail()\n } else if (!projectInfo.tailwindVersion) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true\n tailwindSpinner?.fail()\n } else {\n tailwindSpinner?.succeed()\n }\n\n const tsConfigSpinner = spinner(`Validating import alias.`, {\n silent: options.silent,\n }).start()\n if (!projectInfo?.aliasPrefix) {\n errors[ERRORS.IMPORT_ALIAS_MISSING] = true\n tsConfigSpinner?.fail()\n } else {\n tsConfigSpinner?.succeed()\n }\n\n if (Object.keys(errors).length > 0) {\n if (errors[ERRORS.TAILWIND_NOT_CONFIGURED]) {\n logger.break()\n logger.error(\n `No Tailwind CSS configuration found at ${highlighter.info(\n options.cwd\n )}.`\n )\n logger.error(\n `It is likely you do not have Tailwind CSS installed or have an invalid configuration.`\n )\n logger.error(`Install Tailwind CSS then try again.`)\n if (projectInfo?.framework.links.tailwind) {\n logger.error(\n `Visit ${highlighter.info(\n projectInfo?.framework.links.tailwind\n )} to get started.`\n )\n }\n }\n\n if (errors[ERRORS.IMPORT_ALIAS_MISSING]) {\n logger.break()\n logger.error(`No import alias found in your tsconfig.json file.`)\n if (projectInfo?.framework.links.installation) {\n logger.error(\n `Visit ${highlighter.info(\n projectInfo?.framework.links.installation\n )} to learn how to set an import alias.`\n )\n }\n }\n\n logger.break()\n process.exit(1)\n }\n\n return {\n errors,\n projectInfo,\n }\n}\n","export const MISSING_DIR_OR_EMPTY_PROJECT = \"1\"\nexport const EXISTING_CONFIG = \"2\"\nexport const MISSING_CONFIG = \"3\"\nexport const FAILED_CONFIG_READ = \"4\"\nexport const TAILWIND_NOT_CONFIGURED = \"5\"\nexport const IMPORT_ALIAS_MISSING = \"6\"\nexport const UNSUPPORTED_FRAMEWORK = \"7\"\nexport const COMPONENT_URL_NOT_FOUND = \"8\"\nexport const COMPONENT_URL_UNAUTHORIZED = \"9\"\nexport const COMPONENT_URL_FORBIDDEN = \"10\"\nexport const COMPONENT_URL_BAD_REQUEST = \"11\"\nexport const COMPONENT_URL_INTERNAL_SERVER_ERROR = \"12\"\nexport const BUILD_MISSING_REGISTRY_FILE = \"13\"\n","import path from \"path\"\nimport {\n fetchRegistry,\n getRegistryParentMap,\n getRegistryTypeAliasMap,\n registryResolveItemsTree,\n resolveRegistryItems,\n} from \"@/src/registry/api\"\nimport { registryItemSchema } from \"@/src/registry/schema\"\nimport {\n configSchema,\n findCommonRoot,\n findPackageRoot,\n getWorkspaceConfig,\n workspaceConfigSchema,\n type Config,\n} from \"@/src/utils/get-config\"\nimport { getProjectTailwindVersionFromConfig } from \"@/src/utils/get-project-info\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { updateCss } from \"@/src/utils/updaters/update-css\"\nimport { updateCssVars } from \"@/src/utils/updaters/update-css-vars\"\nimport { updateDependencies } from \"@/src/utils/updaters/update-dependencies\"\nimport { updateFiles } from \"@/src/utils/updaters/update-files\"\nimport { updateTailwindConfig } from \"@/src/utils/updaters/update-tailwind-config\"\nimport { z } from \"zod\"\n\nexport async function addComponents(\n components: string[],\n config: Config,\n options: {\n overwrite?: boolean\n silent?: boolean\n isNewProject?: boolean\n style?: string\n }\n) {\n options = {\n overwrite: false,\n silent: false,\n isNewProject: false,\n style: \"index\",\n ...options,\n }\n\n const workspaceConfig = await getWorkspaceConfig(config)\n if (\n workspaceConfig &&\n workspaceConfig.ui &&\n workspaceConfig.ui.resolvedPaths.cwd !== config.resolvedPaths.cwd\n ) {\n return await addWorkspaceComponents(components, config, workspaceConfig, {\n ...options,\n isRemote:\n components?.length === 1 && !!components[0].match(/\\/chat\\/b\\//),\n })\n }\n\n return await addProjectComponents(components, config, options)\n}\n\nasync function addProjectComponents(\n components: string[],\n config: z.infer<typeof configSchema>,\n options: {\n overwrite?: boolean\n silent?: boolean\n isNewProject?: boolean\n style?: string\n }\n) {\n const registrySpinner = spinner(`Checking registry.`, {\n silent: options.silent,\n })?.start()\n const tree = await registryResolveItemsTree(components, config)\n\n if (!tree) {\n registrySpinner?.fail()\n return handleError(new Error(\"Failed to fetch components from registry.\"))\n }\n registrySpinner?.succeed()\n\n const tailwindVersion = await getProjectTailwindVersionFromConfig(config)\n\n await updateTailwindConfig(tree.tailwind?.config, config, {\n silent: options.silent,\n tailwindVersion,\n })\n\n const overwriteCssVars = await shouldOverwriteCssVars(components, config)\n await updateCssVars(tree.cssVars, config, {\n cleanupDefaultNextStyles: options.isNewProject,\n silent: options.silent,\n tailwindVersion,\n tailwindConfig: tree.tailwind?.config,\n overwriteCssVars,\n initIndex: options.style ? options.style === \"index\" : false,\n })\n\n // Add CSS updater\n await updateCss(tree.css, config, {\n silent: options.silent,\n })\n\n await updateDependencies(tree.dependencies, config, {\n silent: options.silent,\n })\n await updateFiles(tree.files, config, {\n overwrite: options.overwrite,\n silent: options.silent,\n })\n\n if (tree.docs) {\n logger.info(tree.docs)\n }\n}\n\nasync function addWorkspaceComponents(\n components: string[],\n config: z.infer<typeof configSchema>,\n workspaceConfig: z.infer<typeof workspaceConfigSchema>,\n options: {\n overwrite?: boolean\n silent?: boolean\n isNewProject?: boolean\n isRemote?: boolean\n style?: string\n }\n) {\n const registrySpinner = spinner(`Checking registry.`, {\n silent: options.silent,\n })?.start()\n let registryItems = await resolveRegistryItems(components, config)\n let result = await fetchRegistry(registryItems)\n const payload = z.array(registryItemSchema).parse(result)\n if (!payload) {\n registrySpinner?.fail()\n return handleError(new Error(\"Failed to fetch components from registry.\"))\n }\n registrySpinner?.succeed()\n\n const registryParentMap = getRegistryParentMap(payload)\n const registryTypeAliasMap = getRegistryTypeAliasMap()\n\n const filesCreated: string[] = []\n const filesUpdated: string[] = []\n const filesSkipped: string[] = []\n\n const rootSpinner = spinner(`Installing components.`)?.start()\n\n for (const component of payload) {\n const alias = registryTypeAliasMap.get(component.type)\n const registryParent = registryParentMap.get(component.name)\n\n // We don't support this type of component.\n if (!alias) {\n continue\n }\n\n // A good start is ui for now.\n // TODO: Add support for other types.\n let targetConfig =\n component.type === \"registry:ui\" || registryParent?.type === \"registry:ui\"\n ? workspaceConfig.ui\n : config\n\n const tailwindVersion = await getProjectTailwindVersionFromConfig(\n targetConfig\n )\n\n const workspaceRoot = findCommonRoot(\n config.resolvedPaths.cwd,\n targetConfig.resolvedPaths.ui\n )\n const packageRoot =\n (await findPackageRoot(workspaceRoot, targetConfig.resolvedPaths.cwd)) ??\n targetConfig.resolvedPaths.cwd\n\n // 1. Update tailwind config.\n if (component.tailwind?.config) {\n await updateTailwindConfig(component.tailwind?.config, targetConfig, {\n silent: true,\n tailwindVersion,\n })\n filesUpdated.push(\n path.relative(workspaceRoot, targetConfig.resolvedPaths.tailwindConfig)\n )\n }\n\n // 2. Update css vars.\n if (component.cssVars) {\n const overwriteCssVars = await shouldOverwriteCssVars(components, config)\n await updateCssVars(component.cssVars, targetConfig, {\n silent: true,\n tailwindVersion,\n tailwindConfig: component.tailwind?.config,\n overwriteCssVars,\n })\n filesUpdated.push(\n path.relative(workspaceRoot, targetConfig.resolvedPaths.tailwindCss)\n )\n }\n\n // 3. Update CSS\n if (component.css) {\n await updateCss(component.css, targetConfig, {\n silent: true,\n })\n filesUpdated.push(\n path.relative(workspaceRoot, targetConfig.resolvedPaths.tailwindCss)\n )\n }\n\n // 4. Update dependencies.\n await updateDependencies(component.dependencies, targetConfig, {\n silent: true,\n })\n\n // 5. Update files.\n const files = await updateFiles(component.files, targetConfig, {\n overwrite: options.overwrite,\n silent: true,\n rootSpinner,\n isRemote: options.isRemote,\n })\n\n filesCreated.push(\n ...files.filesCreated.map((file) =>\n path.relative(workspaceRoot, path.join(packageRoot, file))\n )\n )\n filesUpdated.push(\n ...files.filesUpdated.map((file) =>\n path.relative(workspaceRoot, path.join(packageRoot, file))\n )\n )\n filesSkipped.push(\n ...files.filesSkipped.map((file) =>\n path.relative(workspaceRoot, path.join(packageRoot, file))\n )\n )\n }\n\n rootSpinner?.succeed()\n\n // Sort files.\n filesCreated.sort()\n filesUpdated.sort()\n filesSkipped.sort()\n\n const hasUpdatedFiles = filesCreated.length || filesUpdated.length\n if (!hasUpdatedFiles && !filesSkipped.length) {\n spinner(`No files updated.`, {\n silent: options.silent,\n })?.info()\n }\n\n if (filesCreated.length) {\n spinner(\n `Created ${filesCreated.length} ${\n filesCreated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.succeed()\n for (const file of filesCreated) {\n logger.log(` - ${file}`)\n }\n }\n\n if (filesUpdated.length) {\n spinner(\n `Updated ${filesUpdated.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n for (const file of filesUpdated) {\n logger.log(` - ${file}`)\n }\n }\n\n if (filesSkipped.length) {\n spinner(\n `Skipped ${filesSkipped.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }: (use --overwrite to overwrite)`,\n {\n silent: options.silent,\n }\n )?.info()\n for (const file of filesSkipped) {\n logger.log(` - ${file}`)\n }\n }\n}\n\nasync function shouldOverwriteCssVars(\n components: z.infer<typeof registryItemSchema>[\"name\"][],\n config: z.infer<typeof configSchema>\n) {\n let registryItems = await resolveRegistryItems(components, config)\n let result = await fetchRegistry(registryItems)\n const payload = z.array(registryItemSchema).parse(result)\n\n return payload.some(\n (component) =>\n component.type === \"registry:theme\" || component.type === \"registry:style\"\n )\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { registryItemCssSchema } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport postcss from \"postcss\"\nimport AtRule from \"postcss/lib/at-rule\"\nimport Declaration from \"postcss/lib/declaration\"\nimport Root from \"postcss/lib/root\"\nimport Rule from \"postcss/lib/rule\"\nimport { z } from \"zod\"\n\nexport async function updateCss(\n css: z.infer<typeof registryItemCssSchema> | undefined,\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n if (\n !config.resolvedPaths.tailwindCss ||\n !css ||\n Object.keys(css).length === 0\n ) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const cssFilepath = config.resolvedPaths.tailwindCss\n const cssFilepathRelative = path.relative(\n config.resolvedPaths.cwd,\n cssFilepath\n )\n const cssSpinner = spinner(\n `Updating ${highlighter.info(cssFilepathRelative)}`,\n {\n silent: options.silent,\n }\n ).start()\n\n const raw = await fs.readFile(cssFilepath, \"utf8\")\n let output = await transformCss(raw, css)\n await fs.writeFile(cssFilepath, output, \"utf8\")\n cssSpinner.succeed()\n}\n\nexport async function transformCss(\n input: string,\n css: z.infer<typeof registryItemCssSchema>\n) {\n const plugins = [updateCssPlugin(css)]\n\n const result = await postcss(plugins).process(input, {\n from: undefined,\n })\n\n let output = result.css\n output = output.replace(/\\/\\* ---break--- \\*\\//g, \"\")\n output = output.replace(/(\\n\\s*\\n)+/g, \"\\n\\n\")\n output = output.trimEnd()\n\n return output\n}\n\nfunction updateCssPlugin(css: z.infer<typeof registryItemCssSchema>) {\n return {\n postcssPlugin: \"update-css\",\n Once(root: Root) {\n for (const [selector, properties] of Object.entries(css)) {\n if (selector.startsWith(\"@\")) {\n // Handle at-rules (@layer, @utility, etc.)\n const atRuleMatch = selector.match(/@([a-zA-Z-]+)\\s*(.*)/)\n if (!atRuleMatch) continue\n\n const [, name, params] = atRuleMatch\n\n // Special handling for keyframes - place them under @theme inline\n if (name === \"keyframes\") {\n let themeInline = root.nodes?.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"theme\" &&\n node.params === \"inline\"\n ) as AtRule | undefined\n\n if (!themeInline) {\n themeInline = postcss.atRule({\n name: \"theme\",\n params: \"inline\",\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(themeInline)\n root.insertBefore(\n themeInline,\n postcss.comment({ text: \"---break---\" })\n )\n }\n\n const keyframesRule = postcss.atRule({\n name: \"keyframes\",\n params,\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n\n themeInline.append(keyframesRule)\n\n if (typeof properties === \"object\") {\n for (const [step, stepProps] of Object.entries(properties)) {\n processRule(keyframesRule, step, stepProps)\n }\n }\n }\n // Special handling for utility classes to preserve property values\n else if (name === \"utility\") {\n const utilityAtRule = root.nodes?.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === name &&\n node.params === params\n ) as AtRule | undefined\n\n if (!utilityAtRule) {\n const atRule = postcss.atRule({\n name,\n params,\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n\n root.append(atRule)\n root.insertBefore(\n atRule,\n postcss.comment({ text: \"---break---\" })\n )\n\n // Add declarations with their values preserved\n if (typeof properties === \"object\") {\n for (const [prop, value] of Object.entries(properties)) {\n if (typeof value === \"string\") {\n const decl = postcss.decl({\n prop,\n value: value,\n raws: { semicolon: true, before: \"\\n \" },\n })\n atRule.append(decl)\n } else if (typeof value === \"object\") {\n processRule(atRule, prop, value)\n }\n }\n }\n } else {\n // Update existing utility class\n if (typeof properties === \"object\") {\n for (const [prop, value] of Object.entries(properties)) {\n if (typeof value === \"string\") {\n const existingDecl = utilityAtRule.nodes?.find(\n (node): node is Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n const decl = postcss.decl({\n prop,\n value: value,\n raws: { semicolon: true, before: \"\\n \" },\n })\n\n existingDecl\n ? existingDecl.replaceWith(decl)\n : utilityAtRule.append(decl)\n } else if (typeof value === \"object\") {\n processRule(utilityAtRule, prop, value)\n }\n }\n }\n }\n } else {\n // Handle other at-rules normally\n processAtRule(root, name, params, properties)\n }\n } else {\n // Handle regular CSS rules\n processRule(root, selector, properties)\n }\n }\n },\n }\n}\n\nfunction processAtRule(\n root: Root | AtRule,\n name: string,\n params: string,\n properties: any\n) {\n // Find or create the at-rule\n let atRule = root.nodes?.find(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === name && node.params === params\n ) as AtRule | undefined\n\n if (!atRule) {\n atRule = postcss.atRule({\n name,\n params,\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(atRule)\n root.insertBefore(atRule, postcss.comment({ text: \"---break---\" }))\n }\n\n // Process children of this at-rule\n if (typeof properties === \"object\") {\n for (const [childSelector, childProps] of Object.entries(properties)) {\n if (childSelector.startsWith(\"@\")) {\n // Nested at-rule\n const nestedMatch = childSelector.match(/@([a-zA-Z-]+)\\s*(.*)/)\n if (nestedMatch) {\n const [, nestedName, nestedParams] = nestedMatch\n processAtRule(atRule, nestedName, nestedParams, childProps)\n }\n } else {\n // CSS rule within at-rule\n processRule(atRule, childSelector, childProps)\n }\n }\n } else if (typeof properties === \"string\") {\n // Direct string content for the at-rule\n try {\n // Parse the CSS string with PostCSS\n const parsed = postcss.parse(`.temp{${properties}}`)\n const tempRule = parsed.first as Rule\n\n if (tempRule && tempRule.nodes) {\n // Create a rule for the at-rule if needed\n const rule = postcss.rule({\n selector: \"temp\",\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n\n // Copy all declarations from the temp rule to our actual rule\n tempRule.nodes.forEach((node) => {\n if (node.type === \"decl\") {\n const clone = node.clone()\n clone.raws.before = \"\\n \"\n rule.append(clone)\n }\n })\n\n // Only add the rule if it has declarations\n if (rule.nodes?.length) {\n atRule.append(rule)\n }\n }\n } catch (error) {\n console.error(\"Error parsing at-rule content:\", properties, error)\n throw error\n }\n }\n}\n\nfunction processRule(parent: Root | AtRule, selector: string, properties: any) {\n let rule = parent.nodes?.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === selector\n ) as Rule | undefined\n\n if (!rule) {\n rule = postcss.rule({\n selector,\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n parent.append(rule)\n }\n\n if (typeof properties === \"object\") {\n for (const [prop, value] of Object.entries(properties)) {\n if (typeof value === \"string\") {\n const decl = postcss.decl({\n prop,\n value: value,\n raws: { semicolon: true, before: \"\\n \" },\n })\n\n // Replace existing property or add new one\n const existingDecl = rule.nodes?.find(\n (node): node is Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n existingDecl ? existingDecl.replaceWith(decl) : rule.append(decl)\n } else if (typeof value === \"object\") {\n // Nested selector (including & selectors)\n const nestedSelector = prop.startsWith(\"&\")\n ? selector.replace(/^([^:]+)/, `$1${prop.substring(1)}`)\n : prop // Use the original selector for other nested elements\n processRule(parent, nestedSelector, value)\n }\n }\n } else if (typeof properties === \"string\") {\n // Direct string content for the rule\n try {\n // Parse the CSS string with PostCSS\n const parsed = postcss.parse(`.temp{${properties}}`)\n const tempRule = parsed.first as Rule\n\n if (tempRule && tempRule.nodes) {\n // Copy all declarations from the temp rule to our actual rule\n tempRule.nodes.forEach((node) => {\n if (node.type === \"decl\") {\n const clone = node.clone()\n clone.raws.before = \"\\n \"\n rule?.append(clone)\n }\n })\n }\n } catch (error) {\n console.error(\"Error parsing rule content:\", selector, properties, error)\n throw error\n }\n }\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport {\n registryItemCssVarsSchema,\n registryItemTailwindSchema,\n} from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport { TailwindVersion } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport postcss from \"postcss\"\nimport AtRule from \"postcss/lib/at-rule\"\nimport Root from \"postcss/lib/root\"\nimport Rule from \"postcss/lib/rule\"\nimport { z } from \"zod\"\n\nexport async function updateCssVars(\n cssVars: z.infer<typeof registryItemCssVarsSchema> | undefined,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n overwriteCssVars?: boolean\n initIndex?: boolean\n silent?: boolean\n tailwindVersion?: TailwindVersion\n tailwindConfig?: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n }\n) {\n if (!config.resolvedPaths.tailwindCss || !Object.keys(cssVars ?? {}).length) {\n return\n }\n\n options = {\n cleanupDefaultNextStyles: false,\n silent: false,\n tailwindVersion: \"v3\",\n overwriteCssVars: false,\n initIndex: true,\n ...options,\n }\n const cssFilepath = config.resolvedPaths.tailwindCss\n const cssFilepathRelative = path.relative(\n config.resolvedPaths.cwd,\n cssFilepath\n )\n const cssVarsSpinner = spinner(\n `Updating CSS variables in ${highlighter.info(cssFilepathRelative)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(cssFilepath, \"utf8\")\n let output = await transformCssVars(raw, cssVars ?? {}, config, {\n cleanupDefaultNextStyles: options.cleanupDefaultNextStyles,\n tailwindVersion: options.tailwindVersion,\n tailwindConfig: options.tailwindConfig,\n overwriteCssVars: options.overwriteCssVars,\n initIndex: options.initIndex,\n })\n await fs.writeFile(cssFilepath, output, \"utf8\")\n cssVarsSpinner.succeed()\n}\n\nexport async function transformCssVars(\n input: string,\n cssVars: z.infer<typeof registryItemCssVarsSchema>,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n tailwindVersion?: TailwindVersion\n tailwindConfig?: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n overwriteCssVars?: boolean\n initIndex?: boolean\n } = {\n cleanupDefaultNextStyles: false,\n tailwindVersion: \"v3\",\n tailwindConfig: undefined,\n overwriteCssVars: false,\n initIndex: true,\n }\n) {\n options = {\n cleanupDefaultNextStyles: false,\n tailwindVersion: \"v3\",\n tailwindConfig: undefined,\n overwriteCssVars: false,\n initIndex: true,\n ...options,\n }\n\n let plugins = [updateCssVarsPlugin(cssVars)]\n\n if (options.cleanupDefaultNextStyles) {\n plugins.push(cleanupDefaultNextStylesPlugin())\n }\n\n if (options.tailwindVersion === \"v4\") {\n plugins = []\n\n // Only add tw-animate-css if project does not have tailwindcss-animate\n if (config.resolvedPaths?.cwd) {\n const packageInfo = getPackageInfo(config.resolvedPaths.cwd)\n if (\n !packageInfo?.dependencies?.[\"tailwindcss-animate\"] &&\n !packageInfo?.devDependencies?.[\"tailwindcss-animate\"] &&\n options.initIndex\n ) {\n plugins.push(addCustomImport({ params: \"tw-animate-css\" }))\n }\n }\n\n plugins.push(addCustomVariant({ params: \"dark (&:is(.dark *))\" }))\n\n if (options.cleanupDefaultNextStyles) {\n plugins.push(cleanupDefaultNextStylesPlugin())\n }\n\n plugins.push(\n updateCssVarsPluginV4(cssVars, {\n overwriteCssVars: options.overwriteCssVars,\n })\n )\n plugins.push(updateThemePlugin(cssVars))\n\n if (options.tailwindConfig) {\n plugins.push(updateTailwindConfigPlugin(options.tailwindConfig))\n plugins.push(updateTailwindConfigAnimationPlugin(options.tailwindConfig))\n plugins.push(updateTailwindConfigKeyframesPlugin(options.tailwindConfig))\n }\n }\n\n if (config.tailwind.cssVariables && options.initIndex) {\n plugins.push(\n updateBaseLayerPlugin({ tailwindVersion: options.tailwindVersion })\n )\n }\n\n const result = await postcss(plugins).process(input, {\n from: undefined,\n })\n\n let output = result.css\n\n output = output.replace(/\\/\\* ---break--- \\*\\//g, \"\")\n\n if (options.tailwindVersion === \"v4\") {\n output = output.replace(/(\\n\\s*\\n)+/g, \"\\n\\n\")\n }\n\n return output\n}\n\nfunction updateBaseLayerPlugin({\n tailwindVersion,\n}: {\n tailwindVersion?: TailwindVersion\n}) {\n return {\n postcssPlugin: \"update-base-layer\",\n Once(root: Root) {\n const requiredRules = [\n {\n selector: \"*\",\n apply:\n tailwindVersion === \"v4\"\n ? \"border-border outline-ring/50\"\n : \"border-border\",\n },\n { selector: \"body\", apply: \"bg-background text-foreground\" },\n ]\n\n let baseLayer = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\" &&\n requiredRules.every(({ selector, apply }) =>\n node.nodes?.some(\n (rule): rule is Rule =>\n rule.type === \"rule\" &&\n rule.selector === selector &&\n rule.nodes.some(\n (applyRule): applyRule is AtRule =>\n applyRule.type === \"atrule\" &&\n applyRule.name === \"apply\" &&\n applyRule.params === apply\n )\n )\n )\n ) as AtRule | undefined\n\n if (!baseLayer) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(baseLayer)\n root.insertBefore(baseLayer, postcss.comment({ text: \"---break---\" }))\n }\n\n requiredRules.forEach(({ selector, apply }) => {\n const existingRule = baseLayer?.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" && node.selector === selector\n )\n\n if (!existingRule) {\n baseLayer?.append(\n postcss.rule({\n selector,\n nodes: [\n postcss.atRule({\n name: \"apply\",\n params: apply,\n raws: { semicolon: true, before: \"\\n \" },\n }),\n ],\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n )\n }\n })\n },\n }\n}\n\nfunction updateCssVarsPlugin(\n cssVars: z.infer<typeof registryItemCssVarsSchema>\n) {\n return {\n postcssPlugin: \"update-css-vars\",\n Once(root: Root) {\n let baseLayer = root.nodes.find(\n (node) =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\"\n ) as AtRule | undefined\n\n if (!(baseLayer instanceof AtRule)) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n nodes: [],\n raws: {\n semicolon: true,\n before: \"\\n\",\n between: \" \",\n },\n })\n root.append(baseLayer)\n root.insertBefore(baseLayer, postcss.comment({ text: \"---break---\" }))\n }\n\n if (baseLayer !== undefined) {\n // Add variables for each key in cssVars\n Object.entries(cssVars).forEach(([key, vars]) => {\n const selector = key === \"light\" ? \":root\" : `.${key}`\n // TODO: Fix typecheck.\n addOrUpdateVars(baseLayer as AtRule, selector, vars)\n })\n }\n },\n }\n}\n\nfunction removeConflictVars(root: Rule | Root) {\n const rootRule = root.nodes.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === \":root\"\n )\n\n if (rootRule) {\n const propsToRemove = [\"--background\", \"--foreground\"]\n\n rootRule.nodes\n .filter(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && propsToRemove.includes(node.prop)\n )\n .forEach((node) => node.remove())\n\n if (rootRule.nodes.length === 0) {\n rootRule.remove()\n }\n }\n}\n\nfunction cleanupDefaultNextStylesPlugin() {\n return {\n postcssPlugin: \"cleanup-default-next-styles\",\n Once(root: Root) {\n const bodyRule = root.nodes.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === \"body\"\n )\n if (bodyRule) {\n // Remove color from the body node.\n bodyRule.nodes\n .find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" &&\n node.prop === \"color\" &&\n [\"rgb(var(--foreground-rgb))\", \"var(--foreground)\"].includes(\n node.value\n )\n )\n ?.remove()\n\n // Remove background: linear-gradient.\n bodyRule.nodes\n .find((node): node is postcss.Declaration => {\n return (\n node.type === \"decl\" &&\n node.prop === \"background\" &&\n // This is only going to run on create project, so all good.\n (node.value.startsWith(\"linear-gradient\") ||\n node.value === \"var(--background)\")\n )\n })\n ?.remove()\n\n // Remove font-family: Arial, Helvetica, sans-serif;\n bodyRule.nodes\n .find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" &&\n node.prop === \"font-family\" &&\n node.value === \"Arial, Helvetica, sans-serif\"\n )\n ?.remove()\n\n // If the body rule is empty, remove it.\n if (bodyRule.nodes.length === 0) {\n bodyRule.remove()\n }\n }\n\n removeConflictVars(root)\n\n const darkRootRule = root.nodes.find(\n (node): node is Rule =>\n node.type === \"atrule\" &&\n node.params === \"(prefers-color-scheme: dark)\"\n )\n\n if (darkRootRule) {\n removeConflictVars(darkRootRule)\n if (darkRootRule.nodes.length === 0) {\n darkRootRule.remove()\n }\n }\n },\n }\n}\n\nfunction addOrUpdateVars(\n baseLayer: AtRule,\n selector: string,\n vars: Record<string, string>\n) {\n let ruleNode = baseLayer.nodes?.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === selector\n )\n\n if (!ruleNode) {\n if (Object.keys(vars).length > 0) {\n ruleNode = postcss.rule({\n selector,\n raws: { between: \" \", before: \"\\n \" },\n })\n baseLayer.append(ruleNode)\n }\n }\n\n Object.entries(vars).forEach(([key, value]) => {\n const prop = `--${key.replace(/^--/, \"\")}`\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n\n const existingDecl = ruleNode?.nodes.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n existingDecl ? existingDecl.replaceWith(newDecl) : ruleNode?.append(newDecl)\n })\n}\n\nfunction updateCssVarsPluginV4(\n cssVars: z.infer<typeof registryItemCssVarsSchema>,\n options: {\n overwriteCssVars?: boolean\n }\n) {\n return {\n postcssPlugin: \"update-css-vars-v4\",\n Once(root: Root) {\n Object.entries(cssVars).forEach(([key, vars]) => {\n let selector = key === \"light\" ? \":root\" : `.${key}`\n\n if (key === \"theme\") {\n selector = \"@theme\"\n const themeNode = upsertThemeNode(root)\n Object.entries(vars).forEach(([key, value]) => {\n const prop = `--${key.replace(/^--/, \"\")}`\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n\n const existingDecl = themeNode?.nodes?.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n // Only overwrite if overwriteCssVars is true\n // i.e for registry:theme and registry:style\n // We do not want new components to overwrite existing vars.\n // Keep user defined vars.\n if (options.overwriteCssVars) {\n if (existingDecl) {\n existingDecl.replaceWith(newDecl)\n } else {\n themeNode?.append(newDecl)\n }\n } else {\n if (!existingDecl) {\n themeNode?.append(newDecl)\n }\n }\n })\n return\n }\n\n let ruleNode = root.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" && node.selector === selector\n )\n\n if (!ruleNode && Object.keys(vars).length > 0) {\n ruleNode = postcss.rule({\n selector,\n nodes: [],\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(ruleNode)\n root.insertBefore(ruleNode, postcss.comment({ text: \"---break---\" }))\n }\n\n Object.entries(vars).forEach(([key, value]) => {\n let prop = `--${key.replace(/^--/, \"\")}`\n\n // Special case for sidebar-background.\n if (prop === \"--sidebar-background\") {\n prop = \"--sidebar\"\n }\n\n if (isLocalHSLValue(value)) {\n value = `hsl(${value})`\n }\n\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n const existingDecl = ruleNode?.nodes.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n // Only overwrite if overwriteCssVars is true\n // i.e for registry:theme and registry:style\n // We do not want new components to overwrite existing vars.\n // Keep user defined vars.\n if (options.overwriteCssVars) {\n if (existingDecl) {\n existingDecl.replaceWith(newDecl)\n } else {\n ruleNode?.append(newDecl)\n }\n } else {\n if (!existingDecl) {\n ruleNode?.append(newDecl)\n }\n }\n })\n })\n },\n }\n}\n\nfunction updateThemePlugin(cssVars: z.infer<typeof registryItemCssVarsSchema>) {\n return {\n postcssPlugin: \"update-theme\",\n Once(root: Root) {\n // Find unique color names from light and dark.\n const variables = Array.from(\n new Set(\n Object.keys(cssVars).flatMap((key) =>\n Object.keys(cssVars[key as keyof typeof cssVars] || {})\n )\n )\n )\n\n if (!variables.length) {\n return\n }\n\n const themeNode = upsertThemeNode(root)\n\n const themeVarNodes = themeNode.nodes?.filter(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop.startsWith(\"--\")\n )\n\n for (const variable of variables) {\n const value = Object.values(cssVars).find((vars) => vars[variable])?.[\n variable\n ]\n\n if (!value) {\n continue\n }\n\n if (variable === \"radius\") {\n const radiusVariables = {\n sm: \"calc(var(--radius) - 4px)\",\n md: \"calc(var(--radius) - 2px)\",\n lg: \"var(--radius)\",\n xl: \"calc(var(--radius) + 4px)\",\n }\n for (const [key, value] of Object.entries(radiusVariables)) {\n const cssVarNode = postcss.decl({\n prop: `--radius-${key}`,\n value,\n raws: { semicolon: true },\n })\n if (\n themeNode?.nodes?.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === cssVarNode.prop\n )\n ) {\n continue\n }\n themeNode?.append(cssVarNode)\n }\n continue\n }\n\n let prop =\n isLocalHSLValue(value) || isColorValue(value)\n ? `--color-${variable.replace(/^--/, \"\")}`\n : `--${variable.replace(/^--/, \"\")}`\n if (prop === \"--color-sidebar-background\") {\n prop = \"--color-sidebar\"\n }\n\n let propValue = `var(--${variable})`\n if (prop === \"--color-sidebar\") {\n propValue = \"var(--sidebar)\"\n }\n\n const cssVarNode = postcss.decl({\n prop,\n value: propValue,\n raws: { semicolon: true },\n })\n const existingDecl = themeNode?.nodes?.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === cssVarNode.prop\n )\n if (!existingDecl) {\n if (themeVarNodes?.length) {\n themeNode?.insertAfter(\n themeVarNodes[themeVarNodes.length - 1],\n cssVarNode\n )\n } else {\n themeNode?.append(cssVarNode)\n }\n }\n }\n },\n }\n}\n\nfunction upsertThemeNode(root: Root): AtRule {\n let themeNode = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"theme\" &&\n node.params === \"inline\"\n )\n\n if (!themeNode) {\n themeNode = postcss.atRule({\n name: \"theme\",\n params: \"inline\",\n nodes: [],\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(themeNode)\n root.insertBefore(themeNode, postcss.comment({ text: \"---break---\" }))\n }\n\n return themeNode\n}\n\nfunction addCustomVariant({ params }: { params: string }) {\n return {\n postcssPlugin: \"add-custom-variant\",\n Once(root: Root) {\n const customVariant = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"custom-variant\"\n )\n\n if (!customVariant) {\n // Find all import nodes\n const importNodes = root.nodes.filter(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"import\"\n )\n\n const variantNode = postcss.atRule({\n name: \"custom-variant\",\n params,\n raws: { semicolon: true, before: \"\\n\" },\n })\n\n if (importNodes.length > 0) {\n // Insert after the last import\n const lastImport = importNodes[importNodes.length - 1]\n root.insertAfter(lastImport, variantNode)\n } else {\n // If no imports, insert after the first node\n root.insertAfter(root.nodes[0], variantNode)\n }\n\n root.insertBefore(variantNode, postcss.comment({ text: \"---break---\" }))\n }\n },\n }\n}\n\nfunction addCustomImport({ params }: { params: string }) {\n return {\n postcssPlugin: \"add-custom-import\",\n Once(root: Root) {\n const importNodes = root.nodes.filter(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"import\"\n )\n\n // Find custom variant node (to ensure we insert before it)\n const customVariantNode = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"custom-variant\"\n )\n\n // Check if our specific import already exists\n const hasImport = importNodes.some(\n (node) => node.params.replace(/[\"']/g, \"\") === params\n )\n\n if (!hasImport) {\n const importNode = postcss.atRule({\n name: \"import\",\n params: `\"${params}\"`,\n raws: { semicolon: true, before: \"\\n\" },\n })\n\n if (importNodes.length > 0) {\n // If there are existing imports, add after the last import\n const lastImport = importNodes[importNodes.length - 1]\n root.insertAfter(lastImport, importNode)\n } else if (customVariantNode) {\n // If no imports but has custom-variant, insert before it\n root.insertBefore(customVariantNode, importNode)\n root.insertBefore(\n customVariantNode,\n postcss.comment({ text: \"---break---\" })\n )\n } else {\n // If no imports and no custom-variant, insert at the start\n root.prepend(importNode)\n root.insertAfter(importNode, postcss.comment({ text: \"---break---\" }))\n }\n }\n },\n }\n}\n\nfunction updateTailwindConfigPlugin(\n tailwindConfig: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n) {\n return {\n postcssPlugin: \"update-tailwind-config\",\n Once(root: Root) {\n if (!tailwindConfig?.plugins) {\n return\n }\n\n const quoteType = getQuoteType(root)\n const quote = quoteType === \"single\" ? \"'\" : '\"'\n\n const pluginNodes = root.nodes.filter(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"plugin\"\n )\n\n const lastPluginNode =\n pluginNodes[pluginNodes.length - 1] || root.nodes[0]\n\n for (const plugin of tailwindConfig.plugins) {\n const pluginName = plugin.replace(/^require\\([\"']|[\"']\\)$/g, \"\")\n\n // Check if the plugin is already present.\n if (\n pluginNodes.some((node) => {\n return node.params.replace(/[\"']/g, \"\") === pluginName\n })\n ) {\n continue\n }\n\n const pluginNode = postcss.atRule({\n name: \"plugin\",\n params: `${quote}${pluginName}${quote}`,\n raws: { semicolon: true, before: \"\\n\" },\n })\n root.insertAfter(lastPluginNode, pluginNode)\n root.insertBefore(pluginNode, postcss.comment({ text: \"---break---\" }))\n }\n },\n }\n}\n\nfunction updateTailwindConfigKeyframesPlugin(\n tailwindConfig: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n) {\n return {\n postcssPlugin: \"update-tailwind-config-keyframes\",\n Once(root: Root) {\n if (!tailwindConfig?.theme?.extend?.keyframes) {\n return\n }\n\n const themeNode = upsertThemeNode(root)\n const existingKeyFrameNodes = themeNode.nodes?.filter(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"keyframes\"\n )\n\n const keyframeValueSchema = z.record(\n z.string(),\n z.record(z.string(), z.string())\n )\n\n for (const [keyframeName, keyframeValue] of Object.entries(\n tailwindConfig.theme.extend.keyframes\n )) {\n if (typeof keyframeName !== \"string\") {\n continue\n }\n\n const parsedKeyframeValue = keyframeValueSchema.safeParse(keyframeValue)\n\n if (!parsedKeyframeValue.success) {\n continue\n }\n\n if (\n existingKeyFrameNodes?.find(\n (node): node is postcss.AtRule =>\n node.type === \"atrule\" &&\n node.name === \"keyframes\" &&\n node.params === keyframeName\n )\n ) {\n continue\n }\n\n const keyframeNode = postcss.atRule({\n name: \"keyframes\",\n params: keyframeName,\n nodes: [],\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n\n for (const [key, values] of Object.entries(parsedKeyframeValue.data)) {\n const rule = postcss.rule({\n selector: key,\n nodes: Object.entries(values).map(([key, value]) =>\n postcss.decl({\n prop: key,\n value,\n raws: { semicolon: true, before: \"\\n \", between: \": \" },\n })\n ),\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n keyframeNode.append(rule)\n }\n\n themeNode.append(keyframeNode)\n themeNode.insertBefore(\n keyframeNode,\n postcss.comment({ text: \"---break---\" })\n )\n }\n },\n }\n}\n\nfunction updateTailwindConfigAnimationPlugin(\n tailwindConfig: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n) {\n return {\n postcssPlugin: \"update-tailwind-config-animation\",\n Once(root: Root) {\n if (!tailwindConfig?.theme?.extend?.animation) {\n return\n }\n\n const themeNode = upsertThemeNode(root)\n const existingAnimationNodes = themeNode.nodes?.filter(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop.startsWith(\"--animate-\")\n )\n\n const parsedAnimationValue = z\n .record(z.string(), z.string())\n .safeParse(tailwindConfig.theme.extend.animation)\n if (!parsedAnimationValue.success) {\n return\n }\n\n for (const [key, value] of Object.entries(parsedAnimationValue.data)) {\n const prop = `--animate-${key}`\n if (\n existingAnimationNodes?.find(\n (node): node is postcss.Declaration => node.prop === prop\n )\n ) {\n continue\n }\n\n const animationNode = postcss.decl({\n prop,\n value,\n raws: { semicolon: true, between: \": \", before: \"\\n \" },\n })\n themeNode.append(animationNode)\n }\n },\n }\n}\n\nfunction getQuoteType(root: Root): \"single\" | \"double\" {\n const firstNode = root.nodes[0]\n const raw = firstNode.toString()\n\n if (raw.includes(\"'\")) {\n return \"single\"\n }\n return \"double\"\n}\n\nexport function isLocalHSLValue(value: string) {\n if (\n value.startsWith(\"hsl\") ||\n value.startsWith(\"rgb\") ||\n value.startsWith(\"#\") ||\n value.startsWith(\"oklch\")\n ) {\n return false\n }\n\n const chunks = value.split(\" \")\n\n return (\n chunks.length === 3 &&\n chunks.slice(1, 3).every((chunk) => chunk.includes(\"%\"))\n )\n}\n\nexport function isColorValue(value: string) {\n return (\n value.startsWith(\"hsl\") ||\n value.startsWith(\"rgb\") ||\n value.startsWith(\"#\") ||\n value.startsWith(\"oklch\")\n )\n}\n","import { detect } from \"@antfu/ni\"\n\nexport async function getPackageManager(\n targetDir: string,\n { withFallback }: { withFallback?: boolean } = {\n withFallback: false,\n }\n): Promise<\"yarn\" | \"pnpm\" | \"bun\" | \"npm\" | \"deno\"> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir })\n\n if (packageManager === \"yarn@berry\") return \"yarn\"\n if (packageManager === \"pnpm@6\") return \"pnpm\"\n if (packageManager === \"bun\") return \"bun\"\n if (packageManager === \"deno\") return \"deno\"\n if (!withFallback) {\n return packageManager ?? \"npm\"\n }\n\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || \"\"\n\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\"\n }\n\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\"\n }\n\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\"\n }\n\n return \"npm\"\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd)\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\"\n\n if (packageManager === \"bun\") return \"bunx\"\n\n return \"npx\"\n}\n","import { RegistryItem } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport { getPackageManager } from \"@/src/utils/get-package-manager\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { execa } from \"execa\"\nimport prompts from \"prompts\"\n\nexport async function updateDependencies(\n dependencies: RegistryItem[\"dependencies\"],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n dependencies = Array.from(new Set(dependencies))\n if (!dependencies?.length) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const dependenciesSpinner = spinner(`Installing dependencies.`, {\n silent: options.silent,\n })?.start()\n const packageManager = await getPackageManager(config.resolvedPaths.cwd)\n\n // Offer to use --force or --legacy-peer-deps if using React 19 with npm.\n let flag = \"\"\n if (isUsingReact19(config) && packageManager === \"npm\") {\n if (options.silent) {\n flag = \"force\"\n } else {\n dependenciesSpinner.stopAndPersist()\n logger.warn(\n \"\\nIt looks like you are using React 19. \\nSome packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).\\n\"\n )\n const confirmation = await prompts([\n {\n type: \"select\",\n name: \"flag\",\n message: \"How would you like to proceed?\",\n choices: [\n { title: \"Use --force\", value: \"force\" },\n { title: \"Use --legacy-peer-deps\", value: \"legacy-peer-deps\" },\n ],\n },\n ])\n\n if (confirmation) {\n flag = confirmation.flag\n }\n }\n }\n\n dependenciesSpinner?.start()\n\n await execa(\n packageManager,\n [\n packageManager === \"npm\" ? \"install\" : \"add\",\n ...(packageManager === \"npm\" && flag ? [`--${flag}`] : []),\n ...dependencies,\n ],\n {\n cwd: config.resolvedPaths.cwd,\n }\n )\n\n dependenciesSpinner?.succeed()\n}\n\nfunction isUsingReact19(config: Config) {\n const packageInfo = getPackageInfo(config.resolvedPaths.cwd)\n\n if (!packageInfo?.dependencies?.react) {\n return false\n }\n\n return /^(?:\\^|~)?19(?:\\.\\d+)*(?:-.*)?$/.test(packageInfo.dependencies.react)\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path, { basename } from \"path\"\nimport { getRegistryBaseColor } from \"@/src/registry/api\"\nimport { RegistryItem, registryItemFileSchema } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { ProjectInfo, getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { transform } from \"@/src/utils/transformers\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformIcons } from \"@/src/utils/transformers/transform-icons\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { transformTwPrefixes } from \"@/src/utils/transformers/transform-tw-prefix\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\n\nexport async function updateFiles(\n files: RegistryItem[\"files\"],\n config: Config,\n options: {\n overwrite?: boolean\n force?: boolean\n silent?: boolean\n rootSpinner?: ReturnType<typeof spinner>\n isRemote?: boolean\n }\n) {\n if (!files?.length) {\n return {\n filesCreated: [],\n filesUpdated: [],\n filesSkipped: [],\n }\n }\n options = {\n overwrite: false,\n force: false,\n silent: false,\n isRemote: false,\n ...options,\n }\n const filesCreatedSpinner = spinner(`Updating files.`, {\n silent: options.silent,\n })?.start()\n\n const [projectInfo, baseColor] = await Promise.all([\n getProjectInfo(config.resolvedPaths.cwd),\n getRegistryBaseColor(config.tailwind.baseColor),\n ])\n\n const filesCreated = []\n const filesUpdated = []\n const filesSkipped = []\n\n for (const file of files) {\n if (!file.content) {\n continue\n }\n\n let filePath = resolveFilePath(file, config, {\n isSrcDir: projectInfo?.isSrcDir,\n framework: projectInfo?.framework.name,\n commonRoot: findCommonRoot(\n files.map((f) => f.path),\n file.path\n ),\n })\n\n if (!filePath) {\n continue\n }\n\n const fileName = basename(file.path)\n const targetDir = path.dirname(filePath)\n\n if (!config.tsx) {\n filePath = filePath.replace(/\\.tsx?$/, (match) =>\n match === \".tsx\" ? \".jsx\" : \".js\"\n )\n }\n\n const existingFile = existsSync(filePath)\n\n // Run our transformers.\n const content = await transform(\n {\n filename: file.path,\n raw: file.content,\n config,\n baseColor,\n transformJsx: !config.tsx,\n isRemote: options.isRemote,\n },\n [\n transformImport,\n transformRsc,\n transformCssVars,\n transformTwPrefixes,\n transformIcons,\n ]\n )\n\n // Skip the file if it already exists and the content is the same.\n if (existingFile) {\n const existingFileContent = await fs.readFile(filePath, \"utf-8\")\n const [normalizedExisting, normalizedNew] = await Promise.all([\n getNormalizedFileContent(existingFileContent),\n getNormalizedFileContent(content),\n ])\n if (normalizedExisting === normalizedNew) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n continue\n }\n }\n\n if (existingFile && !options.overwrite) {\n filesCreatedSpinner.stop()\n if (options.rootSpinner) {\n options.rootSpinner.stop()\n }\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `The file ${highlighter.info(\n fileName\n )} already exists. Would you like to overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n if (options.rootSpinner) {\n options.rootSpinner.start()\n }\n continue\n }\n filesCreatedSpinner?.start()\n if (options.rootSpinner) {\n options.rootSpinner.start()\n }\n }\n\n // Create the target directory if it doesn't exist.\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true })\n }\n\n await fs.writeFile(filePath, content, \"utf-8\")\n existingFile\n ? filesUpdated.push(path.relative(config.resolvedPaths.cwd, filePath))\n : filesCreated.push(path.relative(config.resolvedPaths.cwd, filePath))\n }\n\n const hasUpdatedFiles = filesCreated.length || filesUpdated.length\n if (!hasUpdatedFiles && !filesSkipped.length) {\n filesCreatedSpinner?.info(\"No files updated.\")\n }\n\n if (filesCreated.length) {\n filesCreatedSpinner?.succeed(\n `Created ${filesCreated.length} ${\n filesCreated.length === 1 ? \"file\" : \"files\"\n }:`\n )\n if (!options.silent) {\n for (const file of filesCreated) {\n logger.log(` - ${file}`)\n }\n }\n } else {\n filesCreatedSpinner?.stop()\n }\n\n if (filesUpdated.length) {\n spinner(\n `Updated ${filesUpdated.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesUpdated) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (filesSkipped.length) {\n spinner(\n `Skipped ${filesSkipped.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }: (files might be identical, use --overwrite to overwrite)`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesSkipped) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (!options.silent) {\n logger.break()\n }\n\n return {\n filesCreated,\n filesUpdated,\n filesSkipped,\n }\n}\n\nexport function resolveFilePath(\n file: z.infer<typeof registryItemFileSchema>,\n config: Config,\n options: {\n isSrcDir?: boolean\n commonRoot?: string\n framework?: ProjectInfo[\"framework\"][\"name\"]\n }\n) {\n if (file.target) {\n if (file.target.startsWith(\"~/\")) {\n return path.join(config.resolvedPaths.cwd, file.target.replace(\"~/\", \"\"))\n }\n\n let target = file.target\n\n if (file.type === \"registry:page\") {\n target = resolvePageTarget(target, options.framework)\n if (!target) {\n return \"\"\n }\n }\n\n return options.isSrcDir\n ? path.join(config.resolvedPaths.cwd, \"src\", target.replace(\"src/\", \"\"))\n : path.join(config.resolvedPaths.cwd, target.replace(\"src/\", \"\"))\n }\n\n const targetDir = resolveFileTargetDirectory(file, config)\n\n const relativePath = resolveNestedFilePath(file.path, targetDir)\n return path.join(targetDir, relativePath)\n}\n\nfunction resolveFileTargetDirectory(\n file: z.infer<typeof registryItemFileSchema>,\n config: Config\n) {\n if (file.type === \"registry:ui\") {\n return config.resolvedPaths.ui\n }\n\n if (file.type === \"registry:lib\") {\n return config.resolvedPaths.lib\n }\n\n if (file.type === \"registry:block\" || file.type === \"registry:component\") {\n return config.resolvedPaths.components\n }\n\n if (file.type === \"registry:hook\") {\n return config.resolvedPaths.hooks\n }\n\n return config.resolvedPaths.components\n}\n\nexport function findCommonRoot(paths: string[], needle: string): string {\n // Remove leading slashes for consistent handling\n const normalizedPaths = paths.map((p) => p.replace(/^\\//, \"\"))\n const normalizedNeedle = needle.replace(/^\\//, \"\")\n\n // Get the directory path of the needle by removing the file name\n const needleDir = normalizedNeedle.split(\"/\").slice(0, -1).join(\"/\")\n\n // If needle is at root level, return empty string\n if (!needleDir) {\n return \"\"\n }\n\n // Split the needle directory into segments\n const needleSegments = needleDir.split(\"/\")\n\n // Start from the full path and work backwards\n for (let i = needleSegments.length; i > 0; i--) {\n const testPath = needleSegments.slice(0, i).join(\"/\")\n // Check if this is a common root by verifying if any other paths start with it\n const hasRelatedPaths = normalizedPaths.some(\n (path) => path !== normalizedNeedle && path.startsWith(testPath + \"/\")\n )\n if (hasRelatedPaths) {\n return \"/\" + testPath // Add leading slash back for the result\n }\n }\n\n // If no common root found with other files, return the parent directory of the needle\n return \"/\" + needleDir // Add leading slash back for the result\n}\n\nexport function resolveNestedFilePath(\n filePath: string,\n targetDir: string\n): string {\n // Normalize paths by removing leading/trailing slashes\n const normalizedFilePath = filePath.replace(/^\\/|\\/$/g, \"\")\n const normalizedTargetDir = targetDir.replace(/^\\/|\\/$/g, \"\")\n\n // Split paths into segments\n const fileSegments = normalizedFilePath.split(\"/\")\n const targetSegments = normalizedTargetDir.split(\"/\")\n\n // Find the last matching segment from targetDir in filePath\n const lastTargetSegment = targetSegments[targetSegments.length - 1]\n const commonDirIndex = fileSegments.findIndex(\n (segment) => segment === lastTargetSegment\n )\n\n if (commonDirIndex === -1) {\n // Return just the filename if no common directory is found\n return fileSegments[fileSegments.length - 1]\n }\n\n // Return everything after the common directory\n return fileSegments.slice(commonDirIndex + 1).join(\"/\")\n}\n\nexport async function getNormalizedFileContent(content: string) {\n return content.replace(/\\r\\n/g, \"\\n\").trim()\n}\n\nexport function resolvePageTarget(\n target: string,\n framework?: ProjectInfo[\"framework\"][\"name\"]\n) {\n if (!framework) {\n return \"\"\n }\n\n if (framework === \"next-app\") {\n return target\n }\n\n if (framework === \"next-pages\") {\n let result = target.replace(/^app\\//, \"pages/\")\n result = result.replace(/\\/page(\\.[jt]sx?)$/, \"$1\")\n\n return result\n }\n\n if (framework === \"react-router\") {\n let result = target.replace(/^app\\//, \"app/routes/\")\n result = result.replace(/\\/page(\\.[jt]sx?)$/, \"$1\")\n\n return result\n }\n\n if (framework === \"laravel\") {\n let result = target.replace(/^app\\//, \"resources/js/pages/\")\n result = result.replace(/\\/page(\\.[jt]sx?)$/, \"$1\")\n\n return result\n }\n\n return \"\"\n}\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { registryBaseColorSchema } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformIcons } from \"@/src/utils/transformers/transform-icons\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformJsx } from \"@/src/utils/transformers/transform-jsx\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { Project, ScriptKind, type SourceFile } from \"ts-morph\"\nimport { z } from \"zod\"\n\nimport { transformTwPrefixes } from \"./transform-tw-prefix\"\n\nexport type TransformOpts = {\n filename: string\n raw: string\n config: Config\n baseColor?: z.infer<typeof registryBaseColorSchema>\n transformJsx?: boolean\n isRemote?: boolean\n}\n\nexport type Transformer<Output = SourceFile> = (\n opts: TransformOpts & {\n sourceFile: SourceFile\n }\n) => Promise<Output>\n\nconst project = new Project({\n compilerOptions: {},\n})\n\nasync function createTempSourceFile(filename: string) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n return path.join(dir, filename)\n}\n\nexport async function transform(\n opts: TransformOpts,\n transformers: Transformer[] = [\n transformImport,\n transformRsc,\n transformCssVars,\n transformTwPrefixes,\n transformIcons,\n ]\n) {\n const tempFile = await createTempSourceFile(opts.filename)\n const sourceFile = project.createSourceFile(tempFile, opts.raw, {\n scriptKind: ScriptKind.TSX,\n })\n\n for (const transformer of transformers) {\n await transformer({ sourceFile, ...opts })\n }\n\n if (opts.transformJsx) {\n return await transformJsx({\n sourceFile,\n ...opts,\n })\n }\n\n return sourceFile.getText()\n}\n","import { registryBaseColorSchema } from \"@/src/registry/schema\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { ScriptKind, SyntaxKind } from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport const transformCssVars: Transformer = async ({\n sourceFile,\n config,\n baseColor,\n}) => {\n // No transform if using css variables.\n if (config.tailwind?.cssVariables || !baseColor?.inlineColors) {\n return sourceFile\n }\n\n // Find jsx attributes with the name className.\n // const openingElements = sourceFile.getDescendantsOfKind(SyntaxKind.JsxElement)\n // console.log(openingElements)\n // const jsxAttributes = sourceFile\n // .getDescendantsOfKind(SyntaxKind.JsxAttribute)\n // .filter((node) => node.getName() === \"className\")\n\n // for (const jsxAttribute of jsxAttributes) {\n // const value = jsxAttribute.getInitializer()?.getText()\n // if (value) {\n // const valueWithColorMapping = applyColorMapping(\n // value.replace(/\"/g, \"\"),\n // baseColor.inlineColors\n // )\n // jsxAttribute.setInitializer(`\"${valueWithColorMapping}\"`)\n // }\n // }\n sourceFile.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach((node) => {\n const value = node.getText()\n if (value) {\n const valueWithColorMapping = applyColorMapping(\n value.replace(/\"/g, \"\"),\n baseColor.inlineColors\n )\n node.replaceWithText(`\"${valueWithColorMapping.trim()}\"`)\n }\n })\n\n return sourceFile\n}\n\n// export default function transformer(file: FileInfo, api: API) {\n// const j = api.jscodeshift.withParser(\"tsx\")\n\n// // Replace bg-background with \"bg-white dark:bg-slate-950\"\n// const $j = j(file.source)\n// return $j\n// .find(j.JSXAttribute, {\n// name: {\n// name: \"className\",\n// },\n// })\n// .forEach((path) => {\n// const { node } = path\n// if (node?.value?.type) {\n// if (node.value.type === \"StringLiteral\") {\n// node.value.value = applyColorMapping(node.value.value)\n// console.log(node.value.value)\n// }\n\n// if (\n// node.value.type === \"JSXExpressionContainer\" &&\n// node.value.expression.type === \"CallExpression\"\n// ) {\n// const callee = node.value.expression.callee\n// if (callee.type === \"Identifier\" && callee.name === \"cn\") {\n// node.value.expression.arguments.forEach((arg) => {\n// if (arg.type === \"StringLiteral\") {\n// arg.value = applyColorMapping(arg.value)\n// }\n\n// if (\n// arg.type === \"LogicalExpression\" &&\n// arg.right.type === \"StringLiteral\"\n// ) {\n// arg.right.value = applyColorMapping(arg.right.value)\n// }\n// })\n// }\n// }\n// }\n// })\n// .toSource()\n// }\n\n// // export function splitClassName(input: string): (string | null)[] {\n// // const parts = input.split(\":\")\n// // const classNames = parts.map((part) => {\n// // const match = part.match(/^\\[?(.+)\\]$/)\n// // if (match) {\n// // return match[1]\n// // } else {\n// // return null\n// // }\n// // })\n\n// // return classNames\n// // }\n\n// Splits a className into variant-name-alpha.\n// eg. hover:bg-primary-100 -> [hover, bg-primary, 100]\nexport function splitClassName(className: string): (string | null)[] {\n if (!className.includes(\"/\") && !className.includes(\":\")) {\n return [null, className, null]\n }\n\n const parts: (string | null)[] = []\n // First we split to find the alpha.\n let [rest, alpha] = className.split(\"/\")\n\n // Check if rest has a colon.\n if (!rest.includes(\":\")) {\n return [null, rest, alpha]\n }\n\n // Next we split the rest by the colon.\n const split = rest.split(\":\")\n\n // We take the last item from the split as the name.\n const name = split.pop()\n\n // We glue back the rest of the split.\n const variant = split.join(\":\")\n\n // Finally we push the variant, name and alpha.\n parts.push(variant ?? null, name ?? null, alpha ?? null)\n\n return parts\n}\n\nconst PREFIXES = [\"bg-\", \"text-\", \"border-\", \"ring-offset-\", \"ring-\"]\n\nexport function applyColorMapping(\n input: string,\n mapping: z.infer<typeof registryBaseColorSchema>[\"inlineColors\"]\n) {\n // Handle border classes.\n if (input.includes(\" border \")) {\n input = input.replace(\" border \", \" border border-border \")\n }\n\n // Build color mappings.\n const classNames = input.split(\" \")\n const lightMode = new Set<string>()\n const darkMode = new Set<string>()\n for (let className of classNames) {\n const [variant, value, modifier] = splitClassName(className)\n const prefix = PREFIXES.find((prefix) => value?.startsWith(prefix))\n if (!prefix) {\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n continue\n }\n\n const needle = value?.replace(prefix, \"\")\n if (needle && needle in mapping.light) {\n lightMode.add(\n [variant, `${prefix}${mapping.light[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n\n darkMode.add(\n [\"dark\", variant, `${prefix}${mapping.dark[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n continue\n }\n\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n }\n\n return [...Array.from(lightMode), ...Array.from(darkMode)].join(\" \").trim()\n}\n","export const ICON_LIBRARIES = {\n lucide: {\n name: \"lucide-react\",\n package: \"lucide-react\",\n import: \"lucide-react\",\n },\n radix: {\n name: \"@radix-ui/react-icons\",\n package: \"@radix-ui/react-icons\",\n import: \"@radix-ui/react-icons\",\n },\n}\n","import { getRegistryIcons } from \"@/src/registry/api\"\nimport { ICON_LIBRARIES } from \"@/src/utils/icon-libraries\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { SourceFile, SyntaxKind } from \"ts-morph\"\n\n// Lucide is the default icon library in the registry.\nconst SOURCE_LIBRARY = \"lucide\"\n\nexport const transformIcons: Transformer = async ({ sourceFile, config }) => {\n // No transform if we cannot read the icon library.\n if (!config.iconLibrary || !(config.iconLibrary in ICON_LIBRARIES)) {\n return sourceFile\n }\n\n const registryIcons = await getRegistryIcons()\n const sourceLibrary = SOURCE_LIBRARY\n const targetLibrary = config.iconLibrary\n\n if (sourceLibrary === targetLibrary) {\n return sourceFile\n }\n\n let targetedIcons: string[] = []\n for (const importDeclaration of sourceFile.getImportDeclarations() ?? []) {\n if (\n importDeclaration.getModuleSpecifier()?.getText() !==\n `\"${ICON_LIBRARIES[SOURCE_LIBRARY].import}\"`\n ) {\n continue\n }\n\n for (const specifier of importDeclaration.getNamedImports() ?? []) {\n const iconName = specifier.getName()\n\n const targetedIcon = registryIcons[iconName]?.[targetLibrary]\n\n if (!targetedIcon || targetedIcons.includes(targetedIcon)) {\n continue\n }\n\n targetedIcons.push(targetedIcon)\n\n // Remove the named import.\n specifier.remove()\n\n // Replace with the targeted icon.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)\n .filter((node) => node.getTagNameNode()?.getText() === iconName)\n .forEach((node) => node.getTagNameNode()?.replaceWithText(targetedIcon))\n }\n\n // If the named import is empty, remove the import declaration.\n if (importDeclaration.getNamedImports()?.length === 0) {\n importDeclaration.remove()\n }\n }\n\n if (targetedIcons.length > 0) {\n const iconImportDeclaration = sourceFile.addImportDeclaration({\n moduleSpecifier:\n ICON_LIBRARIES[targetLibrary as keyof typeof ICON_LIBRARIES]?.import,\n namedImports: targetedIcons.map((icon) => ({\n name: icon,\n })),\n })\n\n if (!_useSemicolon(sourceFile)) {\n iconImportDeclaration.replaceWithText(\n iconImportDeclaration.getText().replace(\";\", \"\")\n )\n }\n }\n\n return sourceFile\n}\n\nfunction _useSemicolon(sourceFile: SourceFile) {\n return (\n sourceFile.getImportDeclarations()?.[0]?.getText().endsWith(\";\") ?? false\n )\n}\n","import { Config } from \"@/src/utils/get-config\"\nimport { Transformer } from \"@/src/utils/transformers\"\n\nexport const transformImport: Transformer = async ({\n sourceFile,\n config,\n isRemote,\n}) => {\n const workspaceAlias = config.aliases?.utils?.split(\"/\")[0]?.slice(1)\n const utilsImport = `@${workspaceAlias}/lib/utils`\n\n const importDeclarations = sourceFile.getImportDeclarations()\n\n for (const importDeclaration of importDeclarations) {\n const moduleSpecifier = updateImportAliases(\n importDeclaration.getModuleSpecifierValue(),\n config,\n isRemote\n )\n\n importDeclaration.setModuleSpecifier(moduleSpecifier)\n\n // Replace `import { cn } from \"@/lib/utils\"`\n if (utilsImport === moduleSpecifier || moduleSpecifier === \"@/lib/utils\") {\n const namedImports = importDeclaration.getNamedImports()\n const cnImport = namedImports.find((i) => i.getName() === \"cn\")\n if (cnImport) {\n importDeclaration.setModuleSpecifier(\n utilsImport === moduleSpecifier\n ? moduleSpecifier.replace(utilsImport, config.aliases.utils)\n : config.aliases.utils\n )\n }\n }\n }\n\n return sourceFile\n}\n\nfunction 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 if (isRemote && moduleSpecifier.startsWith(\"@/\")) {\n moduleSpecifier = moduleSpecifier.replace(/^@\\//, `@/registry/new-york/`)\n }\n\n // Not a registry import.\n if (!moduleSpecifier.startsWith(\"@/registry/\")) {\n // We fix the alias and return.\n const alias = config.aliases.components.split(\"/\")[0]\n return moduleSpecifier.replace(/^@\\//, `${alias}/`)\n }\n\n if (moduleSpecifier.match(/^@\\/registry\\/(.+)\\/ui/)) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/ui/,\n config.aliases.ui ?? `${config.aliases.components}/ui`\n )\n }\n\n if (\n config.aliases.components &&\n moduleSpecifier.match(/^@\\/registry\\/(.+)\\/components/)\n ) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/components/,\n config.aliases.components\n )\n }\n\n if (config.aliases.lib && moduleSpecifier.match(/^@\\/registry\\/(.+)\\/lib/)) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/lib/,\n config.aliases.lib\n )\n }\n\n if (\n config.aliases.hooks &&\n moduleSpecifier.match(/^@\\/registry\\/(.+)\\/hooks/)\n ) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/hooks/,\n config.aliases.hooks\n )\n }\n\n return moduleSpecifier.replace(\n /^@\\/registry\\/[^/]+/,\n config.aliases.components\n )\n}\n","import { type Transformer } from \"@/src/utils/transformers\"\nimport { transformFromAstSync } from \"@babel/core\"\nimport { ParserOptions, parse } from \"@babel/parser\"\n// @ts-ignore\nimport transformTypescript from \"@babel/plugin-transform-typescript\"\nimport * as recast from \"recast\"\n\n// TODO.\n// I'm using recast for the AST here.\n// Figure out if ts-morph AST is compatible with Babel.\n\n// This is a copy of the babel options from recast/parser.\n// The goal here is to tolerate as much syntax as possible.\n// We want to be able to parse any valid tsx code.\n// See https://github.com/benjamn/recast/blob/master/parsers/_babel_options.ts.\nconst PARSE_OPTIONS: ParserOptions = {\n sourceType: \"module\",\n allowImportExportEverywhere: true,\n allowReturnOutsideFunction: true,\n startLine: 1,\n tokens: true,\n plugins: [\n \"asyncGenerators\",\n \"bigInt\",\n \"classPrivateMethods\",\n \"classPrivateProperties\",\n \"classProperties\",\n \"classStaticBlock\",\n \"decimal\",\n \"decorators-legacy\",\n \"doExpressions\",\n \"dynamicImport\",\n \"exportDefaultFrom\",\n \"exportNamespaceFrom\",\n \"functionBind\",\n \"functionSent\",\n \"importAssertions\",\n \"importMeta\",\n \"nullishCoalescingOperator\",\n \"numericSeparator\",\n \"objectRestSpread\",\n \"optionalCatchBinding\",\n \"optionalChaining\",\n [\n \"pipelineOperator\",\n {\n proposal: \"minimal\",\n },\n ],\n [\n \"recordAndTuple\",\n {\n syntaxType: \"hash\",\n },\n ],\n \"throwExpressions\",\n \"topLevelAwait\",\n \"v8intrinsic\",\n \"typescript\",\n \"jsx\",\n ],\n}\n\nexport const transformJsx: Transformer<string> = async ({\n sourceFile,\n config,\n}) => {\n const output = sourceFile.getFullText()\n\n if (config.tsx) {\n return output\n }\n\n const ast = recast.parse(output, {\n parser: {\n parse: (code: string) => {\n return parse(code, PARSE_OPTIONS)\n },\n },\n })\n\n const result = transformFromAstSync(ast, output, {\n cloneInputAst: false,\n code: false,\n ast: true,\n plugins: [transformTypescript],\n configFile: false,\n })\n\n if (!result || !result.ast) {\n throw new Error(\"Failed to transform JSX\")\n }\n\n return recast.print(result.ast).code\n}\n","import { Transformer } from \"@/src/utils/transformers\"\nimport { SyntaxKind } from \"ts-morph\"\n\nconst directiveRegex = /^[\"']use client[\"']$/g\n\nexport const transformRsc: Transformer = async ({ sourceFile, config }) => {\n if (config.rsc) {\n return sourceFile\n }\n\n // Remove \"use client\" from the top of the file.\n const first = sourceFile.getFirstChildByKind(SyntaxKind.ExpressionStatement)\n if (first && directiveRegex.test(first.getText())) {\n first.remove()\n }\n\n return sourceFile\n}\n","import { Transformer } from \"@/src/utils/transformers\"\nimport { SyntaxKind } from \"ts-morph\"\n\nimport { splitClassName } from \"./transform-css-vars\"\n\nexport const transformTwPrefixes: Transformer = async ({\n sourceFile,\n config,\n}) => {\n if (!config.tailwind?.prefix) {\n return sourceFile\n }\n\n // Find the cva function calls.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((node) => node.getExpression().getText() === \"cva\")\n .forEach((node) => {\n // cva(base, ...)\n if (node.getArguments()[0]?.isKind(SyntaxKind.StringLiteral)) {\n const defaultClassNames = node.getArguments()[0]\n if (defaultClassNames) {\n defaultClassNames.replaceWithText(\n `\"${applyPrefix(\n defaultClassNames.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n\n // cva(..., { variants: { ... } })\n if (node.getArguments()[1]?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n node\n .getArguments()[1]\n ?.getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .find((node) => node.getName() === \"variants\")\n ?.getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n node\n .getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n const classNames = node.getInitializerIfKind(\n SyntaxKind.StringLiteral\n )\n if (classNames) {\n classNames?.replaceWithText(\n `\"${applyPrefix(\n classNames.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n })\n }\n })\n\n // Find all jsx attributes with the name className.\n sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((node) => {\n if (node.getName() === \"className\") {\n // className=\"...\"\n if (node.getInitializer()?.isKind(SyntaxKind.StringLiteral)) {\n const value = node.getInitializer()\n if (value) {\n value.replaceWithText(\n `\"${applyPrefix(\n value.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n\n // className={...}\n if (node.getInitializer()?.isKind(SyntaxKind.JsxExpression)) {\n // Check if it's a call to cn().\n const callExpression = node\n .getInitializer()\n ?.getDescendantsOfKind(SyntaxKind.CallExpression)\n .find((node) => node.getExpression().getText() === \"cn\")\n if (callExpression) {\n // Loop through the arguments.\n callExpression.getArguments().forEach((node) => {\n if (\n node.isKind(SyntaxKind.ConditionalExpression) ||\n node.isKind(SyntaxKind.BinaryExpression)\n ) {\n node\n .getChildrenOfKind(SyntaxKind.StringLiteral)\n .forEach((node) => {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n })\n }\n\n if (node.isKind(SyntaxKind.StringLiteral)) {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n }\n }\n }\n\n // classNames={...}\n if (node.getName() === \"classNames\") {\n if (node.getInitializer()?.isKind(SyntaxKind.JsxExpression)) {\n node\n .getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n if (node.getInitializer()?.isKind(SyntaxKind.CallExpression)) {\n const callExpression = node.getInitializerIfKind(\n SyntaxKind.CallExpression\n )\n if (callExpression) {\n // Loop through the arguments.\n callExpression.getArguments().forEach((arg) => {\n if (arg.isKind(SyntaxKind.ConditionalExpression)) {\n arg\n .getChildrenOfKind(SyntaxKind.StringLiteral)\n .forEach((node) => {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n })\n }\n\n if (arg.isKind(SyntaxKind.StringLiteral)) {\n arg.replaceWithText(\n `\"${applyPrefix(\n arg.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n }\n }\n\n if (node.getInitializer()?.isKind(SyntaxKind.StringLiteral)) {\n if (node.getName() !== \"variant\") {\n const classNames = node.getInitializer()\n if (classNames) {\n classNames.replaceWithText(\n `\"${applyPrefix(\n classNames.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n }\n })\n }\n }\n })\n\n return sourceFile\n}\n\nexport function applyPrefix(input: string, prefix: string = \"\") {\n const classNames = input.split(\" \")\n const prefixed: string[] = []\n for (let className of classNames) {\n const [variant, value, modifier] = splitClassName(className)\n if (variant) {\n modifier\n ? prefixed.push(`${variant}:${prefix}${value}/${modifier}`)\n : prefixed.push(`${variant}:${prefix}${value}`)\n } else {\n modifier\n ? prefixed.push(`${prefix}${value}/${modifier}`)\n : prefixed.push(`${prefix}${value}`)\n }\n }\n return prefixed.join(\" \")\n}\n\nexport function applyPrefixesCss(css: string, prefix: string) {\n const lines = css.split(\"\\n\")\n for (let line of lines) {\n if (line.includes(\"@apply\")) {\n const originalTWCls = line.replace(\"@apply\", \"\").trim()\n const prefixedTwCls = applyPrefix(originalTWCls, prefix)\n css = css.replace(originalTWCls, prefixedTwCls)\n }\n }\n return css\n}\n","import os from \"os\"\nimport path from \"path\"\nimport { initOptionsSchema } from \"@/src/commands/init\"\nimport { fetchRegistry } from \"@/src/registry/api\"\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\nconst MONOREPO_TEMPLATE_URL =\n \"https://codeload.github.com/shadcn-ui/ui/tar.gz/main\"\n\nexport const TEMPLATES = {\n next: \"next\",\n \"next-monorepo\": \"next-monorepo\",\n} as const\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 : \"next\"\n let projectName: string =\n template === TEMPLATES.next ? \"my-app\" : \"my-monorepo\"\n let nextVersion = \"latest\"\n\n const isRemoteComponent =\n options.components?.length === 1 &&\n !!options.components[0].match(/\\/chat\\/b\\//)\n\n if (options.components && isRemoteComponent) {\n try {\n const [result] = await fetchRegistry(options.components)\n const { meta } = z\n .object({\n meta: z.object({\n nextVersion: z.string(),\n }),\n })\n .parse(result)\n nextVersion = meta.nextVersion\n\n // Force template to next for remote components.\n template = TEMPLATES.next\n } catch (error) {\n logger.break()\n handleError(error)\n }\n }\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: \"Next.js\", value: \"next\" },\n { title: \"Next.js (Monorepo)\", value: \"next-monorepo\" },\n ],\n initial: 0,\n },\n {\n type: \"text\",\n name: \"name\",\n message: \"What is your project named?\",\n initial: projectName,\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 if (template === TEMPLATES.next) {\n await createNextProject(projectPath, {\n version: nextVersion,\n cwd: options.cwd,\n packageManager,\n srcDir: !!options.srcDir,\n })\n }\n\n if (template === TEMPLATES[\"next-monorepo\"]) {\n await createMonorepoProject(projectPath, {\n packageManager,\n })\n }\n\n return {\n projectPath,\n projectName,\n template,\n }\n}\n\nasync function createNextProject(\n projectPath: string,\n options: {\n version: string\n cwd: string\n packageManager: string\n srcDir: boolean\n }\n) {\n const createSpinner = spinner(\n `Creating a new Next.js project. This may take a few minutes.`\n ).start()\n\n // Note: pnpm fails here. Fallback to npx with --use-PACKAGE-MANAGER.\n const args = [\n \"--tailwind\",\n \"--eslint\",\n \"--typescript\",\n \"--app\",\n options.srcDir ? \"--src-dir\" : \"--no-src-dir\",\n \"--no-import-alias\",\n `--use-${options.packageManager}`,\n ]\n\n if (\n options.version.startsWith(\"15\") ||\n options.version.startsWith(\"latest\") ||\n options.version.startsWith(\"canary\")\n ) {\n args.push(\"--turbopack\")\n }\n\n try {\n await execa(\n \"npx\",\n [`create-next-app@${options.version}`, projectPath, \"--silent\", ...args],\n {\n cwd: options.cwd,\n }\n )\n } catch (error) {\n logger.break()\n logger.error(\n `Something went wrong creating a new Next.js project. Please try again.`\n )\n process.exit(1)\n }\n\n createSpinner?.succeed(\"Creating a new Next.js project.\")\n}\n\nasync function createMonorepoProject(\n projectPath: string,\n options: {\n packageManager: string\n }\n) {\n const createSpinner = spinner(\n `Creating a new Next.js monorepo. This may take a few minutes.`\n ).start()\n\n try {\n // Get the template.\n const templatePath = path.join(os.tmpdir(), `shadcn-template-${Date.now()}`)\n await fs.ensureDir(templatePath)\n const response = await fetch(MONOREPO_TEMPLATE_URL)\n if (!response.ok) {\n throw new Error(`Failed to download template: ${response.statusText}`)\n }\n\n // Write the tar file\n const tarPath = path.resolve(templatePath, \"template.tar.gz\")\n await fs.writeFile(tarPath, Buffer.from(await response.arrayBuffer()))\n await execa(\"tar\", [\n \"-xzf\",\n tarPath,\n \"-C\",\n templatePath,\n \"--strip-components=2\",\n \"ui-main/templates/monorepo-next\",\n ])\n const extractedPath = path.resolve(templatePath, \"monorepo-next\")\n await fs.move(extractedPath, projectPath)\n await fs.remove(templatePath)\n\n // Run install.\n await execa(options.packageManager, [\"install\"], {\n cwd: projectPath,\n })\n\n // Try git init.\n const cwd = process.cwd()\n await execa(\"git\", [\"--version\"], { cwd: projectPath })\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 await execa(\"cd\", [cwd])\n\n createSpinner?.succeed(\"Creating a new Next.js monorepo.\")\n } catch (error) {\n createSpinner?.fail(\"Something went wrong creating a new Next.js monorepo.\")\n handleError(error)\n }\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport {\n _createSourceFile,\n _getQuoteChar,\n} from \"@/src/utils/updaters/update-tailwind-config\"\nimport { ObjectLiteralExpression, SyntaxKind } from \"ts-morph\"\n\nexport async function updateTailwindContent(\n content: string[],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n if (!content) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const tailwindFileRelativePath = path.relative(\n config.resolvedPaths.cwd,\n config.resolvedPaths.tailwindConfig\n )\n const tailwindSpinner = spinner(\n `Updating ${highlighter.info(tailwindFileRelativePath)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(config.resolvedPaths.tailwindConfig, \"utf8\")\n const output = await transformTailwindContent(raw, content, config)\n await fs.writeFile(config.resolvedPaths.tailwindConfig, output, \"utf8\")\n tailwindSpinner?.succeed()\n}\n\nexport async function transformTailwindContent(\n input: string,\n content: string[],\n config: Config\n) {\n const sourceFile = await _createSourceFile(input, config)\n // Find the object with content property.\n // This is faster than traversing the default export.\n // TODO: maybe we do need to traverse the default export?\n const configObject = sourceFile\n .getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression)\n .find((node) =>\n node\n .getProperties()\n .some(\n (property) =>\n property.isKind(SyntaxKind.PropertyAssignment) &&\n property.getName() === \"content\"\n )\n )\n\n // We couldn't find the config object, so we return the input as is.\n if (!configObject) {\n return input\n }\n\n addTailwindConfigContent(configObject, content)\n\n return sourceFile.getFullText()\n}\n\nasync function addTailwindConfigContent(\n configObject: ObjectLiteralExpression,\n content: string[]\n) {\n const quoteChar = _getQuoteChar(configObject)\n\n const existingProperty = configObject.getProperty(\"content\")\n\n if (!existingProperty) {\n const newProperty = {\n name: \"content\",\n initializer: `[${quoteChar}${content.join(\n `${quoteChar}, ${quoteChar}`\n )}${quoteChar}]`,\n }\n configObject.addPropertyAssignment(newProperty)\n\n return configObject\n }\n\n if (existingProperty.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingProperty.getInitializer()\n\n // If property is an array, append.\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n for (const contentItem of content) {\n const newValue = `${quoteChar}${contentItem}${quoteChar}`\n\n // Check if the array already contains the value.\n if (\n initializer\n .getElements()\n .map((element) => element.getText())\n .includes(newValue)\n ) {\n continue\n }\n\n initializer.addElement(newValue)\n }\n }\n\n return configObject\n }\n\n return configObject\n}\n","import path from \"path\"\nimport { addOptionsSchema } from \"@/src/commands/add\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport fs from \"fs-extra\"\nimport { z } from \"zod\"\n\nexport async function preFlightAdd(options: z.infer<typeof addOptionsSchema>) {\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 config: null,\n }\n }\n\n // Check for existing components.json file.\n if (!fs.existsSync(path.resolve(options.cwd, \"components.json\"))) {\n errors[ERRORS.MISSING_CONFIG] = true\n return {\n errors,\n config: null,\n }\n }\n\n try {\n const config = await getConfig(options.cwd)\n\n return {\n errors,\n config: config!,\n }\n } catch (error) {\n logger.break()\n logger.error(\n `An invalid ${highlighter.info(\n \"components.json\"\n )} file was found at ${highlighter.info(\n options.cwd\n )}.\\nBefore you can add components, you must create a valid ${highlighter.info(\n \"components.json\"\n )} file by running the ${highlighter.info(\"init\")} command.`\n )\n logger.error(\n `Learn more at ${highlighter.info(\n \"https://ui.shadcn.com/docs/components-json\"\n )}.`\n )\n logger.break()\n process.exit(1)\n }\n}\n","import fs from \"fs/promises\"\nimport path from \"path\"\nimport { getRegistryItem } from \"@/src/registry/api\"\nimport { Config } from \"@/src/utils/get-config\"\n\nexport async function updateAppIndex(component: string, config: Config) {\n const indexPath = path.join(config.resolvedPaths.cwd, \"app/page.tsx\")\n\n if (!(await fs.stat(indexPath)).isFile()) {\n return\n }\n\n const registryItem = await getRegistryItem(component, config.style)\n if (\n !registryItem?.meta?.importSpecifier ||\n !registryItem?.meta?.moduleSpecifier\n ) {\n return\n }\n\n // Overwrite the index file with the new import.\n const content = `import { ${registryItem?.meta?.importSpecifier} } from \"${registryItem.meta.moduleSpecifier}\"\\n\\nexport default function Page() {\\n return <${registryItem?.meta?.importSpecifier} />\\n}`\n await fs.writeFile(indexPath, content, \"utf8\")\n}\n","import * as fs from \"fs/promises\"\nimport * as path from \"path\"\nimport { preFlightBuild } from \"@/src/preflights/preflight-build\"\nimport { registryItemSchema, registrySchema } from \"@/src/registry\"\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 { Command } from \"commander\"\nimport { z } from \"zod\"\n\nexport const buildOptionsSchema = z.object({\n cwd: z.string(),\n registryFile: z.string(),\n outputDir: z.string(),\n})\n\nexport const build = new Command()\n .name(\"build\")\n .description(\"build components for a shadcn registry\")\n .argument(\"[registry]\", \"path to registry.json file\", \"./registry.json\")\n .option(\n \"-o, --output <path>\",\n \"destination directory for json files\",\n \"./public/r\"\n )\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async (registry: string, opts) => {\n try {\n const options = buildOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n registryFile: registry,\n outputDir: opts.output,\n })\n\n const { resolvePaths } = await preFlightBuild(options)\n const content = await fs.readFile(resolvePaths.registryFile, \"utf-8\")\n\n const result = registrySchema.safeParse(JSON.parse(content))\n\n if (!result.success) {\n logger.error(\n `Invalid registry file found at ${highlighter.info(\n resolvePaths.registryFile\n )}.`\n )\n process.exit(1)\n }\n\n const buildSpinner = spinner(\"Building registry...\")\n for (const registryItem of result.data.items) {\n if (!registryItem.files) {\n continue\n }\n\n buildSpinner.start(`Building ${registryItem.name}...`)\n\n // Add the schema to the registry item.\n registryItem[\"$schema\"] =\n \"https://ui.shadcn.com/schema/registry-item.json\"\n\n // Loop through each file in the files array.\n for (const file of registryItem.files) {\n file[\"content\"] = await fs.readFile(\n path.resolve(resolvePaths.cwd, file.path),\n \"utf-8\"\n )\n }\n\n // Validate the registry item.\n const result = registryItemSchema.safeParse(registryItem)\n if (!result.success) {\n logger.error(\n `Invalid registry item found for ${highlighter.info(\n registryItem.name\n )}.`\n )\n continue\n }\n\n // Write the registry item to the output directory.\n await fs.writeFile(\n path.resolve(resolvePaths.outputDir, `${result.data.name}.json`),\n JSON.stringify(result.data, null, 2)\n )\n }\n\n buildSpinner.succeed(\"Building registry.\")\n } catch (error) {\n logger.break()\n handleError(error)\n }\n })\n","import path from \"path\"\nimport { buildOptionsSchema } from \"@/src/commands/build\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport fs from \"fs-extra\"\nimport { z } from \"zod\"\n\nexport async function preFlightBuild(\n options: z.infer<typeof buildOptionsSchema>\n) {\n const errors: Record<string, boolean> = {}\n\n const resolvePaths = {\n cwd: options.cwd,\n registryFile: path.resolve(options.cwd, options.registryFile),\n outputDir: path.resolve(options.cwd, options.outputDir),\n }\n\n // Ensure registry file exists.\n if (!fs.existsSync(resolvePaths.registryFile)) {\n errors[ERRORS.BUILD_MISSING_REGISTRY_FILE] = true\n }\n\n // Create output directory if it doesn't exist.\n await fs.mkdir(resolvePaths.outputDir, { recursive: true })\n\n if (Object.keys(errors).length > 0) {\n if (errors[ERRORS.BUILD_MISSING_REGISTRY_FILE]) {\n logger.break()\n logger.error(\n `The path ${highlighter.info(\n resolvePaths.registryFile\n )} does not exist.`\n )\n }\n\n logger.break()\n process.exit(1)\n }\n\n return {\n errors,\n resolvePaths,\n }\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport {\n fetchTree,\n getItemTargetPath,\n getRegistryBaseColor,\n getRegistryIndex,\n} from \"@/src/registry/api\"\nimport { registryIndexSchema } from \"@/src/registry/schema\"\nimport { Config, getConfig } from \"@/src/utils/get-config\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { transform } from \"@/src/utils/transformers\"\nimport { Command } from \"commander\"\nimport { diffLines, type Change } from \"diff\"\nimport { z } from \"zod\"\n\nconst updateOptionsSchema = z.object({\n component: z.string().optional(),\n yes: z.boolean(),\n cwd: z.string(),\n path: z.string().optional(),\n})\n\nexport const diff = new Command()\n .name(\"diff\")\n .description(\"check for updates against the registry\")\n .argument(\"[component]\", \"the component name\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async (name, opts) => {\n try {\n const options = updateOptionsSchema.parse({\n component: name,\n ...opts,\n })\n\n const cwd = path.resolve(options.cwd)\n\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist. Please try again.`)\n process.exit(1)\n }\n\n const config = await getConfig(cwd)\n if (!config) {\n logger.warn(\n `Configuration is missing. Please run ${highlighter.success(\n `init`\n )} to create a components.json file.`\n )\n process.exit(1)\n }\n\n const registryIndex = await getRegistryIndex()\n\n if (!registryIndex) {\n handleError(new Error(\"Failed to fetch registry index.\"))\n process.exit(1)\n }\n\n if (!options.component) {\n const targetDir = config.resolvedPaths.components\n\n // Find all components that exist in the project.\n const projectComponents = registryIndex.filter((item) => {\n for (const file of item.files ?? []) {\n const filePath = path.resolve(\n targetDir,\n typeof file === \"string\" ? file : file.path\n )\n if (existsSync(filePath)) {\n return true\n }\n }\n\n return false\n })\n\n // Check for updates.\n const componentsWithUpdates = []\n for (const component of projectComponents) {\n const changes = await diffComponent(component, config)\n if (changes.length) {\n componentsWithUpdates.push({\n name: component.name,\n changes,\n })\n }\n }\n\n if (!componentsWithUpdates.length) {\n logger.info(\"No updates found.\")\n process.exit(0)\n }\n\n logger.info(\"The following components have updates available:\")\n for (const component of componentsWithUpdates) {\n logger.info(`- ${component.name}`)\n for (const change of component.changes) {\n logger.info(` - ${change.filePath}`)\n }\n }\n logger.break()\n logger.info(\n `Run ${highlighter.success(`diff <component>`)} to see the changes.`\n )\n process.exit(0)\n }\n\n // Show diff for a single component.\n const component = registryIndex.find(\n (item) => item.name === options.component\n )\n\n if (!component) {\n logger.error(\n `The component ${highlighter.success(\n options.component\n )} does not exist.`\n )\n process.exit(1)\n }\n\n const changes = await diffComponent(component, config)\n\n if (!changes.length) {\n logger.info(`No updates found for ${options.component}.`)\n process.exit(0)\n }\n\n for (const change of changes) {\n logger.info(`- ${change.filePath}`)\n await printDiff(change.patch)\n logger.info(\"\")\n }\n } catch (error) {\n handleError(error)\n }\n })\n\nasync function diffComponent(\n component: z.infer<typeof registryIndexSchema>[number],\n config: Config\n) {\n const payload = await fetchTree(config.style, [component])\n const baseColor = await getRegistryBaseColor(config.tailwind.baseColor)\n\n if (!payload) {\n return []\n }\n\n const changes = []\n\n for (const item of payload) {\n const targetDir = await getItemTargetPath(config, item)\n\n if (!targetDir) {\n continue\n }\n\n for (const file of item.files ?? []) {\n const filePath = path.resolve(\n targetDir,\n typeof file === \"string\" ? file : file.path\n )\n\n if (!existsSync(filePath)) {\n continue\n }\n\n const fileContent = await fs.readFile(filePath, \"utf8\")\n\n if (typeof file === \"string\" || !file.content) {\n continue\n }\n\n const registryContent = await transform({\n filename: file.path,\n raw: file.content,\n config,\n baseColor,\n })\n\n const patch = diffLines(registryContent as string, fileContent)\n if (patch.length > 1) {\n changes.push({\n filePath,\n patch,\n })\n }\n }\n }\n\n return changes\n}\n\nasync function printDiff(diff: Change[]) {\n diff.forEach((part) => {\n if (part) {\n if (part.added) {\n return process.stdout.write(highlighter.success(part.value))\n }\n if (part.removed) {\n return process.stdout.write(highlighter.error(part.value))\n }\n\n return process.stdout.write(part.value)\n }\n })\n}\n","import { getConfig } from \"@/src/utils/get-config\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { logger } from \"@/src/utils/logger\"\nimport { Command } from \"commander\"\n\nexport const info = new Command()\n .name(\"info\")\n .description(\"get information about your project\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async (opts) => {\n logger.info(\"> project info\")\n console.log(await getProjectInfo(opts.cwd))\n logger.break()\n logger.info(\"> components.json\")\n console.log(await getConfig(opts.cwd))\n })\n","import path from \"path\"\nimport { migrateIcons } from \"@/src/migrations/migrate-icons\"\nimport { preFlightMigrate } from \"@/src/preflights/preflight-migrate\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { logger } from \"@/src/utils/logger\"\nimport { Command } from \"commander\"\nimport { z } from \"zod\"\n\nexport const migrations = [\n {\n name: \"icons\",\n description: \"migrate your ui components to a different icon library.\",\n },\n] as const\n\nexport const migrateOptionsSchema = z.object({\n cwd: z.string(),\n list: z.boolean(),\n migration: z\n .string()\n .refine(\n (value) =>\n value && migrations.some((migration) => migration.name === value),\n {\n message:\n \"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations.\",\n }\n )\n .optional(),\n})\n\nexport const migrate = new Command()\n .name(\"migrate\")\n .description(\"run a migration.\")\n .argument(\"[migration]\", \"the migration to run.\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"-l, --list\", \"list all migrations.\", false)\n .action(async (migration, opts) => {\n try {\n const options = migrateOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n migration,\n list: opts.list,\n })\n\n if (options.list || !options.migration) {\n logger.info(\"Available migrations:\")\n for (const migration of migrations) {\n logger.info(`- ${migration.name}: ${migration.description}`)\n }\n return\n }\n\n if (!options.migration) {\n throw new Error(\n \"You must specify a migration. Run `shadcn migrate --list` to see available migrations.\"\n )\n }\n\n let { errors, config } = await preFlightMigrate(options)\n\n if (\n errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT] ||\n errors[ERRORS.MISSING_CONFIG]\n ) {\n throw new Error(\n \"No `components.json` file found. Ensure you are at the root of your project.\"\n )\n }\n\n if (!config) {\n throw new Error(\n \"Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.\"\n )\n }\n\n if (options.migration === \"icons\") {\n await migrateIcons(config)\n }\n } catch (error) {\n logger.break()\n handleError(error)\n }\n })\n","import { randomBytes } from \"crypto\"\nimport { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { getRegistryIcons } from \"@/src/registry/api\"\nimport { iconsSchema } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { ICON_LIBRARIES } from \"@/src/utils/icon-libraries\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { updateDependencies } from \"@/src/utils/updaters/update-dependencies\"\nimport fg from \"fast-glob\"\nimport prompts from \"prompts\"\nimport { Project, ScriptKind, SyntaxKind } from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport async function migrateIcons(config: Config) {\n if (!config.resolvedPaths.ui) {\n throw new Error(\n \"We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.\"\n )\n }\n\n const uiPath = config.resolvedPaths.ui\n const [files, registryIcons] = await Promise.all([\n fg(\"**/*.{js,ts,jsx,tsx}\", {\n cwd: uiPath,\n }),\n getRegistryIcons(),\n ])\n\n if (Object.keys(registryIcons).length === 0) {\n throw new Error(\"Something went wrong fetching the registry icons.\")\n }\n\n const libraryChoices = Object.entries(ICON_LIBRARIES).map(\n ([name, iconLibrary]) => ({\n title: iconLibrary.name,\n value: name,\n })\n )\n\n const migrateOptions = await prompts([\n {\n type: \"select\",\n name: \"sourceLibrary\",\n message: `Which icon library would you like to ${highlighter.info(\n \"migrate from\"\n )}?`,\n choices: libraryChoices,\n },\n {\n type: \"select\",\n name: \"targetLibrary\",\n message: `Which icon library would you like to ${highlighter.info(\n \"migrate to\"\n )}?`,\n choices: libraryChoices,\n },\n ])\n\n if (migrateOptions.sourceLibrary === migrateOptions.targetLibrary) {\n throw new Error(\n \"You cannot migrate to the same icon library. Please choose a different icon library.\"\n )\n }\n\n if (\n !(\n migrateOptions.sourceLibrary in ICON_LIBRARIES &&\n migrateOptions.targetLibrary in ICON_LIBRARIES\n )\n ) {\n throw new Error(\"Invalid icon library. Please choose a valid icon library.\")\n }\n\n const sourceLibrary =\n ICON_LIBRARIES[migrateOptions.sourceLibrary as keyof typeof ICON_LIBRARIES]\n const targetLibrary =\n ICON_LIBRARIES[migrateOptions.targetLibrary as keyof typeof ICON_LIBRARIES]\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n initial: true,\n message: `We will migrate ${highlighter.info(\n files.length\n )} files in ${highlighter.info(\n `./${path.relative(config.resolvedPaths.cwd, uiPath)}`\n )} from ${highlighter.info(sourceLibrary.name)} to ${highlighter.info(\n targetLibrary.name\n )}. Continue?`,\n })\n\n if (!confirm) {\n logger.info(\"Migration cancelled.\")\n process.exit(0)\n }\n\n if (targetLibrary.package) {\n await updateDependencies([targetLibrary.package], config, {\n silent: false,\n })\n }\n\n const migrationSpinner = spinner(`Migrating icons...`)?.start()\n\n await Promise.all(\n files.map(async (file) => {\n migrationSpinner.text = `Migrating ${file}...`\n\n const filePath = path.join(uiPath, file)\n const fileContent = await fs.readFile(filePath, \"utf-8\")\n\n const content = await migrateIconsFile(\n fileContent,\n migrateOptions.sourceLibrary,\n migrateOptions.targetLibrary,\n registryIcons\n )\n\n await fs.writeFile(filePath, content)\n })\n )\n\n migrationSpinner.succeed(\"Migration complete.\")\n}\n\nexport async function migrateIconsFile(\n content: string,\n sourceLibrary: keyof typeof ICON_LIBRARIES,\n targetLibrary: keyof typeof ICON_LIBRARIES,\n iconsMapping: z.infer<typeof iconsSchema>\n) {\n const sourceLibraryImport = ICON_LIBRARIES[sourceLibrary]?.import\n const targetLibraryImport = ICON_LIBRARIES[targetLibrary]?.import\n\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const project = new Project({\n compilerOptions: {},\n })\n\n const tempFile = path.join(\n dir,\n `shadcn-icons-${randomBytes(4).toString(\"hex\")}.tsx`\n )\n const sourceFile = project.createSourceFile(tempFile, content, {\n scriptKind: ScriptKind.TSX,\n })\n\n // Find all sourceLibrary imports.\n let targetedIcons: string[] = []\n for (const importDeclaration of sourceFile.getImportDeclarations() ?? []) {\n if (\n importDeclaration.getModuleSpecifier()?.getText() !==\n `\"${sourceLibraryImport}\"`\n ) {\n continue\n }\n\n for (const specifier of importDeclaration.getNamedImports() ?? []) {\n const iconName = specifier.getName()\n\n // TODO: this is O(n^2) but okay for now.\n const targetedIcon = Object.values(iconsMapping).find(\n (icon) => icon[sourceLibrary] === iconName\n )?.[targetLibrary]\n\n if (!targetedIcon || targetedIcons.includes(targetedIcon)) {\n continue\n }\n\n targetedIcons.push(targetedIcon)\n\n // Remove the named import.\n specifier.remove()\n\n // Replace with the targeted icon.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)\n .filter((node) => node.getTagNameNode()?.getText() === iconName)\n .forEach((node) => node.getTagNameNode()?.replaceWithText(targetedIcon))\n }\n\n // If the named import is empty, remove the import declaration.\n if (importDeclaration.getNamedImports()?.length === 0) {\n importDeclaration.remove()\n }\n }\n\n if (targetedIcons.length > 0) {\n sourceFile.addImportDeclaration({\n moduleSpecifier: targetLibraryImport,\n namedImports: targetedIcons.map((icon) => ({\n name: icon,\n })),\n })\n }\n\n return await sourceFile.getText()\n}\n","import path from \"path\"\nimport { addOptionsSchema } from \"@/src/commands/add\"\nimport { migrateOptionsSchema } from \"@/src/commands/migrate\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport fs from \"fs-extra\"\nimport { z } from \"zod\"\n\nexport async function preFlightMigrate(\n options: z.infer<typeof migrateOptionsSchema>\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 config: null,\n }\n }\n\n // Check for existing components.json file.\n if (!fs.existsSync(path.resolve(options.cwd, \"components.json\"))) {\n errors[ERRORS.MISSING_CONFIG] = true\n return {\n errors,\n config: null,\n }\n }\n\n try {\n const config = await getConfig(options.cwd)\n\n return {\n errors,\n config: config!,\n }\n } catch (error) {\n logger.break()\n logger.error(\n `An invalid ${highlighter.info(\n \"components.json\"\n )} file was found at ${highlighter.info(\n options.cwd\n )}.\\nBefore you can run a migration, you must create a valid ${highlighter.info(\n \"components.json\"\n )} file by running the ${highlighter.info(\"init\")} command.`\n )\n logger.error(\n `Learn more at ${highlighter.info(\n \"https://ui.shadcn.com/docs/components-json\"\n )}.`\n )\n logger.break()\n process.exit(1)\n }\n}\n","#!/usr/bin/env node\nimport { add } from \"@/src/commands/add\"\nimport { build } from \"@/src/commands/build\"\nimport { diff } from \"@/src/commands/diff\"\nimport { info } from \"@/src/commands/info\"\nimport { init } from \"@/src/commands/init\"\nimport { migrate } from \"@/src/commands/migrate\"\nimport { Command } from \"commander\"\n\nimport packageJson from \"../package.json\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nasync function main() {\n const program = new Command()\n .name(\"shadcn\")\n .description(\"add components and dependencies to your project\")\n .version(\n packageJson.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program\n .addCommand(init)\n .addCommand(add)\n .addCommand(diff)\n .addCommand(migrate)\n .addCommand(info)\n .addCommand(build)\n\n program.parse()\n}\n\nmain()\n\nexport * from \"./registry/api\"\n","{\n \"name\": \"shadcn\",\n \"version\": \"2.4.1\",\n \"description\": \"Add components to your apps.\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"license\": \"MIT\",\n \"author\": {\n \"name\": \"shadcn\",\n \"url\": \"https://twitter.com/shadcn\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/shadcn/ui.git\",\n \"directory\": \"packages/shadcn\"\n },\n \"files\": [\n \"dist\"\n ],\n \"keywords\": [\n \"components\",\n \"ui\",\n \"tailwind\",\n \"radix-ui\",\n \"shadcn\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./registry\": {\n \"types\": \"./dist/registry/index.d.ts\",\n \"default\": \"./dist/registry/index.js\"\n }\n },\n \"bin\": \"./dist/index.js\",\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rimraf dist && rimraf components\",\n \"start:dev\": \"cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js\",\n \"start:prod\": \"cross-env REGISTRY_URL=https://ui.shadcn.com/r node dist/index.js\",\n \"start\": \"node dist/index.js\",\n \"format:write\": \"prettier --write \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n \"format:check\": \"prettier --check \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n \"release\": \"changeset version\",\n \"pub:beta\": \"pnpm build && pnpm publish --no-git-checks --access public --tag beta\",\n \"pub:next\": \"pnpm build && pnpm publish --no-git-checks --access public --tag next\",\n \"pub:release\": \"pnpm build && pnpm publish --access public\",\n \"test\": \"vitest run\",\n \"test:dev\": \"REGISTRY_URL=http://localhost:3333/r vitest run\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"^23.2.0\",\n \"@babel/core\": \"^7.22.1\",\n \"@babel/parser\": \"^7.22.6\",\n \"@babel/plugin-transform-typescript\": \"^7.22.5\",\n \"commander\": \"^10.0.0\",\n \"cosmiconfig\": \"^8.1.3\",\n \"deepmerge\": \"^4.3.1\",\n \"diff\": \"^5.1.0\",\n \"execa\": \"^7.0.0\",\n \"fast-glob\": \"^3.3.2\",\n \"fs-extra\": \"^11.1.0\",\n \"https-proxy-agent\": \"^6.2.0\",\n \"kleur\": \"^4.1.5\",\n \"msw\": \"^2.7.1\",\n \"node-fetch\": \"^3.3.0\",\n \"ora\": \"^6.1.2\",\n \"postcss\": \"^8.4.24\",\n \"prompts\": \"^2.4.2\",\n \"recast\": \"^0.23.2\",\n \"stringify-object\": \"^5.0.0\",\n \"ts-morph\": \"^18.0.0\",\n \"tsconfig-paths\": \"^4.2.0\",\n \"zod\": \"^3.20.2\"\n },\n \"devDependencies\": {\n \"@types/babel__core\": \"^7.20.1\",\n \"@types/diff\": \"^5.0.3\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"@types/stringify-object\": \"^4.0.5\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^6.6.3\",\n \"type-fest\": \"^3.8.0\",\n \"typescript\": \"^4.9.3\"\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/add.ts","../src/commands/init.ts","../src/preflights/preflight-init.ts","../src/utils/errors.ts","../src/utils/add-components.ts","../src/utils/updaters/update-css.ts","../src/utils/updaters/update-css-vars.ts","../src/utils/get-package-manager.ts","../src/utils/updaters/update-dependencies.ts","../src/utils/updaters/update-files.ts","../src/utils/transformers/index.ts","../src/utils/transformers/transform-css-vars.ts","../src/utils/icon-libraries.ts","../src/utils/transformers/transform-icons.ts","../src/utils/transformers/transform-import.ts","../src/utils/transformers/transform-jsx.ts","../src/utils/transformers/transform-rsc.ts","../src/utils/transformers/transform-tw-prefix.ts","../src/utils/create-project.ts","../src/utils/updaters/update-tailwind-content.ts","../src/preflights/preflight-add.ts","../src/utils/update-app-index.ts","../src/commands/build.ts","../src/preflights/preflight-build.ts","../src/commands/diff.ts","../src/commands/info.ts","../src/commands/migrate.ts","../src/migrations/migrate-icons.ts","../src/preflights/preflight-migrate.ts","../src/index.ts","../package.json"],"names":["path","fs","MISSING_DIR_OR_EMPTY_PROJECT","MISSING_CONFIG","TAILWIND_NOT_CONFIGURED","IMPORT_ALIAS_MISSING","UNSUPPORTED_FRAMEWORK","BUILD_MISSING_REGISTRY_FILE","preFlightInit","options","errors","projectSpinner","spinner","logger","highlighter","frameworkSpinner","projectInfo","getProjectInfo","tailwindSpinnerMessage","tailwindSpinner","tsConfigSpinner","postcss","updateCss","css","config","cssFilepath","cssFilepathRelative","cssSpinner","raw","output","transformCss","input","plugins","updateCssPlugin","root","selector","properties","atRuleMatch","name","params","themeInline","node","keyframesRule","step","stepProps","processRule","utilityAtRule","prop","value","existingDecl","decl","atRule","processAtRule","childSelector","childProps","nestedMatch","nestedName","nestedParams","tempRule","rule","clone","error","parent","nestedSelector","AtRule","z","updateCssVars","cssVars","cssVarsSpinner","transformCssVars","updateCssVarsPlugin","cleanupDefaultNextStylesPlugin","packageInfo","getPackageInfo","addCustomImport","addCustomVariant","updateCssVarsPluginV4","updateThemePlugin","updateTailwindConfigPlugin","updateTailwindConfigAnimationPlugin","updateTailwindConfigKeyframesPlugin","updateBaseLayerPlugin","tailwindVersion","requiredRules","baseLayer","apply","applyRule","key","vars","addOrUpdateVars","removeConflictVars","rootRule","propsToRemove","bodyRule","darkRootRule","ruleNode","newDecl","themeNode","upsertThemeNode","isLocalHSLValue","variables","themeVarNodes","variable","radiusVariables","cssVarNode","isColorValue","propValue","importNodes","variantNode","lastImport","customVariantNode","importNode","tailwindConfig","quote","getQuoteType","pluginNodes","lastPluginNode","plugin","pluginName","pluginNode","existingKeyFrameNodes","keyframeValueSchema","keyframeName","keyframeValue","parsedKeyframeValue","keyframeNode","values","existingAnimationNodes","parsedAnimationValue","animationNode","chunks","chunk","detect","getPackageManager","targetDir","withFallback","packageManager","userAgent","execa","prompts","updateDependencies","dependencies","devDependencies","dependenciesSpinner","flag","isUsingReact19","confirmation","dep","existsSync","tmpdir","basename","SyntaxKind","sourceFile","baseColor","valueWithColorMapping","applyColorMapping","splitClassName","className","parts","rest","alpha","split","variant","PREFIXES","mapping","classNames","lightMode","darkMode","modifier","prefix","needle","ICON_LIBRARIES","SOURCE_LIBRARY","transformIcons","registryIcons","getRegistryIcons","sourceLibrary","targetLibrary","targetedIcons","importDeclaration","specifier","iconName","targetedIcon","iconImportDeclaration","icon","_useSemicolon","transformImport","isRemote","utilsImport","importDeclarations","moduleSpecifier","updateImportAliases","i","alias","transformFromAstSync","parse","transformTypescript","recast","PARSE_OPTIONS","transformJsx","ast","code","result","directiveRegex","transformRsc","first","Project","ScriptKind","transformTwPrefixes","defaultClassNames","applyPrefix","callExpression","arg","prefixed","project","createTempSourceFile","filename","dir","transform","opts","transformers","tempFile","transformer","loadConfig","updateFiles","files","filesCreatedSpinner","getRegistryBaseColor","filesCreated","filesUpdated","filesSkipped","file","filePath","resolveFilePath","findCommonRoot","f","fileName","match","existingFile","content","existingFileContent","normalizedExisting","normalizedNew","getNormalizedFileContent","overwrite","allFiles","updatedFiles","resolveImports","target","resolvePageTarget","resolveFileTargetDirectory","relativePath","resolveNestedFilePath","paths","normalizedPaths","p","normalizedNeedle","needleDir","needleSegments","testPath","normalizedFilePath","normalizedTargetDir","fileSegments","targetSegments","lastTargetSegment","commonDirIndex","segment","framework","filePaths","tsConfig","filepath","resolvedPath","probableImportFilePath","resolveImport","resolvedImportFilePath","resolveModuleByProbablePath","newImport","toAliasedImport","extensions","cwd","relativeFiles","fileSet","extInPath","hasExt","absBase","relBase","tryExts","candidates","e","absCand","relCand","absIdx","relIdx","a","b","aExt","bExt","ord","aStrong","bStrong","abs","matches","aliasKey","rootDir","rel","ext","keepExt","noExt","aliasBase","suffix","addComponents","components","workspaceConfig","getWorkspaceConfig","addWorkspaceComponents","addProjectComponents","registrySpinner","tree","registryResolveItemsTree","handleError","getProjectTailwindVersionFromConfig","updateTailwindConfig","overwriteCssVars","shouldOverwriteCssVars","registryItems","resolveRegistryItems","fetchRegistry","payload","registryItemSchema","registryParentMap","getRegistryParentMap","registryTypeAliasMap","getRegistryTypeAliasMap","rootSpinner","component","registryParent","targetConfig","workspaceRoot","packageRoot","findPackageRoot","os","MONOREPO_TEMPLATE_URL","TEMPLATES","createProject","template","projectName","nextVersion","isRemoteComponent","meta","type","projectPath","createNextProject","createMonorepoProject","createSpinner","args","templatePath","response","tarPath","extractedPath","updateTailwindContent","tailwindFileRelativePath","transformTailwindContent","_createSourceFile","configObject","property","addTailwindConfigContent","quoteChar","_getQuoteChar","existingProperty","newProperty","initializer","contentItem","newValue","element","Command","initOptionsSchema","val","BASE_COLORS","color","init","isUrl","item","getRegistryItem","runInit","newProjectTemplate","preflight","getConfig","projectConfig","getProjectConfig","promptForMinimalConfig","promptForConfig","proceed","componentSpinner","targetPath","fullConfig","resolveConfigPaths","defaultConfig","styles","baseColors","getRegistryStyles","getRegistryBaseColors","style","DEFAULT_TAILWIND_CSS","DEFAULT_TAILWIND_CONFIG","DEFAULT_COMPONENTS","DEFAULT_UTILS","rawConfigSchema","cssVariables","preFlightAdd","updateAppIndex","indexPath","registryItem","DEPRECATED_COMPONENTS","addOptionsSchema","add","itemType","confirm","promptForRegistryComponents","deprecatedComponents","shouldUpdateAppIndex","registryIndex","getRegistryIndex","entry","c","preFlightBuild","resolvePaths","buildOptionsSchema","build","registry","registrySchema","buildSpinner","diffLines","updateOptionsSchema","diff","projectComponents","componentsWithUpdates","changes","diffComponent","change","printDiff","fetchTree","getItemTargetPath","fileContent","registryContent","patch","part","info","randomBytes","fg","migrateIcons","uiPath","libraryChoices","iconLibrary","migrateOptions","migrationSpinner","migrateIconsFile","iconsMapping","sourceLibraryImport","targetLibraryImport","preFlightMigrate","migrations","migrateOptionsSchema","migration","migrate","package_default","main","program"],"mappings":"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","sourcesContent":["import path from \"path\"\nimport { runInit } from \"@/src/commands/init\"\nimport { preFlightAdd } from \"@/src/preflights/preflight-add\"\nimport { getRegistryIndex, getRegistryItem, isUrl } from \"@/src/registry/api\"\nimport { registryItemTypeSchema } from \"@/src/registry/schema\"\nimport { addComponents } from \"@/src/utils/add-components\"\nimport { createProject } from \"@/src/utils/create-project\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { updateAppIndex } from \"@/src/utils/update-app-index\"\nimport { Command } from \"commander\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\n\nconst DEPRECATED_COMPONENTS = [\n {\n name: \"toast\",\n deprecatedBy: \"sonner\",\n message:\n \"The toast component is deprecated. Use the sonner component instead.\",\n },\n {\n name: \"toaster\",\n deprecatedBy: \"sonner\",\n message:\n \"The toaster component is deprecated. Use the sonner component instead.\",\n },\n]\n\nexport const addOptionsSchema = z.object({\n components: z.array(z.string()).optional(),\n yes: z.boolean(),\n overwrite: z.boolean(),\n cwd: z.string(),\n all: z.boolean(),\n path: z.string().optional(),\n silent: z.boolean(),\n srcDir: z.boolean().optional(),\n cssVariables: z.boolean(),\n})\n\nexport const add = new Command()\n .name(\"add\")\n .description(\"add a component to your project\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\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 (components, opts) => {\n try {\n const options = addOptionsSchema.parse({\n components,\n cwd: path.resolve(opts.cwd),\n ...opts,\n })\n\n let itemType: z.infer<typeof registryItemTypeSchema> | undefined\n\n if (components.length > 0 && isUrl(components[0])) {\n const item = await getRegistryItem(components[0], \"\")\n itemType = item?.type\n }\n\n if (\n !options.yes &&\n (itemType === \"registry:style\" || itemType === \"registry:theme\")\n ) {\n logger.break()\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: highlighter.warn(\n `You are about to install a new ${itemType.replace(\n \"registry:\",\n \"\"\n )}. \\nExisting CSS variables and components will be overwritten. Continue?`\n ),\n })\n if (!confirm) {\n logger.break()\n logger.log(`Installation cancelled.`)\n logger.break()\n process.exit(1)\n }\n }\n\n if (!options.components?.length) {\n options.components = await promptForRegistryComponents(options)\n }\n\n const projectInfo = await getProjectInfo(options.cwd)\n if (projectInfo?.tailwindVersion === \"v4\") {\n const deprecatedComponents = DEPRECATED_COMPONENTS.filter((component) =>\n options.components?.includes(component.name)\n )\n\n if (deprecatedComponents?.length) {\n logger.break()\n deprecatedComponents.forEach((component) => {\n logger.warn(highlighter.warn(component.message))\n })\n logger.break()\n process.exit(1)\n }\n }\n\n let { errors, config } = await preFlightAdd(options)\n\n // No components.json file. Prompt the user to run init.\n if (errors[ERRORS.MISSING_CONFIG]) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `You need to create a ${highlighter.info(\n \"components.json\"\n )} file to add components. Proceed?`,\n initial: true,\n })\n\n if (!proceed) {\n logger.break()\n process.exit(1)\n }\n\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: false,\n silent: true,\n isNewProject: false,\n srcDir: options.srcDir,\n cssVariables: options.cssVariables,\n style: \"index\",\n })\n }\n\n let shouldUpdateAppIndex = false\n if (errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT]) {\n const { projectPath, template } = await createProject({\n cwd: options.cwd,\n force: options.overwrite,\n srcDir: options.srcDir,\n components: options.components,\n })\n if (!projectPath) {\n logger.break()\n process.exit(1)\n }\n options.cwd = projectPath\n\n if (template === \"next-monorepo\") {\n options.cwd = path.resolve(options.cwd, \"apps/web\")\n config = await getConfig(options.cwd)\n } else {\n config = await runInit({\n cwd: options.cwd,\n yes: true,\n force: true,\n defaults: false,\n skipPreflight: true,\n silent: true,\n isNewProject: true,\n srcDir: options.srcDir,\n cssVariables: options.cssVariables,\n style: \"index\",\n })\n\n shouldUpdateAppIndex =\n options.components?.length === 1 &&\n !!options.components[0].match(/\\/chat\\/b\\//)\n }\n }\n\n if (!config) {\n throw new Error(\n `Failed to read config at ${highlighter.info(options.cwd)}.`\n )\n }\n\n await addComponents(options.components, config, options)\n\n // If we're adding a single component and it's from the v0 registry,\n // let's update the app/page.tsx file to import the component.\n if (shouldUpdateAppIndex) {\n await updateAppIndex(options.components[0], config)\n }\n } catch (error) {\n logger.break()\n handleError(error)\n }\n })\n\nasync function promptForRegistryComponents(\n options: z.infer<typeof addOptionsSchema>\n) {\n const registryIndex = await getRegistryIndex()\n if (!registryIndex) {\n logger.break()\n handleError(new Error(\"Failed to fetch registry index.\"))\n return []\n }\n\n if (options.all) {\n return registryIndex\n .map((entry) => entry.name)\n .filter(\n (component) => !DEPRECATED_COMPONENTS.some((c) => c.name === component)\n )\n }\n\n if (options.components?.length) {\n return options.components\n }\n\n const { components } = await prompts({\n type: \"multiselect\",\n name: \"components\",\n message: \"Which components would you like to add?\",\n hint: \"Space to select. A to toggle all. Enter to submit.\",\n instructions: false,\n choices: registryIndex\n .filter(\n (entry) =>\n entry.type === \"registry:ui\" &&\n !DEPRECATED_COMPONENTS.some(\n (component) => component.name === entry.name\n )\n )\n .map((entry) => ({\n title: entry.name,\n value: entry.name,\n selected: options.all ? true : options.components?.includes(entry.name),\n })),\n })\n\n if (!components?.length) {\n logger.warn(\"No components selected. Exiting.\")\n logger.info(\"\")\n process.exit(1)\n }\n\n const result = z.array(z.string()).safeParse(components)\n if (!result.success) {\n logger.error(\"\")\n handleError(new Error(\"Something went wrong. Please try again.\"))\n return []\n }\n return result.data\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { preFlightInit } from \"@/src/preflights/preflight-init\"\nimport {\n BASE_COLORS,\n getRegistryBaseColors,\n getRegistryItem,\n getRegistryStyles,\n isUrl,\n} from \"@/src/registry/api\"\nimport { addComponents } from \"@/src/utils/add-components\"\nimport { TEMPLATES, createProject } from \"@/src/utils/create-project\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport {\n DEFAULT_COMPONENTS,\n DEFAULT_TAILWIND_CONFIG,\n DEFAULT_TAILWIND_CSS,\n DEFAULT_UTILS,\n getConfig,\n rawConfigSchema,\n resolveConfigPaths,\n type Config,\n} from \"@/src/utils/get-config\"\nimport {\n getProjectConfig,\n getProjectInfo,\n getProjectTailwindVersionFromConfig,\n} from \"@/src/utils/get-project-info\"\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 { updateTailwindContent } from \"@/src/utils/updaters/update-tailwind-content\"\nimport { Command } from \"commander\"\nimport prompts from \"prompts\"\nimport { z } from \"zod\"\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 style: z.string(),\n})\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project and install dependencies\")\n .argument(\n \"[components...]\",\n \"the components to add or a url to the component.\"\n )\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 .action(async (components, opts) => {\n try {\n const options = initOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n isNewProject: false,\n components,\n style: \"index\",\n ...opts,\n })\n\n // We need to check if we're initializing with a new style.\n // We fetch the payload of the first item.\n // This is okay since the request is cached and deduped.\n if (components.length > 0 && isUrl(components[0])) {\n const item = await getRegistryItem(components[0], \"\")\n\n // Skip base color if style.\n // We set a default and let the style override it.\n if (item?.type === \"registry:style\") {\n options.baseColor = \"neutral\"\n options.style = item.extends ?? \"index\"\n }\n }\n\n await runInit(options)\n\n logger.log(\n `${highlighter.success(\n \"Success!\"\n )} Project initialization completed.\\nYou may now add components.`\n )\n logger.break()\n } catch (error) {\n logger.break()\n handleError(error)\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 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 === \"next-monorepo\") {\n options.cwd = path.resolve(options.cwd, \"apps/web\")\n return await getConfig(options.cwd)\n }\n\n const projectConfig = await getProjectConfig(options.cwd, projectInfo)\n const config = projectConfig\n ? await promptForMinimalConfig(projectConfig, options)\n : await promptForConfig(await getConfig(options.cwd))\n\n if (!options.yes) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `Write configuration to ${highlighter.info(\n \"components.json\"\n )}. Proceed?`,\n initial: true,\n })\n\n if (!proceed) {\n process.exit(0)\n }\n }\n\n // Write components.json.\n const componentSpinner = spinner(`Writing components.json.`).start()\n const targetPath = path.resolve(options.cwd, \"components.json\")\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), \"utf8\")\n componentSpinner.succeed()\n\n // Add components.\n const fullConfig = await resolveConfigPaths(options.cwd, config)\n const components = [\n ...(options.style === \"none\" ? [] : [options.style]),\n ...(options.components ?? []),\n ]\n await addComponents(components, fullConfig, {\n // Init will always overwrite files.\n overwrite: true,\n silent: options.silent,\n style: options.style,\n isNewProject:\n options.isNewProject || projectInfo?.framework.name === \"next-app\",\n })\n\n // If a new project is using src dir, let's update the tailwind content config.\n // TODO: Handle this per framework.\n if (options.isNewProject && options.srcDir) {\n await updateTailwindContent(\n [\"./src/**/*.{js,ts,jsx,tsx,mdx}\"],\n fullConfig,\n {\n silent: options.silent,\n }\n )\n }\n\n return fullConfig\n}\n\nasync function promptForConfig(defaultConfig: Config | null = null) {\n const [styles, baseColors] = await Promise.all([\n getRegistryStyles(),\n getRegistryBaseColors(),\n ])\n\n logger.info(\"\")\n const options = await prompts([\n {\n type: \"toggle\",\n name: \"typescript\",\n message: `Would you like to use ${highlighter.info(\n \"TypeScript\"\n )} (recommended)?`,\n initial: defaultConfig?.tsx ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n {\n type: \"select\",\n name: \"style\",\n message: `Which ${highlighter.info(\"style\")} would you like to use?`,\n choices: styles.map((style) => ({\n title: style.label,\n value: style.name,\n })),\n },\n {\n type: \"select\",\n name: \"tailwindBaseColor\",\n message: `Which color would you like to use as the ${highlighter.info(\n \"base color\"\n )}?`,\n choices: baseColors.map((color) => ({\n title: color.label,\n value: color.name,\n })),\n },\n {\n type: \"text\",\n name: \"tailwindCss\",\n message: `Where is your ${highlighter.info(\"global CSS\")} file?`,\n initial: defaultConfig?.tailwind.css ?? DEFAULT_TAILWIND_CSS,\n },\n {\n type: \"toggle\",\n name: \"tailwindCssVariables\",\n message: `Would you like to use ${highlighter.info(\n \"CSS variables\"\n )} for theming?`,\n initial: defaultConfig?.tailwind.cssVariables ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n {\n type: \"text\",\n name: \"tailwindPrefix\",\n message: `Are you using a custom ${highlighter.info(\n \"tailwind prefix eg. tw-\"\n )}? (Leave blank if not)`,\n initial: \"\",\n },\n {\n type: \"text\",\n name: \"tailwindConfig\",\n message: `Where is your ${highlighter.info(\n \"tailwind.config.js\"\n )} located?`,\n initial: defaultConfig?.tailwind.config ?? DEFAULT_TAILWIND_CONFIG,\n },\n {\n type: \"text\",\n name: \"components\",\n message: `Configure the import alias for ${highlighter.info(\n \"components\"\n )}:`,\n initial: defaultConfig?.aliases[\"components\"] ?? DEFAULT_COMPONENTS,\n },\n {\n type: \"text\",\n name: \"utils\",\n message: `Configure the import alias for ${highlighter.info(\"utils\")}:`,\n initial: defaultConfig?.aliases[\"utils\"] ?? DEFAULT_UTILS,\n },\n {\n type: \"toggle\",\n name: \"rsc\",\n message: `Are you using ${highlighter.info(\"React Server Components\")}?`,\n initial: defaultConfig?.rsc ?? true,\n active: \"yes\",\n inactive: \"no\",\n },\n ])\n\n return rawConfigSchema.parse({\n $schema: \"https://ui.shadcn.com/schema.json\",\n style: options.style,\n tailwind: {\n config: options.tailwindConfig,\n css: options.tailwindCss,\n baseColor: options.tailwindBaseColor,\n cssVariables: options.tailwindCssVariables,\n prefix: options.tailwindPrefix,\n },\n rsc: options.rsc,\n tsx: options.typescript,\n aliases: {\n utils: options.utils,\n components: options.components,\n // TODO: fix this.\n lib: options.components.replace(/\\/components$/, \"lib\"),\n hooks: options.components.replace(/\\/components$/, \"hooks\"),\n },\n })\n}\n\nasync function promptForMinimalConfig(\n defaultConfig: Config,\n opts: z.infer<typeof initOptionsSchema>\n) {\n let style = defaultConfig.style\n let baseColor = opts.baseColor\n let cssVariables = defaultConfig.tailwind.cssVariables\n\n if (!opts.defaults) {\n const [styles, baseColors, tailwindVersion] = await Promise.all([\n getRegistryStyles(),\n getRegistryBaseColors(),\n getProjectTailwindVersionFromConfig(defaultConfig),\n ])\n\n const options = await prompts([\n {\n type: tailwindVersion === \"v4\" ? null : \"select\",\n name: \"style\",\n message: `Which ${highlighter.info(\"style\")} would you like to use?`,\n choices: styles.map((style) => ({\n title:\n style.name === \"new-york\" ? \"New York (Recommended)\" : style.label,\n value: style.name,\n })),\n initial: 0,\n },\n {\n type: opts.baseColor ? null : \"select\",\n name: \"tailwindBaseColor\",\n message: `Which color would you like to use as the ${highlighter.info(\n \"base color\"\n )}?`,\n choices: baseColors.map((color) => ({\n title: color.label,\n value: color.name,\n })),\n },\n ])\n\n style = options.style ?? \"new-york\"\n baseColor = options.tailwindBaseColor ?? baseColor\n cssVariables = opts.cssVariables\n }\n\n return rawConfigSchema.parse({\n $schema: defaultConfig?.$schema,\n style,\n tailwind: {\n ...defaultConfig?.tailwind,\n baseColor,\n cssVariables,\n },\n rsc: defaultConfig?.rsc,\n tsx: defaultConfig?.tsx,\n aliases: defaultConfig?.aliases,\n iconLibrary: defaultConfig?.iconLibrary,\n })\n}\n","import path from \"path\"\nimport { initOptionsSchema } from \"@/src/commands/init\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\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 const projectSpinner = spinner(`Preflight checks.`, {\n silent: options.silent,\n }).start()\n\n if (\n fs.existsSync(path.resolve(options.cwd, \"components.json\")) &&\n !options.force\n ) {\n projectSpinner?.fail()\n logger.break()\n logger.error(\n `A ${highlighter.info(\n \"components.json\"\n )} file already exists at ${highlighter.info(\n options.cwd\n )}.\\nTo start over, remove the ${highlighter.info(\n \"components.json\"\n )} file and run ${highlighter.info(\"init\")} again.`\n )\n logger.break()\n process.exit(1)\n }\n\n projectSpinner?.succeed()\n\n const frameworkSpinner = spinner(`Verifying framework.`, {\n silent: options.silent,\n }).start()\n const projectInfo = await getProjectInfo(options.cwd)\n if (!projectInfo || projectInfo?.framework.name === \"manual\") {\n errors[ERRORS.UNSUPPORTED_FRAMEWORK] = true\n frameworkSpinner?.fail()\n logger.break()\n if (projectInfo?.framework.links.installation) {\n logger.error(\n `We could not detect a supported framework at ${highlighter.info(\n options.cwd\n )}.\\n` +\n `Visit ${highlighter.info(\n projectInfo?.framework.links.installation\n )} to manually configure your project.\\nOnce configured, you can use the cli to add components.`\n )\n }\n logger.break()\n process.exit(1)\n }\n frameworkSpinner?.succeed(\n `Verifying framework. Found ${highlighter.info(\n projectInfo.framework.label\n )}.`\n )\n\n let tailwindSpinnerMessage = \"Validating Tailwind CSS.\"\n\n if (projectInfo.tailwindVersion === \"v4\") {\n tailwindSpinnerMessage = `Validating Tailwind CSS config. Found ${highlighter.info(\n \"v4\"\n )}.`\n }\n\n const tailwindSpinner = spinner(tailwindSpinnerMessage, {\n silent: options.silent,\n }).start()\n if (\n projectInfo.tailwindVersion === \"v3\" &&\n (!projectInfo?.tailwindConfigFile || !projectInfo?.tailwindCssFile)\n ) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true\n tailwindSpinner?.fail()\n } else if (\n projectInfo.tailwindVersion === \"v4\" &&\n !projectInfo?.tailwindCssFile\n ) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true\n tailwindSpinner?.fail()\n } else if (!projectInfo.tailwindVersion) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true\n tailwindSpinner?.fail()\n } else {\n tailwindSpinner?.succeed()\n }\n\n const tsConfigSpinner = spinner(`Validating import alias.`, {\n silent: options.silent,\n }).start()\n if (!projectInfo?.aliasPrefix) {\n errors[ERRORS.IMPORT_ALIAS_MISSING] = true\n tsConfigSpinner?.fail()\n } else {\n tsConfigSpinner?.succeed()\n }\n\n if (Object.keys(errors).length > 0) {\n if (errors[ERRORS.TAILWIND_NOT_CONFIGURED]) {\n logger.break()\n logger.error(\n `No Tailwind CSS configuration found at ${highlighter.info(\n options.cwd\n )}.`\n )\n logger.error(\n `It is likely you do not have Tailwind CSS installed or have an invalid configuration.`\n )\n logger.error(`Install Tailwind CSS then try again.`)\n if (projectInfo?.framework.links.tailwind) {\n logger.error(\n `Visit ${highlighter.info(\n projectInfo?.framework.links.tailwind\n )} to get started.`\n )\n }\n }\n\n if (errors[ERRORS.IMPORT_ALIAS_MISSING]) {\n logger.break()\n logger.error(`No import alias found in your tsconfig.json file.`)\n if (projectInfo?.framework.links.installation) {\n logger.error(\n `Visit ${highlighter.info(\n projectInfo?.framework.links.installation\n )} to learn how to set an import alias.`\n )\n }\n }\n\n logger.break()\n process.exit(1)\n }\n\n return {\n errors,\n projectInfo,\n }\n}\n","export const MISSING_DIR_OR_EMPTY_PROJECT = \"1\"\nexport const EXISTING_CONFIG = \"2\"\nexport const MISSING_CONFIG = \"3\"\nexport const FAILED_CONFIG_READ = \"4\"\nexport const TAILWIND_NOT_CONFIGURED = \"5\"\nexport const IMPORT_ALIAS_MISSING = \"6\"\nexport const UNSUPPORTED_FRAMEWORK = \"7\"\nexport const COMPONENT_URL_NOT_FOUND = \"8\"\nexport const COMPONENT_URL_UNAUTHORIZED = \"9\"\nexport const COMPONENT_URL_FORBIDDEN = \"10\"\nexport const COMPONENT_URL_BAD_REQUEST = \"11\"\nexport const COMPONENT_URL_INTERNAL_SERVER_ERROR = \"12\"\nexport const BUILD_MISSING_REGISTRY_FILE = \"13\"\n","import path from \"path\"\nimport {\n fetchRegistry,\n getRegistryParentMap,\n getRegistryTypeAliasMap,\n registryResolveItemsTree,\n resolveRegistryItems,\n} from \"@/src/registry/api\"\nimport { registryItemSchema } from \"@/src/registry/schema\"\nimport {\n configSchema,\n findCommonRoot,\n findPackageRoot,\n getWorkspaceConfig,\n workspaceConfigSchema,\n type Config,\n} from \"@/src/utils/get-config\"\nimport { getProjectTailwindVersionFromConfig } from \"@/src/utils/get-project-info\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { updateCss } from \"@/src/utils/updaters/update-css\"\nimport { updateCssVars } from \"@/src/utils/updaters/update-css-vars\"\nimport { updateDependencies } from \"@/src/utils/updaters/update-dependencies\"\nimport { updateFiles } from \"@/src/utils/updaters/update-files\"\nimport { updateTailwindConfig } from \"@/src/utils/updaters/update-tailwind-config\"\nimport { z } from \"zod\"\n\nexport async function addComponents(\n components: string[],\n config: Config,\n options: {\n overwrite?: boolean\n silent?: boolean\n isNewProject?: boolean\n style?: string\n }\n) {\n options = {\n overwrite: false,\n silent: false,\n isNewProject: false,\n style: \"index\",\n ...options,\n }\n\n const workspaceConfig = await getWorkspaceConfig(config)\n if (\n workspaceConfig &&\n workspaceConfig.ui &&\n workspaceConfig.ui.resolvedPaths.cwd !== config.resolvedPaths.cwd\n ) {\n return await addWorkspaceComponents(components, config, workspaceConfig, {\n ...options,\n isRemote:\n components?.length === 1 && !!components[0].match(/\\/chat\\/b\\//),\n })\n }\n\n return await addProjectComponents(components, config, options)\n}\n\nasync function addProjectComponents(\n components: string[],\n config: z.infer<typeof configSchema>,\n options: {\n overwrite?: boolean\n silent?: boolean\n isNewProject?: boolean\n style?: string\n }\n) {\n const registrySpinner = spinner(`Checking registry.`, {\n silent: options.silent,\n })?.start()\n const tree = await registryResolveItemsTree(components, config)\n\n if (!tree) {\n registrySpinner?.fail()\n return handleError(new Error(\"Failed to fetch components from registry.\"))\n }\n registrySpinner?.succeed()\n\n const tailwindVersion = await getProjectTailwindVersionFromConfig(config)\n\n await updateTailwindConfig(tree.tailwind?.config, config, {\n silent: options.silent,\n tailwindVersion,\n })\n\n const overwriteCssVars = await shouldOverwriteCssVars(components, config)\n await updateCssVars(tree.cssVars, config, {\n cleanupDefaultNextStyles: options.isNewProject,\n silent: options.silent,\n tailwindVersion,\n tailwindConfig: tree.tailwind?.config,\n overwriteCssVars,\n initIndex: options.style ? options.style === \"index\" : false,\n })\n\n // Add CSS updater\n await updateCss(tree.css, config, {\n silent: options.silent,\n })\n\n await updateDependencies(tree.dependencies, tree.devDependencies, config, {\n silent: options.silent,\n })\n await updateFiles(tree.files, config, {\n overwrite: options.overwrite,\n silent: options.silent,\n })\n\n if (tree.docs) {\n logger.info(tree.docs)\n }\n}\n\nasync function addWorkspaceComponents(\n components: string[],\n config: z.infer<typeof configSchema>,\n workspaceConfig: z.infer<typeof workspaceConfigSchema>,\n options: {\n overwrite?: boolean\n silent?: boolean\n isNewProject?: boolean\n isRemote?: boolean\n style?: string\n }\n) {\n const registrySpinner = spinner(`Checking registry.`, {\n silent: options.silent,\n })?.start()\n let registryItems = await resolveRegistryItems(components, config)\n let result = await fetchRegistry(registryItems)\n const payload = z.array(registryItemSchema).parse(result)\n if (!payload) {\n registrySpinner?.fail()\n return handleError(new Error(\"Failed to fetch components from registry.\"))\n }\n registrySpinner?.succeed()\n\n const registryParentMap = getRegistryParentMap(payload)\n const registryTypeAliasMap = getRegistryTypeAliasMap()\n\n const filesCreated: string[] = []\n const filesUpdated: string[] = []\n const filesSkipped: string[] = []\n\n const rootSpinner = spinner(`Installing components.`)?.start()\n\n for (const component of payload) {\n const alias = registryTypeAliasMap.get(component.type)\n const registryParent = registryParentMap.get(component.name)\n\n // We don't support this type of component.\n if (!alias) {\n continue\n }\n\n // A good start is ui for now.\n // TODO: Add support for other types.\n let targetConfig =\n component.type === \"registry:ui\" || registryParent?.type === \"registry:ui\"\n ? workspaceConfig.ui\n : config\n\n const tailwindVersion = await getProjectTailwindVersionFromConfig(\n targetConfig\n )\n\n const workspaceRoot = findCommonRoot(\n config.resolvedPaths.cwd,\n targetConfig.resolvedPaths.ui\n )\n const packageRoot =\n (await findPackageRoot(workspaceRoot, targetConfig.resolvedPaths.cwd)) ??\n targetConfig.resolvedPaths.cwd\n\n // 1. Update tailwind config.\n if (component.tailwind?.config) {\n await updateTailwindConfig(component.tailwind?.config, targetConfig, {\n silent: true,\n tailwindVersion,\n })\n filesUpdated.push(\n path.relative(workspaceRoot, targetConfig.resolvedPaths.tailwindConfig)\n )\n }\n\n // 2. Update css vars.\n if (component.cssVars) {\n const overwriteCssVars = await shouldOverwriteCssVars(components, config)\n await updateCssVars(component.cssVars, targetConfig, {\n silent: true,\n tailwindVersion,\n tailwindConfig: component.tailwind?.config,\n overwriteCssVars,\n })\n filesUpdated.push(\n path.relative(workspaceRoot, targetConfig.resolvedPaths.tailwindCss)\n )\n }\n\n // 3. Update CSS\n if (component.css) {\n await updateCss(component.css, targetConfig, {\n silent: true,\n })\n filesUpdated.push(\n path.relative(workspaceRoot, targetConfig.resolvedPaths.tailwindCss)\n )\n }\n\n // 4. Update dependencies.\n await updateDependencies(\n component.dependencies,\n component.devDependencies,\n targetConfig,\n {\n silent: true,\n }\n )\n\n // 5. Update files.\n const files = await updateFiles(component.files, targetConfig, {\n overwrite: options.overwrite,\n silent: true,\n rootSpinner,\n isRemote: options.isRemote,\n })\n\n filesCreated.push(\n ...files.filesCreated.map((file) =>\n path.relative(workspaceRoot, path.join(packageRoot, file))\n )\n )\n filesUpdated.push(\n ...files.filesUpdated.map((file) =>\n path.relative(workspaceRoot, path.join(packageRoot, file))\n )\n )\n filesSkipped.push(\n ...files.filesSkipped.map((file) =>\n path.relative(workspaceRoot, path.join(packageRoot, file))\n )\n )\n }\n\n rootSpinner?.succeed()\n\n // Sort files.\n filesCreated.sort()\n filesUpdated.sort()\n filesSkipped.sort()\n\n const hasUpdatedFiles = filesCreated.length || filesUpdated.length\n if (!hasUpdatedFiles && !filesSkipped.length) {\n spinner(`No files updated.`, {\n silent: options.silent,\n })?.info()\n }\n\n if (filesCreated.length) {\n spinner(\n `Created ${filesCreated.length} ${\n filesCreated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.succeed()\n for (const file of filesCreated) {\n logger.log(` - ${file}`)\n }\n }\n\n if (filesUpdated.length) {\n spinner(\n `Updated ${filesUpdated.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n for (const file of filesUpdated) {\n logger.log(` - ${file}`)\n }\n }\n\n if (filesSkipped.length) {\n spinner(\n `Skipped ${filesSkipped.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }: (use --overwrite to overwrite)`,\n {\n silent: options.silent,\n }\n )?.info()\n for (const file of filesSkipped) {\n logger.log(` - ${file}`)\n }\n }\n}\n\nasync function shouldOverwriteCssVars(\n components: z.infer<typeof registryItemSchema>[\"name\"][],\n config: z.infer<typeof configSchema>\n) {\n let registryItems = await resolveRegistryItems(components, config)\n let result = await fetchRegistry(registryItems)\n const payload = z.array(registryItemSchema).parse(result)\n\n return payload.some(\n (component) =>\n component.type === \"registry:theme\" || component.type === \"registry:style\"\n )\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { registryItemCssSchema } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport postcss from \"postcss\"\nimport AtRule from \"postcss/lib/at-rule\"\nimport Declaration from \"postcss/lib/declaration\"\nimport Root from \"postcss/lib/root\"\nimport Rule from \"postcss/lib/rule\"\nimport { z } from \"zod\"\n\nexport async function updateCss(\n css: z.infer<typeof registryItemCssSchema> | undefined,\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n if (\n !config.resolvedPaths.tailwindCss ||\n !css ||\n Object.keys(css).length === 0\n ) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const cssFilepath = config.resolvedPaths.tailwindCss\n const cssFilepathRelative = path.relative(\n config.resolvedPaths.cwd,\n cssFilepath\n )\n const cssSpinner = spinner(\n `Updating ${highlighter.info(cssFilepathRelative)}`,\n {\n silent: options.silent,\n }\n ).start()\n\n const raw = await fs.readFile(cssFilepath, \"utf8\")\n let output = await transformCss(raw, css)\n await fs.writeFile(cssFilepath, output, \"utf8\")\n cssSpinner.succeed()\n}\n\nexport async function transformCss(\n input: string,\n css: z.infer<typeof registryItemCssSchema>\n) {\n const plugins = [updateCssPlugin(css)]\n\n const result = await postcss(plugins).process(input, {\n from: undefined,\n })\n\n let output = result.css\n output = output.replace(/\\/\\* ---break--- \\*\\//g, \"\")\n output = output.replace(/(\\n\\s*\\n)+/g, \"\\n\\n\")\n output = output.trimEnd()\n\n return output\n}\n\nfunction updateCssPlugin(css: z.infer<typeof registryItemCssSchema>) {\n return {\n postcssPlugin: \"update-css\",\n Once(root: Root) {\n for (const [selector, properties] of Object.entries(css)) {\n if (selector.startsWith(\"@\")) {\n // Handle at-rules (@layer, @utility, etc.)\n const atRuleMatch = selector.match(/@([a-zA-Z-]+)\\s*(.*)/)\n if (!atRuleMatch) continue\n\n const [, name, params] = atRuleMatch\n\n // Special handling for keyframes - place them under @theme inline\n if (name === \"keyframes\") {\n let themeInline = root.nodes?.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"theme\" &&\n node.params === \"inline\"\n ) as AtRule | undefined\n\n if (!themeInline) {\n themeInline = postcss.atRule({\n name: \"theme\",\n params: \"inline\",\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(themeInline)\n root.insertBefore(\n themeInline,\n postcss.comment({ text: \"---break---\" })\n )\n }\n\n const keyframesRule = postcss.atRule({\n name: \"keyframes\",\n params,\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n\n themeInline.append(keyframesRule)\n\n if (typeof properties === \"object\") {\n for (const [step, stepProps] of Object.entries(properties)) {\n processRule(keyframesRule, step, stepProps)\n }\n }\n }\n // Special handling for utility classes to preserve property values\n else if (name === \"utility\") {\n const utilityAtRule = root.nodes?.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === name &&\n node.params === params\n ) as AtRule | undefined\n\n if (!utilityAtRule) {\n const atRule = postcss.atRule({\n name,\n params,\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n\n root.append(atRule)\n root.insertBefore(\n atRule,\n postcss.comment({ text: \"---break---\" })\n )\n\n // Add declarations with their values preserved\n if (typeof properties === \"object\") {\n for (const [prop, value] of Object.entries(properties)) {\n if (typeof value === \"string\") {\n const decl = postcss.decl({\n prop,\n value: value,\n raws: { semicolon: true, before: \"\\n \" },\n })\n atRule.append(decl)\n } else if (typeof value === \"object\") {\n processRule(atRule, prop, value)\n }\n }\n }\n } else {\n // Update existing utility class\n if (typeof properties === \"object\") {\n for (const [prop, value] of Object.entries(properties)) {\n if (typeof value === \"string\") {\n const existingDecl = utilityAtRule.nodes?.find(\n (node): node is Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n const decl = postcss.decl({\n prop,\n value: value,\n raws: { semicolon: true, before: \"\\n \" },\n })\n\n existingDecl\n ? existingDecl.replaceWith(decl)\n : utilityAtRule.append(decl)\n } else if (typeof value === \"object\") {\n processRule(utilityAtRule, prop, value)\n }\n }\n }\n }\n } else {\n // Handle other at-rules normally\n processAtRule(root, name, params, properties)\n }\n } else {\n // Handle regular CSS rules\n processRule(root, selector, properties)\n }\n }\n },\n }\n}\n\nfunction processAtRule(\n root: Root | AtRule,\n name: string,\n params: string,\n properties: any\n) {\n // Find or create the at-rule\n let atRule = root.nodes?.find(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === name && node.params === params\n ) as AtRule | undefined\n\n if (!atRule) {\n atRule = postcss.atRule({\n name,\n params,\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(atRule)\n root.insertBefore(atRule, postcss.comment({ text: \"---break---\" }))\n }\n\n // Process children of this at-rule\n if (typeof properties === \"object\") {\n for (const [childSelector, childProps] of Object.entries(properties)) {\n if (childSelector.startsWith(\"@\")) {\n // Nested at-rule\n const nestedMatch = childSelector.match(/@([a-zA-Z-]+)\\s*(.*)/)\n if (nestedMatch) {\n const [, nestedName, nestedParams] = nestedMatch\n processAtRule(atRule, nestedName, nestedParams, childProps)\n }\n } else {\n // CSS rule within at-rule\n processRule(atRule, childSelector, childProps)\n }\n }\n } else if (typeof properties === \"string\") {\n // Direct string content for the at-rule\n try {\n // Parse the CSS string with PostCSS\n const parsed = postcss.parse(`.temp{${properties}}`)\n const tempRule = parsed.first as Rule\n\n if (tempRule && tempRule.nodes) {\n // Create a rule for the at-rule if needed\n const rule = postcss.rule({\n selector: \"temp\",\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n\n // Copy all declarations from the temp rule to our actual rule\n tempRule.nodes.forEach((node) => {\n if (node.type === \"decl\") {\n const clone = node.clone()\n clone.raws.before = \"\\n \"\n rule.append(clone)\n }\n })\n\n // Only add the rule if it has declarations\n if (rule.nodes?.length) {\n atRule.append(rule)\n }\n }\n } catch (error) {\n console.error(\"Error parsing at-rule content:\", properties, error)\n throw error\n }\n }\n}\n\nfunction processRule(parent: Root | AtRule, selector: string, properties: any) {\n let rule = parent.nodes?.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === selector\n ) as Rule | undefined\n\n if (!rule) {\n rule = postcss.rule({\n selector,\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n parent.append(rule)\n }\n\n if (typeof properties === \"object\") {\n for (const [prop, value] of Object.entries(properties)) {\n if (typeof value === \"string\") {\n const decl = postcss.decl({\n prop,\n value: value,\n raws: { semicolon: true, before: \"\\n \" },\n })\n\n // Replace existing property or add new one\n const existingDecl = rule.nodes?.find(\n (node): node is Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n existingDecl ? existingDecl.replaceWith(decl) : rule.append(decl)\n } else if (typeof value === \"object\") {\n // Nested selector (including & selectors)\n const nestedSelector = prop.startsWith(\"&\")\n ? selector.replace(/^([^:]+)/, `$1${prop.substring(1)}`)\n : prop // Use the original selector for other nested elements\n processRule(parent, nestedSelector, value)\n }\n }\n } else if (typeof properties === \"string\") {\n // Direct string content for the rule\n try {\n // Parse the CSS string with PostCSS\n const parsed = postcss.parse(`.temp{${properties}}`)\n const tempRule = parsed.first as Rule\n\n if (tempRule && tempRule.nodes) {\n // Copy all declarations from the temp rule to our actual rule\n tempRule.nodes.forEach((node) => {\n if (node.type === \"decl\") {\n const clone = node.clone()\n clone.raws.before = \"\\n \"\n rule?.append(clone)\n }\n })\n }\n } catch (error) {\n console.error(\"Error parsing rule content:\", selector, properties, error)\n throw error\n }\n }\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport {\n registryItemCssVarsSchema,\n registryItemTailwindSchema,\n} from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport { TailwindVersion } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport postcss from \"postcss\"\nimport AtRule from \"postcss/lib/at-rule\"\nimport Root from \"postcss/lib/root\"\nimport Rule from \"postcss/lib/rule\"\nimport { z } from \"zod\"\n\nexport async function updateCssVars(\n cssVars: z.infer<typeof registryItemCssVarsSchema> | undefined,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n overwriteCssVars?: boolean\n initIndex?: boolean\n silent?: boolean\n tailwindVersion?: TailwindVersion\n tailwindConfig?: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n }\n) {\n if (!config.resolvedPaths.tailwindCss || !Object.keys(cssVars ?? {}).length) {\n return\n }\n\n options = {\n cleanupDefaultNextStyles: false,\n silent: false,\n tailwindVersion: \"v3\",\n overwriteCssVars: false,\n initIndex: true,\n ...options,\n }\n const cssFilepath = config.resolvedPaths.tailwindCss\n const cssFilepathRelative = path.relative(\n config.resolvedPaths.cwd,\n cssFilepath\n )\n const cssVarsSpinner = spinner(\n `Updating CSS variables in ${highlighter.info(cssFilepathRelative)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(cssFilepath, \"utf8\")\n let output = await transformCssVars(raw, cssVars ?? {}, config, {\n cleanupDefaultNextStyles: options.cleanupDefaultNextStyles,\n tailwindVersion: options.tailwindVersion,\n tailwindConfig: options.tailwindConfig,\n overwriteCssVars: options.overwriteCssVars,\n initIndex: options.initIndex,\n })\n await fs.writeFile(cssFilepath, output, \"utf8\")\n cssVarsSpinner.succeed()\n}\n\nexport async function transformCssVars(\n input: string,\n cssVars: z.infer<typeof registryItemCssVarsSchema>,\n config: Config,\n options: {\n cleanupDefaultNextStyles?: boolean\n tailwindVersion?: TailwindVersion\n tailwindConfig?: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n overwriteCssVars?: boolean\n initIndex?: boolean\n } = {\n cleanupDefaultNextStyles: false,\n tailwindVersion: \"v3\",\n tailwindConfig: undefined,\n overwriteCssVars: false,\n initIndex: true,\n }\n) {\n options = {\n cleanupDefaultNextStyles: false,\n tailwindVersion: \"v3\",\n tailwindConfig: undefined,\n overwriteCssVars: false,\n initIndex: true,\n ...options,\n }\n\n let plugins = [updateCssVarsPlugin(cssVars)]\n\n if (options.cleanupDefaultNextStyles) {\n plugins.push(cleanupDefaultNextStylesPlugin())\n }\n\n if (options.tailwindVersion === \"v4\") {\n plugins = []\n\n // Only add tw-animate-css if project does not have tailwindcss-animate\n if (config.resolvedPaths?.cwd) {\n const packageInfo = getPackageInfo(config.resolvedPaths.cwd)\n if (\n !packageInfo?.dependencies?.[\"tailwindcss-animate\"] &&\n !packageInfo?.devDependencies?.[\"tailwindcss-animate\"] &&\n options.initIndex\n ) {\n plugins.push(addCustomImport({ params: \"tw-animate-css\" }))\n }\n }\n\n plugins.push(addCustomVariant({ params: \"dark (&:is(.dark *))\" }))\n\n if (options.cleanupDefaultNextStyles) {\n plugins.push(cleanupDefaultNextStylesPlugin())\n }\n\n plugins.push(\n updateCssVarsPluginV4(cssVars, {\n overwriteCssVars: options.overwriteCssVars,\n })\n )\n plugins.push(updateThemePlugin(cssVars))\n\n if (options.tailwindConfig) {\n plugins.push(updateTailwindConfigPlugin(options.tailwindConfig))\n plugins.push(updateTailwindConfigAnimationPlugin(options.tailwindConfig))\n plugins.push(updateTailwindConfigKeyframesPlugin(options.tailwindConfig))\n }\n }\n\n if (config.tailwind.cssVariables && options.initIndex) {\n plugins.push(\n updateBaseLayerPlugin({ tailwindVersion: options.tailwindVersion })\n )\n }\n\n const result = await postcss(plugins).process(input, {\n from: undefined,\n })\n\n let output = result.css\n\n output = output.replace(/\\/\\* ---break--- \\*\\//g, \"\")\n\n if (options.tailwindVersion === \"v4\") {\n output = output.replace(/(\\n\\s*\\n)+/g, \"\\n\\n\")\n }\n\n return output\n}\n\nfunction updateBaseLayerPlugin({\n tailwindVersion,\n}: {\n tailwindVersion?: TailwindVersion\n}) {\n return {\n postcssPlugin: \"update-base-layer\",\n Once(root: Root) {\n const requiredRules = [\n {\n selector: \"*\",\n apply:\n tailwindVersion === \"v4\"\n ? \"border-border outline-ring/50\"\n : \"border-border\",\n },\n { selector: \"body\", apply: \"bg-background text-foreground\" },\n ]\n\n let baseLayer = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\" &&\n requiredRules.every(({ selector, apply }) =>\n node.nodes?.some(\n (rule): rule is Rule =>\n rule.type === \"rule\" &&\n rule.selector === selector &&\n rule.nodes.some(\n (applyRule): applyRule is AtRule =>\n applyRule.type === \"atrule\" &&\n applyRule.name === \"apply\" &&\n applyRule.params === apply\n )\n )\n )\n ) as AtRule | undefined\n\n if (!baseLayer) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(baseLayer)\n root.insertBefore(baseLayer, postcss.comment({ text: \"---break---\" }))\n }\n\n requiredRules.forEach(({ selector, apply }) => {\n const existingRule = baseLayer?.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" && node.selector === selector\n )\n\n if (!existingRule) {\n baseLayer?.append(\n postcss.rule({\n selector,\n nodes: [\n postcss.atRule({\n name: \"apply\",\n params: apply,\n raws: { semicolon: true, before: \"\\n \" },\n }),\n ],\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n )\n }\n })\n },\n }\n}\n\nfunction updateCssVarsPlugin(\n cssVars: z.infer<typeof registryItemCssVarsSchema>\n) {\n return {\n postcssPlugin: \"update-css-vars\",\n Once(root: Root) {\n let baseLayer = root.nodes.find(\n (node) =>\n node.type === \"atrule\" &&\n node.name === \"layer\" &&\n node.params === \"base\"\n ) as AtRule | undefined\n\n if (!(baseLayer instanceof AtRule)) {\n baseLayer = postcss.atRule({\n name: \"layer\",\n params: \"base\",\n nodes: [],\n raws: {\n semicolon: true,\n before: \"\\n\",\n between: \" \",\n },\n })\n root.append(baseLayer)\n root.insertBefore(baseLayer, postcss.comment({ text: \"---break---\" }))\n }\n\n if (baseLayer !== undefined) {\n // Add variables for each key in cssVars\n Object.entries(cssVars).forEach(([key, vars]) => {\n const selector = key === \"light\" ? \":root\" : `.${key}`\n // TODO: Fix typecheck.\n addOrUpdateVars(baseLayer as AtRule, selector, vars)\n })\n }\n },\n }\n}\n\nfunction removeConflictVars(root: Rule | Root) {\n const rootRule = root.nodes.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === \":root\"\n )\n\n if (rootRule) {\n const propsToRemove = [\"--background\", \"--foreground\"]\n\n rootRule.nodes\n .filter(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && propsToRemove.includes(node.prop)\n )\n .forEach((node) => node.remove())\n\n if (rootRule.nodes.length === 0) {\n rootRule.remove()\n }\n }\n}\n\nfunction cleanupDefaultNextStylesPlugin() {\n return {\n postcssPlugin: \"cleanup-default-next-styles\",\n Once(root: Root) {\n const bodyRule = root.nodes.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === \"body\"\n )\n if (bodyRule) {\n // Remove color from the body node.\n bodyRule.nodes\n .find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" &&\n node.prop === \"color\" &&\n [\"rgb(var(--foreground-rgb))\", \"var(--foreground)\"].includes(\n node.value\n )\n )\n ?.remove()\n\n // Remove background: linear-gradient.\n bodyRule.nodes\n .find((node): node is postcss.Declaration => {\n return (\n node.type === \"decl\" &&\n node.prop === \"background\" &&\n // This is only going to run on create project, so all good.\n (node.value.startsWith(\"linear-gradient\") ||\n node.value === \"var(--background)\")\n )\n })\n ?.remove()\n\n // Remove font-family: Arial, Helvetica, sans-serif;\n bodyRule.nodes\n .find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" &&\n node.prop === \"font-family\" &&\n node.value === \"Arial, Helvetica, sans-serif\"\n )\n ?.remove()\n\n // If the body rule is empty, remove it.\n if (bodyRule.nodes.length === 0) {\n bodyRule.remove()\n }\n }\n\n removeConflictVars(root)\n\n const darkRootRule = root.nodes.find(\n (node): node is Rule =>\n node.type === \"atrule\" &&\n node.params === \"(prefers-color-scheme: dark)\"\n )\n\n if (darkRootRule) {\n removeConflictVars(darkRootRule)\n if (darkRootRule.nodes.length === 0) {\n darkRootRule.remove()\n }\n }\n },\n }\n}\n\nfunction addOrUpdateVars(\n baseLayer: AtRule,\n selector: string,\n vars: Record<string, string>\n) {\n let ruleNode = baseLayer.nodes?.find(\n (node): node is Rule => node.type === \"rule\" && node.selector === selector\n )\n\n if (!ruleNode) {\n if (Object.keys(vars).length > 0) {\n ruleNode = postcss.rule({\n selector,\n raws: { between: \" \", before: \"\\n \" },\n })\n baseLayer.append(ruleNode)\n }\n }\n\n Object.entries(vars).forEach(([key, value]) => {\n const prop = `--${key.replace(/^--/, \"\")}`\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n\n const existingDecl = ruleNode?.nodes.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n existingDecl ? existingDecl.replaceWith(newDecl) : ruleNode?.append(newDecl)\n })\n}\n\nfunction updateCssVarsPluginV4(\n cssVars: z.infer<typeof registryItemCssVarsSchema>,\n options: {\n overwriteCssVars?: boolean\n }\n) {\n return {\n postcssPlugin: \"update-css-vars-v4\",\n Once(root: Root) {\n Object.entries(cssVars).forEach(([key, vars]) => {\n let selector = key === \"light\" ? \":root\" : `.${key}`\n\n if (key === \"theme\") {\n selector = \"@theme\"\n const themeNode = upsertThemeNode(root)\n Object.entries(vars).forEach(([key, value]) => {\n const prop = `--${key.replace(/^--/, \"\")}`\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n\n const existingDecl = themeNode?.nodes?.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n // Only overwrite if overwriteCssVars is true\n // i.e for registry:theme and registry:style\n // We do not want new components to overwrite existing vars.\n // Keep user defined vars.\n if (options.overwriteCssVars) {\n if (existingDecl) {\n existingDecl.replaceWith(newDecl)\n } else {\n themeNode?.append(newDecl)\n }\n } else {\n if (!existingDecl) {\n themeNode?.append(newDecl)\n }\n }\n })\n return\n }\n\n let ruleNode = root.nodes?.find(\n (node): node is Rule =>\n node.type === \"rule\" && node.selector === selector\n )\n\n if (!ruleNode && Object.keys(vars).length > 0) {\n ruleNode = postcss.rule({\n selector,\n nodes: [],\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(ruleNode)\n root.insertBefore(ruleNode, postcss.comment({ text: \"---break---\" }))\n }\n\n Object.entries(vars).forEach(([key, value]) => {\n let prop = `--${key.replace(/^--/, \"\")}`\n\n // Special case for sidebar-background.\n if (prop === \"--sidebar-background\") {\n prop = \"--sidebar\"\n }\n\n if (isLocalHSLValue(value)) {\n value = `hsl(${value})`\n }\n\n const newDecl = postcss.decl({\n prop,\n value,\n raws: { semicolon: true },\n })\n const existingDecl = ruleNode?.nodes.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === prop\n )\n\n // Only overwrite if overwriteCssVars is true\n // i.e for registry:theme and registry:style\n // We do not want new components to overwrite existing vars.\n // Keep user defined vars.\n if (options.overwriteCssVars) {\n if (existingDecl) {\n existingDecl.replaceWith(newDecl)\n } else {\n ruleNode?.append(newDecl)\n }\n } else {\n if (!existingDecl) {\n ruleNode?.append(newDecl)\n }\n }\n })\n })\n },\n }\n}\n\nfunction updateThemePlugin(cssVars: z.infer<typeof registryItemCssVarsSchema>) {\n return {\n postcssPlugin: \"update-theme\",\n Once(root: Root) {\n // Find unique color names from light and dark.\n const variables = Array.from(\n new Set(\n Object.keys(cssVars).flatMap((key) =>\n Object.keys(cssVars[key as keyof typeof cssVars] || {})\n )\n )\n )\n\n if (!variables.length) {\n return\n }\n\n const themeNode = upsertThemeNode(root)\n\n const themeVarNodes = themeNode.nodes?.filter(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop.startsWith(\"--\")\n )\n\n for (const variable of variables) {\n const value = Object.values(cssVars).find((vars) => vars[variable])?.[\n variable\n ]\n\n if (!value) {\n continue\n }\n\n if (variable === \"radius\") {\n const radiusVariables = {\n sm: \"calc(var(--radius) - 4px)\",\n md: \"calc(var(--radius) - 2px)\",\n lg: \"var(--radius)\",\n xl: \"calc(var(--radius) + 4px)\",\n }\n for (const [key, value] of Object.entries(radiusVariables)) {\n const cssVarNode = postcss.decl({\n prop: `--radius-${key}`,\n value,\n raws: { semicolon: true },\n })\n if (\n themeNode?.nodes?.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === cssVarNode.prop\n )\n ) {\n continue\n }\n themeNode?.append(cssVarNode)\n }\n continue\n }\n\n let prop =\n isLocalHSLValue(value) || isColorValue(value)\n ? `--color-${variable.replace(/^--/, \"\")}`\n : `--${variable.replace(/^--/, \"\")}`\n if (prop === \"--color-sidebar-background\") {\n prop = \"--color-sidebar\"\n }\n\n let propValue = `var(--${variable})`\n if (prop === \"--color-sidebar\") {\n propValue = \"var(--sidebar)\"\n }\n\n const cssVarNode = postcss.decl({\n prop,\n value: propValue,\n raws: { semicolon: true },\n })\n const existingDecl = themeNode?.nodes?.find(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop === cssVarNode.prop\n )\n if (!existingDecl) {\n if (themeVarNodes?.length) {\n themeNode?.insertAfter(\n themeVarNodes[themeVarNodes.length - 1],\n cssVarNode\n )\n } else {\n themeNode?.append(cssVarNode)\n }\n }\n }\n },\n }\n}\n\nfunction upsertThemeNode(root: Root): AtRule {\n let themeNode = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" &&\n node.name === \"theme\" &&\n node.params === \"inline\"\n )\n\n if (!themeNode) {\n themeNode = postcss.atRule({\n name: \"theme\",\n params: \"inline\",\n nodes: [],\n raws: { semicolon: true, between: \" \", before: \"\\n\" },\n })\n root.append(themeNode)\n root.insertBefore(themeNode, postcss.comment({ text: \"---break---\" }))\n }\n\n return themeNode\n}\n\nfunction addCustomVariant({ params }: { params: string }) {\n return {\n postcssPlugin: \"add-custom-variant\",\n Once(root: Root) {\n const customVariant = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"custom-variant\"\n )\n\n if (!customVariant) {\n // Find all import nodes\n const importNodes = root.nodes.filter(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"import\"\n )\n\n const variantNode = postcss.atRule({\n name: \"custom-variant\",\n params,\n raws: { semicolon: true, before: \"\\n\" },\n })\n\n if (importNodes.length > 0) {\n // Insert after the last import\n const lastImport = importNodes[importNodes.length - 1]\n root.insertAfter(lastImport, variantNode)\n } else {\n // If no imports, insert after the first node\n root.insertAfter(root.nodes[0], variantNode)\n }\n\n root.insertBefore(variantNode, postcss.comment({ text: \"---break---\" }))\n }\n },\n }\n}\n\nfunction addCustomImport({ params }: { params: string }) {\n return {\n postcssPlugin: \"add-custom-import\",\n Once(root: Root) {\n const importNodes = root.nodes.filter(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"import\"\n )\n\n // Find custom variant node (to ensure we insert before it)\n const customVariantNode = root.nodes.find(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"custom-variant\"\n )\n\n // Check if our specific import already exists\n const hasImport = importNodes.some(\n (node) => node.params.replace(/[\"']/g, \"\") === params\n )\n\n if (!hasImport) {\n const importNode = postcss.atRule({\n name: \"import\",\n params: `\"${params}\"`,\n raws: { semicolon: true, before: \"\\n\" },\n })\n\n if (importNodes.length > 0) {\n // If there are existing imports, add after the last import\n const lastImport = importNodes[importNodes.length - 1]\n root.insertAfter(lastImport, importNode)\n } else if (customVariantNode) {\n // If no imports but has custom-variant, insert before it\n root.insertBefore(customVariantNode, importNode)\n root.insertBefore(\n customVariantNode,\n postcss.comment({ text: \"---break---\" })\n )\n } else {\n // If no imports and no custom-variant, insert at the start\n root.prepend(importNode)\n root.insertAfter(importNode, postcss.comment({ text: \"---break---\" }))\n }\n }\n },\n }\n}\n\nfunction updateTailwindConfigPlugin(\n tailwindConfig: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n) {\n return {\n postcssPlugin: \"update-tailwind-config\",\n Once(root: Root) {\n if (!tailwindConfig?.plugins) {\n return\n }\n\n const quoteType = getQuoteType(root)\n const quote = quoteType === \"single\" ? \"'\" : '\"'\n\n const pluginNodes = root.nodes.filter(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"plugin\"\n )\n\n const lastPluginNode =\n pluginNodes[pluginNodes.length - 1] || root.nodes[0]\n\n for (const plugin of tailwindConfig.plugins) {\n const pluginName = plugin.replace(/^require\\([\"']|[\"']\\)$/g, \"\")\n\n // Check if the plugin is already present.\n if (\n pluginNodes.some((node) => {\n return node.params.replace(/[\"']/g, \"\") === pluginName\n })\n ) {\n continue\n }\n\n const pluginNode = postcss.atRule({\n name: \"plugin\",\n params: `${quote}${pluginName}${quote}`,\n raws: { semicolon: true, before: \"\\n\" },\n })\n root.insertAfter(lastPluginNode, pluginNode)\n root.insertBefore(pluginNode, postcss.comment({ text: \"---break---\" }))\n }\n },\n }\n}\n\nfunction updateTailwindConfigKeyframesPlugin(\n tailwindConfig: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n) {\n return {\n postcssPlugin: \"update-tailwind-config-keyframes\",\n Once(root: Root) {\n if (!tailwindConfig?.theme?.extend?.keyframes) {\n return\n }\n\n const themeNode = upsertThemeNode(root)\n const existingKeyFrameNodes = themeNode.nodes?.filter(\n (node): node is AtRule =>\n node.type === \"atrule\" && node.name === \"keyframes\"\n )\n\n const keyframeValueSchema = z.record(\n z.string(),\n z.record(z.string(), z.string())\n )\n\n for (const [keyframeName, keyframeValue] of Object.entries(\n tailwindConfig.theme.extend.keyframes\n )) {\n if (typeof keyframeName !== \"string\") {\n continue\n }\n\n const parsedKeyframeValue = keyframeValueSchema.safeParse(keyframeValue)\n\n if (!parsedKeyframeValue.success) {\n continue\n }\n\n if (\n existingKeyFrameNodes?.find(\n (node): node is postcss.AtRule =>\n node.type === \"atrule\" &&\n node.name === \"keyframes\" &&\n node.params === keyframeName\n )\n ) {\n continue\n }\n\n const keyframeNode = postcss.atRule({\n name: \"keyframes\",\n params: keyframeName,\n nodes: [],\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n\n for (const [key, values] of Object.entries(parsedKeyframeValue.data)) {\n const rule = postcss.rule({\n selector: key,\n nodes: Object.entries(values).map(([key, value]) =>\n postcss.decl({\n prop: key,\n value,\n raws: { semicolon: true, before: \"\\n \", between: \": \" },\n })\n ),\n raws: { semicolon: true, between: \" \", before: \"\\n \" },\n })\n keyframeNode.append(rule)\n }\n\n themeNode.append(keyframeNode)\n themeNode.insertBefore(\n keyframeNode,\n postcss.comment({ text: \"---break---\" })\n )\n }\n },\n }\n}\n\nfunction updateTailwindConfigAnimationPlugin(\n tailwindConfig: z.infer<typeof registryItemTailwindSchema>[\"config\"]\n) {\n return {\n postcssPlugin: \"update-tailwind-config-animation\",\n Once(root: Root) {\n if (!tailwindConfig?.theme?.extend?.animation) {\n return\n }\n\n const themeNode = upsertThemeNode(root)\n const existingAnimationNodes = themeNode.nodes?.filter(\n (node): node is postcss.Declaration =>\n node.type === \"decl\" && node.prop.startsWith(\"--animate-\")\n )\n\n const parsedAnimationValue = z\n .record(z.string(), z.string())\n .safeParse(tailwindConfig.theme.extend.animation)\n if (!parsedAnimationValue.success) {\n return\n }\n\n for (const [key, value] of Object.entries(parsedAnimationValue.data)) {\n const prop = `--animate-${key}`\n if (\n existingAnimationNodes?.find(\n (node): node is postcss.Declaration => node.prop === prop\n )\n ) {\n continue\n }\n\n const animationNode = postcss.decl({\n prop,\n value,\n raws: { semicolon: true, between: \": \", before: \"\\n \" },\n })\n themeNode.append(animationNode)\n }\n },\n }\n}\n\nfunction getQuoteType(root: Root): \"single\" | \"double\" {\n const firstNode = root.nodes[0]\n const raw = firstNode.toString()\n\n if (raw.includes(\"'\")) {\n return \"single\"\n }\n return \"double\"\n}\n\nexport function isLocalHSLValue(value: string) {\n if (\n value.startsWith(\"hsl\") ||\n value.startsWith(\"rgb\") ||\n value.startsWith(\"#\") ||\n value.startsWith(\"oklch\")\n ) {\n return false\n }\n\n const chunks = value.split(\" \")\n\n return (\n chunks.length === 3 &&\n chunks.slice(1, 3).every((chunk) => chunk.includes(\"%\"))\n )\n}\n\nexport function isColorValue(value: string) {\n return (\n value.startsWith(\"hsl\") ||\n value.startsWith(\"rgb\") ||\n value.startsWith(\"#\") ||\n value.startsWith(\"oklch\")\n )\n}\n","import { detect } from \"@antfu/ni\"\n\nexport async function getPackageManager(\n targetDir: string,\n { withFallback }: { withFallback?: boolean } = {\n withFallback: false,\n }\n): Promise<\"yarn\" | \"pnpm\" | \"bun\" | \"npm\" | \"deno\"> {\n const packageManager = await detect({ programmatic: true, cwd: targetDir })\n\n if (packageManager === \"yarn@berry\") return \"yarn\"\n if (packageManager === \"pnpm@6\") return \"pnpm\"\n if (packageManager === \"bun\") return \"bun\"\n if (packageManager === \"deno\") return \"deno\"\n if (!withFallback) {\n return packageManager ?? \"npm\"\n }\n\n // Fallback to user agent if not detected.\n const userAgent = process.env.npm_config_user_agent || \"\"\n\n if (userAgent.startsWith(\"yarn\")) {\n return \"yarn\"\n }\n\n if (userAgent.startsWith(\"pnpm\")) {\n return \"pnpm\"\n }\n\n if (userAgent.startsWith(\"bun\")) {\n return \"bun\"\n }\n\n return \"npm\"\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd)\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\"\n\n if (packageManager === \"bun\") return \"bunx\"\n\n return \"npx\"\n}\n","import { RegistryItem } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport { getPackageManager } from \"@/src/utils/get-package-manager\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { execa } from \"execa\"\nimport prompts from \"prompts\"\n\nexport async function updateDependencies(\n dependencies: RegistryItem[\"dependencies\"],\n devDependencies: RegistryItem[\"devDependencies\"],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n dependencies = Array.from(new Set(dependencies))\n devDependencies = Array.from(new Set(devDependencies))\n\n if (!dependencies?.length && !devDependencies?.length) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const dependenciesSpinner = spinner(`Installing dependencies.`, {\n silent: options.silent,\n })?.start()\n const packageManager = await getPackageManager(config.resolvedPaths.cwd)\n\n // Offer to use --force or --legacy-peer-deps if using React 19 with npm.\n let flag = \"\"\n if (isUsingReact19(config) && packageManager === \"npm\") {\n if (options.silent) {\n flag = \"force\"\n } else {\n dependenciesSpinner.stopAndPersist()\n logger.warn(\n \"\\nIt looks like you are using React 19. \\nSome packages may fail to install due to peer dependency issues in npm (see https://ui.shadcn.com/react-19).\\n\"\n )\n const confirmation = await prompts([\n {\n type: \"select\",\n name: \"flag\",\n message: \"How would you like to proceed?\",\n choices: [\n { title: \"Use --force\", value: \"force\" },\n { title: \"Use --legacy-peer-deps\", value: \"legacy-peer-deps\" },\n ],\n },\n ])\n\n if (confirmation) {\n flag = confirmation.flag\n }\n }\n }\n\n dependenciesSpinner?.start()\n\n if (dependencies?.length) {\n await execa(\n packageManager,\n [\n packageManager === \"npm\" ? \"install\" : \"add\",\n ...(packageManager === \"npm\" && flag ? [`--${flag}`] : []),\n ...(packageManager === \"deno\"\n ? dependencies.map((dep) => `npm:${dep}`)\n : dependencies),\n ],\n {\n cwd: config.resolvedPaths.cwd,\n }\n )\n }\n\n if (devDependencies?.length) {\n await execa(\n packageManager,\n [\n packageManager === \"npm\" ? \"install\" : \"add\",\n ...(packageManager === \"npm\" && flag ? [`--${flag}`] : []),\n \"-D\",\n ...(packageManager === \"deno\"\n ? devDependencies.map((dep) => `npm:${dep}`)\n : devDependencies),\n ],\n {\n cwd: config.resolvedPaths.cwd,\n }\n )\n }\n\n dependenciesSpinner?.succeed()\n}\n\nfunction isUsingReact19(config: Config) {\n const packageInfo = getPackageInfo(config.resolvedPaths.cwd, false)\n\n if (!packageInfo?.dependencies?.react) {\n return false\n }\n\n return /^(?:\\^|~)?19(?:\\.\\d+)*(?:-.*)?$/.test(packageInfo.dependencies.react)\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path, { basename } from \"path\"\nimport { getRegistryBaseColor } from \"@/src/registry/api\"\nimport { RegistryItem, registryItemFileSchema } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { ProjectInfo, getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { transform } from \"@/src/utils/transformers\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformIcons } from \"@/src/utils/transformers/transform-icons\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { transformTwPrefixes } from \"@/src/utils/transformers/transform-tw-prefix\"\nimport prompts from \"prompts\"\nimport { Project, ScriptKind } from \"ts-morph\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nexport async function updateFiles(\n files: RegistryItem[\"files\"],\n config: Config,\n options: {\n overwrite?: boolean\n force?: boolean\n silent?: boolean\n rootSpinner?: ReturnType<typeof spinner>\n isRemote?: boolean\n }\n) {\n if (!files?.length) {\n return {\n filesCreated: [],\n filesUpdated: [],\n filesSkipped: [],\n }\n }\n options = {\n overwrite: false,\n force: false,\n silent: false,\n isRemote: false,\n ...options,\n }\n const filesCreatedSpinner = spinner(`Updating files.`, {\n silent: options.silent,\n })?.start()\n\n const [projectInfo, baseColor] = await Promise.all([\n getProjectInfo(config.resolvedPaths.cwd),\n getRegistryBaseColor(config.tailwind.baseColor),\n ])\n\n let filesCreated: string[] = []\n let filesUpdated: string[] = []\n let filesSkipped: string[] = []\n\n for (const file of files) {\n if (!file.content) {\n continue\n }\n\n let filePath = resolveFilePath(file, config, {\n isSrcDir: projectInfo?.isSrcDir,\n framework: projectInfo?.framework.name,\n commonRoot: findCommonRoot(\n files.map((f) => f.path),\n file.path\n ),\n })\n\n if (!filePath) {\n continue\n }\n\n const fileName = basename(file.path)\n const targetDir = path.dirname(filePath)\n\n if (!config.tsx) {\n filePath = filePath.replace(/\\.tsx?$/, (match) =>\n match === \".tsx\" ? \".jsx\" : \".js\"\n )\n }\n\n const existingFile = existsSync(filePath)\n\n // Run our transformers.\n const content = await transform(\n {\n filename: file.path,\n raw: file.content,\n config,\n baseColor,\n transformJsx: !config.tsx,\n isRemote: options.isRemote,\n },\n [\n transformImport,\n transformRsc,\n transformCssVars,\n transformTwPrefixes,\n transformIcons,\n ]\n )\n\n // Skip the file if it already exists and the content is the same.\n if (existingFile) {\n const existingFileContent = await fs.readFile(filePath, \"utf-8\")\n const [normalizedExisting, normalizedNew] = await Promise.all([\n getNormalizedFileContent(existingFileContent),\n getNormalizedFileContent(content),\n ])\n if (normalizedExisting === normalizedNew) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n continue\n }\n }\n\n if (existingFile && !options.overwrite) {\n filesCreatedSpinner.stop()\n if (options.rootSpinner) {\n options.rootSpinner.stop()\n }\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `The file ${highlighter.info(\n fileName\n )} already exists. Would you like to overwrite?`,\n initial: false,\n })\n\n if (!overwrite) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n if (options.rootSpinner) {\n options.rootSpinner.start()\n }\n continue\n }\n filesCreatedSpinner?.start()\n if (options.rootSpinner) {\n options.rootSpinner.start()\n }\n }\n\n // Create the target directory if it doesn't exist.\n if (!existsSync(targetDir)) {\n await fs.mkdir(targetDir, { recursive: true })\n }\n\n await fs.writeFile(filePath, content, \"utf-8\")\n existingFile\n ? filesUpdated.push(path.relative(config.resolvedPaths.cwd, filePath))\n : filesCreated.push(path.relative(config.resolvedPaths.cwd, filePath))\n }\n\n const allFiles = [...filesCreated, ...filesUpdated, ...filesSkipped]\n const updatedFiles = await resolveImports(allFiles, config)\n\n // Let's update filesUpdated with the updated files.\n filesUpdated.push(...updatedFiles)\n\n // If a file is in filesCreated and filesUpdated, we should remove it from filesUpdated.\n filesUpdated = filesUpdated.filter((file) => !filesCreated.includes(file))\n\n const hasUpdatedFiles = filesCreated.length || filesUpdated.length\n if (!hasUpdatedFiles && !filesSkipped.length) {\n filesCreatedSpinner?.info(\"No files updated.\")\n }\n\n // Remove duplicates.\n filesCreated = Array.from(new Set(filesCreated))\n filesUpdated = Array.from(new Set(filesUpdated))\n filesSkipped = Array.from(new Set(filesSkipped))\n\n if (filesCreated.length) {\n filesCreatedSpinner?.succeed(\n `Created ${filesCreated.length} ${\n filesCreated.length === 1 ? \"file\" : \"files\"\n }:`\n )\n if (!options.silent) {\n for (const file of filesCreated) {\n logger.log(` - ${file}`)\n }\n }\n } else {\n filesCreatedSpinner?.stop()\n }\n\n if (filesUpdated.length) {\n spinner(\n `Updated ${filesUpdated.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }:`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesUpdated) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (filesSkipped.length) {\n spinner(\n `Skipped ${filesSkipped.length} ${\n filesUpdated.length === 1 ? \"file\" : \"files\"\n }: (files might be identical, use --overwrite to overwrite)`,\n {\n silent: options.silent,\n }\n )?.info()\n if (!options.silent) {\n for (const file of filesSkipped) {\n logger.log(` - ${file}`)\n }\n }\n }\n\n if (!options.silent) {\n logger.break()\n }\n\n return {\n filesCreated,\n filesUpdated,\n filesSkipped,\n }\n}\n\nexport function resolveFilePath(\n file: z.infer<typeof registryItemFileSchema>,\n config: Config,\n options: {\n isSrcDir?: boolean\n commonRoot?: string\n framework?: ProjectInfo[\"framework\"][\"name\"]\n }\n) {\n if (file.target) {\n if (file.target.startsWith(\"~/\")) {\n return path.join(config.resolvedPaths.cwd, file.target.replace(\"~/\", \"\"))\n }\n\n let target = file.target\n\n if (file.type === \"registry:page\") {\n target = resolvePageTarget(target, options.framework)\n if (!target) {\n return \"\"\n }\n }\n\n return options.isSrcDir\n ? path.join(config.resolvedPaths.cwd, \"src\", target.replace(\"src/\", \"\"))\n : path.join(config.resolvedPaths.cwd, target.replace(\"src/\", \"\"))\n }\n\n const targetDir = resolveFileTargetDirectory(file, config)\n\n const relativePath = resolveNestedFilePath(file.path, targetDir)\n return path.join(targetDir, relativePath)\n}\n\nfunction resolveFileTargetDirectory(\n file: z.infer<typeof registryItemFileSchema>,\n config: Config\n) {\n if (file.type === \"registry:ui\") {\n return config.resolvedPaths.ui\n }\n\n if (file.type === \"registry:lib\") {\n return config.resolvedPaths.lib\n }\n\n if (file.type === \"registry:block\" || file.type === \"registry:component\") {\n return config.resolvedPaths.components\n }\n\n if (file.type === \"registry:hook\") {\n return config.resolvedPaths.hooks\n }\n\n return config.resolvedPaths.components\n}\n\nexport function findCommonRoot(paths: string[], needle: string): string {\n // Remove leading slashes for consistent handling\n const normalizedPaths = paths.map((p) => p.replace(/^\\//, \"\"))\n const normalizedNeedle = needle.replace(/^\\//, \"\")\n\n // Get the directory path of the needle by removing the file name\n const needleDir = normalizedNeedle.split(\"/\").slice(0, -1).join(\"/\")\n\n // If needle is at root level, return empty string\n if (!needleDir) {\n return \"\"\n }\n\n // Split the needle directory into segments\n const needleSegments = needleDir.split(\"/\")\n\n // Start from the full path and work backwards\n for (let i = needleSegments.length; i > 0; i--) {\n const testPath = needleSegments.slice(0, i).join(\"/\")\n // Check if this is a common root by verifying if any other paths start with it\n const hasRelatedPaths = normalizedPaths.some(\n (path) => path !== normalizedNeedle && path.startsWith(testPath + \"/\")\n )\n if (hasRelatedPaths) {\n return \"/\" + testPath // Add leading slash back for the result\n }\n }\n\n // If no common root found with other files, return the parent directory of the needle\n return \"/\" + needleDir // Add leading slash back for the result\n}\n\nexport function resolveNestedFilePath(\n filePath: string,\n targetDir: string\n): string {\n // Normalize paths by removing leading/trailing slashes\n const normalizedFilePath = filePath.replace(/^\\/|\\/$/g, \"\")\n const normalizedTargetDir = targetDir.replace(/^\\/|\\/$/g, \"\")\n\n // Split paths into segments\n const fileSegments = normalizedFilePath.split(\"/\")\n const targetSegments = normalizedTargetDir.split(\"/\")\n\n // Find the last matching segment from targetDir in filePath\n const lastTargetSegment = targetSegments[targetSegments.length - 1]\n const commonDirIndex = fileSegments.findIndex(\n (segment) => segment === lastTargetSegment\n )\n\n if (commonDirIndex === -1) {\n // Return just the filename if no common directory is found\n return fileSegments[fileSegments.length - 1]\n }\n\n // Return everything after the common directory\n return fileSegments.slice(commonDirIndex + 1).join(\"/\")\n}\n\nexport async function getNormalizedFileContent(content: string) {\n return content.replace(/\\r\\n/g, \"\\n\").trim()\n}\n\nexport function resolvePageTarget(\n target: string,\n framework?: ProjectInfo[\"framework\"][\"name\"]\n) {\n if (!framework) {\n return \"\"\n }\n\n if (framework === \"next-app\") {\n return target\n }\n\n if (framework === \"next-pages\") {\n let result = target.replace(/^app\\//, \"pages/\")\n result = result.replace(/\\/page(\\.[jt]sx?)$/, \"$1\")\n\n return result\n }\n\n if (framework === \"react-router\") {\n let result = target.replace(/^app\\//, \"app/routes/\")\n result = result.replace(/\\/page(\\.[jt]sx?)$/, \"$1\")\n\n return result\n }\n\n if (framework === \"laravel\") {\n let result = target.replace(/^app\\//, \"resources/js/pages/\")\n result = result.replace(/\\/page(\\.[jt]sx?)$/, \"$1\")\n\n return result\n }\n\n return \"\"\n}\n\nasync function resolveImports(filePaths: string[], config: Config) {\n const project = new Project({\n compilerOptions: {},\n })\n const projectInfo = await getProjectInfo(config.resolvedPaths.cwd)\n const tsConfig = await loadConfig(config.resolvedPaths.cwd)\n const updatedFiles = []\n\n if (!projectInfo || tsConfig.resultType === \"failed\") {\n return []\n }\n\n for (const filepath of filePaths) {\n const resolvedPath = path.resolve(config.resolvedPaths.cwd, filepath)\n\n // Check if the file exists.\n if (!existsSync(resolvedPath)) {\n continue\n }\n\n const content = await fs.readFile(resolvedPath, \"utf-8\")\n\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const sourceFile = project.createSourceFile(\n path.join(dir, basename(resolvedPath)),\n content,\n {\n scriptKind: ScriptKind.TSX,\n }\n )\n\n const importDeclarations = sourceFile.getImportDeclarations()\n for (const importDeclaration of importDeclarations) {\n const moduleSpecifier = importDeclaration.getModuleSpecifierValue()\n\n // Filter out non-local imports.\n if (\n projectInfo?.aliasPrefix &&\n !moduleSpecifier.startsWith(`${projectInfo.aliasPrefix}/`)\n ) {\n continue\n }\n\n // Find the probable import file path.\n // This is where we expect to find the file on disk.\n const probableImportFilePath = await resolveImport(\n moduleSpecifier,\n tsConfig\n )\n\n if (!probableImportFilePath) {\n continue\n }\n\n // Find the actual import file path.\n // This is the path where the file has been installed.\n const resolvedImportFilePath = resolveModuleByProbablePath(\n probableImportFilePath,\n filePaths,\n config\n )\n\n if (!resolvedImportFilePath) {\n continue\n }\n\n // Convert the resolved import file path to an aliased import.\n const newImport = toAliasedImport(\n resolvedImportFilePath,\n config,\n projectInfo\n )\n\n if (!newImport || newImport === moduleSpecifier) {\n continue\n }\n\n importDeclaration.setModuleSpecifier(newImport)\n\n // Write the updated content to the file.\n await fs.writeFile(resolvedPath, sourceFile.getFullText(), \"utf-8\")\n\n // Track the updated file.\n updatedFiles.push(filepath)\n }\n }\n\n return updatedFiles\n}\n\n/**\n * Given an absolute \"probable\" import path (no ext),\n * plus an array of absolute file paths you already know about,\n * return 0–N matches (best match first), and also check disk for any missing ones.\n */\nexport function resolveModuleByProbablePath(\n probableImportFilePath: string,\n files: string[],\n config: Config,\n extensions: string[] = [\".tsx\", \".ts\", \".js\", \".jsx\", \".css\"]\n) {\n const cwd = path.normalize(config.resolvedPaths.cwd)\n\n // 1) Build a set of POSIX-normalized, project-relative files\n const relativeFiles = files.map((f) => f.split(path.sep).join(path.posix.sep))\n const fileSet = new Set(relativeFiles)\n\n // 2) Strip any existing extension off the absolute base path\n const extInPath = path.extname(probableImportFilePath)\n const hasExt = extInPath !== \"\"\n const absBase = hasExt\n ? probableImportFilePath.slice(0, -extInPath.length)\n : probableImportFilePath\n\n // 3) Compute the project-relative \"base\" directory for strong matching\n const relBaseRaw = path.relative(cwd, absBase)\n const relBase = relBaseRaw.split(path.sep).join(path.posix.sep)\n\n // 4) Decide which extensions to try\n const tryExts = hasExt ? [extInPath] : extensions\n\n // 5) Collect candidates\n const candidates = new Set<string>()\n\n // 5a) Fast‑path: [base + ext] and [base/index + ext]\n for (const e of tryExts) {\n const absCand = absBase + e\n const relCand = path.posix.normalize(path.relative(cwd, absCand))\n if (fileSet.has(relCand) || existsSync(absCand)) {\n candidates.add(relCand)\n }\n\n const absIdx = path.join(absBase, `index${e}`)\n const relIdx = path.posix.normalize(path.relative(cwd, absIdx))\n if (fileSet.has(relIdx) || existsSync(absIdx)) {\n candidates.add(relIdx)\n }\n }\n\n // 5b) Fallback: scan known files by basename\n const name = path.basename(absBase)\n for (const f of relativeFiles) {\n if (tryExts.some((e) => f.endsWith(`/${name}${e}`))) {\n candidates.add(f)\n }\n }\n\n // 6) If no matches, bail\n if (candidates.size === 0) return null\n\n // 7) Sort by (1) extension priority, then (2) \"strong\" base match\n const sorted = Array.from(candidates).sort((a, b) => {\n // a) extension order\n const aExt = path.posix.extname(a)\n const bExt = path.posix.extname(b)\n const ord = tryExts.indexOf(aExt) - tryExts.indexOf(bExt)\n if (ord !== 0) return ord\n // b) strong match if path starts with relBase\n const aStrong = relBase && a.startsWith(relBase) ? -1 : 1\n const bStrong = relBase && b.startsWith(relBase) ? -1 : 1\n return aStrong - bStrong\n })\n\n // 8) Return the first (best) candidate\n return sorted[0]\n}\n\nexport function toAliasedImport(\n filePath: string,\n config: Config,\n projectInfo: ProjectInfo\n): string | null {\n const abs = path.normalize(path.join(config.resolvedPaths.cwd, filePath))\n\n // 1️⃣ Find the longest matching alias root in resolvedPaths\n // e.g. key=\"ui\", root=\"/…/components/ui\" beats key=\"components\"\n const matches = Object.entries(config.resolvedPaths)\n .filter(\n ([, root]) => root && abs.startsWith(path.normalize(root + path.sep))\n )\n .sort((a, b) => b[1].length - a[1].length)\n\n if (matches.length === 0) {\n return null\n }\n const [aliasKey, rootDir] = matches[0]\n\n // 2️⃣ Compute the path UNDER that root\n let rel = path.relative(rootDir, abs)\n // force POSIX-style separators\n rel = rel.split(path.sep).join(\"/\") // e.g. \"button/index.tsx\"\n\n // 3️⃣ Strip code-file extensions, keep others (css, json, etc.)\n const ext = path.posix.extname(rel)\n const codeExts = [\".ts\", \".tsx\", \".js\", \".jsx\"]\n const keepExt = codeExts.includes(ext) ? \"\" : ext\n let noExt = rel.slice(0, rel.length - ext.length)\n\n // 4️⃣ Collapse \"/index\" to its directory\n if (noExt.endsWith(\"/index\")) {\n noExt = noExt.slice(0, -\"/index\".length)\n }\n\n // 5️⃣ Build the aliased path\n // config.aliases[aliasKey] is e.g. \"@/components/ui\"\n const aliasBase =\n aliasKey === \"cwd\"\n ? projectInfo.aliasPrefix\n : config.aliases[aliasKey as keyof typeof config.aliases]\n if (!aliasBase) {\n return null\n }\n // if noExt is empty (i.e. file was exactly at the root), we import the root\n let suffix = noExt === \"\" ? \"\" : `/${noExt}`\n\n // Rremove /src from suffix.\n // Alias will handle this.\n suffix = suffix.replace(\"/src\", \"\")\n\n // 6️⃣ Prepend the prefix from projectInfo (e.g. \"@\") if needed\n // but usually config.aliases already include it.\n return `${aliasBase}${suffix}${keepExt}`\n}\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { registryBaseColorSchema } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { transformCssVars } from \"@/src/utils/transformers/transform-css-vars\"\nimport { transformIcons } from \"@/src/utils/transformers/transform-icons\"\nimport { transformImport } from \"@/src/utils/transformers/transform-import\"\nimport { transformJsx } from \"@/src/utils/transformers/transform-jsx\"\nimport { transformRsc } from \"@/src/utils/transformers/transform-rsc\"\nimport { Project, ScriptKind, type SourceFile } from \"ts-morph\"\nimport { z } from \"zod\"\n\nimport { transformTwPrefixes } from \"./transform-tw-prefix\"\n\nexport type TransformOpts = {\n filename: string\n raw: string\n config: Config\n baseColor?: z.infer<typeof registryBaseColorSchema>\n transformJsx?: boolean\n isRemote?: boolean\n}\n\nexport type Transformer<Output = SourceFile> = (\n opts: TransformOpts & {\n sourceFile: SourceFile\n }\n) => Promise<Output>\n\nconst project = new Project({\n compilerOptions: {},\n})\n\nasync function createTempSourceFile(filename: string) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n return path.join(dir, filename)\n}\n\nexport async function transform(\n opts: TransformOpts,\n transformers: Transformer[] = [\n transformImport,\n transformRsc,\n transformCssVars,\n transformTwPrefixes,\n transformIcons,\n ]\n) {\n const tempFile = await createTempSourceFile(opts.filename)\n const sourceFile = project.createSourceFile(tempFile, opts.raw, {\n scriptKind: ScriptKind.TSX,\n })\n\n for (const transformer of transformers) {\n await transformer({ sourceFile, ...opts })\n }\n\n if (opts.transformJsx) {\n return await transformJsx({\n sourceFile,\n ...opts,\n })\n }\n\n return sourceFile.getText()\n}\n","import { registryBaseColorSchema } from \"@/src/registry/schema\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { ScriptKind, SyntaxKind } from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport const transformCssVars: Transformer = async ({\n sourceFile,\n config,\n baseColor,\n}) => {\n // No transform if using css variables.\n if (config.tailwind?.cssVariables || !baseColor?.inlineColors) {\n return sourceFile\n }\n\n // Find jsx attributes with the name className.\n // const openingElements = sourceFile.getDescendantsOfKind(SyntaxKind.JsxElement)\n // console.log(openingElements)\n // const jsxAttributes = sourceFile\n // .getDescendantsOfKind(SyntaxKind.JsxAttribute)\n // .filter((node) => node.getName() === \"className\")\n\n // for (const jsxAttribute of jsxAttributes) {\n // const value = jsxAttribute.getInitializer()?.getText()\n // if (value) {\n // const valueWithColorMapping = applyColorMapping(\n // value.replace(/\"/g, \"\"),\n // baseColor.inlineColors\n // )\n // jsxAttribute.setInitializer(`\"${valueWithColorMapping}\"`)\n // }\n // }\n sourceFile.getDescendantsOfKind(SyntaxKind.StringLiteral).forEach((node) => {\n const value = node.getText()\n if (value) {\n const valueWithColorMapping = applyColorMapping(\n value.replace(/\"/g, \"\"),\n baseColor.inlineColors\n )\n node.replaceWithText(`\"${valueWithColorMapping.trim()}\"`)\n }\n })\n\n return sourceFile\n}\n\n// export default function transformer(file: FileInfo, api: API) {\n// const j = api.jscodeshift.withParser(\"tsx\")\n\n// // Replace bg-background with \"bg-white dark:bg-slate-950\"\n// const $j = j(file.source)\n// return $j\n// .find(j.JSXAttribute, {\n// name: {\n// name: \"className\",\n// },\n// })\n// .forEach((path) => {\n// const { node } = path\n// if (node?.value?.type) {\n// if (node.value.type === \"StringLiteral\") {\n// node.value.value = applyColorMapping(node.value.value)\n// console.log(node.value.value)\n// }\n\n// if (\n// node.value.type === \"JSXExpressionContainer\" &&\n// node.value.expression.type === \"CallExpression\"\n// ) {\n// const callee = node.value.expression.callee\n// if (callee.type === \"Identifier\" && callee.name === \"cn\") {\n// node.value.expression.arguments.forEach((arg) => {\n// if (arg.type === \"StringLiteral\") {\n// arg.value = applyColorMapping(arg.value)\n// }\n\n// if (\n// arg.type === \"LogicalExpression\" &&\n// arg.right.type === \"StringLiteral\"\n// ) {\n// arg.right.value = applyColorMapping(arg.right.value)\n// }\n// })\n// }\n// }\n// }\n// })\n// .toSource()\n// }\n\n// // export function splitClassName(input: string): (string | null)[] {\n// // const parts = input.split(\":\")\n// // const classNames = parts.map((part) => {\n// // const match = part.match(/^\\[?(.+)\\]$/)\n// // if (match) {\n// // return match[1]\n// // } else {\n// // return null\n// // }\n// // })\n\n// // return classNames\n// // }\n\n// Splits a className into variant-name-alpha.\n// eg. hover:bg-primary-100 -> [hover, bg-primary, 100]\nexport function splitClassName(className: string): (string | null)[] {\n if (!className.includes(\"/\") && !className.includes(\":\")) {\n return [null, className, null]\n }\n\n const parts: (string | null)[] = []\n // First we split to find the alpha.\n let [rest, alpha] = className.split(\"/\")\n\n // Check if rest has a colon.\n if (!rest.includes(\":\")) {\n return [null, rest, alpha]\n }\n\n // Next we split the rest by the colon.\n const split = rest.split(\":\")\n\n // We take the last item from the split as the name.\n const name = split.pop()\n\n // We glue back the rest of the split.\n const variant = split.join(\":\")\n\n // Finally we push the variant, name and alpha.\n parts.push(variant ?? null, name ?? null, alpha ?? null)\n\n return parts\n}\n\nconst PREFIXES = [\"bg-\", \"text-\", \"border-\", \"ring-offset-\", \"ring-\"]\n\nexport function applyColorMapping(\n input: string,\n mapping: z.infer<typeof registryBaseColorSchema>[\"inlineColors\"]\n) {\n // Handle border classes.\n if (input.includes(\" border \")) {\n input = input.replace(\" border \", \" border border-border \")\n }\n\n // Build color mappings.\n const classNames = input.split(\" \")\n const lightMode = new Set<string>()\n const darkMode = new Set<string>()\n for (let className of classNames) {\n const [variant, value, modifier] = splitClassName(className)\n const prefix = PREFIXES.find((prefix) => value?.startsWith(prefix))\n if (!prefix) {\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n continue\n }\n\n const needle = value?.replace(prefix, \"\")\n if (needle && needle in mapping.light) {\n lightMode.add(\n [variant, `${prefix}${mapping.light[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n\n darkMode.add(\n [\"dark\", variant, `${prefix}${mapping.dark[needle]}`]\n .filter(Boolean)\n .join(\":\") + (modifier ? `/${modifier}` : \"\")\n )\n continue\n }\n\n if (!lightMode.has(className)) {\n lightMode.add(className)\n }\n }\n\n return [...Array.from(lightMode), ...Array.from(darkMode)].join(\" \").trim()\n}\n","export const ICON_LIBRARIES = {\n lucide: {\n name: \"lucide-react\",\n package: \"lucide-react\",\n import: \"lucide-react\",\n },\n radix: {\n name: \"@radix-ui/react-icons\",\n package: \"@radix-ui/react-icons\",\n import: \"@radix-ui/react-icons\",\n },\n}\n","import { getRegistryIcons } from \"@/src/registry/api\"\nimport { ICON_LIBRARIES } from \"@/src/utils/icon-libraries\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { SourceFile, SyntaxKind } from \"ts-morph\"\n\n// Lucide is the default icon library in the registry.\nconst SOURCE_LIBRARY = \"lucide\"\n\nexport const transformIcons: Transformer = async ({ sourceFile, config }) => {\n // No transform if we cannot read the icon library.\n if (!config.iconLibrary || !(config.iconLibrary in ICON_LIBRARIES)) {\n return sourceFile\n }\n\n const registryIcons = await getRegistryIcons()\n const sourceLibrary = SOURCE_LIBRARY\n const targetLibrary = config.iconLibrary\n\n if (sourceLibrary === targetLibrary) {\n return sourceFile\n }\n\n let targetedIcons: string[] = []\n for (const importDeclaration of sourceFile.getImportDeclarations() ?? []) {\n if (\n importDeclaration.getModuleSpecifier()?.getText() !==\n `\"${ICON_LIBRARIES[SOURCE_LIBRARY].import}\"`\n ) {\n continue\n }\n\n for (const specifier of importDeclaration.getNamedImports() ?? []) {\n const iconName = specifier.getName()\n\n const targetedIcon = registryIcons[iconName]?.[targetLibrary]\n\n if (!targetedIcon || targetedIcons.includes(targetedIcon)) {\n continue\n }\n\n targetedIcons.push(targetedIcon)\n\n // Remove the named import.\n specifier.remove()\n\n // Replace with the targeted icon.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)\n .filter((node) => node.getTagNameNode()?.getText() === iconName)\n .forEach((node) => node.getTagNameNode()?.replaceWithText(targetedIcon))\n }\n\n // If the named import is empty, remove the import declaration.\n if (importDeclaration.getNamedImports()?.length === 0) {\n importDeclaration.remove()\n }\n }\n\n if (targetedIcons.length > 0) {\n const iconImportDeclaration = sourceFile.addImportDeclaration({\n moduleSpecifier:\n ICON_LIBRARIES[targetLibrary as keyof typeof ICON_LIBRARIES]?.import,\n namedImports: targetedIcons.map((icon) => ({\n name: icon,\n })),\n })\n\n if (!_useSemicolon(sourceFile)) {\n iconImportDeclaration.replaceWithText(\n iconImportDeclaration.getText().replace(\";\", \"\")\n )\n }\n }\n\n return sourceFile\n}\n\nfunction _useSemicolon(sourceFile: SourceFile) {\n return (\n sourceFile.getImportDeclarations()?.[0]?.getText().endsWith(\";\") ?? false\n )\n}\n","import { Config } from \"@/src/utils/get-config\"\nimport { Transformer } from \"@/src/utils/transformers\"\n\nexport const transformImport: Transformer = async ({\n sourceFile,\n config,\n isRemote,\n}) => {\n const workspaceAlias = config.aliases?.utils?.split(\"/\")[0]?.slice(1)\n const utilsImport = `@${workspaceAlias}/lib/utils`\n\n const importDeclarations = sourceFile.getImportDeclarations()\n\n for (const importDeclaration of importDeclarations) {\n const moduleSpecifier = updateImportAliases(\n importDeclaration.getModuleSpecifierValue(),\n config,\n isRemote\n )\n\n importDeclaration.setModuleSpecifier(moduleSpecifier)\n\n // Replace `import { cn } from \"@/lib/utils\"`\n if (utilsImport === moduleSpecifier || moduleSpecifier === \"@/lib/utils\") {\n const namedImports = importDeclaration.getNamedImports()\n const cnImport = namedImports.find((i) => i.getName() === \"cn\")\n if (cnImport) {\n importDeclaration.setModuleSpecifier(\n utilsImport === moduleSpecifier\n ? moduleSpecifier.replace(utilsImport, config.aliases.utils)\n : config.aliases.utils\n )\n }\n }\n }\n\n return sourceFile\n}\n\nfunction 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 if (isRemote && moduleSpecifier.startsWith(\"@/\")) {\n moduleSpecifier = moduleSpecifier.replace(/^@\\//, `@/registry/new-york/`)\n }\n\n // Not a registry import.\n if (!moduleSpecifier.startsWith(\"@/registry/\")) {\n // We fix the alias and return.\n const alias = config.aliases.components.split(\"/\")[0]\n return moduleSpecifier.replace(/^@\\//, `${alias}/`)\n }\n\n if (moduleSpecifier.match(/^@\\/registry\\/(.+)\\/ui/)) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/ui/,\n config.aliases.ui ?? `${config.aliases.components}/ui`\n )\n }\n\n if (\n config.aliases.components &&\n moduleSpecifier.match(/^@\\/registry\\/(.+)\\/components/)\n ) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/components/,\n config.aliases.components\n )\n }\n\n if (config.aliases.lib && moduleSpecifier.match(/^@\\/registry\\/(.+)\\/lib/)) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/lib/,\n config.aliases.lib\n )\n }\n\n if (\n config.aliases.hooks &&\n moduleSpecifier.match(/^@\\/registry\\/(.+)\\/hooks/)\n ) {\n return moduleSpecifier.replace(\n /^@\\/registry\\/(.+)\\/hooks/,\n config.aliases.hooks\n )\n }\n\n return moduleSpecifier.replace(\n /^@\\/registry\\/[^/]+/,\n config.aliases.components\n )\n}\n","import { type Transformer } from \"@/src/utils/transformers\"\nimport { transformFromAstSync } from \"@babel/core\"\nimport { ParserOptions, parse } from \"@babel/parser\"\n// @ts-ignore\nimport transformTypescript from \"@babel/plugin-transform-typescript\"\nimport * as recast from \"recast\"\n\n// TODO.\n// I'm using recast for the AST here.\n// Figure out if ts-morph AST is compatible with Babel.\n\n// This is a copy of the babel options from recast/parser.\n// The goal here is to tolerate as much syntax as possible.\n// We want to be able to parse any valid tsx code.\n// See https://github.com/benjamn/recast/blob/master/parsers/_babel_options.ts.\nconst PARSE_OPTIONS: ParserOptions = {\n sourceType: \"module\",\n allowImportExportEverywhere: true,\n allowReturnOutsideFunction: true,\n startLine: 1,\n tokens: true,\n plugins: [\n \"asyncGenerators\",\n \"bigInt\",\n \"classPrivateMethods\",\n \"classPrivateProperties\",\n \"classProperties\",\n \"classStaticBlock\",\n \"decimal\",\n \"decorators-legacy\",\n \"doExpressions\",\n \"dynamicImport\",\n \"exportDefaultFrom\",\n \"exportNamespaceFrom\",\n \"functionBind\",\n \"functionSent\",\n \"importAssertions\",\n \"importMeta\",\n \"nullishCoalescingOperator\",\n \"numericSeparator\",\n \"objectRestSpread\",\n \"optionalCatchBinding\",\n \"optionalChaining\",\n [\n \"pipelineOperator\",\n {\n proposal: \"minimal\",\n },\n ],\n [\n \"recordAndTuple\",\n {\n syntaxType: \"hash\",\n },\n ],\n \"throwExpressions\",\n \"topLevelAwait\",\n \"v8intrinsic\",\n \"typescript\",\n \"jsx\",\n ],\n}\n\nexport const transformJsx: Transformer<string> = async ({\n sourceFile,\n config,\n}) => {\n const output = sourceFile.getFullText()\n\n if (config.tsx) {\n return output\n }\n\n const ast = recast.parse(output, {\n parser: {\n parse: (code: string) => {\n return parse(code, PARSE_OPTIONS)\n },\n },\n })\n\n const result = transformFromAstSync(ast, output, {\n cloneInputAst: false,\n code: false,\n ast: true,\n plugins: [transformTypescript],\n configFile: false,\n })\n\n if (!result || !result.ast) {\n throw new Error(\"Failed to transform JSX\")\n }\n\n return recast.print(result.ast).code\n}\n","import { Transformer } from \"@/src/utils/transformers\"\nimport { SyntaxKind } from \"ts-morph\"\n\nconst directiveRegex = /^[\"']use client[\"']$/g\n\nexport const transformRsc: Transformer = async ({ sourceFile, config }) => {\n if (config.rsc) {\n return sourceFile\n }\n\n // Remove \"use client\" from the top of the file.\n const first = sourceFile.getFirstChildByKind(SyntaxKind.ExpressionStatement)\n if (first && directiveRegex.test(first.getText())) {\n first.remove()\n }\n\n return sourceFile\n}\n","import { Transformer } from \"@/src/utils/transformers\"\nimport { SyntaxKind } from \"ts-morph\"\n\nimport { splitClassName } from \"./transform-css-vars\"\n\nexport const transformTwPrefixes: Transformer = async ({\n sourceFile,\n config,\n}) => {\n if (!config.tailwind?.prefix) {\n return sourceFile\n }\n\n // Find the cva function calls.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.CallExpression)\n .filter((node) => node.getExpression().getText() === \"cva\")\n .forEach((node) => {\n // cva(base, ...)\n if (node.getArguments()[0]?.isKind(SyntaxKind.StringLiteral)) {\n const defaultClassNames = node.getArguments()[0]\n if (defaultClassNames) {\n defaultClassNames.replaceWithText(\n `\"${applyPrefix(\n defaultClassNames.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n\n // cva(..., { variants: { ... } })\n if (node.getArguments()[1]?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n node\n .getArguments()[1]\n ?.getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .find((node) => node.getName() === \"variants\")\n ?.getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n node\n .getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n const classNames = node.getInitializerIfKind(\n SyntaxKind.StringLiteral\n )\n if (classNames) {\n classNames?.replaceWithText(\n `\"${applyPrefix(\n classNames.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n })\n }\n })\n\n // Find all jsx attributes with the name className.\n sourceFile.getDescendantsOfKind(SyntaxKind.JsxAttribute).forEach((node) => {\n if (node.getName() === \"className\") {\n // className=\"...\"\n if (node.getInitializer()?.isKind(SyntaxKind.StringLiteral)) {\n const value = node.getInitializer()\n if (value) {\n value.replaceWithText(\n `\"${applyPrefix(\n value.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n\n // className={...}\n if (node.getInitializer()?.isKind(SyntaxKind.JsxExpression)) {\n // Check if it's a call to cn().\n const callExpression = node\n .getInitializer()\n ?.getDescendantsOfKind(SyntaxKind.CallExpression)\n .find((node) => node.getExpression().getText() === \"cn\")\n if (callExpression) {\n // Loop through the arguments.\n callExpression.getArguments().forEach((node) => {\n if (\n node.isKind(SyntaxKind.ConditionalExpression) ||\n node.isKind(SyntaxKind.BinaryExpression)\n ) {\n node\n .getChildrenOfKind(SyntaxKind.StringLiteral)\n .forEach((node) => {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n })\n }\n\n if (node.isKind(SyntaxKind.StringLiteral)) {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n }\n }\n }\n\n // classNames={...}\n if (node.getName() === \"classNames\") {\n if (node.getInitializer()?.isKind(SyntaxKind.JsxExpression)) {\n node\n .getDescendantsOfKind(SyntaxKind.PropertyAssignment)\n .forEach((node) => {\n if (node.getInitializer()?.isKind(SyntaxKind.CallExpression)) {\n const callExpression = node.getInitializerIfKind(\n SyntaxKind.CallExpression\n )\n if (callExpression) {\n // Loop through the arguments.\n callExpression.getArguments().forEach((arg) => {\n if (arg.isKind(SyntaxKind.ConditionalExpression)) {\n arg\n .getChildrenOfKind(SyntaxKind.StringLiteral)\n .forEach((node) => {\n node.replaceWithText(\n `\"${applyPrefix(\n node.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n })\n }\n\n if (arg.isKind(SyntaxKind.StringLiteral)) {\n arg.replaceWithText(\n `\"${applyPrefix(\n arg.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n })\n }\n }\n\n if (node.getInitializer()?.isKind(SyntaxKind.StringLiteral)) {\n if (node.getName() !== \"variant\") {\n const classNames = node.getInitializer()\n if (classNames) {\n classNames.replaceWithText(\n `\"${applyPrefix(\n classNames.getText()?.replace(/\"|'/g, \"\"),\n config.tailwind.prefix\n )}\"`\n )\n }\n }\n }\n })\n }\n }\n })\n\n return sourceFile\n}\n\nexport function applyPrefix(input: string, prefix: string = \"\") {\n const classNames = input.split(\" \")\n const prefixed: string[] = []\n for (let className of classNames) {\n const [variant, value, modifier] = splitClassName(className)\n if (variant) {\n modifier\n ? prefixed.push(`${variant}:${prefix}${value}/${modifier}`)\n : prefixed.push(`${variant}:${prefix}${value}`)\n } else {\n modifier\n ? prefixed.push(`${prefix}${value}/${modifier}`)\n : prefixed.push(`${prefix}${value}`)\n }\n }\n return prefixed.join(\" \")\n}\n\nexport function applyPrefixesCss(css: string, prefix: string) {\n const lines = css.split(\"\\n\")\n for (let line of lines) {\n if (line.includes(\"@apply\")) {\n const originalTWCls = line.replace(\"@apply\", \"\").trim()\n const prefixedTwCls = applyPrefix(originalTWCls, prefix)\n css = css.replace(originalTWCls, prefixedTwCls)\n }\n }\n return css\n}\n","import os from \"os\"\nimport path from \"path\"\nimport { initOptionsSchema } from \"@/src/commands/init\"\nimport { fetchRegistry } from \"@/src/registry/api\"\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\nconst MONOREPO_TEMPLATE_URL =\n \"https://codeload.github.com/shadcn-ui/ui/tar.gz/main\"\n\nexport const TEMPLATES = {\n next: \"next\",\n \"next-monorepo\": \"next-monorepo\",\n} as const\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 : \"next\"\n let projectName: string =\n template === TEMPLATES.next ? \"my-app\" : \"my-monorepo\"\n let nextVersion = \"latest\"\n\n const isRemoteComponent =\n options.components?.length === 1 &&\n !!options.components[0].match(/\\/chat\\/b\\//)\n\n if (options.components && isRemoteComponent) {\n try {\n const [result] = await fetchRegistry(options.components)\n const { meta } = z\n .object({\n meta: z.object({\n nextVersion: z.string(),\n }),\n })\n .parse(result)\n nextVersion = meta.nextVersion\n\n // Force template to next for remote components.\n template = TEMPLATES.next\n } catch (error) {\n logger.break()\n handleError(error)\n }\n }\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: \"Next.js\", value: \"next\" },\n { title: \"Next.js (Monorepo)\", value: \"next-monorepo\" },\n ],\n initial: 0,\n },\n {\n type: \"text\",\n name: \"name\",\n message: \"What is your project named?\",\n initial: projectName,\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 if (template === TEMPLATES.next) {\n await createNextProject(projectPath, {\n version: nextVersion,\n cwd: options.cwd,\n packageManager,\n srcDir: !!options.srcDir,\n })\n }\n\n if (template === TEMPLATES[\"next-monorepo\"]) {\n await createMonorepoProject(projectPath, {\n packageManager,\n })\n }\n\n return {\n projectPath,\n projectName,\n template,\n }\n}\n\nasync function createNextProject(\n projectPath: string,\n options: {\n version: string\n cwd: string\n packageManager: string\n srcDir: boolean\n }\n) {\n const createSpinner = spinner(\n `Creating a new Next.js project. This may take a few minutes.`\n ).start()\n\n // Note: pnpm fails here. Fallback to npx with --use-PACKAGE-MANAGER.\n const args = [\n \"--tailwind\",\n \"--eslint\",\n \"--typescript\",\n \"--app\",\n options.srcDir ? \"--src-dir\" : \"--no-src-dir\",\n \"--no-import-alias\",\n `--use-${options.packageManager}`,\n ]\n\n if (\n options.version.startsWith(\"15\") ||\n options.version.startsWith(\"latest\") ||\n options.version.startsWith(\"canary\")\n ) {\n args.push(\"--turbopack\")\n }\n\n try {\n await execa(\n \"npx\",\n [`create-next-app@${options.version}`, projectPath, \"--silent\", ...args],\n {\n cwd: options.cwd,\n }\n )\n } catch (error) {\n logger.break()\n logger.error(\n `Something went wrong creating a new Next.js project. Please try again.`\n )\n process.exit(1)\n }\n\n createSpinner?.succeed(\"Creating a new Next.js project.\")\n}\n\nasync function createMonorepoProject(\n projectPath: string,\n options: {\n packageManager: string\n }\n) {\n const createSpinner = spinner(\n `Creating a new Next.js monorepo. This may take a few minutes.`\n ).start()\n\n try {\n // Get the template.\n const templatePath = path.join(os.tmpdir(), `shadcn-template-${Date.now()}`)\n await fs.ensureDir(templatePath)\n const response = await fetch(MONOREPO_TEMPLATE_URL)\n if (!response.ok) {\n throw new Error(`Failed to download template: ${response.statusText}`)\n }\n\n // Write the tar file\n const tarPath = path.resolve(templatePath, \"template.tar.gz\")\n await fs.writeFile(tarPath, Buffer.from(await response.arrayBuffer()))\n await execa(\"tar\", [\n \"-xzf\",\n tarPath,\n \"-C\",\n templatePath,\n \"--strip-components=2\",\n \"ui-main/templates/monorepo-next\",\n ])\n const extractedPath = path.resolve(templatePath, \"monorepo-next\")\n await fs.move(extractedPath, projectPath)\n await fs.remove(templatePath)\n\n // Run install.\n await execa(options.packageManager, [\"install\"], {\n cwd: projectPath,\n })\n\n // Try git init.\n const cwd = process.cwd()\n await execa(\"git\", [\"--version\"], { cwd: projectPath })\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 await execa(\"cd\", [cwd])\n\n createSpinner?.succeed(\"Creating a new Next.js monorepo.\")\n } catch (error) {\n createSpinner?.fail(\"Something went wrong creating a new Next.js monorepo.\")\n handleError(error)\n }\n}\n","import { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport {\n _createSourceFile,\n _getQuoteChar,\n} from \"@/src/utils/updaters/update-tailwind-config\"\nimport { ObjectLiteralExpression, SyntaxKind } from \"ts-morph\"\n\nexport async function updateTailwindContent(\n content: string[],\n config: Config,\n options: {\n silent?: boolean\n }\n) {\n if (!content) {\n return\n }\n\n options = {\n silent: false,\n ...options,\n }\n\n const tailwindFileRelativePath = path.relative(\n config.resolvedPaths.cwd,\n config.resolvedPaths.tailwindConfig\n )\n const tailwindSpinner = spinner(\n `Updating ${highlighter.info(tailwindFileRelativePath)}`,\n {\n silent: options.silent,\n }\n ).start()\n const raw = await fs.readFile(config.resolvedPaths.tailwindConfig, \"utf8\")\n const output = await transformTailwindContent(raw, content, config)\n await fs.writeFile(config.resolvedPaths.tailwindConfig, output, \"utf8\")\n tailwindSpinner?.succeed()\n}\n\nexport async function transformTailwindContent(\n input: string,\n content: string[],\n config: Config\n) {\n const sourceFile = await _createSourceFile(input, config)\n // Find the object with content property.\n // This is faster than traversing the default export.\n // TODO: maybe we do need to traverse the default export?\n const configObject = sourceFile\n .getDescendantsOfKind(SyntaxKind.ObjectLiteralExpression)\n .find((node) =>\n node\n .getProperties()\n .some(\n (property) =>\n property.isKind(SyntaxKind.PropertyAssignment) &&\n property.getName() === \"content\"\n )\n )\n\n // We couldn't find the config object, so we return the input as is.\n if (!configObject) {\n return input\n }\n\n addTailwindConfigContent(configObject, content)\n\n return sourceFile.getFullText()\n}\n\nasync function addTailwindConfigContent(\n configObject: ObjectLiteralExpression,\n content: string[]\n) {\n const quoteChar = _getQuoteChar(configObject)\n\n const existingProperty = configObject.getProperty(\"content\")\n\n if (!existingProperty) {\n const newProperty = {\n name: \"content\",\n initializer: `[${quoteChar}${content.join(\n `${quoteChar}, ${quoteChar}`\n )}${quoteChar}]`,\n }\n configObject.addPropertyAssignment(newProperty)\n\n return configObject\n }\n\n if (existingProperty.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingProperty.getInitializer()\n\n // If property is an array, append.\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n for (const contentItem of content) {\n const newValue = `${quoteChar}${contentItem}${quoteChar}`\n\n // Check if the array already contains the value.\n if (\n initializer\n .getElements()\n .map((element) => element.getText())\n .includes(newValue)\n ) {\n continue\n }\n\n initializer.addElement(newValue)\n }\n }\n\n return configObject\n }\n\n return configObject\n}\n","import path from \"path\"\nimport { addOptionsSchema } from \"@/src/commands/add\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport fs from \"fs-extra\"\nimport { z } from \"zod\"\n\nexport async function preFlightAdd(options: z.infer<typeof addOptionsSchema>) {\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 config: null,\n }\n }\n\n // Check for existing components.json file.\n if (!fs.existsSync(path.resolve(options.cwd, \"components.json\"))) {\n errors[ERRORS.MISSING_CONFIG] = true\n return {\n errors,\n config: null,\n }\n }\n\n try {\n const config = await getConfig(options.cwd)\n\n return {\n errors,\n config: config!,\n }\n } catch (error) {\n logger.break()\n logger.error(\n `An invalid ${highlighter.info(\n \"components.json\"\n )} file was found at ${highlighter.info(\n options.cwd\n )}.\\nBefore you can add components, you must create a valid ${highlighter.info(\n \"components.json\"\n )} file by running the ${highlighter.info(\"init\")} command.`\n )\n logger.error(\n `Learn more at ${highlighter.info(\n \"https://ui.shadcn.com/docs/components-json\"\n )}.`\n )\n logger.break()\n process.exit(1)\n }\n}\n","import fs from \"fs/promises\"\nimport path from \"path\"\nimport { getRegistryItem } from \"@/src/registry/api\"\nimport { Config } from \"@/src/utils/get-config\"\n\nexport async function updateAppIndex(component: string, config: Config) {\n const indexPath = path.join(config.resolvedPaths.cwd, \"app/page.tsx\")\n\n if (!(await fs.stat(indexPath)).isFile()) {\n return\n }\n\n const registryItem = await getRegistryItem(component, config.style)\n if (\n !registryItem?.meta?.importSpecifier ||\n !registryItem?.meta?.moduleSpecifier\n ) {\n return\n }\n\n // Overwrite the index file with the new import.\n const content = `import { ${registryItem?.meta?.importSpecifier} } from \"${registryItem.meta.moduleSpecifier}\"\\n\\nexport default function Page() {\\n return <${registryItem?.meta?.importSpecifier} />\\n}`\n await fs.writeFile(indexPath, content, \"utf8\")\n}\n","import * as fs from \"fs/promises\"\nimport * as path from \"path\"\nimport { preFlightBuild } from \"@/src/preflights/preflight-build\"\nimport { registryItemSchema, registrySchema } from \"@/src/registry\"\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 { Command } from \"commander\"\nimport { z } from \"zod\"\n\nexport const buildOptionsSchema = z.object({\n cwd: z.string(),\n registryFile: z.string(),\n outputDir: z.string(),\n})\n\nexport const build = new Command()\n .name(\"build\")\n .description(\"build components for a shadcn registry\")\n .argument(\"[registry]\", \"path to registry.json file\", \"./registry.json\")\n .option(\n \"-o, --output <path>\",\n \"destination directory for json files\",\n \"./public/r\"\n )\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async (registry: string, opts) => {\n try {\n const options = buildOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n registryFile: registry,\n outputDir: opts.output,\n })\n\n const { resolvePaths } = await preFlightBuild(options)\n const content = await fs.readFile(resolvePaths.registryFile, \"utf-8\")\n\n const result = registrySchema.safeParse(JSON.parse(content))\n\n if (!result.success) {\n logger.error(\n `Invalid registry file found at ${highlighter.info(\n resolvePaths.registryFile\n )}.`\n )\n process.exit(1)\n }\n\n const buildSpinner = spinner(\"Building registry...\")\n for (const registryItem of result.data.items) {\n if (!registryItem.files) {\n continue\n }\n\n buildSpinner.start(`Building ${registryItem.name}...`)\n\n // Add the schema to the registry item.\n registryItem[\"$schema\"] =\n \"https://ui.shadcn.com/schema/registry-item.json\"\n\n // Loop through each file in the files array.\n for (const file of registryItem.files) {\n file[\"content\"] = await fs.readFile(\n path.resolve(resolvePaths.cwd, file.path),\n \"utf-8\"\n )\n }\n\n // Validate the registry item.\n const result = registryItemSchema.safeParse(registryItem)\n if (!result.success) {\n logger.error(\n `Invalid registry item found for ${highlighter.info(\n registryItem.name\n )}.`\n )\n continue\n }\n\n // Write the registry item to the output directory.\n await fs.writeFile(\n path.resolve(resolvePaths.outputDir, `${result.data.name}.json`),\n JSON.stringify(result.data, null, 2)\n )\n }\n\n buildSpinner.succeed(\"Building registry.\")\n } catch (error) {\n logger.break()\n handleError(error)\n }\n })\n","import path from \"path\"\nimport { buildOptionsSchema } from \"@/src/commands/build\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport fs from \"fs-extra\"\nimport { z } from \"zod\"\n\nexport async function preFlightBuild(\n options: z.infer<typeof buildOptionsSchema>\n) {\n const errors: Record<string, boolean> = {}\n\n const resolvePaths = {\n cwd: options.cwd,\n registryFile: path.resolve(options.cwd, options.registryFile),\n outputDir: path.resolve(options.cwd, options.outputDir),\n }\n\n // Ensure registry file exists.\n if (!fs.existsSync(resolvePaths.registryFile)) {\n errors[ERRORS.BUILD_MISSING_REGISTRY_FILE] = true\n }\n\n // Create output directory if it doesn't exist.\n await fs.mkdir(resolvePaths.outputDir, { recursive: true })\n\n if (Object.keys(errors).length > 0) {\n if (errors[ERRORS.BUILD_MISSING_REGISTRY_FILE]) {\n logger.break()\n logger.error(\n `The path ${highlighter.info(\n resolvePaths.registryFile\n )} does not exist.`\n )\n }\n\n logger.break()\n process.exit(1)\n }\n\n return {\n errors,\n resolvePaths,\n }\n}\n","import { existsSync, promises as fs } from \"fs\"\nimport path from \"path\"\nimport {\n fetchTree,\n getItemTargetPath,\n getRegistryBaseColor,\n getRegistryIndex,\n} from \"@/src/registry/api\"\nimport { registryIndexSchema } from \"@/src/registry/schema\"\nimport { Config, getConfig } from \"@/src/utils/get-config\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { transform } from \"@/src/utils/transformers\"\nimport { Command } from \"commander\"\nimport { diffLines, type Change } from \"diff\"\nimport { z } from \"zod\"\n\nconst updateOptionsSchema = z.object({\n component: z.string().optional(),\n yes: z.boolean(),\n cwd: z.string(),\n path: z.string().optional(),\n})\n\nexport const diff = new Command()\n .name(\"diff\")\n .description(\"check for updates against the registry\")\n .argument(\"[component]\", \"the component name\")\n .option(\"-y, --yes\", \"skip confirmation prompt.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async (name, opts) => {\n try {\n const options = updateOptionsSchema.parse({\n component: name,\n ...opts,\n })\n\n const cwd = path.resolve(options.cwd)\n\n if (!existsSync(cwd)) {\n logger.error(`The path ${cwd} does not exist. Please try again.`)\n process.exit(1)\n }\n\n const config = await getConfig(cwd)\n if (!config) {\n logger.warn(\n `Configuration is missing. Please run ${highlighter.success(\n `init`\n )} to create a components.json file.`\n )\n process.exit(1)\n }\n\n const registryIndex = await getRegistryIndex()\n\n if (!registryIndex) {\n handleError(new Error(\"Failed to fetch registry index.\"))\n process.exit(1)\n }\n\n if (!options.component) {\n const targetDir = config.resolvedPaths.components\n\n // Find all components that exist in the project.\n const projectComponents = registryIndex.filter((item) => {\n for (const file of item.files ?? []) {\n const filePath = path.resolve(\n targetDir,\n typeof file === \"string\" ? file : file.path\n )\n if (existsSync(filePath)) {\n return true\n }\n }\n\n return false\n })\n\n // Check for updates.\n const componentsWithUpdates = []\n for (const component of projectComponents) {\n const changes = await diffComponent(component, config)\n if (changes.length) {\n componentsWithUpdates.push({\n name: component.name,\n changes,\n })\n }\n }\n\n if (!componentsWithUpdates.length) {\n logger.info(\"No updates found.\")\n process.exit(0)\n }\n\n logger.info(\"The following components have updates available:\")\n for (const component of componentsWithUpdates) {\n logger.info(`- ${component.name}`)\n for (const change of component.changes) {\n logger.info(` - ${change.filePath}`)\n }\n }\n logger.break()\n logger.info(\n `Run ${highlighter.success(`diff <component>`)} to see the changes.`\n )\n process.exit(0)\n }\n\n // Show diff for a single component.\n const component = registryIndex.find(\n (item) => item.name === options.component\n )\n\n if (!component) {\n logger.error(\n `The component ${highlighter.success(\n options.component\n )} does not exist.`\n )\n process.exit(1)\n }\n\n const changes = await diffComponent(component, config)\n\n if (!changes.length) {\n logger.info(`No updates found for ${options.component}.`)\n process.exit(0)\n }\n\n for (const change of changes) {\n logger.info(`- ${change.filePath}`)\n await printDiff(change.patch)\n logger.info(\"\")\n }\n } catch (error) {\n handleError(error)\n }\n })\n\nasync function diffComponent(\n component: z.infer<typeof registryIndexSchema>[number],\n config: Config\n) {\n const payload = await fetchTree(config.style, [component])\n const baseColor = await getRegistryBaseColor(config.tailwind.baseColor)\n\n if (!payload) {\n return []\n }\n\n const changes = []\n\n for (const item of payload) {\n const targetDir = await getItemTargetPath(config, item)\n\n if (!targetDir) {\n continue\n }\n\n for (const file of item.files ?? []) {\n const filePath = path.resolve(\n targetDir,\n typeof file === \"string\" ? file : file.path\n )\n\n if (!existsSync(filePath)) {\n continue\n }\n\n const fileContent = await fs.readFile(filePath, \"utf8\")\n\n if (typeof file === \"string\" || !file.content) {\n continue\n }\n\n const registryContent = await transform({\n filename: file.path,\n raw: file.content,\n config,\n baseColor,\n })\n\n const patch = diffLines(registryContent as string, fileContent)\n if (patch.length > 1) {\n changes.push({\n filePath,\n patch,\n })\n }\n }\n }\n\n return changes\n}\n\nasync function printDiff(diff: Change[]) {\n diff.forEach((part) => {\n if (part) {\n if (part.added) {\n return process.stdout.write(highlighter.success(part.value))\n }\n if (part.removed) {\n return process.stdout.write(highlighter.error(part.value))\n }\n\n return process.stdout.write(part.value)\n }\n })\n}\n","import { getConfig } from \"@/src/utils/get-config\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { logger } from \"@/src/utils/logger\"\nimport { Command } from \"commander\"\n\nexport const info = new Command()\n .name(\"info\")\n .description(\"get information about your project\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async (opts) => {\n logger.info(\"> project info\")\n console.log(await getProjectInfo(opts.cwd))\n logger.break()\n logger.info(\"> components.json\")\n console.log(await getConfig(opts.cwd))\n })\n","import path from \"path\"\nimport { migrateIcons } from \"@/src/migrations/migrate-icons\"\nimport { preFlightMigrate } from \"@/src/preflights/preflight-migrate\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { logger } from \"@/src/utils/logger\"\nimport { Command } from \"commander\"\nimport { z } from \"zod\"\n\nexport const migrations = [\n {\n name: \"icons\",\n description: \"migrate your ui components to a different icon library.\",\n },\n] as const\n\nexport const migrateOptionsSchema = z.object({\n cwd: z.string(),\n list: z.boolean(),\n migration: z\n .string()\n .refine(\n (value) =>\n value && migrations.some((migration) => migration.name === value),\n {\n message:\n \"You must specify a valid migration. Run `shadcn migrate --list` to see available migrations.\",\n }\n )\n .optional(),\n})\n\nexport const migrate = new Command()\n .name(\"migrate\")\n .description(\"run a migration.\")\n .argument(\"[migration]\", \"the migration to run.\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"-l, --list\", \"list all migrations.\", false)\n .action(async (migration, opts) => {\n try {\n const options = migrateOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n migration,\n list: opts.list,\n })\n\n if (options.list || !options.migration) {\n logger.info(\"Available migrations:\")\n for (const migration of migrations) {\n logger.info(`- ${migration.name}: ${migration.description}`)\n }\n return\n }\n\n if (!options.migration) {\n throw new Error(\n \"You must specify a migration. Run `shadcn migrate --list` to see available migrations.\"\n )\n }\n\n let { errors, config } = await preFlightMigrate(options)\n\n if (\n errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT] ||\n errors[ERRORS.MISSING_CONFIG]\n ) {\n throw new Error(\n \"No `components.json` file found. Ensure you are at the root of your project.\"\n )\n }\n\n if (!config) {\n throw new Error(\n \"Something went wrong reading your `components.json` file. Please ensure you have a valid `components.json` file.\"\n )\n }\n\n if (options.migration === \"icons\") {\n await migrateIcons(config)\n }\n } catch (error) {\n logger.break()\n handleError(error)\n }\n })\n","import { randomBytes } from \"crypto\"\nimport { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { getRegistryIcons } from \"@/src/registry/api\"\nimport { iconsSchema } from \"@/src/registry/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { ICON_LIBRARIES } from \"@/src/utils/icon-libraries\"\nimport { logger } from \"@/src/utils/logger\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport { updateDependencies } from \"@/src/utils/updaters/update-dependencies\"\nimport fg from \"fast-glob\"\nimport prompts from \"prompts\"\nimport { Project, ScriptKind, SyntaxKind } from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport async function migrateIcons(config: Config) {\n if (!config.resolvedPaths.ui) {\n throw new Error(\n \"We could not find a valid `ui` path in your `components.json` file. Please ensure you have a valid `ui` path in your `components.json` file.\"\n )\n }\n\n const uiPath = config.resolvedPaths.ui\n const [files, registryIcons] = await Promise.all([\n fg(\"**/*.{js,ts,jsx,tsx}\", {\n cwd: uiPath,\n }),\n getRegistryIcons(),\n ])\n\n if (Object.keys(registryIcons).length === 0) {\n throw new Error(\"Something went wrong fetching the registry icons.\")\n }\n\n const libraryChoices = Object.entries(ICON_LIBRARIES).map(\n ([name, iconLibrary]) => ({\n title: iconLibrary.name,\n value: name,\n })\n )\n\n const migrateOptions = await prompts([\n {\n type: \"select\",\n name: \"sourceLibrary\",\n message: `Which icon library would you like to ${highlighter.info(\n \"migrate from\"\n )}?`,\n choices: libraryChoices,\n },\n {\n type: \"select\",\n name: \"targetLibrary\",\n message: `Which icon library would you like to ${highlighter.info(\n \"migrate to\"\n )}?`,\n choices: libraryChoices,\n },\n ])\n\n if (migrateOptions.sourceLibrary === migrateOptions.targetLibrary) {\n throw new Error(\n \"You cannot migrate to the same icon library. Please choose a different icon library.\"\n )\n }\n\n if (\n !(\n migrateOptions.sourceLibrary in ICON_LIBRARIES &&\n migrateOptions.targetLibrary in ICON_LIBRARIES\n )\n ) {\n throw new Error(\"Invalid icon library. Please choose a valid icon library.\")\n }\n\n const sourceLibrary =\n ICON_LIBRARIES[migrateOptions.sourceLibrary as keyof typeof ICON_LIBRARIES]\n const targetLibrary =\n ICON_LIBRARIES[migrateOptions.targetLibrary as keyof typeof ICON_LIBRARIES]\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n initial: true,\n message: `We will migrate ${highlighter.info(\n files.length\n )} files in ${highlighter.info(\n `./${path.relative(config.resolvedPaths.cwd, uiPath)}`\n )} from ${highlighter.info(sourceLibrary.name)} to ${highlighter.info(\n targetLibrary.name\n )}. Continue?`,\n })\n\n if (!confirm) {\n logger.info(\"Migration cancelled.\")\n process.exit(0)\n }\n\n if (targetLibrary.package) {\n await updateDependencies([targetLibrary.package], [], config, {\n silent: false,\n })\n }\n\n const migrationSpinner = spinner(`Migrating icons...`)?.start()\n\n await Promise.all(\n files.map(async (file) => {\n migrationSpinner.text = `Migrating ${file}...`\n\n const filePath = path.join(uiPath, file)\n const fileContent = await fs.readFile(filePath, \"utf-8\")\n\n const content = await migrateIconsFile(\n fileContent,\n migrateOptions.sourceLibrary,\n migrateOptions.targetLibrary,\n registryIcons\n )\n\n await fs.writeFile(filePath, content)\n })\n )\n\n migrationSpinner.succeed(\"Migration complete.\")\n}\n\nexport async function migrateIconsFile(\n content: string,\n sourceLibrary: keyof typeof ICON_LIBRARIES,\n targetLibrary: keyof typeof ICON_LIBRARIES,\n iconsMapping: z.infer<typeof iconsSchema>\n) {\n const sourceLibraryImport = ICON_LIBRARIES[sourceLibrary]?.import\n const targetLibraryImport = ICON_LIBRARIES[targetLibrary]?.import\n\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const project = new Project({\n compilerOptions: {},\n })\n\n const tempFile = path.join(\n dir,\n `shadcn-icons-${randomBytes(4).toString(\"hex\")}.tsx`\n )\n const sourceFile = project.createSourceFile(tempFile, content, {\n scriptKind: ScriptKind.TSX,\n })\n\n // Find all sourceLibrary imports.\n let targetedIcons: string[] = []\n for (const importDeclaration of sourceFile.getImportDeclarations() ?? []) {\n if (\n importDeclaration.getModuleSpecifier()?.getText() !==\n `\"${sourceLibraryImport}\"`\n ) {\n continue\n }\n\n for (const specifier of importDeclaration.getNamedImports() ?? []) {\n const iconName = specifier.getName()\n\n // TODO: this is O(n^2) but okay for now.\n const targetedIcon = Object.values(iconsMapping).find(\n (icon) => icon[sourceLibrary] === iconName\n )?.[targetLibrary]\n\n if (!targetedIcon || targetedIcons.includes(targetedIcon)) {\n continue\n }\n\n targetedIcons.push(targetedIcon)\n\n // Remove the named import.\n specifier.remove()\n\n // Replace with the targeted icon.\n sourceFile\n .getDescendantsOfKind(SyntaxKind.JsxSelfClosingElement)\n .filter((node) => node.getTagNameNode()?.getText() === iconName)\n .forEach((node) => node.getTagNameNode()?.replaceWithText(targetedIcon))\n }\n\n // If the named import is empty, remove the import declaration.\n if (importDeclaration.getNamedImports()?.length === 0) {\n importDeclaration.remove()\n }\n }\n\n if (targetedIcons.length > 0) {\n sourceFile.addImportDeclaration({\n moduleSpecifier: targetLibraryImport,\n namedImports: targetedIcons.map((icon) => ({\n name: icon,\n })),\n })\n }\n\n return await sourceFile.getText()\n}\n","import path from \"path\"\nimport { addOptionsSchema } from \"@/src/commands/add\"\nimport { migrateOptionsSchema } from \"@/src/commands/migrate\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { getConfig } from \"@/src/utils/get-config\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport fs from \"fs-extra\"\nimport { z } from \"zod\"\n\nexport async function preFlightMigrate(\n options: z.infer<typeof migrateOptionsSchema>\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 config: null,\n }\n }\n\n // Check for existing components.json file.\n if (!fs.existsSync(path.resolve(options.cwd, \"components.json\"))) {\n errors[ERRORS.MISSING_CONFIG] = true\n return {\n errors,\n config: null,\n }\n }\n\n try {\n const config = await getConfig(options.cwd)\n\n return {\n errors,\n config: config!,\n }\n } catch (error) {\n logger.break()\n logger.error(\n `An invalid ${highlighter.info(\n \"components.json\"\n )} file was found at ${highlighter.info(\n options.cwd\n )}.\\nBefore you can run a migration, you must create a valid ${highlighter.info(\n \"components.json\"\n )} file by running the ${highlighter.info(\"init\")} command.`\n )\n logger.error(\n `Learn more at ${highlighter.info(\n \"https://ui.shadcn.com/docs/components-json\"\n )}.`\n )\n logger.break()\n process.exit(1)\n }\n}\n","#!/usr/bin/env node\nimport { add } from \"@/src/commands/add\"\nimport { build } from \"@/src/commands/build\"\nimport { diff } from \"@/src/commands/diff\"\nimport { info } from \"@/src/commands/info\"\nimport { init } from \"@/src/commands/init\"\nimport { migrate } from \"@/src/commands/migrate\"\nimport { Command } from \"commander\"\n\nimport packageJson from \"../package.json\"\n\nprocess.on(\"SIGINT\", () => process.exit(0))\nprocess.on(\"SIGTERM\", () => process.exit(0))\n\nasync function main() {\n const program = new Command()\n .name(\"shadcn\")\n .description(\"add components and dependencies to your project\")\n .version(\n packageJson.version || \"1.0.0\",\n \"-v, --version\",\n \"display the version number\"\n )\n\n program\n .addCommand(init)\n .addCommand(add)\n .addCommand(diff)\n .addCommand(migrate)\n .addCommand(info)\n .addCommand(build)\n\n program.parse()\n}\n\nmain()\n\nexport * from \"./registry/api\"\n","{\n \"name\": \"shadcn\",\n \"version\": \"2.5.0\",\n \"description\": \"Add components to your apps.\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"license\": \"MIT\",\n \"author\": {\n \"name\": \"shadcn\",\n \"url\": \"https://twitter.com/shadcn\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/shadcn/ui.git\",\n \"directory\": \"packages/shadcn\"\n },\n \"files\": [\n \"dist\"\n ],\n \"keywords\": [\n \"components\",\n \"ui\",\n \"tailwind\",\n \"radix-ui\",\n \"shadcn\"\n ],\n \"type\": \"module\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./registry\": {\n \"types\": \"./dist/registry/index.d.ts\",\n \"default\": \"./dist/registry/index.js\"\n }\n },\n \"bin\": \"./dist/index.js\",\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\",\n \"typecheck\": \"tsc --noEmit\",\n \"clean\": \"rimraf dist && rimraf components\",\n \"start:dev\": \"cross-env REGISTRY_URL=http://localhost:3333/r node dist/index.js\",\n \"start:prod\": \"cross-env REGISTRY_URL=https://ui.shadcn.com/r node dist/index.js\",\n \"start\": \"node dist/index.js\",\n \"format:write\": \"prettier --write \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n \"format:check\": \"prettier --check \\\"**/*.{ts,tsx,mdx}\\\" --cache\",\n \"release\": \"changeset version\",\n \"pub:beta\": \"pnpm build && pnpm publish --no-git-checks --access public --tag beta\",\n \"pub:next\": \"pnpm build && pnpm publish --no-git-checks --access public --tag next\",\n \"pub:release\": \"pnpm build && pnpm publish --access public\",\n \"test\": \"vitest run\",\n \"test:dev\": \"REGISTRY_URL=http://localhost:3333/r vitest run\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"^23.2.0\",\n \"@babel/core\": \"^7.22.1\",\n \"@babel/parser\": \"^7.22.6\",\n \"@babel/plugin-transform-typescript\": \"^7.22.5\",\n \"commander\": \"^10.0.0\",\n \"cosmiconfig\": \"^8.1.3\",\n \"deepmerge\": \"^4.3.1\",\n \"diff\": \"^5.1.0\",\n \"execa\": \"^7.0.0\",\n \"fast-glob\": \"^3.3.2\",\n \"fs-extra\": \"^11.1.0\",\n \"https-proxy-agent\": \"^6.2.0\",\n \"kleur\": \"^4.1.5\",\n \"msw\": \"^2.7.1\",\n \"node-fetch\": \"^3.3.0\",\n \"ora\": \"^6.1.2\",\n \"postcss\": \"^8.4.24\",\n \"prompts\": \"^2.4.2\",\n \"recast\": \"^0.23.2\",\n \"stringify-object\": \"^5.0.0\",\n \"ts-morph\": \"^18.0.0\",\n \"tsconfig-paths\": \"^4.2.0\",\n \"zod\": \"^3.20.2\"\n },\n \"devDependencies\": {\n \"@types/babel__core\": \"^7.20.1\",\n \"@types/diff\": \"^5.0.3\",\n \"@types/fs-extra\": \"^11.0.1\",\n \"@types/prompts\": \"^2.4.2\",\n \"@types/stringify-object\": \"^4.0.5\",\n \"rimraf\": \"^6.0.1\",\n \"tsup\": \"^6.6.3\",\n \"type-fest\": \"^3.8.0\",\n \"typescript\": \"^4.9.3\"\n }\n}\n"]}
|