@shadsapp/cli 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @shadsapp/cli
2
2
 
3
- CLI for installing and importing [shads.app](https://shads.app) themes into shadcn/ui projects.
3
+ CLI for creating shadcn/ui apps from [shads.app](https://shads.app) themes, and for installing those themes into existing projects.
4
4
 
5
5
  ## Install
6
6
 
@@ -19,6 +19,11 @@ The binary name is **`shads`**.
19
19
  ## Commands
20
20
 
21
21
  ```bash
22
+ # Create a new app (runs the official shadcn CLI)
23
+ shads create my-app -t workspace
24
+ shads create my-app --template vite -t terminal
25
+ shads create my-app --preset https://shads.app/r/workspace-theme.json
26
+
22
27
  # Install theme files into the current project
23
28
  shads install -t workspace
24
29
 
@@ -35,9 +40,13 @@ shads validate theme.json
35
40
  shads schema
36
41
  ```
37
42
 
43
+ `create` is a thin wrapper around `npx shadcn@latest create --preset <url>`. It does not replace the shadcn CLI.
44
+
38
45
  ## What gets written
39
46
 
40
- By default:
47
+ `create` scaffolds a shadcn app, then applies the theme (tokens, fonts, and adapters).
48
+
49
+ `install` writes:
41
50
 
42
51
  - `theme.json`
43
52
  - `src/styles/theme.css`
@@ -47,14 +56,25 @@ Import the CSS in your app entry (e.g. `main.tsx` or `layout.tsx`).
47
56
  ## Examples
48
57
 
49
58
  ```bash
59
+ npx @shadsapp/cli create my-app -t workspace
50
60
  npx @shadsapp/cli install -t workspace
51
61
  npx @shadsapp/cli themes import terminal
52
62
  npx @shadsapp/cli validate ./theme.json
53
63
  ```
54
64
 
65
+ ## For AI agents
66
+
67
+ Prefer the MCP server over scraping the builder:
68
+
69
+ ```bash
70
+ npx -y @shadsapp/mcp
71
+ ```
72
+
73
+ If you only have a shell, `shads themes list`, `shads themes import <id>`, and `shads create` are the install path. Full docs: https://shads.app/docs/cli
74
+
55
75
  ## Customize themes
56
76
 
57
- Edit visually at [shads.app](https://shads.app), then export production CSS from the builder.
77
+ Edit visually at [shads.app](https://shads.app), then export a create or add command from the builder.
58
78
 
59
79
  ## Related packages
60
80
 
package/dist/cli.js CHANGED
@@ -1,22 +1,32 @@
1
1
  #!/usr/bin/env node
2
2
  import { THEME_SCHEMA } from "@shadsapp/schema";
3
+ import { runCreate } from "./commands/create.js";
3
4
  import { runInstall } from "./commands/install.js";
5
+ import { runMigrateIcons } from "./commands/migrate-icons.js";
4
6
  import { runThemesImport, runThemesList } from "./commands/themes.js";
5
7
  import { runValidate } from "./commands/validate.js";
6
8
  function printHelp() {
7
9
  console.log(`shads — theme tooling for shadcn/ui projects
8
10
 
9
11
  Usage:
12
+ shads create <name> [-t <theme>] [--template next]
13
+ shads create <name> --preset <url>
10
14
  shads install -t <theme> Install theme files into the current project
11
15
  shads themes list List public starter themes
12
16
  shads themes import <theme> Import a public theme into the current project
13
17
  shads validate <file> Validate a theme.json document
18
+ shads migrate icons --from <pack> --to <pack> [--yes]
14
19
  shads schema Print the active theme document schema id
15
20
 
16
21
  Examples:
22
+ npx @shadsapp/cli create my-app -t workspace
23
+ npx @shadsapp/cli create my-app --template vite -t terminal
24
+ npx @shadsapp/cli create my-app --preset https://shads.app/r/workspace-theme.json
17
25
  npx @shadsapp/cli install -t workspace
18
26
  npx @shadsapp/cli themes import workspace
19
27
  npx @shadsapp/cli validate theme.json
28
+
29
+ create runs the official shadcn CLI (npx shadcn@latest create --preset …).
20
30
  `);
21
31
  }
22
32
  async function main() {
@@ -39,6 +49,19 @@ async function main() {
39
49
  runValidate(filePath);
40
50
  return;
41
51
  }
52
+ if (command === "create") {
53
+ await runCreate([subcommand, ...rest].filter((token) => typeof token === "string"));
54
+ return;
55
+ }
56
+ if (command === "migrate") {
57
+ if (subcommand === "icons") {
58
+ await runMigrateIcons(rest);
59
+ return;
60
+ }
61
+ console.error("Unknown migrate target. Usage: shads migrate icons --from <pack> --to <pack>");
62
+ process.exitCode = 1;
63
+ return;
64
+ }
42
65
  if (command === "install") {
43
66
  let themeId = "workspace";
44
67
  for (let index = 0; index < rest.length; index += 1) {
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type ParsedCreateArgs = {
2
+ name: string;
3
+ themeId: string;
4
+ presetUrl: string | null;
5
+ template: string;
6
+ passthrough: string[];
7
+ };
8
+ type ParseCreateResult = ParsedCreateArgs | {
9
+ error: string;
10
+ };
11
+ export declare function parseCreateArgs(argv: string[]): ParseCreateResult;
12
+ export declare function resolveCreatePresetUrl(args: ParsedCreateArgs, origin?: string): string;
13
+ export declare function buildShadcnCreateArgv(args: ParsedCreateArgs, presetUrl: string): string[];
14
+ export declare function runCreate(argv: string[]): Promise<void>;
15
+ export {};
16
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AA4BA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,EAAE,CAAA;CACtB,CAAA;AAED,KAAK,iBAAiB,GAAG,gBAAgB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAA;AAkB7D,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,iBAAiB,CA4FjE;AAED,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,gBAAgB,EACtB,MAAM,SAA+D,GACpE,MAAM,CAKR;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,gBAAgB,EACtB,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAYV;AAMD,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B7D"}
@@ -0,0 +1,173 @@
1
+ import { spawn } from "node:child_process";
2
+ const STARTER_THEME_IDS = [
3
+ "workspace",
4
+ "brief",
5
+ "insights",
6
+ "dispatch",
7
+ "ledger",
8
+ "canvas",
9
+ "terminal",
10
+ "launch",
11
+ "commerce",
12
+ "campus",
13
+ "editorial",
14
+ ];
15
+ const SHADCN_TEMPLATES = [
16
+ "next",
17
+ "vite",
18
+ "start",
19
+ "react-router",
20
+ "astro",
21
+ "laravel",
22
+ ];
23
+ const DEFAULT_REGISTRY_ORIGIN = "https://shads.app";
24
+ const PROJECT_NAME_PATTERN = /^[A-Za-z0-9._-]+$/;
25
+ function isStarterThemeId(value) {
26
+ return STARTER_THEME_IDS.includes(value);
27
+ }
28
+ function isShadcnTemplate(value) {
29
+ return SHADCN_TEMPLATES.includes(value);
30
+ }
31
+ function takeValue(tokens, flag) {
32
+ const value = tokens.shift();
33
+ if (!value || value.startsWith("-")) {
34
+ return { error: `Missing value for ${flag}` };
35
+ }
36
+ return value;
37
+ }
38
+ export function parseCreateArgs(argv) {
39
+ const tokens = [...argv];
40
+ let name = null;
41
+ let themeId = "workspace";
42
+ let presetUrl = null;
43
+ let template = "next";
44
+ const passthrough = [];
45
+ while (tokens.length > 0) {
46
+ const token = tokens.shift();
47
+ if (!token)
48
+ break;
49
+ if (token === "-t" || token === "--theme") {
50
+ const next = takeValue(tokens, token);
51
+ if (typeof next !== "string")
52
+ return next;
53
+ themeId = next;
54
+ continue;
55
+ }
56
+ if (token === "--preset") {
57
+ const next = takeValue(tokens, token);
58
+ if (typeof next !== "string")
59
+ return next;
60
+ presetUrl = next;
61
+ continue;
62
+ }
63
+ if (token === "--template") {
64
+ const next = takeValue(tokens, token);
65
+ if (typeof next !== "string")
66
+ return next;
67
+ template = next;
68
+ continue;
69
+ }
70
+ if (token === "--name") {
71
+ const next = takeValue(tokens, token);
72
+ if (typeof next !== "string")
73
+ return next;
74
+ name = next;
75
+ continue;
76
+ }
77
+ if (token.startsWith("-")) {
78
+ passthrough.push(token);
79
+ const next = tokens[0];
80
+ if (next && !next.startsWith("-")) {
81
+ passthrough.push(next);
82
+ tokens.shift();
83
+ }
84
+ continue;
85
+ }
86
+ if (!name) {
87
+ name = token;
88
+ continue;
89
+ }
90
+ return { error: `Unexpected argument: ${token}` };
91
+ }
92
+ if (!name) {
93
+ return {
94
+ error: "Missing project name. Usage: shads create <name> [-t <theme>] [--template next]",
95
+ };
96
+ }
97
+ if (!PROJECT_NAME_PATTERN.test(name)) {
98
+ return {
99
+ error: "Project name may only include letters, numbers, dots, underscores, and hyphens.",
100
+ };
101
+ }
102
+ if (!isShadcnTemplate(template)) {
103
+ return {
104
+ error: `Unknown template "${template}". Use: ${SHADCN_TEMPLATES.join(", ")}`,
105
+ };
106
+ }
107
+ if (!presetUrl && !isStarterThemeId(themeId)) {
108
+ return {
109
+ error: `Unknown theme "${themeId}". Use: ${STARTER_THEME_IDS.join(", ")}`,
110
+ };
111
+ }
112
+ if (presetUrl) {
113
+ try {
114
+ const url = new URL(presetUrl);
115
+ if (url.protocol !== "http:" && url.protocol !== "https:") {
116
+ return { error: "--preset must be an http(s) registry URL" };
117
+ }
118
+ }
119
+ catch {
120
+ return { error: "--preset must be an http(s) registry URL" };
121
+ }
122
+ }
123
+ return { name, themeId, presetUrl, template, passthrough };
124
+ }
125
+ export function resolveCreatePresetUrl(args, origin = process.env.SHADS_REGISTRY_ORIGIN ?? DEFAULT_REGISTRY_ORIGIN) {
126
+ if (args.presetUrl) {
127
+ return args.presetUrl;
128
+ }
129
+ return `${origin.replace(/\/$/, "")}/r/${args.themeId}-theme.json`;
130
+ }
131
+ export function buildShadcnCreateArgv(args, presetUrl) {
132
+ return [
133
+ "shadcn@latest",
134
+ "create",
135
+ "--name",
136
+ args.name,
137
+ "--template",
138
+ args.template,
139
+ "--preset",
140
+ presetUrl,
141
+ ...args.passthrough,
142
+ ];
143
+ }
144
+ function npxBinary() {
145
+ return process.platform === "win32" ? "npx.cmd" : "npx";
146
+ }
147
+ export async function runCreate(argv) {
148
+ const parsed = parseCreateArgs(argv);
149
+ if ("error" in parsed) {
150
+ console.error(parsed.error);
151
+ process.exitCode = 1;
152
+ return;
153
+ }
154
+ const presetUrl = resolveCreatePresetUrl(parsed);
155
+ const npxArgs = buildShadcnCreateArgv(parsed, presetUrl);
156
+ console.log("Creating a project with the official shadcn CLI.");
157
+ console.log(`Theme: ${presetUrl}`);
158
+ console.log("");
159
+ console.log(`npx ${npxArgs.join(" ")}`);
160
+ console.log("");
161
+ await new Promise((resolve, reject) => {
162
+ const child = spawn(npxBinary(), npxArgs, {
163
+ stdio: "inherit",
164
+ env: process.env,
165
+ });
166
+ child.on("error", reject);
167
+ child.on("close", (code) => {
168
+ process.exitCode = code ?? 1;
169
+ resolve();
170
+ });
171
+ });
172
+ }
173
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runMigrateIcons(argv: string[]): Promise<void>;
2
+ //# sourceMappingURL=migrate-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-icons.d.ts","sourceRoot":"","sources":["../../src/commands/migrate-icons.ts"],"names":[],"mappings":"AAgOA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCnE"}
@@ -0,0 +1,209 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "node:fs";
3
+ import path from "node:path";
4
+ import iconMap from "../data/icon-map.json" with { type: "json" };
5
+ const OFFICIAL_PACKS = new Set([
6
+ "lucide",
7
+ "tabler",
8
+ "hugeicons",
9
+ "phosphor",
10
+ "remixicon",
11
+ ]);
12
+ const EXTRA_PACKS = new Set(["heroicons", "iconoir"]);
13
+ const PACK_IMPORTS = {
14
+ lucide: "lucide-react",
15
+ tabler: "@tabler/icons-react",
16
+ hugeicons: "@hugeicons/react",
17
+ phosphor: "@phosphor-icons/react",
18
+ remixicon: "@remixicon/react",
19
+ heroicons: "@heroicons/react/24/outline",
20
+ iconoir: "iconoir-react",
21
+ };
22
+ const PACK_PACKAGES = {
23
+ lucide: ["lucide-react"],
24
+ tabler: ["@tabler/icons-react"],
25
+ hugeicons: ["@hugeicons/react", "@hugeicons/core-free-icons"],
26
+ phosphor: ["@phosphor-icons/react"],
27
+ remixicon: ["@remixicon/react"],
28
+ heroicons: ["@heroicons/react"],
29
+ iconoir: ["iconoir-react"],
30
+ };
31
+ function parseArgs(argv) {
32
+ let from = "lucide";
33
+ let to = "tabler";
34
+ let yes = false;
35
+ for (let index = 0; index < argv.length; index += 1) {
36
+ const token = argv[index];
37
+ if (token === "--from") {
38
+ from = argv[index + 1];
39
+ index += 1;
40
+ }
41
+ else if (token === "--to") {
42
+ to = argv[index + 1];
43
+ index += 1;
44
+ }
45
+ else if (token === "--yes" || token === "-y") {
46
+ yes = true;
47
+ }
48
+ }
49
+ return { from, to, yes };
50
+ }
51
+ function buildRenameMap(from, to) {
52
+ const map = new Map();
53
+ for (const entry of Object.values(iconMap)) {
54
+ const fromName = entry[from];
55
+ const toName = entry[to];
56
+ if (fromName && toName) {
57
+ map.set(fromName, toName);
58
+ }
59
+ }
60
+ return map;
61
+ }
62
+ function lucideAliasMap(pack) {
63
+ const map = new Map();
64
+ for (const entry of Object.values(iconMap)) {
65
+ const lucideName = entry.lucide;
66
+ const targetName = entry[pack];
67
+ if (lucideName && targetName) {
68
+ map.set(lucideName, targetName);
69
+ }
70
+ }
71
+ return map;
72
+ }
73
+ function installPackages(packages, cwd) {
74
+ const result = spawnSync("npm", ["install", ...packages], {
75
+ cwd,
76
+ stdio: "inherit",
77
+ shell: process.platform === "win32",
78
+ });
79
+ if (result.status !== 0) {
80
+ throw new Error(`Failed to install ${packages.join(" ")}`);
81
+ }
82
+ }
83
+ function delegateToShadcn(from, to, yes) {
84
+ const args = ["shadcn@latest", "migrate", "icons", "--from", from, "--to", to];
85
+ if (yes)
86
+ args.push("--yes");
87
+ const result = spawnSync("npx", args, {
88
+ stdio: "inherit",
89
+ shell: process.platform === "win32",
90
+ });
91
+ if (result.status !== 0) {
92
+ process.exitCode = 1;
93
+ }
94
+ }
95
+ function findUiDirectory(cwd) {
96
+ const candidates = [
97
+ path.join(cwd, "src", "components", "ui"),
98
+ path.join(cwd, "components", "ui"),
99
+ ];
100
+ const match = candidates.find((candidate) => existsSync(candidate));
101
+ if (!match) {
102
+ throw new Error("Could not find components/ui directory");
103
+ }
104
+ return match;
105
+ }
106
+ function listUiFiles(uiDir) {
107
+ return readdirSync(uiDir)
108
+ .filter((name) => name.endsWith(".ts") || name.endsWith(".tsx"))
109
+ .map((name) => path.join(uiDir, name));
110
+ }
111
+ function replaceIconPlaceholder(content, to) {
112
+ const attr = to;
113
+ return content.replace(/<IconPlaceholder\b([^>]*)\/>/g, (_match, attrs) => {
114
+ const iconMatch = attrs.match(new RegExp(`${attr}=["']([^"']+)["']`));
115
+ const iconName = iconMatch?.[1];
116
+ if (!iconName)
117
+ return _match;
118
+ const keptAttrs = attrs
119
+ .replace(/\s*(lucide|tabler|hugeicons|phosphor|remixicon|heroicons|iconoir)=["'][^"']*["']/g, "")
120
+ .trim();
121
+ return keptAttrs.length > 0
122
+ ? `<${iconName} ${keptAttrs} />`
123
+ : `<${iconName} />`;
124
+ });
125
+ }
126
+ function migrateSource(content, from, to) {
127
+ const renameMap = buildRenameMap(from, to);
128
+ let next = replaceIconPlaceholder(content, to);
129
+ const fromModule = PACK_IMPORTS[from];
130
+ const toModule = PACK_IMPORTS[to];
131
+ const importRegex = new RegExp(`import\\s+\\{([^}]+)\\}\\s+from\\s+["']${fromModule.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}["']`, "g");
132
+ next = next.replace(importRegex, (_match, imports) => {
133
+ const names = imports
134
+ .split(",")
135
+ .map((part) => part.trim())
136
+ .filter(Boolean)
137
+ .map((part) => {
138
+ const aliasMatch = part.match(/^(\w+)(?:\s+as\s+(\w+))?$/);
139
+ const importName = aliasMatch?.[1] ?? part;
140
+ const localName = aliasMatch?.[2] ?? importName;
141
+ const renamed = renameMap.get(importName);
142
+ if (!renamed)
143
+ return null;
144
+ return localName === renamed ? renamed : `${renamed} as ${localName}`;
145
+ })
146
+ .filter((value) => Boolean(value));
147
+ if (names.length === 0)
148
+ return "";
149
+ return `import { ${names.join(", ")} } from "${toModule}"`;
150
+ });
151
+ for (const [fromName, toName] of renameMap.entries()) {
152
+ if (fromName === toName)
153
+ continue;
154
+ next = next.replaceAll(fromName, toName);
155
+ }
156
+ return next;
157
+ }
158
+ function writeLucideAdapter(cwd, pack) {
159
+ const aliasMap = lucideAliasMap(pack);
160
+ const importFrom = PACK_IMPORTS[pack];
161
+ const uniqueTargets = [...new Set(aliasMap.values())];
162
+ const lines = [
163
+ "// Lucide-shaped re-exports for Pro icon packs.",
164
+ `import {`,
165
+ ...uniqueTargets.map((name) => ` ${name},`),
166
+ `} from "${importFrom}"`,
167
+ "",
168
+ ];
169
+ for (const [lucideName, targetName] of aliasMap.entries()) {
170
+ lines.push(`export { ${targetName} as ${lucideName} }`);
171
+ }
172
+ const iconsDir = path.join(cwd, "src", "icons");
173
+ mkdirSync(iconsDir, { recursive: true });
174
+ const adapterPath = path.join(iconsDir, `shads-${pack}.tsx`);
175
+ writeFileSync(adapterPath, `${lines.join("\n")}\n`);
176
+ const alias = `"lucide-react": path.resolve(__dirname, "./src/icons/shads-${pack}.tsx")`;
177
+ return { adapterPath, alias };
178
+ }
179
+ export async function runMigrateIcons(argv) {
180
+ const { from, to, yes } = parseArgs(argv);
181
+ const cwd = process.cwd();
182
+ if (OFFICIAL_PACKS.has(to)) {
183
+ delegateToShadcn(from, to, yes);
184
+ return;
185
+ }
186
+ if (!EXTRA_PACKS.has(to)) {
187
+ throw new Error(`Unsupported target icon pack: ${to}`);
188
+ }
189
+ if (!yes) {
190
+ console.error("Pass --yes to migrate icons in the current project.");
191
+ process.exitCode = 1;
192
+ return;
193
+ }
194
+ installPackages(PACK_PACKAGES[to], cwd);
195
+ const uiDir = findUiDirectory(cwd);
196
+ for (const filePath of listUiFiles(uiDir)) {
197
+ const original = readFileSync(filePath, "utf8");
198
+ const migrated = migrateSource(original, from, to);
199
+ if (migrated !== original) {
200
+ writeFileSync(filePath, migrated);
201
+ }
202
+ }
203
+ const { adapterPath, alias } = writeLucideAdapter(cwd, to);
204
+ console.log(`Wrote ${path.relative(cwd, adapterPath)}`);
205
+ console.log("");
206
+ console.log("Add this Vite alias so future `npx shadcn add` keeps rendering icons:");
207
+ console.log(alias);
208
+ }
209
+ //# sourceMappingURL=migrate-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate-icons.js","sourceRoot":"","sources":["../../src/commands/migrate-icons.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ {
2
+ "Check": {
3
+ "lucide": "CheckIcon",
4
+ "tabler": "IconCheck",
5
+ "hugeicons": "Tick02Icon",
6
+ "phosphor": "CheckIcon",
7
+ "remixicon": "RiCheckLine",
8
+ "heroicons": "CheckIcon",
9
+ "iconoir": "Check"
10
+ },
11
+ "ChevronDown": {
12
+ "lucide": "ChevronDownIcon",
13
+ "tabler": "IconChevronDown",
14
+ "hugeicons": "ArrowDown01Icon",
15
+ "phosphor": "CaretDownIcon",
16
+ "remixicon": "RiArrowDownSLine",
17
+ "heroicons": "ChevronDownIcon",
18
+ "iconoir": "NavArrowDown"
19
+ },
20
+ "ChevronLeft": {
21
+ "lucide": "ChevronLeftIcon",
22
+ "tabler": "IconChevronLeft",
23
+ "hugeicons": "ArrowLeft01Icon",
24
+ "phosphor": "CaretLeftIcon",
25
+ "remixicon": "RiArrowLeftSLine",
26
+ "heroicons": "ChevronLeftIcon",
27
+ "iconoir": "NavArrowLeft"
28
+ },
29
+ "ChevronRight": {
30
+ "lucide": "ChevronRightIcon",
31
+ "tabler": "IconChevronRight",
32
+ "hugeicons": "ArrowRight01Icon",
33
+ "phosphor": "CaretRightIcon",
34
+ "remixicon": "RiArrowRightSLine",
35
+ "heroicons": "ChevronRightIcon",
36
+ "iconoir": "NavArrowRight"
37
+ },
38
+ "ChevronUp": {
39
+ "lucide": "ChevronUpIcon",
40
+ "tabler": "IconChevronUp",
41
+ "hugeicons": "ArrowUp01Icon",
42
+ "phosphor": "CaretUpIcon",
43
+ "remixicon": "RiArrowUpSLine",
44
+ "heroicons": "ChevronUpIcon",
45
+ "iconoir": "NavArrowUp"
46
+ },
47
+ "X": {
48
+ "lucide": "XIcon",
49
+ "tabler": "IconX",
50
+ "hugeicons": "Cancel01Icon",
51
+ "phosphor": "XIcon",
52
+ "remixicon": "RiCloseLine",
53
+ "heroicons": "XMarkIcon",
54
+ "iconoir": "Xmark"
55
+ },
56
+ "Search": {
57
+ "lucide": "SearchIcon",
58
+ "tabler": "IconSearch",
59
+ "hugeicons": "SearchIcon",
60
+ "phosphor": "MagnifyingGlassIcon",
61
+ "remixicon": "RiSearchLine",
62
+ "heroicons": "MagnifyingGlassIcon",
63
+ "iconoir": "Search"
64
+ },
65
+ "Loader2": {
66
+ "lucide": "Loader2Icon",
67
+ "tabler": "IconLoader",
68
+ "hugeicons": "Loading03Icon",
69
+ "phosphor": "SpinnerIcon",
70
+ "remixicon": "RiLoaderLine",
71
+ "heroicons": "ArrowPathIcon",
72
+ "iconoir": "RefreshDouble"
73
+ },
74
+ "MoreHorizontal": {
75
+ "lucide": "MoreHorizontalIcon",
76
+ "tabler": "IconDots",
77
+ "hugeicons": "MoreHorizontalCircle01Icon",
78
+ "phosphor": "DotsThreeOutlineIcon",
79
+ "remixicon": "RiMoreLine",
80
+ "heroicons": "EllipsisHorizontalIcon",
81
+ "iconoir": "MoreHoriz"
82
+ },
83
+ "CircleCheck": {
84
+ "lucide": "CircleCheckIcon",
85
+ "tabler": "IconCircleCheckFilled",
86
+ "hugeicons": "CheckmarkCircle01Icon",
87
+ "phosphor": "CheckCircleIcon",
88
+ "remixicon": "RiCheckboxCircleFill",
89
+ "heroicons": "CheckCircleIcon",
90
+ "iconoir": "CheckCircle"
91
+ },
92
+ "Info": {
93
+ "lucide": "InfoIcon",
94
+ "tabler": "IconInfoCircle",
95
+ "hugeicons": "InformationCircleIcon",
96
+ "phosphor": "InfoIcon",
97
+ "remixicon": "RiInformationLine",
98
+ "heroicons": "InformationCircleIcon",
99
+ "iconoir": "InfoCircle"
100
+ },
101
+ "OctagonX": {
102
+ "lucide": "OctagonXIcon",
103
+ "tabler": "IconAlertOctagon",
104
+ "hugeicons": "MultiplicationSignCircleIcon",
105
+ "phosphor": "XCircleIcon",
106
+ "remixicon": "RiCloseCircleLine",
107
+ "heroicons": "XCircleIcon",
108
+ "iconoir": "XmarkCircle"
109
+ },
110
+ "TriangleAlert": {
111
+ "lucide": "TriangleAlertIcon",
112
+ "tabler": "IconAlertTriangle",
113
+ "hugeicons": "Alert02Icon",
114
+ "phosphor": "WarningIcon",
115
+ "remixicon": "RiErrorWarningLine",
116
+ "heroicons": "ExclamationTriangleIcon",
117
+ "iconoir": "WarningTriangle"
118
+ }
119
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shadsapp/cli",
3
- "version": "0.1.1",
4
- "description": "CLI for installing and importing shads themes",
3
+ "version": "0.1.3",
4
+ "description": "CLI for creating shadcn apps from shads themes and installing them into existing projects",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "bin": {
@@ -13,11 +13,13 @@
13
13
  ],
14
14
  "scripts": {
15
15
  "build": "tsc -p tsconfig.json",
16
- "typecheck": "tsc -p tsconfig.json --noEmit"
16
+ "typecheck": "tsc -p tsconfig.json --noEmit",
17
+ "test": "npm run build && node --experimental-strip-types --test src/commands/create.test.ts src/commands/migrate-icons.test.ts && node test/package-smoke.mjs"
17
18
  },
18
19
  "dependencies": {
19
- "@shadsapp/schema": "0.1.1",
20
- "@shadsapp/themes": "0.1.1"
20
+ "@shadsapp/schema": "0.1.2",
21
+ "@shadsapp/themes": "0.1.3",
22
+ "ts-morph": "^25.0.1"
21
23
  },
22
24
  "publishConfig": {
23
25
  "access": "public"