@jiordikengne/velar 0.1.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 (96) hide show
  1. package/README.md +123 -0
  2. package/dist/commands/add.js +85 -0
  3. package/dist/commands/add.js.map +1 -0
  4. package/dist/commands/init-handlers.js +138 -0
  5. package/dist/commands/init-handlers.js.map +1 -0
  6. package/dist/commands/init-new.js +126 -0
  7. package/dist/commands/init-new.js.map +1 -0
  8. package/dist/commands/init-old.js +218 -0
  9. package/dist/commands/init-old.js.map +1 -0
  10. package/dist/commands/init.js +125 -0
  11. package/dist/commands/init.js.map +1 -0
  12. package/dist/commands/list.js +69 -0
  13. package/dist/commands/list.js.map +1 -0
  14. package/dist/config/ConfigManager.js +89 -0
  15. package/dist/config/ConfigManager.js.map +1 -0
  16. package/dist/errors/ErrorHandler.js +42 -0
  17. package/dist/errors/ErrorHandler.js.map +1 -0
  18. package/dist/errors/errors.js +45 -0
  19. package/dist/errors/errors.js.map +1 -0
  20. package/dist/index.js +30 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/registry/blue.css +0 -0
  23. package/dist/registry/green.css +0 -0
  24. package/dist/registry/neutral.css +29 -0
  25. package/dist/registry/orange.css +0 -0
  26. package/dist/registry/red.css +0 -0
  27. package/dist/registry/rose.css +0 -0
  28. package/dist/registry/themes/blue.css +0 -0
  29. package/dist/registry/themes/green.css +0 -0
  30. package/dist/registry/themes/neutral.css +29 -0
  31. package/dist/registry/themes/orange.css +0 -0
  32. package/dist/registry/themes/red.css +0 -0
  33. package/dist/registry/themes/rose.css +0 -0
  34. package/dist/registry/themes/violet.css +0 -0
  35. package/dist/registry/themes/yellow.css +0 -0
  36. package/dist/registry/violet.css +0 -0
  37. package/dist/registry/yellow.css +0 -0
  38. package/dist/services/AddService.js +98 -0
  39. package/dist/services/AddService.js.map +1 -0
  40. package/dist/services/ComponentService.js +167 -0
  41. package/dist/services/ComponentService.js.map +1 -0
  42. package/dist/services/FileSystemService.js +51 -0
  43. package/dist/services/FileSystemService.js.map +1 -0
  44. package/dist/services/HttpService.js +181 -0
  45. package/dist/services/HttpService.js.map +1 -0
  46. package/dist/services/InitService.js +182 -0
  47. package/dist/services/InitService.js.map +1 -0
  48. package/dist/services/ListService.js +52 -0
  49. package/dist/services/ListService.js.map +1 -0
  50. package/dist/services/RegistryService.js +85 -0
  51. package/dist/services/RegistryService.js.map +1 -0
  52. package/dist/types/index.js +2 -0
  53. package/dist/types/index.js.map +1 -0
  54. package/dist/types/interfaces.js +2 -0
  55. package/dist/types/interfaces.js.map +1 -0
  56. package/dist/types/meta.js +2 -0
  57. package/dist/types/meta.js.map +1 -0
  58. package/dist/types/registry.js +2 -0
  59. package/dist/types/registry.js.map +1 -0
  60. package/dist/utils/alpine-installer.js +46 -0
  61. package/dist/utils/alpine-installer.js.map +1 -0
  62. package/dist/utils/config.js +21 -0
  63. package/dist/utils/config.js.map +1 -0
  64. package/dist/utils/css.js +53 -0
  65. package/dist/utils/css.js.map +1 -0
  66. package/dist/utils/deps.js +24 -0
  67. package/dist/utils/deps.js.map +1 -0
  68. package/dist/utils/environment.js +8 -0
  69. package/dist/utils/environment.js.map +1 -0
  70. package/dist/utils/errors.js +21 -0
  71. package/dist/utils/errors.js.map +1 -0
  72. package/dist/utils/filesystem.js +14 -0
  73. package/dist/utils/filesystem.js.map +1 -0
  74. package/dist/utils/js.js +63 -0
  75. package/dist/utils/js.js.map +1 -0
  76. package/dist/utils/laravel.js +9 -0
  77. package/dist/utils/laravel.js.map +1 -0
  78. package/dist/utils/logger.js +47 -0
  79. package/dist/utils/logger.js.map +1 -0
  80. package/dist/utils/package-manager.js +23 -0
  81. package/dist/utils/package-manager.js.map +1 -0
  82. package/dist/utils/registry.js +17 -0
  83. package/dist/utils/registry.js.map +1 -0
  84. package/dist/utils/remote-registry.js +162 -0
  85. package/dist/utils/remote-registry.js.map +1 -0
  86. package/dist/utils/requirements.js +75 -0
  87. package/dist/utils/requirements.js.map +1 -0
  88. package/dist/utils/spinner.js +40 -0
  89. package/dist/utils/spinner.js.map +1 -0
  90. package/dist/utils/tailwind.js +31 -0
  91. package/dist/utils/tailwind.js.map +1 -0
  92. package/dist/utils/theme.js +32 -0
  93. package/dist/utils/theme.js.map +1 -0
  94. package/dist/utils/type-conversion.js +2 -0
  95. package/dist/utils/type-conversion.js.map +1 -0
  96. package/package.json +64 -0
