zard-cli 1.0.0-beta.1
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 +188 -0
- package/dist/commands/add/component-installer.d.ts +5 -0
- package/dist/commands/add/component-installer.d.ts.map +1 -0
- package/dist/commands/add/component-installer.js +17 -0
- package/dist/commands/add/component-installer.js.map +1 -0
- package/dist/commands/add/component-selector.d.ts +2 -0
- package/dist/commands/add/component-selector.d.ts.map +1 -0
- package/dist/commands/add/component-selector.js +31 -0
- package/dist/commands/add/component-selector.js.map +1 -0
- package/dist/commands/add/dark-mode-setup.d.ts +7 -0
- package/dist/commands/add/dark-mode-setup.d.ts.map +1 -0
- package/dist/commands/add/dark-mode-setup.js +43 -0
- package/dist/commands/add/dark-mode-setup.js.map +1 -0
- package/dist/commands/add/dependency-resolver.d.ts +27 -0
- package/dist/commands/add/dependency-resolver.d.ts.map +1 -0
- package/dist/commands/add/dependency-resolver.js +108 -0
- package/dist/commands/add/dependency-resolver.js.map +1 -0
- package/dist/commands/add/index.d.ts +3 -0
- package/dist/commands/add/index.d.ts.map +1 -0
- package/dist/commands/add/index.js +137 -0
- package/dist/commands/add/index.js.map +1 -0
- package/dist/commands/init/config-prompter.d.ts +71 -0
- package/dist/commands/init/config-prompter.d.ts.map +1 -0
- package/dist/commands/init/config-prompter.js +109 -0
- package/dist/commands/init/config-prompter.js.map +1 -0
- package/dist/commands/init/dependencies.d.ts +11 -0
- package/dist/commands/init/dependencies.d.ts.map +1 -0
- package/dist/commands/init/dependencies.js +33 -0
- package/dist/commands/init/dependencies.js.map +1 -0
- package/dist/commands/init/index.d.ts +3 -0
- package/dist/commands/init/index.d.ts.map +1 -0
- package/dist/commands/init/index.js +121 -0
- package/dist/commands/init/index.js.map +1 -0
- package/dist/commands/init/tailwind-setup.d.ts +5 -0
- package/dist/commands/init/tailwind-setup.d.ts.map +1 -0
- package/dist/commands/init/tailwind-setup.js +24 -0
- package/dist/commands/init/tailwind-setup.js.map +1 -0
- package/dist/commands/init/theme-loader.d.ts +2 -0
- package/dist/commands/init/theme-loader.d.ts.map +1 -0
- package/dist/commands/init/theme-loader.js +62 -0
- package/dist/commands/init/theme-loader.js.map +1 -0
- package/dist/commands/init/tsconfig-updater.d.ts +3 -0
- package/dist/commands/init/tsconfig-updater.d.ts.map +1 -0
- package/dist/commands/init/tsconfig-updater.js +49 -0
- package/dist/commands/init/tsconfig-updater.js.map +1 -0
- package/dist/commands/init/update-angular-config.d.ts +7 -0
- package/dist/commands/init/update-angular-config.d.ts.map +1 -0
- package/dist/commands/init/update-angular-config.js +81 -0
- package/dist/commands/init/update-angular-config.js.map +1 -0
- package/dist/config/registry-config.d.ts +2 -0
- package/dist/config/registry-config.d.ts.map +1 -0
- package/dist/config/registry-config.js +2 -0
- package/dist/config/registry-config.js.map +1 -0
- package/dist/constants/app.constants.d.ts +2 -0
- package/dist/constants/app.constants.d.ts.map +1 -0
- package/dist/constants/app.constants.js +24 -0
- package/dist/constants/app.constants.js.map +1 -0
- package/dist/core/registry/index.d.ts +6 -0
- package/dist/core/registry/index.d.ts.map +1 -0
- package/dist/core/registry/index.js +9 -0
- package/dist/core/registry/index.js.map +1 -0
- package/dist/core/registry/registry-data.d.ts +13 -0
- package/dist/core/registry/registry-data.d.ts.map +1 -0
- package/dist/core/registry/registry-data.js +854 -0
- package/dist/core/registry/registry-data.js.map +1 -0
- package/dist/core/themes/index.d.ts +3 -0
- package/dist/core/themes/index.d.ts.map +1 -0
- package/dist/core/themes/index.js +3 -0
- package/dist/core/themes/index.js.map +1 -0
- package/dist/core/themes/theme-definitions.d.ts +7 -0
- package/dist/core/themes/theme-definitions.d.ts.map +1 -0
- package/dist/core/themes/theme-definitions.js +465 -0
- package/dist/core/themes/theme-definitions.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config.d.ts +101 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +87 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/fetch-component.d.ts +3 -0
- package/dist/utils/fetch-component.d.ts.map +1 -0
- package/dist/utils/fetch-component.js +75 -0
- package/dist/utils/fetch-component.js.map +1 -0
- package/dist/utils/get-package-info.d.ts +9 -0
- package/dist/utils/get-package-info.d.ts.map +1 -0
- package/dist/utils/get-package-info.js +52 -0
- package/dist/utils/get-package-info.js.map +1 -0
- package/dist/utils/get-project-info.d.ts +9 -0
- package/dist/utils/get-project-info.d.ts.map +1 -0
- package/dist/utils/get-project-info.js +43 -0
- package/dist/utils/get-project-info.js.map +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +27 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/package-manager.d.ts +5 -0
- package/dist/utils/package-manager.d.ts.map +1 -0
- package/dist/utils/package-manager.js +47 -0
- package/dist/utils/package-manager.js.map +1 -0
- package/dist/utils/registry.d.ts +36 -0
- package/dist/utils/registry.d.ts.map +1 -0
- package/dist/utils/registry.js +71 -0
- package/dist/utils/registry.js.map +1 -0
- package/dist/utils/theme-selector.d.ts +4 -0
- package/dist/utils/theme-selector.d.ts.map +1 -0
- package/dist/utils/theme-selector.js +33 -0
- package/dist/utils/theme-selector.js.map +1 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
# @ngzard/ui
|
|
2
|
+
|
|
3
|
+
Beautiful Angular components built with TailwindCSS v4. Add modern, accessible components to your Angular apps with a single command.
|
|
4
|
+
|
|
5
|
+
## 🚀 Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Init the CLI
|
|
9
|
+
npx @ngzard/ui@latest init
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## ✨ Features
|
|
13
|
+
|
|
14
|
+
- 🎨 **Beautiful Components** - Modern, accessible UI components
|
|
15
|
+
- ⚡ **TailwindCSS v4** - Latest CSS framework with native cascade layers
|
|
16
|
+
- 🔧 **TypeScript First** - Built for modern Angular with full type safety
|
|
17
|
+
- 🎯 **Angular Focused** - Designed specifically for the Angular ecosystem
|
|
18
|
+
- 📱 **Responsive** - Mobile-first components that work everywhere
|
|
19
|
+
- 🌙 **Dark Mode** - Built-in dark mode support
|
|
20
|
+
- 🧩 **Modular** - Add only the components you need
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
Use the `ngzard` to add components to your Angular project:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Initialize your project
|
|
28
|
+
npx @ngzard/ui@latest init
|
|
29
|
+
|
|
30
|
+
# Add components to your project
|
|
31
|
+
npx @ngzard/ui@latest add button
|
|
32
|
+
npx @ngzard/ui@latest add button card dialog
|
|
33
|
+
|
|
34
|
+
# Add all components
|
|
35
|
+
npx @ngzard/ui@latest add --all
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Commands
|
|
39
|
+
|
|
40
|
+
### `init`
|
|
41
|
+
|
|
42
|
+
Initialize your project and install dependencies for ZardUI components.
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
npx @ngzard/ui@latest init
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This will:
|
|
49
|
+
- Install required dependencies (Tailwind CSS v4, class-variance-authority, etc.)
|
|
50
|
+
- Create `.postcssrc.json` for Tailwind CSS PostCSS plugin
|
|
51
|
+
- Set up `src/styles.css` with Tailwind configuration and design tokens
|
|
52
|
+
- Configure TypeScript path mappings in `tsconfig.json`
|
|
53
|
+
- Create utility functions in `src/app/shared/utils/`
|
|
54
|
+
|
|
55
|
+
**Options:**
|
|
56
|
+
- `-y, --yes` - Skip confirmation prompts
|
|
57
|
+
- `-c, --cwd <path>` - Specify working directory
|
|
58
|
+
|
|
59
|
+
### `add`
|
|
60
|
+
|
|
61
|
+
Add components to your project.
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
npx @ngzard/ui@latest add [components...]
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**Examples:**
|
|
68
|
+
```bash
|
|
69
|
+
# Add a single component
|
|
70
|
+
npx @ngzard/ui@latest add button
|
|
71
|
+
|
|
72
|
+
# Add multiple components
|
|
73
|
+
npx @ngzard/ui@latest add button card badge
|
|
74
|
+
|
|
75
|
+
# Add all components
|
|
76
|
+
npx @ngzard/ui@latest add --all
|
|
77
|
+
|
|
78
|
+
# Interactive selection
|
|
79
|
+
npx @ngzard/ui@latest add
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Options:**
|
|
83
|
+
- `-y, --yes` - Skip confirmation prompts
|
|
84
|
+
- `-o, --overwrite` - Overwrite existing files
|
|
85
|
+
- `-c, --cwd <path>` - Specify working directory
|
|
86
|
+
- `-a, --all` - Add all available components
|
|
87
|
+
- `-p, --path <path>` - Custom path for components
|
|
88
|
+
|
|
89
|
+
## Available Components
|
|
90
|
+
|
|
91
|
+
- `accordion` - Collapsible content panels
|
|
92
|
+
- `alert` - Alert messages with variants
|
|
93
|
+
- `avatar` - User profile pictures with fallbacks
|
|
94
|
+
- `badge` - Small status indicators
|
|
95
|
+
- `breadcrumb` - Navigation breadcrumbs
|
|
96
|
+
- `button` - Interactive buttons with variants
|
|
97
|
+
- `card` - Content containers
|
|
98
|
+
- `checkbox` - Form checkboxes
|
|
99
|
+
- `dialog` - Modal dialogs
|
|
100
|
+
- `divider` - Visual separators
|
|
101
|
+
- `dropdown` - Dropdown menus
|
|
102
|
+
- `input` - Form inputs
|
|
103
|
+
- `loader` - Loading indicators
|
|
104
|
+
- `progress-bar` - Progress indicators
|
|
105
|
+
- `radio` - Radio button inputs
|
|
106
|
+
- `select` - Select dropdowns
|
|
107
|
+
- `slider` - Range sliders
|
|
108
|
+
- `switch` - Toggle switches
|
|
109
|
+
- `tabs` - Tabbed interfaces
|
|
110
|
+
- `toggle` - Toggle buttons
|
|
111
|
+
- `tooltip` - Hover tooltips
|
|
112
|
+
|
|
113
|
+
## Configuration
|
|
114
|
+
|
|
115
|
+
The CLI stores configuration in `components.json`:
|
|
116
|
+
|
|
117
|
+
```json
|
|
118
|
+
{
|
|
119
|
+
"style": "css",
|
|
120
|
+
"tailwind": {
|
|
121
|
+
"css": "src/styles.css",
|
|
122
|
+
"baseColor": "slate"
|
|
123
|
+
},
|
|
124
|
+
"baseUrl": "src/app",
|
|
125
|
+
"aliases": {
|
|
126
|
+
"components": "@/shared/components",
|
|
127
|
+
"utils": "@/shared/utils",
|
|
128
|
+
"core": "@/shared/core",
|
|
129
|
+
"services": "@/shared/services"
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
## Requirements
|
|
135
|
+
|
|
136
|
+
- Angular 19+
|
|
137
|
+
- Node.js 20 or 22
|
|
138
|
+
- TypeScript project
|
|
139
|
+
|
|
140
|
+
## Path Mappings
|
|
141
|
+
|
|
142
|
+
The CLI automatically configures TypeScript path mappings in your `tsconfig.json`:
|
|
143
|
+
|
|
144
|
+
```json
|
|
145
|
+
{
|
|
146
|
+
"compilerOptions": {
|
|
147
|
+
"baseUrl": "./",
|
|
148
|
+
"paths": {
|
|
149
|
+
"@/*": ["src/app/*"]
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
This allows you to import components and utilities using clean paths:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
import { ZardButtonComponent } from '@/shared/components/button';
|
|
159
|
+
import { mergeClasses } from '@/shared/utils/merge-classes';
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## Tailwind CSS v4 Support
|
|
163
|
+
|
|
164
|
+
ZardUI CLI is built specifically for Tailwind CSS v4, using the new inline configuration approach:
|
|
165
|
+
|
|
166
|
+
- No `tailwind.config.js` needed
|
|
167
|
+
- Configuration via `.postcssrc.json`
|
|
168
|
+
- Design tokens defined in CSS with `@theme`
|
|
169
|
+
- Plugin configuration with `@plugin`
|
|
170
|
+
|
|
171
|
+
## Troubleshooting
|
|
172
|
+
|
|
173
|
+
### "Configuration not found"
|
|
174
|
+
Run `npx @ngzard/ui@latest init` first to initialize your project.
|
|
175
|
+
|
|
176
|
+
### "Not an Angular project"
|
|
177
|
+
Make sure you're in the root directory of an Angular project with a `package.json` that includes `@angular/core`.
|
|
178
|
+
|
|
179
|
+
### Rate limiting from GitHub
|
|
180
|
+
The CLI fetches components from GitHub. If you encounter rate limiting, wait a few minutes before retrying.
|
|
181
|
+
|
|
182
|
+
## Contributing
|
|
183
|
+
|
|
184
|
+
This CLI is part of the [ZardUI](https://github.com/zard-ui/zardui) project. Please refer to the main repository for contribution guidelines.
|
|
185
|
+
|
|
186
|
+
## License
|
|
187
|
+
|
|
188
|
+
MIT © ZardUI
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-installer.d.ts","sourceRoot":"","sources":["../../../src/commands/add/component-installer.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAGpD,wBAAsB,gBAAgB,CACpC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,GAAG,CAAA;CAAE,GACtC,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { promises as fs } from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { fetchComponent } from '../../utils/registry.js';
|
|
4
|
+
export async function installComponent(componentName, targetDir, config) {
|
|
5
|
+
const component = await fetchComponent(componentName, config);
|
|
6
|
+
await fs.mkdir(targetDir, { recursive: true });
|
|
7
|
+
for (const file of component.files) {
|
|
8
|
+
await installComponentFile(file, targetDir);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
async function installComponentFile(file, targetDir) {
|
|
12
|
+
const filePath = path.join(targetDir, file.name);
|
|
13
|
+
const fileDir = path.dirname(filePath);
|
|
14
|
+
await fs.mkdir(fileDir, { recursive: true });
|
|
15
|
+
await fs.writeFile(filePath, file.content, 'utf8');
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=component-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-installer.js","sourceRoot":"","sources":["../../../src/commands/add/component-installer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAGlC,OAAO,EAAE,cAAc,EAAqB,MAAM,yBAAyB,CAAC;AAE5E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,SAAiB,EACjB,MAAuC;IAEvC,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;IAE9D,MAAM,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC;QACnC,MAAM,oBAAoB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAA8B,EAAE,SAAiB;IACnF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvC,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,MAAM,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-selector.d.ts","sourceRoot":"","sources":["../../../src/commands/add/component-selector.ts"],"names":[],"mappings":"AAKA,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUhG"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { logger } from '../../utils/logger.js';
|
|
2
|
+
import prompts from 'prompts';
|
|
3
|
+
import { getAllComponentNames } from './dependency-resolver.js';
|
|
4
|
+
export async function selectComponents(components, allFlag) {
|
|
5
|
+
if (allFlag) {
|
|
6
|
+
return getAllComponentNames();
|
|
7
|
+
}
|
|
8
|
+
if (!components?.length) {
|
|
9
|
+
return await promptForComponents();
|
|
10
|
+
}
|
|
11
|
+
return components;
|
|
12
|
+
}
|
|
13
|
+
async function promptForComponents() {
|
|
14
|
+
const allNames = await getAllComponentNames();
|
|
15
|
+
const { components: selected } = await prompts({
|
|
16
|
+
type: 'multiselect',
|
|
17
|
+
name: 'components',
|
|
18
|
+
message: 'Which components would you like to add?',
|
|
19
|
+
hint: 'Space to select. A to toggle all. Enter to submit.',
|
|
20
|
+
choices: allNames.map(name => ({
|
|
21
|
+
title: name,
|
|
22
|
+
value: name,
|
|
23
|
+
})),
|
|
24
|
+
});
|
|
25
|
+
if (!selected?.length) {
|
|
26
|
+
logger.warn('No components selected. Exiting.');
|
|
27
|
+
process.exit(0);
|
|
28
|
+
}
|
|
29
|
+
return selected;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=component-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component-selector.js","sourceRoot":"","sources":["../../../src/commands/add/component-selector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAoB,EAAE,OAAgB;IAC3E,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,oBAAoB,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QACxB,OAAO,MAAM,mBAAmB,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,mBAAmB;IAChC,MAAM,QAAQ,GAAG,MAAM,oBAAoB,EAAE,CAAC;IAE9C,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC;QAC7C,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,YAAY;QAClB,OAAO,EAAE,yCAAyC;QAClD,IAAI,EAAE,oDAAoD;QAC1D,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC7B,KAAK,EAAE,IAAI;YACX,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;KACJ,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dark-mode-setup.d.ts","sourceRoot":"","sources":["../../../src/commands/add/dark-mode-setup.ts"],"names":[],"mappings":"AAQA,wBAAsB,6BAA6B,CACjD,GAAG,EAAE,MAAM,EACX,cAAc,EAAE;IAAE,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GACpE,OAAO,CAAC,IAAI,CAAC,CAmDf"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { logger } from '../../utils/logger.js';
|
|
2
|
+
import { existsSync } from 'fs';
|
|
3
|
+
import * as fsPromises from 'fs/promises';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
const DARK_MODE_IMPORT = "import { ZardDarkMode } from '../../services/dark-mode';";
|
|
6
|
+
const DARK_MODE_INITIALIZER = 'provideAppInitializer(() => inject(ZardDarkMode).init())';
|
|
7
|
+
export async function updateProvideZardWithDarkMode(cwd, resolvedConfig) {
|
|
8
|
+
const provideZardPath = path.join(resolvedConfig.resolvedPaths.core, 'provider/providezard.ts');
|
|
9
|
+
if (!existsSync(provideZardPath)) {
|
|
10
|
+
logger.warn('providezard.ts not found. Skipping dark mode provider setup.');
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
let content = await fsPromises.readFile(provideZardPath, 'utf8');
|
|
14
|
+
if (content.includes('ZardDarkMode')) {
|
|
15
|
+
logger.info('Dark mode already configured in providezard.ts');
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!content.includes('inject,')) {
|
|
19
|
+
content = content.replace(/import \{ (.*) \} from '@angular\/core';/, "import { $1, inject } from '@angular/core';");
|
|
20
|
+
}
|
|
21
|
+
if (!content.includes('provideAppInitializer')) {
|
|
22
|
+
content = content.replace(/import \{ (.*) \} from '@angular\/core';/, "import { $1, provideAppInitializer } from '@angular/core';");
|
|
23
|
+
}
|
|
24
|
+
const importRegex = /^import .* from '.*';\n?/gm;
|
|
25
|
+
let lastImportMatch = null;
|
|
26
|
+
let match;
|
|
27
|
+
while ((match = importRegex.exec(content)) !== null) {
|
|
28
|
+
lastImportMatch = match;
|
|
29
|
+
}
|
|
30
|
+
if (lastImportMatch) {
|
|
31
|
+
const insertionIndex = lastImportMatch.index + lastImportMatch[0].length;
|
|
32
|
+
content = content.slice(0, insertionIndex) + DARK_MODE_IMPORT + '\n' + content.slice(insertionIndex);
|
|
33
|
+
}
|
|
34
|
+
content = content.replace(/return makeEnvironmentProviders\(\[(.*?)\]\);/s, (match, providers) => {
|
|
35
|
+
const trimmedProviders = providers.trim();
|
|
36
|
+
if (trimmedProviders) {
|
|
37
|
+
return `return makeEnvironmentProviders([${DARK_MODE_INITIALIZER}, ${trimmedProviders}]);`;
|
|
38
|
+
}
|
|
39
|
+
return `return makeEnvironmentProviders([${DARK_MODE_INITIALIZER}]);`;
|
|
40
|
+
});
|
|
41
|
+
await fsPromises.writeFile(provideZardPath, content, 'utf8');
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=dark-mode-setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dark-mode-setup.js","sourceRoot":"","sources":["../../../src/commands/add/dark-mode-setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,gBAAgB,GAAG,0DAA0D,CAAC;AACpF,MAAM,qBAAqB,GAAG,0DAA0D,CAAC;AAEzF,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,GAAW,EACX,cAAqE;IAErE,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,EAAE,yBAAyB,CAAC,CAAC;IAEhG,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAEjE,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACjC,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,0CAA0C,EAC1C,6CAA6C,CAC9C,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAC/C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,0CAA0C,EAC1C,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,4BAA4B,CAAC;IACjD,IAAI,eAAe,GAA4B,IAAI,CAAC;IACpD,IAAI,KAA8B,CAAC;IAEnC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,eAAe,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACzE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,GAAG,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IACvG,CAAC;IAED,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gDAAgD,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QAC/F,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,gBAAgB,EAAE,CAAC;YACrB,OAAO,oCAAoC,qBAAqB,KAAK,gBAAgB,KAAK,CAAC;QAC7F,CAAC;QACD,OAAO,oCAAoC,qBAAqB,KAAK,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,CAAC,SAAS,CAAC,eAAe,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Config } from '../../utils/config.js';
|
|
2
|
+
import { type RegistryIndex } from '../../utils/registry.js';
|
|
3
|
+
export declare function getTargetDir(component: ComponentMeta, resolvedConfig: Config & {
|
|
4
|
+
resolvedPaths: any;
|
|
5
|
+
}, cwd: string, customPath?: string): string;
|
|
6
|
+
export interface ComponentMeta {
|
|
7
|
+
name: string;
|
|
8
|
+
basePath?: string;
|
|
9
|
+
dependencies?: string[];
|
|
10
|
+
devDependencies?: string[];
|
|
11
|
+
registryDependencies?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface ResolvedDependencies {
|
|
14
|
+
componentsToInstall: ComponentMeta[];
|
|
15
|
+
dependenciesToInstall: Set<string>;
|
|
16
|
+
}
|
|
17
|
+
export declare function getRegistryIndex(): Promise<RegistryIndex>;
|
|
18
|
+
export declare function getComponentMeta(name: string): Promise<ComponentMeta | undefined>;
|
|
19
|
+
export declare function getAllComponentNames(): Promise<string[]>;
|
|
20
|
+
export declare function resolveDependencies(selectedComponents: string[], resolvedConfig: Config & {
|
|
21
|
+
resolvedPaths: any;
|
|
22
|
+
}, cwd: string, options: {
|
|
23
|
+
all?: boolean;
|
|
24
|
+
path?: string;
|
|
25
|
+
overwrite?: boolean;
|
|
26
|
+
}): Promise<ResolvedDependencies>;
|
|
27
|
+
//# sourceMappingURL=dependency-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.d.ts","sourceRoot":"","sources":["../../../src/commands/add/dependency-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAajF,wBAAgB,YAAY,CAC1B,SAAS,EAAE,aAAa,EACxB,cAAc,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,GAAG,CAAA;CAAE,EAC/C,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAoBR;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,oBAAoB;IACnC,mBAAmB,EAAE,aAAa,EAAE,CAAC;IACrC,qBAAqB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACpC;AAID,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,aAAa,CAAC,CAK/D;AAED,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CAYvF;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAG9D;AAED,wBAAsB,mBAAmB,CACvC,kBAAkB,EAAE,MAAM,EAAE,EAC5B,cAAc,EAAE,MAAM,GAAG;IAAE,aAAa,EAAE,GAAG,CAAA;CAAE,EAC/C,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,GAC7D,OAAO,CAAC,oBAAoB,CAAC,CA4C/B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import { logger } from '../../utils/logger.js';
|
|
4
|
+
import { fetchRegistryIndex } from '../../utils/registry.js';
|
|
5
|
+
function isComponentInstalled(dir) {
|
|
6
|
+
if (!existsSync(dir))
|
|
7
|
+
return false;
|
|
8
|
+
try {
|
|
9
|
+
const files = readdirSync(dir);
|
|
10
|
+
return files.length > 0;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
export function getTargetDir(component, resolvedConfig, cwd, customPath) {
|
|
17
|
+
const basePath = component.basePath ?? component.name;
|
|
18
|
+
if (customPath) {
|
|
19
|
+
return path.resolve(cwd, customPath, basePath);
|
|
20
|
+
}
|
|
21
|
+
if (basePath === 'core' || component.name === 'core') {
|
|
22
|
+
return resolvedConfig.resolvedPaths.core;
|
|
23
|
+
}
|
|
24
|
+
if (basePath === 'services') {
|
|
25
|
+
return resolvedConfig.resolvedPaths.services;
|
|
26
|
+
}
|
|
27
|
+
if (basePath === 'utils') {
|
|
28
|
+
return resolvedConfig.resolvedPaths.utils;
|
|
29
|
+
}
|
|
30
|
+
return path.resolve(resolvedConfig.resolvedPaths.components, basePath);
|
|
31
|
+
}
|
|
32
|
+
let registryIndexCache = null;
|
|
33
|
+
export async function getRegistryIndex() {
|
|
34
|
+
if (!registryIndexCache) {
|
|
35
|
+
registryIndexCache = await fetchRegistryIndex();
|
|
36
|
+
}
|
|
37
|
+
return registryIndexCache;
|
|
38
|
+
}
|
|
39
|
+
export async function getComponentMeta(name) {
|
|
40
|
+
const index = await getRegistryIndex();
|
|
41
|
+
const item = index.items.find(i => i.name === name);
|
|
42
|
+
if (!item)
|
|
43
|
+
return undefined;
|
|
44
|
+
return {
|
|
45
|
+
name: item.name,
|
|
46
|
+
basePath: item.basePath,
|
|
47
|
+
dependencies: item.dependencies,
|
|
48
|
+
devDependencies: item.devDependencies,
|
|
49
|
+
registryDependencies: item.registryDependencies,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
export async function getAllComponentNames() {
|
|
53
|
+
const index = await getRegistryIndex();
|
|
54
|
+
return index.items.map(item => item.name);
|
|
55
|
+
}
|
|
56
|
+
export async function resolveDependencies(selectedComponents, resolvedConfig, cwd, options) {
|
|
57
|
+
const componentMetas = [];
|
|
58
|
+
for (const name of selectedComponents) {
|
|
59
|
+
const meta = await getComponentMeta(name);
|
|
60
|
+
if (meta) {
|
|
61
|
+
componentMetas.push(meta);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (!componentMetas.length) {
|
|
65
|
+
logger.error('Selected components not found in registry.');
|
|
66
|
+
process.exit(1);
|
|
67
|
+
}
|
|
68
|
+
const dependenciesToInstall = new Set();
|
|
69
|
+
const componentsToInstall = [];
|
|
70
|
+
for (const component of componentMetas) {
|
|
71
|
+
const targetDir = getTargetDir(component, resolvedConfig, cwd, options.path);
|
|
72
|
+
if (isComponentInstalled(targetDir) && !options.overwrite) {
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
componentsToInstall.push(component);
|
|
76
|
+
addComponentDependencies(component, dependenciesToInstall);
|
|
77
|
+
if (component.registryDependencies && !options.all) {
|
|
78
|
+
await resolveRegistryDependencies(component, componentsToInstall, dependenciesToInstall, resolvedConfig, cwd, options);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
componentsToInstall,
|
|
83
|
+
dependenciesToInstall,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function addComponentDependencies(component, dependenciesToInstall) {
|
|
87
|
+
component.dependencies?.forEach(dep => dependenciesToInstall.add(dep));
|
|
88
|
+
}
|
|
89
|
+
async function resolveRegistryDependencies(component, componentsToInstall, dependenciesToInstall, resolvedConfig, cwd, options) {
|
|
90
|
+
if (!component.registryDependencies)
|
|
91
|
+
return;
|
|
92
|
+
for (const dep of component.registryDependencies) {
|
|
93
|
+
const depComponent = await getComponentMeta(dep);
|
|
94
|
+
if (!depComponent)
|
|
95
|
+
continue;
|
|
96
|
+
if (componentsToInstall.find(c => c.name === dep))
|
|
97
|
+
continue;
|
|
98
|
+
const depTargetDir = getTargetDir(depComponent, resolvedConfig, cwd, options.path);
|
|
99
|
+
if (!isComponentInstalled(depTargetDir) || options.overwrite) {
|
|
100
|
+
componentsToInstall.push(depComponent);
|
|
101
|
+
addComponentDependencies(depComponent, dependenciesToInstall);
|
|
102
|
+
if (depComponent.registryDependencies) {
|
|
103
|
+
await resolveRegistryDependencies(depComponent, componentsToInstall, dependenciesToInstall, resolvedConfig, cwd, options);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../../src/commands/add/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,GAAG,SAmDZ,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { installComponent } from '../../commands/add/component-installer.js';
|
|
2
|
+
import { selectComponents } from '../../commands/add/component-selector.js';
|
|
3
|
+
import { updateProvideZardWithDarkMode } from '../../commands/add/dark-mode-setup.js';
|
|
4
|
+
import { resolveDependencies, getTargetDir } from '../../commands/add/dependency-resolver.js';
|
|
5
|
+
import { injectThemeScript } from '../../commands/init/theme-loader.js';
|
|
6
|
+
import { getConfig, resolveConfigPaths } from '../../utils/config.js';
|
|
7
|
+
import { getProjectInfo } from '../../utils/get-project-info.js';
|
|
8
|
+
import { logger, spinner } from '../../utils/logger.js';
|
|
9
|
+
import { installPackages } from '../../utils/package-manager.js';
|
|
10
|
+
import chalk from 'chalk';
|
|
11
|
+
import { Command } from 'commander';
|
|
12
|
+
import { existsSync } from 'node:fs';
|
|
13
|
+
import * as path from 'node:path';
|
|
14
|
+
import prompts from 'prompts';
|
|
15
|
+
export const add = new Command()
|
|
16
|
+
.name('add')
|
|
17
|
+
.description('add a component to your project')
|
|
18
|
+
.argument('[components...]', 'the components to add')
|
|
19
|
+
.option('-y, --yes', 'skip confirmation prompt.', false)
|
|
20
|
+
.option('-o, --overwrite', 'overwrite existing files.', false)
|
|
21
|
+
.option('-c, --cwd <cwd>', 'the working directory. defaults to the current directory.', process.cwd())
|
|
22
|
+
.option('-a, --all', 'add all available components', false)
|
|
23
|
+
.option('-p, --path <path>', 'the path to add the component to.')
|
|
24
|
+
.action(async (components, options) => {
|
|
25
|
+
const cwd = path.resolve(options.cwd);
|
|
26
|
+
validateWorkingDirectory(cwd);
|
|
27
|
+
const config = await loadConfiguration(cwd);
|
|
28
|
+
await validateProject(cwd);
|
|
29
|
+
const resolvedConfig = await resolveConfigPaths(cwd, config);
|
|
30
|
+
const selectedComponents = await selectComponents(components, options.all);
|
|
31
|
+
const addSpinner = spinner('Resolving components...').start();
|
|
32
|
+
const { componentsToInstall, dependenciesToInstall } = await resolveDependencies(selectedComponents, resolvedConfig, cwd, options);
|
|
33
|
+
addSpinner.stop();
|
|
34
|
+
if (componentsToInstall.length === 0) {
|
|
35
|
+
logger.info('All components already installed.');
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (!options.yes) {
|
|
39
|
+
const shouldProceed = await confirmInstallation(componentsToInstall.length, dependenciesToInstall.size);
|
|
40
|
+
if (!shouldProceed) {
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
await installDependencies(dependenciesToInstall, cwd, config.packageManager);
|
|
45
|
+
await installComponents(componentsToInstall, cwd, resolvedConfig, options);
|
|
46
|
+
const isDarkModeBeingInstalled = componentsToInstall.some(c => c.name === 'dark-mode');
|
|
47
|
+
if (isDarkModeBeingInstalled) {
|
|
48
|
+
await setupDarkMode(cwd, resolvedConfig);
|
|
49
|
+
}
|
|
50
|
+
logger.break();
|
|
51
|
+
logger.success('Done!');
|
|
52
|
+
});
|
|
53
|
+
function validateWorkingDirectory(cwd) {
|
|
54
|
+
if (!existsSync(cwd)) {
|
|
55
|
+
logger.error(`The path ${cwd} does not exist. Please try again.`);
|
|
56
|
+
process.exit(1);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
async function loadConfiguration(cwd) {
|
|
60
|
+
const config = await getConfig(cwd);
|
|
61
|
+
if (!config) {
|
|
62
|
+
logger.error('Configuration not found. Please run `ngzard init` first.');
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
return config;
|
|
66
|
+
}
|
|
67
|
+
async function validateProject(cwd) {
|
|
68
|
+
const projectInfo = await getProjectInfo(cwd);
|
|
69
|
+
if (projectInfo.framework !== 'angular') {
|
|
70
|
+
logger.error('This project does not appear to be an Angular project.');
|
|
71
|
+
process.exit(1);
|
|
72
|
+
}
|
|
73
|
+
return projectInfo;
|
|
74
|
+
}
|
|
75
|
+
async function confirmInstallation(componentsCount, dependenciesCount) {
|
|
76
|
+
const { proceed } = await prompts({
|
|
77
|
+
type: 'confirm',
|
|
78
|
+
name: 'proceed',
|
|
79
|
+
message: `Ready to install ${componentsCount} component(s) and ${dependenciesCount} dependencies. Proceed?`,
|
|
80
|
+
initial: true,
|
|
81
|
+
});
|
|
82
|
+
return proceed;
|
|
83
|
+
}
|
|
84
|
+
async function installDependencies(dependenciesToInstall, cwd, packageManager) {
|
|
85
|
+
if (dependenciesToInstall.size === 0)
|
|
86
|
+
return;
|
|
87
|
+
const depsSpinner = spinner('Installing dependencies...').start();
|
|
88
|
+
await installPackages(Array.from(dependenciesToInstall), cwd, packageManager, false);
|
|
89
|
+
depsSpinner.succeed('Dependencies installed');
|
|
90
|
+
}
|
|
91
|
+
async function installComponents(componentsToInstall, cwd, resolvedConfig, options) {
|
|
92
|
+
const installSpinner = spinner('Installing components...').start();
|
|
93
|
+
const installed = [];
|
|
94
|
+
const failed = [];
|
|
95
|
+
for (const component of componentsToInstall) {
|
|
96
|
+
try {
|
|
97
|
+
installSpinner.text = `Installing ${component.name}...`;
|
|
98
|
+
const targetDir = getTargetDir(component, resolvedConfig, cwd, options.path);
|
|
99
|
+
await installComponent(component.name, targetDir, resolvedConfig);
|
|
100
|
+
installed.push(component.name);
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
failed.push(component.name);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (failed.length > 0) {
|
|
107
|
+
installSpinner.fail(`Failed to install: ${failed.join(', ')}`);
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
installSpinner.succeed(`Installed ${installed.length} component${installed.length > 1 ? 's' : ''}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async function setupDarkMode(cwd, resolvedConfig) {
|
|
114
|
+
logger.break();
|
|
115
|
+
logger.info('Dark mode requires additional configuration.');
|
|
116
|
+
const { indexFile } = await prompts({
|
|
117
|
+
type: 'text',
|
|
118
|
+
name: 'indexFile',
|
|
119
|
+
message: `Where is your ${chalk.cyan('index.html')} file?`,
|
|
120
|
+
initial: 'src/index.html',
|
|
121
|
+
});
|
|
122
|
+
if (!indexFile) {
|
|
123
|
+
logger.warn('Skipping dark mode script injection.');
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const darkModeSpinner = spinner('Configuring dark mode...').start();
|
|
127
|
+
try {
|
|
128
|
+
await injectThemeScript(cwd, indexFile);
|
|
129
|
+
await updateProvideZardWithDarkMode(cwd, resolvedConfig);
|
|
130
|
+
darkModeSpinner.succeed('Dark mode configured');
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
darkModeSpinner.fail('Failed to configure dark mode');
|
|
134
|
+
logger.error(error);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/add/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAsB,MAAM,0CAA0C,CAAC;AACjH,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AACvE,OAAO,EAAE,SAAS,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE;KAC7B,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,iCAAiC,CAAC;KAC9C,QAAQ,CAAC,iBAAiB,EAAE,uBAAuB,CAAC;KACpD,MAAM,CAAC,WAAW,EAAE,2BAA2B,EAAE,KAAK,CAAC;KACvD,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,EAAE,KAAK,CAAC;KAC7D,MAAM,CAAC,iBAAiB,EAAE,2DAA2D,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;KACrG,MAAM,CAAC,WAAW,EAAE,8BAA8B,EAAE,KAAK,CAAC;KAC1D,MAAM,CAAC,mBAAmB,EAAE,mCAAmC,CAAC;KAChE,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEtC,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAE9B,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,cAAc,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAE7D,MAAM,kBAAkB,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAE3E,MAAM,UAAU,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC,KAAK,EAAE,CAAC;IAC9D,MAAM,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,GAAG,MAAM,mBAAmB,CAC9E,kBAAkB,EAClB,cAAc,EACd,GAAG,EACH,OAAO,CACR,CAAC;IACF,UAAU,CAAC,IAAI,EAAE,CAAC;IAElB,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACjB,MAAM,aAAa,GAAG,MAAM,mBAAmB,CAAC,mBAAmB,CAAC,MAAM,EAAE,qBAAqB,CAAC,IAAI,CAAC,CAAC;QACxG,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,CAAC,qBAAqB,EAAE,GAAG,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IAC7E,MAAM,iBAAiB,CAAC,mBAAmB,EAAE,GAAG,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAE3E,MAAM,wBAAwB,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;IACvF,IAAI,wBAAwB,EAAE,CAAC;QAC7B,MAAM,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEL,SAAS,wBAAwB,CAAC,GAAW;IAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,KAAK,CAAC,YAAY,GAAG,oCAAoC,CAAC,CAAC;QAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;IAEpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,CAAC,KAAK,CAAC,0DAA0D,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,GAAW;IACxC,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAE9C,IAAI,WAAW,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,eAAuB,EAAE,iBAAyB;IACnF,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC;QAChC,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,oBAAoB,eAAe,qBAAqB,iBAAiB,yBAAyB;QAC3G,OAAO,EAAE,IAAI;KACd,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,qBAAkC,EAClC,GAAW,EACX,cAA+C;IAE/C,IAAI,qBAAqB,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO;IAE7C,MAAM,WAAW,GAAG,OAAO,CAAC,4BAA4B,CAAC,CAAC,KAAK,EAAE,CAAC;IAClE,MAAM,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;IACrF,WAAW,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;AAChD,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,mBAAoC,EACpC,GAAW,EACX,cAAmB,EACnB,OAA0B;IAE1B,MAAM,cAAc,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IACnE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;QAC5C,IAAI,CAAC;YACH,cAAc,CAAC,IAAI,GAAG,cAAc,SAAS,CAAC,IAAI,KAAK,CAAC;YAExD,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAE7E,MAAM,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,cAAc,CAAC,CAAC;YAClE,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,cAAc,CAAC,IAAI,CAAC,sBAAsB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,cAAc,CAAC,OAAO,CAAC,aAAa,SAAS,CAAC,MAAM,aAAa,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,GAAW,EAAE,cAAmB;IAC3D,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,MAAM,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAE5D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,OAAO,CAAC;QAClC,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,iBAAiB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ;QAC1D,OAAO,EAAE,gBAAgB;KAC1B,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,MAAM,eAAe,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC,KAAK,EAAE,CAAC;IAEpE,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QACxC,MAAM,6BAA6B,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACzD,eAAe,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAe,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACtD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
|