@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,182 @@
|
|
|
1
|
+
import { isLaravelProject } from "../utils/laravel.js";
|
|
2
|
+
import { readPackageJson, detectTailwindV4 } from "../utils/tailwind.js";
|
|
3
|
+
import { hasAlpineJs, hasLivewire, hasInteractivitySupport, } from "../utils/requirements.js";
|
|
4
|
+
import { detectPackageManager } from "../utils/package-manager.js";
|
|
5
|
+
import { findMainCss, hasTailwindImport, injectVelarImport, } from "../utils/css.js";
|
|
6
|
+
import { findMainJs } from "../utils/js.js";
|
|
7
|
+
import { copyTheme } from "../utils/theme.js";
|
|
8
|
+
import { writeVelarConfig } from "../utils/config.js";
|
|
9
|
+
import fs from "fs";
|
|
10
|
+
import { logger } from "../utils/logger.js";
|
|
11
|
+
/**
|
|
12
|
+
* Service for handling Velar initialization
|
|
13
|
+
*/
|
|
14
|
+
export class InitService {
|
|
15
|
+
fileSystem;
|
|
16
|
+
/**
|
|
17
|
+
* Create a new InitService instance
|
|
18
|
+
* @param fileSystem - File system service
|
|
19
|
+
*/
|
|
20
|
+
constructor(fileSystem) {
|
|
21
|
+
this.fileSystem = fileSystem;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Validate the project environment
|
|
25
|
+
* @returns Environment validation result
|
|
26
|
+
* @throws Error if critical requirements are not met
|
|
27
|
+
*/
|
|
28
|
+
validateEnvironment() {
|
|
29
|
+
// Validate Laravel project
|
|
30
|
+
if (!isLaravelProject()) {
|
|
31
|
+
throw new Error("No Laravel project detected");
|
|
32
|
+
}
|
|
33
|
+
// Check Tailwind v4
|
|
34
|
+
const pkg = readPackageJson();
|
|
35
|
+
if (!pkg || !detectTailwindV4(pkg)) {
|
|
36
|
+
throw new Error("Tailwind CSS v4 was not detected");
|
|
37
|
+
}
|
|
38
|
+
// Check interactivity frameworks
|
|
39
|
+
const hasAlpine = hasAlpineJs();
|
|
40
|
+
const hasLivewireSupport = hasLivewire();
|
|
41
|
+
const detectedPm = detectPackageManager();
|
|
42
|
+
// Find CSS and JS files
|
|
43
|
+
const css = findMainCss();
|
|
44
|
+
const js = findMainJs();
|
|
45
|
+
const canInject = css ? hasTailwindImport(css.content) : false;
|
|
46
|
+
return {
|
|
47
|
+
isLaravel: true,
|
|
48
|
+
hasTailwindV4: true,
|
|
49
|
+
hasAlpine,
|
|
50
|
+
hasLivewire: hasLivewireSupport,
|
|
51
|
+
detectedPackageManager: detectedPm,
|
|
52
|
+
cssFile: css,
|
|
53
|
+
jsFile: js,
|
|
54
|
+
canInjectCss: canInject,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Display environment information and warnings
|
|
59
|
+
* @param validation - Environment validation result
|
|
60
|
+
*/
|
|
61
|
+
displayEnvironmentInfo(validation) {
|
|
62
|
+
// Display interactivity framework status
|
|
63
|
+
if (!hasInteractivitySupport()) {
|
|
64
|
+
logger.warning("No interactivity framework detected");
|
|
65
|
+
logger.step("Velar components work best with Alpine.js or Livewire");
|
|
66
|
+
logger.step(`Install Alpine.js: ${validation.detectedPackageManager} install alpinejs`);
|
|
67
|
+
logger.step("Or install Livewire: composer require livewire/livewire");
|
|
68
|
+
}
|
|
69
|
+
else if (validation.hasAlpine) {
|
|
70
|
+
logger.success("Alpine.js detected - components will be fully interactive");
|
|
71
|
+
}
|
|
72
|
+
else if (validation.hasLivewire) {
|
|
73
|
+
logger.success("Livewire detected - components will work with Livewire");
|
|
74
|
+
}
|
|
75
|
+
// Display CSS file status
|
|
76
|
+
if (!validation.cssFile) {
|
|
77
|
+
logger.warning("No main CSS file found");
|
|
78
|
+
logger.step("Styles will be created but not auto-imported");
|
|
79
|
+
}
|
|
80
|
+
else if (!validation.canInjectCss) {
|
|
81
|
+
logger.warning("Tailwind import not found in CSS");
|
|
82
|
+
logger.step("Velar styles will not be auto-imported");
|
|
83
|
+
}
|
|
84
|
+
// Display JS file status
|
|
85
|
+
if (!validation.jsFile) {
|
|
86
|
+
logger.warning("No main JS file found");
|
|
87
|
+
logger.step("Component scripts will not be auto-imported");
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Create the UI components directory
|
|
92
|
+
* @param path - Directory path (default: "resources/views/components/ui")
|
|
93
|
+
* @returns Promise that resolves when directory is created
|
|
94
|
+
*/
|
|
95
|
+
async createComponentsDirectory(path = "resources/views/components/ui") {
|
|
96
|
+
await this.fileSystem.ensureDir(path);
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create the Velar theme CSS file
|
|
100
|
+
* @param theme - Theme to use
|
|
101
|
+
* @param targetPath - Target CSS file path (default: "resources/css/velar.css")
|
|
102
|
+
* @returns Promise that resolves when theme is created
|
|
103
|
+
* @throws Error if theme creation fails
|
|
104
|
+
*/
|
|
105
|
+
async createThemeFile(theme, targetPath = "resources/css/velar.css") {
|
|
106
|
+
// Ensure directory exists
|
|
107
|
+
const dirPath = targetPath.split("/").slice(0, -1).join("/");
|
|
108
|
+
await this.fileSystem.ensureDir(dirPath);
|
|
109
|
+
// Create theme file if it doesn't exist
|
|
110
|
+
if (!fs.existsSync(targetPath)) {
|
|
111
|
+
try {
|
|
112
|
+
copyTheme(theme, targetPath);
|
|
113
|
+
logger.success("Velar theme created");
|
|
114
|
+
logger.info(targetPath);
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
throw new Error(`Failed to create theme file: ${error.message}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
logger.info("velar.css already exists");
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Inject Velar styles import into main CSS file
|
|
126
|
+
* @param cssPath - Path to main CSS file
|
|
127
|
+
* @returns Promise that resolves when import is injected
|
|
128
|
+
*/
|
|
129
|
+
async injectStylesImport(cssPath) {
|
|
130
|
+
injectVelarImport(cssPath);
|
|
131
|
+
logger.success("Velar styles imported");
|
|
132
|
+
logger.info(cssPath);
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Generate and write Velar configuration file
|
|
136
|
+
* @param options - Initialization options
|
|
137
|
+
* @param validation - Environment validation result
|
|
138
|
+
* @returns Promise that resolves when config is written
|
|
139
|
+
*/
|
|
140
|
+
async generateConfig(options, validation) {
|
|
141
|
+
const config = {
|
|
142
|
+
version: "0.1",
|
|
143
|
+
theme: options.theme,
|
|
144
|
+
packageManager: options.packageManager,
|
|
145
|
+
css: {
|
|
146
|
+
entry: validation.cssFile?.path ?? "",
|
|
147
|
+
velar: "resources/css/velar.css",
|
|
148
|
+
},
|
|
149
|
+
js: {
|
|
150
|
+
entry: validation.jsFile?.path ?? "",
|
|
151
|
+
},
|
|
152
|
+
components: {
|
|
153
|
+
path: "resources/views/components/ui",
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
writeVelarConfig(config);
|
|
157
|
+
logger.success("velar.json config generated");
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Display initialization summary
|
|
161
|
+
* @param options - Initialization options
|
|
162
|
+
* @param validation - Environment validation result
|
|
163
|
+
* @param stylesImported - Whether styles were imported
|
|
164
|
+
*/
|
|
165
|
+
displaySummary(options, validation, stylesImported) {
|
|
166
|
+
console.log("\n---");
|
|
167
|
+
logger.success("Laravel project detected");
|
|
168
|
+
logger.success("Tailwind CSS v4 detected");
|
|
169
|
+
logger.success(`Theme selected: ${options.theme}`);
|
|
170
|
+
logger.success(`Package manager: ${options.packageManager}`);
|
|
171
|
+
logger.success("UI components directory ready");
|
|
172
|
+
if (validation.jsFile) {
|
|
173
|
+
logger.success("Main JS file detected");
|
|
174
|
+
}
|
|
175
|
+
logger.success(stylesImported ? "Styles import complete" : "Styles import pending");
|
|
176
|
+
logger.success("velar.json created");
|
|
177
|
+
console.log("\nNext steps:");
|
|
178
|
+
console.log(" velar add button");
|
|
179
|
+
console.log("\n💡 Want to customize your Tailwind palette? Try https://tweakcn.com/ — a visual generator for Tailwind-compatible color scales.");
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=InitService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InitService.js","sourceRoot":"","sources":["../../src/services/InitService.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EACL,WAAW,EACX,WAAW,EACX,uBAAuB,GACxB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAoC5C;;GAEG;AACH,MAAM,OAAO,WAAW;IAKO;IAJ7B;;;OAGG;IACH,YAA6B,UAA8B;QAA9B,eAAU,GAAV,UAAU,CAAoB;IAAG,CAAC;IAE/D;;;;OAIG;IACH,mBAAmB;QACjB,2BAA2B;QAC3B,IAAI,CAAC,gBAAgB,EAAE,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,oBAAoB;QACpB,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAC9B,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;QAED,iCAAiC;QACjC,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;QAChC,MAAM,kBAAkB,GAAG,WAAW,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,oBAAoB,EAAE,CAAC;QAE1C,wBAAwB;QACxB,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAE/D,OAAO;YACL,SAAS,EAAE,IAAI;YACf,aAAa,EAAE,IAAI;YACnB,SAAS;YACT,WAAW,EAAE,kBAAkB;YAC/B,sBAAsB,EAAE,UAAU;YAClC,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,SAAS;SACxB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,sBAAsB,CAAC,UAAiC;QACtD,yCAAyC;QACzC,IAAI,CAAC,uBAAuB,EAAE,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;YACrE,MAAM,CAAC,IAAI,CACT,sBAAsB,UAAU,CAAC,sBAAsB,mBAAmB,CAC3E,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;QACzE,CAAC;aAAM,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,OAAO,CACZ,2DAA2D,CAC5D,CAAC;QACJ,CAAC;aAAM,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,OAAO,CAAC,wDAAwD,CAAC,CAAC;QAC3E,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACxB,MAAM,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC9D,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;YACpC,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACxD,CAAC;QAED,yBAAyB;QACzB,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,yBAAyB,CAC7B,IAAI,GAAG,+BAA+B;QAEtC,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACxC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,eAAe,CACnB,KAAiB,EACjB,UAAU,GAAG,yBAAyB;QAEtC,0BAA0B;QAC1B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAEzC,wCAAwC;QACxC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;gBAC7B,MAAM,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;gBACtC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACb,gCAAiC,KAAe,CAAC,OAAO,EAAE,CAC3D,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,kBAAkB,CAAC,OAAe;QACtC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAClB,OAAoB,EACpB,UAAiC;QAEjC,MAAM,MAAM,GAAgB;YAC1B,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,GAAG,EAAE;gBACH,KAAK,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE;gBACrC,KAAK,EAAE,yBAAyB;aACjC;YACD,EAAE,EAAE;gBACF,KAAK,EAAE,UAAU,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE;aACrC;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,+BAA+B;aACtC;SACF,CAAC;QAEF,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;IAChD,CAAC;IAED;;;;;OAKG;IACH,cAAc,CACZ,OAAoB,EACpB,UAAiC,EACjC,cAAuB;QAEvB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAC;QAC3C,MAAM,CAAC,OAAO,CAAC,mBAAmB,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,CAAC,oBAAoB,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,OAAO,CAAC,+BAA+B,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtB,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAC1C,CAAC;QACD,MAAM,CAAC,OAAO,CACZ,cAAc,CAAC,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,uBAAuB,CACpE,CAAC;QACF,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CACT,mIAAmI,CACpI,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import path from "path";
|
|
2
|
+
import { RegistryService } from "./RegistryService.js";
|
|
3
|
+
import { ConfigManager } from "../config/ConfigManager.js";
|
|
4
|
+
import { FileSystemService } from "./FileSystemService.js";
|
|
5
|
+
/**
|
|
6
|
+
* Service for the business logic of the 'list' command
|
|
7
|
+
*/
|
|
8
|
+
export class ListService {
|
|
9
|
+
registryService;
|
|
10
|
+
configManager;
|
|
11
|
+
fileSystem;
|
|
12
|
+
constructor(registryService, configManager, fileSystem) {
|
|
13
|
+
this.registryService = registryService;
|
|
14
|
+
this.configManager = configManager;
|
|
15
|
+
this.fileSystem = fileSystem;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Fetches the component registry
|
|
19
|
+
* @returns Component registry
|
|
20
|
+
*/
|
|
21
|
+
async fetchRegistry() {
|
|
22
|
+
return await this.registryService.fetchRegistry();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Checks if a component is already installed in the project
|
|
26
|
+
* @param component - Component metadata
|
|
27
|
+
* @returns True if the component is installed
|
|
28
|
+
*/
|
|
29
|
+
async isComponentInstalled(component) {
|
|
30
|
+
try {
|
|
31
|
+
if (!this.configManager.validate()) {
|
|
32
|
+
await this.configManager.load();
|
|
33
|
+
}
|
|
34
|
+
const componentsPath = this.configManager.getComponentsPath();
|
|
35
|
+
// Check if the main blade file exists
|
|
36
|
+
const componentPath = path.join(componentsPath, `${component.name}.blade.php`);
|
|
37
|
+
return await this.fileSystem.fileExists(componentPath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Sorts components by name
|
|
45
|
+
* @param components - List of components
|
|
46
|
+
* @returns Sorted list
|
|
47
|
+
*/
|
|
48
|
+
sortComponents(components) {
|
|
49
|
+
return [...components].sort((a, b) => a.name.localeCompare(b.name));
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=ListService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListService.js","sourceRoot":"","sources":["../../src/services/ListService.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAG3D;;GAEG;AACH,MAAM,OAAO,WAAW;IAEH;IACA;IACA;IAHnB,YACmB,eAAgC,EAChC,aAA4B,EAC5B,UAA6B;QAF7B,oBAAe,GAAf,eAAe,CAAiB;QAChC,kBAAa,GAAb,aAAa,CAAe;QAC5B,eAAU,GAAV,UAAU,CAAmB;IAC7C,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,MAAM,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,oBAAoB,CAAC,SAA6B;QACtD,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YAClC,CAAC;YAED,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;YAC9D,sCAAsC;YACtC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAC7B,cAAc,EACd,GAAG,SAAS,CAAC,IAAI,YAAY,CAC9B,CAAC;YAEF,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,cAAc,CAAC,UAAyC;QACtD,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;CACF"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { fetchComponent, fetchComponentFile, fetchGitHubRegistry, } from "../utils/remote-registry.js";
|
|
2
|
+
import { HttpService } from "./HttpService.js";
|
|
3
|
+
import { spinner } from "../utils/spinner.js";
|
|
4
|
+
/**
|
|
5
|
+
* Service for interacting with the Velar component registry
|
|
6
|
+
*/
|
|
7
|
+
export class RegistryService {
|
|
8
|
+
httpService;
|
|
9
|
+
/**
|
|
10
|
+
* Create a new RegistryService instance
|
|
11
|
+
* @param httpService - Optional HTTP service instance (creates new one if not provided)
|
|
12
|
+
*/
|
|
13
|
+
constructor(httpService) {
|
|
14
|
+
this.httpService = httpService ?? new HttpService();
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Fetch the complete registry data
|
|
18
|
+
* @returns Promise resolving to registry data
|
|
19
|
+
* @throws NetworkError if fetch fails
|
|
20
|
+
*/
|
|
21
|
+
async fetchRegistry() {
|
|
22
|
+
return await spinner.withTask("Fetching registry...", () => fetchGitHubRegistry(), undefined, "Failed to fetch registry");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Fetch metadata for a specific component
|
|
26
|
+
* @param name - Component name
|
|
27
|
+
* @returns Promise resolving to component metadata
|
|
28
|
+
* @throws ComponentNotFoundError if component doesn't exist
|
|
29
|
+
* @throws NetworkError if fetch fails
|
|
30
|
+
*/
|
|
31
|
+
async fetchComponent(name) {
|
|
32
|
+
const file = await spinner.withTask(`Fetching component "${name}" metadata...`, () => fetchComponent(name), undefined, `Failed to fetch component "${name}"`);
|
|
33
|
+
return await this.parseComponentMeta(file);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Fetch file content for a component
|
|
37
|
+
* @param componentUrl - Component URL or name
|
|
38
|
+
* @param path - File path within component
|
|
39
|
+
* @returns Promise resolving to file content
|
|
40
|
+
* @throws ComponentNotFoundError if component or file doesn't exist
|
|
41
|
+
* @throws NetworkError if fetch fails
|
|
42
|
+
*/
|
|
43
|
+
async fetchFile(componentUrl, path) {
|
|
44
|
+
const componentName = componentUrl.split("/").pop() || componentUrl;
|
|
45
|
+
return await spinner.withTask(`Downloading ${path}...`, () => fetchComponentFile(componentName, path), undefined, `Failed to fetch file "${path}"`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Resolve component dependencies
|
|
49
|
+
* @param component - Component metadata
|
|
50
|
+
* @returns Promise resolving to array of components including dependencies
|
|
51
|
+
*/
|
|
52
|
+
async resolveDependencies(component) {
|
|
53
|
+
const visited = new Set();
|
|
54
|
+
const resolved = [];
|
|
55
|
+
const resolve = async (comp) => {
|
|
56
|
+
if (visited.has(comp.name))
|
|
57
|
+
return;
|
|
58
|
+
visited.add(comp.name);
|
|
59
|
+
resolved.push(comp);
|
|
60
|
+
// Component dependencies would be resolved here if they exist
|
|
61
|
+
// For now, just add the component itself
|
|
62
|
+
};
|
|
63
|
+
await resolve(component);
|
|
64
|
+
return resolved;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parse component metadata from GitHub file
|
|
68
|
+
* @param file - GitHub file metadata
|
|
69
|
+
* @returns Promise resolving to component metadata
|
|
70
|
+
* @throws NetworkError if download or parsing fails
|
|
71
|
+
*/
|
|
72
|
+
async parseComponentMeta(file) {
|
|
73
|
+
if (!file.download_url) {
|
|
74
|
+
throw new Error("GitHub file has no download URL");
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
const raw = await this.httpService.fetchText(file.download_url);
|
|
78
|
+
return JSON.parse(raw);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
throw new Error(`Failed to parse component meta: ${error.message}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=RegistryService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegistryService.js","sourceRoot":"","sources":["../../src/services/RegistryService.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE9C;;GAEG;AACH,MAAM,OAAO,eAAe;IACT,WAAW,CAAc;IAE1C;;;OAGG;IACH,YAAY,WAAyB;QACnC,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,IAAI,WAAW,EAAE,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,aAAa;QACjB,OAAO,MAAM,OAAO,CAAC,QAAQ,CAC3B,sBAAsB,EACtB,GAAG,EAAE,CAAC,mBAAmB,EAAE,EAC3B,SAAS,EACT,0BAA0B,CAC3B,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,QAAQ,CACjC,uBAAuB,IAAI,eAAe,EAC1C,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,EAC1B,SAAS,EACT,8BAA8B,IAAI,GAAG,CACtC,CAAC;QACF,OAAO,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAS,CAAC,YAAoB,EAAE,IAAY;QAChD,MAAM,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,YAAY,CAAC;QACpE,OAAO,MAAM,OAAO,CAAC,QAAQ,CAC3B,eAAe,IAAI,KAAK,EACxB,GAAG,EAAE,CAAC,kBAAkB,CAAC,aAAa,EAAE,IAAI,CAAC,EAC7C,SAAS,EACT,yBAAyB,IAAI,GAAG,CACjC,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,mBAAmB,CACvB,SAA6B;QAE7B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,QAAQ,GAAyB,EAAE,CAAC;QAE1C,MAAM,OAAO,GAAG,KAAK,EAAE,IAAwB,EAAE,EAAE;YACjD,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,OAAO;YACnC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEpB,8DAA8D;YAC9D,yCAAyC;QAC3C,CAAC,CAAC;QAEF,MAAM,OAAO,CAAC,SAAS,CAAC,CAAC;QACzB,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACK,KAAK,CAAC,kBAAkB,CAC9B,IAAgB;QAEhB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAChE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,mCAAoC,KAAe,CAAC,OAAO,EAAE,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/types/interfaces.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta.js","sourceRoot":"","sources":["../../src/types/meta.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/types/registry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { exec } from "child_process";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
import { logger } from "./logger.js";
|
|
4
|
+
const execAsync = promisify(exec);
|
|
5
|
+
export async function installAlpineJs(packageManager) {
|
|
6
|
+
try {
|
|
7
|
+
logger.info(`Installing Alpine.js with ${packageManager}...`);
|
|
8
|
+
const command = `${packageManager} add alpinejs`;
|
|
9
|
+
await execAsync(command);
|
|
10
|
+
logger.success("Alpine.js installed successfully");
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
logger.error("Failed to install Alpine.js", error.message);
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export async function addAlpineToAppJs() {
|
|
19
|
+
try {
|
|
20
|
+
// Check if resources/js/app.js exists
|
|
21
|
+
const fs = await import("fs");
|
|
22
|
+
const appJsPath = "resources/js/app.js";
|
|
23
|
+
if (!fs.existsSync(appJsPath)) {
|
|
24
|
+
logger.warning("resources/js/app.js not found - you'll need to add Alpine.js manually");
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
// Read current content
|
|
28
|
+
const content = fs.readFileSync(appJsPath, "utf8");
|
|
29
|
+
// Check if Alpine is already imported
|
|
30
|
+
if (content.includes("import 'alpinejs'") ||
|
|
31
|
+
content.includes("from 'alpinejs'")) {
|
|
32
|
+
logger.info("Alpine.js already imported in app.js");
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
// Add Alpine import after existing imports
|
|
36
|
+
const newContent = `import 'alpinejs';\n\n${content}`;
|
|
37
|
+
fs.writeFileSync(appJsPath, newContent);
|
|
38
|
+
logger.success("Alpine.js added to app.js");
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
logger.error("Failed to add Alpine.js to app.js", error.message);
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=alpine-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"alpine-installer.js","sourceRoot":"","sources":["../../src/utils/alpine-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,cAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,6BAA6B,cAAc,KAAK,CAAC,CAAC;QAE9D,MAAM,OAAO,GAAG,GAAG,cAAc,eAAe,CAAC;QACjD,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QAEzB,MAAM,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QACnD,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,6BAA6B,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QACtE,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,sCAAsC;QACtC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,SAAS,GAAG,qBAAqB,CAAC;QAExC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,MAAM,CAAC,OAAO,CACZ,uEAAuE,CACxE,CAAC;YACF,OAAO,KAAK,CAAC;QACf,CAAC;QAED,uBAAuB;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QAEnD,sCAAsC;QACtC,IACE,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC;YACrC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EACnC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,2CAA2C;QAC3C,MAAM,UAAU,GAAG,yBAAyB,OAAO,EAAE,CAAC;QAEtD,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,mCAAmC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;QAC5E,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Write Velar configuration to velar.json file
|
|
4
|
+
* @param config - Configuration object to write
|
|
5
|
+
* @throws Error if file write fails
|
|
6
|
+
*/
|
|
7
|
+
export function writeVelarConfig(config) {
|
|
8
|
+
fs.writeFileSync("velar.json", JSON.stringify(config, null, 2) + "\n", "utf8");
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Read Velar configuration from velar.json file
|
|
12
|
+
* @returns Configuration object
|
|
13
|
+
* @throws Error if file doesn't exist or is invalid
|
|
14
|
+
*/
|
|
15
|
+
export function readVelarConfig() {
|
|
16
|
+
if (!fs.existsSync("velar.json")) {
|
|
17
|
+
throw new Error("Velar configuration not found.");
|
|
18
|
+
}
|
|
19
|
+
return JSON.parse(fs.readFileSync("velar.json", "utf8"));
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAmB;IAClD,EAAE,CAAC,aAAa,CACd,YAAY,EACZ,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EACtC,MAAM,CACP,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAgB,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Common CSS file paths to check for main stylesheet
|
|
4
|
+
*/
|
|
5
|
+
export const CSS_CANDIDATES = [
|
|
6
|
+
"resources/css/app.css",
|
|
7
|
+
"resources/css/app.scss",
|
|
8
|
+
"resources/css/main.css",
|
|
9
|
+
"resources/css/style.css",
|
|
10
|
+
"resources/css/styles.css",
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Find the main CSS file in the project
|
|
14
|
+
* @returns CSS file info if found, null otherwise
|
|
15
|
+
*/
|
|
16
|
+
export function findMainCss() {
|
|
17
|
+
for (const rel of CSS_CANDIDATES) {
|
|
18
|
+
if (fs.existsSync(rel)) {
|
|
19
|
+
return {
|
|
20
|
+
path: rel,
|
|
21
|
+
content: fs.readFileSync(rel, "utf8"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if CSS content has Tailwind import
|
|
29
|
+
* @param css - CSS content to check
|
|
30
|
+
* @returns True if Tailwind import is found
|
|
31
|
+
*/
|
|
32
|
+
export function hasTailwindImport(css) {
|
|
33
|
+
return /@import\s+["']tailwindcss["']/.test(css);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Inject Velar CSS import into main CSS file
|
|
37
|
+
* @param cssPath - Path to the CSS file
|
|
38
|
+
* @throws Error if file read/write fails
|
|
39
|
+
*/
|
|
40
|
+
export function injectVelarImport(cssPath) {
|
|
41
|
+
let content = fs.readFileSync(cssPath, "utf8");
|
|
42
|
+
if (content.includes('@import "./velar.css"')) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (hasTailwindImport(content)) {
|
|
46
|
+
content = content.replace(/@import\s+["']tailwindcss["'];?/, (match) => `${match}\n@import "./velar.css";`);
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
content += '\n@import "./velar.css";\n';
|
|
50
|
+
}
|
|
51
|
+
fs.writeFileSync(cssPath, content, "utf8");
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=css.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"css.js","sourceRoot":"","sources":["../../src/utils/css.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,uBAAuB;IACvB,wBAAwB;IACxB,wBAAwB;IACxB,yBAAyB;IACzB,0BAA0B;CAClB,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,WAAW;IACzB,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;QACjC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO;gBACL,IAAI,EAAE,GAAG;gBACT,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC;aACtC,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,OAAO,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe;IAC/C,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC9C,OAAO;IACT,CAAC;IACD,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,iCAAiC,EACjC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,0BAA0B,CAC9C,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,4BAA4B,CAAC;IAC1C,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { fetchComponentMetaFromUrl } from "./remote-registry.js";
|
|
2
|
+
export async function resolveDependencies(meta) {
|
|
3
|
+
const resolved = [];
|
|
4
|
+
const visited = new Set();
|
|
5
|
+
async function visit(metaUrl, componentName) {
|
|
6
|
+
if (visited.has(componentName))
|
|
7
|
+
return;
|
|
8
|
+
visited.add(componentName);
|
|
9
|
+
const meta = await fetchComponentMetaFromUrl(metaUrl);
|
|
10
|
+
const baseUrl = metaUrl.replace("meta.json?ref=main", "");
|
|
11
|
+
for (const file of meta.files) {
|
|
12
|
+
resolved.push({
|
|
13
|
+
component: meta.name,
|
|
14
|
+
type: file.type,
|
|
15
|
+
url: baseUrl + file.path + "?ref=main",
|
|
16
|
+
path: file.path,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
await visit(meta.url, meta.name);
|
|
21
|
+
// console.log("Resolved dependencies:", resolved);
|
|
22
|
+
return resolved;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=deps.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deps.js","sourceRoot":"","sources":["../../src/utils/deps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AASjE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAgB;IAEhB,MAAM,QAAQ,GAA0B,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAElC,KAAK,UAAU,KAAK,CAAC,OAAe,EAAE,aAAqB;QACzD,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;YAAE,OAAO;QACvC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAE3B,MAAM,IAAI,GAAuB,MAAM,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAC1E,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;QAE1D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,QAAQ,CAAC,IAAI,CAAC;gBACZ,SAAS,EAAE,IAAI,CAAC,IAAI;gBACpB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,EAAE,OAAO,GAAG,IAAI,CAAC,IAAI,GAAG,WAAW;gBACtC,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACjC,mDAAmD;IACnD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"environment.js","sourceRoot":"","sources":["../../src/utils/environment.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAW,EAAE;IAC/C,OAAO,yDAAyD,CAAC;AACnE,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export class RegistryError extends Error {
|
|
2
|
+
cause;
|
|
3
|
+
constructor(message, cause) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.cause = cause;
|
|
6
|
+
this.name = "RegistryError";
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export class NetworkError extends RegistryError {
|
|
10
|
+
constructor(message, cause) {
|
|
11
|
+
super(message, cause);
|
|
12
|
+
this.name = "NetworkError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class ComponentNotFoundError extends RegistryError {
|
|
16
|
+
constructor(componentName, cause) {
|
|
17
|
+
super(`Component "${componentName}" not found`, cause);
|
|
18
|
+
this.name = "ComponentNotFoundError";
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IAG7B;IAFT,YACE,OAAe,EACR,KAAa;QAEpB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFR,UAAK,GAAL,KAAK,CAAQ;QAGpB,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,YAAa,SAAQ,aAAa;IAC7C,YAAY,OAAe,EAAE,KAAa;QACxC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,aAAa;IACvD,YAAY,aAAqB,EAAE,KAAa;QAC9C,KAAK,CAAC,cAAc,aAAa,aAAa,EAAE,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
export function ensureDir(p) {
|
|
4
|
+
if (!fs.existsSync(p))
|
|
5
|
+
fs.mkdirSync(p, { recursive: true });
|
|
6
|
+
}
|
|
7
|
+
export function fileExists(p) {
|
|
8
|
+
return fs.existsSync(p);
|
|
9
|
+
}
|
|
10
|
+
export function copyFile(src, dest) {
|
|
11
|
+
ensureDir(path.dirname(dest));
|
|
12
|
+
fs.copyFileSync(src, dest, fs.constants.COPYFILE_EXCL);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=filesystem.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filesystem.js","sourceRoot":"","sources":["../../src/utils/filesystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,SAAS,CAAC,CAAS;IACjC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,CAAS;IAClC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,IAAY;IAChD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9B,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;AACzD,CAAC"}
|