shadcn 2.6.2 → 2.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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/migrations/migrate-radix.ts","../src/preflights/preflight-migrate.ts","../src/commands/registry/build.ts","../src/preflights/preflight-registry.ts","../src/registry/utils.ts","../src/commands/registry/mcp.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","shouldPromptForNpmFlag","confirmation","dep","hasReact19","hasReactDayPicker8","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","getProjectTailwindVersionFromConfig","defaultClassNames","applyPrefix","callExpression","arg","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","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","toPascalCase","str","processNamedImports","namedImports","isTypeOnly","imports","packageName","namedImportList","importItem","inlineTypeMatch","aliasMatch","importName","importAlias","migrateRadix","foundPackages","replacedPackages","migrateRadixFile","pkg","packageSpinner","packageJson","foundPackagesArray","dependencyTypes","depType","packageJsonPath","radixImportPattern","linesToRemove","quoteStyle","fullMatch","typeKeyword","namespaceAlias","componentName","uniqueImports","index","self","unifiedImport","imp","typePrefix","acc","line","transformedLine","offset","string","beforeMatch","openQuotes","openSingleQuotes","uniqueReplacedPackages","preFlightMigrate","migrations","migrateOptionsSchema","migration","migrate","preFlightRegistryBuild","FILE_EXTENSIONS_FOR_LOOKUP","FILE_PATH_SKIP_LIST","DEPENDENCY_SKIP_LIST","getDependencyFromModuleSpecifier","pattern","recursivelyResolveFileImports","processedFiles","resolvedFilePath","relativeRegistryFilePath","fileExtension","fileType","determineFileType","originalFile","importStatements","importStatement","isRelativeImport","dependency","pathWithExt","nestedRelativeRegistryFilePath","nestedResults","uniqueFiles","buildRegistry","resolvedRegistry","t","d","absPath","err","results","StdioServerTransport","mcp","transport","server","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 (shouldPromptForNpmFlag(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 shouldPromptForNpmFlag(config: Config) {\n const packageInfo = getPackageInfo(config.resolvedPaths.cwd, false)\n\n if (!packageInfo?.dependencies?.react) {\n return false\n }\n\n const hasReact19 = /^(?:\\^|~)?19(?:\\.\\d+)*(?:-.*)?$/.test(\n packageInfo.dependencies.react\n )\n const hasReactDayPicker8 =\n packageInfo.dependencies[\"react-day-picker\"]?.startsWith(\"8\")\n\n return hasReact19 && hasReactDayPicker8\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 // Skip if the file extension is not one of the supported extensions.\n if (![\".tsx\", \".ts\", \".jsx\", \".js\"].includes(sourceFile.getExtension())) {\n continue\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 if (![\".tsx\", \".ts\", \".jsx\", \".js\"].includes(sourceFile.getExtension())) {\n return sourceFile\n }\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 {\n TailwindVersion,\n getProjectTailwindVersionFromConfig,\n} from \"../get-project-info\"\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 const tailwindVersion = await getProjectTailwindVersionFromConfig(config)\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\n )}\"`\n )\n }\n }\n }\n })\n }\n }\n })\n\n return sourceFile\n}\n\nexport function applyPrefix(\n input: string,\n prefix: string = \"\",\n tailwindVersion: TailwindVersion\n) {\n if (tailwindVersion === \"v3\") {\n return input\n .split(\" \")\n .map((className) => {\n const [variant, value, modifier] = splitClassName(className)\n if (variant) {\n return modifier\n ? `${variant}:${prefix}${value}/${modifier}`\n : `${variant}:${prefix}${value}`\n } else {\n return modifier\n ? `${prefix}${value}/${modifier}`\n : `${prefix}${value}`\n }\n })\n .join(\" \")\n }\n\n return input\n .split(\" \")\n .map((className) =>\n className.indexOf(`${prefix}:`) === 0\n ? className\n : `${prefix}:${className.trim()}`\n )\n .join(\" \")\n}\n\nexport function applyPrefixesCss(\n css: string,\n prefix: string,\n tailwindVersion: TailwindVersion\n) {\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, tailwindVersion)\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 { migrateRadix } from \"@/src/migrations/migrate-radix\"\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 {\n name: \"radix\",\n description: \"migrate to radix-ui.\",\n },\n] as const\n\nexport const migrateOptionsSchema = z.object({\n cwd: z.string(),\n list: z.boolean(),\n yes: 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 .option(\"-y, --yes\", \"skip confirmation prompt.\", 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 yes: opts.yes,\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\n if (options.migration === \"radix\") {\n await migrateRadix(config, { yes: options.yes })\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 { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\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\"\n\nfunction toPascalCase(str: string): string {\n return str\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\")\n}\n\nfunction processNamedImports(\n namedImports: string,\n isTypeOnly: boolean,\n imports: Array<{ name: string; alias?: string; isType?: boolean }>,\n packageName: string\n) {\n // Clean up multi-line imports.\n // Remove comments and whitespace.\n const cleanedImports = namedImports\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n\n const namedImportList = cleanedImports\n .split(\",\")\n .map((importItem) => importItem.trim())\n .filter(Boolean)\n\n for (const importItem of namedImportList) {\n const inlineTypeMatch = importItem.match(/^type\\s+(\\w+)(?:\\s+as\\s+(\\w+))?$/)\n const aliasMatch = importItem.match(/^(\\w+)\\s+as\\s+(\\w+)$/)\n\n if (inlineTypeMatch) {\n // Inline type: \"type DialogProps\" or \"type DialogProps as Props\"\n const importName = inlineTypeMatch[1]\n const importAlias = inlineTypeMatch[2]\n\n if (packageName === \"slot\" && importName === \"Slot\" && !importAlias) {\n imports.push({\n name: \"Slot\",\n alias: \"SlotPrimitive\",\n isType: true,\n })\n } else {\n imports.push({\n name: importName,\n alias: importAlias,\n isType: true,\n })\n }\n } else if (aliasMatch) {\n // Regular import with alias: \"Root as DialogRoot\"\n const importName = aliasMatch[1]\n const importAlias = aliasMatch[2]\n\n if (\n packageName === \"slot\" &&\n importName === \"Slot\" &&\n importAlias === \"Slot\"\n ) {\n imports.push({\n name: \"Slot\",\n alias: \"SlotPrimitive\",\n isType: isTypeOnly,\n })\n } else {\n imports.push({\n name: importName,\n alias: importAlias,\n isType: isTypeOnly,\n })\n }\n } else {\n // Simple import: \"Root\"\n // Special handling for Slot: always alias it as SlotPrimitive\n if (packageName === \"slot\" && importItem === \"Slot\") {\n imports.push({\n name: \"Slot\",\n alias: \"SlotPrimitive\",\n isType: isTypeOnly,\n })\n } else {\n imports.push({\n name: importItem,\n isType: isTypeOnly,\n })\n }\n }\n }\n}\n\nexport async function migrateRadix(\n config: Config,\n options: { yes?: boolean } = {}\n) {\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 = await fg(\"**/*.{js,ts,jsx,tsx}\", {\n cwd: uiPath,\n })\n\n if (!options.yes) {\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 )} to ${highlighter.info(\"radix-ui\")}. Continue?`,\n })\n\n if (!confirm) {\n logger.info(\"Migration cancelled.\")\n process.exit(0)\n }\n }\n\n const migrationSpinner = spinner(`Migrating imports...`)?.start()\n const foundPackages = new Set<string>()\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, replacedPackages } = await migrateRadixFile(fileContent)\n\n // Track which packages we found\n replacedPackages.forEach((pkg) => foundPackages.add(pkg))\n\n await fs.writeFile(filePath, content)\n })\n )\n\n migrationSpinner.succeed(\"Migrating imports.\")\n\n // Update package.json dependencies\n const packageSpinner = spinner(`Updating package.json...`)?.start()\n\n try {\n const packageJson = getPackageInfo(config.resolvedPaths.cwd, false)\n\n if (!packageJson) {\n packageSpinner.fail(\"Could not read package.json\")\n logger.warn(\n \"Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui\"\n )\n return\n }\n\n const foundPackagesArray = Array.from(foundPackages)\n\n // Remove packages from both dependencies and devDependencies if found in source files\n const dependencyTypes = [\"dependencies\", \"devDependencies\"] as const\n for (const depType of dependencyTypes) {\n if (packageJson[depType]) {\n for (const pkg of foundPackagesArray) {\n if (packageJson[depType]![pkg]) {\n delete packageJson[depType]![pkg]\n }\n }\n }\n }\n\n // Add radix-ui if we found any Radix packages.\n if (foundPackagesArray.length > 0) {\n if (!packageJson.dependencies) {\n packageJson.dependencies = {}\n }\n packageJson.dependencies[\"radix-ui\"] = \"latest\"\n\n const packageJsonPath = path.join(\n config.resolvedPaths.cwd,\n \"package.json\"\n )\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify(packageJson, null, 2) + \"\\n\"\n )\n\n packageSpinner.succeed(`Updated package.json.`)\n\n // Install radix-ui dependency.\n await updateDependencies([\"radix-ui\"], [], config, { silent: false })\n } else {\n packageSpinner.succeed(\"No packages found in source files.\")\n }\n } catch (error) {\n packageSpinner.fail(\"Failed to update package.json\")\n logger.warn(\n \"You may need to manually replace @radix-ui/react-* packages with radix-ui\"\n )\n }\n}\n\nexport async function migrateRadixFile(\n content: string\n): Promise<{ content: string; replacedPackages: string[] }> {\n // Enhanced regex to handle type-only imports, but exclude react-icons\n const radixImportPattern =\n /import\\s+(?:(type)\\s+)?(?:\\*\\s+as\\s+(\\w+)|{([^}]+)})\\s+from\\s+([\"'])@radix-ui\\/react-([^\"']+)\\4/g\n\n const imports: Array<{ name: string; alias?: string; isType?: boolean }> = []\n const linesToRemove: string[] = []\n const replacedPackages: string[] = []\n let quoteStyle = '\"' // Default to double quotes\n\n let result = content\n let match\n\n // Find all Radix imports\n while ((match = radixImportPattern.exec(content)) !== null) {\n const [\n fullMatch,\n typeKeyword,\n namespaceAlias,\n namedImports,\n quote,\n packageName,\n ] = match\n\n // Skip react-icons package and any sub-paths (like react-icons/dist/types)\n if (packageName === \"icons\" || packageName.startsWith(\"icons/\")) {\n continue\n }\n\n linesToRemove.push(fullMatch)\n\n // Use the quote style from the first import\n if (linesToRemove.length === 1) {\n quoteStyle = quote\n }\n\n // Track which package we're replacing\n replacedPackages.push(`@radix-ui/react-${packageName}`)\n\n const isTypeOnly = Boolean(typeKeyword)\n\n if (namespaceAlias) {\n // Handle namespace imports: import * as DialogPrimitive from \"@radix-ui/react-dialog\"\n const componentName = toPascalCase(packageName)\n imports.push({\n name: componentName,\n alias: namespaceAlias,\n isType: isTypeOnly,\n })\n } else if (namedImports) {\n // Handle named imports: import { Root, Trigger } from \"@radix-ui/react-dialog\"\n // or import type { DialogProps } from \"@radix-ui/react-dialog\"\n // or import { type DialogProps, Root } from \"@radix-ui/react-dialog\"\n\n processNamedImports(namedImports, isTypeOnly, imports, packageName)\n }\n }\n\n if (imports.length === 0) {\n return {\n content,\n replacedPackages: [],\n }\n }\n\n // Remove duplicates.\n // Considering name, alias, and type status.\n const uniqueImports = imports.filter(\n (importName, index, self) =>\n index ===\n self.findIndex(\n (i) =>\n i.name === importName.name &&\n i.alias === importName.alias &&\n i.isType === importName.isType\n )\n )\n\n // Create the unified import with preserved quote style and type annotations\n const importList = uniqueImports\n .map((imp) => {\n const typePrefix = imp.isType ? \"type \" : \"\"\n return imp.alias\n ? `${typePrefix}${imp.name} as ${imp.alias}`\n : `${typePrefix}${imp.name}`\n })\n .join(\", \")\n\n const unifiedImport = `import { ${importList} } from ${quoteStyle}radix-ui${quoteStyle};`\n\n // Replace first import with unified import, remove the rest\n result = linesToRemove.reduce((acc, line, index) => {\n return acc.replace(line, index === 0 ? unifiedImport : \"\")\n }, result)\n\n // Clean up extra blank lines\n result = result.replace(/\\n\\s*\\n\\s*\\n/g, \"\\n\\n\")\n\n // Handle special case for Slot usage transformation\n // Now that we import { Slot as SlotPrimitive }, we need to:\n // 1. Transform: const Comp = asChild ? Slot : [ANYTHING] -> const Comp = asChild ? SlotPrimitive.Slot : [ANYTHING]\n // 2. Transform: React.ComponentProps<typeof Slot> -> React.ComponentProps<typeof SlotPrimitive.Slot>\n const hasSlotImport = uniqueImports.some(\n (imp) => imp.name === \"Slot\" && imp.alias === \"SlotPrimitive\"\n )\n\n if (hasSlotImport) {\n // Find all lines that are NOT import lines to avoid transforming the import statement itself\n const lines = result.split(\"\\n\")\n const transformedLines = lines.map((line) => {\n // Skip import lines\n if (line.trim().startsWith(\"import \")) {\n return line\n }\n\n let transformedLine = line\n\n // Handle all Slot references in one comprehensive pass\n // Use placeholders to avoid double replacements\n\n // First, mark specific patterns with placeholders\n transformedLine = transformedLine.replace(\n /\\b(asChild\\s*\\?\\s*)Slot(\\s*:)/g,\n \"$1__SLOT_PLACEHOLDER__$2\"\n )\n\n transformedLine = transformedLine.replace(\n /\\bReact\\.ComponentProps<typeof\\s+Slot>/g,\n \"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>\"\n )\n\n transformedLine = transformedLine.replace(\n /\\bComponentProps<typeof\\s+Slot>/g,\n \"ComponentProps<typeof __SLOT_PLACEHOLDER__>\"\n )\n\n transformedLine = transformedLine.replace(\n /(<\\/?)Slot(\\s*\\/?>)/g,\n \"$1__SLOT_PLACEHOLDER__$2\"\n )\n\n // Handle any other standalone Slot usage\n transformedLine = transformedLine.replace(\n /\\bSlot\\b/g,\n (match, offset, string) => {\n // Don't transform if it's inside quotes\n const beforeMatch = string.substring(0, offset)\n const openQuotes = (beforeMatch.match(/\"/g) || []).length\n const openSingleQuotes = (beforeMatch.match(/'/g) || []).length\n\n // If we're inside quotes, don't transform\n if (openQuotes % 2 !== 0 || openSingleQuotes % 2 !== 0) {\n return match\n }\n\n return \"__SLOT_PLACEHOLDER__\"\n }\n )\n\n // Finally, replace all placeholders with SlotPrimitive.Slot\n transformedLine = transformedLine.replace(\n /__SLOT_PLACEHOLDER__/g,\n \"SlotPrimitive.Slot\"\n )\n\n return transformedLine\n })\n\n result = transformedLines.join(\"\\n\")\n }\n\n // Remove duplicate packages\n const uniqueReplacedPackages = Array.from(new Set(replacedPackages))\n\n return {\n content: result,\n replacedPackages: uniqueReplacedPackages,\n }\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","import * as fs from \"fs/promises\"\nimport * as path from \"path\"\nimport { preFlightRegistryBuild } from \"@/src/preflights/preflight-registry\"\nimport { registryItemSchema, registrySchema } from \"@/src/registry\"\nimport { recursivelyResolveFileImports } from \"@/src/registry/utils\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { configSchema } from \"@/src/utils/get-config\"\nimport { ProjectInfo, 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 { 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 verbose: z.boolean().optional().default(false),\n})\n\nexport const build = new Command()\n .name(\"registry:build\")\n .description(\"builds the registry [EXPERIMENTAL]\")\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 .option(\"-v, --verbose\", \"verbose output\")\n .action(async (registry: string, opts) => {\n await buildRegistry({\n cwd: path.resolve(opts.cwd),\n registryFile: registry,\n outputDir: opts.output,\n verbose: opts.verbose,\n })\n })\n\nasync function buildRegistry(opts: z.infer<typeof buildOptionsSchema>) {\n try {\n const options = buildOptionsSchema.parse(opts)\n\n const [{ errors, resolvePaths, config }, projectInfo] = await Promise.all([\n preFlightRegistryBuild(options),\n getProjectInfo(options.cwd),\n ])\n\n if (errors[ERRORS.MISSING_CONFIG] || !config || !projectInfo) {\n logger.error(\n `A ${highlighter.info(\n \"components.json\"\n )} file is required to build the registry. Run ${highlighter.info(\n \"shadcn init\"\n )} to create one.`\n )\n logger.break()\n process.exit(1)\n }\n\n if (errors[ERRORS.BUILD_MISSING_REGISTRY_FILE] || !resolvePaths) {\n logger.error(\n `We could not find a registry file at ${highlighter.info(\n path.resolve(options.cwd, options.registryFile)\n )}.`\n )\n logger.break()\n process.exit(1)\n }\n\n const content = await fs.readFile(resolvePaths.registryFile, \"utf-8\")\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 logger.break()\n process.exit(1)\n }\n\n const buildSpinner = spinner(\"Building registry...\")\n\n // Recursively resolve the registry items.\n const resolvedRegistry = await resolveRegistryItems(\n result.data,\n config,\n projectInfo\n )\n\n // Loop through the registry items and remove duplicates files i.e same path.\n for (const registryItem of resolvedRegistry.items) {\n // Deduplicate files\n registryItem.files = registryItem.files?.filter(\n (file, index, self) =>\n index === self.findIndex((t) => t.path === file.path)\n )\n\n // Deduplicate dependencies\n if (registryItem.dependencies) {\n registryItem.dependencies = registryItem.dependencies.filter(\n (dep, index, self) => index === self.findIndex((d) => d === dep)\n )\n }\n }\n\n for (const registryItem of resolvedRegistry.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 for (const file of registryItem.files) {\n const absPath = path.resolve(resolvePaths.cwd, file.path)\n try {\n const stat = await fs.stat(absPath)\n if (!stat.isFile()) {\n continue\n }\n file[\"content\"] = await fs.readFile(absPath, \"utf-8\")\n } catch (err) {\n console.error(\"Error reading file in registry build:\", absPath, err)\n continue\n }\n }\n\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 // Copy registry.json to the output directory.\n await fs.copyFile(\n resolvePaths.registryFile,\n path.resolve(resolvePaths.outputDir, \"registry.json\")\n )\n\n buildSpinner.succeed(\"Building registry.\")\n\n if (options.verbose) {\n spinner(\n `The registry has ${highlighter.info(\n resolvedRegistry.items.length.toString()\n )} items:`\n ).succeed()\n for (const item of resolvedRegistry.items) {\n logger.log(` - ${item.name} (${highlighter.info(item.type)})`)\n for (const file of item.files ?? []) {\n logger.log(` - ${file.path}`)\n }\n }\n }\n } catch (error) {\n logger.break()\n handleError(error)\n }\n}\n\n// This reads the registry and recursively resolves the file imports.\nasync function resolveRegistryItems(\n registry: z.infer<typeof registrySchema>,\n config: z.infer<typeof configSchema>,\n projectInfo: ProjectInfo\n): Promise<z.infer<typeof registrySchema>> {\n for (const item of registry.items) {\n if (!item.files?.length) {\n continue\n }\n\n // Process all files in the array instead of just the first one\n for (const file of item.files) {\n const results = await recursivelyResolveFileImports(\n file.path,\n config,\n projectInfo\n )\n\n // Remove file from results.files\n results.files = results.files?.filter((f) => f.path !== file.path)\n\n if (results.files) {\n item.files.push(...results.files)\n }\n\n if (results.dependencies) {\n item.dependencies = item.dependencies\n ? item.dependencies.concat(results.dependencies)\n : results.dependencies\n }\n }\n }\n\n return registry\n}\n","import path from \"path\"\nimport { buildOptionsSchema } from \"@/src/commands/build\"\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 preFlightRegistryBuild(\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 return {\n errors,\n resolvePaths: null,\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 resolvePaths: null,\n config: null,\n }\n }\n\n // Create output directory if it doesn't exist.\n await fs.mkdir(resolvePaths.outputDir, { recursive: true })\n\n try {\n const config = await getConfig(options.cwd)\n\n return {\n errors,\n config: config!,\n resolvePaths,\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 build the registry, you must create a valid ${highlighter.info(\n \"components.json\"\n )} file by running the ${highlighter.info(\"init\")} command.`\n )\n logger.break()\n process.exit(1)\n }\n}\n","import * as fs from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport * as path from \"path\"\nimport { registryItemSchema } from \"@/src/registry\"\nimport { configSchema } from \"@/src/utils/get-config\"\nimport { ProjectInfo } from \"@/src/utils/get-project-info\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { Project, ScriptKind } from \"ts-morph\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nconst FILE_EXTENSIONS_FOR_LOOKUP = [\".tsx\", \".ts\", \".jsx\", \".js\", \".css\"]\nconst FILE_PATH_SKIP_LIST = [\"lib/utils.ts\"]\nconst DEPENDENCY_SKIP_LIST = [\n /^(react|react-dom|next)(\\/.*)?$/, // Matches react, react-dom, next and their submodules\n /^(node|jsr|npm):.*$/, // Matches node:, jsr:, and npm: prefixed modules\n]\n\nconst project = new Project({\n compilerOptions: {},\n})\n\n// This returns the dependency from the module specifier.\n// Here dependency means an npm package.\nexport function getDependencyFromModuleSpecifier(\n moduleSpecifier: string\n): string | null {\n // Skip if the dependency matches any pattern in the skip list\n if (DEPENDENCY_SKIP_LIST.some((pattern) => pattern.test(moduleSpecifier))) {\n return null\n }\n\n // If the module specifier does not start with `@` and has a /, add the dependency first part only.\n // E.g. `foo/bar` -> `foo`\n if (!moduleSpecifier.startsWith(\"@\") && moduleSpecifier.includes(\"/\")) {\n moduleSpecifier = moduleSpecifier.split(\"/\")[0]\n }\n\n // For scoped packages, we want to keep the first two parts\n // E.g. `@types/react/dom` -> `@types/react`\n if (moduleSpecifier.startsWith(\"@\")) {\n const parts = moduleSpecifier.split(\"/\")\n if (parts.length > 2) {\n moduleSpecifier = parts.slice(0, 2).join(\"/\")\n }\n }\n\n return moduleSpecifier\n}\n\nexport async function recursivelyResolveFileImports(\n filePath: string,\n config: z.infer<typeof configSchema>,\n projectInfo: ProjectInfo,\n processedFiles: Set<string> = new Set()\n): Promise<Pick<z.infer<typeof registryItemSchema>, \"files\" | \"dependencies\">> {\n const resolvedFilePath = path.resolve(config.resolvedPaths.cwd, filePath)\n const relativeRegistryFilePath = path.relative(\n config.resolvedPaths.cwd,\n resolvedFilePath\n )\n\n // Skip if the file is in the skip list\n if (FILE_PATH_SKIP_LIST.includes(relativeRegistryFilePath)) {\n return { dependencies: [], files: [] }\n }\n\n // Skip if the file extension is not one of the supported extensions\n const fileExtension = path.extname(filePath)\n if (!FILE_EXTENSIONS_FOR_LOOKUP.includes(fileExtension)) {\n return { dependencies: [], files: [] }\n }\n\n // Prevent infinite loop: skip if already processed\n if (processedFiles.has(relativeRegistryFilePath)) {\n return { dependencies: [], files: [] }\n }\n processedFiles.add(relativeRegistryFilePath)\n\n const stat = await fs.stat(resolvedFilePath)\n if (!stat.isFile()) {\n // Optionally log or handle this case\n return { dependencies: [], files: [] }\n }\n\n const content = await fs.readFile(resolvedFilePath, \"utf-8\")\n const tempFile = await createTempSourceFile(path.basename(resolvedFilePath))\n const sourceFile = project.createSourceFile(tempFile, content, {\n scriptKind: ScriptKind.TSX,\n })\n const tsConfig = await loadConfig(config.resolvedPaths.cwd)\n if (tsConfig.resultType === \"failed\") {\n return { dependencies: [], files: [] }\n }\n\n const files: z.infer<typeof registryItemSchema>[\"files\"] = []\n const dependencies = new Set<string>()\n\n // Add the original file first\n const fileType = determineFileType(filePath)\n const originalFile = {\n path: relativeRegistryFilePath,\n type: fileType,\n target: \"\",\n }\n files.push(originalFile)\n\n // 1. Find all import statements in the file.\n const importStatements = sourceFile.getImportDeclarations()\n for (const importStatement of importStatements) {\n const moduleSpecifier = importStatement.getModuleSpecifierValue()\n\n const isRelativeImport = moduleSpecifier.startsWith(\".\")\n const isAliasImport = moduleSpecifier.startsWith(\n `${projectInfo.aliasPrefix}/`\n )\n\n // If not a local import, add to the dependencies array.\n if (!isAliasImport && !isRelativeImport) {\n const dependency = getDependencyFromModuleSpecifier(moduleSpecifier)\n if (dependency) {\n dependencies.add(dependency)\n }\n continue\n }\n\n let probableImportFilePath = await resolveImport(moduleSpecifier, tsConfig)\n\n if (isRelativeImport) {\n probableImportFilePath = path.resolve(\n path.dirname(resolvedFilePath),\n moduleSpecifier\n )\n }\n\n if (!probableImportFilePath) {\n continue\n }\n\n // Check if the probable import path has a file extension.\n // Try each extension until we find a file that exists.\n const hasExtension = path.extname(probableImportFilePath)\n if (!hasExtension) {\n for (const ext of FILE_EXTENSIONS_FOR_LOOKUP) {\n const pathWithExt: string = `${probableImportFilePath}${ext}`\n try {\n await fs.access(pathWithExt)\n probableImportFilePath = pathWithExt\n break\n } catch {\n continue\n }\n }\n }\n\n const nestedRelativeRegistryFilePath = path.relative(\n config.resolvedPaths.cwd,\n probableImportFilePath\n )\n\n // Skip if we've already processed this file or if it's in the skip list\n if (\n processedFiles.has(nestedRelativeRegistryFilePath) ||\n FILE_PATH_SKIP_LIST.includes(nestedRelativeRegistryFilePath)\n ) {\n continue\n }\n\n const fileType = determineFileType(moduleSpecifier)\n const file = {\n path: nestedRelativeRegistryFilePath,\n type: fileType,\n target: \"\",\n }\n\n // TODO (shadcn): fix this.\n if (fileType === \"registry:page\" || fileType === \"registry:file\") {\n file.target = moduleSpecifier\n }\n\n files.push(file)\n\n // Recursively process the imported file, passing the shared processedFiles set\n const nestedResults = await recursivelyResolveFileImports(\n nestedRelativeRegistryFilePath,\n config,\n projectInfo,\n processedFiles\n )\n\n if (nestedResults.files) {\n // Only add files that haven't been processed yet\n for (const file of nestedResults.files) {\n if (!processedFiles.has(file.path)) {\n processedFiles.add(file.path)\n files.push(file)\n }\n }\n }\n\n if (nestedResults.dependencies) {\n nestedResults.dependencies.forEach((dep) => dependencies.add(dep))\n }\n }\n\n // Deduplicate files by path\n const uniqueFiles = Array.from(\n new Map(files.map((file) => [file.path, file])).values()\n )\n\n return {\n dependencies: Array.from(dependencies),\n files: uniqueFiles,\n }\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\n// This is a bit tricky to accurately determine.\n// For now we'll use the module specifier to determine the type.\nfunction determineFileType(\n moduleSpecifier: string\n): z.infer<typeof registryItemSchema>[\"type\"] {\n if (moduleSpecifier.includes(\"/ui/\")) {\n return \"registry:ui\"\n }\n\n if (moduleSpecifier.includes(\"/lib/\")) {\n return \"registry:lib\"\n }\n\n if (moduleSpecifier.includes(\"/hooks/\")) {\n return \"registry:hook\"\n }\n\n if (moduleSpecifier.includes(\"/components/\")) {\n return \"registry:component\"\n }\n\n return \"registry:component\"\n}\n","import { server } from \"@/src/mcp\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { logger } from \"@/src/utils/logger\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { Command } from \"commander\"\n\nexport const mcp = new Command()\n .name(\"registry:mcp\")\n .description(\"starts the registry MCP server [EXPERIMENTAL]\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async () => {\n try {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n } catch (error) {\n logger.break()\n handleError(error)\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 { build as registryBuild } from \"@/src/commands/registry/build\"\nimport { mcp as registryMcp } from \"@/src/commands/registry/mcp\"\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 // Registry commands\n program.addCommand(registryBuild).addCommand(registryMcp)\n\n program.parse()\n}\n\nmain()\n\nexport * from \"./registry/api\"\n","{\n \"name\": \"shadcn\",\n \"version\": \"2.6.2\",\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 \"./mcp\": {\n \"types\": \"./dist/mcp/index.d.ts\",\n \"default\": \"./dist/mcp/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:4000/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:4000/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 \"@modelcontextprotocol/sdk\": \"^1.10.2\",\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 \"zod-to-json-schema\": \"^3.24.5\"\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/migrations/migrate-radix.ts","../src/preflights/preflight-migrate.ts","../src/commands/registry/build.ts","../src/preflights/preflight-registry.ts","../src/registry/utils.ts","../src/commands/registry/mcp.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","shouldPromptForNpmFlag","confirmation","dep","hasReact19","hasReactDayPicker8","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","getProjectTailwindVersionFromConfig","defaultClassNames","applyPrefix","callExpression","arg","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","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","toPascalCase","str","processNamedImports","namedImports","isTypeOnly","imports","packageName","namedImportList","importItem","inlineTypeMatch","aliasMatch","importName","importAlias","migrateRadix","foundPackages","replacedPackages","migrateRadixFile","pkg","packageSpinner","packageJson","foundPackagesArray","dependencyTypes","depType","packageJsonPath","radixImportPattern","linesToRemove","quoteStyle","hasSemicolon","fullMatch","typeKeyword","namespaceAlias","semicolon","componentName","uniqueImports","index","self","unifiedImport","imp","typePrefix","acc","line","transformedLine","offset","string","beforeMatch","openQuotes","openSingleQuotes","uniqueReplacedPackages","preFlightMigrate","migrations","migrateOptionsSchema","migration","migrate","preFlightRegistryBuild","FILE_EXTENSIONS_FOR_LOOKUP","FILE_PATH_SKIP_LIST","DEPENDENCY_SKIP_LIST","getDependencyFromModuleSpecifier","pattern","recursivelyResolveFileImports","processedFiles","resolvedFilePath","relativeRegistryFilePath","fileExtension","fileType","determineFileType","originalFile","importStatements","importStatement","isRelativeImport","dependency","pathWithExt","nestedRelativeRegistryFilePath","nestedResults","uniqueFiles","buildRegistry","resolvedRegistry","t","d","absPath","err","results","StdioServerTransport","mcp","transport","server","package_default","main","program"],"mappings":";kZAAA,OAAOA,OAAU,OCAjB,OAAS,YAAYC,OAAU,KAC/B,OAAOD,OAAU,OCDjB,OAAOA,OAAU,OCAV,IAAME,EAA+B,IAErC,IAAMC,EAAiB,IAEvB,IAAMC,GAA0B,IAC1BC,GAAuB,IACvBC,GAAwB,IAM9B,IAAMC,EAA8B,KDL3C,OAAON,OAAQ,WAGf,eAAsBO,GACpBC,EACA,CACA,IAAMC,EAAkC,CAAC,EAIzC,GACE,CAACT,GAAG,WAAWQ,EAAQ,GAAG,GAC1B,CAACR,GAAG,WAAWD,GAAK,QAAQS,EAAQ,IAAK,cAAc,CAAC,EAExD,OAAAC,EAAcR,CAA4B,EAAI,GACvC,CACL,OAAAQ,EACA,YAAa,IACf,EAGF,IAAMC,EAAiBC,EAAQ,oBAAqB,CAClD,OAAQH,EAAQ,MAClB,CAAC,EAAE,MAAM,EAGPR,GAAG,WAAWD,GAAK,QAAQS,EAAQ,IAAK,iBAAiB,CAAC,GAC1D,CAACA,EAAQ,QAETE,GAAgB,KAAK,EACrBE,EAAO,MAAM,EACbA,EAAO,MACL,KAAKC,EAAY,KACf,iBACF,4BAA4BA,EAAY,KACtCL,EAAQ,GACV;AAAA,4BAAiCK,EAAY,KAC3C,iBACF,kBAAkBA,EAAY,KAAK,MAAM,UAC3C,EACAD,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGhBF,GAAgB,QAAQ,EAExB,IAAMI,EAAmBH,EAAQ,uBAAwB,CACvD,OAAQH,EAAQ,MAClB,CAAC,EAAE,MAAM,EACHO,EAAc,MAAMC,EAAeR,EAAQ,GAAG,GAChD,CAACO,GAAeA,GAAa,UAAU,OAAS,YAClDN,EAAcJ,EAAqB,EAAI,GACvCS,GAAkB,KAAK,EACvBF,EAAO,MAAM,EACTG,GAAa,UAAU,MAAM,cAC/BH,EAAO,MACL,gDAAgDC,EAAY,KAC1DL,EAAQ,GACV;AAAA,QACWK,EAAY,KACnBE,GAAa,UAAU,MAAM,YAC/B;AAAA,wDACJ,EAEFH,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAEhBE,GAAkB,QAChB,8BAA8BD,EAAY,KACxCE,EAAY,UAAU,KACxB,IACF,EAEA,IAAIE,EAAyB,2BAEzBF,EAAY,kBAAoB,OAClCE,EAAyB,yCAAyCJ,EAAY,KAC5E,IACF,MAGF,IAAMK,EAAkBP,EAAQM,EAAwB,CACtD,OAAQT,EAAQ,MAClB,CAAC,EAAE,MAAM,EAEPO,EAAY,kBAAoB,OAC/B,CAACA,GAAa,oBAAsB,CAACA,GAAa,kBAEnDN,EAAcN,EAAuB,EAAI,GACzCe,GAAiB,KAAK,GAEtBH,EAAY,kBAAoB,MAChC,CAACA,GAAa,iBAEdN,EAAcN,EAAuB,EAAI,GACzCe,GAAiB,KAAK,GACZH,EAAY,gBAItBG,GAAiB,QAAQ,GAHzBT,EAAcN,EAAuB,EAAI,GACzCe,GAAiB,KAAK,GAKxB,IAAMC,EAAkBR,EAAQ,2BAA4B,CAC1D,OAAQH,EAAQ,MAClB,CAAC,EAAE,MAAM,EACT,OAAKO,GAAa,YAIhBI,GAAiB,QAAQ,GAHzBV,EAAcL,EAAoB,EAAI,GACtCe,GAAiB,KAAK,GAKpB,OAAO,KAAKV,CAAM,EAAE,OAAS,IAC3BA,EAAcN,EAAuB,IACvCS,EAAO,MAAM,EACbA,EAAO,MACL,0CAA0CC,EAAY,KACpDL,EAAQ,GACV,IACF,EACAI,EAAO,MACL,uFACF,EACAA,EAAO,MAAM,sCAAsC,EAC/CG,GAAa,UAAU,MAAM,UAC/BH,EAAO,MACL,SAASC,EAAY,KACnBE,GAAa,UAAU,MAAM,QAC/B,mBACF,GAIAN,EAAcL,EAAoB,IACpCQ,EAAO,MAAM,EACbA,EAAO,MAAM,mDAAmD,EAC5DG,GAAa,UAAU,MAAM,cAC/BH,EAAO,MACL,SAASC,EAAY,KACnBE,GAAa,UAAU,MAAM,YAC/B,wCACF,GAIJH,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGT,CACL,OAAAH,EACA,YAAAM,CACF,CACF,CEjKA,OAAOhB,MAAU,OCAjB,OAAS,YAAYC,OAAU,KAC/B,OAAOD,OAAU,OAKjB,OAAOqB,MAAa,UAOpB,eAAsBC,GACpBC,EACAC,EACAf,EAGA,CACA,GACE,CAACe,EAAO,cAAc,aACtB,CAACD,GACD,OAAO,KAAKA,CAAG,EAAE,SAAW,EAE5B,OAGFd,EAAU,CACR,OAAQ,GACR,GAAGA,CACL,EAEA,IAAMgB,EAAcD,EAAO,cAAc,YACnCE,EAAsB1B,GAAK,SAC/BwB,EAAO,cAAc,IACrBC,CACF,EACME,EAAaf,EACjB,YAAYE,EAAY,KAAKY,CAAmB,IAChD,CACE,OAAQjB,EAAQ,MAClB,CACF,EAAE,MAAM,EAEFmB,EAAM,MAAM3B,GAAG,SAASwB,EAAa,MAAM,EAC7CI,EAAS,MAAMC,GAAaF,EAAKL,CAAG,EACxC,MAAMtB,GAAG,UAAUwB,EAAaI,EAAQ,MAAM,EAC9CF,EAAW,QAAQ,CACrB,CAEA,eAAsBG,GACpBC,EACAR,EACA,CACA,IAAMS,EAAU,CAACC,GAAgBV,CAAG,CAAC,EAMjCM,GAJW,MAAMR,EAAQW,CAAO,EAAE,QAAQD,EAAO,CACnD,KAAM,MACR,CAAC,GAEmB,IACpB,OAAAF,EAASA,EAAO,QAAQ,yBAA0B,EAAE,EACpDA,EAASA,EAAO,QAAQ,cAAe;AAAA;AAAA,CAAM,EAC7CA,EAASA,EAAO,QAAQ,EAEjBA,CACT,CAEA,SAASI,GAAgBV,EAA4C,CACnE,MAAO,CACL,cAAe,aACf,KAAKW,EAAY,CACf,OAAW,CAACC,EAAUC,CAAU,IAAK,OAAO,QAAQb,CAAG,EACrD,GAAIY,EAAS,WAAW,GAAG,EAAG,CAE5B,IAAME,EAAcF,EAAS,MAAM,sBAAsB,EACzD,GAAI,CAACE,EAAa,SAElB,GAAM,CAAC,CAAEC,EAAMC,CAAM,EAAIF,EAGzB,GAAIC,IAAS,YAAa,CACxB,IAAIE,EAAcN,EAAK,OAAO,KAC3BO,GACCA,EAAK,OAAS,UACdA,EAAK,OAAS,SACdA,EAAK,SAAW,QACpB,EAEKD,IACHA,EAAcnB,EAAQ,OAAO,CAC3B,KAAM,QACN,OAAQ,SACR,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,CAAK,CACtD,CAAC,EACDa,EAAK,OAAOM,CAAW,EACvBN,EAAK,aACHM,EACAnB,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CACzC,GAGF,IAAMqB,EAAgBrB,EAAQ,OAAO,CACnC,KAAM,YACN,OAAAkB,EACA,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,GAAO,CACxD,CAAC,EAID,GAFAC,EAAY,OAAOE,CAAa,EAE5B,OAAON,GAAe,SACxB,OAAW,CAACO,EAAMC,CAAS,IAAK,OAAO,QAAQR,CAAU,EACvDS,GAAYH,EAAeC,EAAMC,CAAS,UAKvCN,IAAS,UAAW,CAC3B,IAAMQ,EAAgBZ,EAAK,OAAO,KAC/BO,GACCA,EAAK,OAAS,UACdA,EAAK,OAASH,GACdG,EAAK,SAAWF,CACpB,EAEA,GAAKO,GA8BH,GAAI,OAAOV,GAAe,SACxB,OAAW,CAACW,EAAMC,CAAK,IAAK,OAAO,QAAQZ,CAAU,EACnD,GAAI,OAAOY,GAAU,SAAU,CAC7B,IAAMC,EAAeH,EAAc,OAAO,KACvCL,GACCA,EAAK,OAAS,QAAUA,EAAK,OAASM,CAC1C,EAEMG,EAAO7B,EAAQ,KAAK,CACxB,KAAA0B,EACA,MAAOC,EACP,KAAM,CAAE,UAAW,GAAM,OAAQ;AAAA,KAAS,CAC5C,CAAC,EAEDC,EACIA,EAAa,YAAYC,CAAI,EAC7BJ,EAAc,OAAOI,CAAI,OACpB,OAAOF,GAAU,UAC1BH,GAAYC,EAAeC,EAAMC,CAAK,MAhD1B,CAClB,IAAMG,EAAS9B,EAAQ,OAAO,CAC5B,KAAAiB,EACA,OAAAC,EACA,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,CAAK,CACtD,CAAC,EASD,GAPAL,EAAK,OAAOiB,CAAM,EAClBjB,EAAK,aACHiB,EACA9B,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CACzC,EAGI,OAAOe,GAAe,SACxB,OAAW,CAACW,EAAMC,CAAK,IAAK,OAAO,QAAQZ,CAAU,EACnD,GAAI,OAAOY,GAAU,SAAU,CAC7B,IAAME,EAAO7B,EAAQ,KAAK,CACxB,KAAA0B,EACA,MAAOC,EACP,KAAM,CAAE,UAAW,GAAM,OAAQ;AAAA,KAAS,CAC5C,CAAC,EACDG,EAAO,OAAOD,CAAI,OACT,OAAOF,GAAU,UAC1BH,GAAYM,EAAQJ,EAAMC,CAAK,QA+BvCI,GAAclB,EAAMI,EAAMC,EAAQH,CAAU,OAI9CS,GAAYX,EAAMC,EAAUC,CAAU,CAG5C,CACF,CACF,CAEA,SAASgB,GACPlB,EACAI,EACAC,EACAH,EACA,CAEA,IAAIe,EAASjB,EAAK,OAAO,KACtBO,GACCA,EAAK,OAAS,UAAYA,EAAK,OAASH,GAAQG,EAAK,SAAWF,CACpE,EAaA,GAXKY,IACHA,EAAS9B,EAAQ,OAAO,CACtB,KAAAiB,EACA,OAAAC,EACA,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,CAAK,CACtD,CAAC,EACDL,EAAK,OAAOiB,CAAM,EAClBjB,EAAK,aAAaiB,EAAQ9B,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CAAC,GAIhE,OAAOe,GAAe,SACxB,OAAW,CAACiB,EAAeC,CAAU,IAAK,OAAO,QAAQlB,CAAU,EACjE,GAAIiB,EAAc,WAAW,GAAG,EAAG,CAEjC,IAAME,EAAcF,EAAc,MAAM,sBAAsB,EAC9D,GAAIE,EAAa,CACf,GAAM,CAAC,CAAEC,EAAYC,CAAY,EAAIF,EACrCH,GAAcD,EAAQK,EAAYC,EAAcH,CAAU,QAI5DT,GAAYM,EAAQE,EAAeC,CAAU,UAGxC,OAAOlB,GAAe,SAE/B,GAAI,CAGF,IAAMsB,EADSrC,EAAQ,MAAM,SAASe,IAAa,EAC3B,MAExB,GAAIsB,GAAYA,EAAS,MAAO,CAE9B,IAAMC,EAAOtC,EAAQ,KAAK,CACxB,SAAU,OACV,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,GAAO,CACxD,CAAC,EAGDqC,EAAS,MAAM,QAASjB,GAAS,CAC/B,GAAIA,EAAK,OAAS,OAAQ,CACxB,IAAMmB,EAAQnB,EAAK,MAAM,EACzBmB,EAAM,KAAK,OAAS;AAAA,MACpBD,EAAK,OAAOC,CAAK,EAErB,CAAC,EAGGD,EAAK,OAAO,QACdR,EAAO,OAAOQ,CAAI,EAGxB,OAASE,EAAP,CACA,cAAQ,MAAM,iCAAkCzB,EAAYyB,CAAK,EAC3DA,CACR,CAEJ,CAEA,SAAShB,GAAYiB,EAAuB3B,EAAkBC,EAAiB,CAC7E,IAAIuB,EAAOG,EAAO,OAAO,KACtBrB,GAAuBA,EAAK,OAAS,QAAUA,EAAK,WAAaN,CACpE,EAUA,GARKwB,IACHA,EAAOtC,EAAQ,KAAK,CAClB,SAAAc,EACA,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,GAAO,CACxD,CAAC,EACD2B,EAAO,OAAOH,CAAI,GAGhB,OAAOvB,GAAe,UACxB,OAAW,CAACW,EAAMC,CAAK,IAAK,OAAO,QAAQZ,CAAU,EACnD,GAAI,OAAOY,GAAU,SAAU,CAC7B,IAAME,EAAO7B,EAAQ,KAAK,CACxB,KAAA0B,EACA,MAAOC,EACP,KAAM,CAAE,UAAW,GAAM,OAAQ;AAAA,KAAS,CAC5C,CAAC,EAGKC,EAAeU,EAAK,OAAO,KAC9BlB,GACCA,EAAK,OAAS,QAAUA,EAAK,OAASM,CAC1C,EAEAE,EAAeA,EAAa,YAAYC,CAAI,EAAIS,EAAK,OAAOT,CAAI,UACvD,OAAOF,GAAU,SAAU,CAEpC,IAAMe,EAAiBhB,EAAK,WAAW,GAAG,EACtCZ,EAAS,QAAQ,WAAY,KAAKY,EAAK,UAAU,CAAC,GAAG,EACrDA,EACJF,GAAYiB,EAAQC,EAAgBf,CAAK,WAGpC,OAAOZ,GAAe,SAE/B,GAAI,CAGF,IAAMsB,EADSrC,EAAQ,MAAM,SAASe,IAAa,EAC3B,MAEpBsB,GAAYA,EAAS,OAEvBA,EAAS,MAAM,QAASjB,GAAS,CAC/B,GAAIA,EAAK,OAAS,OAAQ,CACxB,IAAMmB,EAAQnB,EAAK,MAAM,EACzBmB,EAAM,KAAK,OAAS;AAAA,MACpBD,GAAM,OAAOC,CAAK,EAEtB,CAAC,CAEL,OAASC,EAAP,CACA,cAAQ,MAAM,8BAA+B1B,EAAUC,EAAYyB,CAAK,EAClEA,CACR,CAEJ,CCnUA,OAAS,YAAY5D,OAAU,KAC/B,OAAOD,OAAU,OAUjB,OAAOqB,MAAa,UACpB,OAAO2C,OAAY,sBAGnB,OAAS,KAAAC,MAAS,MAElB,eAAsBC,GACpBC,EACA3C,EACAf,EAQA,CACA,GAAI,CAACe,EAAO,cAAc,aAAe,CAAC,OAAO,KAAK2C,GAAW,CAAC,CAAC,EAAE,OACnE,OAGF1D,EAAU,CACR,yBAA0B,GAC1B,OAAQ,GACR,gBAAiB,KACjB,iBAAkB,GAClB,UAAW,GACX,GAAGA,CACL,EACA,IAAMgB,EAAcD,EAAO,cAAc,YACnCE,EAAsB1B,GAAK,SAC/BwB,EAAO,cAAc,IACrBC,CACF,EACM2C,EAAiBxD,EACrB,6BAA6BE,EAAY,KAAKY,CAAmB,IACjE,CACE,OAAQjB,EAAQ,MAClB,CACF,EAAE,MAAM,EACFmB,EAAM,MAAM3B,GAAG,SAASwB,EAAa,MAAM,EAC7CI,EAAS,MAAMwC,GAAiBzC,EAAKuC,GAAW,CAAC,EAAG3C,EAAQ,CAC9D,yBAA0Bf,EAAQ,yBAClC,gBAAiBA,EAAQ,gBACzB,eAAgBA,EAAQ,eACxB,iBAAkBA,EAAQ,iBAC1B,UAAWA,EAAQ,SACrB,CAAC,EACD,MAAMR,GAAG,UAAUwB,EAAaI,EAAQ,MAAM,EAC9CuC,EAAe,QAAQ,CACzB,CAEA,eAAsBC,GACpBtC,EACAoC,EACA3C,EACAf,EAMI,CACF,yBAA0B,GAC1B,gBAAiB,KACjB,eAAgB,OAChB,iBAAkB,GAClB,UAAW,EACb,EACA,CACAA,EAAU,CACR,yBAA0B,GAC1B,gBAAiB,KACjB,eAAgB,OAChB,iBAAkB,GAClB,UAAW,GACX,GAAGA,CACL,EAEA,IAAIuB,EAAU,CAACsC,GAAoBH,CAAO,CAAC,EAM3C,GAJI1D,EAAQ,0BACVuB,EAAQ,KAAKuC,GAA+B,CAAC,EAG3C9D,EAAQ,kBAAoB,KAAM,CAIpC,GAHAuB,EAAU,CAAC,EAGPR,EAAO,eAAe,IAAK,CAC7B,IAAMgD,EAAcC,GAAejD,EAAO,cAAc,GAAG,EAEzD,CAACgD,GAAa,eAAe,qBAAqB,GAClD,CAACA,GAAa,kBAAkB,qBAAqB,GACrD/D,EAAQ,WAERuB,EAAQ,KAAK0C,GAAgB,CAAE,OAAQ,gBAAiB,CAAC,CAAC,EAI9D1C,EAAQ,KAAK2C,GAAiB,CAAE,OAAQ,sBAAuB,CAAC,CAAC,EAE7DlE,EAAQ,0BACVuB,EAAQ,KAAKuC,GAA+B,CAAC,EAG/CvC,EAAQ,KACN4C,GAAsBT,EAAS,CAC7B,iBAAkB1D,EAAQ,gBAC5B,CAAC,CACH,EACAuB,EAAQ,KAAK6C,GAAkBV,CAAO,CAAC,EAEnC1D,EAAQ,iBACVuB,EAAQ,KAAK8C,GAA2BrE,EAAQ,cAAc,CAAC,EAC/DuB,EAAQ,KAAK+C,GAAoCtE,EAAQ,cAAc,CAAC,EACxEuB,EAAQ,KAAKgD,GAAoCvE,EAAQ,cAAc,CAAC,GAIxEe,EAAO,SAAS,cAAgBf,EAAQ,WAC1CuB,EAAQ,KACNiD,GAAsB,CAAE,gBAAiBxE,EAAQ,eAAgB,CAAC,CACpE,EAOF,IAAIoB,GAJW,MAAMR,EAAQW,CAAO,EAAE,QAAQD,EAAO,CACnD,KAAM,MACR,CAAC,GAEmB,IAEpB,OAAAF,EAASA,EAAO,QAAQ,yBAA0B,EAAE,EAEhDpB,EAAQ,kBAAoB,OAC9BoB,EAASA,EAAO,QAAQ,cAAe;AAAA;AAAA,CAAM,GAGxCA,CACT,CAEA,SAASoD,GAAsB,CAC7B,gBAAAC,CACF,EAEG,CACD,MAAO,CACL,cAAe,oBACf,KAAKhD,EAAY,CACf,IAAMiD,EAAgB,CACpB,CACE,SAAU,IACV,MACED,IAAoB,KAChB,gCACA,eACR,EACA,CAAE,SAAU,OAAQ,MAAO,+BAAgC,CAC7D,EAEIE,EAAYlD,EAAK,MAAM,KACxBO,GACCA,EAAK,OAAS,UACdA,EAAK,OAAS,SACdA,EAAK,SAAW,QAChB0C,EAAc,MAAM,CAAC,CAAE,SAAAhD,EAAU,MAAAkD,CAAM,IACrC5C,EAAK,OAAO,KACTkB,GACCA,EAAK,OAAS,QACdA,EAAK,WAAaxB,GAClBwB,EAAK,MAAM,KACR2B,GACCA,EAAU,OAAS,UACnBA,EAAU,OAAS,SACnBA,EAAU,SAAWD,CACzB,CACJ,CACF,CACJ,EAEKD,IACHA,EAAY/D,EAAQ,OAAO,CACzB,KAAM,QACN,OAAQ,OACR,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,CAAK,CACtD,CAAC,EACDa,EAAK,OAAOkD,CAAS,EACrBlD,EAAK,aAAakD,EAAW/D,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CAAC,GAGvE8D,EAAc,QAAQ,CAAC,CAAE,SAAAhD,EAAU,MAAAkD,CAAM,IAAM,CACxBD,GAAW,OAAO,KACpC3C,GACCA,EAAK,OAAS,QAAUA,EAAK,WAAaN,CAC9C,GAGEiD,GAAW,OACT/D,EAAQ,KAAK,CACX,SAAAc,EACA,MAAO,CACLd,EAAQ,OAAO,CACb,KAAM,QACN,OAAQgE,EACR,KAAM,CAAE,UAAW,GAAM,OAAQ;AAAA,KAAS,CAC5C,CAAC,CACH,EACA,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,GAAO,CACxD,CAAC,CACH,CAEJ,CAAC,CACH,CACF,CACF,CAEA,SAASf,GACPH,EACA,CACA,MAAO,CACL,cAAe,kBACf,KAAKjC,EAAY,CACf,IAAIkD,EAAYlD,EAAK,MAAM,KACxBO,GACCA,EAAK,OAAS,UACdA,EAAK,OAAS,SACdA,EAAK,SAAW,MACpB,EAEM2C,aAAqBpB,KACzBoB,EAAY/D,EAAQ,OAAO,CACzB,KAAM,QACN,OAAQ,OACR,MAAO,CAAC,EACR,KAAM,CACJ,UAAW,GACX,OAAQ;AAAA,EACR,QAAS,GACX,CACF,CAAC,EACDa,EAAK,OAAOkD,CAAS,EACrBlD,EAAK,aAAakD,EAAW/D,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CAAC,GAGnE+D,IAAc,QAEhB,OAAO,QAAQjB,CAAO,EAAE,QAAQ,CAAC,CAACoB,EAAKC,CAAI,IAAM,CAC/C,IAAMrD,EAAWoD,IAAQ,QAAU,QAAU,IAAIA,IAEjDE,GAAgBL,EAAqBjD,EAAUqD,CAAI,CACrD,CAAC,CAEL,CACF,CACF,CAEA,SAASE,GAAmBxD,EAAmB,CAC7C,IAAMyD,EAAWzD,EAAK,MAAM,KACzBO,GAAuBA,EAAK,OAAS,QAAUA,EAAK,WAAa,OACpE,EAEA,GAAIkD,EAAU,CACZ,IAAMC,EAAgB,CAAC,eAAgB,cAAc,EAErDD,EAAS,MACN,OACElD,GACCA,EAAK,OAAS,QAAUmD,EAAc,SAASnD,EAAK,IAAI,CAC5D,EACC,QAASA,GAASA,EAAK,OAAO,CAAC,EAE9BkD,EAAS,MAAM,SAAW,GAC5BA,EAAS,OAAO,EAGtB,CAEA,SAASpB,IAAiC,CACxC,MAAO,CACL,cAAe,8BACf,KAAKrC,EAAY,CACf,IAAM2D,EAAW3D,EAAK,MAAM,KACzBO,GAAuBA,EAAK,OAAS,QAAUA,EAAK,WAAa,MACpE,EACIoD,IAEFA,EAAS,MACN,KACEpD,GACCA,EAAK,OAAS,QACdA,EAAK,OAAS,SACd,CAAC,6BAA8B,mBAAmB,EAAE,SAClDA,EAAK,KACP,CACJ,GACE,OAAO,EAGXoD,EAAS,MACN,KAAMpD,GAEHA,EAAK,OAAS,QACdA,EAAK,OAAS,eAEbA,EAAK,MAAM,WAAW,iBAAiB,GACtCA,EAAK,QAAU,oBAEpB,GACC,OAAO,EAGXoD,EAAS,MACN,KACEpD,GACCA,EAAK,OAAS,QACdA,EAAK,OAAS,eACdA,EAAK,QAAU,8BACnB,GACE,OAAO,EAGPoD,EAAS,MAAM,SAAW,GAC5BA,EAAS,OAAO,GAIpBH,GAAmBxD,CAAI,EAEvB,IAAM4D,EAAe5D,EAAK,MAAM,KAC7BO,GACCA,EAAK,OAAS,UACdA,EAAK,SAAW,8BACpB,EAEIqD,IACFJ,GAAmBI,CAAY,EAC3BA,EAAa,MAAM,SAAW,GAChCA,EAAa,OAAO,EAG1B,CACF,CACF,CAEA,SAASL,GACPL,EACAjD,EACAqD,EACA,CACA,IAAIO,EAAWX,EAAU,OAAO,KAC7B3C,GAAuBA,EAAK,OAAS,QAAUA,EAAK,WAAaN,CACpE,EAEK4D,GACC,OAAO,KAAKP,CAAI,EAAE,OAAS,IAC7BO,EAAW1E,EAAQ,KAAK,CACtB,SAAAc,EACA,KAAM,CAAE,QAAS,IAAK,OAAQ;AAAA,GAAO,CACvC,CAAC,EACDiD,EAAU,OAAOW,CAAQ,GAI7B,OAAO,QAAQP,CAAI,EAAE,QAAQ,CAAC,CAACD,EAAKvC,CAAK,IAAM,CAC7C,IAAMD,EAAO,KAAKwC,EAAI,QAAQ,MAAO,EAAE,IACjCS,EAAU3E,EAAQ,KAAK,CAC3B,KAAA0B,EACA,MAAAC,EACA,KAAM,CAAE,UAAW,EAAK,CAC1B,CAAC,EAEKC,EAAe8C,GAAU,MAAM,KAClCtD,GACCA,EAAK,OAAS,QAAUA,EAAK,OAASM,CAC1C,EAEAE,EAAeA,EAAa,YAAY+C,CAAO,EAAID,GAAU,OAAOC,CAAO,CAC7E,CAAC,CACH,CAEA,SAASpB,GACPT,EACA1D,EAGA,CACA,MAAO,CACL,cAAe,qBACf,KAAKyB,EAAY,CACf,OAAO,QAAQiC,CAAO,EAAE,QAAQ,CAAC,CAACoB,EAAKC,CAAI,IAAM,CAC/C,IAAIrD,EAAWoD,IAAQ,QAAU,QAAU,IAAIA,IAE/C,GAAIA,IAAQ,QAAS,CACnBpD,EAAW,SACX,IAAM8D,EAAYC,GAAgBhE,CAAI,EACtC,OAAO,QAAQsD,CAAI,EAAE,QAAQ,CAAC,CAACD,EAAKvC,CAAK,IAAM,CAC7C,IAAMD,EAAO,KAAKwC,EAAI,QAAQ,MAAO,EAAE,IACjCS,EAAU3E,EAAQ,KAAK,CAC3B,KAAA0B,EACA,MAAAC,EACA,KAAM,CAAE,UAAW,EAAK,CAC1B,CAAC,EAEKC,EAAegD,GAAW,OAAO,KACpCxD,GACCA,EAAK,OAAS,QAAUA,EAAK,OAASM,CAC1C,EAMItC,EAAQ,iBACNwC,EACFA,EAAa,YAAY+C,CAAO,EAEhCC,GAAW,OAAOD,CAAO,EAGtB/C,GACHgD,GAAW,OAAOD,CAAO,CAG/B,CAAC,EACD,OAGF,IAAID,EAAW7D,EAAK,OAAO,KACxBO,GACCA,EAAK,OAAS,QAAUA,EAAK,WAAaN,CAC9C,EAEI,CAAC4D,GAAY,OAAO,KAAKP,CAAI,EAAE,OAAS,IAC1CO,EAAW1E,EAAQ,KAAK,CACtB,SAAAc,EACA,MAAO,CAAC,EACR,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,CAAK,CACtD,CAAC,EACDD,EAAK,OAAO6D,CAAQ,EACpB7D,EAAK,aAAa6D,EAAU1E,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CAAC,GAGtE,OAAO,QAAQmE,CAAI,EAAE,QAAQ,CAAC,CAACD,EAAKvC,CAAK,IAAM,CAC7C,IAAID,EAAO,KAAKwC,EAAI,QAAQ,MAAO,EAAE,IAGjCxC,IAAS,yBACXA,EAAO,aAGLoD,GAAgBnD,CAAK,IACvBA,EAAQ,OAAOA,MAGjB,IAAMgD,EAAU3E,EAAQ,KAAK,CAC3B,KAAA0B,EACA,MAAAC,EACA,KAAM,CAAE,UAAW,EAAK,CAC1B,CAAC,EACKC,EAAe8C,GAAU,MAAM,KAClCtD,GACCA,EAAK,OAAS,QAAUA,EAAK,OAASM,CAC1C,EAMItC,EAAQ,iBACNwC,EACFA,EAAa,YAAY+C,CAAO,EAEhCD,GAAU,OAAOC,CAAO,EAGrB/C,GACH8C,GAAU,OAAOC,CAAO,CAG9B,CAAC,CACH,CAAC,CACH,CACF,CACF,CAEA,SAASnB,GAAkBV,EAAoD,CAC7E,MAAO,CACL,cAAe,eACf,KAAKjC,EAAY,CAEf,IAAMkE,EAAY,MAAM,KACtB,IAAI,IACF,OAAO,KAAKjC,CAAO,EAAE,QAASoB,GAC5B,OAAO,KAAKpB,EAAQoB,CAA2B,GAAK,CAAC,CAAC,CACxD,CACF,CACF,EAEA,GAAI,CAACa,EAAU,OACb,OAGF,IAAMH,EAAYC,GAAgBhE,CAAI,EAEhCmE,EAAgBJ,EAAU,OAAO,OACpCxD,GACCA,EAAK,OAAS,QAAUA,EAAK,KAAK,WAAW,IAAI,CACrD,EAEA,QAAW6D,KAAYF,EAAW,CAChC,IAAMpD,EAAQ,OAAO,OAAOmB,CAAO,EAAE,KAAMqB,GAASA,EAAKc,CAAQ,CAAC,IAChEA,CACF,EAEA,GAAI,CAACtD,EACH,SAGF,GAAIsD,IAAa,SAAU,CACzB,IAAMC,EAAkB,CACtB,GAAI,4BACJ,GAAI,4BACJ,GAAI,gBACJ,GAAI,2BACN,EACA,OAAW,CAAChB,EAAKvC,CAAK,IAAK,OAAO,QAAQuD,CAAe,EAAG,CAC1D,IAAMC,EAAanF,EAAQ,KAAK,CAC9B,KAAM,YAAYkE,IAClB,MAAAvC,EACA,KAAM,CAAE,UAAW,EAAK,CAC1B,CAAC,EAECiD,GAAW,OAAO,KACfxD,GACCA,EAAK,OAAS,QAAUA,EAAK,OAAS+D,EAAW,IACrD,GAIFP,GAAW,OAAOO,CAAU,EAE9B,SAGF,IAAIzD,EACFoD,GAAgBnD,CAAK,GAAKyD,GAAazD,CAAK,EACxC,WAAWsD,EAAS,QAAQ,MAAO,EAAE,IACrC,KAAKA,EAAS,QAAQ,MAAO,EAAE,IACjCvD,IAAS,+BACXA,EAAO,mBAGT,IAAI2D,EAAY,SAASJ,KACrBvD,IAAS,oBACX2D,EAAY,kBAGd,IAAMF,EAAanF,EAAQ,KAAK,CAC9B,KAAA0B,EACA,MAAO2D,EACP,KAAM,CAAE,UAAW,EAAK,CAC1B,CAAC,EACoBT,GAAW,OAAO,KACpCxD,GACCA,EAAK,OAAS,QAAUA,EAAK,OAAS+D,EAAW,IACrD,IAEMH,GAAe,OACjBJ,GAAW,YACTI,EAAcA,EAAc,OAAS,CAAC,EACtCG,CACF,EAEAP,GAAW,OAAOO,CAAU,GAIpC,CACF,CACF,CAEA,SAASN,GAAgBhE,EAAoB,CAC3C,IAAI+D,EAAY/D,EAAK,MAAM,KACxBO,GACCA,EAAK,OAAS,UACdA,EAAK,OAAS,SACdA,EAAK,SAAW,QACpB,EAEA,OAAKwD,IACHA,EAAY5E,EAAQ,OAAO,CACzB,KAAM,QACN,OAAQ,SACR,MAAO,CAAC,EACR,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,CAAK,CACtD,CAAC,EACDa,EAAK,OAAO+D,CAAS,EACrB/D,EAAK,aAAa+D,EAAW5E,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CAAC,GAGhE4E,CACT,CAEA,SAAStB,GAAiB,CAAE,OAAApC,CAAO,EAAuB,CACxD,MAAO,CACL,cAAe,qBACf,KAAKL,EAAY,CAMf,GAAI,CALkBA,EAAK,MAAM,KAC9BO,GACCA,EAAK,OAAS,UAAYA,EAAK,OAAS,gBAC5C,EAEoB,CAElB,IAAMkE,EAAczE,EAAK,MAAM,OAC5BO,GACCA,EAAK,OAAS,UAAYA,EAAK,OAAS,QAC5C,EAEMmE,EAAcvF,EAAQ,OAAO,CACjC,KAAM,iBACN,OAAAkB,EACA,KAAM,CAAE,UAAW,GAAM,OAAQ;AAAA,CAAK,CACxC,CAAC,EAED,GAAIoE,EAAY,OAAS,EAAG,CAE1B,IAAME,EAAaF,EAAYA,EAAY,OAAS,CAAC,EACrDzE,EAAK,YAAY2E,EAAYD,CAAW,OAGxC1E,EAAK,YAAYA,EAAK,MAAM,CAAC,EAAG0E,CAAW,EAG7C1E,EAAK,aAAa0E,EAAavF,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CAAC,EAE3E,CACF,CACF,CAEA,SAASqD,GAAgB,CAAE,OAAAnC,CAAO,EAAuB,CACvD,MAAO,CACL,cAAe,oBACf,KAAKL,EAAY,CACf,IAAMyE,EAAczE,EAAK,MAAM,OAC5BO,GACCA,EAAK,OAAS,UAAYA,EAAK,OAAS,QAC5C,EAGMqE,EAAoB5E,EAAK,MAAM,KAClCO,GACCA,EAAK,OAAS,UAAYA,EAAK,OAAS,gBAC5C,EAOA,GAAI,CAJckE,EAAY,KAC3BlE,GAASA,EAAK,OAAO,QAAQ,QAAS,EAAE,IAAMF,CACjD,EAEgB,CACd,IAAMwE,EAAa1F,EAAQ,OAAO,CAChC,KAAM,SACN,OAAQ,IAAIkB,KACZ,KAAM,CAAE,UAAW,GAAM,OAAQ;AAAA,CAAK,CACxC,CAAC,EAED,GAAIoE,EAAY,OAAS,EAAG,CAE1B,IAAME,EAAaF,EAAYA,EAAY,OAAS,CAAC,EACrDzE,EAAK,YAAY2E,EAAYE,CAAU,OAC9BD,GAET5E,EAAK,aAAa4E,EAAmBC,CAAU,EAC/C7E,EAAK,aACH4E,EACAzF,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CACzC,IAGAa,EAAK,QAAQ6E,CAAU,EACvB7E,EAAK,YAAY6E,EAAY1F,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CAAC,GAG3E,CACF,CACF,CAEA,SAASyD,GACPkC,EACA,CACA,MAAO,CACL,cAAe,yBACf,KAAK9E,EAAY,CACf,GAAI,CAAC8E,GAAgB,QACnB,OAIF,IAAMC,EADYC,GAAahF,CAAI,IACP,SAAW,IAAM,IAEvCiF,EAAcjF,EAAK,MAAM,OAC5BO,GACCA,EAAK,OAAS,UAAYA,EAAK,OAAS,QAC5C,EAEM2E,EACJD,EAAYA,EAAY,OAAS,CAAC,GAAKjF,EAAK,MAAM,CAAC,EAErD,QAAWmF,KAAUL,EAAe,QAAS,CAC3C,IAAMM,EAAaD,EAAO,QAAQ,0BAA2B,EAAE,EAG/D,GACEF,EAAY,KAAM1E,GACTA,EAAK,OAAO,QAAQ,QAAS,EAAE,IAAM6E,CAC7C,EAED,SAGF,IAAMC,EAAalG,EAAQ,OAAO,CAChC,KAAM,SACN,OAAQ,GAAG4F,IAAQK,IAAaL,IAChC,KAAM,CAAE,UAAW,GAAM,OAAQ;AAAA,CAAK,CACxC,CAAC,EACD/E,EAAK,YAAYkF,EAAgBG,CAAU,EAC3CrF,EAAK,aAAaqF,EAAYlG,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CAAC,EAE1E,CACF,CACF,CAEA,SAAS2D,GACPgC,EACA,CACA,MAAO,CACL,cAAe,mCACf,KAAK9E,EAAY,CACf,GAAI,CAAC8E,GAAgB,OAAO,QAAQ,UAClC,OAGF,IAAMf,EAAYC,GAAgBhE,CAAI,EAChCsF,EAAwBvB,EAAU,OAAO,OAC5CxD,GACCA,EAAK,OAAS,UAAYA,EAAK,OAAS,WAC5C,EAEMgF,EAAsBxD,EAAE,OAC5BA,EAAE,OAAO,EACTA,EAAE,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,CACjC,EAEA,OAAW,CAACyD,EAAcC,CAAa,IAAK,OAAO,QACjDX,EAAe,MAAM,OAAO,SAC9B,EAAG,CACD,GAAI,OAAOU,GAAiB,SAC1B,SAGF,IAAME,EAAsBH,EAAoB,UAAUE,CAAa,EAMvE,GAJI,CAACC,EAAoB,SAKvBJ,GAAuB,KACpB/E,GACCA,EAAK,OAAS,UACdA,EAAK,OAAS,aACdA,EAAK,SAAWiF,CACpB,EAEA,SAGF,IAAMG,EAAexG,EAAQ,OAAO,CAClC,KAAM,YACN,OAAQqG,EACR,MAAO,CAAC,EACR,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,GAAO,CACxD,CAAC,EAED,OAAW,CAACnC,EAAKuC,CAAM,IAAK,OAAO,QAAQF,EAAoB,IAAI,EAAG,CACpE,IAAMjE,EAAOtC,EAAQ,KAAK,CACxB,SAAUkE,EACV,MAAO,OAAO,QAAQuC,CAAM,EAAE,IAAI,CAAC,CAACvC,EAAKvC,CAAK,IAC5C3B,EAAQ,KAAK,CACX,KAAMkE,EACN,MAAAvC,EACA,KAAM,CAAE,UAAW,GAAM,OAAQ;AAAA,QAAY,QAAS,IAAK,CAC7D,CAAC,CACH,EACA,KAAM,CAAE,UAAW,GAAM,QAAS,IAAK,OAAQ;AAAA,KAAS,CAC1D,CAAC,EACD6E,EAAa,OAAOlE,CAAI,EAG1BsC,EAAU,OAAO4B,CAAY,EAC7B5B,EAAU,aACR4B,EACAxG,EAAQ,QAAQ,CAAE,KAAM,aAAc,CAAC,CACzC,EAEJ,CACF,CACF,CAEA,SAAS0D,GACPiC,EACA,CACA,MAAO,CACL,cAAe,mCACf,KAAK9E,EAAY,CACf,GAAI,CAAC8E,GAAgB,OAAO,QAAQ,UAClC,OAGF,IAAMf,EAAYC,GAAgBhE,CAAI,EAChC6F,EAAyB9B,EAAU,OAAO,OAC7CxD,GACCA,EAAK,OAAS,QAAUA,EAAK,KAAK,WAAW,YAAY,CAC7D,EAEMuF,EAAuB/D,EAC1B,OAAOA,EAAE,OAAO,EAAGA,EAAE,OAAO,CAAC,EAC7B,UAAU+C,EAAe,MAAM,OAAO,SAAS,EAClD,GAAKgB,EAAqB,QAI1B,OAAW,CAACzC,EAAKvC,CAAK,IAAK,OAAO,QAAQgF,EAAqB,IAAI,EAAG,CACpE,IAAMjF,EAAO,aAAawC,IAC1B,GACEwC,GAAwB,KACrBtF,GAAsCA,EAAK,OAASM,CACvD,EAEA,SAGF,IAAMkF,EAAgB5G,EAAQ,KAAK,CACjC,KAAA0B,EACA,MAAAC,EACA,KAAM,CAAE,UAAW,GAAM,QAAS,KAAM,OAAQ;AAAA,GAAO,CACzD,CAAC,EACDiD,EAAU,OAAOgC,CAAa,EAElC,CACF,CACF,CAEA,SAASf,GAAahF,EAAiC,CAIrD,OAHkBA,EAAK,MAAM,CAAC,EACR,SAAS,EAEvB,SAAS,GAAG,EACX,SAEF,QACT,CAEO,SAASiE,GAAgBnD,EAAe,CAC7C,GACEA,EAAM,WAAW,KAAK,GACtBA,EAAM,WAAW,KAAK,GACtBA,EAAM,WAAW,GAAG,GACpBA,EAAM,WAAW,OAAO,EAExB,MAAO,GAGT,IAAMkF,EAASlF,EAAM,MAAM,GAAG,EAE9B,OACEkF,EAAO,SAAW,GAClBA,EAAO,MAAM,EAAG,CAAC,EAAE,MAAOC,GAAUA,EAAM,SAAS,GAAG,CAAC,CAE3D,CAEO,SAAS1B,GAAazD,EAAe,CAC1C,OACEA,EAAM,WAAW,KAAK,GACtBA,EAAM,WAAW,KAAK,GACtBA,EAAM,WAAW,GAAG,GACpBA,EAAM,WAAW,OAAO,CAE5B,CCr4BA,OAAS,UAAAoF,OAAc,YAEvB,eAAsBC,GACpBC,EACA,CAAE,aAAAC,CAAa,EAAgC,CAC7C,aAAc,EAChB,EACmD,CACnD,IAAMC,EAAiB,MAAMJ,GAAO,CAAE,aAAc,GAAM,IAAKE,CAAU,CAAC,EAE1E,GAAIE,IAAmB,aAAc,MAAO,OAC5C,GAAIA,IAAmB,SAAU,MAAO,OACxC,GAAIA,IAAmB,MAAO,MAAO,MACrC,GAAIA,IAAmB,OAAQ,MAAO,OACtC,GAAI,CAACD,EACH,OAAOC,GAAkB,MAI3B,IAAMC,EAAY,QAAQ,IAAI,uBAAyB,GAEvD,OAAIA,EAAU,WAAW,MAAM,EACtB,OAGLA,EAAU,WAAW,MAAM,EACtB,OAGLA,EAAU,WAAW,KAAK,EACrB,MAGF,KACT,CC5BA,OAAS,SAAAC,OAAa,QACtB,OAAOC,OAAa,UAEpB,eAAsBC,EACpBC,EACAC,EACAtH,EACAf,EAGA,CAIA,GAHAoI,EAAe,MAAM,KAAK,IAAI,IAAIA,CAAY,CAAC,EAC/CC,EAAkB,MAAM,KAAK,IAAI,IAAIA,CAAe,CAAC,EAEjD,CAACD,GAAc,QAAU,CAACC,GAAiB,OAC7C,OAGFrI,EAAU,CACR,OAAQ,GACR,GAAGA,CACL,EAEA,IAAMsI,EAAsBnI,EAAQ,2BAA4B,CAC9D,OAAQH,EAAQ,MAClB,CAAC,GAAG,MAAM,EACJ+H,EAAiB,MAAMH,GAAkB7G,EAAO,cAAc,GAAG,EAGnEwH,EAAO,GACX,GAAIC,GAAuBzH,CAAM,GAAKgH,IAAmB,MACvD,GAAI/H,EAAQ,OACVuI,EAAO,YACF,CACLD,EAAoB,eAAe,EACnClI,EAAO,KACL;AAAA;AAAA;AAAA,CACF,EACA,IAAMqI,EAAe,MAAMP,GAAQ,CACjC,CACE,KAAM,SACN,KAAM,OACN,QAAS,iCACT,QAAS,CACP,CAAE,MAAO,cAAe,MAAO,OAAQ,EACvC,CAAE,MAAO,yBAA0B,MAAO,kBAAmB,CAC/D,CACF,CACF,CAAC,EAEGO,IACFF,EAAOE,EAAa,MAK1BH,GAAqB,MAAM,EAEvBF,GAAc,QAChB,MAAMH,GACJF,EACA,CACEA,IAAmB,MAAQ,UAAY,MACvC,GAAIA,IAAmB,OAASQ,EAAO,CAAC,KAAKA,GAAM,EAAI,CAAC,EACxD,GAAIR,IAAmB,OACnBK,EAAa,IAAKM,GAAQ,OAAOA,GAAK,EACtCN,CACN,EACA,CACE,IAAKrH,EAAO,cAAc,GAC5B,CACF,EAGEsH,GAAiB,QACnB,MAAMJ,GACJF,EACA,CACEA,IAAmB,MAAQ,UAAY,MACvC,GAAIA,IAAmB,OAASQ,EAAO,CAAC,KAAKA,GAAM,EAAI,CAAC,EACxD,KACA,GAAIR,IAAmB,OACnBM,EAAgB,IAAKK,GAAQ,OAAOA,GAAK,EACzCL,CACN,EACA,CACE,IAAKtH,EAAO,cAAc,GAC5B,CACF,EAGFuH,GAAqB,QAAQ,CAC/B,CAEA,SAASE,GAAuBzH,EAAgB,CAC9C,IAAMgD,EAAcC,GAAejD,EAAO,cAAc,IAAK,EAAK,EAElE,GAAI,CAACgD,GAAa,cAAc,MAC9B,MAAO,GAGT,IAAM4E,EAAa,kCAAkC,KACnD5E,EAAY,aAAa,KAC3B,EACM6E,EACJ7E,EAAY,aAAa,kBAAkB,GAAG,WAAW,GAAG,EAE9D,OAAO4E,GAAcC,CACvB,CClHA,OAAS,cAAAC,GAAY,YAAYrJ,OAAU,KAC3C,OAAS,UAAAsJ,OAAc,KACvB,OAAOvJ,GAAQ,YAAAwJ,OAAgB,OCF/B,OAAS,YAAYvJ,OAAU,KAC/B,OAAS,UAAAsJ,OAAc,KACvB,OAAOvJ,OAAU,OCAjB,OAAqB,cAAAyJ,OAAkB,WAGhC,IAAMpF,GAAgC,MAAO,CAClD,WAAAqF,EACA,OAAAlI,EACA,UAAAmI,CACF,KAEMnI,EAAO,UAAU,cAAgB,CAACmI,GAAW,cAqBjDD,EAAW,qBAAqBD,GAAW,aAAa,EAAE,QAAShH,GAAS,CAC1E,IAAMO,EAAQP,EAAK,QAAQ,EAC3B,GAAIO,EAAO,CACT,IAAM4G,EAAwBC,GAC5B7G,EAAM,QAAQ,KAAM,EAAE,EACtB2G,EAAU,YACZ,EACAlH,EAAK,gBAAgB,IAAImH,EAAsB,KAAK,IAAI,EAE5D,CAAC,EAEMF,GA+DF,SAASI,GAAeC,EAAsC,CACnE,GAAI,CAACA,EAAU,SAAS,GAAG,GAAK,CAACA,EAAU,SAAS,GAAG,EACrD,MAAO,CAAC,KAAMA,EAAW,IAAI,EAG/B,IAAMC,EAA2B,CAAC,EAE9B,CAACC,EAAMC,CAAK,EAAIH,EAAU,MAAM,GAAG,EAGvC,GAAI,CAACE,EAAK,SAAS,GAAG,EACpB,MAAO,CAAC,KAAMA,EAAMC,CAAK,EAI3B,IAAMC,EAAQF,EAAK,MAAM,GAAG,EAGtB3H,EAAO6H,EAAM,IAAI,EAGjBC,EAAUD,EAAM,KAAK,GAAG,EAG9B,OAAAH,EAAM,KAAKI,GAAW,KAAM9H,GAAQ,KAAM4H,GAAS,IAAI,EAEhDF,CACT,CAEA,IAAMK,GAAW,CAAC,MAAO,QAAS,UAAW,eAAgB,OAAO,EAE7D,SAASR,GACd9H,EACAuI,EACA,CAEIvI,EAAM,SAAS,UAAU,IAC3BA,EAAQA,EAAM,QAAQ,WAAY,wBAAwB,GAI5D,IAAMwI,EAAaxI,EAAM,MAAM,GAAG,EAC5ByI,EAAY,IAAI,IAChBC,EAAW,IAAI,IACrB,QAASV,KAAaQ,EAAY,CAChC,GAAM,CAACH,EAASpH,EAAO0H,CAAQ,EAAIZ,GAAeC,CAAS,EACrDY,EAASN,GAAS,KAAMM,GAAW3H,GAAO,WAAW2H,CAAM,CAAC,EAClE,GAAI,CAACA,EAAQ,CACNH,EAAU,IAAIT,CAAS,GAC1BS,EAAU,IAAIT,CAAS,EAEzB,SAGF,IAAMa,EAAS5H,GAAO,QAAQ2H,EAAQ,EAAE,EACxC,GAAIC,GAAUA,KAAUN,EAAQ,MAAO,CACrCE,EAAU,IACR,CAACJ,EAAS,GAAGO,IAASL,EAAQ,MAAMM,CAAM,GAAG,EAC1C,OAAO,OAAO,EACd,KAAK,GAAG,GAAKF,EAAW,IAAIA,IAAa,GAC9C,EAEAD,EAAS,IACP,CAAC,OAAQL,EAAS,GAAGO,IAASL,EAAQ,KAAKM,CAAM,GAAG,EACjD,OAAO,OAAO,EACd,KAAK,GAAG,GAAKF,EAAW,IAAIA,IAAa,GAC9C,EACA,SAGGF,EAAU,IAAIT,CAAS,GAC1BS,EAAU,IAAIT,CAAS,EAI3B,MAAO,CAAC,GAAG,MAAM,KAAKS,CAAS,EAAG,GAAG,MAAM,KAAKC,CAAQ,CAAC,EAAE,KAAK,GAAG,EAAE,KAAK,CAC5E,CCtLO,IAAMI,EAAiB,CAC5B,OAAQ,CACN,KAAM,eACN,QAAS,eACT,OAAQ,cACV,EACA,MAAO,CACL,KAAM,wBACN,QAAS,wBACT,OAAQ,uBACV,CACF,ECRA,OAAqB,cAAApB,OAAkB,WAGvC,IAAMqB,GAAiB,SAEVC,GAA8B,MAAO,CAAE,WAAArB,EAAY,OAAAlI,CAAO,IAAM,CAE3E,GAAI,CAACA,EAAO,aAAe,EAAEA,EAAO,eAAeqJ,GACjD,OAAOnB,EAGT,IAAMsB,EAAgB,MAAMC,GAAiB,EACvCC,EAAgBJ,GAChBK,EAAgB3J,EAAO,YAE7B,GAAI0J,IAAkBC,EACpB,OAAOzB,EAGT,IAAI0B,EAA0B,CAAC,EAC/B,QAAWC,KAAqB3B,EAAW,sBAAsB,GAAK,CAAC,EACrE,GACE2B,EAAkB,mBAAmB,GAAG,QAAQ,IAChD,IAAIR,EAAeC,EAAc,EAAE,UAKrC,SAAWQ,KAAaD,EAAkB,gBAAgB,GAAK,CAAC,EAAG,CACjE,IAAME,EAAWD,EAAU,QAAQ,EAE7BE,EAAeR,EAAcO,CAAQ,IAAIJ,CAAa,EAExD,CAACK,GAAgBJ,EAAc,SAASI,CAAY,IAIxDJ,EAAc,KAAKI,CAAY,EAG/BF,EAAU,OAAO,EAGjB5B,EACG,qBAAqBD,GAAW,qBAAqB,EACrD,OAAQhH,GAASA,EAAK,eAAe,GAAG,QAAQ,IAAM8I,CAAQ,EAC9D,QAAS9I,GAASA,EAAK,eAAe,GAAG,gBAAgB+I,CAAY,CAAC,GAIvEH,EAAkB,gBAAgB,GAAG,SAAW,GAClDA,EAAkB,OAAO,EAI7B,GAAID,EAAc,OAAS,EAAG,CAC5B,IAAMK,EAAwB/B,EAAW,qBAAqB,CAC5D,gBACEmB,EAAeM,CAA4C,GAAG,OAChE,aAAcC,EAAc,IAAKM,IAAU,CACzC,KAAMA,CACR,EAAE,CACJ,CAAC,EAEIC,GAAcjC,CAAU,GAC3B+B,EAAsB,gBACpBA,EAAsB,QAAQ,EAAE,QAAQ,IAAK,EAAE,CACjD,EAIJ,OAAO/B,CACT,EAEA,SAASiC,GAAcjC,EAAwB,CAC7C,OACEA,EAAW,sBAAsB,IAAI,CAAC,GAAG,QAAQ,EAAE,SAAS,GAAG,GAAK,EAExE,CC9EO,IAAMkC,GAA+B,MAAO,CACjD,WAAAlC,EACA,OAAAlI,EACA,SAAAqK,CACF,IAAM,CAEJ,IAAMC,EAAc,IADGtK,EAAO,SAAS,OAAO,MAAM,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,cAG9DuK,EAAqBrC,EAAW,sBAAsB,EAE5D,GAAI,CAAC,CAAC,OAAQ,MAAO,OAAQ,KAAK,EAAE,SAASA,EAAW,aAAa,CAAC,EACpE,OAAOA,EAGT,QAAW2B,KAAqBU,EAAoB,CAClD,IAAMC,EAAkBC,GACtBZ,EAAkB,wBAAwB,EAC1C7J,EACAqK,CACF,EAEAR,EAAkB,mBAAmBW,CAAe,GAGhDF,IAAgBE,GAAmBA,IAAoB,gBACpCX,EAAkB,gBAAgB,EACzB,KAAMa,GAAMA,EAAE,QAAQ,IAAM,IAAI,GAE5Db,EAAkB,mBAChBS,IAAgBE,EACZA,EAAgB,QAAQF,EAAatK,EAAO,QAAQ,KAAK,EACzDA,EAAO,QAAQ,KACrB,EAKN,OAAOkI,CACT,EAEA,SAASuC,GACPD,EACAxK,EACAqK,EAAoB,GACpB,CAEA,GAAI,CAACG,EAAgB,WAAW,IAAI,GAAK,CAACH,EACxC,OAAOG,EAST,GALIH,GAAYG,EAAgB,WAAW,IAAI,IAC7CA,EAAkBA,EAAgB,QAAQ,OAAQ,sBAAsB,GAItE,CAACA,EAAgB,WAAW,aAAa,EAAG,CAE9C,IAAMG,EAAQ3K,EAAO,QAAQ,WAAW,MAAM,GAAG,EAAE,CAAC,EACpD,OAAOwK,EAAgB,QAAQ,OAAQ,GAAGG,IAAQ,EAGpD,OAAIH,EAAgB,MAAM,wBAAwB,EACzCA,EAAgB,QACrB,yBACAxK,EAAO,QAAQ,IAAM,GAAGA,EAAO,QAAQ,eACzC,EAIAA,EAAO,QAAQ,YACfwK,EAAgB,MAAM,gCAAgC,EAE/CA,EAAgB,QACrB,iCACAxK,EAAO,QAAQ,UACjB,EAGEA,EAAO,QAAQ,KAAOwK,EAAgB,MAAM,yBAAyB,EAChEA,EAAgB,QACrB,0BACAxK,EAAO,QAAQ,GACjB,EAIAA,EAAO,QAAQ,OACfwK,EAAgB,MAAM,2BAA2B,EAE1CA,EAAgB,QACrB,4BACAxK,EAAO,QAAQ,KACjB,EAGKwK,EAAgB,QACrB,sBACAxK,EAAO,QAAQ,UACjB,CACF,CCtGA,OAAS,wBAAA4K,OAA4B,cACrC,OAAwB,SAAAC,OAAa,gBAErC,OAAOC,OAAyB,qCAChC,UAAYC,OAAY,SAUxB,IAAMC,GAA+B,CACnC,WAAY,SACZ,4BAA6B,GAC7B,2BAA4B,GAC5B,UAAW,EACX,OAAQ,GACR,QAAS,CACP,kBACA,SACA,sBACA,yBACA,kBACA,mBACA,UACA,oBACA,gBACA,gBACA,oBACA,sBACA,eACA,eACA,mBACA,aACA,4BACA,mBACA,mBACA,uBACA,mBACA,CACE,mBACA,CACE,SAAU,SACZ,CACF,EACA,CACE,iBACA,CACE,WAAY,MACd,CACF,EACA,mBACA,gBACA,cACA,aACA,KACF,CACF,EAEaC,GAAoC,MAAO,CACtD,WAAA/C,EACA,OAAAlI,CACF,IAAM,CACJ,IAAMK,EAAS6H,EAAW,YAAY,EAEtC,GAAIlI,EAAO,IACT,OAAOK,EAGT,IAAM6K,EAAa,SAAM7K,EAAQ,CAC/B,OAAQ,CACN,MAAQ8K,GACCN,GAAMM,EAAMH,EAAa,CAEpC,CACF,CAAC,EAEKI,EAASR,GAAqBM,EAAK7K,EAAQ,CAC/C,cAAe,GACf,KAAM,GACN,IAAK,GACL,QAAS,CAACyK,EAAmB,EAC7B,WAAY,EACd,CAAC,EAED,GAAI,CAACM,GAAU,CAACA,EAAO,IACrB,MAAM,IAAI,MAAM,yBAAyB,EAG3C,OAAc,SAAMA,EAAO,GAAG,EAAE,IAClC,EC7FA,OAAS,cAAAnD,OAAkB,WAE3B,IAAMoD,GAAiB,wBAEVC,GAA4B,MAAO,CAAE,WAAApD,EAAY,OAAAlI,CAAO,IAAM,CACzE,GAAIA,EAAO,IACT,OAAOkI,EAIT,IAAMqD,EAAQrD,EAAW,oBAAoBD,GAAW,mBAAmB,EAC3E,OAAIsD,GAASF,GAAe,KAAKE,EAAM,QAAQ,CAAC,GAC9CA,EAAM,OAAO,EAGRrD,CACT,ENPA,OAAS,WAAAsD,GAAS,cAAAC,OAAmC,WOTrD,OAAS,cAAAxD,MAAkB,WAQpB,IAAMyD,GAAmC,MAAO,CACrD,WAAAxD,EACA,OAAAlI,CACF,IAAM,CACJ,GAAI,CAACA,EAAO,UAAU,OACpB,OAAOkI,EAET,IAAMxE,EAAkB,MAAMiI,EAAoC3L,CAAM,EAGxE,OAAAkI,EACG,qBAAqBD,EAAW,cAAc,EAC9C,OAAQhH,GAASA,EAAK,cAAc,EAAE,QAAQ,IAAM,KAAK,EACzD,QAASA,GAAS,CAEjB,GAAIA,EAAK,aAAa,EAAE,CAAC,GAAG,OAAOgH,EAAW,aAAa,EAAG,CAC5D,IAAM2D,EAAoB3K,EAAK,aAAa,EAAE,CAAC,EAC3C2K,GACFA,EAAkB,gBAChB,IAAIC,EACFD,EAAkB,QAAQ,GAAG,QAAQ,OAAQ,EAAE,EAC/C5L,EAAO,SAAS,OAChB0D,CACF,IACF,EAKAzC,EAAK,aAAa,EAAE,CAAC,GAAG,OAAOgH,EAAW,uBAAuB,GACnEhH,EACG,aAAa,EAAE,CAAC,GACf,qBAAqBgH,EAAW,kBAAkB,EACnD,KAAMhH,GAASA,EAAK,QAAQ,IAAM,UAAU,GAC3C,qBAAqBgH,EAAW,kBAAkB,EACnD,QAAShH,GAAS,CACjBA,EACG,qBAAqBgH,EAAW,kBAAkB,EAClD,QAAShH,GAAS,CACjB,IAAM8H,EAAa9H,EAAK,qBACtBgH,EAAW,aACb,EACIc,GACFA,GAAY,gBACV,IAAI8C,EACF9C,EAAW,QAAQ,GAAG,QAAQ,OAAQ,EAAE,EACxC/I,EAAO,SAAS,OAChB0D,CACF,IACF,CAEJ,CAAC,CACL,CAAC,CAEP,CAAC,EAGHwE,EAAW,qBAAqBD,EAAW,YAAY,EAAE,QAAShH,GAAS,CACzE,GAAIA,EAAK,QAAQ,IAAM,YAAa,CAElC,GAAIA,EAAK,eAAe,GAAG,OAAOgH,EAAW,aAAa,EAAG,CAC3D,IAAMzG,EAAQP,EAAK,eAAe,EAC9BO,GACFA,EAAM,gBACJ,IAAIqK,EACFrK,EAAM,QAAQ,GAAG,QAAQ,OAAQ,EAAE,EACnCxB,EAAO,SAAS,OAChB0D,CACF,IACF,EAKJ,GAAIzC,EAAK,eAAe,GAAG,OAAOgH,EAAW,aAAa,EAAG,CAE3D,IAAM6D,EAAiB7K,EACpB,eAAe,GACd,qBAAqBgH,EAAW,cAAc,EAC/C,KAAMhH,GAASA,EAAK,cAAc,EAAE,QAAQ,IAAM,IAAI,EACrD6K,GAEFA,EAAe,aAAa,EAAE,QAAS7K,GAAS,EAE5CA,EAAK,OAAOgH,EAAW,qBAAqB,GAC5ChH,EAAK,OAAOgH,EAAW,gBAAgB,IAEvChH,EACG,kBAAkBgH,EAAW,aAAa,EAC1C,QAAShH,GAAS,CACjBA,EAAK,gBACH,IAAI4K,EACF5K,EAAK,QAAQ,GAAG,QAAQ,OAAQ,EAAE,EAClCjB,EAAO,SAAS,OAChB0D,CACF,IACF,CACF,CAAC,EAGDzC,EAAK,OAAOgH,EAAW,aAAa,GACtChH,EAAK,gBACH,IAAI4K,EACF5K,EAAK,QAAQ,GAAG,QAAQ,OAAQ,EAAE,EAClCjB,EAAO,SAAS,OAChB0D,CACF,IACF,CAEJ,CAAC,GAMHzC,EAAK,QAAQ,IAAM,cACjBA,EAAK,eAAe,GAAG,OAAOgH,EAAW,aAAa,GACxDhH,EACG,qBAAqBgH,EAAW,kBAAkB,EAClD,QAAShH,GAAS,CACjB,GAAIA,EAAK,eAAe,GAAG,OAAOgH,EAAW,cAAc,EAAG,CAC5D,IAAM6D,EAAiB7K,EAAK,qBAC1BgH,EAAW,cACb,EACI6D,GAEFA,EAAe,aAAa,EAAE,QAASC,GAAQ,CACzCA,EAAI,OAAO9D,EAAW,qBAAqB,GAC7C8D,EACG,kBAAkB9D,EAAW,aAAa,EAC1C,QAAShH,GAAS,CACjBA,EAAK,gBACH,IAAI4K,EACF5K,EAAK,QAAQ,GAAG,QAAQ,OAAQ,EAAE,EAClCjB,EAAO,SAAS,OAChB0D,CACF,IACF,CACF,CAAC,EAGDqI,EAAI,OAAO9D,EAAW,aAAa,GACrC8D,EAAI,gBACF,IAAIF,EACFE,EAAI,QAAQ,GAAG,QAAQ,OAAQ,EAAE,EACjC/L,EAAO,SAAS,OAChB0D,CACF,IACF,CAEJ,CAAC,EAIL,GAAIzC,EAAK,eAAe,GAAG,OAAOgH,EAAW,aAAa,GACpDhH,EAAK,QAAQ,IAAM,UAAW,CAChC,IAAM8H,EAAa9H,EAAK,eAAe,EACnC8H,GACFA,EAAW,gBACT,IAAI8C,EACF9C,EAAW,QAAQ,GAAG,QAAQ,OAAQ,EAAE,EACxC/I,EAAO,SAAS,OAChB0D,CACF,IACF,EAIR,CAAC,CAGT,CAAC,EAEMwE,CACT,EAEO,SAAS2D,EACdtL,EACA4I,EAAiB,GACjBzF,EACA,CACA,OAAIA,IAAoB,KACfnD,EACJ,MAAM,GAAG,EACT,IAAKgI,GAAc,CAClB,GAAM,CAACK,EAASpH,EAAO0H,CAAQ,EAAIZ,GAAeC,CAAS,EAC3D,OAAIK,EACKM,EACH,GAAGN,KAAWO,IAAS3H,KAAS0H,IAChC,GAAGN,KAAWO,IAAS3H,IAEpB0H,EACH,GAAGC,IAAS3H,KAAS0H,IACrB,GAAGC,IAAS3H,GAEpB,CAAC,EACA,KAAK,GAAG,EAGNjB,EACJ,MAAM,GAAG,EACT,IAAKgI,GACJA,EAAU,QAAQ,GAAGY,IAAS,IAAM,EAChCZ,EACA,GAAGY,KAAUZ,EAAU,KAAK,GAClC,EACC,KAAK,GAAG,CACb,CP1LA,IAAMyD,GAAU,IAAIR,GAAQ,CAC1B,gBAAiB,CAAC,CACpB,CAAC,EAED,eAAeS,GAAqBC,EAAkB,CACpD,IAAMC,EAAM,MAAM1N,GAAG,QAAQD,GAAK,KAAKuJ,GAAO,EAAG,SAAS,CAAC,EAC3D,OAAOvJ,GAAK,KAAK2N,EAAKD,CAAQ,CAChC,CAEA,eAAsBE,GACpBC,EACAC,EAA8B,CAC5BlC,GACAkB,GACAzI,GACA6I,GACAnC,EACF,EACA,CACA,IAAMgD,EAAW,MAAMN,GAAqBI,EAAK,QAAQ,EACnDnE,EAAa8D,GAAQ,iBAAiBO,EAAUF,EAAK,IAAK,CAC9D,WAAYZ,GAAW,GACzB,CAAC,EAED,QAAWe,KAAeF,EACxB,MAAME,EAAY,CAAE,WAAAtE,EAAY,GAAGmE,CAAK,CAAC,EAG3C,OAAIA,EAAK,aACA,MAAMpB,GAAa,CACxB,WAAA/C,EACA,GAAGmE,CACL,CAAC,EAGInE,EAAW,QAAQ,CAC5B,CDjDA,OAAOf,OAAa,UACpB,OAAS,WAAAqE,GAAS,cAAAC,OAAkB,WACpC,OAAS,cAAAgB,OAAkB,iBAG3B,eAAsBC,GACpBC,EACA3M,EACAf,EAOA,CACA,GAAI,CAAC0N,GAAO,OACV,MAAO,CACL,aAAc,CAAC,EACf,aAAc,CAAC,EACf,aAAc,CAAC,CACjB,EAEF1N,EAAU,CACR,UAAW,GACX,MAAO,GACP,OAAQ,GACR,SAAU,GACV,GAAGA,CACL,EACA,IAAM2N,EAAsBxN,EAAQ,kBAAmB,CACrD,OAAQH,EAAQ,MAClB,CAAC,GAAG,MAAM,EAEJ,CAACO,EAAa2I,CAAS,EAAI,MAAM,QAAQ,IAAI,CACjD1I,EAAeO,EAAO,cAAc,GAAG,EACvC6M,GAAqB7M,EAAO,SAAS,SAAS,CAChD,CAAC,EAEG8M,EAAyB,CAAC,EAC1BC,EAAyB,CAAC,EAC1BC,EAAyB,CAAC,EAE9B,QAAWC,KAAQN,EAAO,CACxB,GAAI,CAACM,EAAK,QACR,SAGF,IAAIC,EAAWC,GAAgBF,EAAMjN,EAAQ,CAC3C,SAAUR,GAAa,SACvB,UAAWA,GAAa,UAAU,KAClC,WAAY4N,GACVT,EAAM,IAAKU,GAAMA,EAAE,IAAI,EACvBJ,EAAK,IACP,CACF,CAAC,EAED,GAAI,CAACC,EACH,SAGF,IAAMI,EAAWtF,GAASiF,EAAK,IAAI,EAC7BnG,EAAYtI,EAAK,QAAQ0O,CAAQ,EAElClN,EAAO,MACVkN,EAAWA,EAAS,QAAQ,UAAYK,GACtCA,IAAU,OAAS,OAAS,KAC9B,GAGF,IAAMC,EAAe1F,GAAWoF,CAAQ,EAGlCO,EAAU,MAAMrB,GACpB,CACE,SAAUa,EAAK,KACf,IAAKA,EAAK,QACV,OAAAjN,EACA,UAAAmI,EACA,aAAc,CAACnI,EAAO,IACtB,SAAUf,EAAQ,QACpB,EACA,CACEmL,GACAkB,GACAzI,GACA6I,GACAnC,EACF,CACF,EAGA,GAAIiE,EAAc,CAChB,IAAME,EAAsB,MAAMjP,GAAG,SAASyO,EAAU,OAAO,EACzD,CAACS,EAAoBC,CAAa,EAAI,MAAM,QAAQ,IAAI,CAC5DC,GAAyBH,CAAmB,EAC5CG,GAAyBJ,CAAO,CAClC,CAAC,EACD,GAAIE,IAAuBC,EAAe,CACxCZ,EAAa,KAAKxO,EAAK,SAASwB,EAAO,cAAc,IAAKkN,CAAQ,CAAC,EACnE,UAIJ,GAAIM,GAAgB,CAACvO,EAAQ,UAAW,CACtC2N,EAAoB,KAAK,EACrB3N,EAAQ,aACVA,EAAQ,YAAY,KAAK,EAE3B,GAAM,CAAE,UAAA6O,CAAU,EAAI,MAAM3G,GAAQ,CAClC,KAAM,UACN,KAAM,YACN,QAAS,YAAY7H,EAAY,KAC/BgO,CACF,iDACA,QAAS,EACX,CAAC,EAED,GAAI,CAACQ,EAAW,CACdd,EAAa,KAAKxO,EAAK,SAASwB,EAAO,cAAc,IAAKkN,CAAQ,CAAC,EAC/DjO,EAAQ,aACVA,EAAQ,YAAY,MAAM,EAE5B,SAEF2N,GAAqB,MAAM,EACvB3N,EAAQ,aACVA,EAAQ,YAAY,MAAM,EAKzB6I,GAAWhB,CAAS,GACvB,MAAMrI,GAAG,MAAMqI,EAAW,CAAE,UAAW,EAAK,CAAC,EAG/C,MAAMrI,GAAG,UAAUyO,EAAUO,EAAS,OAAO,EAC7CD,EACIT,EAAa,KAAKvO,EAAK,SAASwB,EAAO,cAAc,IAAKkN,CAAQ,CAAC,EACnEJ,EAAa,KAAKtO,EAAK,SAASwB,EAAO,cAAc,IAAKkN,CAAQ,CAAC,EAGzE,IAAMa,EAAW,CAAC,GAAGjB,EAAc,GAAGC,EAAc,GAAGC,CAAY,EAC7DgB,EAAe,MAAMC,GAAeF,EAAU/N,CAAM,EAkB1D,GAfA+M,EAAa,KAAK,GAAGiB,CAAY,EAGjCjB,EAAeA,EAAa,OAAQE,GAAS,CAACH,EAAa,SAASG,CAAI,CAAC,EAGrE,EADoBH,EAAa,QAAUC,EAAa,SACpC,CAACC,EAAa,QACpCJ,GAAqB,KAAK,mBAAmB,EAI/CE,EAAe,MAAM,KAAK,IAAI,IAAIA,CAAY,CAAC,EAC/CC,EAAe,MAAM,KAAK,IAAI,IAAIA,CAAY,CAAC,EAC/CC,EAAe,MAAM,KAAK,IAAI,IAAIA,CAAY,CAAC,EAE3CF,EAAa,QAMf,GALAF,GAAqB,QACnB,WAAWE,EAAa,UACtBA,EAAa,SAAW,EAAI,OAAS,UAEzC,EACI,CAAC7N,EAAQ,OACX,QAAWgO,KAAQH,EACjBzN,EAAO,IAAI,OAAO4N,GAAM,OAI5BL,GAAqB,KAAK,EAG5B,GAAIG,EAAa,SACf3N,EACE,WAAW2N,EAAa,UACtBA,EAAa,SAAW,EAAI,OAAS,WAEvC,CACE,OAAQ9N,EAAQ,MAClB,CACF,GAAG,KAAK,EACJ,CAACA,EAAQ,QACX,QAAWgO,KAAQF,EACjB1N,EAAO,IAAI,OAAO4N,GAAM,EAK9B,GAAID,EAAa,SACf5N,EACE,WAAW4N,EAAa,UACtBD,EAAa,SAAW,EAAI,OAAS,oEAEvC,CACE,OAAQ9N,EAAQ,MAClB,CACF,GAAG,KAAK,EACJ,CAACA,EAAQ,QACX,QAAWgO,KAAQD,EACjB3N,EAAO,IAAI,OAAO4N,GAAM,EAK9B,OAAKhO,EAAQ,QACXI,EAAO,MAAM,EAGR,CACL,aAAAyN,EACA,aAAAC,EACA,aAAAC,CACF,CACF,CAEO,SAASG,GACdF,EACAjN,EACAf,EAKA,CACA,GAAIgO,EAAK,OAAQ,CACf,GAAIA,EAAK,OAAO,WAAW,IAAI,EAC7B,OAAOzO,EAAK,KAAKwB,EAAO,cAAc,IAAKiN,EAAK,OAAO,QAAQ,KAAM,EAAE,CAAC,EAG1E,IAAIiB,EAASjB,EAAK,OAElB,OAAIA,EAAK,OAAS,kBAChBiB,EAASC,GAAkBD,EAAQjP,EAAQ,SAAS,EAChD,CAACiP,GACI,GAIJjP,EAAQ,SACXT,EAAK,KAAKwB,EAAO,cAAc,IAAK,MAAOkO,EAAO,QAAQ,OAAQ,EAAE,CAAC,EACrE1P,EAAK,KAAKwB,EAAO,cAAc,IAAKkO,EAAO,QAAQ,OAAQ,EAAE,CAAC,EAGpE,IAAMpH,EAAYsH,GAA2BnB,EAAMjN,CAAM,EAEnDqO,EAAeC,GAAsBrB,EAAK,KAAMnG,CAAS,EAC/D,OAAOtI,EAAK,KAAKsI,EAAWuH,CAAY,CAC1C,CAEA,SAASD,GACPnB,EACAjN,EACA,CACA,OAAIiN,EAAK,OAAS,cACTjN,EAAO,cAAc,GAG1BiN,EAAK,OAAS,eACTjN,EAAO,cAAc,IAG1BiN,EAAK,OAAS,kBAAoBA,EAAK,OAAS,qBAC3CjN,EAAO,cAAc,WAG1BiN,EAAK,OAAS,gBACTjN,EAAO,cAAc,MAGvBA,EAAO,cAAc,UAC9B,CAEO,SAASoN,GAAemB,EAAiBnF,EAAwB,CAEtE,IAAMoF,EAAkBD,EAAM,IAAKE,GAAMA,EAAE,QAAQ,MAAO,EAAE,CAAC,EACvDC,EAAmBtF,EAAO,QAAQ,MAAO,EAAE,EAG3CuF,EAAYD,EAAiB,MAAM,GAAG,EAAE,MAAM,EAAG,EAAE,EAAE,KAAK,GAAG,EAGnE,GAAI,CAACC,EACH,MAAO,GAIT,IAAMC,EAAiBD,EAAU,MAAM,GAAG,EAG1C,QAASjE,EAAIkE,EAAe,OAAQlE,EAAI,EAAGA,IAAK,CAC9C,IAAMmE,EAAWD,EAAe,MAAM,EAAGlE,CAAC,EAAE,KAAK,GAAG,EAKpD,GAHwB8D,EAAgB,KACrChQ,GAASA,IAASkQ,GAAoBlQ,EAAK,WAAWqQ,EAAW,GAAG,CACvE,EAEE,MAAO,IAAMA,EAKjB,MAAO,IAAMF,CACf,CAEO,SAASL,GACdpB,EACApG,EACQ,CAER,IAAMgI,EAAqB5B,EAAS,QAAQ,WAAY,EAAE,EACpD6B,EAAsBjI,EAAU,QAAQ,WAAY,EAAE,EAGtDkI,EAAeF,EAAmB,MAAM,GAAG,EAC3CG,EAAiBF,EAAoB,MAAM,GAAG,EAG9CG,EAAoBD,EAAeA,EAAe,OAAS,CAAC,EAC5DE,EAAiBH,EAAa,UACjCI,GAAYA,IAAYF,CAC3B,EAEA,OAAIC,IAAmB,GAEdH,EAAaA,EAAa,OAAS,CAAC,EAItCA,EAAa,MAAMG,EAAiB,CAAC,EAAE,KAAK,GAAG,CACxD,CAEA,eAAsBtB,GAAyBJ,EAAiB,CAC9D,OAAOA,EAAQ,QAAQ,QAAS;AAAA,CAAI,EAAE,KAAK,CAC7C,CAEO,SAASU,GACdD,EACAmB,EACA,CACA,GAAI,CAACA,EACH,MAAO,GAGT,GAAIA,IAAc,WAChB,OAAOnB,EAGT,GAAImB,IAAc,aAAc,CAC9B,IAAIjE,EAAS8C,EAAO,QAAQ,SAAU,QAAQ,EAC9C,OAAA9C,EAASA,EAAO,QAAQ,qBAAsB,IAAI,EAE3CA,EAGT,GAAIiE,IAAc,eAAgB,CAChC,IAAIjE,EAAS8C,EAAO,QAAQ,SAAU,aAAa,EACnD,OAAA9C,EAASA,EAAO,QAAQ,qBAAsB,IAAI,EAE3CA,EAGT,GAAIiE,IAAc,UAAW,CAC3B,IAAIjE,EAAS8C,EAAO,QAAQ,SAAU,qBAAqB,EAC3D,OAAA9C,EAASA,EAAO,QAAQ,qBAAsB,IAAI,EAE3CA,EAGT,MAAO,EACT,CAEA,eAAe6C,GAAeqB,EAAqBtP,EAAgB,CACjE,IAAMgM,EAAU,IAAIR,GAAQ,CAC1B,gBAAiB,CAAC,CACpB,CAAC,EACKhM,EAAc,MAAMC,EAAeO,EAAO,cAAc,GAAG,EAC3DuP,EAAW,MAAM9C,GAAWzM,EAAO,cAAc,GAAG,EACpDgO,EAAe,CAAC,EAEtB,GAAI,CAACxO,GAAe+P,EAAS,aAAe,SAC1C,MAAO,CAAC,EAGV,QAAWC,KAAYF,EAAW,CAChC,IAAMG,EAAejR,EAAK,QAAQwB,EAAO,cAAc,IAAKwP,CAAQ,EAGpE,GAAI,CAAC1H,GAAW2H,CAAY,EAC1B,SAGF,IAAMhC,EAAU,MAAMhP,GAAG,SAASgR,EAAc,OAAO,EAEjDtD,EAAM,MAAM1N,GAAG,QAAQD,EAAK,KAAKuJ,GAAO,EAAG,SAAS,CAAC,EACrDG,EAAa8D,EAAQ,iBACzBxN,EAAK,KAAK2N,EAAKnE,GAASyH,CAAY,CAAC,EACrChC,EACA,CACE,WAAYhC,GAAW,GACzB,CACF,EAGA,GAAI,CAAC,CAAC,OAAQ,MAAO,OAAQ,KAAK,EAAE,SAASvD,EAAW,aAAa,CAAC,EACpE,SAGF,IAAMqC,EAAqBrC,EAAW,sBAAsB,EAC5D,QAAW2B,KAAqBU,EAAoB,CAClD,IAAMC,EAAkBX,EAAkB,wBAAwB,EAGlE,GACErK,GAAa,aACb,CAACgL,EAAgB,WAAW,GAAGhL,EAAY,cAAc,EAEzD,SAKF,IAAMkQ,EAAyB,MAAMC,GACnCnF,EACA+E,CACF,EAEA,GAAI,CAACG,EACH,SAKF,IAAME,EAAyBC,GAC7BH,EACAJ,EACAtP,CACF,EAEA,GAAI,CAAC4P,EACH,SAIF,IAAME,EAAYC,GAChBH,EACA5P,EACAR,CACF,EAEI,CAACsQ,GAAaA,IAActF,IAIhCX,EAAkB,mBAAmBiG,CAAS,EAG9C,MAAMrR,GAAG,UAAUgR,EAAcvH,EAAW,YAAY,EAAG,OAAO,EAGlE8F,EAAa,KAAKwB,CAAQ,IAI9B,OAAOxB,CACT,CAOO,SAAS6B,GACdH,EACA/C,EACA3M,EACAgQ,EAAuB,CAAC,OAAQ,MAAO,MAAO,OAAQ,MAAM,EAC5D,CACA,IAAMC,EAAMzR,EAAK,UAAUwB,EAAO,cAAc,GAAG,EAG7CkQ,EAAgBvD,EAAM,IAAKU,GAAMA,EAAE,MAAM7O,EAAK,GAAG,EAAE,KAAKA,EAAK,MAAM,GAAG,CAAC,EACvE2R,EAAU,IAAI,IAAID,CAAa,EAG/BE,EAAY5R,EAAK,QAAQkR,CAAsB,EAC/CW,EAASD,IAAc,GACvBE,EAAUD,EACZX,EAAuB,MAAM,EAAG,CAACU,EAAU,MAAM,EACjDV,EAIEa,EADa/R,EAAK,SAASyR,EAAKK,CAAO,EAClB,MAAM9R,EAAK,GAAG,EAAE,KAAKA,EAAK,MAAM,GAAG,EAGxDgS,EAAUH,EAAS,CAACD,CAAS,EAAIJ,EAGjCS,EAAa,IAAI,IAGvB,QAAWC,KAAKF,EAAS,CACvB,IAAMG,EAAUL,EAAUI,EACpBE,EAAUpS,EAAK,MAAM,UAAUA,EAAK,SAASyR,EAAKU,CAAO,CAAC,GAC5DR,EAAQ,IAAIS,CAAO,GAAK9I,GAAW6I,CAAO,IAC5CF,EAAW,IAAIG,CAAO,EAGxB,IAAMC,EAASrS,EAAK,KAAK8R,EAAS,QAAQI,GAAG,EACvCI,EAAStS,EAAK,MAAM,UAAUA,EAAK,SAASyR,EAAKY,CAAM,CAAC,GAC1DV,EAAQ,IAAIW,CAAM,GAAKhJ,GAAW+I,CAAM,IAC1CJ,EAAW,IAAIK,CAAM,EAKzB,IAAMhQ,EAAOtC,EAAK,SAAS8R,CAAO,EAClC,QAAWjD,KAAK6C,EACVM,EAAQ,KAAME,GAAMrD,EAAE,SAAS,IAAIvM,IAAO4P,GAAG,CAAC,GAChDD,EAAW,IAAIpD,CAAC,EAKpB,OAAIoD,EAAW,OAAS,EAAU,KAGnB,MAAM,KAAKA,CAAU,EAAE,KAAK,CAACM,EAAGC,IAAM,CAEnD,IAAMC,EAAOzS,EAAK,MAAM,QAAQuS,CAAC,EAC3BG,EAAO1S,EAAK,MAAM,QAAQwS,CAAC,EAC3BG,EAAMX,EAAQ,QAAQS,CAAI,EAAIT,EAAQ,QAAQU,CAAI,EACxD,GAAIC,IAAQ,EAAG,OAAOA,EAEtB,IAAMC,EAAUb,GAAWQ,EAAE,WAAWR,CAAO,EAAI,GAAK,EAClDc,EAAUd,GAAWS,EAAE,WAAWT,CAAO,EAAI,GAAK,EACxD,OAAOa,EAAUC,CACnB,CAAC,EAGa,CAAC,CACjB,CAEO,SAAStB,GACd7C,EACAlN,EACAR,EACe,CACf,IAAM8R,EAAM9S,EAAK,UAAUA,EAAK,KAAKwB,EAAO,cAAc,IAAKkN,CAAQ,CAAC,EAIlEqE,EAAU,OAAO,QAAQvR,EAAO,aAAa,EAChD,OACC,CAAC,CAAC,CAAEU,CAAI,IAAMA,GAAQ4Q,EAAI,WAAW9S,EAAK,UAAUkC,EAAOlC,EAAK,GAAG,CAAC,CACtE,EACC,KAAK,CAACuS,EAAGC,IAAMA,EAAE,CAAC,EAAE,OAASD,EAAE,CAAC,EAAE,MAAM,EAE3C,GAAIQ,EAAQ,SAAW,EACrB,OAAO,KAET,GAAM,CAACC,EAAUC,CAAO,EAAIF,EAAQ,CAAC,EAGjCG,EAAMlT,EAAK,SAASiT,EAASH,CAAG,EAEpCI,EAAMA,EAAI,MAAMlT,EAAK,GAAG,EAAE,KAAK,GAAG,EAGlC,IAAMmT,EAAMnT,EAAK,MAAM,QAAQkT,CAAG,EAE5BE,EADW,CAAC,MAAO,OAAQ,MAAO,MAAM,EACrB,SAASD,CAAG,EAAI,GAAKA,EAC1CE,EAAQH,EAAI,MAAM,EAAGA,EAAI,OAASC,EAAI,MAAM,EAG5CE,EAAM,SAAS,QAAQ,IACzBA,EAAQA,EAAM,MAAM,EAAG,EAAgB,GAKzC,IAAMC,EACJN,IAAa,MACThS,EAAY,YACZQ,EAAO,QAAQwR,CAAuC,EAC5D,GAAI,CAACM,EACH,OAAO,KAGT,IAAIC,EAASF,IAAU,GAAK,GAAK,IAAIA,IAIrC,OAAAE,EAASA,EAAO,QAAQ,OAAQ,EAAE,EAI3B,GAAGD,IAAYC,IAASH,GACjC,CLjlBA,OAAS,KAAAnP,OAAS,MAElB,eAAsBuP,GACpBC,EACAjS,EACAf,EAMA,CACAA,EAAU,CACR,UAAW,GACX,OAAQ,GACR,aAAc,GACd,MAAO,QACP,GAAGA,CACL,EAEA,IAAMiT,EAAkB,MAAMC,GAAmBnS,CAAM,EACvD,OACEkS,GACAA,EAAgB,IAChBA,EAAgB,GAAG,cAAc,MAAQlS,EAAO,cAAc,IAEvD,MAAMoS,GAAuBH,EAAYjS,EAAQkS,EAAiB,CACvE,GAAGjT,EACH,SACEgT,GAAY,SAAW,GAAK,CAAC,CAACA,EAAW,CAAC,EAAE,MAAM,aAAa,CACnE,CAAC,EAGI,MAAMI,GAAqBJ,EAAYjS,EAAQf,CAAO,CAC/D,CAEA,eAAeoT,GACbJ,EACAjS,EACAf,EAMA,CACA,IAAMqT,EAAkBlT,EAAQ,qBAAsB,CACpD,OAAQH,EAAQ,MAClB,CAAC,GAAG,MAAM,EACJsT,EAAO,MAAMC,GAAyBP,EAAYjS,CAAM,EAE9D,GAAI,CAACuS,EACH,OAAAD,GAAiB,KAAK,EACfG,EAAY,IAAI,MAAM,2CAA2C,CAAC,EAE3EH,GAAiB,QAAQ,EAEzB,IAAM5O,EAAkB,MAAMiI,EAAoC3L,CAAM,EAExE,MAAM0S,GAAqBH,EAAK,UAAU,OAAQvS,EAAQ,CACxD,OAAQf,EAAQ,OAChB,gBAAAyE,CACF,CAAC,EAED,IAAMiP,EAAmB,MAAMC,GAAuBX,EAAYjS,CAAM,EACxE,MAAM0C,GAAc6P,EAAK,QAASvS,EAAQ,CACxC,yBAA0Bf,EAAQ,aAClC,OAAQA,EAAQ,OAChB,gBAAAyE,EACA,eAAgB6O,EAAK,UAAU,OAC/B,iBAAAI,EACA,UAAW1T,EAAQ,MAAQA,EAAQ,QAAU,QAAU,EACzD,CAAC,EAGD,MAAMa,GAAUyS,EAAK,IAAKvS,EAAQ,CAChC,OAAQf,EAAQ,MAClB,CAAC,EAED,MAAMmI,EAAmBmL,EAAK,aAAcA,EAAK,gBAAiBvS,EAAQ,CACxE,OAAQf,EAAQ,MAClB,CAAC,EACD,MAAMyN,GAAY6F,EAAK,MAAOvS,EAAQ,CACpC,UAAWf,EAAQ,UACnB,OAAQA,EAAQ,MAClB,CAAC,EAEGsT,EAAK,MACPlT,EAAO,KAAKkT,EAAK,IAAI,CAEzB,CAEA,eAAeH,GACbH,EACAjS,EACAkS,EACAjT,EAOA,CACA,IAAMqT,EAAkBlT,EAAQ,qBAAsB,CACpD,OAAQH,EAAQ,MAClB,CAAC,GAAG,MAAM,EACN4T,EAAgB,MAAMC,GAAqBb,EAAYjS,CAAM,EAC7DoL,EAAS,MAAM2H,GAAcF,CAAa,EACxCG,EAAUvQ,GAAE,MAAMwQ,CAAkB,EAAE,MAAM7H,CAAM,EACxD,GAAI,CAAC4H,EACH,OAAAV,GAAiB,KAAK,EACfG,EAAY,IAAI,MAAM,2CAA2C,CAAC,EAE3EH,GAAiB,QAAQ,EAEzB,IAAMY,EAAoBC,GAAqBH,CAAO,EAChDI,EAAuBC,GAAwB,EAE/CvG,EAAyB,CAAC,EAC1BC,EAAyB,CAAC,EAC1BC,EAAyB,CAAC,EAE1BsG,EAAclU,EAAQ,wBAAwB,GAAG,MAAM,EAE7D,QAAWmU,KAAaP,EAAS,CAC/B,IAAMrI,EAAQyI,EAAqB,IAAIG,EAAU,IAAI,EAC/CC,EAAiBN,EAAkB,IAAIK,EAAU,IAAI,EAG3D,GAAI,CAAC5I,EACH,SAKF,IAAI8I,EACFF,EAAU,OAAS,eAAiBC,GAAgB,OAAS,cACzDtB,EAAgB,GAChBlS,EAEA0D,EAAkB,MAAMiI,EAC5B8H,CACF,EAEMC,EAAgBtG,GACpBpN,EAAO,cAAc,IACrByT,EAAa,cAAc,EAC7B,EACME,EACH,MAAMC,GAAgBF,EAAeD,EAAa,cAAc,GAAG,GACpEA,EAAa,cAAc,IAc7B,GAXIF,EAAU,UAAU,SACtB,MAAMb,GAAqBa,EAAU,UAAU,OAAQE,EAAc,CACnE,OAAQ,GACR,gBAAA/P,CACF,CAAC,EACDqJ,EAAa,KACXvO,EAAK,SAASkV,EAAeD,EAAa,cAAc,cAAc,CACxE,GAIEF,EAAU,QAAS,CACrB,IAAMZ,EAAmB,MAAMC,GAAuBX,EAAYjS,CAAM,EACxE,MAAM0C,GAAc6Q,EAAU,QAASE,EAAc,CACnD,OAAQ,GACR,gBAAA/P,EACA,eAAgB6P,EAAU,UAAU,OACpC,iBAAAZ,CACF,CAAC,EACD5F,EAAa,KACXvO,EAAK,SAASkV,EAAeD,EAAa,cAAc,WAAW,CACrE,EAIEF,EAAU,MACZ,MAAMzT,GAAUyT,EAAU,IAAKE,EAAc,CAC3C,OAAQ,EACV,CAAC,EACD1G,EAAa,KACXvO,EAAK,SAASkV,EAAeD,EAAa,cAAc,WAAW,CACrE,GAIF,MAAMrM,EACJmM,EAAU,aACVA,EAAU,gBACVE,EACA,CACE,OAAQ,EACV,CACF,EAGA,IAAM9G,EAAQ,MAAMD,GAAY6G,EAAU,MAAOE,EAAc,CAC7D,UAAWxU,EAAQ,UACnB,OAAQ,GACR,YAAAqU,EACA,SAAUrU,EAAQ,QACpB,CAAC,EAED6N,EAAa,KACX,GAAGH,EAAM,aAAa,IAAKM,GACzBzO,EAAK,SAASkV,EAAelV,EAAK,KAAKmV,EAAa1G,CAAI,CAAC,CAC3D,CACF,EACAF,EAAa,KACX,GAAGJ,EAAM,aAAa,IAAKM,GACzBzO,EAAK,SAASkV,EAAelV,EAAK,KAAKmV,EAAa1G,CAAI,CAAC,CAC3D,CACF,EACAD,EAAa,KACX,GAAGL,EAAM,aAAa,IAAKM,GACzBzO,EAAK,SAASkV,EAAelV,EAAK,KAAKmV,EAAa1G,CAAI,CAAC,CAC3D,CACF,EAiBF,GAdAqG,GAAa,QAAQ,EAGrBxG,EAAa,KAAK,EAClBC,EAAa,KAAK,EAClBC,EAAa,KAAK,EAGd,EADoBF,EAAa,QAAUC,EAAa,SACpC,CAACC,EAAa,QACpC5N,EAAQ,oBAAqB,CAC3B,OAAQH,EAAQ,MAClB,CAAC,GAAG,KAAK,EAGP6N,EAAa,OAAQ,CACvB1N,EACE,WAAW0N,EAAa,UACtBA,EAAa,SAAW,EAAI,OAAS,WAEvC,CACE,OAAQ7N,EAAQ,MAClB,CACF,GAAG,QAAQ,EACX,QAAWgO,KAAQH,EACjBzN,EAAO,IAAI,OAAO4N,GAAM,EAI5B,GAAIF,EAAa,OAAQ,CACvB3N,EACE,WAAW2N,EAAa,UACtBA,EAAa,SAAW,EAAI,OAAS,WAEvC,CACE,OAAQ9N,EAAQ,MAClB,CACF,GAAG,KAAK,EACR,QAAWgO,KAAQF,EACjB1N,EAAO,IAAI,OAAO4N,GAAM,EAI5B,GAAID,EAAa,OAAQ,CACvB5N,EACE,WAAW4N,EAAa,UACtBD,EAAa,SAAW,EAAI,OAAS,0CAEvC,CACE,OAAQ9N,EAAQ,MAClB,CACF,GAAG,KAAK,EACR,QAAWgO,KAAQD,EACjB3N,EAAO,IAAI,OAAO4N,GAAM,EAG9B,CAEA,eAAe2F,GACbX,EACAjS,EACA,CACA,IAAI6S,EAAgB,MAAMC,GAAqBb,EAAYjS,CAAM,EAC7DoL,EAAS,MAAM2H,GAAcF,CAAa,EAG9C,OAFgBpQ,GAAE,MAAMwQ,CAAkB,EAAE,MAAM7H,CAAM,EAEzC,KACZmI,GACCA,EAAU,OAAS,kBAAoBA,EAAU,OAAS,gBAC9D,CACF,Cc9TA,OAAOM,OAAQ,KACf,OAAOrV,OAAU,OAQjB,OAAS,SAAA0I,MAAa,QACtB,OAAOzI,MAAQ,WACf,OAAO0I,OAAa,UACpB,OAAS,KAAA1E,OAAS,MAElB,IAAMqR,GACJ,uDAEWC,EAAY,CACvB,KAAM,OACN,gBAAiB,eACnB,EAEA,eAAsBC,GACpB/U,EAIA,CACAA,EAAU,CACR,OAAQ,GACR,GAAGA,CACL,EAEA,IAAIgV,EACFhV,EAAQ,UAAY8U,EAAU9U,EAAQ,QAAkC,EACnEA,EAAQ,SACT,OACFiV,EACFD,IAAaF,EAAU,KAAO,SAAW,cACvCI,EAAc,SAEZC,EACJnV,EAAQ,YAAY,SAAW,GAC/B,CAAC,CAACA,EAAQ,WAAW,CAAC,EAAE,MAAM,aAAa,EAE7C,GAAIA,EAAQ,YAAcmV,EACxB,GAAI,CACF,GAAM,CAAChJ,CAAM,EAAI,MAAM2H,GAAc9T,EAAQ,UAAU,EACjD,CAAE,KAAAoV,CAAK,EAAI5R,GACd,OAAO,CACN,KAAMA,GAAE,OAAO,CACb,YAAaA,GAAE,OAAO,CACxB,CAAC,CACH,CAAC,EACA,MAAM2I,CAAM,EACf+I,EAAcE,EAAK,YAGnBJ,EAAWF,EAAU,IACvB,OAAS1R,EAAP,CACAhD,EAAO,MAAM,EACboT,EAAYpQ,CAAK,CACnB,CAGF,GAAI,CAACpD,EAAQ,MAAO,CAClB,GAAM,CAAE,KAAAqV,EAAM,KAAAxT,CAAK,EAAI,MAAMqG,GAAQ,CACnC,CACE,KAAMlI,EAAQ,UAAYmV,EAAoB,KAAO,SACrD,KAAM,OACN,QAAS,YAAY9U,EAAY,KAC/BL,EAAQ,GACV;AAAA,0CACA,QAAS,CACP,CAAE,MAAO,UAAW,MAAO,MAAO,EAClC,CAAE,MAAO,qBAAsB,MAAO,eAAgB,CACxD,EACA,QAAS,CACX,EACA,CACE,KAAM,OACN,KAAM,OACN,QAAS,8BACT,QAASiV,EACT,OAAS1S,GAAkBA,EAAM,KAAK,EACtC,SAAWA,GACTA,EAAM,OAAS,IACX,2CACA,EACR,CACF,CAAC,EAEDyS,EAAWK,GAAQL,EACnBC,EAAcpT,EAGhB,IAAMkG,EAAiB,MAAMH,GAAkB5H,EAAQ,IAAK,CAC1D,aAAc,EAChB,CAAC,EAEKsV,EAAc,GAAGtV,EAAQ,OAAOiV,IAGtC,GAAI,CACF,MAAMzV,EAAG,OAAOQ,EAAQ,IAAKR,EAAG,UAAU,IAAI,CAChD,MAAE,CACAY,EAAO,MAAM,EACbA,EAAO,MAAM,YAAYC,EAAY,KAAKL,EAAQ,GAAG,oBAAoB,EACzEI,EAAO,MACL,8EAA8EC,EAAY,KACxFL,EAAQ,GACV,mBACF,EACAI,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,CAChB,CAEA,OAAIZ,EAAG,WAAWD,GAAK,QAAQS,EAAQ,IAAKiV,EAAa,cAAc,CAAC,IACtE7U,EAAO,MAAM,EACbA,EAAO,MACL,2BAA2BC,EAAY,KAAK4U,CAAW,mBACzD,EACA7U,EAAO,MAAM,+CAA+C,EAC5DA,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGZ4U,IAAaF,EAAU,MACzB,MAAMS,GAAkBD,EAAa,CACnC,QAASJ,EACT,IAAKlV,EAAQ,IACb,eAAA+H,EACA,OAAQ,CAAC,CAAC/H,EAAQ,MACpB,CAAC,EAGCgV,IAAaF,EAAU,eAAe,GACxC,MAAMU,GAAsBF,EAAa,CACvC,eAAAvN,CACF,CAAC,EAGI,CACL,YAAAuN,EACA,YAAAL,EACA,SAAAD,CACF,CACF,CAEA,eAAeO,GACbD,EACAtV,EAMA,CACA,IAAMyV,EAAgBtV,EACpB,8DACF,EAAE,MAAM,EAGFuV,EAAO,CACX,aACA,WACA,eACA,QACA1V,EAAQ,OAAS,YAAc,eAC/B,oBACA,SAASA,EAAQ,gBACnB,GAGEA,EAAQ,QAAQ,WAAW,IAAI,GAC/BA,EAAQ,QAAQ,WAAW,QAAQ,GACnCA,EAAQ,QAAQ,WAAW,QAAQ,IAEnC0V,EAAK,KAAK,aAAa,EAGzB,GAAI,CACF,MAAMzN,EACJ,MACA,CAAC,mBAAmBjI,EAAQ,UAAWsV,EAAa,WAAY,GAAGI,CAAI,EACvE,CACE,IAAK1V,EAAQ,GACf,CACF,CACF,MAAE,CACAI,EAAO,MAAM,EACbA,EAAO,MACL,wEACF,EACA,QAAQ,KAAK,CAAC,CAChB,CAEAqV,GAAe,QAAQ,iCAAiC,CAC1D,CAEA,eAAeD,GACbF,EACAtV,EAGA,CACA,IAAMyV,EAAgBtV,EACpB,+DACF,EAAE,MAAM,EAER,GAAI,CAEF,IAAMwV,EAAepW,GAAK,KAAKqV,GAAG,OAAO,EAAG,mBAAmB,KAAK,IAAI,GAAG,EAC3E,MAAMpV,EAAG,UAAUmW,CAAY,EAC/B,IAAMC,EAAW,MAAM,MAAMf,EAAqB,EAClD,GAAI,CAACe,EAAS,GACZ,MAAM,IAAI,MAAM,gCAAgCA,EAAS,YAAY,EAIvE,IAAMC,EAAUtW,GAAK,QAAQoW,EAAc,iBAAiB,EAC5D,MAAMnW,EAAG,UAAUqW,EAAS,OAAO,KAAK,MAAMD,EAAS,YAAY,CAAC,CAAC,EACrE,MAAM3N,EAAM,MAAO,CACjB,OACA4N,EACA,KACAF,EACA,uBACA,iCACF,CAAC,EACD,IAAMG,EAAgBvW,GAAK,QAAQoW,EAAc,eAAe,EAChE,MAAMnW,EAAG,KAAKsW,EAAeR,CAAW,EACxC,MAAM9V,EAAG,OAAOmW,CAAY,EAG5B,MAAM1N,EAAMjI,EAAQ,eAAgB,CAAC,SAAS,EAAG,CAC/C,IAAKsV,CACP,CAAC,EAGD,IAAMtE,EAAM,QAAQ,IAAI,EACxB,MAAM/I,EAAM,MAAO,CAAC,WAAW,EAAG,CAAE,IAAKqN,CAAY,CAAC,EACtD,MAAMrN,EAAM,MAAO,CAAC,MAAM,EAAG,CAAE,IAAKqN,CAAY,CAAC,EACjD,MAAMrN,EAAM,MAAO,CAAC,MAAO,IAAI,EAAG,CAAE,IAAKqN,CAAY,CAAC,EACtD,MAAMrN,EAAM,MAAO,CAAC,SAAU,KAAM,gBAAgB,EAAG,CACrD,IAAKqN,CACP,CAAC,EACD,MAAMrN,EAAM,KAAM,CAAC+I,CAAG,CAAC,EAEvByE,GAAe,QAAQ,kCAAkC,CAC3D,OAASrS,EAAP,CACAqS,GAAe,KAAK,uDAAuD,EAC3EjC,EAAYpQ,CAAK,CACnB,CACF,CC9PA,OAAS,YAAY5D,OAAU,KAC/B,OAAOD,OAAU,OAQjB,OAAkC,cAAAyJ,OAAkB,WAEpD,eAAsB+M,GACpBvH,EACAzN,EACAf,EAGA,CACA,GAAI,CAACwO,EACH,OAGFxO,EAAU,CACR,OAAQ,GACR,GAAGA,CACL,EAEA,IAAMgW,EAA2BzW,GAAK,SACpCwB,EAAO,cAAc,IACrBA,EAAO,cAAc,cACvB,EACML,EAAkBP,EACtB,YAAYE,EAAY,KAAK2V,CAAwB,IACrD,CACE,OAAQhW,EAAQ,MAClB,CACF,EAAE,MAAM,EACFmB,EAAM,MAAM3B,GAAG,SAASuB,EAAO,cAAc,eAAgB,MAAM,EACnEK,EAAS,MAAM6U,GAAyB9U,EAAKqN,EAASzN,CAAM,EAClE,MAAMvB,GAAG,UAAUuB,EAAO,cAAc,eAAgBK,EAAQ,MAAM,EACtEV,GAAiB,QAAQ,CAC3B,CAEA,eAAsBuV,GACpB3U,EACAkN,EACAzN,EACA,CACA,IAAMkI,EAAa,MAAMiN,GAAkB5U,EAAOP,CAAM,EAIlDoV,EAAelN,EAClB,qBAAqBD,GAAW,uBAAuB,EACvD,KAAMhH,GACLA,EACG,cAAc,EACd,KACEoU,GACCA,EAAS,OAAOpN,GAAW,kBAAkB,GAC7CoN,EAAS,QAAQ,IAAM,SAC3B,CACJ,EAGF,OAAKD,GAILE,GAAyBF,EAAc3H,CAAO,EAEvCvF,EAAW,YAAY,GALrB3H,CAMX,CAEA,eAAe+U,GACbF,EACA3H,EACA,CACA,IAAM8H,EAAYC,GAAcJ,CAAY,EAEtCK,EAAmBL,EAAa,YAAY,SAAS,EAE3D,GAAI,CAACK,EAAkB,CACrB,IAAMC,EAAc,CAClB,KAAM,UACN,YAAa,IAAIH,IAAY9H,EAAQ,KACnC,GAAG8H,MAAcA,GACnB,IAAIA,IACN,EACA,OAAAH,EAAa,sBAAsBM,CAAW,EAEvCN,EAGT,GAAIK,EAAiB,OAAOxN,GAAW,kBAAkB,EAAG,CAC1D,IAAM0N,EAAcF,EAAiB,eAAe,EAGpD,GAAIE,GAAa,OAAO1N,GAAW,sBAAsB,EACvD,QAAW2N,KAAenI,EAAS,CACjC,IAAMoI,EAAW,GAAGN,IAAYK,IAAcL,IAI5CI,EACG,YAAY,EACZ,IAAKG,GAAYA,EAAQ,QAAQ,CAAC,EAClC,SAASD,CAAQ,GAKtBF,EAAY,WAAWE,CAAQ,EAInC,OAAOT,EAGT,OAAOA,CACT,ClBvFA,OAAS,WAAAW,OAAe,YACxB,OAAO5O,OAAa,UACpB,OAAS,KAAA1E,MAAS,MAEX,IAAMuT,GAAoBvT,EAAE,OAAO,CACxC,IAAKA,EAAE,OAAO,EACd,WAAYA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,SAAS,EACzC,IAAKA,EAAE,QAAQ,EACf,SAAUA,EAAE,QAAQ,EACpB,MAAOA,EAAE,QAAQ,EACjB,OAAQA,EAAE,QAAQ,EAClB,aAAcA,EAAE,QAAQ,EACxB,OAAQA,EAAE,QAAQ,EAAE,SAAS,EAC7B,aAAcA,EAAE,QAAQ,EACxB,SAAUA,EACP,OAAO,EACP,SAAS,EACT,OACEwT,GACKA,EACKlC,EAAUkC,CAA6B,EAEzC,GAET,CACE,QAAS,yDACX,CACF,EACF,UAAWxT,EACR,OAAO,EACP,SAAS,EACT,OACEwT,GACKA,EACKC,GAAY,KAAMC,GAAUA,EAAM,OAASF,CAAG,EAGhD,GAET,CACE,QAAS,mCAAmCC,GAAY,IACrDC,GAAUA,EAAM,IACnB,EAAE,KAAK,MAAM,IACf,CACF,EACF,MAAO1T,EAAE,OAAO,CAClB,CAAC,EAEY2T,GAAO,IAAIL,GAAQ,EAC7B,KAAK,MAAM,EACX,YAAY,kDAAkD,EAC9D,SACC,kBACA,kDACF,EACC,OACC,4BACA,4CACF,EACC,OACC,gCACA,6DACA,MACF,EACC,OAAO,YAAa,4BAA6B,EAAI,EACrD,OAAO,kBAAmB,6BAA8B,EAAK,EAC7D,OAAO,cAAe,6CAA8C,EAAK,EACzE,OACC,kBACA,4DACA,QAAQ,IAAI,CACd,EACC,OAAO,eAAgB,eAAgB,EAAK,EAC5C,OACC,YACA,qDACA,EACF,EACC,OACC,eACA,2DACF,EACC,OAAO,kBAAmB,iCAAkC,EAAI,EAChE,OAAO,qBAAsB,uCAAuC,EACpE,OAAO,MAAO9D,EAAY5F,IAAS,CAClC,GAAI,CACF,IAAMpN,EAAU+W,GAAkB,MAAM,CACtC,IAAKxX,GAAK,QAAQ6N,EAAK,GAAG,EAC1B,aAAc,GACd,WAAA4F,EACA,MAAO,QACP,GAAG5F,CACL,CAAC,EAKD,GAAI4F,EAAW,OAAS,GAAKoE,GAAMpE,EAAW,CAAC,CAAC,EAAG,CACjD,IAAMqE,EAAO,MAAMC,GAAgBtE,EAAW,CAAC,EAAG,EAAE,EAIhDqE,GAAM,OAAS,mBACjBrX,EAAQ,UAAY,UACpBA,EAAQ,MAAQqX,EAAK,SAAW,SAIpC,MAAME,GAAQvX,CAAO,EAErBI,EAAO,IACL,GAAGC,EAAY,QACb,UACF;AAAA,4BACF,EACAD,EAAO,MAAM,CACf,OAASgD,EAAP,CACAhD,EAAO,MAAM,EACboT,EAAYpQ,CAAK,CACnB,CACF,CAAC,EAEH,eAAsBmU,GACpBvX,EAGA,CACA,IAAIO,EACAiX,EACJ,GAAKxX,EAAQ,cAaXO,EAAc,MAAMC,EAAeR,EAAQ,GAAG,MAbpB,CAC1B,IAAMyX,EAAY,MAAM1X,GAAcC,CAAO,EAC7C,GAAIyX,EAAU,OAAchY,CAA4B,EAAG,CACzD,GAAM,CAAE,YAAA6V,EAAa,SAAAN,CAAS,EAAI,MAAMD,GAAc/U,CAAO,EACxDsV,GACH,QAAQ,KAAK,CAAC,EAEhBtV,EAAQ,IAAMsV,EACdtV,EAAQ,aAAe,GACvBwX,EAAqBxC,EAEvBzU,EAAckX,EAAU,YAK1B,GAAID,IAAuB,gBACzB,OAAAxX,EAAQ,IAAMT,GAAK,QAAQS,EAAQ,IAAK,UAAU,EAC3C,MAAM0X,EAAU1X,EAAQ,GAAG,EAGpC,IAAM2X,EAAgB,MAAMC,GAAiB5X,EAAQ,IAAKO,CAAW,EAC/DQ,EAAS4W,EACX,MAAME,GAAuBF,EAAe3X,CAAO,EACnD,MAAM8X,GAAgB,MAAMJ,EAAU1X,EAAQ,GAAG,CAAC,EAEtD,GAAI,CAACA,EAAQ,IAAK,CAChB,GAAM,CAAE,QAAA+X,CAAQ,EAAI,MAAM7P,GAAQ,CAChC,KAAM,UACN,KAAM,UACN,QAAS,0BAA0B7H,EAAY,KAC7C,iBACF,cACA,QAAS,EACX,CAAC,EAEI0X,GACH,QAAQ,KAAK,CAAC,EAKlB,IAAMC,EAAmB7X,EAAQ,0BAA0B,EAAE,MAAM,EAC7D8X,EAAa1Y,GAAK,QAAQS,EAAQ,IAAK,iBAAiB,EAC9D,MAAMR,GAAG,UAAUyY,EAAY,KAAK,UAAUlX,EAAQ,KAAM,CAAC,EAAG,MAAM,EACtEiX,EAAiB,QAAQ,EAGzB,IAAME,EAAa,MAAMC,GAAmBnY,EAAQ,IAAKe,CAAM,EACzDiS,EAAa,CACjB,GAAIhT,EAAQ,QAAU,OAAS,CAAC,EAAI,CAACA,EAAQ,KAAK,EAClD,GAAIA,EAAQ,YAAc,CAAC,CAC7B,EACA,aAAM+S,GAAcC,EAAYkF,EAAY,CAE1C,UAAW,GACX,OAAQlY,EAAQ,OAChB,MAAOA,EAAQ,MACf,aACEA,EAAQ,cAAgBO,GAAa,UAAU,OAAS,UAC5D,CAAC,EAIGP,EAAQ,cAAgBA,EAAQ,QAClC,MAAM+V,GACJ,CAAC,gCAAgC,EACjCmC,EACA,CACE,OAAQlY,EAAQ,MAClB,CACF,EAGKkY,CACT,CAEA,eAAeJ,GAAgBM,EAA+B,KAAM,CAClE,GAAM,CAACC,EAAQC,CAAU,EAAI,MAAM,QAAQ,IAAI,CAC7CC,GAAkB,EAClBC,GAAsB,CACxB,CAAC,EAEDpY,EAAO,KAAK,EAAE,EACd,IAAMJ,EAAU,MAAMkI,GAAQ,CAC5B,CACE,KAAM,SACN,KAAM,aACN,QAAS,yBAAyB7H,EAAY,KAC5C,YACF,mBACA,QAAS+X,GAAe,KAAO,GAC/B,OAAQ,MACR,SAAU,IACZ,EACA,CACE,KAAM,SACN,KAAM,QACN,QAAS,SAAS/X,EAAY,KAAK,OAAO,2BAC1C,QAASgY,EAAO,IAAKI,IAAW,CAC9B,MAAOA,EAAM,MACb,MAAOA,EAAM,IACf,EAAE,CACJ,EACA,CACE,KAAM,SACN,KAAM,oBACN,QAAS,4CAA4CpY,EAAY,KAC/D,YACF,KACA,QAASiY,EAAW,IAAKpB,IAAW,CAClC,MAAOA,EAAM,MACb,MAAOA,EAAM,IACf,EAAE,CACJ,EACA,CACE,KAAM,OACN,KAAM,cACN,QAAS,iBAAiB7W,EAAY,KAAK,YAAY,UACvD,QAAS+X,GAAe,SAAS,KAAOM,EAC1C,EACA,CACE,KAAM,SACN,KAAM,uBACN,QAAS,yBAAyBrY,EAAY,KAC5C,eACF,iBACA,QAAS+X,GAAe,SAAS,cAAgB,GACjD,OAAQ,MACR,SAAU,IACZ,EACA,CACE,KAAM,OACN,KAAM,iBACN,QAAS,0BAA0B/X,EAAY,KAC7C,yBACF,0BACA,QAAS,EACX,EACA,CACE,KAAM,OACN,KAAM,iBACN,QAAS,iBAAiBA,EAAY,KACpC,oBACF,aACA,QAAS+X,GAAe,SAAS,QAAUO,EAC7C,EACA,CACE,KAAM,OACN,KAAM,aACN,QAAS,kCAAkCtY,EAAY,KACrD,YACF,KACA,QAAS+X,GAAe,QAAQ,YAAiBQ,EACnD,EACA,CACE,KAAM,OACN,KAAM,QACN,QAAS,kCAAkCvY,EAAY,KAAK,OAAO,KACnE,QAAS+X,GAAe,QAAQ,OAAYS,EAC9C,EACA,CACE,KAAM,SACN,KAAM,MACN,QAAS,iBAAiBxY,EAAY,KAAK,yBAAyB,KACpE,QAAS+X,GAAe,KAAO,GAC/B,OAAQ,MACR,SAAU,IACZ,CACF,CAAC,EAED,OAAOU,GAAgB,MAAM,CAC3B,QAAS,oCACT,MAAO9Y,EAAQ,MACf,SAAU,CACR,OAAQA,EAAQ,eAChB,IAAKA,EAAQ,YACb,UAAWA,EAAQ,kBACnB,aAAcA,EAAQ,qBACtB,OAAQA,EAAQ,cAClB,EACA,IAAKA,EAAQ,IACb,IAAKA,EAAQ,WACb,QAAS,CACP,MAAOA,EAAQ,MACf,WAAYA,EAAQ,WAEpB,IAAKA,EAAQ,WAAW,QAAQ,gBAAiB,KAAK,EACtD,MAAOA,EAAQ,WAAW,QAAQ,gBAAiB,OAAO,CAC5D,CACF,CAAC,CACH,CAEA,eAAe6X,GACbO,EACAhL,EACA,CACA,IAAIqL,EAAQL,EAAc,MACtBlP,EAAYkE,EAAK,UACjB2L,EAAeX,EAAc,SAAS,aAE1C,GAAI,CAAChL,EAAK,SAAU,CAClB,GAAM,CAACiL,EAAQC,EAAY7T,CAAe,EAAI,MAAM,QAAQ,IAAI,CAC9D8T,GAAkB,EAClBC,GAAsB,EACtB9L,EAAoC0L,CAAa,CACnD,CAAC,EAEKpY,EAAU,MAAMkI,GAAQ,CAC5B,CACE,KAAMzD,IAAoB,KAAO,KAAO,SACxC,KAAM,QACN,QAAS,SAASpE,EAAY,KAAK,OAAO,2BAC1C,QAASgY,EAAO,IAAKI,IAAW,CAC9B,MACEA,EAAM,OAAS,WAAa,yBAA2BA,EAAM,MAC/D,MAAOA,EAAM,IACf,EAAE,EACF,QAAS,CACX,EACA,CACE,KAAMrL,EAAK,UAAY,KAAO,SAC9B,KAAM,oBACN,QAAS,4CAA4C/M,EAAY,KAC/D,YACF,KACA,QAASiY,EAAW,IAAKpB,IAAW,CAClC,MAAOA,EAAM,MACb,MAAOA,EAAM,IACf,EAAE,CACJ,CACF,CAAC,EAEDuB,EAAQzY,EAAQ,OAAS,WACzBkJ,EAAYlJ,EAAQ,mBAAqBkJ,EACzC6P,EAAe3L,EAAK,aAGtB,OAAO0L,GAAgB,MAAM,CAC3B,QAASV,GAAe,QACxB,MAAAK,EACA,SAAU,CACR,GAAGL,GAAe,SAClB,UAAAlP,EACA,aAAA6P,CACF,EACA,IAAKX,GAAe,IACpB,IAAKA,GAAe,IACpB,QAASA,GAAe,QACxB,YAAaA,GAAe,WAC9B,CAAC,CACH,CmB7ZA,OAAO7Y,OAAU,OAMjB,OAAOC,OAAQ,WAGf,eAAsBwZ,GAAahZ,EAA2C,CAC5E,IAAMC,EAAkC,CAAC,EAIzC,GACE,CAACT,GAAG,WAAWQ,EAAQ,GAAG,GAC1B,CAACR,GAAG,WAAWD,GAAK,QAAQS,EAAQ,IAAK,cAAc,CAAC,EAExD,OAAAC,EAAcR,CAA4B,EAAI,GACvC,CACL,OAAAQ,EACA,OAAQ,IACV,EAIF,GAAI,CAACT,GAAG,WAAWD,GAAK,QAAQS,EAAQ,IAAK,iBAAiB,CAAC,EAC7D,OAAAC,EAAcP,CAAc,EAAI,GACzB,CACL,OAAAO,EACA,OAAQ,IACV,EAGF,GAAI,CACF,IAAMc,EAAS,MAAM2W,EAAU1X,EAAQ,GAAG,EAE1C,MAAO,CACL,OAAAC,EACA,OAAQc,CACV,CACF,MAAE,CACAX,EAAO,MAAM,EACbA,EAAO,MACL,cAAcC,EAAY,KACxB,iBACF,uBAAuBA,EAAY,KACjCL,EAAQ,GACV;AAAA,yDAA8DK,EAAY,KACxE,iBACF,yBAAyBA,EAAY,KAAK,MAAM,YAClD,EACAD,EAAO,MACL,iBAAiBC,EAAY,KAC3B,4CACF,IACF,EACAD,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,CAChB,CACF,CC5DA,OAAOZ,OAAQ,cACf,OAAOD,OAAU,OAIjB,eAAsB0Z,GAAe3E,EAAmBvT,EAAgB,CACtE,IAAMmY,EAAY3Z,GAAK,KAAKwB,EAAO,cAAc,IAAK,cAAc,EAEpE,GAAI,EAAE,MAAMvB,GAAG,KAAK0Z,CAAS,GAAG,OAAO,EACrC,OAGF,IAAMC,EAAe,MAAM7B,GAAgBhD,EAAWvT,EAAO,KAAK,EAClE,GACE,CAACoY,GAAc,MAAM,iBACrB,CAACA,GAAc,MAAM,gBAErB,OAIF,IAAM3K,EAAU,YAAY2K,GAAc,MAAM,2BAA2BA,EAAa,KAAK;AAAA;AAAA;AAAA,YAAmEA,GAAc,MAAM;AAAA,GACpL,MAAM3Z,GAAG,UAAU0Z,EAAW1K,EAAS,MAAM,CAC/C,CrBTA,OAAS,WAAAsI,OAAe,YACxB,OAAO5O,OAAa,UACpB,OAAS,KAAA1E,MAAS,MAElB,IAAM4V,GAAwB,CAC5B,CACE,KAAM,QACN,aAAc,SACd,QACE,sEACJ,EACA,CACE,KAAM,UACN,aAAc,SACd,QACE,wEACJ,CACF,EAEaC,GAAmB7V,EAAE,OAAO,CACvC,WAAYA,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,SAAS,EACzC,IAAKA,EAAE,QAAQ,EACf,UAAWA,EAAE,QAAQ,EACrB,IAAKA,EAAE,OAAO,EACd,IAAKA,EAAE,QAAQ,EACf,KAAMA,EAAE,OAAO,EAAE,SAAS,EAC1B,OAAQA,EAAE,QAAQ,EAClB,OAAQA,EAAE,QAAQ,EAAE,SAAS,EAC7B,aAAcA,EAAE,QAAQ,CAC1B,CAAC,EAEY8V,GAAM,IAAIxC,GAAQ,EAC5B,KAAK,KAAK,EACV,YAAY,iCAAiC,EAC7C,SACC,kBACA,kDACF,EACC,OAAO,YAAa,4BAA6B,EAAK,EACtD,OAAO,kBAAmB,4BAA6B,EAAK,EAC5D,OACC,kBACA,4DACA,QAAQ,IAAI,CACd,EACC,OAAO,YAAa,+BAAgC,EAAK,EACzD,OAAO,oBAAqB,mCAAmC,EAC/D,OAAO,eAAgB,eAAgB,EAAK,EAC5C,OACC,YACA,qDACA,EACF,EACC,OACC,eACA,2DACF,EACC,OAAO,kBAAmB,iCAAkC,EAAI,EAChE,OAAO,qBAAsB,uCAAuC,EACpE,OAAO,MAAO9D,EAAY5F,IAAS,CAClC,GAAI,CACF,IAAMpN,EAAUqZ,GAAiB,MAAM,CACrC,WAAArG,EACA,IAAKzT,GAAK,QAAQ6N,EAAK,GAAG,EAC1B,GAAGA,CACL,CAAC,EAEGmM,EAOJ,GALIvG,EAAW,OAAS,GAAKoE,GAAMpE,EAAW,CAAC,CAAC,IAE9CuG,GADa,MAAMjC,GAAgBtE,EAAW,CAAC,EAAG,EAAE,IACnC,MAIjB,CAAChT,EAAQ,MACRuZ,IAAa,kBAAoBA,IAAa,kBAC/C,CACAnZ,EAAO,MAAM,EACb,GAAM,CAAE,QAAAoZ,CAAQ,EAAI,MAAMtR,GAAQ,CAChC,KAAM,UACN,KAAM,UACN,QAAS7H,EAAY,KACnB,kCAAkCkZ,EAAS,QACzC,YACA,EACF;AAAA,qEACF,CACF,CAAC,EACIC,IACHpZ,EAAO,MAAM,EACbA,EAAO,IAAI,yBAAyB,EACpCA,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GASlB,GALKJ,EAAQ,YAAY,SACvBA,EAAQ,WAAa,MAAMyZ,GAA4BzZ,CAAO,IAG5C,MAAMQ,EAAeR,EAAQ,GAAG,IACnC,kBAAoB,KAAM,CACzC,IAAM0Z,EAAuBN,GAAsB,OAAQ9E,GACzDtU,EAAQ,YAAY,SAASsU,EAAU,IAAI,CAC7C,EAEIoF,GAAsB,SACxBtZ,EAAO,MAAM,EACbsZ,EAAqB,QAASpF,GAAc,CAC1ClU,EAAO,KAAKC,EAAY,KAAKiU,EAAU,OAAO,CAAC,CACjD,CAAC,EACDlU,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAIlB,GAAI,CAAE,OAAAH,EAAQ,OAAAc,CAAO,EAAI,MAAMiY,GAAahZ,CAAO,EAGnD,GAAIC,EAAcP,CAAc,EAAG,CACjC,GAAM,CAAE,QAAAqY,CAAQ,EAAI,MAAM7P,GAAQ,CAChC,KAAM,UACN,KAAM,UACN,QAAS,wBAAwB7H,EAAY,KAC3C,iBACF,qCACA,QAAS,EACX,CAAC,EAEI0X,IACH3X,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGhBW,EAAS,MAAMwW,GAAQ,CACrB,IAAKvX,EAAQ,IACb,IAAK,GACL,MAAO,GACP,SAAU,GACV,cAAe,GACf,OAAQ,GACR,aAAc,GACd,OAAQA,EAAQ,OAChB,aAAcA,EAAQ,aACtB,MAAO,OACT,CAAC,EAGH,IAAI2Z,EAAuB,GAC3B,GAAI1Z,EAAcR,CAA4B,EAAG,CAC/C,GAAM,CAAE,YAAA6V,EAAa,SAAAN,CAAS,EAAI,MAAMD,GAAc,CACpD,IAAK/U,EAAQ,IACb,MAAOA,EAAQ,UACf,OAAQA,EAAQ,OAChB,WAAYA,EAAQ,UACtB,CAAC,EACIsV,IACHlV,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAEhBJ,EAAQ,IAAMsV,EAEVN,IAAa,iBACfhV,EAAQ,IAAMT,GAAK,QAAQS,EAAQ,IAAK,UAAU,EAClDe,EAAS,MAAM2W,EAAU1X,EAAQ,GAAG,IAEpCe,EAAS,MAAMwW,GAAQ,CACrB,IAAKvX,EAAQ,IACb,IAAK,GACL,MAAO,GACP,SAAU,GACV,cAAe,GACf,OAAQ,GACR,aAAc,GACd,OAAQA,EAAQ,OAChB,aAAcA,EAAQ,aACtB,MAAO,OACT,CAAC,EAED2Z,EACE3Z,EAAQ,YAAY,SAAW,GAC/B,CAAC,CAACA,EAAQ,WAAW,CAAC,EAAE,MAAM,aAAa,GAIjD,GAAI,CAACe,EACH,MAAM,IAAI,MACR,4BAA4BV,EAAY,KAAKL,EAAQ,GAAG,IAC1D,EAGF,MAAM+S,GAAc/S,EAAQ,WAAYe,EAAQf,CAAO,EAInD2Z,GACF,MAAMV,GAAejZ,EAAQ,WAAW,CAAC,EAAGe,CAAM,CAEtD,OAASqC,EAAP,CACAhD,EAAO,MAAM,EACboT,EAAYpQ,CAAK,CACnB,CACF,CAAC,EAEH,eAAeqW,GACbzZ,EACA,CACA,IAAM4Z,EAAgB,MAAMC,GAAiB,EAC7C,GAAI,CAACD,EACH,OAAAxZ,EAAO,MAAM,EACboT,EAAY,IAAI,MAAM,iCAAiC,CAAC,EACjD,CAAC,EAGV,GAAIxT,EAAQ,IACV,OAAO4Z,EACJ,IAAKE,GAAUA,EAAM,IAAI,EACzB,OACExF,GAAc,CAAC8E,GAAsB,KAAMW,GAAMA,EAAE,OAASzF,CAAS,CACxE,EAGJ,GAAItU,EAAQ,YAAY,OACtB,OAAOA,EAAQ,WAGjB,GAAM,CAAE,WAAAgT,CAAW,EAAI,MAAM9K,GAAQ,CACnC,KAAM,cACN,KAAM,aACN,QAAS,0CACT,KAAM,qDACN,aAAc,GACd,QAAS0R,EACN,OACEE,GACCA,EAAM,OAAS,eACf,CAACV,GAAsB,KACpB9E,GAAcA,EAAU,OAASwF,EAAM,IAC1C,CACJ,EACC,IAAKA,IAAW,CACf,MAAOA,EAAM,KACb,MAAOA,EAAM,KACb,SAAU9Z,EAAQ,IAAM,GAAOA,EAAQ,YAAY,SAAS8Z,EAAM,IAAI,CACxE,EAAE,CACN,CAAC,EAEI9G,GAAY,SACf5S,EAAO,KAAK,kCAAkC,EAC9CA,EAAO,KAAK,EAAE,EACd,QAAQ,KAAK,CAAC,GAGhB,IAAM+L,EAAS3I,EAAE,MAAMA,EAAE,OAAO,CAAC,EAAE,UAAUwP,CAAU,EACvD,OAAK7G,EAAO,QAKLA,EAAO,MAJZ/L,EAAO,MAAM,EAAE,EACfoT,EAAY,IAAI,MAAM,yCAAyC,CAAC,EACzD,CAAC,EAGZ,CsBnRA,UAAYhU,OAAQ,cACpB,UAAYD,OAAU,OCDtB,OAAOA,OAAU,OAKjB,OAAOC,OAAQ,WAGf,eAAsBwa,GACpBha,EACA,CACA,IAAMC,EAAkC,CAAC,EAEnCga,EAAe,CACnB,IAAKja,EAAQ,IACb,aAAcT,GAAK,QAAQS,EAAQ,IAAKA,EAAQ,YAAY,EAC5D,UAAWT,GAAK,QAAQS,EAAQ,IAAKA,EAAQ,SAAS,CACxD,EAGA,OAAKR,GAAG,WAAWya,EAAa,YAAY,IAC1Cha,EAAcH,CAA2B,EAAI,IAI/C,MAAMN,GAAG,MAAMya,EAAa,UAAW,CAAE,UAAW,EAAK,CAAC,EAEtD,OAAO,KAAKha,CAAM,EAAE,OAAS,IAC3BA,EAAcH,CAA2B,IAC3CM,EAAO,MAAM,EACbA,EAAO,MACL,YAAYC,EAAY,KACtB4Z,EAAa,YACf,mBACF,GAGF7Z,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGT,CACL,OAAAH,EACA,aAAAga,CACF,CACF,CDrCA,OAAS,WAAAnD,OAAe,YACxB,OAAS,KAAAtT,OAAS,MAEX,IAAM0W,GAAqB1W,GAAE,OAAO,CACzC,IAAKA,GAAE,OAAO,EACd,aAAcA,GAAE,OAAO,EACvB,UAAWA,GAAE,OAAO,CACtB,CAAC,EAEY2W,GAAQ,IAAIrD,GAAQ,EAC9B,KAAK,OAAO,EACZ,YAAY,wCAAwC,EACpD,SAAS,aAAc,6BAA8B,iBAAiB,EACtE,OACC,sBACA,uCACA,YACF,EACC,OACC,kBACA,4DACA,QAAQ,IAAI,CACd,EACC,OAAO,MAAOsD,EAAkBhN,IAAS,CACxC,GAAI,CACF,IAAMpN,EAAUka,GAAmB,MAAM,CACvC,IAAU,WAAQ9M,EAAK,GAAG,EAC1B,aAAcgN,EACd,UAAWhN,EAAK,MAClB,CAAC,EAEK,CAAE,aAAA6M,CAAa,EAAI,MAAMD,GAAeha,CAAO,EAC/CwO,EAAU,MAAS,YAASyL,EAAa,aAAc,OAAO,EAE9D9N,EAASkO,GAAe,UAAU,KAAK,MAAM7L,CAAO,CAAC,EAEtDrC,EAAO,UACV/L,EAAO,MACL,kCAAkCC,EAAY,KAC5C4Z,EAAa,YACf,IACF,EACA,QAAQ,KAAK,CAAC,GAGhB,IAAMK,EAAena,EAAQ,sBAAsB,EACnD,QAAWgZ,KAAgBhN,EAAO,KAAK,MAAO,CAC5C,GAAI,CAACgN,EAAa,MAChB,SAGFmB,EAAa,MAAM,YAAYnB,EAAa,SAAS,EAGrDA,EAAa,QACX,kDAGF,QAAWnL,KAAQmL,EAAa,MAC9BnL,EAAK,QAAa,MAAS,YACpB,WAAQiM,EAAa,IAAKjM,EAAK,IAAI,EACxC,OACF,EAIF,IAAM7B,EAAS6H,EAAmB,UAAUmF,CAAY,EACxD,GAAI,CAAChN,EAAO,QAAS,CACnB/L,EAAO,MACL,mCAAmCC,EAAY,KAC7C8Y,EAAa,IACf,IACF,EACA,SAIF,MAAS,aACF,WAAQc,EAAa,UAAW,GAAG9N,EAAO,KAAK,WAAW,EAC/D,KAAK,UAAUA,EAAO,KAAM,KAAM,CAAC,CACrC,EAGFmO,EAAa,QAAQ,oBAAoB,CAC3C,OAASlX,EAAP,CACAhD,EAAO,MAAM,EACboT,EAAYpQ,CAAK,CACnB,CACF,CAAC,EEhGH,OAAS,cAAAyF,GAAY,YAAYrJ,OAAU,KAC3C,OAAOD,OAAU,OAajB,OAAS,WAAAuX,OAAe,YACxB,OAAS,aAAAyD,OAA8B,OACvC,OAAS,KAAA/W,OAAS,MAElB,IAAMgX,GAAsBhX,GAAE,OAAO,CACnC,UAAWA,GAAE,OAAO,EAAE,SAAS,EAC/B,IAAKA,GAAE,QAAQ,EACf,IAAKA,GAAE,OAAO,EACd,KAAMA,GAAE,OAAO,EAAE,SAAS,CAC5B,CAAC,EAEYiX,GAAO,IAAI3D,GAAQ,EAC7B,KAAK,MAAM,EACX,YAAY,wCAAwC,EACpD,SAAS,cAAe,oBAAoB,EAC5C,OAAO,YAAa,4BAA6B,EAAK,EACtD,OACC,kBACA,4DACA,QAAQ,IAAI,CACd,EACC,OAAO,MAAOjV,EAAMuL,IAAS,CAC5B,GAAI,CACF,IAAMpN,EAAUwa,GAAoB,MAAM,CACxC,UAAW3Y,EACX,GAAGuL,CACL,CAAC,EAEK4D,EAAMzR,GAAK,QAAQS,EAAQ,GAAG,EAE/B6I,GAAWmI,CAAG,IACjB5Q,EAAO,MAAM,YAAY4Q,qCAAuC,EAChE,QAAQ,KAAK,CAAC,GAGhB,IAAMjQ,EAAS,MAAM2W,EAAU1G,CAAG,EAC7BjQ,IACHX,EAAO,KACL,wCAAwCC,EAAY,QAClD,MACF,qCACF,EACA,QAAQ,KAAK,CAAC,GAGhB,IAAMuZ,EAAgB,MAAMC,GAAiB,EAO7C,GALKD,IACHpG,EAAY,IAAI,MAAM,iCAAiC,CAAC,EACxD,QAAQ,KAAK,CAAC,GAGZ,CAACxT,EAAQ,UAAW,CACtB,IAAM6H,EAAY9G,EAAO,cAAc,WAGjC2Z,EAAoBd,EAAc,OAAQvC,GAAS,CACvD,QAAWrJ,KAAQqJ,EAAK,OAAS,CAAC,EAAG,CACnC,IAAMpJ,EAAW1O,GAAK,QACpBsI,EACA,OAAOmG,GAAS,SAAWA,EAAOA,EAAK,IACzC,EACA,GAAInF,GAAWoF,CAAQ,EACrB,MAAO,GAIX,MAAO,EACT,CAAC,EAGK0M,EAAwB,CAAC,EAC/B,QAAWrG,KAAaoG,EAAmB,CACzC,IAAME,EAAU,MAAMC,GAAcvG,EAAWvT,CAAM,EACjD6Z,EAAQ,QACVD,EAAsB,KAAK,CACzB,KAAMrG,EAAU,KAChB,QAAAsG,CACF,CAAC,EAIAD,EAAsB,SACzBva,EAAO,KAAK,mBAAmB,EAC/B,QAAQ,KAAK,CAAC,GAGhBA,EAAO,KAAK,kDAAkD,EAC9D,QAAWkU,KAAaqG,EAAuB,CAC7Cva,EAAO,KAAK,KAAKkU,EAAU,MAAM,EACjC,QAAWwG,KAAUxG,EAAU,QAC7BlU,EAAO,KAAK,OAAO0a,EAAO,UAAU,EAGxC1a,EAAO,MAAM,EACbA,EAAO,KACL,OAAOC,EAAY,QAAQ,kBAAkB,uBAC/C,EACA,QAAQ,KAAK,CAAC,EAIhB,IAAMiU,EAAYsF,EAAc,KAC7BvC,GAASA,EAAK,OAASrX,EAAQ,SAClC,EAEKsU,IACHlU,EAAO,MACL,iBAAiBC,EAAY,QAC3BL,EAAQ,SACV,mBACF,EACA,QAAQ,KAAK,CAAC,GAGhB,IAAM4a,EAAU,MAAMC,GAAcvG,EAAWvT,CAAM,EAEhD6Z,EAAQ,SACXxa,EAAO,KAAK,wBAAwBJ,EAAQ,YAAY,EACxD,QAAQ,KAAK,CAAC,GAGhB,QAAW8a,KAAUF,EACnBxa,EAAO,KAAK,KAAK0a,EAAO,UAAU,EAClC,MAAMC,GAAUD,EAAO,KAAK,EAC5B1a,EAAO,KAAK,EAAE,CAElB,OAASgD,EAAP,CACAoQ,EAAYpQ,CAAK,CACnB,CACF,CAAC,EAEH,eAAeyX,GACbvG,EACAvT,EACA,CACA,IAAMgT,EAAU,MAAMiH,GAAUja,EAAO,MAAO,CAACuT,CAAS,CAAC,EACnDpL,EAAY,MAAM0E,GAAqB7M,EAAO,SAAS,SAAS,EAEtE,GAAI,CAACgT,EACH,MAAO,CAAC,EAGV,IAAM6G,EAAU,CAAC,EAEjB,QAAWvD,KAAQtD,EAAS,CAC1B,IAAMlM,EAAY,MAAMoT,GAAkBla,EAAQsW,CAAI,EAEtD,GAAKxP,EAIL,QAAWmG,KAAQqJ,EAAK,OAAS,CAAC,EAAG,CACnC,IAAMpJ,EAAW1O,GAAK,QACpBsI,EACA,OAAOmG,GAAS,SAAWA,EAAOA,EAAK,IACzC,EAEA,GAAI,CAACnF,GAAWoF,CAAQ,EACtB,SAGF,IAAMiN,EAAc,MAAM1b,GAAG,SAASyO,EAAU,MAAM,EAEtD,GAAI,OAAOD,GAAS,UAAY,CAACA,EAAK,QACpC,SAGF,IAAMmN,EAAkB,MAAMhO,GAAU,CACtC,SAAUa,EAAK,KACf,IAAKA,EAAK,QACV,OAAAjN,EACA,UAAAmI,CACF,CAAC,EAEKkS,EAAQb,GAAUY,EAA2BD,CAAW,EAC1DE,EAAM,OAAS,GACjBR,EAAQ,KAAK,CACX,SAAA3M,EACA,MAAAmN,CACF,CAAC,GAKP,OAAOR,CACT,CAEA,eAAeG,GAAUN,EAAgB,CACvCA,EAAK,QAASY,GAAS,CACrB,GAAIA,EACF,OAAIA,EAAK,MACA,QAAQ,OAAO,MAAMhb,EAAY,QAAQgb,EAAK,KAAK,CAAC,EAEzDA,EAAK,QACA,QAAQ,OAAO,MAAMhb,EAAY,MAAMgb,EAAK,KAAK,CAAC,EAGpD,QAAQ,OAAO,MAAMA,EAAK,KAAK,CAE1C,CAAC,CACH,CCpNA,OAAS,WAAAvE,OAAe,YAEjB,IAAMwE,GAAO,IAAIxE,GAAQ,EAC7B,KAAK,MAAM,EACX,YAAY,oCAAoC,EAChD,OACC,kBACA,4DACA,QAAQ,IAAI,CACd,EACC,OAAO,MAAO1J,GAAS,CACtBhN,EAAO,KAAK,gBAAgB,EAC5B,QAAQ,IAAI,MAAMI,EAAe4M,EAAK,GAAG,CAAC,EAC1ChN,EAAO,MAAM,EACbA,EAAO,KAAK,mBAAmB,EAC/B,QAAQ,IAAI,MAAMsX,EAAUtK,EAAK,GAAG,CAAC,CACvC,CAAC,ECnBH,OAAO7N,OAAU,OCAjB,OAAS,eAAAgc,OAAmB,SAC5B,OAAS,YAAY/b,OAAU,KAC/B,OAAS,UAAAsJ,OAAc,KACvB,OAAOvJ,OAAU,OASjB,OAAOic,OAAQ,YACf,OAAOtT,OAAa,UACpB,OAAS,WAAAqE,GAAS,cAAAC,GAAY,cAAAxD,OAAkB,WAGhD,eAAsByS,GAAa1a,EAAgB,CACjD,GAAI,CAACA,EAAO,cAAc,GACxB,MAAM,IAAI,MACR,8IACF,EAGF,IAAM2a,EAAS3a,EAAO,cAAc,GAC9B,CAAC2M,EAAOnD,CAAa,EAAI,MAAM,QAAQ,IAAI,CAC/CiR,GAAG,uBAAwB,CACzB,IAAKE,CACP,CAAC,EACDlR,GAAiB,CACnB,CAAC,EAED,GAAI,OAAO,KAAKD,CAAa,EAAE,SAAW,EACxC,MAAM,IAAI,MAAM,mDAAmD,EAGrE,IAAMoR,EAAiB,OAAO,QAAQvR,CAAc,EAAE,IACpD,CAAC,CAACvI,EAAM+Z,CAAW,KAAO,CACxB,MAAOA,EAAY,KACnB,MAAO/Z,CACT,EACF,EAEMga,EAAiB,MAAM3T,GAAQ,CACnC,CACE,KAAM,SACN,KAAM,gBACN,QAAS,wCAAwC7H,EAAY,KAC3D,cACF,KACA,QAASsb,CACX,EACA,CACE,KAAM,SACN,KAAM,gBACN,QAAS,wCAAwCtb,EAAY,KAC3D,YACF,KACA,QAASsb,CACX,CACF,CAAC,EAED,GAAIE,EAAe,gBAAkBA,EAAe,cAClD,MAAM,IAAI,MACR,sFACF,EAGF,GACE,EACEA,EAAe,iBAAiBzR,GAChCyR,EAAe,iBAAiBzR,GAGlC,MAAM,IAAI,MAAM,2DAA2D,EAG7E,IAAMK,EACJL,EAAeyR,EAAe,aAA4C,EACtEnR,EACJN,EAAeyR,EAAe,aAA4C,EACtE,CAAE,QAAArC,CAAQ,EAAI,MAAMtR,GAAQ,CAChC,KAAM,UACN,KAAM,UACN,QAAS,GACT,QAAS,mBAAmB7H,EAAY,KACtCqN,EAAM,MACR,cAAcrN,EAAY,KACxB,KAAKd,GAAK,SAASwB,EAAO,cAAc,IAAK2a,CAAM,GACrD,UAAUrb,EAAY,KAAKoK,EAAc,IAAI,QAAQpK,EAAY,KAC/DqK,EAAc,IAChB,cACF,CAAC,EAEI8O,IACHpZ,EAAO,KAAK,sBAAsB,EAClC,QAAQ,KAAK,CAAC,GAGZsK,EAAc,SAChB,MAAMvC,EAAmB,CAACuC,EAAc,OAAO,EAAG,CAAC,EAAG3J,EAAQ,CAC5D,OAAQ,EACV,CAAC,EAGH,IAAM+a,EAAmB3b,EAAQ,oBAAoB,GAAG,MAAM,EAE9D,MAAM,QAAQ,IACZuN,EAAM,IAAI,MAAOM,GAAS,CACxB8N,EAAiB,KAAO,aAAa9N,OAErC,IAAMC,EAAW1O,GAAK,KAAKmc,EAAQ1N,CAAI,EACjCkN,EAAc,MAAM1b,GAAG,SAASyO,EAAU,OAAO,EAEjDO,EAAU,MAAMuN,GACpBb,EACAW,EAAe,cACfA,EAAe,cACftR,CACF,EAEA,MAAM/K,GAAG,UAAUyO,EAAUO,CAAO,CACtC,CAAC,CACH,EAEAsN,EAAiB,QAAQ,qBAAqB,CAChD,CAEA,eAAsBC,GACpBvN,EACA/D,EACAC,EACAsR,EACA,CACA,IAAMC,EAAsB7R,EAAeK,CAAa,GAAG,OACrDyR,EAAsB9R,EAAeM,CAAa,GAAG,OAErDwC,EAAM,MAAM1N,GAAG,QAAQD,GAAK,KAAKuJ,GAAO,EAAG,SAAS,CAAC,EACrDiE,EAAU,IAAIR,GAAQ,CAC1B,gBAAiB,CAAC,CACpB,CAAC,EAEKe,EAAW/N,GAAK,KACpB2N,EACA,gBAAgBqO,GAAY,CAAC,EAAE,SAAS,KAAK,OAC/C,EACMtS,EAAa8D,EAAQ,iBAAiBO,EAAUkB,EAAS,CAC7D,WAAYhC,GAAW,GACzB,CAAC,EAGG7B,EAA0B,CAAC,EAC/B,QAAWC,KAAqB3B,EAAW,sBAAsB,GAAK,CAAC,EACrE,GACE2B,EAAkB,mBAAmB,GAAG,QAAQ,IAChD,IAAIqR,KAKN,SAAWpR,KAAaD,EAAkB,gBAAgB,GAAK,CAAC,EAAG,CACjE,IAAME,EAAWD,EAAU,QAAQ,EAG7BE,EAAe,OAAO,OAAOiR,CAAY,EAAE,KAC9C/Q,GAASA,EAAKR,CAAa,IAAMK,CACpC,IAAIJ,CAAa,EAEb,CAACK,GAAgBJ,EAAc,SAASI,CAAY,IAIxDJ,EAAc,KAAKI,CAAY,EAG/BF,EAAU,OAAO,EAGjB5B,EACG,qBAAqBD,GAAW,qBAAqB,EACrD,OAAQhH,GAASA,EAAK,eAAe,GAAG,QAAQ,IAAM8I,CAAQ,EAC9D,QAAS9I,GAASA,EAAK,eAAe,GAAG,gBAAgB+I,CAAY,CAAC,GAIvEH,EAAkB,gBAAgB,GAAG,SAAW,GAClDA,EAAkB,OAAO,EAI7B,OAAID,EAAc,OAAS,GACzB1B,EAAW,qBAAqB,CAC9B,gBAAiBiT,EACjB,aAAcvR,EAAc,IAAKM,IAAU,CACzC,KAAMA,CACR,EAAE,CACJ,CAAC,EAGI,MAAMhC,EAAW,QAAQ,CAClC,CCxMA,OAAS,YAAYzJ,OAAU,KAC/B,OAAOD,OAAU,OAOjB,OAAOic,OAAQ,YACf,OAAOtT,OAAa,UAEpB,SAASiU,GAAaC,EAAqB,CACzC,OAAOA,EACJ,MAAM,GAAG,EACT,IAAKf,GAASA,EAAK,OAAO,CAAC,EAAE,YAAY,EAAIA,EAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,EAAE,CACZ,CAEA,SAASgB,GACPC,EACAC,EACAC,EACAC,EACA,CASA,IAAMC,EANiBJ,EACpB,QAAQ,YAAa,EAAE,EACvB,QAAQ,oBAAqB,EAAE,EAC/B,QAAQ,OAAQ,GAAG,EACnB,KAAK,EAGL,MAAM,GAAG,EACT,IAAKK,GAAeA,EAAW,KAAK,CAAC,EACrC,OAAO,OAAO,EAEjB,QAAWA,KAAcD,EAAiB,CACxC,IAAME,EAAkBD,EAAW,MAAM,kCAAkC,EACrEE,EAAaF,EAAW,MAAM,sBAAsB,EAE1D,GAAIC,EAAiB,CAEnB,IAAME,EAAaF,EAAgB,CAAC,EAC9BG,EAAcH,EAAgB,CAAC,EAEjCH,IAAgB,QAAUK,IAAe,QAAU,CAACC,EACtDP,EAAQ,KAAK,CACX,KAAM,OACN,MAAO,gBACP,OAAQ,EACV,CAAC,EAEDA,EAAQ,KAAK,CACX,KAAMM,EACN,MAAOC,EACP,OAAQ,EACV,CAAC,UAEMF,EAAY,CAErB,IAAMC,EAAaD,EAAW,CAAC,EACzBE,EAAcF,EAAW,CAAC,EAG9BJ,IAAgB,QAChBK,IAAe,QACfC,IAAgB,OAEhBP,EAAQ,KAAK,CACX,KAAM,OACN,MAAO,gBACP,OAAQD,CACV,CAAC,EAEDC,EAAQ,KAAK,CACX,KAAMM,EACN,MAAOC,EACP,OAAQR,CACV,CAAC,OAKCE,IAAgB,QAAUE,IAAe,OAC3CH,EAAQ,KAAK,CACX,KAAM,OACN,MAAO,gBACP,OAAQD,CACV,CAAC,EAEDC,EAAQ,KAAK,CACX,KAAMG,EACN,OAAQJ,CACV,CAAC,EAIT,CAEA,eAAsBS,GACpBjc,EACAf,EAA6B,CAAC,EAC9B,CACA,GAAI,CAACe,EAAO,cAAc,GACxB,MAAM,IAAI,MACR,8IACF,EAGF,IAAM2a,EAAS3a,EAAO,cAAc,GAC9B2M,EAAQ,MAAM8N,GAAG,uBAAwB,CAC7C,IAAKE,CACP,CAAC,EAED,GAAI,CAAC1b,EAAQ,IAAK,CAChB,GAAM,CAAE,QAAAwZ,CAAQ,EAAI,MAAMtR,GAAQ,CAChC,KAAM,UACN,KAAM,UACN,QAAS,GACT,QAAS,mBAAmB7H,EAAY,KACtCqN,EAAM,MACR,cAAcrN,EAAY,KACxB,KAAKd,GAAK,SAASwB,EAAO,cAAc,IAAK2a,CAAM,GACrD,QAAQrb,EAAY,KAAK,UAAU,cACrC,CAAC,EAEImZ,IACHpZ,EAAO,KAAK,sBAAsB,EAClC,QAAQ,KAAK,CAAC,GAIlB,IAAM0b,EAAmB3b,EAAQ,sBAAsB,GAAG,MAAM,EAC1D8c,EAAgB,IAAI,IAE1B,MAAM,QAAQ,IACZvP,EAAM,IAAI,MAAOM,GAAS,CACxB8N,EAAiB,KAAO,aAAa9N,OAErC,IAAMC,EAAW1O,GAAK,KAAKmc,EAAQ1N,CAAI,EACjCkN,EAAc,MAAM1b,GAAG,SAASyO,EAAU,OAAO,EAEjD,CAAE,QAAAO,EAAS,iBAAA0O,CAAiB,EAAI,MAAMC,GAAiBjC,CAAW,EAGxEgC,EAAiB,QAASE,GAAQH,EAAc,IAAIG,CAAG,CAAC,EAExD,MAAM5d,GAAG,UAAUyO,EAAUO,CAAO,CACtC,CAAC,CACH,EAEAsN,EAAiB,QAAQ,oBAAoB,EAG7C,IAAMuB,EAAiBld,EAAQ,0BAA0B,GAAG,MAAM,EAElE,GAAI,CACF,IAAMmd,EAActZ,GAAejD,EAAO,cAAc,IAAK,EAAK,EAElE,GAAI,CAACuc,EAAa,CAChBD,EAAe,KAAK,6BAA6B,EACjDjd,EAAO,KACL,0GACF,EACA,OAGF,IAAMmd,EAAqB,MAAM,KAAKN,CAAa,EAG7CO,EAAkB,CAAC,eAAgB,iBAAiB,EAC1D,QAAWC,KAAWD,EACpB,GAAIF,EAAYG,CAAO,EACrB,QAAWL,KAAOG,EACZD,EAAYG,CAAO,EAAGL,CAAG,GAC3B,OAAOE,EAAYG,CAAO,EAAGL,CAAG,EAOxC,GAAIG,EAAmB,OAAS,EAAG,CAC5BD,EAAY,eACfA,EAAY,aAAe,CAAC,GAE9BA,EAAY,aAAa,UAAU,EAAI,SAEvC,IAAMI,EAAkBne,GAAK,KAC3BwB,EAAO,cAAc,IACrB,cACF,EACA,MAAMvB,GAAG,UACPke,EACA,KAAK,UAAUJ,EAAa,KAAM,CAAC,EAAI;AAAA,CACzC,EAEAD,EAAe,QAAQ,uBAAuB,EAG9C,MAAMlV,EAAmB,CAAC,UAAU,EAAG,CAAC,EAAGpH,EAAQ,CAAE,OAAQ,EAAM,CAAC,OAEpEsc,EAAe,QAAQ,oCAAoC,CAE/D,MAAE,CACAA,EAAe,KAAK,+BAA+B,EACnDjd,EAAO,KACL,2EACF,CACF,CACF,CAEA,eAAsB+c,GACpB3O,EAC0D,CAG1D,IAAMmP,EACJ,uGAEInB,EAAqE,CAAC,EACtEoB,EAA0B,CAAC,EAC3BV,EAA6B,CAAC,EAChCW,EAAa,IACbC,EAAe,GAEf3R,EAASqC,EACTF,EAGJ,MAAQA,EAAQqP,EAAmB,KAAKnP,CAAO,KAAO,MAAM,CAC1D,GAAM,CACJuP,EACAC,EACAC,EACA3B,EACA9V,EACAiW,EACAyB,CACF,EAAI5P,EAGJ,GAAImO,IAAgB,SAAWA,EAAY,WAAW,QAAQ,EAC5D,SAGFmB,EAAc,KAAKG,CAAS,EAGxBH,EAAc,SAAW,IAC3BC,EAAarX,EACbsX,EAAeI,IAAc,KAI/BhB,EAAiB,KAAK,mBAAmBT,GAAa,EAEtD,IAAMF,EAAa,EAAQyB,EAE3B,GAAIC,EAAgB,CAElB,IAAME,EAAgBhC,GAAaM,CAAW,EAC9CD,EAAQ,KAAK,CACX,KAAM2B,EACN,MAAOF,EACP,OAAQ1B,CACV,CAAC,OACQD,GAKTD,GAAoBC,EAAcC,EAAYC,EAASC,CAAW,EAItE,GAAID,EAAQ,SAAW,EACrB,MAAO,CACL,QAAAhO,EACA,iBAAkB,CAAC,CACrB,EAKF,IAAM4P,EAAgB5B,EAAQ,OAC5B,CAACM,EAAYuB,EAAOC,IAClBD,IACAC,EAAK,UACF7S,GACCA,EAAE,OAASqR,EAAW,MACtBrR,EAAE,QAAUqR,EAAW,OACvBrR,EAAE,SAAWqR,EAAW,MAC5B,CACJ,EAYMyB,EAAgB,YATHH,EAChB,IAAKI,GAAQ,CACZ,IAAMC,EAAaD,EAAI,OAAS,QAAU,GAC1C,OAAOA,EAAI,MACP,GAAGC,IAAaD,EAAI,WAAWA,EAAI,QACnC,GAAGC,IAAaD,EAAI,MAC1B,CAAC,EACA,KAAK,IAAI,YAE2CX,YAAqBA,IAC1EC,EAAe,IAAM,KAIvB3R,EAASyR,EAAc,OAAO,CAACc,EAAKC,EAAMN,IACjCK,EAAI,QAAQC,EAAMN,IAAU,EAAIE,EAAgB,EAAE,EACxDpS,CAAM,EAGTA,EAASA,EAAO,QAAQ,gBAAiB;AAAA;AAAA,CAAM,EAMzBiS,EAAc,KACjCI,GAAQA,EAAI,OAAS,QAAUA,EAAI,QAAU,eAChD,IAgEErS,EA5DcA,EAAO,MAAM;AAAA,CAAI,EACA,IAAKwS,GAAS,CAE3C,GAAIA,EAAK,KAAK,EAAE,WAAW,SAAS,EAClC,OAAOA,EAGT,IAAIC,EAAkBD,EAMtB,OAAAC,EAAkBA,EAAgB,QAChC,iCACA,0BACF,EAEAA,EAAkBA,EAAgB,QAChC,0CACA,mDACF,EAEAA,EAAkBA,EAAgB,QAChC,mCACA,6CACF,EAEAA,EAAkBA,EAAgB,QAChC,uBACA,0BACF,EAGAA,EAAkBA,EAAgB,QAChC,YACA,CAACtQ,EAAOuQ,EAAQC,IAAW,CAEzB,IAAMC,EAAcD,EAAO,UAAU,EAAGD,CAAM,EACxCG,GAAcD,EAAY,MAAM,IAAI,GAAK,CAAC,GAAG,OAC7CE,GAAoBF,EAAY,MAAM,IAAI,GAAK,CAAC,GAAG,OAGzD,OAAIC,EAAa,IAAM,GAAKC,EAAmB,IAAM,EAC5C3Q,EAGF,sBACT,CACF,EAGAsQ,EAAkBA,EAAgB,QAChC,wBACA,oBACF,EAEOA,CACT,CAAC,EAEyB,KAAK;AAAA,CAAI,GAIrC,IAAMM,EAAyB,MAAM,KAAK,IAAI,IAAIhC,CAAgB,CAAC,EAEnE,MAAO,CACL,QAAS/Q,EACT,iBAAkB+S,CACpB,CACF,CC/YA,OAAO3f,OAAU,OAOjB,OAAOC,OAAQ,WAGf,eAAsB2f,GACpBnf,EACA,CACA,IAAMC,EAAkC,CAAC,EAIzC,GACE,CAACT,GAAG,WAAWQ,EAAQ,GAAG,GAC1B,CAACR,GAAG,WAAWD,GAAK,QAAQS,EAAQ,IAAK,cAAc,CAAC,EAExD,OAAAC,EAAcR,CAA4B,EAAI,GACvC,CACL,OAAAQ,EACA,OAAQ,IACV,EAIF,GAAI,CAACT,GAAG,WAAWD,GAAK,QAAQS,EAAQ,IAAK,iBAAiB,CAAC,EAC7D,OAAAC,EAAcP,CAAc,EAAI,GACzB,CACL,OAAAO,EACA,OAAQ,IACV,EAGF,GAAI,CACF,IAAMc,EAAS,MAAM2W,EAAU1X,EAAQ,GAAG,EAE1C,MAAO,CACL,OAAAC,EACA,OAAQc,CACV,CACF,MAAE,CACAX,EAAO,MAAM,EACbA,EAAO,MACL,cAAcC,EAAY,KACxB,iBACF,uBAAuBA,EAAY,KACjCL,EAAQ,GACV;AAAA,0DAA+DK,EAAY,KACzE,iBACF,yBAAyBA,EAAY,KAAK,MAAM,YAClD,EACAD,EAAO,MACL,iBAAiBC,EAAY,KAC3B,4CACF,IACF,EACAD,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,CAChB,CACF,CHxDA,OAAS,WAAA0W,OAAe,YACxB,OAAS,KAAAtT,OAAS,MAEX,IAAM4b,GAAa,CACxB,CACE,KAAM,QACN,YAAa,yDACf,EACA,CACE,KAAM,QACN,YAAa,sBACf,CACF,EAEaC,GAAuB7b,GAAE,OAAO,CAC3C,IAAKA,GAAE,OAAO,EACd,KAAMA,GAAE,QAAQ,EAChB,IAAKA,GAAE,QAAQ,EACf,UAAWA,GACR,OAAO,EACP,OACEjB,GACCA,GAAS6c,GAAW,KAAME,GAAcA,EAAU,OAAS/c,CAAK,EAClE,CACE,QACE,8FACJ,CACF,EACC,SAAS,CACd,CAAC,EAEYgd,GAAU,IAAIzI,GAAQ,EAChC,KAAK,SAAS,EACd,YAAY,kBAAkB,EAC9B,SAAS,cAAe,uBAAuB,EAC/C,OACC,kBACA,4DACA,QAAQ,IAAI,CACd,EACC,OAAO,aAAc,uBAAwB,EAAK,EAClD,OAAO,YAAa,4BAA6B,EAAK,EACtD,OAAO,MAAOwI,EAAWlS,IAAS,CACjC,GAAI,CACF,IAAMpN,EAAUqf,GAAqB,MAAM,CACzC,IAAK9f,GAAK,QAAQ6N,EAAK,GAAG,EAC1B,UAAAkS,EACA,KAAMlS,EAAK,KACX,IAAKA,EAAK,GACZ,CAAC,EAED,GAAIpN,EAAQ,MAAQ,CAACA,EAAQ,UAAW,CACtCI,EAAO,KAAK,uBAAuB,EACnC,QAAWkf,KAAaF,GACtBhf,EAAO,KAAK,KAAKkf,EAAU,SAASA,EAAU,aAAa,EAE7D,OAGF,GAAI,CAACtf,EAAQ,UACX,MAAM,IAAI,MACR,wFACF,EAGF,GAAI,CAAE,OAAAC,EAAQ,OAAAc,CAAO,EAAI,MAAMoe,GAAiBnf,CAAO,EAEvD,GACEC,EAAcR,CAA4B,GAC1CQ,EAAcP,CAAc,EAE5B,MAAM,IAAI,MACR,8EACF,EAGF,GAAI,CAACqB,EACH,MAAM,IAAI,MACR,kHACF,EAGEf,EAAQ,YAAc,SACxB,MAAMyb,GAAa1a,CAAM,EAGvBf,EAAQ,YAAc,SACxB,MAAMgd,GAAajc,EAAQ,CAAE,IAAKf,EAAQ,GAAI,CAAC,CAEnD,OAASoD,EAAP,CACAhD,EAAO,MAAM,EACboT,EAAYpQ,CAAK,CACnB,CACF,CAAC,EIpGH,UAAY5D,MAAQ,cACpB,UAAYD,OAAU,OCDtB,OAAOA,OAAU,OAMjB,OAAOC,OAAQ,WAGf,eAAsBggB,GACpBxf,EACA,CACA,IAAMC,EAAkC,CAAC,EAEnCga,EAAe,CACnB,IAAKja,EAAQ,IACb,aAAcT,GAAK,QAAQS,EAAQ,IAAKA,EAAQ,YAAY,EAC5D,UAAWT,GAAK,QAAQS,EAAQ,IAAKA,EAAQ,SAAS,CACxD,EAGA,GAAI,CAACR,GAAG,WAAWya,EAAa,YAAY,EAC1C,OAAAha,EAAcH,CAA2B,EAAI,GACtC,CACL,OAAAG,EACA,aAAc,KACd,OAAQ,IACV,EAIF,GAAI,CAACT,GAAG,WAAWD,GAAK,QAAQS,EAAQ,IAAK,iBAAiB,CAAC,EAC7D,OAAAC,EAAcP,CAAc,EAAI,GACzB,CACL,OAAAO,EACA,aAAc,KACd,OAAQ,IACV,EAIF,MAAMT,GAAG,MAAMya,EAAa,UAAW,CAAE,UAAW,EAAK,CAAC,EAE1D,GAAI,CACF,IAAMlZ,EAAS,MAAM2W,EAAU1X,EAAQ,GAAG,EAE1C,MAAO,CACL,OAAAC,EACA,OAAQc,EACR,aAAAkZ,CACF,CACF,MAAE,CACA7Z,EAAO,MAAM,EACbA,EAAO,MACL,cAAcC,EAAY,KACxB,iBACF,uBAAuBA,EAAY,KACjCL,EAAQ,GACV;AAAA,6DAAkEK,EAAY,KAC5E,iBACF,yBAAyBA,EAAY,KAAK,MAAM,YAClD,EACAD,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,CAChB,CACF,CCjEA,UAAYZ,MAAQ,cACpB,OAAS,UAAAsJ,OAAc,KACvB,UAAYvJ,MAAU,OAKtB,OAAS,WAAAgN,GAAS,cAAAC,OAAkB,WACpC,OAAS,cAAAgB,OAAkB,iBAG3B,IAAMiS,GAA6B,CAAC,OAAQ,MAAO,OAAQ,MAAO,MAAM,EAClEC,GAAsB,CAAC,cAAc,EACrCC,GAAuB,CAC3B,kCACA,qBACF,EAEM5S,GAAU,IAAIR,GAAQ,CAC1B,gBAAiB,CAAC,CACpB,CAAC,EAIM,SAASqT,GACdrU,EACe,CAEf,GAAIoU,GAAqB,KAAME,GAAYA,EAAQ,KAAKtU,CAAe,CAAC,EACtE,OAAO,KAWT,GANI,CAACA,EAAgB,WAAW,GAAG,GAAKA,EAAgB,SAAS,GAAG,IAClEA,EAAkBA,EAAgB,MAAM,GAAG,EAAE,CAAC,GAK5CA,EAAgB,WAAW,GAAG,EAAG,CACnC,IAAMhC,EAAQgC,EAAgB,MAAM,GAAG,EACnChC,EAAM,OAAS,IACjBgC,EAAkBhC,EAAM,MAAM,EAAG,CAAC,EAAE,KAAK,GAAG,GAIhD,OAAOgC,CACT,CAEA,eAAsBuU,GACpB7R,EACAlN,EACAR,EACAwf,EAA8B,IAAI,IAC2C,CAC7E,IAAMC,EAAwB,UAAQjf,EAAO,cAAc,IAAKkN,CAAQ,EAClEgS,EAAgC,WACpClf,EAAO,cAAc,IACrBif,CACF,EAGA,GAAIN,GAAoB,SAASO,CAAwB,EACvD,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAIvC,IAAMC,EAAqB,UAAQjS,CAAQ,EAC3C,GAAI,CAACwR,GAA2B,SAASS,CAAa,EACpD,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAIvC,GAAIH,EAAe,IAAIE,CAAwB,EAC7C,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAKvC,GAHAF,EAAe,IAAIE,CAAwB,EAGvC,EADS,MAAS,OAAKD,CAAgB,GACjC,OAAO,EAEf,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAGvC,IAAMxR,EAAU,MAAS,WAASwR,EAAkB,OAAO,EACrD1S,EAAW,MAAMN,GAA0B,WAASgT,CAAgB,CAAC,EACrE/W,EAAa8D,GAAQ,iBAAiBO,EAAUkB,EAAS,CAC7D,WAAYhC,GAAW,GACzB,CAAC,EACK8D,EAAW,MAAM9C,GAAWzM,EAAO,cAAc,GAAG,EAC1D,GAAIuP,EAAS,aAAe,SAC1B,MAAO,CAAE,aAAc,CAAC,EAAG,MAAO,CAAC,CAAE,EAGvC,IAAM5C,EAAqD,CAAC,EACtDtF,EAAe,IAAI,IAGnB+X,EAAWC,GAAkBnS,CAAQ,EACrCoS,EAAe,CACnB,KAAMJ,EACN,KAAME,EACN,OAAQ,EACV,EACAzS,EAAM,KAAK2S,CAAY,EAGvB,IAAMC,EAAmBrX,EAAW,sBAAsB,EAC1D,QAAWsX,KAAmBD,EAAkB,CAC9C,IAAM/U,EAAkBgV,EAAgB,wBAAwB,EAE1DC,EAAmBjV,EAAgB,WAAW,GAAG,EAMvD,GAAI,CALkBA,EAAgB,WACpC,GAAGhL,EAAY,cACjB,GAGsB,CAACigB,EAAkB,CACvC,IAAMC,EAAab,GAAiCrU,CAAe,EAC/DkV,GACFrY,EAAa,IAAIqY,CAAU,EAE7B,SAGF,IAAIhQ,EAAyB,MAAMC,GAAcnF,EAAiB+E,CAAQ,EAS1E,GAPIkQ,IACF/P,EAA8B,UACvB,UAAQuP,CAAgB,EAC7BzU,CACF,GAGE,CAACkF,EACH,SAMF,GAAI,CADsB,UAAQA,CAAsB,EAEtD,QAAWiC,KAAO+M,GAA4B,CAC5C,IAAMiB,GAAsB,GAAGjQ,IAAyBiC,IACxD,GAAI,CACF,MAAS,SAAOgO,EAAW,EAC3BjQ,EAAyBiQ,GACzB,KACF,MAAE,CACA,QACF,EAIJ,IAAMC,GAAsC,WAC1C5f,EAAO,cAAc,IACrB0P,CACF,EAGA,GACEsP,EAAe,IAAIY,EAA8B,GACjDjB,GAAoB,SAASiB,EAA8B,EAE3D,SAGF,IAAMR,GAAWC,GAAkB7U,CAAe,EAC5CyC,GAAO,CACX,KAAM2S,GACN,KAAMR,GACN,OAAQ,EACV,GAGIA,KAAa,iBAAmBA,KAAa,mBAC/CnS,GAAK,OAASzC,GAGhBmC,EAAM,KAAKM,EAAI,EAGf,IAAM4S,GAAgB,MAAMd,GAC1Ba,GACA5f,EACAR,EACAwf,CACF,EAEA,GAAIa,GAAc,MAEhB,QAAW5S,KAAQ4S,GAAc,MAC1Bb,EAAe,IAAI/R,EAAK,IAAI,IAC/B+R,EAAe,IAAI/R,EAAK,IAAI,EAC5BN,EAAM,KAAKM,CAAI,GAKjB4S,GAAc,cAChBA,GAAc,aAAa,QAASlY,GAAQN,EAAa,IAAIM,CAAG,CAAC,EAKrE,IAAMmY,EAAc,MAAM,KACxB,IAAI,IAAInT,EAAM,IAAKM,GAAS,CAACA,EAAK,KAAMA,CAAI,CAAC,CAAC,EAAE,OAAO,CACzD,EAEA,MAAO,CACL,aAAc,MAAM,KAAK5F,CAAY,EACrC,MAAOyY,CACT,CACF,CAEA,eAAe7T,GAAqBC,EAAkB,CACpD,IAAMC,EAAM,MAAS,UAAa,OAAKpE,GAAO,EAAG,SAAS,CAAC,EAC3D,OAAY,OAAKoE,EAAKD,CAAQ,CAChC,CAIA,SAASmT,GACP7U,EAC4C,CAC5C,OAAIA,EAAgB,SAAS,MAAM,EAC1B,cAGLA,EAAgB,SAAS,OAAO,EAC3B,eAGLA,EAAgB,SAAS,SAAS,EAC7B,iBAGLA,EAAgB,SAAS,cAAc,EAClC,qBAIX,CFvOA,OAAS,WAAAuL,OAAe,YACxB,OAAS,KAAAtT,OAAS,MAEX,IAAM0W,GAAqB1W,GAAE,OAAO,CACzC,IAAKA,GAAE,OAAO,EACd,aAAcA,GAAE,OAAO,EACvB,UAAWA,GAAE,OAAO,EACpB,QAASA,GAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAK,CAC/C,CAAC,EAEY2W,GAAQ,IAAIrD,GAAQ,EAC9B,KAAK,gBAAgB,EACrB,YAAY,oCAAoC,EAChD,SAAS,aAAc,6BAA8B,iBAAiB,EACtE,OACC,sBACA,uCACA,YACF,EACC,OACC,kBACA,4DACA,QAAQ,IAAI,CACd,EACC,OAAO,gBAAiB,gBAAgB,EACxC,OAAO,MAAOsD,EAAkBhN,IAAS,CACxC,MAAM0T,GAAc,CAClB,IAAU,WAAQ1T,EAAK,GAAG,EAC1B,aAAcgN,EACd,UAAWhN,EAAK,OAChB,QAASA,EAAK,OAChB,CAAC,CACH,CAAC,EAEH,eAAe0T,GAAc1T,EAA0C,CACrE,GAAI,CACF,IAAMpN,EAAUka,GAAmB,MAAM9M,CAAI,EAEvC,CAAC,CAAE,OAAAnN,EAAQ,aAAAga,EAAc,OAAAlZ,CAAO,EAAGR,CAAW,EAAI,MAAM,QAAQ,IAAI,CACxEif,GAAuBxf,CAAO,EAC9BQ,EAAeR,EAAQ,GAAG,CAC5B,CAAC,GAEGC,EAAcP,CAAc,GAAK,CAACqB,GAAU,CAACR,KAC/CH,EAAO,MACL,KAAKC,EAAY,KACf,iBACF,iDAAiDA,EAAY,KAC3D,aACF,kBACF,EACAD,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,IAGZH,EAAcH,CAA2B,GAAK,CAACma,KACjD7Z,EAAO,MACL,wCAAwCC,EAAY,KAC7C,WAAQL,EAAQ,IAAKA,EAAQ,YAAY,CAChD,IACF,EACAI,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGhB,IAAMoO,EAAU,MAAS,WAASyL,EAAa,aAAc,OAAO,EAC9D9N,EAASkO,GAAe,UAAU,KAAK,MAAM7L,CAAO,CAAC,EAEtDrC,EAAO,UACV/L,EAAO,MACL,kCAAkCC,EAAY,KAC5C4Z,EAAa,YACf,IACF,EACA7Z,EAAO,MAAM,EACb,QAAQ,KAAK,CAAC,GAGhB,IAAMka,EAAena,EAAQ,sBAAsB,EAG7C4gB,EAAmB,MAAMlN,GAC7B1H,EAAO,KACPpL,EACAR,CACF,EAGA,QAAW4Y,KAAgB4H,EAAiB,MAE1C5H,EAAa,MAAQA,EAAa,OAAO,OACvC,CAACnL,EAAMqQ,EAAOC,IACZD,IAAUC,EAAK,UAAW0C,GAAMA,EAAE,OAAShT,EAAK,IAAI,CACxD,EAGImL,EAAa,eACfA,EAAa,aAAeA,EAAa,aAAa,OACpD,CAACzQ,EAAK2V,EAAOC,IAASD,IAAUC,EAAK,UAAW2C,GAAMA,IAAMvY,CAAG,CACjE,GAIJ,QAAWyQ,KAAgB4H,EAAiB,MAAO,CACjD,GAAI,CAAC5H,EAAa,MAChB,SAGFmB,EAAa,MAAM,YAAYnB,EAAa,SAAS,EAGrDA,EAAa,QACX,kDAEF,QAAWnL,KAAQmL,EAAa,MAAO,CACrC,IAAM+H,EAAe,WAAQjH,EAAa,IAAKjM,EAAK,IAAI,EACxD,GAAI,CAEF,GAAI,EADS,MAAS,OAAKkT,CAAO,GACxB,OAAO,EACf,SAEFlT,EAAK,QAAa,MAAS,WAASkT,EAAS,OAAO,CACtD,OAASC,EAAP,CACA,QAAQ,MAAM,wCAAyCD,EAASC,CAAG,EACnE,QACF,EAGF,IAAMhV,EAAS6H,EAAmB,UAAUmF,CAAY,EACxD,GAAI,CAAChN,EAAO,QAAS,CACnB/L,EAAO,MACL,mCAAmCC,EAAY,KAC7C8Y,EAAa,IACf,IACF,EACA,SAIF,MAAS,YACF,WAAQc,EAAa,UAAW,GAAG9N,EAAO,KAAK,WAAW,EAC/D,KAAK,UAAUA,EAAO,KAAM,KAAM,CAAC,CACrC,EAWF,GAPA,MAAS,WACP8N,EAAa,aACR,WAAQA,EAAa,UAAW,eAAe,CACtD,EAEAK,EAAa,QAAQ,oBAAoB,EAErCta,EAAQ,QAAS,CACnBG,EACE,oBAAoBE,EAAY,KAC9B0gB,EAAiB,MAAM,OAAO,SAAS,CACzC,UACF,EAAE,QAAQ,EACV,QAAW1J,KAAQ0J,EAAiB,MAAO,CACzC3gB,EAAO,IAAI,OAAOiX,EAAK,SAAShX,EAAY,KAAKgX,EAAK,IAAI,IAAI,EAC9D,QAAWrJ,KAAQqJ,EAAK,OAAS,CAAC,EAChCjX,EAAO,IAAI,SAAS4N,EAAK,MAAM,GAIvC,OAAS5K,EAAP,CACAhD,EAAO,MAAM,EACboT,EAAYpQ,CAAK,CACnB,CACF,CAGA,eAAeyQ,GACbuG,EACArZ,EACAR,EACyC,CACzC,QAAW8W,KAAQ+C,EAAS,MAC1B,GAAK/C,EAAK,OAAO,OAKjB,QAAWrJ,KAAQqJ,EAAK,MAAO,CAC7B,IAAM+J,EAAU,MAAMtB,GACpB9R,EAAK,KACLjN,EACAR,CACF,EAGA6gB,EAAQ,MAAQA,EAAQ,OAAO,OAAQhT,GAAMA,EAAE,OAASJ,EAAK,IAAI,EAE7DoT,EAAQ,OACV/J,EAAK,MAAM,KAAK,GAAG+J,EAAQ,KAAK,EAG9BA,EAAQ,eACV/J,EAAK,aAAeA,EAAK,aACrBA,EAAK,aAAa,OAAO+J,EAAQ,YAAY,EAC7CA,EAAQ,cAKlB,OAAOhH,CACT,CGxNA,OAAS,wBAAAiH,OAA4B,4CACrC,OAAS,WAAAvK,OAAe,YAEjB,IAAMwK,GAAM,IAAIxK,GAAQ,EAC5B,KAAK,cAAc,EACnB,YAAY,+CAA+C,EAC3D,OACC,kBACA,4DACA,QAAQ,IAAI,CACd,EACC,OAAO,SAAY,CAClB,GAAI,CACF,IAAMyK,EAAY,IAAIF,GACtB,MAAMG,GAAO,QAAQD,CAAS,CAChC,OAASne,EAAP,CACAhD,EAAO,MAAM,EACboT,EAAYpQ,CAAK,CACnB,CACF,CAAC,ECbH,OAAS,WAAA0T,OAAe,YCTxB,IAAA2K,GAAA,CACE,KAAQ,SACR,QAAW,QACX,YAAe,+BACf,cAAiB,CACf,OAAU,QACZ,EACA,QAAW,MACX,OAAU,CACR,KAAQ,SACR,IAAO,4BACT,EACA,WAAc,CACZ,KAAQ,MACR,IAAO,mCACP,UAAa,iBACf,EACA,MAAS,CACP,MACF,EACA,SAAY,CACV,aACA,KACA,WACA,WACA,QACF,EACA,KAAQ,SACR,QAAW,CACT,IAAK,CACH,MAAS,oBACT,QAAW,iBACb,EACA,aAAc,CACZ,MAAS,6BACT,QAAW,0BACb,EACA,QAAS,CACP,MAAS,wBACT,QAAW,qBACb,CACF,EACA,IAAO,kBACP,QAAW,CACT,IAAO,eACP,MAAS,OACT,UAAa,eACb,MAAS,mCACT,YAAa,oEACb,aAAc,oEACd,MAAS,qBACT,eAAgB,+CAChB,eAAgB,+CAChB,QAAW,oBACX,WAAY,wEACZ,WAAY,wEACZ,cAAe,6CACf,KAAQ,aACR,WAAY,iDACd,EACA,aAAgB,CACd,YAAa,UACb,cAAe,UACf,gBAAiB,UACjB,qCAAsC,UACtC,4BAA6B,UAC7B,UAAa,UACb,YAAe,SACf,UAAa,SACb,KAAQ,SACR,MAAS,SACT,YAAa,SACb,WAAY,UACZ,oBAAqB,SACrB,MAAS,SACT,IAAO,SACP,aAAc,SACd,IAAO,SACP,QAAW,UACX,QAAW,SACX,OAAU,UACV,mBAAoB,SACpB,WAAY,UACZ,iBAAkB,SAClB,IAAO,UACP,qBAAsB,SACxB,EACA,gBAAmB,CACjB,qBAAsB,UACtB,cAAe,SACf,kBAAmB,UACnB,iBAAkB,SAClB,0BAA2B,SAC3B,OAAU,SACV,KAAQ,SACR,YAAa,SACb,WAAc,QAChB,CACF,EDrFA,QAAQ,GAAG,SAAU,IAAM,QAAQ,KAAK,CAAC,CAAC,EAC1C,QAAQ,GAAG,UAAW,IAAM,QAAQ,KAAK,CAAC,CAAC,EAE3C,eAAeC,IAAO,CACpB,IAAMC,EAAU,IAAI7K,GAAQ,EACzB,KAAK,QAAQ,EACb,YAAY,iDAAiD,EAC7D,QACC2K,GAAY,SAAW,QACvB,gBACA,4BACF,EAEFE,EACG,WAAWxK,EAAI,EACf,WAAWmC,EAAG,EACd,WAAWmB,EAAI,EACf,WAAW8E,EAAO,EAClB,WAAWjE,EAAI,EACf,WAAWnB,EAAK,EAGnBwH,EAAQ,WAAWxH,EAAa,EAAE,WAAWmH,EAAW,EAExDK,EAAQ,MAAM,CAChB,CAEAD,GAAK","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 (shouldPromptForNpmFlag(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 shouldPromptForNpmFlag(config: Config) {\n const packageInfo = getPackageInfo(config.resolvedPaths.cwd, false)\n\n if (!packageInfo?.dependencies?.react) {\n return false\n }\n\n const hasReact19 = /^(?:\\^|~)?19(?:\\.\\d+)*(?:-.*)?$/.test(\n packageInfo.dependencies.react\n )\n const hasReactDayPicker8 =\n packageInfo.dependencies[\"react-day-picker\"]?.startsWith(\"8\")\n\n return hasReact19 && hasReactDayPicker8\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 // Skip if the file extension is not one of the supported extensions.\n if (![\".tsx\", \".ts\", \".jsx\", \".js\"].includes(sourceFile.getExtension())) {\n continue\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 if (![\".tsx\", \".ts\", \".jsx\", \".js\"].includes(sourceFile.getExtension())) {\n return sourceFile\n }\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 {\n TailwindVersion,\n getProjectTailwindVersionFromConfig,\n} from \"../get-project-info\"\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 const tailwindVersion = await getProjectTailwindVersionFromConfig(config)\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\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 tailwindVersion\n )}\"`\n )\n }\n }\n }\n })\n }\n }\n })\n\n return sourceFile\n}\n\nexport function applyPrefix(\n input: string,\n prefix: string = \"\",\n tailwindVersion: TailwindVersion\n) {\n if (tailwindVersion === \"v3\") {\n return input\n .split(\" \")\n .map((className) => {\n const [variant, value, modifier] = splitClassName(className)\n if (variant) {\n return modifier\n ? `${variant}:${prefix}${value}/${modifier}`\n : `${variant}:${prefix}${value}`\n } else {\n return modifier\n ? `${prefix}${value}/${modifier}`\n : `${prefix}${value}`\n }\n })\n .join(\" \")\n }\n\n return input\n .split(\" \")\n .map((className) =>\n className.indexOf(`${prefix}:`) === 0\n ? className\n : `${prefix}:${className.trim()}`\n )\n .join(\" \")\n}\n\nexport function applyPrefixesCss(\n css: string,\n prefix: string,\n tailwindVersion: TailwindVersion\n) {\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, tailwindVersion)\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 { migrateRadix } from \"@/src/migrations/migrate-radix\"\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 {\n name: \"radix\",\n description: \"migrate to radix-ui.\",\n },\n] as const\n\nexport const migrateOptionsSchema = z.object({\n cwd: z.string(),\n list: z.boolean(),\n yes: 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 .option(\"-y, --yes\", \"skip confirmation prompt.\", 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 yes: opts.yes,\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\n if (options.migration === \"radix\") {\n await migrateRadix(config, { yes: options.yes })\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 { promises as fs } from \"fs\"\nimport path from \"path\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\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\"\n\nfunction toPascalCase(str: string): string {\n return str\n .split(\"-\")\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\"\")\n}\n\nfunction processNamedImports(\n namedImports: string,\n isTypeOnly: boolean,\n imports: Array<{ name: string; alias?: string; isType?: boolean }>,\n packageName: string\n) {\n // Clean up multi-line imports.\n // Remove comments and whitespace.\n const cleanedImports = namedImports\n .replace(/\\/\\/.*$/gm, \"\")\n .replace(/\\/\\*[\\s\\S]*?\\*\\//g, \"\")\n .replace(/\\s+/g, \" \")\n .trim()\n\n const namedImportList = cleanedImports\n .split(\",\")\n .map((importItem) => importItem.trim())\n .filter(Boolean)\n\n for (const importItem of namedImportList) {\n const inlineTypeMatch = importItem.match(/^type\\s+(\\w+)(?:\\s+as\\s+(\\w+))?$/)\n const aliasMatch = importItem.match(/^(\\w+)\\s+as\\s+(\\w+)$/)\n\n if (inlineTypeMatch) {\n // Inline type: \"type DialogProps\" or \"type DialogProps as Props\"\n const importName = inlineTypeMatch[1]\n const importAlias = inlineTypeMatch[2]\n\n if (packageName === \"slot\" && importName === \"Slot\" && !importAlias) {\n imports.push({\n name: \"Slot\",\n alias: \"SlotPrimitive\",\n isType: true,\n })\n } else {\n imports.push({\n name: importName,\n alias: importAlias,\n isType: true,\n })\n }\n } else if (aliasMatch) {\n // Regular import with alias: \"Root as DialogRoot\"\n const importName = aliasMatch[1]\n const importAlias = aliasMatch[2]\n\n if (\n packageName === \"slot\" &&\n importName === \"Slot\" &&\n importAlias === \"Slot\"\n ) {\n imports.push({\n name: \"Slot\",\n alias: \"SlotPrimitive\",\n isType: isTypeOnly,\n })\n } else {\n imports.push({\n name: importName,\n alias: importAlias,\n isType: isTypeOnly,\n })\n }\n } else {\n // Simple import: \"Root\"\n // Special handling for Slot: always alias it as SlotPrimitive\n if (packageName === \"slot\" && importItem === \"Slot\") {\n imports.push({\n name: \"Slot\",\n alias: \"SlotPrimitive\",\n isType: isTypeOnly,\n })\n } else {\n imports.push({\n name: importItem,\n isType: isTypeOnly,\n })\n }\n }\n }\n}\n\nexport async function migrateRadix(\n config: Config,\n options: { yes?: boolean } = {}\n) {\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 = await fg(\"**/*.{js,ts,jsx,tsx}\", {\n cwd: uiPath,\n })\n\n if (!options.yes) {\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 )} to ${highlighter.info(\"radix-ui\")}. Continue?`,\n })\n\n if (!confirm) {\n logger.info(\"Migration cancelled.\")\n process.exit(0)\n }\n }\n\n const migrationSpinner = spinner(`Migrating imports...`)?.start()\n const foundPackages = new Set<string>()\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, replacedPackages } = await migrateRadixFile(fileContent)\n\n // Track which packages we found\n replacedPackages.forEach((pkg) => foundPackages.add(pkg))\n\n await fs.writeFile(filePath, content)\n })\n )\n\n migrationSpinner.succeed(\"Migrating imports.\")\n\n // Update package.json dependencies\n const packageSpinner = spinner(`Updating package.json...`)?.start()\n\n try {\n const packageJson = getPackageInfo(config.resolvedPaths.cwd, false)\n\n if (!packageJson) {\n packageSpinner.fail(\"Could not read package.json\")\n logger.warn(\n \"Could not update package.json. You may need to manually replace @radix-ui/react-* packages with radix-ui\"\n )\n return\n }\n\n const foundPackagesArray = Array.from(foundPackages)\n\n // Remove packages from both dependencies and devDependencies if found in source files\n const dependencyTypes = [\"dependencies\", \"devDependencies\"] as const\n for (const depType of dependencyTypes) {\n if (packageJson[depType]) {\n for (const pkg of foundPackagesArray) {\n if (packageJson[depType]![pkg]) {\n delete packageJson[depType]![pkg]\n }\n }\n }\n }\n\n // Add radix-ui if we found any Radix packages.\n if (foundPackagesArray.length > 0) {\n if (!packageJson.dependencies) {\n packageJson.dependencies = {}\n }\n packageJson.dependencies[\"radix-ui\"] = \"latest\"\n\n const packageJsonPath = path.join(\n config.resolvedPaths.cwd,\n \"package.json\"\n )\n await fs.writeFile(\n packageJsonPath,\n JSON.stringify(packageJson, null, 2) + \"\\n\"\n )\n\n packageSpinner.succeed(`Updated package.json.`)\n\n // Install radix-ui dependency.\n await updateDependencies([\"radix-ui\"], [], config, { silent: false })\n } else {\n packageSpinner.succeed(\"No packages found in source files.\")\n }\n } catch (error) {\n packageSpinner.fail(\"Failed to update package.json\")\n logger.warn(\n \"You may need to manually replace @radix-ui/react-* packages with radix-ui\"\n )\n }\n}\n\nexport async function migrateRadixFile(\n content: string\n): Promise<{ content: string; replacedPackages: string[] }> {\n // Enhanced regex to handle type-only imports, but exclude react-icons\n // Also capture optional semicolon at the end\n const radixImportPattern =\n /import\\s+(?:(type)\\s+)?(?:\\*\\s+as\\s+(\\w+)|{([^}]+)})\\s+from\\s+([\"'])@radix-ui\\/react-([^\"']+)\\4(;?)/g\n\n const imports: Array<{ name: string; alias?: string; isType?: boolean }> = []\n const linesToRemove: string[] = []\n const replacedPackages: string[] = []\n let quoteStyle = '\"' // Default to double quotes\n let hasSemicolon = false // Track if any import had a semicolon\n\n let result = content\n let match\n\n // Find all Radix imports\n while ((match = radixImportPattern.exec(content)) !== null) {\n const [\n fullMatch,\n typeKeyword,\n namespaceAlias,\n namedImports,\n quote,\n packageName,\n semicolon,\n ] = match\n\n // Skip react-icons package and any sub-paths (like react-icons/dist/types)\n if (packageName === \"icons\" || packageName.startsWith(\"icons/\")) {\n continue\n }\n\n linesToRemove.push(fullMatch)\n\n // Use the quote style and semicolon style from the first import\n if (linesToRemove.length === 1) {\n quoteStyle = quote\n hasSemicolon = semicolon === \";\"\n }\n\n // Track which package we're replacing\n replacedPackages.push(`@radix-ui/react-${packageName}`)\n\n const isTypeOnly = Boolean(typeKeyword)\n\n if (namespaceAlias) {\n // Handle namespace imports: import * as DialogPrimitive from \"@radix-ui/react-dialog\"\n const componentName = toPascalCase(packageName)\n imports.push({\n name: componentName,\n alias: namespaceAlias,\n isType: isTypeOnly,\n })\n } else if (namedImports) {\n // Handle named imports: import { Root, Trigger } from \"@radix-ui/react-dialog\"\n // or import type { DialogProps } from \"@radix-ui/react-dialog\"\n // or import { type DialogProps, Root } from \"@radix-ui/react-dialog\"\n\n processNamedImports(namedImports, isTypeOnly, imports, packageName)\n }\n }\n\n if (imports.length === 0) {\n return {\n content,\n replacedPackages: [],\n }\n }\n\n // Remove duplicates.\n // Considering name, alias, and type status.\n const uniqueImports = imports.filter(\n (importName, index, self) =>\n index ===\n self.findIndex(\n (i) =>\n i.name === importName.name &&\n i.alias === importName.alias &&\n i.isType === importName.isType\n )\n )\n\n // Create the unified import with preserved quote style and type annotations\n const importList = uniqueImports\n .map((imp) => {\n const typePrefix = imp.isType ? \"type \" : \"\"\n return imp.alias\n ? `${typePrefix}${imp.name} as ${imp.alias}`\n : `${typePrefix}${imp.name}`\n })\n .join(\", \")\n\n const unifiedImport = `import { ${importList} } from ${quoteStyle}radix-ui${quoteStyle}${\n hasSemicolon ? \";\" : \"\"\n }`\n\n // Replace first import with unified import, remove the rest\n result = linesToRemove.reduce((acc, line, index) => {\n return acc.replace(line, index === 0 ? unifiedImport : \"\")\n }, result)\n\n // Clean up extra blank lines\n result = result.replace(/\\n\\s*\\n\\s*\\n/g, \"\\n\\n\")\n\n // Handle special case for Slot usage transformation\n // Now that we import { Slot as SlotPrimitive }, we need to:\n // 1. Transform: const Comp = asChild ? Slot : [ANYTHING] -> const Comp = asChild ? SlotPrimitive.Slot : [ANYTHING]\n // 2. Transform: React.ComponentProps<typeof Slot> -> React.ComponentProps<typeof SlotPrimitive.Slot>\n const hasSlotImport = uniqueImports.some(\n (imp) => imp.name === \"Slot\" && imp.alias === \"SlotPrimitive\"\n )\n\n if (hasSlotImport) {\n // Find all lines that are NOT import lines to avoid transforming the import statement itself\n const lines = result.split(\"\\n\")\n const transformedLines = lines.map((line) => {\n // Skip import lines\n if (line.trim().startsWith(\"import \")) {\n return line\n }\n\n let transformedLine = line\n\n // Handle all Slot references in one comprehensive pass\n // Use placeholders to avoid double replacements\n\n // First, mark specific patterns with placeholders\n transformedLine = transformedLine.replace(\n /\\b(asChild\\s*\\?\\s*)Slot(\\s*:)/g,\n \"$1__SLOT_PLACEHOLDER__$2\"\n )\n\n transformedLine = transformedLine.replace(\n /\\bReact\\.ComponentProps<typeof\\s+Slot>/g,\n \"React.ComponentProps<typeof __SLOT_PLACEHOLDER__>\"\n )\n\n transformedLine = transformedLine.replace(\n /\\bComponentProps<typeof\\s+Slot>/g,\n \"ComponentProps<typeof __SLOT_PLACEHOLDER__>\"\n )\n\n transformedLine = transformedLine.replace(\n /(<\\/?)Slot(\\s*\\/?>)/g,\n \"$1__SLOT_PLACEHOLDER__$2\"\n )\n\n // Handle any other standalone Slot usage\n transformedLine = transformedLine.replace(\n /\\bSlot\\b/g,\n (match, offset, string) => {\n // Don't transform if it's inside quotes\n const beforeMatch = string.substring(0, offset)\n const openQuotes = (beforeMatch.match(/\"/g) || []).length\n const openSingleQuotes = (beforeMatch.match(/'/g) || []).length\n\n // If we're inside quotes, don't transform\n if (openQuotes % 2 !== 0 || openSingleQuotes % 2 !== 0) {\n return match\n }\n\n return \"__SLOT_PLACEHOLDER__\"\n }\n )\n\n // Finally, replace all placeholders with SlotPrimitive.Slot\n transformedLine = transformedLine.replace(\n /__SLOT_PLACEHOLDER__/g,\n \"SlotPrimitive.Slot\"\n )\n\n return transformedLine\n })\n\n result = transformedLines.join(\"\\n\")\n }\n\n // Remove duplicate packages\n const uniqueReplacedPackages = Array.from(new Set(replacedPackages))\n\n return {\n content: result,\n replacedPackages: uniqueReplacedPackages,\n }\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","import * as fs from \"fs/promises\"\nimport * as path from \"path\"\nimport { preFlightRegistryBuild } from \"@/src/preflights/preflight-registry\"\nimport { registryItemSchema, registrySchema } from \"@/src/registry\"\nimport { recursivelyResolveFileImports } from \"@/src/registry/utils\"\nimport * as ERRORS from \"@/src/utils/errors\"\nimport { configSchema } from \"@/src/utils/get-config\"\nimport { ProjectInfo, 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 { 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 verbose: z.boolean().optional().default(false),\n})\n\nexport const build = new Command()\n .name(\"registry:build\")\n .description(\"builds the registry [EXPERIMENTAL]\")\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 .option(\"-v, --verbose\", \"verbose output\")\n .action(async (registry: string, opts) => {\n await buildRegistry({\n cwd: path.resolve(opts.cwd),\n registryFile: registry,\n outputDir: opts.output,\n verbose: opts.verbose,\n })\n })\n\nasync function buildRegistry(opts: z.infer<typeof buildOptionsSchema>) {\n try {\n const options = buildOptionsSchema.parse(opts)\n\n const [{ errors, resolvePaths, config }, projectInfo] = await Promise.all([\n preFlightRegistryBuild(options),\n getProjectInfo(options.cwd),\n ])\n\n if (errors[ERRORS.MISSING_CONFIG] || !config || !projectInfo) {\n logger.error(\n `A ${highlighter.info(\n \"components.json\"\n )} file is required to build the registry. Run ${highlighter.info(\n \"shadcn init\"\n )} to create one.`\n )\n logger.break()\n process.exit(1)\n }\n\n if (errors[ERRORS.BUILD_MISSING_REGISTRY_FILE] || !resolvePaths) {\n logger.error(\n `We could not find a registry file at ${highlighter.info(\n path.resolve(options.cwd, options.registryFile)\n )}.`\n )\n logger.break()\n process.exit(1)\n }\n\n const content = await fs.readFile(resolvePaths.registryFile, \"utf-8\")\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 logger.break()\n process.exit(1)\n }\n\n const buildSpinner = spinner(\"Building registry...\")\n\n // Recursively resolve the registry items.\n const resolvedRegistry = await resolveRegistryItems(\n result.data,\n config,\n projectInfo\n )\n\n // Loop through the registry items and remove duplicates files i.e same path.\n for (const registryItem of resolvedRegistry.items) {\n // Deduplicate files\n registryItem.files = registryItem.files?.filter(\n (file, index, self) =>\n index === self.findIndex((t) => t.path === file.path)\n )\n\n // Deduplicate dependencies\n if (registryItem.dependencies) {\n registryItem.dependencies = registryItem.dependencies.filter(\n (dep, index, self) => index === self.findIndex((d) => d === dep)\n )\n }\n }\n\n for (const registryItem of resolvedRegistry.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 for (const file of registryItem.files) {\n const absPath = path.resolve(resolvePaths.cwd, file.path)\n try {\n const stat = await fs.stat(absPath)\n if (!stat.isFile()) {\n continue\n }\n file[\"content\"] = await fs.readFile(absPath, \"utf-8\")\n } catch (err) {\n console.error(\"Error reading file in registry build:\", absPath, err)\n continue\n }\n }\n\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 // Copy registry.json to the output directory.\n await fs.copyFile(\n resolvePaths.registryFile,\n path.resolve(resolvePaths.outputDir, \"registry.json\")\n )\n\n buildSpinner.succeed(\"Building registry.\")\n\n if (options.verbose) {\n spinner(\n `The registry has ${highlighter.info(\n resolvedRegistry.items.length.toString()\n )} items:`\n ).succeed()\n for (const item of resolvedRegistry.items) {\n logger.log(` - ${item.name} (${highlighter.info(item.type)})`)\n for (const file of item.files ?? []) {\n logger.log(` - ${file.path}`)\n }\n }\n }\n } catch (error) {\n logger.break()\n handleError(error)\n }\n}\n\n// This reads the registry and recursively resolves the file imports.\nasync function resolveRegistryItems(\n registry: z.infer<typeof registrySchema>,\n config: z.infer<typeof configSchema>,\n projectInfo: ProjectInfo\n): Promise<z.infer<typeof registrySchema>> {\n for (const item of registry.items) {\n if (!item.files?.length) {\n continue\n }\n\n // Process all files in the array instead of just the first one\n for (const file of item.files) {\n const results = await recursivelyResolveFileImports(\n file.path,\n config,\n projectInfo\n )\n\n // Remove file from results.files\n results.files = results.files?.filter((f) => f.path !== file.path)\n\n if (results.files) {\n item.files.push(...results.files)\n }\n\n if (results.dependencies) {\n item.dependencies = item.dependencies\n ? item.dependencies.concat(results.dependencies)\n : results.dependencies\n }\n }\n }\n\n return registry\n}\n","import path from \"path\"\nimport { buildOptionsSchema } from \"@/src/commands/build\"\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 preFlightRegistryBuild(\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 return {\n errors,\n resolvePaths: null,\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 resolvePaths: null,\n config: null,\n }\n }\n\n // Create output directory if it doesn't exist.\n await fs.mkdir(resolvePaths.outputDir, { recursive: true })\n\n try {\n const config = await getConfig(options.cwd)\n\n return {\n errors,\n config: config!,\n resolvePaths,\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 build the registry, you must create a valid ${highlighter.info(\n \"components.json\"\n )} file by running the ${highlighter.info(\"init\")} command.`\n )\n logger.break()\n process.exit(1)\n }\n}\n","import * as fs from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport * as path from \"path\"\nimport { registryItemSchema } from \"@/src/registry\"\nimport { configSchema } from \"@/src/utils/get-config\"\nimport { ProjectInfo } from \"@/src/utils/get-project-info\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { Project, ScriptKind } from \"ts-morph\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nconst FILE_EXTENSIONS_FOR_LOOKUP = [\".tsx\", \".ts\", \".jsx\", \".js\", \".css\"]\nconst FILE_PATH_SKIP_LIST = [\"lib/utils.ts\"]\nconst DEPENDENCY_SKIP_LIST = [\n /^(react|react-dom|next)(\\/.*)?$/, // Matches react, react-dom, next and their submodules\n /^(node|jsr|npm):.*$/, // Matches node:, jsr:, and npm: prefixed modules\n]\n\nconst project = new Project({\n compilerOptions: {},\n})\n\n// This returns the dependency from the module specifier.\n// Here dependency means an npm package.\nexport function getDependencyFromModuleSpecifier(\n moduleSpecifier: string\n): string | null {\n // Skip if the dependency matches any pattern in the skip list\n if (DEPENDENCY_SKIP_LIST.some((pattern) => pattern.test(moduleSpecifier))) {\n return null\n }\n\n // If the module specifier does not start with `@` and has a /, add the dependency first part only.\n // E.g. `foo/bar` -> `foo`\n if (!moduleSpecifier.startsWith(\"@\") && moduleSpecifier.includes(\"/\")) {\n moduleSpecifier = moduleSpecifier.split(\"/\")[0]\n }\n\n // For scoped packages, we want to keep the first two parts\n // E.g. `@types/react/dom` -> `@types/react`\n if (moduleSpecifier.startsWith(\"@\")) {\n const parts = moduleSpecifier.split(\"/\")\n if (parts.length > 2) {\n moduleSpecifier = parts.slice(0, 2).join(\"/\")\n }\n }\n\n return moduleSpecifier\n}\n\nexport async function recursivelyResolveFileImports(\n filePath: string,\n config: z.infer<typeof configSchema>,\n projectInfo: ProjectInfo,\n processedFiles: Set<string> = new Set()\n): Promise<Pick<z.infer<typeof registryItemSchema>, \"files\" | \"dependencies\">> {\n const resolvedFilePath = path.resolve(config.resolvedPaths.cwd, filePath)\n const relativeRegistryFilePath = path.relative(\n config.resolvedPaths.cwd,\n resolvedFilePath\n )\n\n // Skip if the file is in the skip list\n if (FILE_PATH_SKIP_LIST.includes(relativeRegistryFilePath)) {\n return { dependencies: [], files: [] }\n }\n\n // Skip if the file extension is not one of the supported extensions\n const fileExtension = path.extname(filePath)\n if (!FILE_EXTENSIONS_FOR_LOOKUP.includes(fileExtension)) {\n return { dependencies: [], files: [] }\n }\n\n // Prevent infinite loop: skip if already processed\n if (processedFiles.has(relativeRegistryFilePath)) {\n return { dependencies: [], files: [] }\n }\n processedFiles.add(relativeRegistryFilePath)\n\n const stat = await fs.stat(resolvedFilePath)\n if (!stat.isFile()) {\n // Optionally log or handle this case\n return { dependencies: [], files: [] }\n }\n\n const content = await fs.readFile(resolvedFilePath, \"utf-8\")\n const tempFile = await createTempSourceFile(path.basename(resolvedFilePath))\n const sourceFile = project.createSourceFile(tempFile, content, {\n scriptKind: ScriptKind.TSX,\n })\n const tsConfig = await loadConfig(config.resolvedPaths.cwd)\n if (tsConfig.resultType === \"failed\") {\n return { dependencies: [], files: [] }\n }\n\n const files: z.infer<typeof registryItemSchema>[\"files\"] = []\n const dependencies = new Set<string>()\n\n // Add the original file first\n const fileType = determineFileType(filePath)\n const originalFile = {\n path: relativeRegistryFilePath,\n type: fileType,\n target: \"\",\n }\n files.push(originalFile)\n\n // 1. Find all import statements in the file.\n const importStatements = sourceFile.getImportDeclarations()\n for (const importStatement of importStatements) {\n const moduleSpecifier = importStatement.getModuleSpecifierValue()\n\n const isRelativeImport = moduleSpecifier.startsWith(\".\")\n const isAliasImport = moduleSpecifier.startsWith(\n `${projectInfo.aliasPrefix}/`\n )\n\n // If not a local import, add to the dependencies array.\n if (!isAliasImport && !isRelativeImport) {\n const dependency = getDependencyFromModuleSpecifier(moduleSpecifier)\n if (dependency) {\n dependencies.add(dependency)\n }\n continue\n }\n\n let probableImportFilePath = await resolveImport(moduleSpecifier, tsConfig)\n\n if (isRelativeImport) {\n probableImportFilePath = path.resolve(\n path.dirname(resolvedFilePath),\n moduleSpecifier\n )\n }\n\n if (!probableImportFilePath) {\n continue\n }\n\n // Check if the probable import path has a file extension.\n // Try each extension until we find a file that exists.\n const hasExtension = path.extname(probableImportFilePath)\n if (!hasExtension) {\n for (const ext of FILE_EXTENSIONS_FOR_LOOKUP) {\n const pathWithExt: string = `${probableImportFilePath}${ext}`\n try {\n await fs.access(pathWithExt)\n probableImportFilePath = pathWithExt\n break\n } catch {\n continue\n }\n }\n }\n\n const nestedRelativeRegistryFilePath = path.relative(\n config.resolvedPaths.cwd,\n probableImportFilePath\n )\n\n // Skip if we've already processed this file or if it's in the skip list\n if (\n processedFiles.has(nestedRelativeRegistryFilePath) ||\n FILE_PATH_SKIP_LIST.includes(nestedRelativeRegistryFilePath)\n ) {\n continue\n }\n\n const fileType = determineFileType(moduleSpecifier)\n const file = {\n path: nestedRelativeRegistryFilePath,\n type: fileType,\n target: \"\",\n }\n\n // TODO (shadcn): fix this.\n if (fileType === \"registry:page\" || fileType === \"registry:file\") {\n file.target = moduleSpecifier\n }\n\n files.push(file)\n\n // Recursively process the imported file, passing the shared processedFiles set\n const nestedResults = await recursivelyResolveFileImports(\n nestedRelativeRegistryFilePath,\n config,\n projectInfo,\n processedFiles\n )\n\n if (nestedResults.files) {\n // Only add files that haven't been processed yet\n for (const file of nestedResults.files) {\n if (!processedFiles.has(file.path)) {\n processedFiles.add(file.path)\n files.push(file)\n }\n }\n }\n\n if (nestedResults.dependencies) {\n nestedResults.dependencies.forEach((dep) => dependencies.add(dep))\n }\n }\n\n // Deduplicate files by path\n const uniqueFiles = Array.from(\n new Map(files.map((file) => [file.path, file])).values()\n )\n\n return {\n dependencies: Array.from(dependencies),\n files: uniqueFiles,\n }\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\n// This is a bit tricky to accurately determine.\n// For now we'll use the module specifier to determine the type.\nfunction determineFileType(\n moduleSpecifier: string\n): z.infer<typeof registryItemSchema>[\"type\"] {\n if (moduleSpecifier.includes(\"/ui/\")) {\n return \"registry:ui\"\n }\n\n if (moduleSpecifier.includes(\"/lib/\")) {\n return \"registry:lib\"\n }\n\n if (moduleSpecifier.includes(\"/hooks/\")) {\n return \"registry:hook\"\n }\n\n if (moduleSpecifier.includes(\"/components/\")) {\n return \"registry:component\"\n }\n\n return \"registry:component\"\n}\n","import { server } from \"@/src/mcp\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { logger } from \"@/src/utils/logger\"\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\"\nimport { Command } from \"commander\"\n\nexport const mcp = new Command()\n .name(\"registry:mcp\")\n .description(\"starts the registry MCP server [EXPERIMENTAL]\")\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .action(async () => {\n try {\n const transport = new StdioServerTransport()\n await server.connect(transport)\n } catch (error) {\n logger.break()\n handleError(error)\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 { build as registryBuild } from \"@/src/commands/registry/build\"\nimport { mcp as registryMcp } from \"@/src/commands/registry/mcp\"\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 // Registry commands\n program.addCommand(registryBuild).addCommand(registryMcp)\n\n program.parse()\n}\n\nmain()\n\nexport * from \"./registry/api\"\n","{\n \"name\": \"shadcn\",\n \"version\": \"2.6.3\",\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 \"./mcp\": {\n \"types\": \"./dist/mcp/index.d.ts\",\n \"default\": \"./dist/mcp/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:4000/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:4000/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 \"@modelcontextprotocol/sdk\": \"^1.10.2\",\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 \"zod-to-json-schema\": \"^3.24.5\"\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"]}