@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/README.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Velar CLI
|
|
2
|
+
|
|
3
|
+
Velar CLI is a command-line tool for adding UI components to Laravel projects.
|
|
4
|
+
|
|
5
|
+
It delivers composable UI components built with **Blade**, **Alpine.js**, and **Tailwind CSS v4**.
|
|
6
|
+
Inspired by shadcn, Velar gives you the code, not a dependency.
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## What Velar is
|
|
11
|
+
|
|
12
|
+
- A **code delivery tool** for Laravel UI components
|
|
13
|
+
- A way to **copy components into your project**
|
|
14
|
+
- A workflow that keeps **you in control of your code**
|
|
15
|
+
|
|
16
|
+
## What Velar is not
|
|
17
|
+
|
|
18
|
+
- Not a UI framework
|
|
19
|
+
- Not a runtime dependency
|
|
20
|
+
- Not an auto-updating system
|
|
21
|
+
- Not magic
|
|
22
|
+
|
|
23
|
+
Once components are added, they belong to your project.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Requirements
|
|
28
|
+
|
|
29
|
+
Velar assumes a modern Laravel setup:
|
|
30
|
+
|
|
31
|
+
- Laravel
|
|
32
|
+
- Blade
|
|
33
|
+
- Alpine.js
|
|
34
|
+
- Tailwind CSS **v4 or higher**
|
|
35
|
+
|
|
36
|
+
Tailwind v3 is not supported.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Usage
|
|
41
|
+
|
|
42
|
+
Velar can be executed without installation.
|
|
43
|
+
|
|
44
|
+
### Initialize Velar in a project
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
npx velar init
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
This command:
|
|
51
|
+
|
|
52
|
+
- checks your environment
|
|
53
|
+
- prepares the UI components directory
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
### Add a component
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npx velar add button
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Velar will:
|
|
64
|
+
|
|
65
|
+
- fetch the component from the registry
|
|
66
|
+
- resolve its dependencies
|
|
67
|
+
- copy the files into your project
|
|
68
|
+
|
|
69
|
+
By default, components are placed in:
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
resources/views/components/ui
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
### List available components
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npx velar list
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## How updates work
|
|
86
|
+
|
|
87
|
+
Velar does **not** update your code automatically.
|
|
88
|
+
|
|
89
|
+
If a component changes in the registry and you want the new version:
|
|
90
|
+
|
|
91
|
+
- run `velar add <component>` again
|
|
92
|
+
- review the changes
|
|
93
|
+
- decide what to keep
|
|
94
|
+
|
|
95
|
+
This is intentional.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Philosophy
|
|
100
|
+
|
|
101
|
+
Velar follows a simple principle:
|
|
102
|
+
|
|
103
|
+
> You own your UI code.
|
|
104
|
+
|
|
105
|
+
There are no hidden abstractions and no vendor lock-in.
|
|
106
|
+
Velar exists to help you move faster, not to take control away from you.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Documentation
|
|
111
|
+
|
|
112
|
+
Full documentation lives in the `docs` repository:
|
|
113
|
+
|
|
114
|
+
- Introduction
|
|
115
|
+
- Getting started
|
|
116
|
+
- Component reference
|
|
117
|
+
- Project philosophy
|
|
118
|
+
|
|
119
|
+
---
|
|
120
|
+
|
|
121
|
+
## License
|
|
122
|
+
|
|
123
|
+
MIT
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { ConfigManager } from "../config/ConfigManager.js";
|
|
3
|
+
import { ErrorHandler } from "../errors/ErrorHandler.js";
|
|
4
|
+
import { AddService } from "../services/AddService.js";
|
|
5
|
+
import { RegistryService } from "../services/RegistryService.js";
|
|
6
|
+
import { logger } from "../utils/logger.js";
|
|
7
|
+
import * as p from "@clack/prompts";
|
|
8
|
+
import { Command } from "commander";
|
|
9
|
+
/**
|
|
10
|
+
* Prompt user to select components
|
|
11
|
+
* @param availableComponents - List of available component names
|
|
12
|
+
* @returns Selected component names or undefined if aborted
|
|
13
|
+
*/
|
|
14
|
+
async function promptComponentSelection(availableComponents) {
|
|
15
|
+
const selected = await p.multiselect({
|
|
16
|
+
message: "Select components to add",
|
|
17
|
+
options: availableComponents.map((name) => ({ label: name, value: name })),
|
|
18
|
+
required: true,
|
|
19
|
+
});
|
|
20
|
+
if (p.isCancel(selected)) {
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return selected;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Register the 'add' command with the CLI program
|
|
27
|
+
* @param program - Commander program instance
|
|
28
|
+
*/
|
|
29
|
+
export default function registerAddCommand(program) {
|
|
30
|
+
program
|
|
31
|
+
.command("add")
|
|
32
|
+
.argument("[components...]", "Names of components to add")
|
|
33
|
+
.description("Add one or more UI components to your Laravel project")
|
|
34
|
+
.action(async (components) => {
|
|
35
|
+
const errorHandler = new ErrorHandler();
|
|
36
|
+
try {
|
|
37
|
+
// 1. Initialize services
|
|
38
|
+
const configManager = new ConfigManager();
|
|
39
|
+
await configManager.load();
|
|
40
|
+
const registryService = new RegistryService();
|
|
41
|
+
const addService = new AddService(registryService, configManager);
|
|
42
|
+
// 2. Validate initialization
|
|
43
|
+
try {
|
|
44
|
+
addService.validateInitialization();
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
logger.error("Velar is not initialized");
|
|
48
|
+
logger.step("Run velar init first");
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
// 3. Load registry (spinner handle inside addService/registryService)
|
|
52
|
+
const registry = await addService.getAvailableComponents();
|
|
53
|
+
// 4. Prompt for components if none provided
|
|
54
|
+
let componentNames = components;
|
|
55
|
+
if (!componentNames || componentNames.length === 0) {
|
|
56
|
+
const available = registry.components.map((c) => c.name);
|
|
57
|
+
const selected = await promptComponentSelection(available.sort((a, b) => a.localeCompare(b)));
|
|
58
|
+
if (!selected || selected.length === 0) {
|
|
59
|
+
logger.warning("No component selected");
|
|
60
|
+
process.exit(0);
|
|
61
|
+
}
|
|
62
|
+
componentNames = selected;
|
|
63
|
+
}
|
|
64
|
+
// 5. Validate components exist
|
|
65
|
+
try {
|
|
66
|
+
addService.validateComponents(componentNames, registry);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
logger.error(err.message);
|
|
70
|
+
logger.step("Run velar list to see available components");
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
// 6. Add components
|
|
74
|
+
const result = await addService.addComponents(componentNames);
|
|
75
|
+
// 7. Display results
|
|
76
|
+
addService.displayResults(result);
|
|
77
|
+
addService.displayNextSteps(result);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
errorHandler.handle(error, "add command");
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=add.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import prompts from "prompts";
|
|
2
|
+
import { FileSystemService } from "../services/FileSystemService.js";
|
|
3
|
+
import { writeVelarConfig } from "../utils/config.js";
|
|
4
|
+
import { logger } from "../utils/logger.js";
|
|
5
|
+
export const initStepHandlers = {
|
|
6
|
+
validateLaravel: async () => {
|
|
7
|
+
const { isLaravelProject } = await import("../utils/laravel.js");
|
|
8
|
+
if (!isLaravelProject()) {
|
|
9
|
+
logger.error("This is not a Laravel project");
|
|
10
|
+
logger.step("Run velar init at the root of a Laravel project");
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
logger.success("Laravel project detected");
|
|
14
|
+
return true;
|
|
15
|
+
},
|
|
16
|
+
validateTailwind: async () => {
|
|
17
|
+
const { readPackageJson, detectTailwindV4 } = await import("../utils/tailwind.js");
|
|
18
|
+
const pkg = readPackageJson();
|
|
19
|
+
if (!pkg || !detectTailwindV4(pkg)) {
|
|
20
|
+
logger.error("Tailwind CSS v4 not detected");
|
|
21
|
+
logger.step("Velar requires Tailwind CSS v4+");
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
logger.success("Tailwind CSS v4 detected");
|
|
25
|
+
return true;
|
|
26
|
+
},
|
|
27
|
+
detectPackageManager: async () => {
|
|
28
|
+
const { detectPackageManager } = await import("../utils/package-manager.js");
|
|
29
|
+
return detectPackageManager();
|
|
30
|
+
},
|
|
31
|
+
choosePackageManager: async (detectedPm) => {
|
|
32
|
+
const res = await prompts({
|
|
33
|
+
type: "select",
|
|
34
|
+
name: "packageManager",
|
|
35
|
+
message: "Which package manager are you using?",
|
|
36
|
+
choices: [
|
|
37
|
+
{ title: "npm", value: "npm" },
|
|
38
|
+
{ title: "yarn", value: "yarn" },
|
|
39
|
+
{ title: "pnpm", value: "pnpm" },
|
|
40
|
+
{ title: "bun", value: "bun" },
|
|
41
|
+
],
|
|
42
|
+
initial: ["npm", "yarn", "pnpm", "bun"].indexOf(detectedPm) >= 0
|
|
43
|
+
? ["npm", "yarn", "pnpm", "bun"].indexOf(detectedPm)
|
|
44
|
+
: 0,
|
|
45
|
+
});
|
|
46
|
+
if (!res.packageManager) {
|
|
47
|
+
logger.error("Package manager selection cancelled");
|
|
48
|
+
throw new Error("Package manager selection cancelled");
|
|
49
|
+
}
|
|
50
|
+
return res.packageManager;
|
|
51
|
+
},
|
|
52
|
+
chooseTheme: async () => {
|
|
53
|
+
const { THEMES } = await import("../utils/theme.js");
|
|
54
|
+
const res = await prompts({
|
|
55
|
+
type: "select",
|
|
56
|
+
name: "theme",
|
|
57
|
+
message: "Choose a theme:",
|
|
58
|
+
choices: THEMES.map((t) => ({ title: t, value: t })),
|
|
59
|
+
initial: 0,
|
|
60
|
+
});
|
|
61
|
+
if (!res.theme) {
|
|
62
|
+
logger.error("Theme selection cancelled");
|
|
63
|
+
throw new Error("Theme selection cancelled");
|
|
64
|
+
}
|
|
65
|
+
return res.theme;
|
|
66
|
+
},
|
|
67
|
+
setupDirectories: async (fileSystem) => {
|
|
68
|
+
const uiDir = "resources/views/components/ui";
|
|
69
|
+
await fileSystem.ensureDir(uiDir);
|
|
70
|
+
const velarCssPath = "resources/css/velar.css";
|
|
71
|
+
await fileSystem.ensureDir(velarCssPath.split("/").slice(0, -1).join("/"));
|
|
72
|
+
},
|
|
73
|
+
setupTheme: async (theme) => {
|
|
74
|
+
const { copyTheme } = await import("../utils/theme.js");
|
|
75
|
+
const fs = await import("fs");
|
|
76
|
+
const velarCssPath = "resources/css/velar.css";
|
|
77
|
+
if (!fs.existsSync(velarCssPath)) {
|
|
78
|
+
await copyTheme(theme, velarCssPath);
|
|
79
|
+
logger.success("Theme created");
|
|
80
|
+
logger.info("resources/css/velar.css");
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
logger.info("velar.css already exists");
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
setupCss: async () => {
|
|
87
|
+
const { findMainCss, hasTailwindImport, injectVelarImport } = await import("../utils/css.js");
|
|
88
|
+
const css = findMainCss();
|
|
89
|
+
const hasCss = Boolean(css);
|
|
90
|
+
const canInject = css ? hasTailwindImport(css.content) : false;
|
|
91
|
+
if (!hasCss) {
|
|
92
|
+
logger.warning("No main CSS file found");
|
|
93
|
+
logger.step("Styles will be created but not auto-imported");
|
|
94
|
+
}
|
|
95
|
+
else if (!canInject) {
|
|
96
|
+
logger.warning("Tailwind import not found in CSS");
|
|
97
|
+
logger.step("Velar styles will not be auto-imported");
|
|
98
|
+
}
|
|
99
|
+
let injected = false;
|
|
100
|
+
if (hasCss && canInject) {
|
|
101
|
+
const res = await prompts({
|
|
102
|
+
type: "confirm",
|
|
103
|
+
name: "inject",
|
|
104
|
+
message: "Import Velar styles into your main CSS file?",
|
|
105
|
+
initial: true,
|
|
106
|
+
});
|
|
107
|
+
if (res.inject) {
|
|
108
|
+
injectVelarImport(css.path);
|
|
109
|
+
injected = true;
|
|
110
|
+
logger.success("Styles imported");
|
|
111
|
+
logger.info(css.path);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
return { path: css?.path || "", injected };
|
|
115
|
+
},
|
|
116
|
+
createConfig: async (config) => {
|
|
117
|
+
writeVelarConfig(config);
|
|
118
|
+
logger.success("Configuration created");
|
|
119
|
+
},
|
|
120
|
+
showSummary: (config, css) => {
|
|
121
|
+
logger.blank();
|
|
122
|
+
logger.success("✨ Velar initialized successfully!");
|
|
123
|
+
logger.blank();
|
|
124
|
+
logger.info("What's ready:");
|
|
125
|
+
logger.step(`• Theme: ${config.theme}`);
|
|
126
|
+
logger.step(`• Package manager: ${config.packageManager}`);
|
|
127
|
+
logger.step(`• Interactivity: ${config.interactivity.framework} (${config.interactivity.source})`);
|
|
128
|
+
logger.step("• UI components directory");
|
|
129
|
+
logger.step(`• Styles: ${css.injected ? "imported" : "ready"}`);
|
|
130
|
+
logger.blank();
|
|
131
|
+
logger.info("Next steps:");
|
|
132
|
+
logger.step("• Add components: velar add button");
|
|
133
|
+
logger.step("• List components: velar list");
|
|
134
|
+
logger.blank();
|
|
135
|
+
logger.success("Happy coding! 🚀");
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
//# sourceMappingURL=init-handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-handlers.js","sourceRoot":"","sources":["../../src/commands/init-handlers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
import prompts from "prompts";
|
|
3
|
+
import { retryWithSpinner } from "../utils/spinner.js";
|
|
4
|
+
import { initStepHandlers } from "./init-handlers.js";
|
|
5
|
+
import { installAlpineJs, addAlpineToAppJs, } from "../utils/alpine-installer.js";
|
|
6
|
+
import { hasAlpineJs, hasLivewire, hasInteractivitySupport, } from "../utils/requirements.js";
|
|
7
|
+
import { FileSystemService } from "../services/FileSystemService.js";
|
|
8
|
+
import { logger } from "../utils/logger.js";
|
|
9
|
+
export default function registerInitCommand(program) {
|
|
10
|
+
const initCmd = program
|
|
11
|
+
.command("init")
|
|
12
|
+
.description("Initialize Velar in a Laravel project")
|
|
13
|
+
.option("-t, --theme <theme>", "Theme to use (default, dark, etc.)")
|
|
14
|
+
.option("-p, --package-manager <pm>", "Package manager (npm, yarn, pnpm, bun)")
|
|
15
|
+
.action(async (options) => {
|
|
16
|
+
try {
|
|
17
|
+
const fileSystem = new FileSystemService();
|
|
18
|
+
// Step 1: Validate Laravel project
|
|
19
|
+
const isValidLaravel = await initStepHandlers.validateLaravel();
|
|
20
|
+
if (!isValidLaravel)
|
|
21
|
+
return;
|
|
22
|
+
// Step 2: Validate Tailwind CSS
|
|
23
|
+
const isValidTailwind = await initStepHandlers.validateTailwind();
|
|
24
|
+
if (!isValidTailwind)
|
|
25
|
+
return;
|
|
26
|
+
// Step 3: Detect existing interactivity
|
|
27
|
+
let hasAlpine = hasAlpineJs();
|
|
28
|
+
let hasLivewireSupport = hasLivewire();
|
|
29
|
+
const detectedPm = await initStepHandlers.detectPackageManager();
|
|
30
|
+
// Step 4: Choose package manager if not provided
|
|
31
|
+
const packageManager = options.packageManager ||
|
|
32
|
+
(await initStepHandlers.choosePackageManager(detectedPm));
|
|
33
|
+
// Step 5: Choose theme if not provided
|
|
34
|
+
const theme = options.theme || (await initStepHandlers.chooseTheme());
|
|
35
|
+
// Step 6: Setup directories
|
|
36
|
+
await retryWithSpinner("Creating directories...", async () => {
|
|
37
|
+
await initStepHandlers.setupDirectories(fileSystem);
|
|
38
|
+
});
|
|
39
|
+
// Step 7: Setup theme
|
|
40
|
+
await retryWithSpinner("Setting up theme...", async () => {
|
|
41
|
+
await initStepHandlers.setupTheme(theme);
|
|
42
|
+
});
|
|
43
|
+
// Step 8: Handle interactivity
|
|
44
|
+
let interactivityConfig = {
|
|
45
|
+
framework: "none",
|
|
46
|
+
source: "existing",
|
|
47
|
+
};
|
|
48
|
+
if (!hasInteractivitySupport()) {
|
|
49
|
+
const res = await prompts({
|
|
50
|
+
type: "confirm",
|
|
51
|
+
name: "installAlpine",
|
|
52
|
+
message: "Velar components work best with Alpine.js. Would you like to install it?",
|
|
53
|
+
initial: true,
|
|
54
|
+
});
|
|
55
|
+
if (res.installAlpine) {
|
|
56
|
+
logger.info(`Installing Alpine.js with ${packageManager}...`);
|
|
57
|
+
const installSuccess = await retryWithSpinner("Installing Alpine.js...", () => installAlpineJs(packageManager));
|
|
58
|
+
if (installSuccess) {
|
|
59
|
+
const addToAppSuccess = await retryWithSpinner("Adding Alpine.js to app.js...", () => addAlpineToAppJs());
|
|
60
|
+
if (addToAppSuccess) {
|
|
61
|
+
hasAlpine = true;
|
|
62
|
+
interactivityConfig = {
|
|
63
|
+
framework: "alpine",
|
|
64
|
+
source: "npm",
|
|
65
|
+
};
|
|
66
|
+
logger.success("Alpine.js ready!");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
logger.warning("Alpine.js installation completed - you'll need to add it manually");
|
|
71
|
+
logger.step(`${packageManager} add alpinejs`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
logger.info("You can install it later:");
|
|
76
|
+
logger.step(`${packageManager} add alpinejs`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (hasAlpine) {
|
|
80
|
+
interactivityConfig = {
|
|
81
|
+
framework: "alpine",
|
|
82
|
+
source: "existing",
|
|
83
|
+
};
|
|
84
|
+
logger.success("Alpine.js detected - components will be fully interactive");
|
|
85
|
+
}
|
|
86
|
+
else if (hasLivewireSupport) {
|
|
87
|
+
interactivityConfig = {
|
|
88
|
+
framework: "livewire",
|
|
89
|
+
source: "existing",
|
|
90
|
+
};
|
|
91
|
+
logger.success("Livewire detected - components will work with Livewire");
|
|
92
|
+
}
|
|
93
|
+
// Step 9: Setup CSS integration
|
|
94
|
+
const css = await initStepHandlers.setupCss();
|
|
95
|
+
// Step 10: Create configuration
|
|
96
|
+
await retryWithSpinner("Creating configuration...", async () => {
|
|
97
|
+
initStepHandlers.createConfig({
|
|
98
|
+
version: "0.1",
|
|
99
|
+
theme,
|
|
100
|
+
packageManager,
|
|
101
|
+
interactivity: interactivityConfig,
|
|
102
|
+
css: {
|
|
103
|
+
entry: css.path,
|
|
104
|
+
velar: "resources/css/velar.css",
|
|
105
|
+
},
|
|
106
|
+
components: {
|
|
107
|
+
path: "resources/views/components/ui",
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
// Step 11: Show summary
|
|
112
|
+
initStepHandlers.showSummary({
|
|
113
|
+
theme,
|
|
114
|
+
packageManager,
|
|
115
|
+
interactivityConfig,
|
|
116
|
+
css,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
logger.error("Initialization failed", error.message);
|
|
121
|
+
process.exit(1);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
return initCmd;
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=init-new.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-new.js","sourceRoot":"","sources":["../../src/commands/init-new.ts"],"names":[],"mappings":"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"}
|