@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
package/dist/utils/js.js
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Common JS file paths to check for main script
|
|
4
|
+
*/
|
|
5
|
+
export const JS_CANDIDATES = [
|
|
6
|
+
"resources/js/app.js",
|
|
7
|
+
"resources/js/main.js",
|
|
8
|
+
"resources/js/index.js",
|
|
9
|
+
];
|
|
10
|
+
/**
|
|
11
|
+
* Find the main JS file in the project
|
|
12
|
+
* @returns JS file info if found, null otherwise
|
|
13
|
+
*/
|
|
14
|
+
export function findMainJs() {
|
|
15
|
+
for (const rel of JS_CANDIDATES) {
|
|
16
|
+
if (fs.existsSync(rel)) {
|
|
17
|
+
return {
|
|
18
|
+
path: rel,
|
|
19
|
+
content: fs.readFileSync(rel, "utf8"),
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Inject component JS import and Alpine initialization into main JS file
|
|
27
|
+
* @param jsPath - Path to the JS file
|
|
28
|
+
* @param componentName - Name of the component
|
|
29
|
+
* @param componentImportPath - Path to import the component from
|
|
30
|
+
* @throws Error if file read/write fails
|
|
31
|
+
*/
|
|
32
|
+
export function injectComponentJs(jsPath, componentName, componentImportPath) {
|
|
33
|
+
let content = fs.readFileSync(jsPath, "utf8");
|
|
34
|
+
// Avoid duplicate imports
|
|
35
|
+
const importStatement = `import ${componentName} from '${componentImportPath}'`;
|
|
36
|
+
if (content.includes(importStatement) || content.includes(`import ${componentName} from "${componentImportPath}"`)) {
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
// Add import at the top (after other imports if possible)
|
|
40
|
+
const lines = content.split("\n");
|
|
41
|
+
let lastImportIndex = -1;
|
|
42
|
+
for (let i = 0; i < lines.length; i++) {
|
|
43
|
+
if (lines[i]?.startsWith("import ")) {
|
|
44
|
+
lastImportIndex = i;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
lines.splice(lastImportIndex + 1, 0, importStatement);
|
|
48
|
+
content = lines.join("\n");
|
|
49
|
+
// Handle Alpine.data registration
|
|
50
|
+
const alpineDataRegistration = `Alpine.data('${componentName}', ${componentName});`;
|
|
51
|
+
if (content.includes("document.addEventListener('alpine:init'")) {
|
|
52
|
+
// Inject into existing listener
|
|
53
|
+
if (!content.includes(alpineDataRegistration)) {
|
|
54
|
+
content = content.replace(/document\.addEventListener\('alpine:init',\s*\(\)\s*=>\s*\{/, (match) => `${match}\n ${alpineDataRegistration}`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
// Create new listener at the end
|
|
59
|
+
content += `\n\ndocument.addEventListener('alpine:init', () => {\n ${alpineDataRegistration}\n});\n`;
|
|
60
|
+
}
|
|
61
|
+
fs.writeFileSync(jsPath, content, "utf8");
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=js.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js.js","sourceRoot":"","sources":["../../src/utils/js.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,qBAAqB;IACrB,sBAAsB;IACtB,uBAAuB;CACf,CAAC;AAEX;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QAChC,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;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,aAAqB,EACrB,mBAA2B;IAE3B,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAE9C,0BAA0B;IAC1B,MAAM,eAAe,GAAG,UAAU,aAAa,UAAU,mBAAmB,GAAG,CAAC;IAChF,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,UAAU,aAAa,UAAU,mBAAmB,GAAG,CAAC,EAAE,CAAC;QACnH,OAAO;IACT,CAAC;IAED,0DAA0D;IAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACpC,eAAe,GAAG,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;IACtD,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE3B,kCAAkC;IAClC,MAAM,sBAAsB,GAAG,gBAAgB,aAAa,MAAM,aAAa,IAAI,CAAC;IAEpF,IAAI,OAAO,CAAC,QAAQ,CAAC,yCAAyC,CAAC,EAAE,CAAC;QAChE,gCAAgC;QAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC9C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,6DAA6D,EAC7D,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,SAAS,sBAAsB,EAAE,CACrD,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,iCAAiC;QACjC,OAAO,IAAI,6DAA6D,sBAAsB,SAAS,CAAC;IAC1G,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Check if the current directory is a Laravel project
|
|
4
|
+
* @returns True if Laravel project is detected
|
|
5
|
+
*/
|
|
6
|
+
export function isLaravelProject() {
|
|
7
|
+
return fs.existsSync("composer.json") && fs.existsSync("artisan");
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=laravel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"laravel.js","sourceRoot":"","sources":["../../src/utils/laravel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB;;;GAGG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import chalk from "chalk";
|
|
2
|
+
import logSymbols from "log-symbols";
|
|
3
|
+
/**
|
|
4
|
+
* Logger utility for formatted console output
|
|
5
|
+
*/
|
|
6
|
+
export const logger = {
|
|
7
|
+
/**
|
|
8
|
+
* Log an error message
|
|
9
|
+
* @param message - Error message
|
|
10
|
+
* @param details - Optional details to display
|
|
11
|
+
*/
|
|
12
|
+
error: (message, details) => {
|
|
13
|
+
console.error(chalk.red(logSymbols.error), message);
|
|
14
|
+
if (details) {
|
|
15
|
+
console.error(chalk.gray("→"), details);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
/**
|
|
19
|
+
* Log a success message
|
|
20
|
+
* @param message - Success message
|
|
21
|
+
*/
|
|
22
|
+
success: (message) => {
|
|
23
|
+
console.log(chalk.green(logSymbols.success), message);
|
|
24
|
+
},
|
|
25
|
+
/**
|
|
26
|
+
* Log a warning message
|
|
27
|
+
* @param message - Warning message
|
|
28
|
+
*/
|
|
29
|
+
warning: (message) => {
|
|
30
|
+
console.log(chalk.yellow(logSymbols.warning), message);
|
|
31
|
+
},
|
|
32
|
+
/**
|
|
33
|
+
* Log an info message
|
|
34
|
+
* @param message - Info message
|
|
35
|
+
*/
|
|
36
|
+
info: (message) => {
|
|
37
|
+
console.log(chalk.blue(logSymbols.info), message);
|
|
38
|
+
},
|
|
39
|
+
/**
|
|
40
|
+
* Log a step message
|
|
41
|
+
* @param message - Step message
|
|
42
|
+
*/
|
|
43
|
+
step: (message) => {
|
|
44
|
+
console.log(chalk.cyan("→"), message);
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB;;;;OAIG;IACH,KAAK,EAAE,CAAC,OAAe,EAAE,OAAgB,EAAQ,EAAE;QACjD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,OAAO,EAAE,CAAC,OAAe,EAAQ,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACxD,CAAC;IAED;;;OAGG;IACH,OAAO,EAAE,CAAC,OAAe,EAAQ,EAAE;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED;;;OAGG;IACH,IAAI,EAAE,CAAC,OAAe,EAAQ,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED;;;OAGG;IACH,IAAI,EAAE,CAAC,OAAe,EAAQ,EAAE;QAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Detect the package manager used in the project
|
|
4
|
+
* @returns Detected package manager name (defaults to "npm")
|
|
5
|
+
*/
|
|
6
|
+
export function detectPackageManager() {
|
|
7
|
+
// Check lock files
|
|
8
|
+
if (fs.existsSync("pnpm-lock.yaml") || fs.existsSync("pnpm-lock.yml")) {
|
|
9
|
+
return "pnpm";
|
|
10
|
+
}
|
|
11
|
+
if (fs.existsSync("yarn.lock")) {
|
|
12
|
+
return "yarn";
|
|
13
|
+
}
|
|
14
|
+
if (fs.existsSync("package-lock.json")) {
|
|
15
|
+
return "npm";
|
|
16
|
+
}
|
|
17
|
+
if (fs.existsSync("bun.lockb")) {
|
|
18
|
+
return "bun";
|
|
19
|
+
}
|
|
20
|
+
// Default to npm
|
|
21
|
+
return "npm";
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.js","sourceRoot":"","sources":["../../src/utils/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAGpB;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,mBAAmB;IACnB,IAAI,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACtE,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACvC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iBAAiB;IACjB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
export function readRegistry(registryPath) {
|
|
4
|
+
const registryFile = path.join(registryPath, "registry.json");
|
|
5
|
+
if (!fs.existsSync(registryFile)) {
|
|
6
|
+
throw new Error("Registry not found.");
|
|
7
|
+
}
|
|
8
|
+
return JSON.parse(fs.readFileSync(registryFile, "utf8"));
|
|
9
|
+
}
|
|
10
|
+
export function getComponentFiles(registryPath, name) {
|
|
11
|
+
const compDir = path.join(registryPath, "components", name);
|
|
12
|
+
if (!fs.existsSync(compDir)) {
|
|
13
|
+
throw new Error(`Component "${name}" not found.`);
|
|
14
|
+
}
|
|
15
|
+
return fs.readdirSync(compDir).filter((f) => f.endsWith(".blade.php"));
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/utils/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,UAAU,YAAY,CAAC,YAAoB;IAC/C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,YAAoB,EAAE,IAAY;IAClE,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,cAAc,IAAI,cAAc,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { getGitHubRegistryUrl } from "./environment.js";
|
|
2
|
+
import { NetworkError, ComponentNotFoundError } from "../errors/errors.js";
|
|
3
|
+
import { HttpService } from "../services/HttpService.js";
|
|
4
|
+
/**
|
|
5
|
+
* HTTP service instance for making requests
|
|
6
|
+
*/
|
|
7
|
+
const httpService = new HttpService();
|
|
8
|
+
/**
|
|
9
|
+
* Fetch a meta.json from a given URL and return as VelarComponentMeta
|
|
10
|
+
* @param metaUrl - URL to fetch meta.json from
|
|
11
|
+
* @returns Promise resolving to VelarComponentMeta
|
|
12
|
+
* @throws NetworkError if fetch or parsing fails
|
|
13
|
+
*/
|
|
14
|
+
export async function fetchComponentMetaFromUrl(metaUrl) {
|
|
15
|
+
try {
|
|
16
|
+
const raw = await httpService.fetchText(metaUrl);
|
|
17
|
+
// Try to parse as VelarComponentMeta directly (raw JSON)
|
|
18
|
+
try {
|
|
19
|
+
const meta = JSON.parse(raw);
|
|
20
|
+
if (meta && Array.isArray(meta.files)) {
|
|
21
|
+
return meta;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Fallback to next logic
|
|
26
|
+
}
|
|
27
|
+
// If not, try as GitHubFile (API response)
|
|
28
|
+
try {
|
|
29
|
+
const file = JSON.parse(raw);
|
|
30
|
+
if (!file.download_url) {
|
|
31
|
+
throw new NetworkError("GitHubFile missing download_url");
|
|
32
|
+
}
|
|
33
|
+
const meta = await httpService.fetchJson(file.download_url);
|
|
34
|
+
if (meta && Array.isArray(meta.files)) {
|
|
35
|
+
return meta;
|
|
36
|
+
}
|
|
37
|
+
throw new NetworkError("Invalid meta.json structure");
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
if (e instanceof NetworkError) {
|
|
41
|
+
throw e;
|
|
42
|
+
}
|
|
43
|
+
throw new NetworkError(`Failed to parse meta.json from ${metaUrl}: ${e.message}`, e);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (error instanceof NetworkError) {
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
throw new NetworkError(`Failed to fetch component meta from ${metaUrl}: ${error.message}`, error);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Fetch the GitHub registry data
|
|
55
|
+
* @param branch - Git branch to fetch from (default: "main")
|
|
56
|
+
* @returns Promise resolving to RegistryData
|
|
57
|
+
* @throws NetworkError if fetch fails
|
|
58
|
+
*/
|
|
59
|
+
export async function fetchGitHubRegistry(branch = "main") {
|
|
60
|
+
try {
|
|
61
|
+
// First try to get registry.json from the root
|
|
62
|
+
const registryUrl = `https://raw.githubusercontent.com/velar-ui/registry/${branch}/registry.json`;
|
|
63
|
+
try {
|
|
64
|
+
const registryData = await httpService.fetchJson(registryUrl);
|
|
65
|
+
return registryData;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// Fallback to listing components directory
|
|
69
|
+
}
|
|
70
|
+
// Fallback to listing components directory
|
|
71
|
+
const files = await httpService.fetchJson(`${getGitHubRegistryUrl()}/components`);
|
|
72
|
+
const components = [];
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
if (file.type === "dir") {
|
|
75
|
+
try {
|
|
76
|
+
// Try to get meta.json for each component
|
|
77
|
+
const meta = await httpService.fetchJson(`${getGitHubRegistryUrl()}/components/${file.name}/meta.json`);
|
|
78
|
+
components.push({
|
|
79
|
+
...meta,
|
|
80
|
+
name: file.name,
|
|
81
|
+
path: file.path,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// Skip failed components but continue with others
|
|
86
|
+
components.push({
|
|
87
|
+
name: file.name,
|
|
88
|
+
path: file.path,
|
|
89
|
+
files: [],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return { components };
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof NetworkError) {
|
|
98
|
+
throw error;
|
|
99
|
+
}
|
|
100
|
+
throw new NetworkError(`Failed to fetch remote registry: ${error.message}`, error);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Fetch component metadata from GitHub
|
|
105
|
+
* @param componentName - Name of the component to fetch
|
|
106
|
+
* @returns Promise resolving to GitHubFile
|
|
107
|
+
* @throws ComponentNotFoundError if component doesn't exist
|
|
108
|
+
* @throws NetworkError if fetch fails
|
|
109
|
+
*/
|
|
110
|
+
export async function fetchComponent(componentName) {
|
|
111
|
+
try {
|
|
112
|
+
const metaUrl = `${getGitHubRegistryUrl()}/components/${componentName}/meta.json`;
|
|
113
|
+
const response = await httpService.fetch(metaUrl);
|
|
114
|
+
if (response.status === 404) {
|
|
115
|
+
throw new ComponentNotFoundError(componentName);
|
|
116
|
+
}
|
|
117
|
+
if (!response.ok) {
|
|
118
|
+
throw new NetworkError(`Component meta not found: ${response.status} ${response.statusText}`);
|
|
119
|
+
}
|
|
120
|
+
return await httpService.fetchJson(metaUrl);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error instanceof ComponentNotFoundError ||
|
|
124
|
+
error instanceof NetworkError) {
|
|
125
|
+
throw error;
|
|
126
|
+
}
|
|
127
|
+
throw new NetworkError(`Failed to fetch component meta for "${componentName}": ${error.message}`, error);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Fetch a component file content from GitHub
|
|
132
|
+
* @param componentName - Name of the component
|
|
133
|
+
* @param filePath - Path to the file within the component directory
|
|
134
|
+
* @returns Promise resolving to file content as string
|
|
135
|
+
* @throws ComponentNotFoundError if component or file doesn't exist
|
|
136
|
+
* @throws NetworkError if fetch fails
|
|
137
|
+
*/
|
|
138
|
+
export async function fetchComponentFile(componentName, filePath) {
|
|
139
|
+
try {
|
|
140
|
+
const fileUrl = `${getGitHubRegistryUrl()}/components/${componentName}/${filePath}`;
|
|
141
|
+
const response = await httpService.fetch(fileUrl);
|
|
142
|
+
if (response.status === 404) {
|
|
143
|
+
throw new ComponentNotFoundError(componentName);
|
|
144
|
+
}
|
|
145
|
+
if (!response.ok) {
|
|
146
|
+
throw new NetworkError(`File not found: ${response.status} ${response.statusText}`);
|
|
147
|
+
}
|
|
148
|
+
const file = await httpService.fetchJson(fileUrl);
|
|
149
|
+
if (!file.download_url) {
|
|
150
|
+
throw new NetworkError("File has no download URL");
|
|
151
|
+
}
|
|
152
|
+
return await httpService.fetchText(file.download_url);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
if (error instanceof ComponentNotFoundError ||
|
|
156
|
+
error instanceof NetworkError) {
|
|
157
|
+
throw error;
|
|
158
|
+
}
|
|
159
|
+
throw new NetworkError(`Failed to fetch file "${filePath}" for component "${componentName}": ${error.message}`, error);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=remote-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-registry.js","sourceRoot":"","sources":["../../src/utils/remote-registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
/**
|
|
4
|
+
* Check if Alpine.js is listed in package.json dependencies
|
|
5
|
+
* @returns True if Alpine.js is found in dependencies
|
|
6
|
+
*/
|
|
7
|
+
export function hasAlpineInPackageJson() {
|
|
8
|
+
try {
|
|
9
|
+
const pkg = JSON.parse(fs.readFileSync("package.json", "utf8"));
|
|
10
|
+
const hasInDeps = pkg.dependencies &&
|
|
11
|
+
Object.keys(pkg.dependencies).some((dep) => dep.toLowerCase().includes("alpine"));
|
|
12
|
+
const hasInDevDeps = pkg.devDependencies &&
|
|
13
|
+
Object.keys(pkg.devDependencies).some((dep) => dep.toLowerCase().includes("alpine"));
|
|
14
|
+
return Boolean(hasInDeps || hasInDevDeps);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Check if Alpine.js is referenced in layout files
|
|
22
|
+
* @returns True if Alpine.js is found in layout files
|
|
23
|
+
*/
|
|
24
|
+
export function hasAlpineInLayouts() {
|
|
25
|
+
const layoutDir = "resources/views/layouts";
|
|
26
|
+
if (!fs.existsSync(layoutDir))
|
|
27
|
+
return false;
|
|
28
|
+
try {
|
|
29
|
+
const files = fs.readdirSync(layoutDir, { recursive: true });
|
|
30
|
+
for (const file of files) {
|
|
31
|
+
if (file.endsWith(".blade.php")) {
|
|
32
|
+
const content = fs.readFileSync(path.join(layoutDir, file), "utf8");
|
|
33
|
+
if (content.toLowerCase().includes("alpine")) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Check if Livewire is installed via Composer
|
|
46
|
+
* @returns True if Livewire is found in composer.json
|
|
47
|
+
*/
|
|
48
|
+
export function hasLivewire() {
|
|
49
|
+
try {
|
|
50
|
+
const composer = JSON.parse(fs.readFileSync("composer.json", "utf8"));
|
|
51
|
+
const hasInRequire = composer.require &&
|
|
52
|
+
Object.keys(composer.require).some((dep) => dep.toLowerCase().includes("livewire"));
|
|
53
|
+
const hasInRequireDev = composer["require-dev"] &&
|
|
54
|
+
Object.keys(composer["require-dev"]).some((dep) => dep.toLowerCase().includes("livewire"));
|
|
55
|
+
return Boolean(hasInRequire || hasInRequireDev);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Check if Alpine.js is available in the project
|
|
63
|
+
* @returns True if Alpine.js is detected
|
|
64
|
+
*/
|
|
65
|
+
export function hasAlpineJs() {
|
|
66
|
+
return hasAlpineInPackageJson() || hasAlpineInLayouts();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Check if project has interactivity support (Alpine.js or Livewire)
|
|
70
|
+
* @returns True if interactivity framework is detected
|
|
71
|
+
*/
|
|
72
|
+
export function hasInteractivitySupport() {
|
|
73
|
+
return hasAlpineJs() || hasLivewire();
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=requirements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requirements.js","sourceRoot":"","sources":["../../src/utils/requirements.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import ora, {} from "ora";
|
|
2
|
+
/**
|
|
3
|
+
* Utility to manage loading spinners
|
|
4
|
+
*/
|
|
5
|
+
export const spinner = {
|
|
6
|
+
/**
|
|
7
|
+
* Starts a spinner with a message
|
|
8
|
+
* @param message - Message to display
|
|
9
|
+
* @returns Ora spinner instance
|
|
10
|
+
*/
|
|
11
|
+
start(message) {
|
|
12
|
+
return ora(message).start();
|
|
13
|
+
},
|
|
14
|
+
/**
|
|
15
|
+
* Executes an asynchronous task with a spinner
|
|
16
|
+
* @param message - Message during loading
|
|
17
|
+
* @param task - Asynchronous function to execute
|
|
18
|
+
* @param successMessage - Optional success message
|
|
19
|
+
* @param failMessage - Optional error message
|
|
20
|
+
* @returns Task result
|
|
21
|
+
*/
|
|
22
|
+
async withTask(message, task, successMessage, failMessage) {
|
|
23
|
+
const s = this.start(message);
|
|
24
|
+
try {
|
|
25
|
+
const result = await task();
|
|
26
|
+
if (successMessage) {
|
|
27
|
+
s.succeed(successMessage);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
s.stop();
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
s.fail(failMessage || "Operation failed");
|
|
36
|
+
throw error;
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=spinner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/utils/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,EAAE,EAAY,MAAM,KAAK,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB;;;;OAIG;IACH,KAAK,CAAC,OAAe;QACnB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,QAAQ,CACZ,OAAe,EACf,IAAsB,EACtB,cAAuB,EACvB,WAAoB;QAEpB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;YAC5B,IAAI,cAAc,EAAE,CAAC;gBACnB,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,CAAC,CAAC,IAAI,EAAE,CAAC;YACX,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,kBAAkB,CAAC,CAAC;YAC1C,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/**
|
|
3
|
+
* Read package.json file
|
|
4
|
+
* @returns Package.json object or null if file doesn't exist or is invalid
|
|
5
|
+
*/
|
|
6
|
+
export function readPackageJson() {
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(fs.readFileSync("package.json", "utf8"));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Detect if Tailwind CSS v4 is installed
|
|
16
|
+
* @param pkg - Package.json object
|
|
17
|
+
* @returns True if Tailwind v4 is detected
|
|
18
|
+
*/
|
|
19
|
+
export function detectTailwindV4(pkg) {
|
|
20
|
+
const deps = { ...pkg.dependencies, ...pkg.devDependencies };
|
|
21
|
+
if (deps["@tailwindcss/vite"] || deps["@tailwindcss/postcss"]) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
if (deps["tailwindcss"]) {
|
|
25
|
+
const version = String(deps["tailwindcss"]);
|
|
26
|
+
const match = version.match(/(\d+)/);
|
|
27
|
+
return match ? Number(match[1]) >= 4 : false;
|
|
28
|
+
}
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=tailwind.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tailwind.js","sourceRoot":"","sources":["../../src/utils/tailwind.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AAUpB;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,CAAgB,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAgB;IAC/C,MAAM,IAAI,GAAG,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;IAC7D,IAAI,IAAI,CAAC,mBAAmB,CAAC,IAAI,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC9D,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
/**
|
|
5
|
+
* Available Velar themes
|
|
6
|
+
*/
|
|
7
|
+
export const THEMES = [
|
|
8
|
+
"neutral",
|
|
9
|
+
"blue",
|
|
10
|
+
"green",
|
|
11
|
+
"orange",
|
|
12
|
+
"red",
|
|
13
|
+
"rose",
|
|
14
|
+
"violet",
|
|
15
|
+
"yellow",
|
|
16
|
+
];
|
|
17
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
18
|
+
const REGISTRY_THEMES_DIR = path.resolve(__dirname, "../registry/themes");
|
|
19
|
+
/**
|
|
20
|
+
* Copy a theme CSS file to the target location
|
|
21
|
+
* @param theme - Theme name to copy
|
|
22
|
+
* @param target - Target file path
|
|
23
|
+
* @throws Error if theme doesn't exist or copy fails
|
|
24
|
+
*/
|
|
25
|
+
export function copyTheme(theme, target) {
|
|
26
|
+
const source = path.join(REGISTRY_THEMES_DIR, `${theme}.css`);
|
|
27
|
+
if (!fs.existsSync(source)) {
|
|
28
|
+
throw new Error(`Theme "${theme}" not found in registry.`);
|
|
29
|
+
}
|
|
30
|
+
fs.copyFileSync(source, target, fs.constants.COPYFILE_EXCL);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/utils/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAA0B;IAC3C,SAAS;IACT,MAAM;IACN,OAAO;IACP,QAAQ;IACR,KAAK;IACL,MAAM;IACN,QAAQ;IACR,QAAQ;CACA,CAAC;AAEX,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,mBAAmB,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAAC;AAE1E;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,KAAiB,EAAE,MAAc;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,KAAK,MAAM,CAAC,CAAC;IAC9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,0BAA0B,CAAC,CAAC;IAC7D,CAAC;IACD,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"type-conversion.js","sourceRoot":"","sources":["../../src/utils/type-conversion.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@jiordikengne/velar",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "CLI to add composable UI components to Laravel projects",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"laravel",
|
|
7
|
+
"cli",
|
|
8
|
+
"ui",
|
|
9
|
+
"blade",
|
|
10
|
+
"tailwind",
|
|
11
|
+
"alpine"
|
|
12
|
+
],
|
|
13
|
+
"type": "module",
|
|
14
|
+
"bin": {
|
|
15
|
+
"velar": "./dist/index.js"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"engines": {
|
|
21
|
+
"node": ">=20"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"dev": "tsc --watch & tsc-alias --watch & pnpm copy-themes:watch",
|
|
25
|
+
"build": "tsc && tsc-alias && pnpm copy-themes",
|
|
26
|
+
"copy-themes": "cp -r src/registry/themes dist/registry/",
|
|
27
|
+
"copy-themes:watch": "while true; do pnpm copy-themes; sleep 2; done",
|
|
28
|
+
"lint": "eslint .",
|
|
29
|
+
"prepublishOnly": "pnpm run build",
|
|
30
|
+
"format": "prettier --write .",
|
|
31
|
+
"check:ci": "pnpm run lint && pnpm run typecheck",
|
|
32
|
+
"typecheck": "tsc --noEmit",
|
|
33
|
+
"test": "vitest run",
|
|
34
|
+
"test:watch": "vitest",
|
|
35
|
+
"test:coverage": "vitest run --coverage"
|
|
36
|
+
},
|
|
37
|
+
"author": "",
|
|
38
|
+
"license": "MIT",
|
|
39
|
+
"packageManager": "pnpm@10.28.1+sha512.7d7dbbca9e99447b7c3bf7a73286afaaf6be99251eb9498baefa7d406892f67b879adb3a1d7e687fc4ccc1a388c7175fbaae567a26ab44d1067b54fcb0d6a316",
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@clack/prompts": "^0.11.0",
|
|
42
|
+
"chalk": "^5.6.2",
|
|
43
|
+
"cli-table3": "^0.6.5",
|
|
44
|
+
"commander": "^14.0.2",
|
|
45
|
+
"log-symbols": "^7.0.1",
|
|
46
|
+
"ora": "^9.1.0",
|
|
47
|
+
"zod": "^4.3.5"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@eslint/js": "^9.39.2",
|
|
51
|
+
"@eslint/json": "^0.14.0",
|
|
52
|
+
"@eslint/markdown": "^7.5.1",
|
|
53
|
+
"@types/node": "^25.0.9",
|
|
54
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
55
|
+
"eslint": "^9.39.2",
|
|
56
|
+
"globals": "^17.0.0",
|
|
57
|
+
"jiti": "^2.6.1",
|
|
58
|
+
"prettier": "3.8.0",
|
|
59
|
+
"tsc-alias": "^1.8.16",
|
|
60
|
+
"typescript": "^5.9.3",
|
|
61
|
+
"typescript-eslint": "^8.53.0",
|
|
62
|
+
"vitest": "^4.0.18"
|
|
63
|
+
}
|
|
64
|
+
}
|