@infoteam/ui-kit 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/package.json +79 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {Command}from'commander';import {cosmiconfig}from'cosmiconfig';import b from'fast-glob';import h from'path';import {loadConfig,createMatchPath}from'tsconfig-paths';import {z}from'zod';import {green,cyan,yellow,red}from'kleur/colors';import P from'fs-extra';import {promises}from'fs';import mt from'prompts';import lt from'ora';var a={error:red,warn:yellow,info:cyan,success:green};async function g(t,i){return createMatchPath(i.absoluteBaseUrl,i.paths)(t,void 0,()=>true,[".ts",".tsx"])}var Q=cosmiconfig("ui-kit",{searchPlaces:["ui-kit.config.json"]}),v=z.object({$schema:z.string().optional(),style:z.string(),rsc:z.coerce.boolean().default(false),tsx:z.coerce.boolean().default(true),tailwind:z.object({config:z.string().optional(),css:z.string(),baseColor:z.string(),cssVariables:z.boolean().default(true),prefix:z.string().default("").optional()}),aliases:z.object({components:z.string(),utils:z.string(),ui:z.string().optional(),lib:z.string().optional(),hooks:z.string().optional()}),iconLibrary:z.string().optional()}).strict(),_=v.extend({resolvedPaths:z.object({cwd:z.string(),tailwindConfig:z.string(),tailwindCss:z.string(),utils:z.string(),components:z.string(),lib:z.string(),hooks:z.string(),ui:z.string()})});z.record(_);async function N(t){let i=await X(t);return i?(i.iconLibrary||(i.iconLibrary=i.style==="new-york"?"radix":"lucide"),await S(t,i)):null}async function S(t,i){let n=await loadConfig(t);if(n.resultType==="failed")throw new Error(`Failed to load ${i.tsx?"tsconfig":"jsconfig"}.json. ${n.message??""}`.trim());return _.parse({...i,resolvedPaths:{cwd:t,tailwindConfig:i.tailwind.config?h.resolve(t,i.tailwind.config):"",tailwindCss:h.resolve(t,i.tailwind.css),utils:await g(i.aliases.utils,n),components:await g(i.aliases.components,n),ui:i.aliases.ui?await g(i.aliases.ui,n):h.resolve(await g(i.aliases.components,n)??t,"ui"),lib:i.aliases.lib?await g(i.aliases.lib,n):h.resolve(await g(i.aliases.utils,n)??t,".."),hooks:i.aliases.hooks?await g(i.aliases.hooks,n):h.resolve(await g(i.aliases.components,n)??t,"..","hooks")}})}async function X(t){try{let i=await Q.search(t);return i?v.parse(i.config):null}catch{let n=`${t}/components.json`;throw new Error(`Invalid configuration found in ${a.info(n)}.`)}}var f={"next-app":{name:"next-app",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},"next-pages":{name:"next-pages",label:"Next.js",links:{installation:"https://ui.shadcn.com/docs/installation/next",tailwind:"https://tailwindcss.com/docs/guides/nextjs"}},remix:{name:"remix",label:"Remix",links:{installation:"https://ui.shadcn.com/docs/installation/remix",tailwind:"https://tailwindcss.com/docs/guides/remix"}},"react-router":{name:"react-router",label:"React Router",links:{installation:"https://ui.shadcn.com/docs/installation/react-router",tailwind:"https://tailwindcss.com/docs/installation/framework-guides/react-router"}},vite:{name:"vite",label:"Vite",links:{installation:"https://ui.shadcn.com/docs/installation/vite",tailwind:"https://tailwindcss.com/docs/guides/vite"}},astro:{name:"astro",label:"Astro",links:{installation:"https://ui.shadcn.com/docs/installation/astro",tailwind:"https://tailwindcss.com/docs/guides/astro"}},laravel:{name:"laravel",label:"Laravel",links:{installation:"https://ui.shadcn.com/docs/installation/laravel",tailwind:"https://tailwindcss.com/docs/guides/laravel"}},"tanstack-start":{name:"tanstack-start",label:"TanStack Start",links:{installation:"https://ui.shadcn.com/docs/installation/tanstack",tailwind:"https://tailwindcss.com/docs/installation/using-postcss"}},gatsby:{name:"gatsby",label:"Gatsby",links:{installation:"https://ui.shadcn.com/docs/installation/gatsby",tailwind:"https://tailwindcss.com/docs/guides/gatsby"}},manual:{name:"manual",label:"Manual",links:{installation:"https://ui.shadcn.com/docs/installation/manual",tailwind:"https://tailwindcss.com/docs/installation"}}};function I(t="",i=true){let n=h.join(t,"package.json");return P.readJSONSync(n,{throws:i})}var R=["**/node_modules/**",".next","public","dist","build"];z.object({compilerOptions:z.object({paths:z.record(z.string().or(z.array(z.string())))})});async function d(t){let[i,n,s,r,p,m,y,C]=await Promise.all([b.glob("**/{next,vite,astro,app}.config.*|gatsby-config.*|composer.json|react-router.config.*",{cwd:t,deep:3,ignore:R}),P.pathExists(h.resolve(t,"src")),st(t),nt(t),et(t),F(t),ot(t),I(t,false)]),T=await P.pathExists(h.resolve(t,`${n?"src/":""}app`)),l={framework:f.manual,isSrcDir:n,isRSC:false,isTsx:s,tailwindConfigFile:r,tailwindCssFile:p,tailwindVersion:m,aliasPrefix:y};return i.find(c=>c.startsWith("next.config."))?.length?(l.framework=T?f["next-app"]:f["next-pages"],l.isRSC=T,l):i.find(c=>c.startsWith("astro.config."))?.length?(l.framework=f.astro,l):i.find(c=>c.startsWith("gatsby-config."))?.length?(l.framework=f.gatsby,l):i.find(c=>c.startsWith("composer.json"))?.length?(l.framework=f.laravel,l):Object.keys(C?.dependencies??{}).find(c=>c.startsWith("@remix-run/"))?(l.framework=f.remix,l):i.find(c=>c.startsWith("app.config."))?.length&&[...Object.keys(C?.dependencies??{}),...Object.keys(C?.devDependencies??{})].find(c=>c.startsWith("@tanstack/start"))?(l.framework=f["tanstack-start"],l):i.find(c=>c.startsWith("react-router.config."))?.length?(l.framework=f["react-router"],l):(i.find(c=>c.startsWith("vite.config."))?.length&&(l.framework=f.vite),l)}async function F(t){let i=I(t);return !i?.dependencies?.tailwindcss&&!i?.devDependencies?.tailwindcss?null:/^(?:\^|~)?3(?:\.\d+)*(?:-.*)?$/.test(i?.dependencies?.tailwindcss||i?.devDependencies?.tailwindcss||"")?"v3":"v4"}async function et(t){let[i,n]=await Promise.all([b.glob(["**/*.css","**/*.scss"],{cwd:t,deep:5,ignore:R}),F(t)]);if(!i.length)return null;for(let r of i){let p=await P.readFile(h.resolve(t,r),"utf8");if(p.includes('@import "tailwindcss"')||p.includes("@import 'tailwindcss'")||p.includes("@tailwind base"))return r}return null}async function nt(t){let i=await b.glob("tailwind.config.*",{cwd:t,deep:3,ignore:R});return i.length?i[0]??null:null}async function ot(t){let i=await loadConfig(t);if(i?.resultType==="failed"||!Object.entries(i?.paths).length)return null;for(let[n,s]of Object.entries(i.paths))if(s.includes("./*")||s.includes("./src/*")||s.includes("./app/*")||s.includes("./resources/js/*"))return n.replace(/\/\*$/,"")??null;return Object.keys(i?.paths)?.[0]?.replace(/\/\*$/,"")??null}async function st(t){return (await b.glob("tsconfig.*",{cwd:t,deep:1,ignore:R})).length>0}async function A(t,i=null){let[n,s]=await Promise.all([N(t),i?Promise.resolve(i):d(t)]);if(n)return n;if(!s||!s.tailwindCssFile||s.tailwindVersion==="v3"&&!s.tailwindConfigFile)return null;let r={$schema:"https://ui.shadcn.com/schema.json",rsc:s.isRSC,tsx:s.isTsx,style:"new-york",tailwind:{config:s.tailwindConfigFile??"",baseColor:"zinc",css:s.tailwindCssFile,cssVariables:true,prefix:""},iconLibrary:"lucide",aliases:{components:`${s.aliasPrefix}/components`,ui:`${s.aliasPrefix}/components/ui`,hooks:`${s.aliasPrefix}/hooks`,lib:`${s.aliasPrefix}/lib`,utils:`${s.aliasPrefix}/lib/utils`}};return await S(t,r)}var D=new Command().name("test").action(async()=>{let t=await d(process.cwd());console.log(t);});var e={error(...t){console.log(a.error(t.join(" ")));},warn(...t){console.log(a.warn(t.join(" ")));},info(...t){console.log(a.info(t.join(" ")));},success(...t){console.log(a.success(t.join(" ")));},log(...t){console.log(t.join(" "));},break(){console.log("");}};function L(t){if(e.error("Something went wrong. Please check the error below for more details."),e.error("If the problem persists, please open an issue on GitHub."),e.error(""),typeof t=="string"&&(e.error(t),e.break(),process.exit(1)),t instanceof z.ZodError){e.error("Validation failed:");for(let[i,n]of Object.entries(t.flatten().fieldErrors))e.error(`- ${a.info(i)}: ${n}`);e.break(),process.exit(1);}t instanceof Error&&(e.error(t.message),e.break(),process.exit(1)),e.break(),process.exit(1);}function u(t,i){return lt({text:t,isSilent:i?.silent})}var V="1";var k="5",j="6",$="7";async function U(t){let i={};if(!P.existsSync(t.cwd)||!P.existsSync(h.resolve(t.cwd,"package.json")))return i[V]=true,{errors:i,projectInfo:null};let n=u("Preflight checks.",{silent:t.silent}).start();P.existsSync(h.resolve(t.cwd,"ui-kit.config.json"))&&!t.force&&(n?.fail(),e.break(),e.error(`A ${a.info("ui-kit.config.json")} file already exists at ${a.info(t.cwd)}.
|
|
3
|
+
To start over, remove the ${a.info("ui-kit.config.json")} file and run ${a.info("init")} again.`),e.break(),process.exit(1)),n?.succeed();let s=u("Verifying framework.",{silent:t.silent}).start(),r=await d(t.cwd);(!r||r?.framework.name==="manual")&&(i[$]=true,s?.fail(),e.break(),r?.framework.links.installation&&e.error(`We could not detect a supported framework at ${a.info(t.cwd)}.
|
|
4
|
+
Visit ${a.info(r?.framework.links.installation)} to manually configure your project.
|
|
5
|
+
Once configured, you can use the cli to add components.`),e.break(),process.exit(1)),s?.succeed(`Verifying framework. Found ${a.info(r.framework.label)}.`);let p="Validating Tailwind CSS.";r.tailwindVersion==="v4"&&(p=`Validating Tailwind CSS config. Found ${a.info("v4")}.`);let m=u(p,{silent:t.silent}).start();r.tailwindVersion==="v3"&&(!r?.tailwindConfigFile||!r?.tailwindCssFile)?(i[k]=true,m?.fail()):r.tailwindVersion==="v4"&&!r?.tailwindCssFile?(i[k]=true,m?.fail()):r.tailwindVersion?m?.succeed():(i[k]=true,m?.fail());let y=u("Validating import alias.",{silent:t.silent}).start();return r?.aliasPrefix?y?.succeed():(i[j]=true,y?.fail()),Object.keys(i).length>0&&(i[k]&&(e.break(),e.error(`No Tailwind CSS configuration found at ${a.info(t.cwd)}.`),e.error("It is likely you do not have Tailwind CSS installed or have an invalid configuration."),e.error("Install Tailwind CSS then try again."),r?.framework.links.tailwind&&e.error(`Visit ${a.info(r?.framework.links.tailwind)} to get started.`)),i[j]&&(e.break(),e.error("No import alias found in your tsconfig.json file."),r?.framework.links.installation&&e.error(`Visit ${a.info(r?.framework.links.installation)} to learn how to set an import alias.`)),e.break(),process.exit(1)),{errors:i,projectInfo:r}}var gt=z.object({yes:z.boolean(),force:z.boolean(),silent:z.boolean(),cwd:z.string()}),G=new Command().name("init").description("initialize your project and install core dependencies").option("-y, --yes","skip confirmation prompt. ",true).option("-f, --force","force overwrite of existing configuration",false).option("-s, --silent","mute output.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory. ",process.cwd()).action(async t=>{try{let i=gt.parse({cwd:h.resolve(t.cwd),...t});await dt(i),e.log(`${a.success("Success!")} Project initialization completed.
|
|
6
|
+
You may now add components.`),e.break();}catch(i){e.break(),L(i);}});async function dt(t){let i;t.skipPreflight?i=await d(t.cwd):i=(await U(t)).projectInfo;let s=await A(t.cwd,i);if(!t.yes){let{proceed:m}=await mt({type:"confirm",name:"proceed",message:`Write configuration to ${a.info("ui-kit-config.json")}. Proceed?`,initial:true});m||process.exit(0);}let r=u("Writing ui-kit-config.json.").start(),p=h.resolve(t.cwd,"ui-kit-config.json");await promises.writeFile(p,JSON.stringify(s,null,2),"utf8"),r.succeed(),console.log(s);}async function wt(){let t=new Command().name("ui-kit");t.addCommand(D).addCommand(G),t.parse();}wt();//# sourceMappingURL=index.js.map
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/utils/highlighter.ts","../src/cli/utils/resolve-import.ts","../src/cli/utils/get-config.ts","../src/cli/utils/frameworks.ts","../src/cli/utils/get-package-json.ts","../src/cli/utils/get-project-info.ts","../src/cli/commands/test.ts","../src/cli/utils/logger.ts","../src/cli/utils/handle-error.ts","../src/cli/utils/spinner.ts","../src/cli/utils/errors.ts","../src/cli/preflights/preflight-init.ts","../src/cli/commands/init.ts","../src/cli/index.ts"],"names":["highlighter","red","yellow","cyan","green","resolveImport","importPath","config","createMatchPath","explorer","cosmiconfig","rawConfigSchema","z","configSchema","getConfig","cwd","getRawConfig","resolveConfigPaths","tsConfig","loadConfig","path","configResult","componentPath","FRAMEWORKS","getPackageJson","shouldThrow","packageJsonPath","fs","PROJECT_SHARED_IGNORE","getProjectInfo","configFiles","isSrcDir","isTsx","tailwindConfigFile","tailwindCssFile","tailwindVersion","aliasPrefix","packageJson","fg","isTypeScriptProject","getTailwindConfigFile","getTailwindCssFile","getTailwindVersion","getTsConfigAliasPrefix","isUsingAppDir","type","file","dep","packageInfo","files","contents","alias","paths","getProjectConfig","defaultProjectInfo","existingConfig","projectInfo","test","Command","logger","args","handleError","error","key","value","spinner","text","options","ora","MISSING_DIR_OR_EMPTY_PROJECT","TAILWIND_NOT_CONFIGURED","IMPORT_ALIAS_MISSING","UNSUPPORTED_FRAMEWORK","preFlightInit","errors","projectSpinner","frameworkSpinner","tailwindSpinnerMessage","tailwindSpinner","tsConfigSpinner","initOptionsSchema","init","opts","runInit","proceed","prompts","componentSpinner","targetPath","main","program"],"mappings":"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","file":"index.js","sourcesContent":["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 {\n createMatchPath,\n type ConfigLoaderSuccessResult,\n} 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\"]\n );\n}\n","import { cosmiconfig } from \"cosmiconfig\";\nimport fg from \"fast-glob\";\nimport path from \"path\";\nimport { loadConfig } from \"tsconfig-paths\";\nimport { z } from \"zod\";\n\nimport { getProjectInfo } from \"@/cli/utils/get-project-info\";\nimport { highlighter } from \"@/cli/utils/highlighter\";\nimport { resolveImport } from \"@/cli/utils/resolve-import\";\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.\nconst explorer = cosmiconfig(\"ui-kit\", {\n searchPlaces: [\"ui-kit.config.json\"],\n});\n\nexport const rawConfigSchema = z\n .object({\n $schema: z.string().optional(),\n style: z.string(),\n rsc: z.coerce.boolean().default(false),\n tsx: z.coerce.boolean().default(true),\n tailwind: z.object({\n config: z.string().optional(),\n css: z.string(),\n baseColor: z.string(),\n cssVariables: z.boolean().default(true),\n prefix: z.string().default(\"\").optional(),\n }),\n aliases: z.object({\n components: z.string(),\n utils: z.string(),\n ui: z.string().optional(),\n lib: z.string().optional(),\n hooks: z.string().optional(),\n }),\n iconLibrary: z.string().optional(),\n })\n .strict();\n\nexport type RawConfig = z.infer<typeof rawConfigSchema>;\n\nexport const configSchema = rawConfigSchema.extend({\n resolvedPaths: z.object({\n cwd: z.string(),\n tailwindConfig: z.string(),\n tailwindCss: z.string(),\n utils: z.string(),\n components: z.string(),\n lib: z.string(),\n hooks: z.string(),\n ui: z.string(),\n }),\n});\n\nexport type Config = z.infer<typeof configSchema>;\n\n// TODO: type the key.\n// Okay for now since I don't want a breaking change.\nexport const workspaceConfigSchema = z.record(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(cwd: string, config: RawConfig) {\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(cwd: string): Promise<RawConfig | null> {\n try {\n const configResult = await explorer.search(cwd);\n\n if (!configResult) {\n return null;\n }\n\n return rawConfigSchema.parse(configResult.config);\n } catch (error) {\n const componentPath = `${cwd}/components.json`;\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\n ? path.join(commonRoot, matchingPackageRoot)\n : 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","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 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","// Copied from https://github.com/shadcn-ui/ui/blob/main/packages/shadcn/src/utils/get-package-info.ts\n\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport { type PackageJson } from \"type-fest\";\n\nexport function getPackageJson(\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 {\n Config,\n RawConfig,\n getConfig,\n resolveConfigPaths,\n} from \"@/cli/utils/get-config\";\nimport fg from \"fast-glob\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport { loadConfig } from \"tsconfig-paths\";\nimport { z } from \"zod\";\n\nimport { FRAMEWORKS, Framework } from \"@/cli/utils/frameworks\";\nimport { getPackageJson } from \"@/cli/utils/get-package-json\";\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 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 getPackageJson(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 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 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 configFiles.find((file) => file.startsWith(\"app.config.\"))?.length &&\n [\n ...Object.keys(packageJson?.dependencies ?? {}),\n ...Object.keys(packageJson?.devDependencies ?? {}),\n ].find((dep) => dep.startsWith(\"@tanstack/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 return type;\n}\n\nexport async function getTailwindVersion(\n cwd: string\n): Promise<ProjectInfo[\"tailwindVersion\"]> {\n const packageInfo = getPackageJson(cwd);\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] ?? null;\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: RawConfig = {\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(\n config: Config\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","import { Command } from \"commander\";\n\nimport { getProjectInfo } from \"@/cli/utils/get-project-info\";\n\nexport const test = new Command().name(\"test\").action(async () => {\n const projectInfo = await getProjectInfo(process.cwd());\n console.log(projectInfo);\n});\n","import { highlighter } from \"@/cli/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 { z } from \"zod\";\n\nimport { highlighter } from \"@/cli/utils/highlighter\";\nimport { logger } from \"@/cli/utils/logger\";\n\nexport function handleError(error: unknown) {\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 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 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","export const MISSING_DIR_OR_EMPTY_PROJECT = \"1\"\nexport const EXISTING_CONFIG = \"2\"\nexport const MISSING_CONFIG = \"3\"\nexport const FAILED_CONFIG_READ = \"4\"\nexport const TAILWIND_NOT_CONFIGURED = \"5\"\nexport const IMPORT_ALIAS_MISSING = \"6\"\nexport const UNSUPPORTED_FRAMEWORK = \"7\"\nexport const COMPONENT_URL_NOT_FOUND = \"8\"\nexport const COMPONENT_URL_UNAUTHORIZED = \"9\"\nexport const COMPONENT_URL_FORBIDDEN = \"10\"\nexport const COMPONENT_URL_BAD_REQUEST = \"11\"\nexport const COMPONENT_URL_INTERNAL_SERVER_ERROR = \"12\"\nexport const BUILD_MISSING_REGISTRY_FILE = \"13\"\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { z } from \"zod\";\n\nimport { initOptionsSchema } from \"@/cli/commands/init\";\nimport { getProjectInfo } from \"@/cli/utils/get-project-info\";\nimport { highlighter } from \"@/cli/utils/highlighter\";\nimport { logger } from \"@/cli/utils/logger\";\nimport { spinner } from \"@/cli/utils/spinner\";\nimport * as ERRORS from \"@/cli/utils/errors\";\n\nexport async function preFlightInit(\n options: z.infer<typeof initOptionsSchema>\n) {\n const errors: Record<string, boolean> = {};\n\n // Ensure target directory exists.\n // Check for empty project. We assume if no package.json exists, the project is empty.\n if (\n !fs.existsSync(options.cwd) ||\n !fs.existsSync(path.resolve(options.cwd, \"package.json\"))\n ) {\n errors[ERRORS.MISSING_DIR_OR_EMPTY_PROJECT] = true;\n return {\n errors,\n projectInfo: null,\n };\n }\n\n const projectSpinner = spinner(`Preflight checks.`, {\n silent: options.silent,\n }).start();\n\n if (\n fs.existsSync(path.resolve(options.cwd, \"ui-kit.config.json\")) &&\n !options.force\n ) {\n projectSpinner?.fail();\n logger.break();\n logger.error(\n `A ${highlighter.info(\n \"ui-kit.config.json\"\n )} file already exists at ${highlighter.info(\n options.cwd\n )}.\\nTo start over, remove the ${highlighter.info(\n \"ui-kit.config.json\"\n )} file and run ${highlighter.info(\"init\")} again.`\n );\n logger.break();\n process.exit(1);\n }\n\n projectSpinner?.succeed();\n\n const frameworkSpinner = spinner(`Verifying framework.`, {\n silent: options.silent,\n }).start();\n const projectInfo = await getProjectInfo(options.cwd);\n if (!projectInfo || projectInfo?.framework.name === \"manual\") {\n errors[ERRORS.UNSUPPORTED_FRAMEWORK] = true;\n frameworkSpinner?.fail();\n logger.break();\n if (projectInfo?.framework.links.installation) {\n logger.error(\n `We could not detect a supported framework at ${highlighter.info(\n options.cwd\n )}.\\n` +\n `Visit ${highlighter.info(\n projectInfo?.framework.links.installation\n )} to manually configure your project.\\nOnce configured, you can use the cli to add components.`\n );\n }\n logger.break();\n process.exit(1);\n }\n frameworkSpinner?.succeed(\n `Verifying framework. Found ${highlighter.info(\n projectInfo.framework.label\n )}.`\n );\n\n let tailwindSpinnerMessage = \"Validating Tailwind CSS.\";\n\n if (projectInfo.tailwindVersion === \"v4\") {\n tailwindSpinnerMessage = `Validating Tailwind CSS config. Found ${highlighter.info(\n \"v4\"\n )}.`;\n }\n\n const tailwindSpinner = spinner(tailwindSpinnerMessage, {\n silent: options.silent,\n }).start();\n if (\n projectInfo.tailwindVersion === \"v3\" &&\n (!projectInfo?.tailwindConfigFile || !projectInfo?.tailwindCssFile)\n ) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true;\n tailwindSpinner?.fail();\n } else if (\n projectInfo.tailwindVersion === \"v4\" &&\n !projectInfo?.tailwindCssFile\n ) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true;\n tailwindSpinner?.fail();\n } else if (!projectInfo.tailwindVersion) {\n errors[ERRORS.TAILWIND_NOT_CONFIGURED] = true;\n tailwindSpinner?.fail();\n } else {\n tailwindSpinner?.succeed();\n }\n\n const tsConfigSpinner = spinner(`Validating import alias.`, {\n silent: options.silent,\n }).start();\n if (!projectInfo?.aliasPrefix) {\n errors[ERRORS.IMPORT_ALIAS_MISSING] = true;\n tsConfigSpinner?.fail();\n } else {\n tsConfigSpinner?.succeed();\n }\n\n if (Object.keys(errors).length > 0) {\n if (errors[ERRORS.TAILWIND_NOT_CONFIGURED]) {\n logger.break();\n logger.error(\n `No Tailwind CSS configuration found at ${highlighter.info(\n options.cwd\n )}.`\n );\n logger.error(\n `It is likely you do not have Tailwind CSS installed or have an invalid configuration.`\n );\n logger.error(`Install Tailwind CSS then try again.`);\n if (projectInfo?.framework.links.tailwind) {\n logger.error(\n `Visit ${highlighter.info(\n projectInfo?.framework.links.tailwind\n )} to get started.`\n );\n }\n }\n\n if (errors[ERRORS.IMPORT_ALIAS_MISSING]) {\n logger.break();\n logger.error(`No import alias found in your tsconfig.json file.`);\n if (projectInfo?.framework.links.installation) {\n logger.error(\n `Visit ${highlighter.info(\n projectInfo?.framework.links.installation\n )} to learn how to set an import alias.`\n );\n }\n }\n\n logger.break();\n process.exit(1);\n }\n\n return {\n errors,\n projectInfo,\n };\n}\n","import { Command } from \"commander\";\nimport { Config } from \"cosmiconfig\";\nimport { promises as fs } from \"fs\";\nimport path from \"path\";\nimport prompts from \"prompts\";\nimport { z } from \"zod\";\n\nimport { handleError } from \"@/cli/utils/handle-error\";\nimport { logger } from \"@/cli/utils/logger\";\nimport { highlighter } from \"@/cli/utils/highlighter\";\nimport { preFlightInit } from \"@/cli/preflights/preflight-init\";\nimport { getProjectConfig, getProjectInfo } from \"@/cli/utils/get-project-info\";\nimport { spinner } from \"@/cli/utils/spinner\";\n\nexport const initOptionsSchema = z.object({\n yes: z.boolean(),\n force: z.boolean(),\n silent: z.boolean(),\n cwd: z.string(),\n});\n\nexport const init = new Command()\n .name(\"init\")\n .description(\"initialize your project and install core dependencies\")\n .option(\"-y, --yes\", \"skip confirmation prompt. \", true)\n .option(\"-f, --force\", \"force overwrite of existing configuration\", false)\n .option(\"-s, --silent\", \"mute output.\", false)\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory. \",\n process.cwd()\n )\n .action(async (opts) => {\n try {\n const options = initOptionsSchema.parse({\n cwd: path.resolve(opts.cwd),\n ...opts,\n });\n\n await runInit(options);\n\n logger.log(\n `${highlighter.success(\n \"Success!\"\n )} Project initialization completed.\\nYou may now add components.`\n );\n logger.break();\n } catch (error) {\n logger.break();\n handleError(error);\n }\n });\n\nexport async function runInit(\n options: z.infer<typeof initOptionsSchema> & {\n skipPreflight?: boolean;\n }\n) {\n let projectInfo;\n if (!options.skipPreflight) {\n const preflight = await preFlightInit(options);\n\n projectInfo = preflight.projectInfo;\n } else {\n projectInfo = await getProjectInfo(options.cwd);\n }\n\n const projectConfig = await getProjectConfig(options.cwd, projectInfo);\n const config = projectConfig;\n\n if (!options.yes) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `Write configuration to ${highlighter.info(\n \"ui-kit-config.json\"\n )}. Proceed?`,\n initial: true,\n });\n\n if (!proceed) {\n process.exit(0);\n }\n }\n\n const componentSpinner = spinner(`Writing ui-kit-config.json.`).start();\n const targetPath = path.resolve(options.cwd, \"ui-kit-config.json\");\n await fs.writeFile(targetPath, JSON.stringify(config, null, 2), \"utf8\");\n componentSpinner.succeed();\n\n console.log(config);\n}\n","#!/usr/bin/env node\nimport { Command } from \"commander\";\n\nimport { test } from \"@/cli/commands/test\";\nimport { init } from \"@/cli/commands/init\";\n\nasync function main() {\n const program = new Command().name(\"ui-kit\");\n program.addCommand(test).addCommand(init);\n\n program.parse();\n}\n\nmain();\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@infoteam/ui-kit",
|
|
3
|
+
"version": "0.0.5",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"files": [
|
|
8
|
+
"dist"
|
|
9
|
+
],
|
|
10
|
+
"type": "module",
|
|
11
|
+
"exports": {
|
|
12
|
+
"./components/button": "./src/registry/components/button/index.ts",
|
|
13
|
+
"./utils/cn": "./src/registry/utils/cn.ts",
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./types": "./src/types.ts",
|
|
19
|
+
"./registry": "./__registry__/registry.json"
|
|
20
|
+
},
|
|
21
|
+
"bin": "./dist/index.js",
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@turbo/gen": "^2.4.0",
|
|
24
|
+
"@types/node": "^22.13.0",
|
|
25
|
+
"@types/react": "19.0.8",
|
|
26
|
+
"@types/react-dom": "19.0.3",
|
|
27
|
+
"autoprefixer": "^10.4.20",
|
|
28
|
+
"eslint": "^9.21.0",
|
|
29
|
+
"eslint-config-prettier": "^10.0.2",
|
|
30
|
+
"eslint-plugin-only-warn": "^1.1.0",
|
|
31
|
+
"eslint-plugin-turbo": "^2.4.4",
|
|
32
|
+
"globals": "^16.0.0",
|
|
33
|
+
"postcss": "^8",
|
|
34
|
+
"react": "^19.0.0",
|
|
35
|
+
"react-dom": "^19.0.0",
|
|
36
|
+
"rimraf": "^6.0.1",
|
|
37
|
+
"tailwindcss": "^4.0.9",
|
|
38
|
+
"ts-morph": "^25.0.1",
|
|
39
|
+
"tsup": "^8.4.0",
|
|
40
|
+
"tsx": "^4.19.3",
|
|
41
|
+
"typescript": "5.7.3",
|
|
42
|
+
"typescript-eslint": "^8.25.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"@antfu/ni": "^23.3.1",
|
|
46
|
+
"@radix-ui/react-slot": "^1.1.2",
|
|
47
|
+
"@types/fs-extra": "^11.0.4",
|
|
48
|
+
"@types/prompts": "^2.4.9",
|
|
49
|
+
"axios": "^1.8.1",
|
|
50
|
+
"chalk": "^5.4.1",
|
|
51
|
+
"class-variance-authority": "^0.7.1",
|
|
52
|
+
"clsx": "^2.1.1",
|
|
53
|
+
"commander": "^13.1.0",
|
|
54
|
+
"cosmiconfig": "^9.0.0",
|
|
55
|
+
"execa": "^9.5.2",
|
|
56
|
+
"fast-glob": "^3.3.3",
|
|
57
|
+
"fs-extra": "^11.3.0",
|
|
58
|
+
"inquirer": "^12.4.2",
|
|
59
|
+
"kleur": "^4.1.5",
|
|
60
|
+
"ora": "^8.2.0",
|
|
61
|
+
"prompts": "^2.4.2",
|
|
62
|
+
"recast": "^0.23.10",
|
|
63
|
+
"tailwind-merge": "^3.0.2",
|
|
64
|
+
"tsconfig-paths": "^4.2.0",
|
|
65
|
+
"type-fest": "^4.36.0",
|
|
66
|
+
"zod": "^3.24.2"
|
|
67
|
+
},
|
|
68
|
+
"scripts": {
|
|
69
|
+
"lint": "eslint . --max-warnings 0",
|
|
70
|
+
"generate:component": "turbo gen dev-new-component",
|
|
71
|
+
"check-types": "tsc --noEmit",
|
|
72
|
+
"dev": "tsup --watch",
|
|
73
|
+
"build": "tsup",
|
|
74
|
+
"build:registry": "tsx src/scripts/build-registry.ts",
|
|
75
|
+
"clean": "rimraf dist",
|
|
76
|
+
"format": "prettier --write \"**/*.{ts,tsx,mdx}\" --cache",
|
|
77
|
+
"publish:release": "pnpm build && pnpm publish --no-git-checks --access public"
|
|
78
|
+
}
|
|
79
|
+
}
|