swiftcn 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/commands/add.d.ts +4 -0
  2. package/dist/commands/add.d.ts.map +1 -0
  3. package/dist/commands/add.js +109 -0
  4. package/dist/commands/add.js.map +1 -0
  5. package/dist/commands/init.d.ts +4 -0
  6. package/dist/commands/init.d.ts.map +1 -0
  7. package/dist/commands/init.js +152 -0
  8. package/dist/commands/init.js.map +1 -0
  9. package/dist/commands/list.d.ts +4 -0
  10. package/dist/commands/list.d.ts.map +1 -0
  11. package/dist/commands/list.js +67 -0
  12. package/dist/commands/list.js.map +1 -0
  13. package/dist/container.d.ts +11 -0
  14. package/dist/container.d.ts.map +1 -0
  15. package/dist/container.js +14 -0
  16. package/dist/container.js.map +1 -0
  17. package/dist/index.d.ts +3 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +58 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/services/ConfigService.d.ts +16 -0
  22. package/dist/services/ConfigService.d.ts.map +1 -0
  23. package/dist/services/ConfigService.js +27 -0
  24. package/dist/services/ConfigService.js.map +1 -0
  25. package/dist/services/FetcherService.d.ts +26 -0
  26. package/dist/services/FetcherService.d.ts.map +1 -0
  27. package/dist/services/FetcherService.js +60 -0
  28. package/dist/services/FetcherService.js.map +1 -0
  29. package/dist/services/FileService.d.ts +27 -0
  30. package/dist/services/FileService.d.ts.map +1 -0
  31. package/dist/services/FileService.js +46 -0
  32. package/dist/services/FileService.js.map +1 -0
  33. package/dist/services/GitService.d.ts +11 -0
  34. package/dist/services/GitService.d.ts.map +1 -0
  35. package/dist/services/GitService.js +21 -0
  36. package/dist/services/GitService.js.map +1 -0
  37. package/dist/services/RegistryService.d.ts +20 -0
  38. package/dist/services/RegistryService.d.ts.map +1 -0
  39. package/dist/services/RegistryService.js +43 -0
  40. package/dist/services/RegistryService.js.map +1 -0
  41. package/dist/services/index.d.ts +6 -0
  42. package/dist/services/index.d.ts.map +1 -0
  43. package/dist/services/index.js +6 -0
  44. package/dist/services/index.js.map +1 -0
  45. package/dist/types/config.schema.d.ts +22 -0
  46. package/dist/types/config.schema.d.ts.map +1 -0
  47. package/dist/types/config.schema.js +9 -0
  48. package/dist/types/config.schema.js.map +1 -0
  49. package/dist/types/index.d.ts +4 -0
  50. package/dist/types/index.d.ts.map +1 -0
  51. package/dist/types/index.js +4 -0
  52. package/dist/types/index.js.map +1 -0
  53. package/dist/types/options.schema.d.ts +47 -0
  54. package/dist/types/options.schema.d.ts.map +1 -0
  55. package/dist/types/options.schema.js +18 -0
  56. package/dist/types/options.schema.js.map +1 -0
  57. package/dist/types/registry.schema.d.ts +187 -0
  58. package/dist/types/registry.schema.d.ts.map +1 -0
  59. package/dist/types/registry.schema.js +39 -0
  60. package/dist/types/registry.schema.js.map +1 -0
  61. package/dist/utils/constants.d.ts +27 -0
  62. package/dist/utils/constants.d.ts.map +1 -0
  63. package/dist/utils/constants.js +33 -0
  64. package/dist/utils/constants.js.map +1 -0
  65. package/dist/utils/errors.d.ts +25 -0
  66. package/dist/utils/errors.d.ts.map +1 -0
  67. package/dist/utils/errors.js +34 -0
  68. package/dist/utils/errors.js.map +1 -0
  69. package/dist/utils/paths.d.ts +34 -0
  70. package/dist/utils/paths.d.ts.map +1 -0
  71. package/dist/utils/paths.js +87 -0
  72. package/dist/utils/paths.js.map +1 -0
  73. package/dist/utils/ui.d.ts +35 -0
  74. package/dist/utils/ui.d.ts.map +1 -0
  75. package/dist/utils/ui.js +115 -0
  76. package/dist/utils/ui.js.map +1 -0
  77. package/package.json +54 -0
  78. package/registry.json +133 -0
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import type { Container } from "../container.js";
3
+ export declare function createAddCommand(container: Container): Command;
4
+ //# sourceMappingURL=add.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.d.ts","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAmI9D"}
@@ -0,0 +1,109 @@
1
+ import { Command } from "commander";
2
+ import path from "node:path";
3
+ import { ui } from "../utils/ui.js";
4
+ import { AddOptionsSchema } from "../types/options.schema.js";
5
+ export function createAddCommand(container) {
6
+ return new Command()
7
+ .name("add")
8
+ .description("Add a component to your project")
9
+ .argument("<component>", "The component to add (e.g., button, card, input)")
10
+ .option("-f, --force", "Overwrite existing files")
11
+ .option("--sdui", "Also copy SDUI extension file")
12
+ .option("--theme", "Also copy required theme files")
13
+ .action(async (componentName, rawOptions) => {
14
+ const options = AddOptionsSchema.parse(rawOptions);
15
+ const cwd = process.cwd();
16
+ ui.header();
17
+ // Step 1: Load config
18
+ const config = await container.config.load(cwd);
19
+ if (!config) {
20
+ ui.break();
21
+ ui.error("No swiftcn.json found.");
22
+ ui.break();
23
+ ui.end(`Run ${ui.accent("swiftcn init")} to set up your project.`);
24
+ process.exit(1);
25
+ }
26
+ // Step 2: Find component in registry
27
+ const component = await container.registry.getComponent(componentName);
28
+ if (!component) {
29
+ ui.break();
30
+ ui.error(`Component "${componentName}" not found.`);
31
+ ui.break();
32
+ const components = await container.registry.listComponents();
33
+ const maxIdLen = Math.max(...components.map((c) => c.id.length));
34
+ ui.section("Available");
35
+ ui.break();
36
+ for (const c of components) {
37
+ ui.command(c.id.padEnd(maxIdLen), c.name);
38
+ }
39
+ ui.break();
40
+ ui.end(`Run ${ui.accent("swiftcn list")} for details.`);
41
+ process.exit(1);
42
+ }
43
+ // Step 3: Fetch component files
44
+ ui.break();
45
+ ui.step(`Installing ${component.name}...`);
46
+ ui.break();
47
+ try {
48
+ const destDir = path.join(cwd, config.componentsPath);
49
+ const filesToFetch = [...component.files];
50
+ if (options.sdui && component.sdui_files) {
51
+ filesToFetch.push(...component.sdui_files);
52
+ }
53
+ const result = await container.fetcher.fetchComponents(filesToFetch, destDir, { force: options.force });
54
+ for (const file of result.added) {
55
+ ui.fileAdded(path.relative(cwd, file));
56
+ }
57
+ for (const file of result.skipped) {
58
+ ui.fileExists(path.relative(cwd, file));
59
+ }
60
+ let totalFiles = result.added.length;
61
+ // Step 4: Fetch theme files (optional)
62
+ if (options.theme && config.themePath) {
63
+ ui.break();
64
+ ui.step("Installing theme...");
65
+ ui.break();
66
+ const themeDir = path.join(cwd, config.themePath);
67
+ const themeResult = await container.fetcher.fetchTheme(themeDir, {
68
+ force: options.force,
69
+ });
70
+ for (const file of themeResult.added) {
71
+ ui.fileAdded(path.relative(cwd, file));
72
+ }
73
+ for (const file of themeResult.skipped) {
74
+ ui.fileExists(path.relative(cwd, file));
75
+ }
76
+ totalFiles += themeResult.added.length;
77
+ }
78
+ if (result.skipped.length > 0 && result.added.length === 0) {
79
+ ui.break();
80
+ ui.hint(`Use ${ui.accent("--force")} to overwrite existing files.`);
81
+ }
82
+ // Step 5: Success message
83
+ ui.break();
84
+ ui.success("Done!");
85
+ ui.break();
86
+ ui.section(component.name);
87
+ ui.break();
88
+ if (component.variants) {
89
+ ui.labeledList("Variants", component.variants);
90
+ }
91
+ if (component.sizes) {
92
+ ui.labeledList("Sizes", component.sizes);
93
+ }
94
+ if (component.sduiType && !options.sdui) {
95
+ ui.break();
96
+ ui.hint(`Use ${ui.accent("--sdui")} to include SDUI Configuration struct.`);
97
+ }
98
+ ui.break();
99
+ ui.end(`${totalFiles} file${totalFiles === 1 ? "" : "s"} added`);
100
+ }
101
+ catch (error) {
102
+ ui.error("Failed to add component");
103
+ ui.line(error instanceof Error ? error.message : String(error));
104
+ ui.end();
105
+ process.exit(1);
106
+ }
107
+ });
108
+ }
109
+ //# sourceMappingURL=add.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import type { Container } from "../container.js";
3
+ export declare function createInitCommand(container: Container): Command;
4
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CA8K/D"}
@@ -0,0 +1,152 @@
1
+ import { Command } from "commander";
2
+ import * as p from "@clack/prompts";
3
+ import path from "node:path";
4
+ import { ui } from "../utils/ui.js";
5
+ import { InitOptionsSchema } from "../types/options.schema.js";
6
+ export function createInitCommand(container) {
7
+ return new Command()
8
+ .name("init")
9
+ .description("Initialize swiftcn in your project")
10
+ .option("-p, --path <path>", "Path to components directory", "Sources/Components")
11
+ .option("--theme", "Include theme provider")
12
+ .option("--theme-path <path>", "Path to theme directory", "Sources/Theme")
13
+ .option("--sdui", "Include SDUI infrastructure")
14
+ .option("--sdui-path <path>", "Path to SDUI directory", "Sources/SDUI")
15
+ .option("-y, --yes", "Skip prompts and use defaults")
16
+ .action(async (rawOptions) => {
17
+ const options = InitOptionsSchema.parse(rawOptions);
18
+ const cwd = process.cwd();
19
+ ui.header();
20
+ // Step 1: Check existing config
21
+ if (await container.config.exists(cwd)) {
22
+ const shouldOverwrite = await p.confirm({
23
+ message: "swiftcn.json already exists. Overwrite?",
24
+ initialValue: false,
25
+ });
26
+ if (p.isCancel(shouldOverwrite) || !shouldOverwrite) {
27
+ p.cancel("Initialization cancelled.");
28
+ process.exit(0);
29
+ }
30
+ }
31
+ // Step 2: Gather configuration (CLI flags or interactive prompts)
32
+ let componentsPath = options.path;
33
+ let withTheme = options.theme ?? false;
34
+ let themePath = options.themePath;
35
+ let withSdui = options.sdui ?? false;
36
+ let sduiPath = options.sduiPath;
37
+ if (!options.yes) {
38
+ const answers = await p.group({
39
+ componentsPath: () => p.text({
40
+ message: "Where would you like to store components?",
41
+ initialValue: componentsPath,
42
+ validate: (value) => {
43
+ if (!value)
44
+ return "Path is required";
45
+ },
46
+ }),
47
+ withTheme: () => p.confirm({
48
+ message: "Include theme provider?",
49
+ initialValue: true,
50
+ }),
51
+ themePath: ({ results }) => results.withTheme
52
+ ? p.text({
53
+ message: "Where would you like to store theme files?",
54
+ initialValue: themePath,
55
+ validate: (value) => {
56
+ if (!value)
57
+ return "Path is required";
58
+ },
59
+ })
60
+ : Promise.resolve(themePath),
61
+ withSdui: () => p.confirm({
62
+ message: "Include SDUI infrastructure?",
63
+ initialValue: false,
64
+ }),
65
+ sduiPath: ({ results }) => results.withSdui
66
+ ? p.text({
67
+ message: "Where would you like to store SDUI files?",
68
+ initialValue: sduiPath,
69
+ validate: (value) => {
70
+ if (!value)
71
+ return "Path is required";
72
+ },
73
+ })
74
+ : Promise.resolve(sduiPath),
75
+ }, {
76
+ onCancel: () => {
77
+ p.cancel("Initialization cancelled.");
78
+ process.exit(0);
79
+ },
80
+ });
81
+ componentsPath = answers.componentsPath;
82
+ withTheme = answers.withTheme;
83
+ themePath = answers.themePath ?? themePath;
84
+ withSdui = answers.withSdui;
85
+ sduiPath = answers.sduiPath ?? sduiPath;
86
+ }
87
+ // Step 3: Create directories and install files
88
+ ui.break();
89
+ ui.step("Creating project structure...");
90
+ ui.break();
91
+ try {
92
+ const fullComponentsPath = path.join(cwd, componentsPath);
93
+ await container.file.ensureDir(fullComponentsPath);
94
+ if (withTheme) {
95
+ const fullThemePath = path.join(cwd, themePath);
96
+ await container.file.ensureDir(fullThemePath);
97
+ ui.step("Installing theme files...");
98
+ ui.break();
99
+ const themeResult = await container.fetcher.fetchTheme(fullThemePath, {
100
+ force: true,
101
+ });
102
+ for (const file of themeResult.added) {
103
+ ui.fileAdded(path.relative(cwd, file));
104
+ }
105
+ ui.break();
106
+ }
107
+ if (withSdui) {
108
+ const fullSduiPath = path.join(cwd, sduiPath);
109
+ await container.file.ensureDir(fullSduiPath);
110
+ ui.step("Installing SDUI files...");
111
+ ui.break();
112
+ const sduiResult = await container.fetcher.fetchSdui(fullSduiPath, {
113
+ force: true,
114
+ });
115
+ for (const file of sduiResult.added) {
116
+ ui.fileAdded(path.relative(cwd, file));
117
+ }
118
+ ui.break();
119
+ }
120
+ // Step 4: Write config file
121
+ const config = {
122
+ componentsPath,
123
+ themePath: withTheme ? themePath : undefined,
124
+ sduiPath: withSdui ? sduiPath : undefined,
125
+ prefix: "CN",
126
+ };
127
+ ui.step("Installing Swiftcn Config...");
128
+ await container.config.write(config, cwd);
129
+ ui.break();
130
+ ui.fileAdded("swiftcn.json");
131
+ // Step 5: Success message and next steps
132
+ ui.break();
133
+ ui.success("Project initialized!");
134
+ ui.break();
135
+ ui.section("Next steps");
136
+ ui.break();
137
+ ui.command("swiftcn add button", "Add your first component");
138
+ ui.command("swiftcn list ", "Browse all components");
139
+ ui.break();
140
+ ui.hint("Components are copied to your project — you own the code!");
141
+ ui.break();
142
+ ui.end("Happy coding!");
143
+ }
144
+ catch (error) {
145
+ ui.error("Failed to initialize project");
146
+ ui.line(error instanceof Error ? error.message : String(error));
147
+ ui.end();
148
+ process.exit(1);
149
+ }
150
+ });
151
+ }
152
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Command } from "commander";
2
+ import type { Container } from "../container.js";
3
+ export declare function createListCommand(container: Container): Command;
4
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAgF/D"}
@@ -0,0 +1,67 @@
1
+ import { Command } from "commander";
2
+ import pc from "picocolors";
3
+ import { ui } from "../utils/ui.js";
4
+ import { ListOptionsSchema } from "../types/options.schema.js";
5
+ export function createListCommand(container) {
6
+ return new Command()
7
+ .name("list")
8
+ .description("List available components")
9
+ .option("-v, --verbose", "Show detailed information")
10
+ .action(async (rawOptions) => {
11
+ const options = ListOptionsSchema.parse(rawOptions);
12
+ ui.header();
13
+ try {
14
+ const components = await container.registry.listComponents();
15
+ ui.break();
16
+ ui.section("Components");
17
+ ui.break();
18
+ const maxIdLen = Math.max(...components.map((c) => c.id.length));
19
+ const maxNameLen = Math.max(...components.map((c) => c.name.length));
20
+ if (options.verbose) {
21
+ for (const component of components) {
22
+ const id = component.id.padEnd(maxIdLen);
23
+ const name = component.name.padEnd(maxNameLen);
24
+ ui.command(`${id} ${name}`, component.description);
25
+ if (component.variants) {
26
+ ui.info(` Variants: ${component.variants.join(` ${pc.dim("·")} `)}`);
27
+ }
28
+ if (component.sizes) {
29
+ ui.info(` Sizes: ${component.sizes.join(` ${pc.dim("·")} `)}`);
30
+ }
31
+ if (component.sduiType) {
32
+ ui.info(` SDUI: ${component.sduiType}`);
33
+ }
34
+ ui.break();
35
+ }
36
+ ui.section("Usage");
37
+ ui.break();
38
+ ui.command("swiftcn add button ", "Add CNButton");
39
+ ui.command("swiftcn add button --sdui ", "Include SDUI extension");
40
+ ui.command("swiftcn add button --theme ", "Include theme files");
41
+ ui.break();
42
+ ui.end(`${components.length} components available`);
43
+ }
44
+ else {
45
+ for (const component of components) {
46
+ const id = component.id.padEnd(maxIdLen);
47
+ const name = component.name.padEnd(maxNameLen);
48
+ const desc = component.description.length > 35
49
+ ? component.description.slice(0, 35) + "..."
50
+ : component.description;
51
+ ui.line(`→ ${ui.accent(id)} ${pc.bold(name)} ${pc.dim(desc)}`);
52
+ }
53
+ ui.break();
54
+ ui.hint("All components are SDUI-compatible.");
55
+ ui.break();
56
+ ui.end(`Run ${ui.accent("swiftcn add <name>")} to install a component.`);
57
+ }
58
+ }
59
+ catch (error) {
60
+ ui.error("Failed to load registry");
61
+ ui.line(error instanceof Error ? error.message : String(error));
62
+ ui.end();
63
+ process.exit(1);
64
+ }
65
+ });
66
+ }
67
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type GitService, type FileService, type RegistryService, type ConfigService, type FetcherService } from "./services/index.js";
2
+ export interface Container {
3
+ git: GitService;
4
+ file: FileService;
5
+ registry: RegistryService;
6
+ config: ConfigService;
7
+ fetcher: FetcherService;
8
+ }
9
+ export declare function createContainer(): Container;
10
+ export declare function createTestContainer(overrides?: Partial<Container>): Container;
11
+ //# sourceMappingURL=container.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.d.ts","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,UAAU,EACf,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,WAAW,SAAS;IACxB,GAAG,EAAE,UAAU,CAAC;IAChB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,wBAAgB,eAAe,IAAI,SAAS,CAQ3C;AAED,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,SAAS,CAAM,GACjC,SAAS,CAGX"}
@@ -0,0 +1,14 @@
1
+ import { GitServiceImpl, FileServiceImpl, RegistryServiceImpl, ConfigServiceImpl, FetcherServiceImpl, } from "./services/index.js";
2
+ export function createContainer() {
3
+ const git = new GitServiceImpl();
4
+ const file = new FileServiceImpl();
5
+ const registry = new RegistryServiceImpl(file);
6
+ const config = new ConfigServiceImpl(file);
7
+ const fetcher = new FetcherServiceImpl(git, file, registry);
8
+ return { git, file, registry, config, fetcher };
9
+ }
10
+ export function createTestContainer(overrides = {}) {
11
+ const base = createContainer();
12
+ return { ...base, ...overrides };
13
+ }
14
+ //# sourceMappingURL=container.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../src/container.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,eAAe,EACf,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,GAMnB,MAAM,qBAAqB,CAAC;AAU7B,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,IAAI,cAAc,EAAE,CAAC;IACjC,MAAM,IAAI,GAAG,IAAI,eAAe,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE5D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,YAAgC,EAAE;IAElC,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,58 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { createContainer } from "./container.js";
4
+ import { createInitCommand } from "./commands/init.js";
5
+ import { createAddCommand } from "./commands/add.js";
6
+ import { createListCommand } from "./commands/list.js";
7
+ import { ui } from "./utils/ui.js";
8
+ const VERSION = "1.0.0";
9
+ const container = createContainer();
10
+ const program = new Command();
11
+ program
12
+ .name("swiftcn")
13
+ .description("A CLI for adding shadcn-style SwiftUI components to your project.")
14
+ .version(VERSION, "-v, --version", "Show version")
15
+ .helpOption(false)
16
+ .option("-h, --help", "Show help")
17
+ .action((options) => {
18
+ if (options.help) {
19
+ printHelp();
20
+ }
21
+ else {
22
+ printHelp();
23
+ }
24
+ });
25
+ function printHelp() {
26
+ ui.header();
27
+ ui.break();
28
+ ui.line("Usage: swiftcn [options] [command]");
29
+ ui.break();
30
+ ui.line("A CLI for adding shadcn-style SwiftUI components to your project.");
31
+ ui.break();
32
+ ui.section("Options");
33
+ ui.break();
34
+ ui.command("-v, --version", "Show version");
35
+ ui.command("-h, --help ", "Show help");
36
+ ui.break();
37
+ ui.section("Commands");
38
+ ui.break();
39
+ ui.command("init [options] ", "Initialize swiftcn in your project");
40
+ ui.command("add [options] <component> ", "Add a component to your project");
41
+ ui.command("list [options] ", "List available components");
42
+ ui.break();
43
+ ui.section("Examples");
44
+ ui.break();
45
+ ui.command("swiftcn init ", "Initialize swiftcn in your project");
46
+ ui.command("swiftcn add button ", "Add a single component");
47
+ ui.command("swiftcn add button --sdui", "Add component with SDUI extension");
48
+ ui.command("swiftcn list --verbose ", "List all components with details");
49
+ ui.break();
50
+ ui.hint("Components are copied to your project — you own the code!");
51
+ ui.break();
52
+ ui.end(`Run ${ui.accent("swiftcn <command> --help")} for more info.`);
53
+ }
54
+ program.addCommand(createInitCommand(container));
55
+ program.addCommand(createAddCommand(container));
56
+ program.addCommand(createListCommand(container));
57
+ program.parse();
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { FileService } from "./FileService.js";
2
+ import { type ProjectConfig } from "../types/config.schema.js";
3
+ export interface ConfigService {
4
+ load(cwd?: string): Promise<ProjectConfig | null>;
5
+ write(config: ProjectConfig, cwd?: string): Promise<void>;
6
+ exists(cwd?: string): Promise<boolean>;
7
+ }
8
+ export declare class ConfigServiceImpl implements ConfigService {
9
+ private file;
10
+ constructor(file: FileService);
11
+ private configPath;
12
+ load(cwd?: string): Promise<ProjectConfig | null>;
13
+ write(config: ProjectConfig, cwd?: string): Promise<void>;
14
+ exists(cwd?: string): Promise<boolean>;
15
+ }
16
+ //# sourceMappingURL=ConfigService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigService.d.ts","sourceRoot":"","sources":["../../src/services/ConfigService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AAGnC,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAClD,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACxC;AAED,qBAAa,iBAAkB,YAAW,aAAa;IACzC,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,WAAW;IAErC,OAAO,CAAC,UAAU;IAIZ,IAAI,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAUhE,KAAK,CACT,MAAM,EAAE,aAAa,EACrB,GAAG,GAAE,MAAsB,GAC1B,OAAO,CAAC,IAAI,CAAC;IAKV,MAAM,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,OAAO,CAAC;CAG5D"}
@@ -0,0 +1,27 @@
1
+ import path from "node:path";
2
+ import { projectConfigSchema, } from "../types/config.schema.js";
3
+ import { CONFIG_FILE_NAME } from "../utils/constants.js";
4
+ export class ConfigServiceImpl {
5
+ file;
6
+ constructor(file) {
7
+ this.file = file;
8
+ }
9
+ configPath(cwd) {
10
+ return path.join(cwd, CONFIG_FILE_NAME);
11
+ }
12
+ async load(cwd = process.cwd()) {
13
+ const configPath = this.configPath(cwd);
14
+ if (!(await this.file.exists(configPath))) {
15
+ return null;
16
+ }
17
+ return this.file.readJson(configPath, projectConfigSchema);
18
+ }
19
+ async write(config, cwd = process.cwd()) {
20
+ const configPath = this.configPath(cwd);
21
+ await this.file.writeJson(configPath, config);
22
+ }
23
+ async exists(cwd = process.cwd()) {
24
+ return this.file.exists(this.configPath(cwd));
25
+ }
26
+ }
27
+ //# sourceMappingURL=ConfigService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigService.js","sourceRoot":"","sources":["../../src/services/ConfigService.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EACL,mBAAmB,GAEpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQzD,MAAM,OAAO,iBAAiB;IACR;IAApB,YAAoB,IAAiB;QAAjB,SAAI,GAAJ,IAAI,CAAa;IAAG,CAAC;IAEjC,UAAU,CAAC,GAAW;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;QACpC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QAExC,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAC1C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAgB,UAAU,EAAE,mBAAmB,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,KAAK,CACT,MAAqB,EACrB,MAAc,OAAO,CAAC,GAAG,EAAE;QAE3B,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAc,OAAO,CAAC,GAAG,EAAE;QACtC,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import type { GitService } from "./GitService.js";
2
+ import type { FileService } from "./FileService.js";
3
+ import type { RegistryService } from "./RegistryService.js";
4
+ export interface FetchOptions {
5
+ force?: boolean;
6
+ }
7
+ export interface FetchResult {
8
+ added: string[];
9
+ skipped: string[];
10
+ }
11
+ export interface FetcherService {
12
+ fetchComponents(files: string[], destDir: string, options?: FetchOptions): Promise<FetchResult>;
13
+ fetchTheme(destDir: string, options?: FetchOptions): Promise<FetchResult>;
14
+ fetchSdui(destDir: string, options?: FetchOptions): Promise<FetchResult>;
15
+ }
16
+ export declare class FetcherServiceImpl implements FetcherService {
17
+ private git;
18
+ private file;
19
+ private registry;
20
+ constructor(git: GitService, file: FileService, registry: RegistryService);
21
+ fetchComponents(files: string[], destDir: string, options?: FetchOptions): Promise<FetchResult>;
22
+ fetchTheme(destDir: string, options?: FetchOptions): Promise<FetchResult>;
23
+ fetchSdui(destDir: string, options?: FetchOptions): Promise<FetchResult>;
24
+ private fetchFiles;
25
+ }
26
+ //# sourceMappingURL=FetcherService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FetcherService.d.ts","sourceRoot":"","sources":["../../src/services/FetcherService.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAChE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAG5D,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,eAAe,CACb,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,WAAW,CAAC,CAAC;IACxB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1E,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CAC1E;AAED,qBAAa,kBAAmB,YAAW,cAAc;IAErD,OAAO,CAAC,GAAG;IACX,OAAO,CAAC,IAAI;IACZ,OAAO,CAAC,QAAQ;gBAFR,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,eAAe;IAG7B,eAAe,CACnB,KAAK,EAAE,MAAM,EAAE,EACf,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC;IAOjB,UAAU,CACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC;IAQjB,SAAS,CACb,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC;YAQT,UAAU;CAwCzB"}