hghcn 3.6.24 → 3.6.27
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/{chunk-DGLIMMUD.js → chunk-2SCX7A3M.js} +7 -7
- package/dist/{chunk-DGLIMMUD.js.map → chunk-2SCX7A3M.js.map} +1 -1
- package/dist/{chunk-SCGCXD6H.js → chunk-QO42GKD6.js} +7 -7
- package/dist/chunk-QO42GKD6.js.map +1 -0
- package/dist/index.js +51 -53
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/registry/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-SCGCXD6H.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/registry/constants.ts","../src/registry/env.ts","../src/registry/errors.ts","../src/registry/parser.ts","../src/utils/frameworks.ts","../src/utils/highlighter.ts","../src/utils/resolve-import.ts","../src/utils/get-config.ts","../src/utils/get-package-info.ts","../src/utils/get-project-info.ts","../src/utils/compare.ts","../src/utils/env-helpers.ts","../src/utils/logger.ts","../src/utils/spinner.ts","../src/utils/transformers/transform-css-vars.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/transformers/index.ts","../src/utils/transformers/transform-aschild.ts","../src/utils/transformers/transform-next.ts","../src/utils/updaters/update-files.ts","../src/registry/utils.ts","../src/registry/config.ts","../src/registry/context.ts","../src/registry/validator.ts","../src/registry/builder.ts","../src/registry/fetcher.ts","../src/utils/updaters/update-tailwind-config.ts","../src/registry/resolver.ts","../src/utils/handle-error.ts","../src/registry/api.ts","../src/registry/search.ts"],"names":["REGISTRY_URL","FALLBACK_STYLE","BASE_COLORS","BUILTIN_REGISTRIES","DEPRECATED_COMPONENTS","expandEnvVars","value","_match","key","extractEnvVars","vars","regex","match","RegistryErrorCode","RegistryError","message","options","RegistryNotFoundError","url","cause","RegistryUnauthorizedError","RegistryForbiddenError","RegistryFetchError","statusCode","responseBody","baseMessage","suggestion","RegistryNotConfiguredError","registryName","RegistryLocalFileError","filePath","RegistryParseError","item","parseError","z","e","RegistryMissingEnvironmentVariablesError","missingVars","v","RegistryInvalidNamespaceError","name","ConfigParseError","cwd","RegistriesIndexParseError","invalidNamespaces","arr","REGISTRY_PATTERN","parseRegistryAndItemFromString","FRAMEWORKS","highlighter","red","yellow","cyan","green","resolveImport","importPath","config","createMatchPath","DEFAULT_COMPONENTS","DEFAULT_UTILS","DEFAULT_TAILWIND_CSS","DEFAULT_TAILWIND_CONFIG","explorer","cosmiconfig","getConfig","getRawConfig","resolveConfigPaths","tsConfig","loadConfig","configSchema","path","configResult","rawConfigSchema","error","componentPath","getWorkspaceConfig","resolvedAliases","isAliasKey","resolvedPath","packageRoot","findPackageRoot","result","workspaceConfigSchema","commonRoot","findCommonRoot","relativePath","matchingPackageRoot","fg","pkgPath","pkgDir","parts1","parts2","commonParts","getTargetStyleFromConfig","fallback","getProjectInfo","createConfig","partial","defaultConfig","getPackageInfo","shouldThrow","packageJsonPath","fs","PROJECT_SHARED_IGNORE","configFiles","isSrcDir","isTsx","tailwindConfigFile","tailwindCssFile","tailwindVersion","aliasPrefix","packageJson","isTypeScriptProject","getTailwindConfigFile","getTailwindCssFile","getTailwindVersion","getTsConfigAliasPrefix","isUsingAppDir","type","file","getFrameworkVersion","dep","appConfig","framework","version","versionMatch","rangeMatch","packageInfo","files","contents","alias","paths","getProjectConfig","defaultProjectInfo","existingConfig","projectInfo","getProjectTailwindVersionFromConfig","isContentSame","existingContent","newContent","ignoreImports","normalizedExisting","normalizedNew","importRegex","normalizeImports","content","prefix","suffix","parts","lastPart","existingNormalized","newNormalized","isEnvFile","fileName","findExistingEnvFile","targetDir","variants","variant","existsSync","parseEnvContent","lines","env","line","trimmed","equalIndex","getNewEnvKeys","existingEnv","newEnv","newKeys","mergeEnvContent","logger","args","spinner","text","ora","transformCssVars","sourceFile","baseColor","SyntaxKind","node","raw","mapped","applyColorMapping","splitClassName","className","rest","alpha","split","PREFIXES","input","mapping","classNames","lightMode","darkMode","modifier","needle","transformImport","isRemote","utilsAlias","utilsImport","specifier","updated","updateImportAliases","namedImport","moduleSpecifier","PARSE_OPTIONS","transformJsx","output","ast","code","parse","transformFromAstSync","transformTypescript","directiveRegex","transformRsc","first","transformTwPrefixes","defaultClassNames","applyPrefix","callExpression","arg","project","Project","createTempSourceFile","filename","dir","tmpdir","transform","opts","transformers","transformIcons","tempFile","ScriptKind","transformer","ELEMENTS_REQUIRING_NATIVE_BUTTON_FALSE","transformAsChild","transformations","jsxElements","jsxElement","openingElement","asChildAttr","parentTagName","childElement","child","childTagName","childProps","childChildren","selfClosing","attr","jsxChild","openingEl","c","needsNativeButton","info","existingAttrs","renderValue","newAttrs","newChildren","newElementText","transformNext","func","variable","exportDecl","namedExport","updateFiles","filesCreatedSpinner","getRegistryBaseColor","filesCreated","filesUpdated","filesSkipped","envVarsAdded","envFile","index","resolveFilePath","f","basename","alternativeEnvFile","existingFile","statSync","transformMenu","_isNext16Middleware","existingFileContent","overwrite","prompts","mergedContent","allFiles","updatedFiles","resolveImports","target","resolvePageTarget","resolveFileTargetDirectory","resolveNestedFilePath","normalizedPaths","p","normalizedNeedle","needleDir","needleSegments","i","testPath","normalizedFilePath","normalizedTargetDir","fileSegments","targetSegments","lastTargetSegment","commonDirIndex","segment","filePaths","filepath","importDeclarations","importDeclaration","probableImportFilePath","resolvedImportFilePath","resolveModuleByProbablePath","newImport","toAliasedImport","extensions","relativeFiles","fileSet","extInPath","hasExt","absBase","relBase","tryExts","candidates","absCand","relCand","absIdx","relIdx","a","b","aExt","bExt","ord","aStrong","bStrong","abs","matches","root","aliasKey","rootDir","rel","ext","keepExt","noExt","aliasBase","isRootMiddleware","isNextJs","majorVersion","FILE_EXTENSIONS_FOR_LOOKUP","FILE_PATH_SKIP_LIST","DEPENDENCY_SKIP_LIST","getDependencyFromModuleSpecifier","pattern","recursivelyResolveFileImports","processedFiles","resolvedFilePath","T","relativeRegistryFilePath","fileExtension","dependencies","fileType","determineFileType","originalFile","importStatements","importStatement","isRelativeImport","dependency","pathWithExt","nestedRelativeRegistryFilePath","nestedResults","uniqueFiles","isUrl","isLocalFile","isUniversalRegistryItem","registryItem","deduplicateFilesByTarget","filesArrays","canDeduplicateFiles","registryItemFileSchema","targetMap","resolveStyleFromConfig","configWithDefaults","baseConfig","deepmerge","context","setRegistryHeaders","headers","getRegistryHeadersFromContext","clearRegistryContext","extractEnvVarsFromRegistryConfig","validateRegistryConfig","missing","validateRegistryConfigForItems","items","buildUrlAndHeadersForRegistryItem","NAME_PLACEHOLDER","STYLE_PLACEHOLDER","ENV_VAR_PATTERN","QUERY_PARAM_SEPARATOR","QUERY_PARAM_DELIMITER","isLocalPath","registry","registryConfig","buildUrlFromRegistryConfig","buildHeadersFromRegistryConfig","baseUrl","appendQueryParams","expandedValue","shouldIncludeHeader","params","urlParams","queryString","separator","originalValue","trimmedExpanded","templateWithoutVars","resolveRegistryUrl","pathOrUrl","agent","HttpsProxyAgent","registryCache","fetchRegistry","fetchPromise","response","fetch","messageFromServer","json","parsed","fetchRegistryLocal","expandedPath","homedir","registryItemSchema","updateTailwindConfig","tailwindConfig","tailwindFileRelativePath","tailwindSpinner","transformTailwindConfig","_createSourceFile","configObject","property","quoteChar","_getQuoteChar","addTailwindConfigProperty","plugin","addTailwindConfigPlugin","addTailwindConfigTheme","existingProperty","newProperty","initializer","newValue","initializerText","element","theme","nestSpreadProperties","themeInitializer","themeObjectString","themeObject","parseObjectLiteral","dst","src","resultString","objectToString","unnestSpreadProperties","existingPlugins","QuoteKind","obj","properties","prop","spreadAssignment","spreadText","nestSpreadElements","elements","j","propAssignment","unsetSpreadElements","spreadTest","objectLiteralString","statement","parseObjectLiteralExpression","parseArrayLiteralExpression","parseValue","buildTailwindThemeColorsFromCssVars","cssVars","colorName","subType","resolveRegistryItemsFromRegistries","registryHeaders","resolvedItems","resolved","fetchRegistryItems","registryItemCommonSchema","registryItemTypeSchema","registryItemFontSchema","resolveRegistryTree","names","payload","allDependencyItems","allDependencyRegistryNames","uniqueNames","results","resultMap","sourceName","itemWithSource","resolvedDependencies","namespacedDeps","registryNames","resolveDependenciesRecursively","uniqueRegistryNames","nonNamespacedItems","namespacedDepItems","depResults","getShadcnRegistryIndex","registryUrls","itemDependencies","resolveRegistryDependencies","uniqueUrls","registryPayload","registryGetTheme","sourceMap","source","topologicalSortRegistryItems","tailwind","css","docs","envVars","deduplicatedFiles","fonts","registryResolvedItemsTreeSchema","visited","resolvedDeps","nested","style","urls","computeItemHash","identifier","hash","createHash","extractItemIdentifierFromDependency","pathname","itemMap","hashToItem","inDegree","adjacencyList","depToHashes","itemSource","itemHash","depHash","exactMatches","nameMatches","queue","sorted","degree","currentHash","dependentHash","newDegree","sortedHashes","handleError","getRegistry","useCache","registrySchema","urlAndHeaders","getRegistryItems","resolveRegistryItems","getRegistriesConfig","registriesConfig","registryConfigSchema","registryIndexSchema","getRegistryStyles","stylesSchema","getRegistryIcons","iconsSchema","getRegistryBaseColors","registryBaseColorSchema","resolveTree","tree","entry","component","self","fetchTree","getItemTargetPath","override","parent","getRegistriesIndex","data","registriesIndexSchema","getPresets","configJsonSchema","getPreset","preset","searchRegistries","registries","query","limit","offset","allItems","itemsWithRegistry","buildRegistryItemNameFromRegistry","searchItems","paginationOffset","paginationLimit","totalItems","searchResultsSchema","searchableItemSchema","fuzzysort","string","protocolEnd","hostEnd","queryStart","beforeQuery","updatedQuery","hostPart","pathAndQuery","pathEnd","pathOnly","queryAndAfter","lastIndex","updatedPath"],"mappings":"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","file":"chunk-SCGCXD6H.js","sourcesContent":["import { registryConfigSchema } from \"@/src/schema\"\nimport { z } from \"zod\"\n\nexport const REGISTRY_URL =\n process.env.REGISTRY_URL ?? \"https://ui.shadcn.com/r\"\n\nexport const FALLBACK_STYLE = \"new-york-v4\"\n\nexport const BASE_COLORS = [\n {\n name: \"neutral\",\n label: \"Neutral\",\n },\n {\n name: \"gray\",\n label: \"Gray\",\n },\n {\n name: \"zinc\",\n label: \"Zinc\",\n },\n {\n name: \"stone\",\n label: \"Stone\",\n },\n {\n name: \"slate\",\n label: \"Slate\",\n },\n] as const\n\n// Built-in registries that are always available and cannot be overridden\nexport const BUILTIN_REGISTRIES: z.infer<typeof registryConfigSchema> = {\n \"@shadcn\": `${REGISTRY_URL}/styles/{style}/{name}.json`,\n}\n\nexport const BUILTIN_MODULES = new Set([\n [\n // Node.js built-in modules\n // From https://github.com/sindresorhus/builtin-modules.\n \"node:assert\",\n \"assert\",\n \"node:assert/strict\",\n \"assert/strict\",\n \"node:async_hooks\",\n \"async_hooks\",\n \"node:buffer\",\n \"buffer\",\n \"node:child_process\",\n \"child_process\",\n \"node:cluster\",\n \"cluster\",\n \"node:console\",\n \"console\",\n \"node:constants\",\n \"constants\",\n \"node:crypto\",\n \"crypto\",\n \"node:dgram\",\n \"dgram\",\n \"node:diagnostics_channel\",\n \"diagnostics_channel\",\n \"node:dns\",\n \"dns\",\n \"node:dns/promises\",\n \"dns/promises\",\n \"node:domain\",\n \"domain\",\n \"node:events\",\n \"events\",\n \"node:fs\",\n \"fs\",\n \"node:fs/promises\",\n \"fs/promises\",\n \"node:http\",\n \"http\",\n \"node:http2\",\n \"http2\",\n \"node:https\",\n \"https\",\n \"node:inspector\",\n \"inspector\",\n \"node:inspector/promises\",\n \"inspector/promises\",\n \"node:module\",\n \"module\",\n \"node:net\",\n \"net\",\n \"node:os\",\n \"os\",\n \"node:path\",\n \"path\",\n \"node:path/posix\",\n \"path/posix\",\n \"node:path/win32\",\n \"path/win32\",\n \"node:perf_hooks\",\n \"perf_hooks\",\n \"node:process\",\n \"process\",\n \"node:querystring\",\n \"querystring\",\n \"node:quic\",\n \"node:readline\",\n \"readline\",\n \"node:readline/promises\",\n \"readline/promises\",\n \"node:repl\",\n \"repl\",\n \"node:sea\",\n \"node:sqlite\",\n \"node:stream\",\n \"stream\",\n \"node:stream/consumers\",\n \"stream/consumers\",\n \"node:stream/promises\",\n \"stream/promises\",\n \"node:stream/web\",\n \"stream/web\",\n \"node:string_decoder\",\n \"string_decoder\",\n \"node:test\",\n \"node:test/reporters\",\n \"node:timers\",\n \"timers\",\n \"node:timers/promises\",\n \"timers/promises\",\n \"node:tls\",\n \"tls\",\n \"node:trace_events\",\n \"trace_events\",\n \"node:tty\",\n \"tty\",\n \"node:url\",\n \"url\",\n \"node:util\",\n \"util\",\n \"node:util/types\",\n \"util/types\",\n \"node:v8\",\n \"v8\",\n \"node:vm\",\n \"vm\",\n \"node:wasi\",\n \"wasi\",\n \"node:worker_threads\",\n \"worker_threads\",\n \"node:zlib\",\n \"zlib\",\n\n // Bun built-in modules.\n \"bun\",\n \"bun:test\",\n \"bun:sqlite\",\n \"bun:ffi\",\n \"bun:jsc\",\n \"bun:internal\",\n ],\n])\n\nexport const DEPRECATED_COMPONENTS = [\n {\n name: \"toast\",\n deprecatedBy: \"sonner\",\n message:\n \"The toast component is deprecated. Use the sonner component instead.\",\n },\n {\n name: \"toaster\",\n deprecatedBy: \"sonner\",\n message:\n \"The toaster component is deprecated. Use the sonner component instead.\",\n },\n]\n","export function expandEnvVars(value: string) {\n return value.replace(/\\${(\\w+)}/g, (_match, key) => process.env[key] || \"\")\n}\n\nexport function extractEnvVars(value: string) {\n const vars: string[] = []\n const regex = /\\${(\\w+)}/g\n let match: RegExpExecArray | null\n\n while ((match = regex.exec(value)) !== null) {\n vars.push(match[1])\n }\n\n return vars\n}\n","import { z } from \"zod\"\n\n// Error codes for programmatic error handling\nexport const RegistryErrorCode = {\n // Network errors\n NETWORK_ERROR: \"NETWORK_ERROR\",\n NOT_FOUND: \"NOT_FOUND\",\n UNAUTHORIZED: \"UNAUTHORIZED\",\n FORBIDDEN: \"FORBIDDEN\",\n FETCH_ERROR: \"FETCH_ERROR\",\n\n // Configuration errors\n NOT_CONFIGURED: \"NOT_CONFIGURED\",\n INVALID_CONFIG: \"INVALID_CONFIG\",\n MISSING_ENV_VARS: \"MISSING_ENV_VARS\",\n\n // File system errors\n LOCAL_FILE_ERROR: \"LOCAL_FILE_ERROR\",\n\n // Parsing errors\n PARSE_ERROR: \"PARSE_ERROR\",\n VALIDATION_ERROR: \"VALIDATION_ERROR\",\n\n // Generic errors\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const\n\nexport type RegistryErrorCode =\n (typeof RegistryErrorCode)[keyof typeof RegistryErrorCode]\n\nexport class RegistryError extends Error {\n public readonly code: RegistryErrorCode\n public readonly statusCode?: number\n public readonly context?: Record<string, unknown>\n public readonly suggestion?: string\n public readonly timestamp: Date\n public readonly cause?: unknown\n\n constructor(\n message: string,\n options: {\n code?: RegistryErrorCode\n statusCode?: number\n cause?: unknown\n context?: Record<string, unknown>\n suggestion?: string\n } = {}\n ) {\n super(message)\n this.name = \"RegistryError\"\n this.code = options.code || RegistryErrorCode.UNKNOWN_ERROR\n this.statusCode = options.statusCode\n this.cause = options.cause\n this.context = options.context\n this.suggestion = options.suggestion\n this.timestamp = new Date()\n\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor)\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n statusCode: this.statusCode,\n context: this.context,\n suggestion: this.suggestion,\n timestamp: this.timestamp,\n stack: this.stack,\n }\n }\n}\n\nexport class RegistryNotFoundError extends RegistryError {\n constructor(public readonly url: string, cause?: unknown) {\n const message = `The item at ${url} was not found. It may not exist at the registry.`\n\n super(message, {\n code: RegistryErrorCode.NOT_FOUND,\n statusCode: 404,\n cause,\n context: { url },\n suggestion:\n \"Check if the item name is correct and the registry URL is accessible.\",\n })\n this.name = \"RegistryNotFoundError\"\n }\n}\n\nexport class RegistryUnauthorizedError extends RegistryError {\n constructor(public readonly url: string, cause?: unknown) {\n const message = `You are not authorized to access the item at ${url}. If this is a remote registry, you may need to authenticate.`\n\n super(message, {\n code: RegistryErrorCode.UNAUTHORIZED,\n statusCode: 401,\n cause,\n context: { url },\n suggestion:\n \"Check your authentication credentials and environment variables.\",\n })\n this.name = \"RegistryUnauthorizedError\"\n }\n}\n\nexport class RegistryForbiddenError extends RegistryError {\n constructor(public readonly url: string, cause?: unknown) {\n const message = `You are not authorized to access the item at ${url}. If this is a remote registry, you may need to authenticate.`\n\n super(message, {\n code: RegistryErrorCode.FORBIDDEN,\n statusCode: 403,\n cause,\n context: { url },\n suggestion:\n \"Check your authentication credentials and environment variables.\",\n })\n this.name = \"RegistryForbiddenError\"\n }\n}\n\nexport class RegistryFetchError extends RegistryError {\n constructor(\n public readonly url: string,\n statusCode?: number,\n public readonly responseBody?: string,\n cause?: unknown\n ) {\n // Use the error detail from the server if available\n const baseMessage = statusCode\n ? `Failed to fetch from registry (${statusCode}): ${url}`\n : `Failed to fetch from registry: ${url}`\n\n const message =\n typeof cause === \"string\" && cause\n ? `${baseMessage} - ${cause}`\n : baseMessage\n\n let suggestion = \"Check your network connection and try again.\"\n if (statusCode === 404) {\n suggestion =\n \"The requested resource was not found. Check the URL or item name.\"\n } else if (statusCode === 500) {\n suggestion = \"The registry server encountered an error. Try again later.\"\n } else if (statusCode && statusCode >= 400 && statusCode < 500) {\n suggestion = \"There was a client error. Check your request parameters.\"\n }\n\n super(message, {\n code: RegistryErrorCode.FETCH_ERROR,\n statusCode,\n cause,\n context: { url, responseBody },\n suggestion,\n })\n this.name = \"RegistryFetchError\"\n }\n}\n\nexport class RegistryNotConfiguredError extends RegistryError {\n constructor(public readonly registryName: string | null) {\n const message = registryName\n ? `Unknown registry \"${registryName}\". Make sure it is defined in components.json as follows:\n{\n \"registries\": {\n \"${registryName}\": \"[URL_TO_REGISTRY]\"\n }\n}`\n : `Unknown registry. Make sure it is defined in components.json under \"registries\".`\n\n super(message, {\n code: RegistryErrorCode.NOT_CONFIGURED,\n context: { registryName },\n suggestion:\n \"Add the registry configuration to your components.json file. Consult the registry documentation for the correct format.\",\n })\n this.name = \"RegistryNotConfiguredError\"\n }\n}\n\nexport class RegistryLocalFileError extends RegistryError {\n constructor(public readonly filePath: string, cause?: unknown) {\n super(`Failed to read local registry file: ${filePath}`, {\n code: RegistryErrorCode.LOCAL_FILE_ERROR,\n cause,\n context: { filePath },\n suggestion: \"Check if the file exists and you have read permissions.\",\n })\n this.name = \"RegistryLocalFileError\"\n }\n}\n\nexport class RegistryParseError extends RegistryError {\n public readonly parseError: unknown\n\n constructor(public readonly item: string, parseError: unknown) {\n let message = `Failed to parse registry item: ${item}`\n\n if (parseError instanceof z.ZodError) {\n message = `Failed to parse registry item: ${item}\\n${parseError.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}`\n }\n\n super(message, {\n code: RegistryErrorCode.PARSE_ERROR,\n cause: parseError,\n context: { item },\n suggestion:\n \"The registry item may be corrupted or have an invalid format. Please make sure it returns a valid JSON object. See https://ui.shadcn.com/schema/registry-item.json.\",\n })\n\n this.parseError = parseError\n this.name = \"RegistryParseError\"\n }\n}\n\nexport class RegistryMissingEnvironmentVariablesError extends RegistryError {\n constructor(\n public readonly registryName: string,\n public readonly missingVars: string[]\n ) {\n const message =\n `Registry \"${registryName}\" requires the following environment variables:\\n\\n` +\n missingVars.map((v) => ` • ${v}`).join(\"\\n\")\n\n super(message, {\n code: RegistryErrorCode.MISSING_ENV_VARS,\n context: { registryName, missingVars },\n suggestion:\n \"Set the required environment variables to your .env or .env.local file.\",\n })\n this.name = \"RegistryMissingEnvironmentVariablesError\"\n }\n}\n\nexport class RegistryInvalidNamespaceError extends RegistryError {\n constructor(public readonly name: string) {\n const message = `Invalid registry namespace: \"${name}\". Registry names must start with @ (e.g., @shadcn, @v0).`\n\n super(message, {\n code: RegistryErrorCode.VALIDATION_ERROR,\n context: { name },\n suggestion:\n \"Use a valid registry name starting with @ or provide a direct URL to the registry.\",\n })\n this.name = \"RegistryInvalidNamespaceError\"\n }\n}\n\nexport class ConfigMissingError extends RegistryError {\n constructor(public readonly cwd: string) {\n const message = `No components.json found in ${cwd} or parent directories.`\n\n super(message, {\n code: RegistryErrorCode.NOT_CONFIGURED,\n context: { cwd },\n suggestion:\n \"Run 'npx shadcn@latest init' to create a components.json file, or check that you're in the correct directory.\",\n })\n this.name = \"ConfigMissingError\"\n }\n}\n\nexport class ConfigParseError extends RegistryError {\n constructor(public readonly cwd: string, parseError: unknown) {\n let message = `Invalid components.json configuration in ${cwd}.`\n\n if (parseError instanceof z.ZodError) {\n message = `Invalid components.json configuration in ${cwd}:\\n${parseError.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}`\n }\n\n super(message, {\n code: RegistryErrorCode.INVALID_CONFIG,\n cause: parseError,\n context: { cwd },\n suggestion:\n \"Check your components.json file for syntax errors or invalid configuration. Run 'npx shadcn@latest init' to regenerate a valid configuration.\",\n })\n this.name = \"ConfigParseError\"\n }\n}\n\nexport class RegistriesIndexParseError extends RegistryError {\n public readonly parseError: unknown\n\n constructor(parseError: unknown) {\n let message = \"Failed to parse registries index\"\n\n if (parseError instanceof z.ZodError) {\n const invalidNamespaces = parseError.errors\n .filter((e) => e.path.length > 0)\n .map((e) => `\"${e.path[0]}\"`)\n .filter((v, i, arr) => arr.indexOf(v) === i) // remove duplicates\n\n if (invalidNamespaces.length > 0) {\n message = `Failed to parse registries index. Invalid registry namespace(s): ${invalidNamespaces.join(\n \", \"\n )}\\n${parseError.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}`\n } else {\n message = `Failed to parse registries index:\\n${parseError.errors\n .map((e) => ` - ${e.path.join(\".\")}: ${e.message}`)\n .join(\"\\n\")}`\n }\n }\n\n super(message, {\n code: RegistryErrorCode.PARSE_ERROR,\n cause: parseError,\n context: { parseError },\n suggestion:\n \"The registries index may be corrupted or have invalid registry namespace format. Registry names must start with @ (e.g., @shadcn, @example).\",\n })\n\n this.parseError = parseError\n this.name = \"RegistriesIndexParseError\"\n }\n}\n\nexport class InvalidConfigIconLibraryError extends RegistryError {\n constructor(\n public readonly iconLibrary: string,\n public readonly validOptions: string[]\n ) {\n const message = `Invalid icon library \"${iconLibrary}\". Valid options are: ${validOptions.join(\n \", \"\n )}`\n\n super(message, {\n code: RegistryErrorCode.INVALID_CONFIG,\n context: { iconLibrary, validOptions },\n suggestion: `Update the \"iconLibrary\" field in your components.json to one of: ${validOptions.join(\n \", \"\n )}`,\n })\n this.name = \"InvalidConfigIconLibraryError\"\n }\n}\n","// Valid registry name pattern: @namespace where namespace is alphanumeric with hyphens/underscores\nconst REGISTRY_PATTERN = /^(@[a-zA-Z0-9](?:[a-zA-Z0-9-_]*[a-zA-Z0-9])?)\\/(.+)$/\n\nexport function parseRegistryAndItemFromString(name: string) {\n if (!name.startsWith(\"@\")) {\n return {\n registry: null,\n item: name,\n }\n }\n\n const match = name.match(REGISTRY_PATTERN)\n if (match) {\n return {\n registry: match[1],\n item: match[2],\n }\n }\n\n return {\n registry: null,\n item: name,\n }\n}\n","export const FRAMEWORKS = {\n \"next-app\": {\n name: \"next-app\",\n label: \"Next.js\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/next\",\n tailwind: \"https://tailwindcss.com/docs/guides/nextjs\",\n },\n },\n \"next-pages\": {\n name: \"next-pages\",\n label: \"Next.js\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/next\",\n tailwind: \"https://tailwindcss.com/docs/guides/nextjs\",\n },\n },\n remix: {\n name: \"remix\",\n label: \"Remix\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/remix\",\n tailwind: \"https://tailwindcss.com/docs/guides/remix\",\n },\n },\n \"react-router\": {\n name: \"react-router\",\n label: \"React Router\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/react-router\",\n tailwind:\n \"https://tailwindcss.com/docs/installation/framework-guides/react-router\",\n },\n },\n vite: {\n name: \"vite\",\n label: \"Vite\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/vite\",\n tailwind: \"https://tailwindcss.com/docs/guides/vite\",\n },\n },\n astro: {\n name: \"astro\",\n label: \"Astro\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/astro\",\n tailwind: \"https://tailwindcss.com/docs/guides/astro\",\n },\n },\n laravel: {\n name: \"laravel\",\n label: \"Laravel\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/laravel\",\n tailwind: \"https://tailwindcss.com/docs/guides/laravel\",\n },\n },\n \"tanstack-start\": {\n name: \"tanstack-start\",\n label: \"TanStack Start\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/tanstack\",\n tailwind: \"https://tailwindcss.com/docs/installation/using-postcss\",\n },\n },\n gatsby: {\n name: \"gatsby\",\n label: \"Gatsby\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/gatsby\",\n tailwind: \"https://tailwindcss.com/docs/guides/gatsby\",\n },\n },\n expo: {\n name: \"expo\",\n label: \"Expo\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/expo\",\n tailwind: \"https://www.nativewind.dev/docs/getting-started/installation\",\n },\n },\n manual: {\n name: \"manual\",\n label: \"Manual\",\n links: {\n installation: \"https://ui.shadcn.com/docs/installation/manual\",\n tailwind: \"https://tailwindcss.com/docs/installation\",\n },\n },\n} as const\n\nexport type Framework = (typeof FRAMEWORKS)[keyof typeof FRAMEWORKS]\n","import { cyan, green, red, yellow } from \"kleur/colors\"\n\nexport const highlighter = {\n error: red,\n warn: yellow,\n info: cyan,\n success: green,\n}\n","import { createMatchPath, type ConfigLoaderSuccessResult } from \"tsconfig-paths\"\n\nexport async function resolveImport(\n importPath: string,\n config: Pick<ConfigLoaderSuccessResult, \"absoluteBaseUrl\" | \"paths\">\n) {\n return createMatchPath(config.absoluteBaseUrl, config.paths)(\n importPath,\n undefined,\n () => true,\n [\".ts\", \".tsx\", \".jsx\", \".js\", \".css\"]\n )\n}\n","import path from \"path\"\nimport { BUILTIN_REGISTRIES } from \"@/src/registry/constants\"\nimport {\n configSchema,\n rawConfigSchema,\n workspaceConfigSchema,\n} from \"@/src/schema\"\nimport { getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport { cosmiconfig } from \"cosmiconfig\"\nimport fg from \"fast-glob\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nexport const DEFAULT_STYLE = \"default\"\nexport const DEFAULT_COMPONENTS = \"@/components\"\nexport const DEFAULT_UTILS = \"@/lib/utils\"\nexport const DEFAULT_TAILWIND_CSS = \"app/globals.css\"\nexport const DEFAULT_TAILWIND_CONFIG = \"tailwind.config.js\"\nexport const DEFAULT_TAILWIND_BASE_COLOR = \"slate\"\n\n// TODO: Figure out if we want to support all cosmiconfig formats.\n// A simple components.json file would be nice.\nexport const explorer = cosmiconfig(\"components\", {\n searchPlaces: [\"components.json\"],\n})\n\nexport type Config = z.infer<typeof configSchema>\n\nexport async function getConfig(cwd: string) {\n const config = await getRawConfig(cwd)\n\n if (!config) {\n return null\n }\n\n // Set default icon library if not provided.\n if (!config.iconLibrary) {\n config.iconLibrary = config.style === \"new-york\" ? \"radix\" : \"lucide\"\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n\nexport async function resolveConfigPaths(\n cwd: string,\n config: z.infer<typeof rawConfigSchema>\n) {\n // Merge built-in registries with user registries\n config.registries = {\n ...BUILTIN_REGISTRIES,\n ...(config.registries || {}),\n }\n\n // Read tsconfig.json.\n const tsConfig = await loadConfig(cwd)\n\n if (tsConfig.resultType === \"failed\") {\n throw new Error(\n `Failed to load ${config.tsx ? \"tsconfig\" : \"jsconfig\"}.json. ${\n tsConfig.message ?? \"\"\n }`.trim()\n )\n }\n\n return configSchema.parse({\n ...config,\n resolvedPaths: {\n cwd,\n tailwindConfig: config.tailwind.config\n ? path.resolve(cwd, config.tailwind.config)\n : \"\",\n tailwindCss: path.resolve(cwd, config.tailwind.css),\n utils: await resolveImport(config.aliases[\"utils\"], tsConfig),\n components: await resolveImport(config.aliases[\"components\"], tsConfig),\n ui: config.aliases[\"ui\"]\n ? await resolveImport(config.aliases[\"ui\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"ui\"\n ),\n // TODO: Make this configurable.\n // For now, we assume the lib and hooks directories are one level up from the components directory.\n lib: config.aliases[\"lib\"]\n ? await resolveImport(config.aliases[\"lib\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"utils\"], tsConfig)) ?? cwd,\n \"..\"\n ),\n hooks: config.aliases[\"hooks\"]\n ? await resolveImport(config.aliases[\"hooks\"], tsConfig)\n : path.resolve(\n (await resolveImport(config.aliases[\"components\"], tsConfig)) ??\n cwd,\n \"..\",\n \"hooks\"\n ),\n },\n })\n}\n\nexport async function getRawConfig(\n cwd: string\n): Promise<z.infer<typeof rawConfigSchema> | null> {\n try {\n const configResult = await explorer.search(cwd)\n\n if (!configResult) {\n return null\n }\n\n const config = rawConfigSchema.parse(configResult.config)\n\n // Check if user is trying to override built-in registries\n if (config.registries) {\n for (const registryName of Object.keys(config.registries)) {\n if (registryName in BUILTIN_REGISTRIES) {\n throw new Error(\n `\"${registryName}\" is a built-in registry and cannot be overridden.`\n )\n }\n }\n }\n\n return config\n } catch (error) {\n const componentPath = `${cwd}/components.json`\n if (error instanceof Error && error.message.includes(\"reserved registry\")) {\n throw error\n }\n throw new Error(\n `Invalid configuration found in ${highlighter.info(componentPath)}.`\n )\n }\n}\n\n// Note: we can check for -workspace.yaml or \"workspace\" in package.json.\n// Since cwd is not necessarily the root of the project.\n// We'll instead check if ui aliases resolve to a different root.\nexport async function getWorkspaceConfig(config: Config) {\n let resolvedAliases: any = {}\n\n for (const key of Object.keys(config.aliases)) {\n if (!isAliasKey(key, config)) {\n continue\n }\n\n const resolvedPath = config.resolvedPaths[key]\n const packageRoot = await findPackageRoot(\n config.resolvedPaths.cwd,\n resolvedPath\n )\n\n if (!packageRoot) {\n resolvedAliases[key] = config\n continue\n }\n\n resolvedAliases[key] = await getConfig(packageRoot)\n }\n\n const result = workspaceConfigSchema.safeParse(resolvedAliases)\n if (!result.success) {\n return null\n }\n\n return result.data\n}\n\nexport async function findPackageRoot(cwd: string, resolvedPath: string) {\n const commonRoot = findCommonRoot(cwd, resolvedPath)\n const relativePath = path.relative(commonRoot, resolvedPath)\n\n const packageRoots = await fg.glob(\"**/package.json\", {\n cwd: commonRoot,\n deep: 3,\n ignore: [\"**/node_modules/**\", \"**/dist/**\", \"**/build/**\", \"**/public/**\"],\n })\n\n const matchingPackageRoot = packageRoots\n .map((pkgPath) => path.dirname(pkgPath))\n .find((pkgDir) => relativePath.startsWith(pkgDir))\n\n return matchingPackageRoot ? path.join(commonRoot, matchingPackageRoot) : null\n}\n\nfunction isAliasKey(\n key: string,\n config: Config\n): key is keyof Config[\"aliases\"] {\n return Object.keys(config.resolvedPaths)\n .filter((key) => key !== \"utils\")\n .includes(key)\n}\n\nexport function findCommonRoot(cwd: string, resolvedPath: string) {\n const parts1 = cwd.split(path.sep)\n const parts2 = resolvedPath.split(path.sep)\n const commonParts = []\n\n for (let i = 0; i < Math.min(parts1.length, parts2.length); i++) {\n if (parts1[i] !== parts2[i]) {\n break\n }\n commonParts.push(parts1[i])\n }\n\n return commonParts.join(path.sep)\n}\n\n// TODO: Cache this call.\nexport async function getTargetStyleFromConfig(cwd: string, fallback: string) {\n const projectInfo = await getProjectInfo(cwd)\n return projectInfo?.tailwindVersion === \"v4\" ? \"new-york-v4\" : fallback\n}\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P]\n}\n\n/**\n * Creates a config object with sensible defaults.\n * Useful for universal registry items that bypass framework detection.\n *\n * @param partial - Partial config values to override defaults\n * @returns A complete Config object\n */\nexport function createConfig(partial?: DeepPartial<Config>): Config {\n const defaultConfig: Config = {\n resolvedPaths: {\n cwd: process.cwd(),\n tailwindConfig: \"\",\n tailwindCss: \"\",\n utils: \"\",\n components: \"\",\n ui: \"\",\n lib: \"\",\n hooks: \"\",\n },\n style: \"\",\n tailwind: {\n config: \"\",\n css: \"\",\n baseColor: \"\",\n cssVariables: false,\n },\n rsc: false,\n tsx: true,\n aliases: {\n components: \"\",\n utils: \"\",\n },\n registries: {\n ...BUILTIN_REGISTRIES,\n },\n }\n\n // Deep merge the partial config with defaults\n if (partial) {\n return {\n ...defaultConfig,\n ...partial,\n resolvedPaths: {\n ...defaultConfig.resolvedPaths,\n ...(partial.resolvedPaths || {}),\n },\n tailwind: {\n ...defaultConfig.tailwind,\n ...(partial.tailwind || {}),\n },\n aliases: {\n ...defaultConfig.aliases,\n ...(partial.aliases || {}),\n },\n registries: {\n ...defaultConfig.registries,\n ...(partial.registries || {}),\n },\n }\n }\n\n return defaultConfig\n}\n","import path from \"path\"\nimport fs from \"fs-extra\"\nimport { type PackageJson } from \"type-fest\"\n\nexport function getPackageInfo(\n cwd: string = \"\",\n shouldThrow: boolean = true\n): PackageJson | null {\n const packageJsonPath = path.join(cwd, \"package.json\")\n\n return fs.readJSONSync(packageJsonPath, {\n throws: shouldThrow,\n }) as PackageJson\n}\n","import path from \"path\"\nimport { rawConfigSchema } from \"@/src/schema\"\nimport { FRAMEWORKS, Framework } from \"@/src/utils/frameworks\"\nimport { Config, getConfig, resolveConfigPaths } from \"@/src/utils/get-config\"\nimport { getPackageInfo } from \"@/src/utils/get-package-info\"\nimport fg from \"fast-glob\"\nimport fs from \"fs-extra\"\nimport { loadConfig } from \"tsconfig-paths\"\nimport { z } from \"zod\"\n\nexport type TailwindVersion = \"v3\" | \"v4\" | null\n\nexport type ProjectInfo = {\n framework: Framework\n isSrcDir: boolean\n isRSC: boolean\n isTsx: boolean\n tailwindConfigFile: string | null\n tailwindCssFile: string | null\n tailwindVersion: TailwindVersion\n frameworkVersion: string | null\n aliasPrefix: string | null\n}\n\nconst PROJECT_SHARED_IGNORE = [\n \"**/node_modules/**\",\n \".next\",\n \"public\",\n \"dist\",\n \"build\",\n]\n\nconst TS_CONFIG_SCHEMA = z.object({\n compilerOptions: z.object({\n paths: z.record(z.string().or(z.array(z.string()))),\n }),\n})\n\nexport async function getProjectInfo(cwd: string): Promise<ProjectInfo | null> {\n const [\n configFiles,\n isSrcDir,\n isTsx,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n aliasPrefix,\n packageJson,\n ] = await Promise.all([\n fg.glob(\n \"**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*\",\n {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n }\n ),\n fs.pathExists(path.resolve(cwd, \"src\")),\n isTypeScriptProject(cwd),\n getTailwindConfigFile(cwd),\n getTailwindCssFile(cwd),\n getTailwindVersion(cwd),\n getTsConfigAliasPrefix(cwd),\n getPackageInfo(cwd, false),\n ])\n\n const isUsingAppDir = await fs.pathExists(\n path.resolve(cwd, `${isSrcDir ? \"src/\" : \"\"}app`)\n )\n\n const type: ProjectInfo = {\n framework: FRAMEWORKS[\"manual\"],\n isSrcDir,\n isRSC: false,\n isTsx,\n tailwindConfigFile,\n tailwindCssFile,\n tailwindVersion,\n frameworkVersion: null,\n aliasPrefix,\n }\n\n // Next.js.\n if (configFiles.find((file) => file.startsWith(\"next.config.\"))?.length) {\n type.framework = isUsingAppDir\n ? FRAMEWORKS[\"next-app\"]\n : FRAMEWORKS[\"next-pages\"]\n type.isRSC = isUsingAppDir\n type.frameworkVersion = await getFrameworkVersion(\n type.framework,\n packageJson\n )\n return type\n }\n\n // Astro.\n if (configFiles.find((file) => file.startsWith(\"astro.config.\"))?.length) {\n type.framework = FRAMEWORKS[\"astro\"]\n return type\n }\n\n // Gatsby.\n if (configFiles.find((file) => file.startsWith(\"gatsby-config.\"))?.length) {\n type.framework = FRAMEWORKS[\"gatsby\"]\n return type\n }\n\n // Laravel.\n if (configFiles.find((file) => file.startsWith(\"composer.json\"))?.length) {\n type.framework = FRAMEWORKS[\"laravel\"]\n return type\n }\n\n // Remix.\n if (\n Object.keys(packageJson?.dependencies ?? {}).find((dep) =>\n dep.startsWith(\"@remix-run/\")\n )\n ) {\n type.framework = FRAMEWORKS[\"remix\"]\n return type\n }\n\n // TanStack Start.\n if (\n [\n ...Object.keys(packageJson?.dependencies ?? {}),\n ...Object.keys(packageJson?.devDependencies ?? {}),\n ].find((dep) => dep.startsWith(\"@tanstack/react-start\"))\n ) {\n type.framework = FRAMEWORKS[\"tanstack-start\"]\n return type\n }\n\n // React Router.\n if (\n configFiles.find((file) => file.startsWith(\"react-router.config.\"))?.length\n ) {\n type.framework = FRAMEWORKS[\"react-router\"]\n return type\n }\n\n // Vite.\n // Some Remix templates also have a vite.config.* file.\n // We'll assume that it got caught by the Remix check above.\n if (configFiles.find((file) => file.startsWith(\"vite.config.\"))?.length) {\n type.framework = FRAMEWORKS[\"vite\"]\n return type\n }\n\n // Vinxi-based (such as @tanstack/start and @solidjs/solid-start)\n // They are vite-based, and the same configurations used for Vite should work flawlessly\n const appConfig = configFiles.find((file) => file.startsWith(\"app.config\"))\n if (appConfig?.length) {\n const appConfigContents = await fs.readFile(\n path.resolve(cwd, appConfig),\n \"utf8\"\n )\n if (appConfigContents.includes(\"defineConfig\")) {\n type.framework = FRAMEWORKS[\"vite\"]\n return type\n }\n }\n\n // Expo.\n if (packageJson?.dependencies?.expo) {\n type.framework = FRAMEWORKS[\"expo\"]\n return type\n }\n\n return type\n}\n\nexport async function getFrameworkVersion(\n framework: Framework,\n packageJson: ReturnType<typeof getPackageInfo>\n) {\n if (!packageJson) {\n return null\n }\n\n // Only detect Next.js version for now.\n if (![\"next-app\", \"next-pages\"].includes(framework.name)) {\n return null\n }\n\n const version =\n packageJson.dependencies?.next || packageJson.devDependencies?.next\n\n if (!version) {\n return null\n }\n\n // Extract full semver (major.minor.patch), handling ^, ~, etc.\n const versionMatch = version.match(/^[\\^~]?(\\d+\\.\\d+\\.\\d+)/)\n if (versionMatch) {\n return versionMatch[1] // e.g., \"16.0.0\"\n }\n\n // For ranges like \">=15.0.0 <16.0.0\", extract the first version.\n const rangeMatch = version.match(/(\\d+\\.\\d+\\.\\d+)/)\n if (rangeMatch) {\n return rangeMatch[1]\n }\n\n // For \"latest\", \"canary\", \"rc\", etc., return the tag as-is.\n return version\n}\n\nexport async function getTailwindVersion(\n cwd: string\n): Promise<ProjectInfo[\"tailwindVersion\"]> {\n const [packageInfo, config] = await Promise.all([\n getPackageInfo(cwd, false),\n getConfig(cwd),\n ])\n\n // If the config file is empty, we can assume that it's a v4 project.\n if (config?.tailwind?.config === \"\") {\n return \"v4\"\n }\n\n if (\n !packageInfo?.dependencies?.tailwindcss &&\n !packageInfo?.devDependencies?.tailwindcss\n ) {\n return null\n }\n\n if (\n /^(?:\\^|~)?3(?:\\.\\d+)*(?:-.*)?$/.test(\n packageInfo?.dependencies?.tailwindcss ||\n packageInfo?.devDependencies?.tailwindcss ||\n \"\"\n )\n ) {\n return \"v3\"\n }\n\n return \"v4\"\n}\n\nexport async function getTailwindCssFile(cwd: string) {\n const [files, tailwindVersion] = await Promise.all([\n fg.glob([\"**/*.css\", \"**/*.scss\"], {\n cwd,\n deep: 5,\n ignore: PROJECT_SHARED_IGNORE,\n }),\n getTailwindVersion(cwd),\n ])\n\n if (!files.length) {\n return null\n }\n\n const needle =\n tailwindVersion === \"v4\" ? `@import \"tailwindcss\"` : \"@tailwind base\"\n for (const file of files) {\n const contents = await fs.readFile(path.resolve(cwd, file), \"utf8\")\n if (\n contents.includes(`@import \"tailwindcss\"`) ||\n contents.includes(`@import 'tailwindcss'`) ||\n contents.includes(`@tailwind base`)\n ) {\n return file\n }\n }\n\n return null\n}\n\nexport async function getTailwindConfigFile(cwd: string) {\n const files = await fg.glob(\"tailwind.config.*\", {\n cwd,\n deep: 3,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n if (!files.length) {\n return null\n }\n\n return files[0]\n}\n\nexport async function getTsConfigAliasPrefix(cwd: string) {\n const tsConfig = await loadConfig(cwd)\n\n if (\n tsConfig?.resultType === \"failed\" ||\n !Object.entries(tsConfig?.paths).length\n ) {\n return null\n }\n\n // This assume that the first alias is the prefix.\n for (const [alias, paths] of Object.entries(tsConfig.paths)) {\n if (\n paths.includes(\"./*\") ||\n paths.includes(\"./src/*\") ||\n paths.includes(\"./app/*\") ||\n paths.includes(\"./resources/js/*\") // Laravel.\n ) {\n return alias.replace(/\\/\\*$/, \"\") ?? null\n }\n }\n\n // Use the first alias as the prefix.\n return Object.keys(tsConfig?.paths)?.[0].replace(/\\/\\*$/, \"\") ?? null\n}\n\nexport async function isTypeScriptProject(cwd: string) {\n const files = await fg.glob(\"tsconfig.*\", {\n cwd,\n deep: 1,\n ignore: PROJECT_SHARED_IGNORE,\n })\n\n return files.length > 0\n}\n\nexport async function getTsConfig(cwd: string) {\n for (const fallback of [\n \"tsconfig.json\",\n \"tsconfig.web.json\",\n \"tsconfig.app.json\",\n ]) {\n const filePath = path.resolve(cwd, fallback)\n if (!(await fs.pathExists(filePath))) {\n continue\n }\n\n // We can't use fs.readJSON because it doesn't support comments.\n const contents = await fs.readFile(filePath, \"utf8\")\n const cleanedContents = contents.replace(/\\/\\*\\s*\\*\\//g, \"\")\n const result = TS_CONFIG_SCHEMA.safeParse(JSON.parse(cleanedContents))\n\n if (result.error) {\n continue\n }\n\n return result.data\n }\n\n return null\n}\n\nexport async function getProjectConfig(\n cwd: string,\n defaultProjectInfo: ProjectInfo | null = null\n): Promise<Config | null> {\n // Check for existing component config.\n const [existingConfig, projectInfo] = await Promise.all([\n getConfig(cwd),\n !defaultProjectInfo\n ? getProjectInfo(cwd)\n : Promise.resolve(defaultProjectInfo),\n ])\n\n if (existingConfig) {\n return existingConfig\n }\n\n if (\n !projectInfo ||\n !projectInfo.tailwindCssFile ||\n (projectInfo.tailwindVersion === \"v3\" && !projectInfo.tailwindConfigFile)\n ) {\n return null\n }\n\n const config: z.infer<typeof rawConfigSchema> = {\n $schema: \"https://ui.shadcn.com/schema.json\",\n rsc: projectInfo.isRSC,\n tsx: projectInfo.isTsx,\n style: \"new-york\",\n tailwind: {\n config: projectInfo.tailwindConfigFile ?? \"\",\n baseColor: \"zinc\",\n css: projectInfo.tailwindCssFile,\n cssVariables: true,\n prefix: \"\",\n },\n iconLibrary: \"lucide\",\n aliases: {\n components: `${projectInfo.aliasPrefix}/components`,\n ui: `${projectInfo.aliasPrefix}/components/ui`,\n hooks: `${projectInfo.aliasPrefix}/hooks`,\n lib: `${projectInfo.aliasPrefix}/lib`,\n utils: `${projectInfo.aliasPrefix}/lib/utils`,\n },\n }\n\n return await resolveConfigPaths(cwd, config)\n}\n\nexport async function getProjectTailwindVersionFromConfig(config: {\n resolvedPaths: Pick<Config[\"resolvedPaths\"], \"cwd\">\n}): Promise<TailwindVersion> {\n if (!config.resolvedPaths?.cwd) {\n return \"v3\"\n }\n\n const projectInfo = await getProjectInfo(config.resolvedPaths.cwd)\n\n if (!projectInfo?.tailwindVersion) {\n return null\n }\n\n return projectInfo.tailwindVersion\n}\n","export function isContentSame(\n existingContent: string,\n newContent: string,\n options: {\n ignoreImports?: boolean\n } = {}\n) {\n const { ignoreImports = false } = options\n\n // Normalize line endings and whitespace.\n const normalizedExisting = existingContent.replace(/\\r\\n/g, \"\\n\").trim()\n const normalizedNew = newContent.replace(/\\r\\n/g, \"\\n\").trim()\n\n // First, try exact match after normalization.\n if (normalizedExisting === normalizedNew) {\n return true\n }\n\n // If not ignoring imports or exact match failed, return false\n if (!ignoreImports) {\n return false\n }\n\n // Compare with import statements normalized.\n // This regex matches various import patterns including:\n // - import defaultExport from \"module\"\n // - import * as name from \"module\"\n // - import { export1, export2 } from \"module\"\n // - import { export1 as alias1 } from \"module\"\n // - import defaultExport, { export1 } from \"module\"\n // - import type { Type } from \"module\"\n // - This Regex written by Claude Code.\n const importRegex =\n /^(import\\s+(?:type\\s+)?(?:\\*\\s+as\\s+\\w+|\\{[^}]*\\}|\\w+)?(?:\\s*,\\s*(?:\\{[^}]*\\}|\\w+))?\\s+from\\s+[\"'])([^\"']+)([\"'])/gm\n\n // Function to normalize import paths - remove alias differences.\n const normalizeImports = (content: string) => {\n return content.replace(\n importRegex,\n (_match, prefix, importPath, suffix) => {\n // Keep relative imports as-is.\n if (importPath.startsWith(\".\")) {\n return `${prefix}${importPath}${suffix}`\n }\n\n // For aliased imports, normalize to a common format.\n // Extract the last meaningful part of the path.\n const parts = importPath.split(\"/\")\n const lastPart = parts[parts.length - 1]\n\n // Normalize to a consistent format.\n return `${prefix}@normalized/${lastPart}${suffix}`\n }\n )\n }\n\n const existingNormalized = normalizeImports(normalizedExisting)\n const newNormalized = normalizeImports(normalizedNew)\n\n return existingNormalized === newNormalized\n}\n","import { existsSync } from \"fs\"\nimport path from \"path\"\n\nexport function isEnvFile(filePath: string) {\n const fileName = path.basename(filePath)\n return /^\\.env(\\.|$)/.test(fileName)\n}\n\n/**\n * Finds a file variant in the project.\n * TODO: abstract this to a more generic function.\n */\nexport function findExistingEnvFile(targetDir: string) {\n const variants = [\n \".env.local\",\n \".env\",\n \".env.development.local\",\n \".env.development\",\n ]\n\n for (const variant of variants) {\n const filePath = path.join(targetDir, variant)\n if (existsSync(filePath)) {\n return filePath\n }\n }\n\n return null\n}\n\n/**\n * Parse .env content into key-value pairs.\n */\nexport function parseEnvContent(content: string) {\n const lines = content.split(\"\\n\")\n const env: Record<string, string> = {}\n\n for (const line of lines) {\n const trimmed = line.trim()\n\n if (!trimmed || trimmed.startsWith(\"#\")) {\n continue\n }\n\n // Find the first = and split there\n const equalIndex = trimmed.indexOf(\"=\")\n if (equalIndex === -1) {\n continue\n }\n\n const key = trimmed.substring(0, equalIndex).trim()\n const value = trimmed.substring(equalIndex + 1).trim()\n\n if (key) {\n env[key] = value.replace(/^[\"']|[\"']$/g, \"\")\n }\n }\n\n return env\n}\n\n/**\n * Get the list of new keys that would be added when merging env content.\n */\nexport function getNewEnvKeys(existingContent: string, newContent: string) {\n const existingEnv = parseEnvContent(existingContent)\n const newEnv = parseEnvContent(newContent)\n\n const newKeys = []\n for (const key of Object.keys(newEnv)) {\n if (!(key in existingEnv)) {\n newKeys.push(key)\n }\n }\n\n return newKeys\n}\n\n/**\n * Merge env content by appending ONLY new keys that don't exist in the existing content.\n * Existing keys are preserved with their original values.\n */\nexport function mergeEnvContent(existingContent: string, newContent: string) {\n const existingEnv = parseEnvContent(existingContent)\n const newEnv = parseEnvContent(newContent)\n\n let result = existingContent.trimEnd()\n if (result && !result.endsWith(\"\\n\")) {\n result += \"\\n\"\n }\n\n const newKeys: string[] = []\n for (const [key, value] of Object.entries(newEnv)) {\n if (!(key in existingEnv)) {\n newKeys.push(`${key}=${value}`)\n }\n }\n\n if (newKeys.length > 0) {\n if (result) {\n result += \"\\n\"\n }\n result += newKeys.join(\"\\n\")\n return result + \"\\n\"\n }\n\n // Ensure existing content ends with newline.\n if (result && !result.endsWith(\"\\n\")) {\n return result + \"\\n\"\n }\n\n return result\n}\n","import { highlighter } from \"@/src/utils/highlighter\"\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")))\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")))\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")))\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")))\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"))\n },\n break() {\n console.log(\"\")\n },\n}\n","import ora, { type Options } from \"ora\"\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean\n }\n) {\n return ora({\n text,\n isSilent: options?.silent,\n })\n}\n","import { registryBaseColorSchema } from \"@/src/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 raw = node.getLiteralText()\n const mapped = applyColorMapping(raw, baseColor.inlineColors).trim()\n if (mapped !== raw) {\n node.setLiteralValue(mapped)\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","import { Config } from \"@/src/utils/get-config\"\nimport { Transformer } from \"@/src/utils/transformers\"\nimport { SyntaxKind } from \"ts-morph\"\n\nexport const transformImport: Transformer = async ({\n sourceFile,\n config,\n isRemote,\n}) => {\n const utilsAlias = config.aliases?.utils\n const workspaceAlias =\n typeof utilsAlias === \"string\" && utilsAlias.includes(\"/\")\n ? utilsAlias.split(\"/\")[0]\n : \"@\"\n const utilsImport = `${workspaceAlias}/lib/utils`\n\n if (![\".tsx\", \".ts\", \".jsx\", \".js\"].includes(sourceFile.getExtension())) {\n return sourceFile\n }\n\n for (const specifier of sourceFile.getImportStringLiterals()) {\n const updated = updateImportAliases(\n specifier.getLiteralValue(),\n config,\n isRemote\n )\n specifier.setLiteralValue(updated)\n\n // Replace `import { cn } from \"@/lib/utils\"`\n if (utilsImport === updated || updated === \"@/lib/utils\") {\n const importDeclaration = specifier.getFirstAncestorByKind(\n SyntaxKind.ImportDeclaration\n )\n const isCnImport = importDeclaration\n ?.getNamedImports()\n .some((namedImport) => namedImport.getName() === \"cn\")\n\n if (!isCnImport || !config.aliases.utils) {\n continue\n }\n\n specifier.setLiteralValue(\n utilsImport === updated\n ? updated.replace(utilsImport, config.aliases.utils)\n : config.aliases.utils\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.getNameNode().getText() === \"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.getNameNode().getText() === \"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.getNameNode().getText() !== \"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 { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport { registryBaseColorSchema } from \"@/src/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 { Transformer } from \"@/src/utils/transformers\"\nimport { JsxElement, SyntaxKind } from \"ts-morph\"\n\n// Elements that require nativeButton={false} when used as render prop.\n// These are non-button elements that don't have native button semantics.\nconst ELEMENTS_REQUIRING_NATIVE_BUTTON_FALSE = [\n \"a\",\n \"span\",\n \"div\",\n \"Link\",\n \"label\",\n \"Label\",\n]\n\ninterface TransformInfo {\n parentElement: JsxElement\n parentTagName: string\n childTagName: string\n childProps: string\n childChildren: string\n needsNativeButton: boolean\n}\n\nexport const transformAsChild: Transformer = async ({ sourceFile, config }) => {\n // Only run for base- styles.\n if (!config.style?.startsWith(\"base-\")) {\n return sourceFile\n }\n\n // Collect all transformations first, then apply them in reverse order.\n // This prevents issues with invalidated nodes when modifying the tree.\n const transformations: TransformInfo[] = []\n\n // Find all JSX elements with asChild attribute.\n const jsxElements = sourceFile.getDescendantsOfKind(SyntaxKind.JsxElement)\n\n for (const jsxElement of jsxElements) {\n const openingElement = jsxElement.getOpeningElement()\n const asChildAttr = openingElement.getAttribute(\"asChild\")\n\n if (!asChildAttr) {\n continue\n }\n\n const parentTagName = openingElement.getTagNameNode().getText()\n const children = jsxElement.getJsxChildren()\n\n // Find the first JSX element child (skip whitespace/text).\n const childElement = children.find(\n (child) =>\n child.getKind() === SyntaxKind.JsxElement ||\n child.getKind() === SyntaxKind.JsxSelfClosingElement\n )\n\n if (!childElement) {\n // No child element found, just remove asChild.\n asChildAttr.remove()\n continue\n }\n\n // Get child element info.\n let childTagName: string\n let childProps: string\n let childChildren: string\n\n if (childElement.getKind() === SyntaxKind.JsxSelfClosingElement) {\n const selfClosing = childElement.asKindOrThrow(\n SyntaxKind.JsxSelfClosingElement\n )\n childTagName = selfClosing.getTagNameNode().getText()\n childProps = selfClosing\n .getAttributes()\n .map((attr) => attr.getText())\n .join(\" \")\n childChildren = \"\"\n } else {\n const jsxChild = childElement.asKindOrThrow(SyntaxKind.JsxElement)\n const openingEl = jsxChild.getOpeningElement()\n childTagName = openingEl.getTagNameNode().getText()\n childProps = openingEl\n .getAttributes()\n .map((attr) => attr.getText())\n .join(\" \")\n // Get the children's text content.\n childChildren = jsxChild\n .getJsxChildren()\n .map((c) => c.getText())\n .join(\"\")\n }\n\n // Determine if we need nativeButton={false}.\n // Add it when the child element is a non-button element.\n const needsNativeButton =\n ELEMENTS_REQUIRING_NATIVE_BUTTON_FALSE.includes(childTagName)\n\n transformations.push({\n parentElement: jsxElement,\n parentTagName,\n childTagName,\n childProps,\n childChildren,\n needsNativeButton,\n })\n }\n\n // Apply transformations in reverse order to preserve node validity.\n for (const info of transformations.reverse()) {\n const openingElement = info.parentElement.getOpeningElement()\n const closingElement = info.parentElement.getClosingElement()\n\n // Get existing attributes (excluding asChild).\n const existingAttrs = openingElement\n .getAttributes()\n .filter((attr) => {\n if (attr.getKind() === SyntaxKind.JsxAttribute) {\n const jsxAttr = attr.asKindOrThrow(SyntaxKind.JsxAttribute)\n return jsxAttr.getNameNode().getText() !== \"asChild\"\n }\n return true\n })\n .map((attr) => attr.getText())\n .join(\" \")\n\n // Build the render prop value.\n const renderValue = info.childProps\n ? `{<${info.childTagName} ${info.childProps} />}`\n : `{<${info.childTagName} />}`\n\n // Build new attributes.\n let newAttrs = existingAttrs ? `${existingAttrs} ` : \"\"\n newAttrs += `render=${renderValue}`\n if (info.needsNativeButton) {\n newAttrs += ` nativeButton={false}`\n }\n\n // Build the new element text.\n const newChildren = info.childChildren.trim() ? `${info.childChildren}` : \"\"\n\n const newElementText = `<${info.parentTagName} ${newAttrs}>${newChildren}</${info.parentTagName}>`\n\n info.parentElement.replaceWithText(newElementText)\n }\n\n return sourceFile\n}\n","import { Transformer } from \"@/src/utils/transformers\"\n\nexport const transformNext: Transformer = async ({ sourceFile }) => {\n // export function middleware.\n sourceFile.getFunctions().forEach((func) => {\n if (func.getName() === \"middleware\") {\n func.rename(\"proxy\")\n }\n })\n\n // export const middleware.\n sourceFile.getVariableDeclarations().forEach((variable) => {\n if (variable.getName() === \"middleware\") {\n variable.rename(\"proxy\")\n }\n })\n\n // export { handler as middleware }.\n sourceFile.getExportDeclarations().forEach((exportDecl) => {\n const namedExports = exportDecl.getNamedExports()\n namedExports.forEach((namedExport) => {\n if (namedExport.getName() === \"middleware\") {\n namedExport.setName(\"proxy\")\n }\n const aliasNode = namedExport.getAliasNode()\n if (aliasNode?.getText() === \"middleware\") {\n namedExport.setAlias(\"proxy\")\n }\n })\n })\n\n return sourceFile\n}\n","import { existsSync, promises as fs, statSync } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path, { basename } from \"path\"\nimport { getRegistryBaseColor } from \"@/src/registry/api\"\nimport { RegistryItem, registryItemFileSchema } from \"@/src/schema\"\nimport { isContentSame } from \"@/src/utils/compare\"\nimport {\n findExistingEnvFile,\n getNewEnvKeys,\n isEnvFile,\n mergeEnvContent,\n parseEnvContent,\n} from \"@/src/utils/env-helpers\"\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 { transformAsChild } from \"@/src/utils/transformers/transform-aschild\"\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 { transformMenu } from \"@/src/utils/transformers/transform-menu\"\nimport { transformNext } from \"@/src/utils/transformers/transform-next\"\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 isWorkspace?: boolean\n path?: string\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 isWorkspace: 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 config.tailwind.baseColor\n ? getRegistryBaseColor(config.tailwind.baseColor)\n : Promise.resolve(undefined),\n ])\n\n let filesCreated: string[] = []\n let filesUpdated: string[] = []\n let filesSkipped: string[] = []\n let envVarsAdded: string[] = []\n let envFile: string | null = null\n\n for (let index = 0; index < files.length; index++) {\n const file = files[index]\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 path: options.path,\n fileIndex: index,\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 if (isEnvFile(filePath) && !existsSync(filePath)) {\n const alternativeEnvFile = findExistingEnvFile(targetDir)\n if (alternativeEnvFile) {\n filePath = alternativeEnvFile\n }\n }\n\n const existingFile = existsSync(filePath)\n\n // Check if the path exists and is a directory - we can't write to directories.\n if (existingFile && statSync(filePath).isDirectory()) {\n throw new Error(\n `Cannot write to ${filePath}: path exists and is a directory. Please provide a file path instead.`\n )\n }\n\n // Run our transformers.\n // Skip transformers for .env files to preserve exact content\n const content = isEnvFile(filePath)\n ? file.content\n : 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 transformMenu,\n transformAsChild,\n ...(_isNext16Middleware(filePath, projectInfo, config)\n ? [transformNext]\n : []),\n ]\n )\n\n // Skip the file if it already exists and the content is the same.\n // Exception: Don't skip .env files as we merge content instead of replacing\n if (existingFile && !isEnvFile(filePath)) {\n const existingFileContent = await fs.readFile(filePath, \"utf-8\")\n\n if (\n isContentSame(existingFileContent, content, {\n // Ignore import differences for workspace components.\n // TODO: figure out if we always want this.\n ignoreImports: options.isWorkspace,\n })\n ) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n continue\n }\n }\n\n // Skip overwrite prompt for .env files - we'll handle them specially\n if (existingFile && !options.overwrite && !isEnvFile(filePath)) {\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 // Rename middleware.ts to proxy.ts for Next.js 16+.\n if (_isNext16Middleware(filePath, projectInfo, config)) {\n filePath = filePath.replace(/middleware\\.(ts|js)$/, \"proxy.$1\")\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 // Special handling for .env files - append only new keys\n if (isEnvFile(filePath) && existingFile) {\n const existingFileContent = await fs.readFile(filePath, \"utf-8\")\n const mergedContent = mergeEnvContent(existingFileContent, content)\n envVarsAdded = getNewEnvKeys(existingFileContent, content)\n envFile = path.relative(config.resolvedPaths.cwd, filePath)\n\n if (!envVarsAdded.length) {\n filesSkipped.push(path.relative(config.resolvedPaths.cwd, filePath))\n continue\n }\n\n await fs.writeFile(filePath, mergedContent, \"utf-8\")\n filesUpdated.push(path.relative(config.resolvedPaths.cwd, filePath))\n continue\n }\n\n await fs.writeFile(filePath, content, \"utf-8\")\n\n // Handle file creation logging\n if (!existingFile) {\n filesCreated.push(path.relative(config.resolvedPaths.cwd, filePath))\n\n if (isEnvFile(filePath)) {\n envVarsAdded = Object.keys(parseEnvContent(content))\n envFile = path.relative(config.resolvedPaths.cwd, filePath)\n }\n } else {\n filesUpdated.push(path.relative(config.resolvedPaths.cwd, filePath))\n }\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 (envVarsAdded.length && envFile) {\n spinner(\n `Added the following variables to ${highlighter.info(envFile)}:`\n )?.info()\n if (!options.silent) {\n for (const key of envVarsAdded) {\n logger.log(` ${highlighter.success(\"+\")} ${key}`)\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 path?: string\n fileIndex?: number\n }\n) {\n // Handle custom path if provided.\n if (options.path) {\n const resolvedPath = path.isAbsolute(options.path)\n ? options.path\n : path.join(config.resolvedPaths.cwd, options.path)\n\n const isFilePath = /\\.[^/\\\\]+$/.test(resolvedPath)\n\n if (isFilePath) {\n // We'll only use the custom path for the first file.\n // This is for registry items with multiple files.\n if (options.fileIndex === 0) {\n return resolvedPath\n }\n } else {\n // If the custom path is a directory,\n // We'll place all files in the directory.\n const fileName = path.basename(file.path)\n return path.join(resolvedPath, fileName)\n }\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 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 = 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 // Remove /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\nfunction _isNext16Middleware(\n filePath: string,\n projectInfo: ProjectInfo | null,\n config: Config\n) {\n const isRootMiddleware =\n filePath === path.join(config.resolvedPaths.cwd, \"middleware.ts\") ||\n filePath === path.join(config.resolvedPaths.cwd, \"middleware.js\")\n\n const isNextJs =\n projectInfo?.framework.name === \"next-app\" ||\n projectInfo?.framework.name === \"next-pages\"\n\n if (!isRootMiddleware || !isNextJs || !projectInfo?.frameworkVersion) {\n return false\n }\n\n const majorVersion = parseInt(projectInfo.frameworkVersion.split(\".\")[0])\n const isNext16Plus = !isNaN(majorVersion) && majorVersion >= 16\n\n return isNext16Plus\n}\n","import * as fs from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport * as path from \"path\"\nimport {\n configSchema,\n registryItemFileSchema,\n registryItemSchema,\n} from \"@/src/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { ProjectInfo, getProjectInfo } from \"@/src/utils/get-project-info\"\nimport { resolveImport } from \"@/src/utils/resolve-import\"\nimport {\n findCommonRoot,\n resolveFilePath,\n} from \"@/src/utils/updaters/update-files\"\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\n// Additional utility functions for local file support\nexport function isUrl(path: string) {\n try {\n new URL(path)\n return true\n } catch (error) {\n return false\n }\n}\n\nexport function isLocalFile(path: string) {\n return path.endsWith(\".json\") && !isUrl(path)\n}\n\n/**\n * Check if a registry item is universal (framework-agnostic).\n * A universal registry item must:\n * 1. Have type \"registry:item\" or \"registry:file\"\n * 2. If it has files, all files must have explicit targets and be type \"registry:file\" or \"registry:item\"\n * It can be installed without framework detection or components.json.\n */\nexport function isUniversalRegistryItem(\n registryItem:\n | Pick<z.infer<typeof registryItemSchema>, \"files\" | \"type\">\n | null\n | undefined\n): boolean {\n if (!registryItem) {\n return false\n }\n\n if (\n registryItem.type !== \"registry:item\" &&\n registryItem.type !== \"registry:file\"\n ) {\n return false\n }\n\n const files = registryItem.files ?? []\n\n // If there are files, all must have targets and be of type registry:file or registry:item.\n return files.every(\n (file) =>\n !!file.target &&\n (file.type === \"registry:file\" || file.type === \"registry:item\")\n )\n}\n\n// Deduplicates files based on their resolved target paths.\n// When multiple files resolve to the same target path, the last one wins.\nexport async function deduplicateFilesByTarget(\n filesArrays: Array<z.infer<typeof registryItemFileSchema>[] | undefined>,\n config: Config\n) {\n // Fallback to simple concatenation when we don't have complete config.\n if (!canDeduplicateFiles(config)) {\n return z\n .array(registryItemFileSchema)\n .parse(filesArrays.flat().filter(Boolean))\n }\n\n // Get project info for file resolution.\n const projectInfo = await getProjectInfo(config.resolvedPaths.cwd)\n const targetMap = new Map<string, z.infer<typeof registryItemFileSchema>>()\n const allFiles = z\n .array(registryItemFileSchema)\n .parse(filesArrays.flat().filter(Boolean))\n\n allFiles.forEach((file) => {\n const resolvedPath = resolveFilePath(file, config, {\n isSrcDir: projectInfo?.isSrcDir,\n framework: projectInfo?.framework.name,\n commonRoot: findCommonRoot(\n allFiles.map((f) => f.path),\n file.path\n ),\n })\n\n if (resolvedPath) {\n // Last one wins - overwrites previous entry.\n targetMap.set(resolvedPath, file)\n }\n })\n\n return Array.from(targetMap.values())\n}\n\n// Checks if the config has the minimum required paths for file deduplication.\nexport function canDeduplicateFiles(config: Config) {\n return !!(\n config?.resolvedPaths?.cwd &&\n (config?.resolvedPaths?.ui ||\n config?.resolvedPaths?.lib ||\n config?.resolvedPaths?.components ||\n config?.resolvedPaths?.hooks)\n )\n}\n","import { BUILTIN_REGISTRIES, FALLBACK_STYLE } from \"@/src/registry/constants\"\nimport { configSchema } from \"@/src/schema\"\nimport { Config, DeepPartial, createConfig } from \"@/src/utils/get-config\"\nimport deepmerge from \"deepmerge\"\n\nfunction resolveStyleFromConfig(config: DeepPartial<Config>) {\n if (!config.style) {\n return FALLBACK_STYLE\n }\n\n // Check if we should use new-york-v4 for Tailwind v4.\n // We assume that if tailwind.config is empty, we're using Tailwind v4.\n if (config.style === \"new-york\" && config.tailwind?.config === \"\") {\n return FALLBACK_STYLE\n }\n\n return config.style\n}\n\nexport function configWithDefaults(config?: DeepPartial<Config>) {\n const baseConfig = createConfig({\n style: FALLBACK_STYLE,\n registries: BUILTIN_REGISTRIES,\n })\n\n if (!config) {\n return baseConfig\n }\n\n return configSchema.parse(\n deepmerge(baseConfig, {\n ...config,\n style: resolveStyleFromConfig(config),\n registries: { ...BUILTIN_REGISTRIES, ...config.registries },\n })\n )\n}\n","interface RegistryContext {\n headers: Record<string, Record<string, string>>\n}\n\nlet context: RegistryContext = {\n headers: {},\n}\n\nexport function setRegistryHeaders(\n headers: Record<string, Record<string, string>>\n) {\n // Merge new headers with existing ones to preserve headers for nested dependencies\n context.headers = { ...context.headers, ...headers }\n}\n\nexport function getRegistryHeadersFromContext(\n url: string\n): Record<string, string> {\n return context.headers[url] || {}\n}\n\nexport function clearRegistryContext() {\n context.headers = {}\n}\n","import { buildUrlAndHeadersForRegistryItem } from \"@/src/registry/builder\"\nimport { configWithDefaults } from \"@/src/registry/config\"\nimport { clearRegistryContext } from \"@/src/registry/context\"\nimport { extractEnvVars } from \"@/src/registry/env\"\nimport { RegistryMissingEnvironmentVariablesError } from \"@/src/registry/errors\"\nimport { registryConfigItemSchema } from \"@/src/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { z } from \"zod\"\n\nexport function extractEnvVarsFromRegistryConfig(\n config: z.infer<typeof registryConfigItemSchema>\n): string[] {\n const vars = new Set<string>()\n\n if (typeof config === \"string\") {\n extractEnvVars(config).forEach((v) => vars.add(v))\n } else {\n extractEnvVars(config.url).forEach((v) => vars.add(v))\n\n if (config.params) {\n Object.values(config.params).forEach((value) => {\n extractEnvVars(value).forEach((v) => vars.add(v))\n })\n }\n\n if (config.headers) {\n Object.values(config.headers).forEach((value) => {\n extractEnvVars(value).forEach((v) => vars.add(v))\n })\n }\n }\n\n return Array.from(vars)\n}\n\nexport function validateRegistryConfig(\n registryName: string,\n config: z.infer<typeof registryConfigItemSchema>\n): void {\n const requiredVars = extractEnvVarsFromRegistryConfig(config)\n const missing = requiredVars.filter((v) => !process.env[v])\n\n if (missing.length > 0) {\n throw new RegistryMissingEnvironmentVariablesError(registryName, missing)\n }\n}\n\nexport function validateRegistryConfigForItems(\n items: string[],\n config?: Config\n): void {\n for (const item of items) {\n buildUrlAndHeadersForRegistryItem(item, configWithDefaults(config))\n }\n\n // Clear the registry context after validation.\n clearRegistryContext()\n}\n","import { BUILTIN_REGISTRIES, REGISTRY_URL } from \"@/src/registry/constants\"\nimport { expandEnvVars } from \"@/src/registry/env\"\nimport { RegistryNotConfiguredError } from \"@/src/registry/errors\"\nimport { parseRegistryAndItemFromString } from \"@/src/registry/parser\"\nimport { isLocalFile, isUrl } from \"@/src/registry/utils\"\nimport { validateRegistryConfig } from \"@/src/registry/validator\"\nimport { registryConfigItemSchema } from \"@/src/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { z } from \"zod\"\n\nconst NAME_PLACEHOLDER = \"{name}\"\nconst STYLE_PLACEHOLDER = \"{style}\"\nconst ENV_VAR_PATTERN = /\\${(\\w+)}/g\nconst QUERY_PARAM_SEPARATOR = \"?\"\nconst QUERY_PARAM_DELIMITER = \"&\"\n\nfunction isLocalPath(path: string) {\n return path.startsWith(\"./\") || path.startsWith(\"/\")\n}\n\nexport function buildUrlAndHeadersForRegistryItem(\n name: string,\n config?: Config\n) {\n let { registry, item } = parseRegistryAndItemFromString(name)\n\n // If no registry prefix, check if it's a URL or local path.\n // These should be handled directly, not through a registry.\n if (!registry) {\n if (isUrl(name) || isLocalFile(name) || isLocalPath(name)) {\n return null\n }\n registry = \"@shadcn\"\n }\n\n const registries = { ...BUILTIN_REGISTRIES, ...config?.registries }\n const registryConfig = registries[registry]\n if (!registryConfig) {\n throw new RegistryNotConfiguredError(registry)\n }\n\n // TODO: I don't like this here.\n // But this will do for now.\n validateRegistryConfig(registry, registryConfig)\n\n return {\n url: buildUrlFromRegistryConfig(item, registryConfig, config),\n headers: buildHeadersFromRegistryConfig(registryConfig),\n }\n}\n\nexport function buildUrlFromRegistryConfig(\n item: string,\n registryConfig: z.infer<typeof registryConfigItemSchema>,\n config?: Config\n) {\n if (typeof registryConfig === \"string\") {\n let url = registryConfig.replace(NAME_PLACEHOLDER, item)\n if (config?.style && url.includes(STYLE_PLACEHOLDER)) {\n url = url.replace(STYLE_PLACEHOLDER, config.style)\n }\n return expandEnvVars(url)\n }\n\n let baseUrl = registryConfig.url.replace(NAME_PLACEHOLDER, item)\n if (config?.style && baseUrl.includes(STYLE_PLACEHOLDER)) {\n baseUrl = baseUrl.replace(STYLE_PLACEHOLDER, config.style)\n }\n baseUrl = expandEnvVars(baseUrl)\n\n if (!registryConfig.params) {\n return baseUrl\n }\n\n return appendQueryParams(baseUrl, registryConfig.params)\n}\n\nexport function buildHeadersFromRegistryConfig(\n config: z.infer<typeof registryConfigItemSchema>\n) {\n if (typeof config === \"string\" || !config.headers) {\n return {}\n }\n\n const headers: Record<string, string> = {}\n\n for (const [key, value] of Object.entries(config.headers)) {\n const expandedValue = expandEnvVars(value)\n\n if (shouldIncludeHeader(value, expandedValue)) {\n headers[key] = expandedValue\n }\n }\n\n return headers\n}\n\nfunction appendQueryParams(baseUrl: string, params: Record<string, string>) {\n const urlParams = new URLSearchParams()\n\n for (const [key, value] of Object.entries(params)) {\n const expandedValue = expandEnvVars(value)\n if (expandedValue) {\n urlParams.append(key, expandedValue)\n }\n }\n\n const queryString = urlParams.toString()\n if (!queryString) {\n return baseUrl\n }\n\n const separator = baseUrl.includes(QUERY_PARAM_SEPARATOR)\n ? QUERY_PARAM_DELIMITER\n : QUERY_PARAM_SEPARATOR\n\n return `${baseUrl}${separator}${queryString}`\n}\n\nfunction shouldIncludeHeader(originalValue: string, expandedValue: string) {\n const trimmedExpanded = expandedValue.trim()\n\n if (!trimmedExpanded) {\n return false\n }\n\n // If the original value contains valid env vars, only include if expansion changed the value.\n if (originalValue.includes(\"${\")) {\n // Check if there are actual env vars in the string\n const envVars = originalValue.match(ENV_VAR_PATTERN)\n if (envVars) {\n const templateWithoutVars = originalValue\n .replace(ENV_VAR_PATTERN, \"\")\n .trim()\n return trimmedExpanded !== templateWithoutVars\n }\n }\n\n return true\n}\n\n/**\n * Resolves a registry URL from a path or URL string.\n * Handles special cases like v0 registry URLs that need /json suffix.\n *\n * @param pathOrUrl - Either a relative path or a full URL\n * @returns The resolved registry URL\n */\nexport function resolveRegistryUrl(pathOrUrl: string) {\n if (isUrl(pathOrUrl)) {\n // If the url contains /chat/b/, we assume it's the v0 registry.\n // We need to add the /json suffix if it's missing.\n const url = new URL(pathOrUrl)\n if (url.pathname.match(/\\/chat\\/b\\//) && !url.pathname.endsWith(\"/json\")) {\n url.pathname = `${url.pathname}/json`\n }\n\n return url.toString()\n }\n\n return `${REGISTRY_URL}/${pathOrUrl}`\n}\n","import { promises as fs } from \"fs\"\nimport { homedir } from \"os\"\nimport path from \"path\"\nimport { resolveRegistryUrl } from \"@/src/registry/builder\"\nimport { getRegistryHeadersFromContext } from \"@/src/registry/context\"\nimport {\n RegistryFetchError,\n RegistryForbiddenError,\n RegistryLocalFileError,\n RegistryNotFoundError,\n RegistryParseError,\n RegistryUnauthorizedError,\n} from \"@/src/registry/errors\"\nimport { registryItemSchema } from \"@/src/schema\"\nimport { HttpsProxyAgent } from \"https-proxy-agent\"\nimport fetch from \"node-fetch\"\nimport { z } from \"zod\"\n\nconst agent = process.env.https_proxy\n ? new HttpsProxyAgent(process.env.https_proxy)\n : undefined\n\nconst registryCache = new Map<string, Promise<any>>()\n\nexport function clearRegistryCache() {\n registryCache.clear()\n}\n\nexport async function fetchRegistry(\n paths: string[],\n options: { useCache?: boolean } = {}\n) {\n options = {\n useCache: true,\n ...options,\n }\n\n try {\n const results = await Promise.all(\n paths.map(async (path) => {\n const url = resolveRegistryUrl(path)\n\n // Check cache first if caching is enabled\n if (options.useCache && registryCache.has(url)) {\n return registryCache.get(url)\n }\n\n // Store the promise in the cache before awaiting if caching is enabled.\n const fetchPromise = (async () => {\n // Get headers from context for this URL.\n const headers = getRegistryHeadersFromContext(url)\n\n const response = await fetch(url, {\n agent,\n headers: {\n ...headers,\n },\n })\n\n if (!response.ok) {\n let messageFromServer = undefined\n\n if (\n response.headers.get(\"content-type\")?.includes(\"application/json\")\n ) {\n const json = await response.json()\n const parsed = z\n .object({\n // RFC 7807.\n detail: z.string().optional(),\n title: z.string().optional(),\n // Standard error response.\n message: z.string().optional(),\n error: z.string().optional(),\n })\n .safeParse(json)\n\n if (parsed.success) {\n // Prefer RFC 7807 detail field, then message field.\n messageFromServer = parsed.data.detail || parsed.data.message\n\n if (parsed.data.error) {\n messageFromServer = `[${parsed.data.error}] ${messageFromServer}`\n }\n }\n }\n\n if (response.status === 401) {\n throw new RegistryUnauthorizedError(url, messageFromServer)\n }\n\n if (response.status === 404) {\n throw new RegistryNotFoundError(url, messageFromServer)\n }\n\n if (response.status === 403) {\n throw new RegistryForbiddenError(url, messageFromServer)\n }\n\n throw new RegistryFetchError(\n url,\n response.status,\n messageFromServer\n )\n }\n\n return response.json()\n })()\n\n if (options.useCache) {\n registryCache.set(url, fetchPromise)\n }\n return fetchPromise\n })\n )\n\n return results\n } catch (error) {\n throw error\n }\n}\n\nexport async function fetchRegistryLocal(filePath: string) {\n try {\n // Handle tilde expansion for home directory\n let expandedPath = filePath\n if (filePath.startsWith(\"~/\")) {\n expandedPath = path.join(homedir(), filePath.slice(2))\n }\n\n const resolvedPath = path.resolve(expandedPath)\n const content = await fs.readFile(resolvedPath, \"utf8\")\n const parsed = JSON.parse(content)\n\n try {\n return registryItemSchema.parse(parsed)\n } catch (error) {\n throw new RegistryParseError(filePath, error)\n }\n } catch (error) {\n // Check if this is a file not found error\n if (\n error instanceof Error &&\n (error.message.includes(\"ENOENT\") ||\n error.message.includes(\"no such file\"))\n ) {\n throw new RegistryLocalFileError(filePath, error)\n }\n // Re-throw parse errors as-is\n if (error instanceof RegistryParseError) {\n throw error\n }\n // For other errors (like JSON parse errors), throw as local file error\n throw new RegistryLocalFileError(filePath, error)\n }\n}\n","import { promises as fs } from \"fs\"\nimport { tmpdir } from \"os\"\nimport path from \"path\"\nimport {\n registryItemCssVarsSchema,\n registryItemTailwindSchema,\n} from \"@/src/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport { TailwindVersion } from \"@/src/utils/get-project-info\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { spinner } from \"@/src/utils/spinner\"\nimport deepmerge from \"deepmerge\"\nimport objectToString from \"stringify-object\"\nimport { type Config as TailwindConfig } from \"tailwindcss\"\nimport {\n ArrayLiteralExpression,\n ObjectLiteralExpression,\n Project,\n PropertyAssignment,\n QuoteKind,\n ScriptKind,\n SyntaxKind,\n VariableStatement,\n} from \"ts-morph\"\nimport { z } from \"zod\"\n\nexport type UpdaterTailwindConfig = Omit<TailwindConfig, \"plugins\"> & {\n // We only want string plugins for now.\n plugins?: string[]\n}\n\nexport async function updateTailwindConfig(\n tailwindConfig:\n | z.infer<typeof registryItemTailwindSchema>[\"config\"]\n | undefined,\n config: Config,\n options: {\n silent?: boolean\n tailwindVersion?: TailwindVersion\n }\n) {\n if (!tailwindConfig) {\n return\n }\n\n options = {\n silent: false,\n tailwindVersion: \"v3\",\n ...options,\n }\n\n // No tailwind config in v4.\n if (options.tailwindVersion === \"v4\") {\n return\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 transformTailwindConfig(raw, tailwindConfig, config)\n await fs.writeFile(config.resolvedPaths.tailwindConfig, output, \"utf8\")\n tailwindSpinner?.succeed()\n}\n\nexport async function transformTailwindConfig(\n input: string,\n tailwindConfig: UpdaterTailwindConfig,\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 const quoteChar = _getQuoteChar(configObject)\n\n // Add darkMode.\n addTailwindConfigProperty(\n configObject,\n {\n name: \"darkMode\",\n value: \"class\",\n },\n { quoteChar }\n )\n\n // Add Tailwind config plugins.\n tailwindConfig.plugins?.forEach((plugin) => {\n addTailwindConfigPlugin(configObject, plugin)\n })\n\n // Add Tailwind config theme.\n if (tailwindConfig.theme) {\n await addTailwindConfigTheme(configObject, tailwindConfig.theme)\n }\n\n return sourceFile.getFullText()\n}\n\nfunction addTailwindConfigProperty(\n configObject: ObjectLiteralExpression,\n property: {\n name: string\n value: string\n },\n {\n quoteChar,\n }: {\n quoteChar: string\n }\n) {\n const existingProperty = configObject.getProperty(\"darkMode\")\n\n if (!existingProperty) {\n const newProperty = {\n name: property.name,\n initializer: `[${quoteChar}${property.value}${quoteChar}]`,\n }\n\n // We need to add darkMode as the first property.\n if (property.name === \"darkMode\") {\n configObject.insertPropertyAssignment(0, newProperty)\n return configObject\n }\n\n configObject.addPropertyAssignment(newProperty)\n\n return configObject\n }\n\n if (existingProperty.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingProperty.getInitializer()\n const newValue = `${quoteChar}${property.value}${quoteChar}`\n\n // If property is a string, change it to an array and append.\n if (initializer?.isKind(SyntaxKind.StringLiteral)) {\n const initializerText = initializer.getText()\n initializer.replaceWithText(`[${initializerText}, ${newValue}]`)\n return configObject\n }\n\n // If property is an array, append.\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\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 return configObject\n }\n initializer.addElement(newValue)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nasync function addTailwindConfigTheme(\n configObject: ObjectLiteralExpression,\n theme: UpdaterTailwindConfig[\"theme\"]\n) {\n // Ensure there is a theme property.\n if (!configObject.getProperty(\"theme\")) {\n configObject.addPropertyAssignment({\n name: \"theme\",\n initializer: \"{}\",\n })\n }\n\n // Nest all spread properties.\n nestSpreadProperties(configObject)\n\n const themeProperty = configObject\n .getPropertyOrThrow(\"theme\")\n ?.asKindOrThrow(SyntaxKind.PropertyAssignment)\n\n const themeInitializer = themeProperty.getInitializer()\n if (themeInitializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n const themeObjectString = themeInitializer.getText()\n const themeObject = await parseObjectLiteral(themeObjectString)\n const result = deepmerge(themeObject, theme, {\n arrayMerge: (dst, src) => src,\n })\n const resultString = objectToString(result)\n .replace(/\\'\\.\\.\\.(.*)\\'/g, \"...$1\") // Remove quote around spread element\n .replace(/\\'\\\"/g, \"'\") // Replace `\\\" with \"\n .replace(/\\\"\\'/g, \"'\") // Replace `\\\" with \"\n .replace(/\\'\\[/g, \"[\") // Replace `[ with [\n .replace(/\\]\\'/g, \"]\") // Replace `] with ]\n .replace(/\\'\\\\\\'/g, \"'\") // Replace `\\' with '\n .replace(/\\\\\\'/g, \"'\") // Replace \\' with '\n .replace(/\\\\\\'\\'/g, \"'\")\n .replace(/\\'\\'/g, \"'\")\n themeInitializer.replaceWithText(resultString)\n }\n\n // Unnest all spread properties.\n unnestSpreadProperties(configObject)\n}\n\nfunction addTailwindConfigPlugin(\n configObject: ObjectLiteralExpression,\n plugin: string\n) {\n const existingPlugins = configObject.getProperty(\"plugins\")\n\n if (!existingPlugins) {\n configObject.addPropertyAssignment({\n name: \"plugins\",\n initializer: `[${plugin}]`,\n })\n\n return configObject\n }\n\n if (existingPlugins.isKind(SyntaxKind.PropertyAssignment)) {\n const initializer = existingPlugins.getInitializer()\n\n if (initializer?.isKind(SyntaxKind.ArrayLiteralExpression)) {\n if (\n initializer\n .getElements()\n .map((element) => {\n return element.getText().replace(/[\"']/g, \"\")\n })\n .includes(plugin.replace(/[\"']/g, \"\"))\n ) {\n return configObject\n }\n initializer.addElement(plugin)\n }\n\n return configObject\n }\n\n return configObject\n}\n\nexport async function _createSourceFile(input: string, config: Config | null) {\n const dir = await fs.mkdtemp(path.join(tmpdir(), \"shadcn-\"))\n const resolvedPath =\n config?.resolvedPaths?.tailwindConfig || \"tailwind.config.ts\"\n const tempFile = path.join(dir, `shadcn-${path.basename(resolvedPath)}`)\n\n const project = new Project({\n compilerOptions: {},\n })\n const sourceFile = project.createSourceFile(tempFile, input, {\n // Note: .js and .mjs can still be valid for TS projects.\n // We can't infer TypeScript from config.tsx.\n scriptKind:\n path.extname(resolvedPath) === \".ts\" ? ScriptKind.TS : ScriptKind.JS,\n })\n\n return sourceFile\n}\n\nexport function _getQuoteChar(configObject: ObjectLiteralExpression) {\n return configObject\n .getFirstDescendantByKind(SyntaxKind.StringLiteral)\n ?.getQuoteKind() === QuoteKind.Single\n ? \"'\"\n : '\"'\n}\n\nexport function nestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.SpreadAssignment)) {\n const spreadAssignment = prop.asKindOrThrow(SyntaxKind.SpreadAssignment)\n const spreadText = spreadAssignment.getExpression().getText()\n\n // Replace spread with a property assignment\n obj.insertPropertyAssignment(i, {\n // Need to escape the name with \" so that deepmerge doesn't mishandle the key\n name: `\"___${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n initializer: `\"...${spreadText.replace(/^\\.\\.\\./, \"\")}\"`,\n })\n\n // Remove the original spread assignment\n spreadAssignment.remove()\n } else if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop.asKindOrThrow(SyntaxKind.PropertyAssignment)\n const initializer = propAssignment.getInitializer()\n\n if (\n initializer &&\n initializer.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n // Recursively process nested object literals\n nestSpreadProperties(\n initializer.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (\n initializer &&\n initializer.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n nestSpreadElements(\n initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function nestSpreadElements(arr: ArrayLiteralExpression) {\n const elements = arr.getElements()\n for (let j = 0; j < elements.length; j++) {\n const element = elements[j]\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n // Recursive check on objects within arrays\n nestSpreadProperties(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Recursive check on nested arrays\n nestSpreadElements(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.SpreadElement)) {\n const spreadText = element.getText()\n // Spread element within an array\n arr.removeElement(j)\n arr.insertElement(j, `\"${spreadText}\"`)\n }\n }\n}\n\nexport function unnestSpreadProperties(obj: ObjectLiteralExpression) {\n const properties = obj.getProperties()\n\n for (let i = 0; i < properties.length; i++) {\n const prop = properties[i]\n if (prop.isKind(SyntaxKind.PropertyAssignment)) {\n const propAssignment = prop as PropertyAssignment\n const initializer = propAssignment.getInitializer()\n\n if (initializer && initializer.isKind(SyntaxKind.StringLiteral)) {\n const value = initializer\n .asKindOrThrow(SyntaxKind.StringLiteral)\n .getLiteralValue()\n if (value.startsWith(\"...\")) {\n obj.insertSpreadAssignment(i, { expression: value.slice(3) })\n propAssignment.remove()\n }\n } else if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n unnestSpreadProperties(initializer as ObjectLiteralExpression)\n } else if (\n initializer &&\n initializer.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n unsetSpreadElements(\n initializer.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n }\n }\n }\n}\n\nexport function unsetSpreadElements(arr: ArrayLiteralExpression) {\n const elements = arr.getElements()\n for (let j = 0; j < elements.length; j++) {\n const element = elements[j]\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n // Recursive check on objects within arrays\n unnestSpreadProperties(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n // Recursive check on nested arrays\n unsetSpreadElements(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n } else if (element.isKind(SyntaxKind.StringLiteral)) {\n const spreadText = element.getText()\n // check if spread element\n const spreadTest = /(?:^['\"])(\\.\\.\\..*)(?:['\"]$)/g\n if (spreadTest.test(spreadText)) {\n arr.removeElement(j)\n arr.insertElement(j, spreadText.replace(spreadTest, \"$1\"))\n }\n }\n }\n}\n\nasync function parseObjectLiteral(objectLiteralString: string): Promise<any> {\n const sourceFile = await _createSourceFile(\n `const theme = ${objectLiteralString}`,\n null\n )\n\n const statement = sourceFile.getStatements()[0]\n if (statement?.getKind() === SyntaxKind.VariableStatement) {\n const declaration = (statement as VariableStatement)\n .getDeclarationList()\n ?.getDeclarations()[0]\n const initializer = declaration.getInitializer()\n if (initializer?.isKind(SyntaxKind.ObjectLiteralExpression)) {\n return await parseObjectLiteralExpression(initializer)\n }\n }\n\n throw new Error(\"Invalid input: not an object literal\")\n}\n\nfunction parseObjectLiteralExpression(node: ObjectLiteralExpression): any {\n const result: any = {}\n for (const property of node.getProperties()) {\n if (property.isKind(SyntaxKind.PropertyAssignment)) {\n const name = property.getName().replace(/\\'/g, \"\")\n if (\n property.getInitializer()?.isKind(SyntaxKind.ObjectLiteralExpression)\n ) {\n result[name] = parseObjectLiteralExpression(\n property.getInitializer() as ObjectLiteralExpression\n )\n } else if (\n property.getInitializer()?.isKind(SyntaxKind.ArrayLiteralExpression)\n ) {\n result[name] = parseArrayLiteralExpression(\n property.getInitializer() as ArrayLiteralExpression\n )\n } else {\n result[name] = parseValue(property.getInitializer())\n }\n }\n }\n return result\n}\n\nfunction parseArrayLiteralExpression(node: ArrayLiteralExpression): any[] {\n const result: any[] = []\n for (const element of node.getElements()) {\n if (element.isKind(SyntaxKind.ObjectLiteralExpression)) {\n result.push(\n parseObjectLiteralExpression(\n element.asKindOrThrow(SyntaxKind.ObjectLiteralExpression)\n )\n )\n } else if (element.isKind(SyntaxKind.ArrayLiteralExpression)) {\n result.push(\n parseArrayLiteralExpression(\n element.asKindOrThrow(SyntaxKind.ArrayLiteralExpression)\n )\n )\n } else {\n result.push(parseValue(element))\n }\n }\n return result\n}\n\nfunction parseValue(node: any): any {\n switch (node.getKind()) {\n case SyntaxKind.StringLiteral:\n return node.getText()\n case SyntaxKind.NumericLiteral:\n return Number(node.getText())\n case SyntaxKind.TrueKeyword:\n return true\n case SyntaxKind.FalseKeyword:\n return false\n case SyntaxKind.NullKeyword:\n return null\n case SyntaxKind.ArrayLiteralExpression:\n return node.getElements().map(parseValue)\n case SyntaxKind.ObjectLiteralExpression:\n return parseObjectLiteralExpression(node)\n default:\n return node.getText()\n }\n}\n\nexport function buildTailwindThemeColorsFromCssVars(\n cssVars: z.infer<typeof registryItemCssVarsSchema>\n) {\n const result: Record<string, any> = {}\n\n for (const key of Object.keys(cssVars)) {\n const parts = key.split(\"-\")\n const colorName = parts[0]\n const subType = parts.slice(1).join(\"-\")\n\n if (subType === \"\") {\n if (typeof result[colorName] === \"object\") {\n result[colorName].DEFAULT = `hsl(var(--${key}))`\n } else {\n result[colorName] = `hsl(var(--${key}))`\n }\n } else {\n if (typeof result[colorName] !== \"object\") {\n result[colorName] = { DEFAULT: `hsl(var(--${colorName}))` }\n }\n result[colorName][subType] = `hsl(var(--${key}))`\n }\n }\n\n // Remove DEFAULT if it's not in the original cssVars\n for (const [colorName, value] of Object.entries(result)) {\n if (\n typeof value === \"object\" &&\n value.DEFAULT === `hsl(var(--${colorName}))` &&\n !(colorName in cssVars)\n ) {\n delete value.DEFAULT\n }\n }\n\n return result\n}\n","import { createHash } from \"crypto\"\nimport path from \"path\"\nimport {\n getRegistryBaseColor,\n getShadcnRegistryIndex,\n} from \"@/src/registry/api\"\nimport {\n buildUrlAndHeadersForRegistryItem,\n resolveRegistryUrl,\n} from \"@/src/registry/builder\"\nimport { setRegistryHeaders } from \"@/src/registry/context\"\nimport {\n RegistryNotConfiguredError,\n RegistryParseError,\n} from \"@/src/registry/errors\"\nimport { fetchRegistry, fetchRegistryLocal } from \"@/src/registry/fetcher\"\nimport { parseRegistryAndItemFromString } from \"@/src/registry/parser\"\nimport {\n deduplicateFilesByTarget,\n isLocalFile,\n isUrl,\n} from \"@/src/registry/utils\"\nimport {\n RegistryFontItem,\n registryItemCommonSchema,\n registryItemFontSchema,\n registryItemSchema,\n registryItemTypeSchema,\n registryResolvedItemsTreeSchema,\n} from \"@/src/schema\"\nimport { Config, getTargetStyleFromConfig } from \"@/src/utils/get-config\"\nimport { getProjectTailwindVersionFromConfig } from \"@/src/utils/get-project-info\"\nimport { buildTailwindThemeColorsFromCssVars } from \"@/src/utils/updaters/update-tailwind-config\"\nimport deepmerge from \"deepmerge\"\nimport { z } from \"zod\"\n\nexport function resolveRegistryItemsFromRegistries(\n items: string[],\n config: Config\n) {\n const registryHeaders: Record<string, Record<string, string>> = {}\n const resolvedItems = [...items]\n\n if (!config?.registries) {\n setRegistryHeaders({})\n return resolvedItems\n }\n\n for (let i = 0; i < resolvedItems.length; i++) {\n const resolved = buildUrlAndHeadersForRegistryItem(resolvedItems[i], config)\n\n if (resolved) {\n resolvedItems[i] = resolved.url\n\n if (Object.keys(resolved.headers).length > 0) {\n registryHeaders[resolved.url] = resolved.headers\n }\n }\n }\n\n setRegistryHeaders(registryHeaders)\n\n return resolvedItems\n}\n\n// Internal function that fetches registry items without clearing context.\n// This is used for recursive dependency resolution.\nexport async function fetchRegistryItems(\n items: string[],\n config: Config,\n options: { useCache?: boolean } = {}\n) {\n const results = await Promise.all(\n items.map(async (item) => {\n if (isLocalFile(item)) {\n return fetchRegistryLocal(item)\n }\n\n if (isUrl(item)) {\n const [result] = await fetchRegistry([item], options)\n try {\n return registryItemSchema.parse(result)\n } catch (error) {\n throw new RegistryParseError(item, error)\n }\n }\n\n if (item.startsWith(\"@\") && config?.registries) {\n const paths = resolveRegistryItemsFromRegistries([item], config)\n const [result] = await fetchRegistry(paths, options)\n try {\n return registryItemSchema.parse(result)\n } catch (error) {\n throw new RegistryParseError(item, error)\n }\n }\n\n const path = `styles/${config?.style ?? \"new-york-v4\"}/${item}.json`\n const [result] = await fetchRegistry([path], options)\n try {\n return registryItemSchema.parse(result)\n } catch (error) {\n throw new RegistryParseError(item, error)\n }\n })\n )\n\n return results\n}\n\n// Helper schema for items with source tracking.\nconst registryItemWithSourceSchema = registryItemCommonSchema\n .extend({\n type: registryItemTypeSchema,\n _source: z.string().optional(),\n // Optional fields for specific item types.\n font: registryItemFontSchema.optional(),\n config: z.any().optional(),\n })\n .passthrough()\n\n// Resolves a list of registry items with all their dependencies and returns\n// a complete installation bundle with merged configuration.\nexport async function resolveRegistryTree(\n names: z.infer<typeof registryItemSchema>[\"name\"][],\n config: Config,\n options: { useCache?: boolean } = {}\n) {\n options = {\n useCache: true,\n ...options,\n }\n\n let payload: z.infer<typeof registryItemWithSourceSchema>[] = []\n let allDependencyItems: z.infer<typeof registryItemWithSourceSchema>[] = []\n let allDependencyRegistryNames: string[] = []\n\n const uniqueNames = Array.from(new Set(names))\n\n const results = await fetchRegistryItems(uniqueNames, config, options)\n\n const resultMap = new Map<string, z.infer<typeof registryItemSchema>>()\n for (let i = 0; i < results.length; i++) {\n if (results[i]) {\n resultMap.set(uniqueNames[i], results[i])\n }\n }\n\n for (const [sourceName, item] of Array.from(resultMap.entries())) {\n // Add source tracking\n const itemWithSource: z.infer<typeof registryItemWithSourceSchema> = {\n ...item,\n _source: sourceName,\n }\n payload.push(itemWithSource)\n\n if (item.registryDependencies) {\n // Resolve namespace syntax and set headers for dependencies\n let resolvedDependencies = item.registryDependencies\n\n // Check for namespaced dependencies when no registries are configured\n if (!config?.registries) {\n const namespacedDeps = item.registryDependencies.filter((dep: string) =>\n dep.startsWith(\"@\")\n )\n if (namespacedDeps.length > 0) {\n const { registry } = parseRegistryAndItemFromString(namespacedDeps[0])\n throw new RegistryNotConfiguredError(registry)\n }\n } else {\n resolvedDependencies = resolveRegistryItemsFromRegistries(\n item.registryDependencies,\n config\n )\n }\n\n const { items, registryNames } = await resolveDependenciesRecursively(\n resolvedDependencies,\n config,\n options,\n new Set(uniqueNames)\n )\n allDependencyItems.push(...items)\n allDependencyRegistryNames.push(...registryNames)\n }\n }\n\n payload.push(...allDependencyItems)\n\n // Handle any remaining registry names that need index resolution\n if (allDependencyRegistryNames.length > 0) {\n // Remove duplicates from registry names\n const uniqueRegistryNames = Array.from(new Set(allDependencyRegistryNames))\n\n // Separate namespaced and non-namespaced items\n const nonNamespacedItems = uniqueRegistryNames.filter(\n (name) => !name.startsWith(\"@\")\n )\n const namespacedDepItems = uniqueRegistryNames.filter((name) =>\n name.startsWith(\"@\")\n )\n\n // Handle namespaced dependency items\n if (namespacedDepItems.length > 0) {\n // This will now throw specific errors on failure\n const depResults = await fetchRegistryItems(\n namespacedDepItems,\n config,\n options\n )\n\n for (let i = 0; i < depResults.length; i++) {\n const item = depResults[i]\n const itemWithSource: z.infer<typeof registryItemWithSourceSchema> = {\n ...item,\n _source: namespacedDepItems[i],\n }\n payload.push(itemWithSource)\n }\n }\n\n // For non-namespaced items, we need the index and style resolution\n if (nonNamespacedItems.length > 0) {\n const index = await getShadcnRegistryIndex()\n if (!index && payload.length === 0) {\n return null\n }\n\n if (index) {\n // If we're resolving the index, we want it to go first\n if (nonNamespacedItems.includes(\"index\")) {\n nonNamespacedItems.unshift(\"index\")\n }\n\n // Resolve non-namespaced items through the existing flow\n // Get URLs for all registry items including their dependencies\n const registryUrls: string[] = []\n for (const name of nonNamespacedItems) {\n const itemDependencies = await resolveRegistryDependencies(\n name,\n config,\n options\n )\n registryUrls.push(...itemDependencies)\n }\n\n // Deduplicate URLs\n const uniqueUrls = Array.from(new Set(registryUrls))\n let result = await fetchRegistry(uniqueUrls, options)\n const registryPayload = z.array(registryItemSchema).parse(result)\n payload.push(...registryPayload)\n }\n }\n }\n\n if (!payload.length) {\n return null\n }\n\n // No deduplication - we want to support multiple items with the same name from different sources\n\n // If we're resolving the index, we want to fetch\n // the theme item if a base color is provided.\n // We do this for index only.\n // Other components will ship with their theme tokens.\n if (\n uniqueNames.includes(\"index\") ||\n allDependencyRegistryNames.includes(\"index\")\n ) {\n if (config.tailwind.baseColor) {\n const theme = await registryGetTheme(config.tailwind.baseColor, config)\n if (theme) {\n payload.unshift(theme)\n }\n }\n }\n\n // Build source map for topological sort.\n const sourceMap = new Map<\n z.infer<typeof registryItemWithSourceSchema>,\n string\n >()\n payload.forEach((item) => {\n // Use the _source property if it was added, otherwise use the name.\n const source = item._source || item.name\n sourceMap.set(item, source)\n })\n\n // Apply topological sort to ensure dependencies come before dependents.\n payload = topologicalSortRegistryItems(payload, sourceMap)\n\n // Sort the payload so that registry:theme items come first,\n // while maintaining the relative order of all items.\n payload.sort((a, b) => {\n if (a.type === \"registry:theme\" && b.type !== \"registry:theme\") {\n return -1\n }\n if (a.type !== \"registry:theme\" && b.type === \"registry:theme\") {\n return 1\n }\n return 0\n })\n\n let tailwind = {}\n payload.forEach((item) => {\n tailwind = deepmerge(tailwind, item.tailwind ?? {})\n })\n\n let cssVars = {}\n payload.forEach((item) => {\n cssVars = deepmerge(cssVars, item.cssVars ?? {})\n })\n\n let css = {}\n payload.forEach((item) => {\n css = deepmerge(css, item.css ?? {})\n })\n\n let docs = \"\"\n payload.forEach((item) => {\n if (item.docs) {\n docs += `${item.docs}\\n`\n }\n })\n\n let envVars = {}\n payload.forEach((item) => {\n envVars = deepmerge(envVars, item.envVars ?? {})\n })\n\n // Deduplicate files based on resolved target paths.\n const deduplicatedFiles = await deduplicateFilesByTarget(\n payload.map((item) => item.files ?? []),\n config\n )\n\n // Collect font items.\n const fonts: RegistryFontItem[] = payload\n .filter((item) => item.type === \"registry:font\" && item.font)\n .map((item) => ({\n ...item,\n type: \"registry:font\" as const,\n font: item.font!,\n }))\n\n const parsed = registryResolvedItemsTreeSchema.parse({\n dependencies: deepmerge.all(payload.map((item) => item.dependencies ?? [])),\n devDependencies: deepmerge.all(\n payload.map((item) => item.devDependencies ?? [])\n ),\n files: deduplicatedFiles,\n tailwind,\n cssVars,\n css,\n docs,\n fonts: fonts.length > 0 ? fonts : undefined,\n })\n\n if (Object.keys(envVars).length > 0) {\n parsed.envVars = envVars\n }\n\n return parsed\n}\n\nasync function resolveDependenciesRecursively(\n dependencies: string[],\n config: Config,\n options: { useCache?: boolean } = {},\n visited: Set<string> = new Set()\n) {\n const items: z.infer<typeof registryItemSchema>[] = []\n const registryNames: string[] = []\n\n for (const dep of dependencies) {\n if (visited.has(dep)) {\n continue\n }\n visited.add(dep)\n\n // Handle URLs and local files directly.\n if (isUrl(dep) || isLocalFile(dep)) {\n const [item] = await fetchRegistryItems([dep], config, options)\n if (item) {\n items.push(item)\n if (item.registryDependencies) {\n // Resolve namespaced dependencies to set proper headers.\n const resolvedDeps = config?.registries\n ? resolveRegistryItemsFromRegistries(\n item.registryDependencies,\n config\n )\n : item.registryDependencies\n\n const nested = await resolveDependenciesRecursively(\n resolvedDeps,\n config,\n options,\n visited\n )\n items.push(...nested.items)\n registryNames.push(...nested.registryNames)\n }\n }\n }\n // Handle namespaced items (e.g., @one/foo, @two/bar).\n else if (dep.startsWith(\"@\") && config?.registries) {\n // Check if the registry exists.\n const { registry } = parseRegistryAndItemFromString(dep)\n if (registry && !(registry in config.registries)) {\n throw new RegistryNotConfiguredError(registry)\n }\n\n // Let getRegistryItem handle the namespaced item with config\n // This ensures proper authentication headers are used\n const [item] = await fetchRegistryItems([dep], config, options)\n if (item) {\n items.push(item)\n if (item.registryDependencies) {\n // Resolve namespaced dependencies to set proper headers.\n const resolvedDeps = config?.registries\n ? resolveRegistryItemsFromRegistries(\n item.registryDependencies,\n config\n )\n : item.registryDependencies\n\n const nested = await resolveDependenciesRecursively(\n resolvedDeps,\n config,\n options,\n visited\n )\n items.push(...nested.items)\n registryNames.push(...nested.registryNames)\n }\n }\n }\n // Handle regular component names.\n else {\n registryNames.push(dep)\n\n if (config) {\n try {\n const [item] = await fetchRegistryItems([dep], config, options)\n if (item && item.registryDependencies) {\n // Resolve namespaced dependencies to set proper headers.\n const resolvedDeps = config?.registries\n ? resolveRegistryItemsFromRegistries(\n item.registryDependencies,\n config\n )\n : item.registryDependencies\n\n const nested = await resolveDependenciesRecursively(\n resolvedDeps,\n config,\n options,\n visited\n )\n items.push(...nested.items)\n registryNames.push(...nested.registryNames)\n }\n } catch (error) {\n // If we can't fetch the registry item, that's okay - we'll still\n // include the name.\n }\n }\n }\n }\n\n return { items, registryNames }\n}\n\nasync function resolveRegistryDependencies(\n url: string,\n config: Config,\n options: { useCache?: boolean } = {}\n) {\n if (isUrl(url)) {\n return [url]\n }\n\n const { registryNames } = await resolveDependenciesRecursively(\n [url],\n config,\n options,\n new Set()\n )\n\n const style = config.resolvedPaths?.cwd\n ? await getTargetStyleFromConfig(config.resolvedPaths.cwd, config.style)\n : config.style\n\n const urls = registryNames.map((name) =>\n resolveRegistryUrl(isUrl(name) ? name : `styles/${style}/${name}.json`)\n )\n\n return Array.from(new Set(urls))\n}\n\nasync function registryGetTheme(name: string, config: Config) {\n const [baseColor, tailwindVersion] = await Promise.all([\n getRegistryBaseColor(name),\n getProjectTailwindVersionFromConfig(config),\n ])\n if (!baseColor) {\n return null\n }\n\n // TODO: Move this to the registry i.e registry:theme.\n const theme = {\n name,\n type: \"registry:theme\",\n tailwind: {\n config: {\n theme: {\n extend: {\n borderRadius: {\n lg: \"var(--radius)\",\n md: \"calc(var(--radius) - 2px)\",\n sm: \"calc(var(--radius) - 4px)\",\n },\n colors: {},\n },\n },\n },\n },\n cssVars: {\n theme: {},\n light: {\n radius: \"0.5rem\",\n },\n dark: {},\n },\n } satisfies z.infer<typeof registryItemSchema>\n\n if (config.tailwind.cssVariables) {\n theme.tailwind.config.theme.extend.colors = {\n ...theme.tailwind.config.theme.extend.colors,\n ...buildTailwindThemeColorsFromCssVars(baseColor.cssVars.dark ?? {}),\n }\n theme.cssVars = {\n theme: {\n ...baseColor.cssVars.theme,\n ...theme.cssVars.theme,\n },\n light: {\n ...baseColor.cssVars.light,\n ...theme.cssVars.light,\n },\n dark: {\n ...baseColor.cssVars.dark,\n ...theme.cssVars.dark,\n },\n }\n\n if (tailwindVersion === \"v4\" && baseColor.cssVarsV4) {\n theme.cssVars = {\n theme: {\n ...baseColor.cssVarsV4.theme,\n ...theme.cssVars.theme,\n },\n light: {\n radius: \"0.625rem\",\n ...baseColor.cssVarsV4.light,\n },\n dark: {\n ...baseColor.cssVarsV4.dark,\n },\n }\n }\n }\n\n return theme\n}\n\nfunction computeItemHash(\n item: Pick<z.infer<typeof registryItemSchema>, \"name\">,\n source?: string\n) {\n const identifier = source || item.name\n\n const hash = createHash(\"sha256\")\n .update(identifier)\n .digest(\"hex\")\n .substring(0, 8)\n\n return `${item.name}::${hash}`\n}\n\nfunction extractItemIdentifierFromDependency(dependency: string) {\n if (isUrl(dependency)) {\n const url = new URL(dependency)\n const pathname = url.pathname\n const match = pathname.match(/\\/([^/]+)\\.json$/)\n const name = match ? match[1] : path.basename(pathname, \".json\")\n\n return {\n name,\n hash: computeItemHash({ name }, dependency),\n }\n }\n\n if (isLocalFile(dependency)) {\n const match = dependency.match(/\\/([^/]+)\\.json$/)\n const name = match ? match[1] : path.basename(dependency, \".json\")\n\n return {\n name,\n hash: computeItemHash({ name }, dependency),\n }\n }\n\n const { item } = parseRegistryAndItemFromString(dependency)\n return {\n name: item,\n hash: computeItemHash({ name: item }, dependency),\n }\n}\n\nfunction topologicalSortRegistryItems(\n items: z.infer<typeof registryItemWithSourceSchema>[],\n sourceMap: Map<z.infer<typeof registryItemWithSourceSchema>, string>\n) {\n const itemMap = new Map<\n string,\n z.infer<typeof registryItemWithSourceSchema>\n >()\n const hashToItem = new Map<\n string,\n z.infer<typeof registryItemWithSourceSchema>\n >()\n const inDegree = new Map<string, number>()\n const adjacencyList = new Map<string, string[]>()\n\n items.forEach((item) => {\n const source = sourceMap.get(item) || item.name\n const hash = computeItemHash(item, source)\n\n itemMap.set(hash, item)\n hashToItem.set(hash, item)\n inDegree.set(hash, 0)\n adjacencyList.set(hash, [])\n })\n\n // Build a map of dependency to possible items.\n const depToHashes = new Map<string, string[]>()\n items.forEach((item) => {\n const source = sourceMap.get(item) || item.name\n const hash = computeItemHash(item, source)\n\n if (!depToHashes.has(item.name)) {\n depToHashes.set(item.name, [])\n }\n depToHashes.get(item.name)!.push(hash)\n\n if (source !== item.name) {\n if (!depToHashes.has(source)) {\n depToHashes.set(source, [])\n }\n depToHashes.get(source)!.push(hash)\n }\n })\n\n items.forEach((item) => {\n const itemSource = sourceMap.get(item) || item.name\n const itemHash = computeItemHash(item, itemSource)\n\n if (item.registryDependencies) {\n item.registryDependencies.forEach((dep) => {\n let depHash: string | undefined\n\n const exactMatches = depToHashes.get(dep) || []\n if (exactMatches.length === 1) {\n depHash = exactMatches[0]\n } else if (exactMatches.length > 1) {\n // Multiple matches - try to disambiguate.\n // For now, just use the first one and warn.\n depHash = exactMatches[0]\n } else {\n const { name } = extractItemIdentifierFromDependency(dep)\n const nameMatches = depToHashes.get(name) || []\n if (nameMatches.length > 0) {\n depHash = nameMatches[0]\n }\n }\n\n if (depHash && itemMap.has(depHash)) {\n adjacencyList.get(depHash)!.push(itemHash)\n inDegree.set(itemHash, inDegree.get(itemHash)! + 1)\n }\n })\n }\n })\n\n // Implements Kahn's algorithm.\n const queue: string[] = []\n const sorted: z.infer<typeof registryItemWithSourceSchema>[] = []\n\n inDegree.forEach((degree, hash) => {\n if (degree === 0) {\n queue.push(hash)\n }\n })\n\n while (queue.length > 0) {\n const currentHash = queue.shift()!\n const item = itemMap.get(currentHash)!\n sorted.push(item)\n\n adjacencyList.get(currentHash)!.forEach((dependentHash) => {\n const newDegree = inDegree.get(dependentHash)! - 1\n inDegree.set(dependentHash, newDegree)\n\n if (newDegree === 0) {\n queue.push(dependentHash)\n }\n })\n }\n\n if (sorted.length !== items.length) {\n console.warn(\"Circular dependency detected in registry items\")\n // Return all items even if there are circular dependencies\n // Items not in sorted are part of circular dependencies\n const sortedHashes = new Set(\n sorted.map((item) => {\n const source = sourceMap.get(item) || item.name\n return computeItemHash(item, source)\n })\n )\n\n items.forEach((item) => {\n const source = sourceMap.get(item) || item.name\n const hash = computeItemHash(item, source)\n if (!sortedHashes.has(hash)) {\n sorted.push(item)\n }\n })\n }\n\n return sorted\n}\n","import { RegistryError } from \"@/src/registry/errors\"\nimport { highlighter } from \"@/src/utils/highlighter\"\nimport { logger } from \"@/src/utils/logger\"\nimport { z } from \"zod\"\n\nexport function handleError(error: unknown) {\n logger.break()\n logger.error(\n `Something went wrong. Please check the error below for more details.`\n )\n logger.error(`If the problem persists, please open an issue on GitHub.`)\n logger.error(\"\")\n if (typeof error === \"string\") {\n logger.error(error)\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof RegistryError) {\n if (error.message) {\n logger.error(error.cause ? \"Error:\" : \"Message:\")\n logger.error(error.message)\n }\n\n if (error.cause) {\n logger.error(\"\\nMessage:\")\n logger.error(error.cause)\n }\n\n if (error.suggestion) {\n logger.error(\"\\nSuggestion:\")\n logger.error(error.suggestion)\n }\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof z.ZodError) {\n logger.error(\"Validation failed:\")\n for (const [key, value] of Object.entries(error.flatten().fieldErrors)) {\n logger.error(`- ${highlighter.info(key)}: ${value}`)\n }\n logger.break()\n process.exit(1)\n }\n\n if (error instanceof Error) {\n logger.error(error.message)\n logger.break()\n process.exit(1)\n }\n\n logger.break()\n process.exit(1)\n}\n","import path from \"path\"\nimport { buildUrlAndHeadersForRegistryItem } from \"@/src/registry/builder\"\nimport { configWithDefaults } from \"@/src/registry/config\"\nimport {\n BASE_COLORS,\n BUILTIN_REGISTRIES,\n REGISTRY_URL,\n} from \"@/src/registry/constants\"\nimport {\n clearRegistryContext,\n setRegistryHeaders,\n} from \"@/src/registry/context\"\nimport {\n ConfigParseError,\n RegistriesIndexParseError,\n RegistryInvalidNamespaceError,\n RegistryNotFoundError,\n RegistryParseError,\n} from \"@/src/registry/errors\"\nimport { fetchRegistry } from \"@/src/registry/fetcher\"\nimport {\n fetchRegistryItems,\n resolveRegistryTree,\n} from \"@/src/registry/resolver\"\nimport { isUrl } from \"@/src/registry/utils\"\nimport {\n configJsonSchema,\n iconsSchema,\n registriesIndexSchema,\n registryBaseColorSchema,\n registryConfigSchema,\n registryIndexSchema,\n registryItemSchema,\n registrySchema,\n stylesSchema,\n} from \"@/src/schema\"\nimport { Config, explorer } from \"@/src/utils/get-config\"\nimport { handleError } from \"@/src/utils/handle-error\"\nimport { logger } from \"@/src/utils/logger\"\nimport { z } from \"zod\"\n\nexport async function getRegistry(\n name: string,\n options?: {\n config?: Partial<Config>\n useCache?: boolean\n }\n) {\n const { config, useCache } = options || {}\n\n if (isUrl(name)) {\n const [result] = await fetchRegistry([name], { useCache })\n try {\n return registrySchema.parse(result)\n } catch (error) {\n throw new RegistryParseError(name, error)\n }\n }\n\n if (!name.startsWith(\"@\")) {\n throw new RegistryInvalidNamespaceError(name)\n }\n\n let registryName = name\n if (!registryName.endsWith(\"/registry\")) {\n registryName = `${registryName}/registry`\n }\n\n const urlAndHeaders = buildUrlAndHeadersForRegistryItem(\n registryName as `@${string}`,\n configWithDefaults(config)\n )\n\n if (!urlAndHeaders?.url) {\n throw new RegistryNotFoundError(registryName)\n }\n\n if (urlAndHeaders.headers && Object.keys(urlAndHeaders.headers).length > 0) {\n setRegistryHeaders({\n [urlAndHeaders.url]: urlAndHeaders.headers,\n })\n }\n\n const [result] = await fetchRegistry([urlAndHeaders.url], { useCache })\n\n try {\n return registrySchema.parse(result)\n } catch (error) {\n throw new RegistryParseError(registryName, error)\n }\n}\n\nexport async function getRegistryItems(\n items: string[],\n options?: {\n config?: Partial<Config>\n useCache?: boolean\n }\n) {\n const { config, useCache = false } = options || {}\n\n clearRegistryContext()\n\n return fetchRegistryItems(items, configWithDefaults(config), { useCache })\n}\n\nexport async function resolveRegistryItems(\n items: string[],\n options?: {\n config?: Partial<Config>\n useCache?: boolean\n }\n) {\n const { config, useCache = false } = options || {}\n\n clearRegistryContext()\n return resolveRegistryTree(items, configWithDefaults(config), { useCache })\n}\n\nexport async function getRegistriesConfig(\n cwd: string,\n options?: { useCache?: boolean }\n) {\n const { useCache = true } = options || {}\n\n // Clear cache if requested\n if (!useCache) {\n explorer.clearCaches()\n }\n\n const configResult = await explorer.search(cwd)\n\n if (!configResult) {\n // Do not throw an error if the config is missing.\n // We still have access to the built-in registries.\n return {\n registries: BUILTIN_REGISTRIES,\n }\n }\n\n // Parse just the registries field from the config\n const registriesConfig = z\n .object({\n registries: registryConfigSchema.optional(),\n })\n .safeParse(configResult.config)\n\n if (!registriesConfig.success) {\n throw new ConfigParseError(cwd, registriesConfig.error)\n }\n\n // Merge built-in registries with user registries\n return {\n registries: {\n ...BUILTIN_REGISTRIES,\n ...(registriesConfig.data.registries || {}),\n },\n }\n}\n\nexport async function getShadcnRegistryIndex() {\n try {\n const [result] = await fetchRegistry([\"index.json\"])\n\n return registryIndexSchema.parse(result)\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n }\n}\n\nexport async function getRegistryStyles() {\n try {\n const [result] = await fetchRegistry([\"styles/index.json\"])\n\n return stylesSchema.parse(result)\n } catch (error) {\n logger.error(\"\\n\")\n handleError(error)\n return []\n }\n}\n\nexport async function getRegistryIcons() {\n try {\n const [result] = await fetchRegistry([\"icons/index.json\"])\n return iconsSchema.parse(result)\n } catch (error) {\n handleError(error)\n return {}\n }\n}\n\nexport async function getRegistryBaseColors() {\n return BASE_COLORS\n}\n\nexport async function getRegistryBaseColor(baseColor: string) {\n try {\n const [result] = await fetchRegistry([`colors/${baseColor}.json`])\n\n return registryBaseColorSchema.parse(result)\n } catch (error) {\n handleError(error)\n }\n}\n\n/**\n * @deprecated This function is deprecated and will be removed in a future version.\n */\nexport async function resolveTree(\n index: z.infer<typeof registryIndexSchema>,\n names: string[]\n) {\n const tree: z.infer<typeof registryIndexSchema> = []\n\n for (const name of names) {\n const entry = index.find((entry) => entry.name === name)\n\n if (!entry) {\n continue\n }\n\n tree.push(entry)\n\n if (entry.registryDependencies) {\n const dependencies = await resolveTree(index, entry.registryDependencies)\n tree.push(...dependencies)\n }\n }\n\n return tree.filter(\n (component, index, self) =>\n self.findIndex((c) => c.name === component.name) === index\n )\n}\n\n/**\n * @deprecated This function is deprecated and will be removed in a future version.\n */\nexport async function fetchTree(\n style: string,\n tree: z.infer<typeof registryIndexSchema>\n) {\n try {\n const paths = tree.map((item) => `styles/${style}/${item.name}.json`)\n const results = await fetchRegistry(paths)\n return results.map((result) => registryItemSchema.parse(result))\n } catch (error) {\n handleError(error)\n return []\n }\n}\n\n/**\n * @deprecated This function is deprecated and will be removed in a future version.\n */\nexport async function getItemTargetPath(\n config: Config,\n item: Pick<z.infer<typeof registryItemSchema>, \"type\">,\n override?: string\n) {\n if (override) {\n return override\n }\n\n if (item.type === \"registry:ui\") {\n return config.resolvedPaths.ui ?? config.resolvedPaths.components\n }\n\n const [parent, type] = item.type?.split(\":\") ?? []\n if (!(parent in config.resolvedPaths)) {\n return null\n }\n\n return path.join(\n config.resolvedPaths[parent as keyof typeof config.resolvedPaths],\n type\n )\n}\n\nexport async function getRegistriesIndex(options?: { useCache?: boolean }) {\n options = {\n useCache: true,\n ...options,\n }\n\n const url = `${REGISTRY_URL}/registries.json`\n const [data] = await fetchRegistry([url], {\n useCache: options.useCache,\n })\n\n try {\n return registriesIndexSchema.parse(data)\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw new RegistriesIndexParseError(error)\n }\n\n throw error\n }\n}\n\nexport async function getPresets(options?: { useCache?: boolean }) {\n options = {\n useCache: true,\n ...options,\n }\n\n const url = `${REGISTRY_URL}/config.json`\n const [data] = await fetchRegistry([url], {\n useCache: options.useCache,\n })\n\n const result = configJsonSchema.parse(data)\n return result.presets\n}\n\nexport async function getPreset(\n name: string,\n options?: { useCache?: boolean }\n) {\n const presets = await getPresets(options)\n return (\n presets.find(\n (preset) => preset.name.toLowerCase() === name.toLowerCase()\n ) ?? null\n )\n}\n","import { searchResultItemSchema, searchResultsSchema } from \"@/src/schema\"\nimport { Config } from \"@/src/utils/get-config\"\nimport fuzzysort from \"fuzzysort\"\nimport { z } from \"zod\"\n\nimport { getRegistry } from \"./api\"\n\nexport async function searchRegistries(\n registries: string[],\n options?: {\n query?: string\n limit?: number\n offset?: number\n config?: Partial<Config>\n useCache?: boolean\n }\n) {\n const { query, limit, offset, config, useCache } = options || {}\n\n let allItems: z.infer<typeof searchResultItemSchema>[] = []\n\n for (const registry of registries) {\n const registryData = await getRegistry(registry, { config, useCache })\n\n const itemsWithRegistry = (registryData.items || []).map((item) => ({\n name: item.name,\n type: item.type,\n description: item.description,\n registry: registry,\n addCommandArgument: buildRegistryItemNameFromRegistry(\n item.name,\n registry\n ),\n }))\n\n allItems = allItems.concat(itemsWithRegistry)\n }\n\n if (query) {\n allItems = searchItems(allItems, {\n query,\n limit: allItems.length,\n keys: [\"name\", \"description\"],\n }) as z.infer<typeof searchResultItemSchema>[]\n }\n\n const paginationOffset = offset || 0\n const paginationLimit = limit || allItems.length\n const totalItems = allItems.length\n\n const result: z.infer<typeof searchResultsSchema> = {\n pagination: {\n total: totalItems,\n offset: paginationOffset,\n limit: paginationLimit,\n hasMore: paginationOffset + paginationLimit < totalItems,\n },\n items: allItems.slice(paginationOffset, paginationOffset + paginationLimit),\n }\n\n return searchResultsSchema.parse(result)\n}\n\nconst searchableItemSchema = z\n .object({\n name: z.string(),\n type: z.string().optional(),\n description: z.string().optional(),\n registry: z.string().optional(),\n addCommandArgument: z.string().optional(),\n })\n .passthrough()\n\ntype SearchableItem = z.infer<typeof searchableItemSchema>\n\nfunction searchItems<\n T extends {\n name: string\n type?: string\n description?: string\n addCommandArgument?: string\n [key: string]: any\n } = SearchableItem\n>(\n items: T[],\n options: {\n query: string\n } & Pick<Parameters<typeof fuzzysort.go>[2], \"keys\" | \"threshold\" | \"limit\">\n) {\n options = {\n limit: 100,\n threshold: -10000,\n ...options,\n }\n\n const searchResults = fuzzysort.go(options.query, items, {\n keys: options.keys,\n threshold: options.threshold,\n limit: options.limit,\n })\n\n const results = searchResults.map((result) => result.obj)\n\n return z.array(searchableItemSchema).parse(results)\n}\n\nfunction isUrl(string: string): boolean {\n try {\n new URL(string)\n return true\n } catch {\n return false\n }\n}\n\n// Builds the registry item name for the add command.\n// For namespaced registries, returns \"registry/item\".\n// For URL registries, replaces \"registry\" with the item name in the URL.\nexport function buildRegistryItemNameFromRegistry(\n name: string,\n registry: string\n) {\n // If registry is not a URL, return namespace format.\n if (!isUrl(registry)) {\n return `${registry}/${name}`\n }\n\n // Find where the host part ends in the original string.\n const protocolEnd = registry.indexOf(\"://\") + 3\n const hostEnd = registry.indexOf(\"/\", protocolEnd)\n\n if (hostEnd === -1) {\n // No path, check for query params.\n const queryStart = registry.indexOf(\"?\", protocolEnd)\n if (queryStart !== -1) {\n // Has query params but no path.\n const beforeQuery = registry.substring(0, queryStart)\n const queryAndAfter = registry.substring(queryStart)\n // Replace \"registry\" with itemName in query params only.\n const updatedQuery = queryAndAfter.replace(/\\bregistry\\b/g, name)\n return beforeQuery + updatedQuery\n }\n // No path or query, return as is.\n return registry\n }\n\n // Split at host boundary.\n const hostPart = registry.substring(0, hostEnd)\n const pathAndQuery = registry.substring(hostEnd)\n\n // Find all occurrences of \"registry\" in path and query.\n // Replace only the last occurrence in the path segment.\n const pathEnd =\n pathAndQuery.indexOf(\"?\") !== -1\n ? pathAndQuery.indexOf(\"?\")\n : pathAndQuery.length\n const pathOnly = pathAndQuery.substring(0, pathEnd)\n const queryAndAfter = pathAndQuery.substring(pathEnd)\n\n // Replace the last occurrence of \"registry\" in the path.\n const lastIndex = pathOnly.lastIndexOf(\"registry\")\n let updatedPath = pathOnly\n if (lastIndex !== -1) {\n updatedPath =\n pathOnly.substring(0, lastIndex) +\n name +\n pathOnly.substring(lastIndex + \"registry\".length)\n }\n\n // Replace all occurrences of \"registry\" in query params.\n const updatedQuery = queryAndAfter.replace(/\\bregistry\\b/g, name)\n\n return hostPart + updatedPath + updatedQuery\n}\n"]}
|