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.
Files changed (110) hide show
  1. package/README.md +188 -0
  2. package/dist/commands/add/component-installer.d.ts +5 -0
  3. package/dist/commands/add/component-installer.d.ts.map +1 -0
  4. package/dist/commands/add/component-installer.js +17 -0
  5. package/dist/commands/add/component-installer.js.map +1 -0
  6. package/dist/commands/add/component-selector.d.ts +2 -0
  7. package/dist/commands/add/component-selector.d.ts.map +1 -0
  8. package/dist/commands/add/component-selector.js +31 -0
  9. package/dist/commands/add/component-selector.js.map +1 -0
  10. package/dist/commands/add/dark-mode-setup.d.ts +7 -0
  11. package/dist/commands/add/dark-mode-setup.d.ts.map +1 -0
  12. package/dist/commands/add/dark-mode-setup.js +43 -0
  13. package/dist/commands/add/dark-mode-setup.js.map +1 -0
  14. package/dist/commands/add/dependency-resolver.d.ts +27 -0
  15. package/dist/commands/add/dependency-resolver.d.ts.map +1 -0
  16. package/dist/commands/add/dependency-resolver.js +108 -0
  17. package/dist/commands/add/dependency-resolver.js.map +1 -0
  18. package/dist/commands/add/index.d.ts +3 -0
  19. package/dist/commands/add/index.d.ts.map +1 -0
  20. package/dist/commands/add/index.js +137 -0
  21. package/dist/commands/add/index.js.map +1 -0
  22. package/dist/commands/init/config-prompter.d.ts +71 -0
  23. package/dist/commands/init/config-prompter.d.ts.map +1 -0
  24. package/dist/commands/init/config-prompter.js +109 -0
  25. package/dist/commands/init/config-prompter.js.map +1 -0
  26. package/dist/commands/init/dependencies.d.ts +11 -0
  27. package/dist/commands/init/dependencies.d.ts.map +1 -0
  28. package/dist/commands/init/dependencies.js +33 -0
  29. package/dist/commands/init/dependencies.js.map +1 -0
  30. package/dist/commands/init/index.d.ts +3 -0
  31. package/dist/commands/init/index.d.ts.map +1 -0
  32. package/dist/commands/init/index.js +121 -0
  33. package/dist/commands/init/index.js.map +1 -0
  34. package/dist/commands/init/tailwind-setup.d.ts +5 -0
  35. package/dist/commands/init/tailwind-setup.d.ts.map +1 -0
  36. package/dist/commands/init/tailwind-setup.js +24 -0
  37. package/dist/commands/init/tailwind-setup.js.map +1 -0
  38. package/dist/commands/init/theme-loader.d.ts +2 -0
  39. package/dist/commands/init/theme-loader.d.ts.map +1 -0
  40. package/dist/commands/init/theme-loader.js +62 -0
  41. package/dist/commands/init/theme-loader.js.map +1 -0
  42. package/dist/commands/init/tsconfig-updater.d.ts +3 -0
  43. package/dist/commands/init/tsconfig-updater.d.ts.map +1 -0
  44. package/dist/commands/init/tsconfig-updater.js +49 -0
  45. package/dist/commands/init/tsconfig-updater.js.map +1 -0
  46. package/dist/commands/init/update-angular-config.d.ts +7 -0
  47. package/dist/commands/init/update-angular-config.d.ts.map +1 -0
  48. package/dist/commands/init/update-angular-config.js +81 -0
  49. package/dist/commands/init/update-angular-config.js.map +1 -0
  50. package/dist/config/registry-config.d.ts +2 -0
  51. package/dist/config/registry-config.d.ts.map +1 -0
  52. package/dist/config/registry-config.js +2 -0
  53. package/dist/config/registry-config.js.map +1 -0
  54. package/dist/constants/app.constants.d.ts +2 -0
  55. package/dist/constants/app.constants.d.ts.map +1 -0
  56. package/dist/constants/app.constants.js +24 -0
  57. package/dist/constants/app.constants.js.map +1 -0
  58. package/dist/core/registry/index.d.ts +6 -0
  59. package/dist/core/registry/index.d.ts.map +1 -0
  60. package/dist/core/registry/index.js +9 -0
  61. package/dist/core/registry/index.js.map +1 -0
  62. package/dist/core/registry/registry-data.d.ts +13 -0
  63. package/dist/core/registry/registry-data.d.ts.map +1 -0
  64. package/dist/core/registry/registry-data.js +854 -0
  65. package/dist/core/registry/registry-data.js.map +1 -0
  66. package/dist/core/themes/index.d.ts +3 -0
  67. package/dist/core/themes/index.d.ts.map +1 -0
  68. package/dist/core/themes/index.js +3 -0
  69. package/dist/core/themes/index.js.map +1 -0
  70. package/dist/core/themes/theme-definitions.d.ts +7 -0
  71. package/dist/core/themes/theme-definitions.d.ts.map +1 -0
  72. package/dist/core/themes/theme-definitions.js +465 -0
  73. package/dist/core/themes/theme-definitions.js.map +1 -0
  74. package/dist/index.d.ts +2 -0
  75. package/dist/index.d.ts.map +1 -0
  76. package/dist/index.js +15 -0
  77. package/dist/index.js.map +1 -0
  78. package/dist/utils/config.d.ts +101 -0
  79. package/dist/utils/config.d.ts.map +1 -0
  80. package/dist/utils/config.js +87 -0
  81. package/dist/utils/config.js.map +1 -0
  82. package/dist/utils/fetch-component.d.ts +3 -0
  83. package/dist/utils/fetch-component.d.ts.map +1 -0
  84. package/dist/utils/fetch-component.js +75 -0
  85. package/dist/utils/fetch-component.js.map +1 -0
  86. package/dist/utils/get-package-info.d.ts +9 -0
  87. package/dist/utils/get-package-info.d.ts.map +1 -0
  88. package/dist/utils/get-package-info.js +52 -0
  89. package/dist/utils/get-package-info.js.map +1 -0
  90. package/dist/utils/get-project-info.d.ts +9 -0
  91. package/dist/utils/get-project-info.d.ts.map +1 -0
  92. package/dist/utils/get-project-info.js +43 -0
  93. package/dist/utils/get-project-info.js.map +1 -0
  94. package/dist/utils/logger.d.ts +9 -0
  95. package/dist/utils/logger.d.ts.map +1 -0
  96. package/dist/utils/logger.js +27 -0
  97. package/dist/utils/logger.js.map +1 -0
  98. package/dist/utils/package-manager.d.ts +5 -0
  99. package/dist/utils/package-manager.d.ts.map +1 -0
  100. package/dist/utils/package-manager.js +47 -0
  101. package/dist/utils/package-manager.js.map +1 -0
  102. package/dist/utils/registry.d.ts +36 -0
  103. package/dist/utils/registry.d.ts.map +1 -0
  104. package/dist/utils/registry.js +71 -0
  105. package/dist/utils/registry.js.map +1 -0
  106. package/dist/utils/theme-selector.d.ts +4 -0
  107. package/dist/utils/theme-selector.d.ts.map +1 -0
  108. package/dist/utils/theme-selector.js +33 -0
  109. package/dist/utils/theme-selector.js.map +1 -0
  110. 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,5 @@
1
+ import type { Config } from '../../utils/config.js';
2
+ export declare function installComponent(componentName: string, targetDir: string, config: Config & {
3
+ resolvedPaths: any;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=component-installer.d.ts.map
@@ -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,2 @@
1
+ export declare function selectComponents(components: string[], allFlag: boolean): Promise<string[]>;
2
+ //# sourceMappingURL=component-selector.d.ts.map
@@ -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,7 @@
1
+ export declare function updateProvideZardWithDarkMode(cwd: string, resolvedConfig: {
2
+ resolvedPaths: {
3
+ core: string;
4
+ services: string;
5
+ };
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=dark-mode-setup.d.ts.map
@@ -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,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const add: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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":"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"}