@@ -0,0 +1,218 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import prompts from "prompts";
4
+ import { isLaravelProject } from "../utils/laravel.js";
5
+ import { readPackageJson, detectTailwindV4 } from "../utils/tailwind.js";
6
+ import { hasAlpineJs, hasLivewire, hasInteractivitySupport, } from "../utils/requirements.js";
7
+ import { detectPackageManager } from "../utils/package-manager.js";
8
+ import { findMainCss, hasTailwindImport, injectVelarImport, } from "../utils/css.js";
9
+ import { THEMES, copyTheme } from "../utils/theme.js";
10
+ import { writeVelarConfig } from "../utils/config.js";
11
+ import fs from "fs";
12
+ import { logger } from "../utils/logger.js";
13
+ import { withSpinner } from "../utils/spinner.js";
14
+ import { FileSystemService } from "../services/FileSystemService.js";
15
+ import { installAlpineJs, addAlpineToAppJs, } from "../utils/alpine-installer.js";
16
+ export default function registerInitCommand(program) {
17
+ program
18
+ .command("init")
19
+ .description("Initialize Velar in a Laravel project")
20
+ .option("-t, --theme <theme>", "Theme to use (default, dark, etc.)")
21
+ .option("-p, --package-manager <pm>", "Package manager (npm, yarn, pnpm, bun)")
22
+ .action(async (options) => {
23
+ try {
24
+ const fileSystem = new FileSystemService();
25
+ // 1. Laravel detection
26
+ if (!isLaravelProject()) {
27
+ logger.error("This is not a Laravel project");
28
+ logger.step("Run velar init at the root of a Laravel project");
29
+ return;
30
+ }
31
+ logger.success("Laravel project detected");
32
+ // 2. Interactivity detection and installation
33
+ let hasAlpine = hasAlpineJs();
34
+ const hasLivewireSupport = hasLivewire();
35
+ const detectedPm = detectPackageManager();
36
+ let interactivityConfig = {
37
+ framework: "none",
38
+ source: "existing",
39
+ };
40
+ if (!hasInteractivitySupport()) {
41
+ logger.warning("No interactivity framework detected");
42
+ logger.info("Velar components work best with Alpine.js or Livewire");
43
+ const res = await prompts({
44
+ type: "confirm",
45
+ name: "installAlpine",
46
+ message: "Would you like to install Alpine.js?",
47
+ initial: true,
48
+ });
49
+ if (res.installAlpine) {
50
+ logger.info(`Installing Alpine.js with ${detectedPm}...`);
51
+ const success = await withSpinner("Installing Alpine.js...", () => installAlpineJs(detectedPm));
52
+ if (success) {
53
+ await withSpinner("Adding Alpine.js to app.js...", () => addAlpineToAppJs());
54
+ hasAlpine = true;
55
+ interactivityConfig = {
56
+ framework: "alpine",
57
+ source: "npm",
58
+ };
59
+ logger.success("Alpine.js ready!");
60
+ }
61
+ }
62
+ else {
63
+ logger.info("You can install it later:");
64
+ logger.step(`${detectedPm} add alpinejs`);
65
+ }
66
+ }
67
+ else if (hasAlpine) {
68
+ interactivityConfig = {
69
+ framework: "alpine",
70
+ source: "existing",
71
+ };
72
+ logger.success("Alpine.js detected - components will be fully interactive");
73
+ }
74
+ else if (hasLivewireSupport) {
75
+ interactivityConfig = {
76
+ framework: "livewire",
77
+ source: "existing",
78
+ };
79
+ logger.success("Livewire detected - components will work with Livewire");
80
+ }
81
+ // 3. Tailwind v4 detection
82
+ const pkg = readPackageJson();
83
+ if (!pkg || !detectTailwindV4(pkg)) {
84
+ logger.error("Tailwind CSS v4 not detected");
85
+ logger.step("Velar requires Tailwind CSS v4+");
86
+ return;
87
+ }
88
+ logger.success("Tailwind CSS v4 detected");
89
+ // 4. Find main CSS
90
+ const css = findMainCss();
91
+ const hasCss = Boolean(css);
92
+ const canInject = css ? hasTailwindImport(css.content) : false;
93
+ if (!hasCss) {
94
+ logger.warning("No main CSS file found");
95
+ logger.step("Styles will be created but not auto-imported");
96
+ }
97
+ else if (!canInject) {
98
+ logger.warning("Tailwind import not found in CSS");
99
+ logger.step("Velar styles will not be auto-imported");
100
+ }
101
+ // 5. Choose package manager
102
+ let packageManager = options.packageManager;
103
+ if (!packageManager) {
104
+ const pmPrompt = await prompts({
105
+ type: "select",
106
+ name: "packageManager",
107
+ message: "Which package manager are you using?",
108
+ choices: [
109
+ { title: "npm", value: "npm" },
110
+ { title: "yarn", value: "yarn" },
111
+ { title: "pnpm", value: "pnpm" },
112
+ { title: "bun", value: "bun" },
113
+ ],
114
+ initial: ["npm", "yarn", "pnpm", "bun"].indexOf(detectedPm) >= 0
115
+ ? ["npm", "yarn", "pnpm", "bun"].indexOf(detectedPm)
116
+ : 0,
117
+ });
118
+ packageManager = pmPrompt.packageManager;
119
+ }
120
+ if (!packageManager) {
121
+ logger.error("Package manager selection cancelled");
122
+ return;
123
+ }
124
+ // 6. Choose theme
125
+ let theme = options.theme;
126
+ if (!theme) {
127
+ const themePrompt = await prompts({
128
+ type: "select",
129
+ name: "theme",
130
+ message: "Choose a theme:",
131
+ choices: THEMES.map((t) => ({ title: t, value: t })),
132
+ initial: 0,
133
+ });
134
+ theme = themePrompt.theme;
135
+ }
136
+ if (!theme) {
137
+ logger.error("Theme selection cancelled");
138
+ return;
139
+ }
140
+ // 7. Create directories with spinner
141
+ await withSpinner("Creating directories...", async () => {
142
+ const uiDir = "resources/views/components/ui";
143
+ await fileSystem.ensureDir(uiDir);
144
+ const velarCssPath = "resources/css/velar.css";
145
+ await fileSystem.ensureDir(velarCssPath.split("/").slice(0, -1).join("/"));
146
+ });
147
+ // 8. Create velar.css from theme
148
+ const velarCssPath = "resources/css/velar.css";
149
+ if (!fs.existsSync(velarCssPath)) {
150
+ await withSpinner("Creating theme file...", async () => {
151
+ copyTheme(theme, velarCssPath);
152
+ });
153
+ logger.success("Theme created");
154
+ logger.info("resources/css/velar.css");
155
+ }
156
+ else {
157
+ logger.info("velar.css already exists");
158
+ }
159
+ // 9. Inject import if possible
160
+ let importDone = false;
161
+ if (hasCss && canInject) {
162
+ const res = await prompts({
163
+ type: "confirm",
164
+ name: "import",
165
+ message: "Import Velar styles into your main CSS file?",
166
+ initial: true,
167
+ });
168
+ if (res.import) {
169
+ await withSpinner("Importing styles...", async () => {
170
+ injectVelarImport(css.path);
171
+ });
172
+ importDone = true;
173
+ logger.success("Styles imported");
174
+ logger.info(css.path);
175
+ }
176
+ }
177
+ // 10. Generate velar.json config
178
+ const config = {
179
+ version: "0.1",
180
+ theme,
181
+ packageManager,
182
+ interactivity: interactivityConfig,
183
+ css: {
184
+ entry: hasCss ? css.path : "",
185
+ velar: "resources/css/velar.css",
186
+ },
187
+ components: {
188
+ path: "resources/views/components/ui",
189
+ },
190
+ };
191
+ await withSpinner("Creating configuration...", async () => {
192
+ writeVelarConfig(config);
193
+ });
194
+ logger.success("Configuration created");
195
+ // 11. Summary
196
+ logger.blank();
197
+ logger.success("✨ Velar initialized successfully!");
198
+ logger.blank();
199
+ logger.info("What's ready:");
200
+ logger.step(`• Theme: ${theme}`);
201
+ logger.step(`• Package manager: ${packageManager}`);
202
+ logger.step(`• Interactivity: ${interactivityConfig.framework} (${interactivityConfig.source})`);
203
+ logger.step("• UI components directory");
204
+ logger.step(`• Styles: ${importDone ? "imported" : "ready"}`);
205
+ logger.blank();
206
+ logger.info("Next steps:");
207
+ logger.step("• Add components: velar add button");
208
+ logger.step("• List components: velar list");
209
+ logger.blank();
210
+ logger.success("Happy coding! 🚀");
211
+ }
212
+ catch (error) {
213
+ logger.error("Initialization failed", error.message);
214
+ process.exit(1);
215
+ }
216
+ });
217
+ }
218
+ //# sourceMappingURL=init-old.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-old.js","sourceRoot":"","sources":["../../src/commands/init-old.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,125 @@
1
+ import { Command } from "commander";
2
+ import * as p from "@clack/prompts";
3
+ import { logger } from "../utils/logger.js";
4
+ import { FileSystemService } from "../services/FileSystemService.js";
5
+ import { InitService } from "../services/InitService.js";
6
+ import { THEMES } from "../utils/theme.js";
7
+ /**
8
+ * Prompt user to select package manager
9
+ * @param detectedPm - Detected package manager
10
+ * @returns Selected package manager or undefined if aborted
11
+ */
12
+ async function promptPackageManager(detectedPm) {
13
+ const packageManager = await p.select({
14
+ message: "Which package manager are you using?",
15
+ options: [
16
+ { label: "npm", value: "npm" },
17
+ { label: "yarn", value: "yarn" },
18
+ { label: "pnpm", value: "pnpm" },
19
+ { label: "bun", value: "bun" },
20
+ ],
21
+ initialValue: detectedPm,
22
+ });
23
+ if (p.isCancel(packageManager)) {
24
+ return undefined;
25
+ }
26
+ return packageManager;
27
+ }
28
+ /**
29
+ * Prompt user to select theme
30
+ * @returns Selected theme or undefined if aborted
31
+ */
32
+ async function promptTheme() {
33
+ const theme = await p.select({
34
+ message: "Choose a base color theme",
35
+ options: THEMES.map((t) => ({
36
+ label: t.charAt(0).toUpperCase() + t.slice(1),
37
+ value: t,
38
+ })),
39
+ });
40
+ if (p.isCancel(theme)) {
41
+ return undefined;
42
+ }
43
+ return theme;
44
+ }
45
+ /**
46
+ * Prompt user to confirm style import
47
+ * @returns True if user wants to import styles
48
+ */
49
+ async function promptStyleImport() {
50
+ const shouldImport = await p.confirm({
51
+ message: "Import Velar styles into your main CSS file?",
52
+ initialValue: true,
53
+ });
54
+ if (p.isCancel(shouldImport)) {
55
+ return false;
56
+ }
57
+ return shouldImport;
58
+ }
59
+ /**
60
+ * Register the 'init' command with the CLI program
61
+ * @param program - Commander program instance
62
+ */
63
+ export default function registerInitCommand(program) {
64
+ program
65
+ .command("init")
66
+ .description("Initialize Velar in a Laravel project")
67
+ .action(async () => {
68
+ const fileSystem = new FileSystemService();
69
+ const initService = new InitService(fileSystem);
70
+ try {
71
+ // 1. Validate environment
72
+ const validation = initService.validateEnvironment();
73
+ initService.displayEnvironmentInfo(validation);
74
+ // 2. Prompt for package manager
75
+ const packageManager = await promptPackageManager(validation.detectedPackageManager);
76
+ if (!packageManager) {
77
+ logger.error("Package manager selection aborted");
78
+ process.exit(1);
79
+ }
80
+ // 3. Prompt for theme
81
+ const theme = await promptTheme();
82
+ if (!theme) {
83
+ logger.error("Theme selection aborted");
84
+ process.exit(1);
85
+ }
86
+ // 4. Create directories and files
87
+ await initService.createComponentsDirectory();
88
+ await initService.createThemeFile(theme);
89
+ // 5. Handle style import
90
+ let stylesImported = false;
91
+ if (validation.cssFile && validation.canInjectCss) {
92
+ const shouldImport = await promptStyleImport();
93
+ if (shouldImport) {
94
+ await initService.injectStylesImport(validation.cssFile.path);
95
+ stylesImported = true;
96
+ }
97
+ }
98
+ // 6. Generate configuration
99
+ await initService.generateConfig({
100
+ packageManager,
101
+ theme,
102
+ importStyles: stylesImported,
103
+ }, validation);
104
+ // 7. Display summary
105
+ initService.displaySummary({
106
+ packageManager,
107
+ theme,
108
+ importStyles: stylesImported,
109
+ }, validation, stylesImported);
110
+ }
111
+ catch (error) {
112
+ logger.error(error.message);
113
+ if (error instanceof Error) {
114
+ if (error.message.includes("Laravel project")) {
115
+ logger.step("Run velar init at the root of a Laravel project");
116
+ }
117
+ else if (error.message.includes("Tailwind")) {
118
+ logger.step("Velar requires Tailwind CSS v4+");
119
+ }
120
+ }
121
+ process.exit(1);
122
+ }
123
+ });
124
+ }
125
+ //# 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,69 @@
1
+ import chalk from "chalk";
2
+ import { Command } from "commander";
3
+ import Table from "cli-table3";
4
+ import { ConfigManager } from "../config/ConfigManager.js";
5
+ import { ErrorHandler } from "../errors/ErrorHandler.js";
6
+ import { FileSystemService } from "../services/FileSystemService.js";
7
+ import { RegistryService } from "../services/RegistryService.js";
8
+ import { ListService } from "../services/ListService.js";
9
+ import { logger } from "../utils/logger.js";
10
+ /**
11
+ * Register the 'list' command with the CLI program
12
+ * @param program - Commander program instance
13
+ */
14
+ export default function registerListCommand(program) {
15
+ program
16
+ .command("list")
17
+ .description("List available UI components from the registry")
18
+ .action(async () => {
19
+ const errorHandler = new ErrorHandler();
20
+ try {
21
+ // 1. Initialize services
22
+ const registryService = new RegistryService();
23
+ const configManager = new ConfigManager();
24
+ const fileSystem = new FileSystemService();
25
+ const listService = new ListService(registryService, configManager, fileSystem);
26
+ // 2. Fetch registry (spinner handle inside registryService)
27
+ const registry = await listService.fetchRegistry();
28
+ if (registry.components.length === 0) {
29
+ logger.warning("No components found in the registry.");
30
+ return;
31
+ }
32
+ console.log(chalk.bold("\nAvailable components:"));
33
+ console.log("");
34
+ const sortedComponents = listService.sortComponents(registry.components);
35
+ const table = new Table({
36
+ head: [
37
+ chalk.bold("Component"),
38
+ chalk.bold("Status"),
39
+ chalk.bold("Description"),
40
+ ],
41
+ colWidths: [20, 15, 50],
42
+ wordWrap: true,
43
+ style: {
44
+ head: [],
45
+ border: [],
46
+ },
47
+ });
48
+ for (const component of sortedComponents) {
49
+ const isInstalled = await listService.isComponentInstalled(component);
50
+ const status = isInstalled
51
+ ? chalk.green("Installed")
52
+ : chalk.gray("-");
53
+ table.push([
54
+ chalk.cyan(component.name),
55
+ status,
56
+ chalk.white(component.description || "No description"),
57
+ ]);
58
+ }
59
+ console.log(table.toString());
60
+ console.log("");
61
+ logger.info(`Run ${chalk.green("velar add <component>")} to add a component to your project.`);
62
+ }
63
+ catch (error) {
64
+ errorHandler.handle(error, "list command");
65
+ process.exit(1);
66
+ }
67
+ });
68
+ }
69
+ //# 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,89 @@
1
+ import { readVelarConfig } from "../utils/config.js";
2
+ import { logger } from "../utils/logger.js";
3
+ /**
4
+ * Manages Velar configuration loading and access
5
+ */
6
+ export class ConfigManager {
7
+ config;
8
+ /**
9
+ * Load configuration from file
10
+ * @returns Promise resolving to configuration
11
+ * @throws Error if configuration not found or invalid
12
+ */
13
+ async load() {
14
+ try {
15
+ this.config = readVelarConfig();
16
+ if (!this.config) {
17
+ throw new Error("Configuration not found");
18
+ }
19
+ return this.config;
20
+ }
21
+ catch (error) {
22
+ logger.error("Failed to load configuration", error.message);
23
+ throw error;
24
+ }
25
+ }
26
+ /**
27
+ * Get the package manager from config
28
+ * @returns Package manager name
29
+ * @throws Error if config not loaded
30
+ */
31
+ getPackageManager() {
32
+ if (!this.config) {
33
+ throw new Error("Configuration not loaded");
34
+ }
35
+ return (this.config.packageManager || "npm");
36
+ }
37
+ /**
38
+ * Validate that configuration is loaded
39
+ * @returns True if configuration is valid
40
+ */
41
+ validate() {
42
+ return !!this.config;
43
+ }
44
+ /**
45
+ * Get the components path from config
46
+ * @returns Components directory path
47
+ * @throws Error if config not loaded
48
+ */
49
+ getComponentsPath() {
50
+ if (!this.config) {
51
+ throw new Error("Configuration not loaded");
52
+ }
53
+ return this.config.components.path;
54
+ }
55
+ /**
56
+ * Get the theme CSS path from config
57
+ * @returns Theme CSS file path
58
+ * @throws Error if config not loaded
59
+ */
60
+ getThemePath() {
61
+ if (!this.config) {
62
+ throw new Error("Configuration not loaded");
63
+ }
64
+ return this.config.css.velar;
65
+ }
66
+ /**
67
+ * Get the JS entry path from config
68
+ * @returns JS entry file path
69
+ * @throws Error if config not loaded
70
+ */
71
+ getJsEntryPath() {
72
+ if (!this.config) {
73
+ throw new Error("Configuration not loaded");
74
+ }
75
+ return this.config.js?.entry ?? "";
76
+ }
77
+ /**
78
+ * Get the selected theme from config
79
+ * @returns Theme name
80
+ * @throws Error if config not loaded
81
+ */
82
+ getTheme() {
83
+ if (!this.config) {
84
+ throw new Error("Configuration not loaded");
85
+ }
86
+ return this.config.theme;
87
+ }
88
+ }
89
+ //# sourceMappingURL=ConfigManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigManager.js","sourceRoot":"","sources":["../../src/config/ConfigManager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C;;GAEG;AACH,MAAM,OAAO,aAAa;IAChB,MAAM,CAAe;IAE7B;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,IAAI,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,8BAA8B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YACvE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,KAAK,CAAmB,CAAC;IACjE,CAAC;IAED;;;OAGG;IACH,QAAQ;QACN,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,iBAAiB;QACf,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,YAAY;QACV,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;IAC/B,CAAC;IAED;;;;OAIG;IACH,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC;IACrC,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAmB,CAAC;IACzC,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Custom error class for Velar-specific errors with code and context
3
+ */
4
+ export class VelarError extends Error {
5
+ code;
6
+ context;
7
+ /**
8
+ * Create a new VelarError
9
+ * @param message - Error message
10
+ * @param code - Error code for categorization
11
+ * @param context - Additional context data
12
+ */
13
+ constructor(message, code, context) {
14
+ super(message);
15
+ this.code = code;
16
+ this.context = context;
17
+ this.name = "VelarError";
18
+ }
19
+ }
20
+ /**
21
+ * Handles and formats errors for display
22
+ */
23
+ export class ErrorHandler {
24
+ /**
25
+ * Handle an error and display it appropriately
26
+ * @param error - Error to handle
27
+ * @param context - Context where the error occurred
28
+ */
29
+ handle(error, context) {
30
+ if (error instanceof VelarError) {
31
+ console.error(`[${error.code}] ${error.message}`);
32
+ if (error.context) {
33
+ console.error("Context:", error.context);
34
+ }
35
+ }
36
+ else {
37
+ console.error(`Unexpected error in ${context}: ${error.message}`);
38
+ }
39
+ // Don't exit here, let the caller handle it
40
+ }
41
+ }
42
+ //# sourceMappingURL=ErrorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ErrorHandler.js","sourceRoot":"","sources":["../../src/errors/ErrorHandler.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IASjB;IACA;IATlB;;;;;OAKG;IACH,YACE,OAAe,EACC,IAAY,EACZ,OAA2C;QAE3D,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAoC;QAG3D,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC3B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IACvB;;;;OAIG;IACH,MAAM,CAAC,KAAY,EAAE,OAAe;QAClC,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,uBAAuB,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,4CAA4C;IAC9C,CAAC;CACF"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Base error class for registry-related errors
3
+ */
4
+ export class RegistryError extends Error {
5
+ cause;
6
+ /**
7
+ * Create a new RegistryError
8
+ * @param message - Error message
9
+ * @param cause - Original error that caused this error
10
+ */
11
+ constructor(message, cause) {
12
+ super(message);
13
+ this.cause = cause;
14
+ this.name = "RegistryError";
15
+ }
16
+ }
17
+ /**
18
+ * Error thrown when a network request fails
19
+ */
20
+ export class NetworkError extends RegistryError {
21
+ /**
22
+ * Create a new NetworkError
23
+ * @param message - Error message
24
+ * @param cause - Original error that caused this error
25
+ */
26
+ constructor(message, cause) {
27
+ super(message, cause);
28
+ this.name = "NetworkError";
29
+ }
30
+ }
31
+ /**
32
+ * Error thrown when a component is not found in the registry
33
+ */
34
+ export class ComponentNotFoundError extends RegistryError {
35
+ /**
36
+ * Create a new ComponentNotFoundError
37
+ * @param componentName - Name of the component that was not found
38
+ * @param cause - Original error that caused this error
39
+ */
40
+ constructor(componentName, cause) {
41
+ super(`Component "${componentName}" not found`, cause);
42
+ this.name = "ComponentNotFoundError";
43
+ }
44
+ }
45
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,KAAK;IAQpB;IAPlB;;;;OAIG;IACH,YACE,OAAe,EACC,KAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAFC,UAAK,GAAL,KAAK,CAAQ;QAG7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,YAAa,SAAQ,aAAa;IAC7C;;;;OAIG;IACH,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;GAEG;AACH,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD;;;;OAIG;IACH,YAAY,aAAqB,EAAE,KAAa;QAC9C,KAAK,CAAC,cAAc,aAAa,aAAa,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
package/dist/index.js ADDED
@@ -0,0 +1,30 @@
1
+ import chalk from "chalk";
2
+ import { Command } from "commander";
3
+ import registerInitCommand from "./commands/init.js";
4
+ import registerAddCommand from "./commands/add.js";
5
+ import registerListCommand from "./commands/list.js";
6
+ /**
7
+ * Display a nice introduction banner
8
+ */
9
+ function displayIntro() {
10
+ console.log("");
11
+ console.log(chalk.bold.cyan(" ▼ VELAR CLI v0.1.0"));
12
+ console.log(chalk.gray(" Tailwind CSS v4+ components for Laravel"));
13
+ console.log("");
14
+ }
15
+ /**
16
+ * Velar CLI program entry point
17
+ */
18
+ const program = new Command();
19
+ program
20
+ .name("velar")
21
+ .description("Velar CLI: Copy UI components into your Laravel project")
22
+ .version("0.1.0")
23
+ .hook("preAction", () => {
24
+ displayIntro();
25
+ });
26
+ registerInitCommand(program);
27
+ registerAddCommand(program);
28
+ registerListCommand(program);
29
+ program.parse(process.argv);
30
+ //# sourceMappingURL=index.js.map