@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.
- package/README.md +123 -0
- package/dist/commands/add.js +85 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/init-handlers.js +138 -0
- package/dist/commands/init-handlers.js.map +1 -0
- package/dist/commands/init-new.js +126 -0
- package/dist/commands/init-new.js.map +1 -0
- package/dist/commands/init-old.js +218 -0
- package/dist/commands/init-old.js.map +1 -0
- package/dist/commands/init.js +125 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.js +69 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/config/ConfigManager.js +89 -0
- package/dist/config/ConfigManager.js.map +1 -0
- package/dist/errors/ErrorHandler.js +42 -0
- package/dist/errors/ErrorHandler.js.map +1 -0
- package/dist/errors/errors.js +45 -0
- package/dist/errors/errors.js.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/blue.css +0 -0
- package/dist/registry/green.css +0 -0
- package/dist/registry/neutral.css +29 -0
- package/dist/registry/orange.css +0 -0
- package/dist/registry/red.css +0 -0
- package/dist/registry/rose.css +0 -0
- package/dist/registry/themes/blue.css +0 -0
- package/dist/registry/themes/green.css +0 -0
- package/dist/registry/themes/neutral.css +29 -0
- package/dist/registry/themes/orange.css +0 -0
- package/dist/registry/themes/red.css +0 -0
- package/dist/registry/themes/rose.css +0 -0
- package/dist/registry/themes/violet.css +0 -0
- package/dist/registry/themes/yellow.css +0 -0
- package/dist/registry/violet.css +0 -0
- package/dist/registry/yellow.css +0 -0
- package/dist/services/AddService.js +98 -0
- package/dist/services/AddService.js.map +1 -0
- package/dist/services/ComponentService.js +167 -0
- package/dist/services/ComponentService.js.map +1 -0
- package/dist/services/FileSystemService.js +51 -0
- package/dist/services/FileSystemService.js.map +1 -0
- package/dist/services/HttpService.js +181 -0
- package/dist/services/HttpService.js.map +1 -0
- package/dist/services/InitService.js +182 -0
- package/dist/services/InitService.js.map +1 -0
- package/dist/services/ListService.js +52 -0
- package/dist/services/ListService.js.map +1 -0
- package/dist/services/RegistryService.js +85 -0
- package/dist/services/RegistryService.js.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/interfaces.js +2 -0
- package/dist/types/interfaces.js.map +1 -0
- package/dist/types/meta.js +2 -0
- package/dist/types/meta.js.map +1 -0
- package/dist/types/registry.js +2 -0
- package/dist/types/registry.js.map +1 -0
- package/dist/utils/alpine-installer.js +46 -0
- package/dist/utils/alpine-installer.js.map +1 -0
- package/dist/utils/config.js +21 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/css.js +53 -0
- package/dist/utils/css.js.map +1 -0
- package/dist/utils/deps.js +24 -0
- package/dist/utils/deps.js.map +1 -0
- package/dist/utils/environment.js +8 -0
- package/dist/utils/environment.js.map +1 -0
- package/dist/utils/errors.js +21 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/filesystem.js +14 -0
- package/dist/utils/filesystem.js.map +1 -0
- package/dist/utils/js.js +63 -0
- package/dist/utils/js.js.map +1 -0
- package/dist/utils/laravel.js +9 -0
- package/dist/utils/laravel.js.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-manager.js +23 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/registry.js +17 -0
- package/dist/utils/registry.js.map +1 -0
- package/dist/utils/remote-registry.js +162 -0
- package/dist/utils/remote-registry.js.map +1 -0
- package/dist/utils/requirements.js +75 -0
- package/dist/utils/requirements.js.map +1 -0
- package/dist/utils/spinner.js +40 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/tailwind.js +31 -0
- package/dist/utils/tailwind.js.map +1 -0
- package/dist/utils/theme.js +32 -0
- package/dist/utils/theme.js.map +1 -0
- package/dist/utils/type-conversion.js +2 -0
- package/dist/utils/type-conversion.js.map +1 -0
- 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
|