@devmed555/angular-clean-architecture-cli 0.0.1 → 0.0.3

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 (56) hide show
  1. package/README.md +370 -128
  2. package/bin/index.js +101 -3
  3. package/generators.json +19 -9
  4. package/package.json +2 -4
  5. package/src/generators/core/files/auth/auth.guard.ts.template +14 -0
  6. package/src/generators/core/files/auth/auth.service.ts.template +137 -0
  7. package/src/generators/core/files/auth/login.component.ts.template +165 -0
  8. package/src/generators/core/files/auth/signup.component.ts.template +171 -0
  9. package/src/generators/core/files/guard/__name__.guard.ts.template +6 -0
  10. package/src/generators/core/files/interceptor/__name__.interceptor.ts.template +6 -0
  11. package/src/generators/core/files/language-selector/language-selector.component.ts.template +82 -0
  12. package/src/generators/core/files/menu/__name__.component.html.template +14 -0
  13. package/src/generators/core/files/menu/__name__.component.scss.template +66 -0
  14. package/src/generators/core/files/menu/__name__.component.ts.template +24 -0
  15. package/src/generators/core/files/navbar/__name__.component.html.template +45 -0
  16. package/src/generators/core/files/navbar/__name__.component.scss.template +134 -0
  17. package/src/generators/core/files/navbar/__name__.component.ts.template +38 -0
  18. package/src/generators/core/files/service/__name__.service.ts.template +26 -0
  19. package/src/generators/core/files/theme-selector/theme-selector.component.ts.template +49 -0
  20. package/src/generators/core/files/translate/translate.pipe.ts.template +15 -0
  21. package/src/generators/core/files/translate/translate.service.ts.template +24 -0
  22. package/src/generators/core/generator.d.ts +7 -0
  23. package/src/generators/core/generator.js +49 -0
  24. package/src/generators/core/generator.js.map +1 -0
  25. package/src/generators/core/schema.json +34 -0
  26. package/src/generators/feature/blueprint.schema.json +34 -0
  27. package/src/generators/feature/files/application/store.ts.template +135 -0
  28. package/src/generators/feature/files/domain/model.ts.template +9 -0
  29. package/src/generators/{clean-feature → feature}/files/infrastructure/service.ts.template +5 -5
  30. package/src/generators/feature/files/ui/__singularName__.component.html.template +109 -0
  31. package/src/generators/feature/files/ui/__singularName__.component.scss.template +162 -0
  32. package/src/generators/feature/files/ui/__singularName__.component.ts.template +131 -0
  33. package/src/generators/feature/files/ui/_theme.scss.template +35 -0
  34. package/src/generators/feature/files/ui/form/form.component.ts.template +122 -0
  35. package/src/generators/feature/generator.d.ts +4 -0
  36. package/src/generators/feature/generator.js +209 -0
  37. package/src/generators/feature/generator.js.map +1 -0
  38. package/src/generators/feature/schema.d.ts +5 -0
  39. package/src/generators/{clean-feature → feature}/schema.json +25 -23
  40. package/src/generators/shared/files/ui/__name__.component.ts.template +57 -0
  41. package/src/generators/shared/files/util/__name__.ts.template +7 -0
  42. package/src/generators/shared/generator.d.ts +7 -0
  43. package/src/generators/shared/generator.js +31 -0
  44. package/src/generators/shared/generator.js.map +1 -0
  45. package/src/generators/shared/schema.json +23 -0
  46. package/src/index.js +1 -0
  47. package/src/utils/string-utils.d.ts +16 -0
  48. package/src/utils/string-utils.js +33 -0
  49. package/src/utils/string-utils.js.map +1 -0
  50. package/src/generators/clean-feature/files/application/store.ts.template +0 -6
  51. package/src/generators/clean-feature/files/domain/model.ts.template +0 -4
  52. package/src/generators/clean-feature/files/ui/component.ts.template +0 -44
  53. package/src/generators/clean-feature/generator.d.ts +0 -4
  54. package/src/generators/clean-feature/generator.js +0 -52
  55. package/src/generators/clean-feature/generator.js.map +0 -1
  56. package/src/generators/clean-feature/schema.d.ts +0 -4
package/README.md CHANGED
@@ -1,183 +1,425 @@
1
- # CLI Documentation
1
+ # Angular Clean Architecture CLI
2
2
 
3
- The CLI is an Nx generator designed to scaffold clean architecture features within the `sandbox` application.
3
+ [![npm version](https://img.shields.io/npm/v/@devmed555/angular-clean-architecture-cli.svg)](https://www.npmjs.com/package/@devmed555/angular-clean-architecture-cli)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
4
5
 
5
- ## Usage
6
+ > 🚀 Scaffold Angular features following Clean Architecture principles with NgRx SignalStore.
6
7
 
7
- To generate a new feature, run:
8
+ A powerful CLI that generates production-ready Angular features structured into **Domain**, **Infrastructure**, **Application**, and **UI** layers — keeping your codebase maintainable, testable, and scalable.
9
+
10
+ ---
11
+
12
+ ## 📦 Installation
13
+
14
+ ```bash
15
+ # Global installation (recommended)
16
+ npm install -g @devmed555/angular-clean-architecture-cli
17
+
18
+ # Verify installation
19
+ aca --version
20
+ ```
21
+
22
+ ### Prerequisites
23
+
24
+ - **Node.js** v18+
25
+ - **Angular** 16+ project
26
+ - **@ngrx/signals** installed:
27
+ ```bash
28
+ npm install @ngrx/signals
29
+ ```
30
+
31
+ ---
32
+
33
+ ## ⚡ Quick Start
34
+
35
+ ```bash
36
+ # Generate all features from feature-schema.json
37
+ aca g feature
38
+
39
+ # Generate a single feature with attributes
40
+ aca g feature product --attributes="name:string,price:number"
41
+
42
+ # Generate ALL core assets (auth, navbar, menu, theme, etc.)
43
+ aca g core
44
+
45
+ # Generate ALL shared components (button, card, input, etc.)
46
+ aca g shared
47
+ ```
48
+
49
+ ---
50
+
51
+ ## 🛠️ Generators
52
+
53
+ | Generator | Command | Description |
54
+ | ----------- | --------------- | ----------------------------------------------- |
55
+ | **Feature** | `aca g feature` | Complete Clean Architecture feature (4 layers) |
56
+ | **Core** | `aca g core` | Core system assets (auth, guards, interceptors) |
57
+ | **Shared** | `aca g shared` | Shared UI components & utilities |
58
+
59
+ ---
60
+
61
+ ## 📁 Feature Generator
62
+
63
+ Creates a complete Clean Architecture feature with 4 layers:
64
+
65
+ ```
66
+ features/<name>/
67
+ ├── domain/model.ts # Business entities & interfaces
68
+ ├── infrastructure/service.ts # HTTP service with CRUD operations
69
+ ├── application/store.ts # NgRx SignalStore state management
70
+ └── ui/component.ts # Standalone Angular component
71
+ ```
72
+
73
+ ### Usage
8
74
 
9
75
  ```bash
10
- npm run generate:feature -- --name=<feature-name>
76
+ # Interactive mode
77
+ aca g feature
78
+
79
+ # With name argument
80
+ aca g feature product
11
81
 
12
- # Examples:
13
- npm run generate:feature -- --name=products
14
- npm run generate:feature -- --name=user-profile
15
- npm run generate:feature -- --name=shopping-cart
82
+ # With inline attributes
83
+ aca g feature product --attributes="name:string,price:number,inStock:boolean"
16
84
 
17
- # Interactive mode with prompts:
18
- npm run generate:feature:interactive
85
+ # From blueprint file
86
+ aca g feature --blueprint=./my-feature.json
19
87
  ```
20
88
 
21
- ### Arguments
89
+ ### Options
90
+
91
+ | Option | Description | Example |
92
+ | -------------- | ------------------------------ | ------------------------------------------ |
93
+ | `--attributes` | Define model properties inline | `--attributes="title:string,views:number"` |
94
+ | `--blueprint` | Use a JSON blueprint file | `--blueprint=./order.json` |
95
+
96
+ ### Supported Types
97
+
98
+ | Type | Description |
99
+ | --------- | --------------------------------------- |
100
+ | `string` | Text data |
101
+ | `number` | Numeric values |
102
+ | `boolean` | True/false values |
103
+ | `Date` | Date/time values |
104
+ | `any` | Flexible type (use sparingly) |
105
+ | `Type[]` | Arrays (e.g., `string[]`, `CartItem[]`) |
22
106
 
23
- | Argument | Description | Required |
24
- | --- | --- | --- |
25
- | `--name` | The name of the feature to generate (kebab-case recommended). | Yes |
107
+ ### Interactive Mode Example
26
108
 
27
- ### Generated Structure
109
+ ```
110
+ $ aca g feature
28
111
 
29
- The generator will create the following structure in `apps/sandbox/src/app/features/<name>`:
112
+ ? What is the name of the feature (singular)? product
113
+ Let's add some attributes (property fields).
114
+ ? Enter attribute name (or press enter to finish): name
115
+ ? Select type: string
116
+ ? Enter attribute name (or press enter to finish): price
117
+ ? Select type: number
118
+ ? Enter attribute name (or press enter to finish): [Press Enter]
30
119
 
120
+ ✓ Generated feature "product" in src/app/features/products
31
121
  ```
32
- <feature-name>/
33
- ├── domain/
34
- │ └── model.ts # Business entities (PascalCase interfaces)
35
- ├── infrastructure/
36
- │ └── service.ts # HTTP services with CRUD operations
37
- ├── application/
38
- │ └── store.ts # NgRx SignalStore for state management
39
- └── ui/
40
- └── component.ts # Standalone Angular component with store injection
122
+
123
+ ---
124
+
125
+ ## 🔧 Core Generator
126
+
127
+ Creates core system assets like authentication, guards, and interceptors.
128
+
129
+ **Running without arguments generates ALL core assets automatically:**
130
+
131
+ ```bash
132
+ # Generate ALL core assets (recommended)
133
+ aca g core
134
+
135
+ # Output:
136
+ # 🚀 Generating ALL core assets: navbar, menu, theme-selector, language-selector, translate, auth...
137
+ # ✓ Generated core navbar in apps/sandbox/src/app/core/navbar
138
+ # ✓ Generated core menu in apps/sandbox/src/app/core/menu
139
+ # ...
41
140
  ```
42
141
 
43
- ### Naming Conventions
142
+ ### Generated Assets
143
+
144
+ | Asset | Description |
145
+ | ------------------- | ---------------------------------------- |
146
+ | `navbar` | Top navigation bar |
147
+ | `menu` | Side navigation menu |
148
+ | `theme-selector` | Dark/light theme toggle |
149
+ | `language-selector` | Language switcher component |
150
+ | `translate` | i18n translation setup |
151
+ | `auth` | Authentication service with login/logout |
44
152
 
45
- The generator automatically handles naming:
46
- - **Input**: kebab-case (e.g., `user-profile`)
47
- - **Classes/Interfaces**: PascalCase (e.g., `UserProfileComponent`, `UserProfile`)
48
- - **Stores**: PascalCase with "Store" suffix (e.g., `UserProfileStore`)
49
- - **Services**: PascalCase with "Service" suffix (e.g., `UserProfileService`)
153
+ ### Generate Specific Asset
50
154
 
51
- ### Example Generated Code
155
+ ```bash
156
+ # Generate only a specific asset
157
+ aca g core --type=navbar
158
+ aca g core --type=auth
159
+ aca g core --type=guard
160
+ aca g core --type=interceptor
161
+ ```
52
162
 
53
- For `npm run generate:feature -- --name=product`:
163
+ ---
54
164
 
55
- **Domain Model** (`domain/model.ts`):
56
- ```typescript
57
- export interface Product {
58
- id: string;
59
- createdAt: Date;
60
- updatedAt: Date;
165
+ ## 🎨 Shared Generator
166
+
167
+ Creates shared reusable components and utilities.
168
+
169
+ **Running without arguments generates ALL shared UI components automatically:**
170
+
171
+ ```bash
172
+ # Generate ALL shared UI components (recommended)
173
+ aca g shared
174
+
175
+ # Output:
176
+ # 🚀 Generating standard shared UI components: button, card, input, icon, loader, confirm-dialog...
177
+ # ✓ Generated shared ui "button" in apps/sandbox/src/app/shared/ui/button
178
+ # ✓ Generated shared ui "card" in apps/sandbox/src/app/shared/ui/card
179
+ # ...
180
+ ```
181
+
182
+ ### Generated Components
183
+
184
+ | Component | Description |
185
+ | ---------------- | ----------------------------- |
186
+ | `button` | Reusable button component |
187
+ | `card` | Card container component |
188
+ | `input` | Form input component |
189
+ | `icon` | Icon wrapper component |
190
+ | `loader` | Loading spinner component |
191
+ | `confirm-dialog` | Confirmation dialog component |
192
+
193
+ ### Generate Specific Component
194
+
195
+ ```bash
196
+ # Generate only a specific UI component
197
+ aca g shared myButton --type=ui
198
+
199
+ # Generate a utility module
200
+ aca g shared format --type=util
201
+ ```
202
+
203
+ ---
204
+
205
+ ## 📋 Blueprint Mode
206
+
207
+ For complex features with multiple related models, use a JSON blueprint file.
208
+
209
+ ### Blueprint Schema
210
+
211
+ ```json
212
+ {
213
+ "name": "order",
214
+ "models": [
215
+ {
216
+ "name": "Order",
217
+ "attributes": [
218
+ { "name": "customerId", "type": "string" },
219
+ { "name": "total", "type": "number" },
220
+ { "name": "status", "type": "string" }
221
+ ]
222
+ },
223
+ {
224
+ "name": "OrderItem",
225
+ "attributes": [
226
+ { "name": "orderId", "type": "string" },
227
+ { "name": "productId", "type": "string" },
228
+ { "name": "quantity", "type": "number" }
229
+ ]
230
+ }
231
+ ]
61
232
  }
62
233
  ```
63
234
 
64
- **Infrastructure Service** (`infrastructure/service.ts`):
65
- ```typescript
66
- @Injectable({ providedIn: 'root' })
67
- export class ProductService {
68
- private readonly apiUrl = '/api/products';
69
-
70
- getAll(): Observable<Product[]> { ... }
71
- getById(id: string): Observable<Product> { ... }
72
- create(data: Omit<Product, 'id' | 'createdAt' | 'updatedAt'>): Observable<Product> { ... }
73
- update(id: string, data: Partial<Product>): Observable<Product> { ... }
74
- delete(id: string): Observable<void> { ... }
235
+ ### Generate from Blueprint
236
+
237
+ ```bash
238
+ aca g feature --blueprint=./order-blueprint.json
239
+ ```
240
+
241
+ ### Example: E-Commerce Blueprint
242
+
243
+ ```json
244
+ {
245
+ "name": "ecommerce",
246
+ "models": [
247
+ {
248
+ "name": "Product",
249
+ "attributes": [
250
+ { "name": "name", "type": "string" },
251
+ { "name": "price", "type": "number" },
252
+ { "name": "stock", "type": "number" },
253
+ { "name": "imageUrl", "type": "string" }
254
+ ]
255
+ },
256
+ {
257
+ "name": "Cart",
258
+ "attributes": [
259
+ { "name": "userId", "type": "string" },
260
+ { "name": "items", "type": "CartItem[]" },
261
+ { "name": "total", "type": "number" }
262
+ ]
263
+ }
264
+ ]
75
265
  }
76
266
  ```
77
267
 
78
- **Application Store** (`application/store.ts`):
79
- ```typescript
80
- export const ProductStore = signalStore(
81
- { providedIn: 'root' },
82
- withState({ loading: false })
83
- );
84
- ```
85
-
86
- **UI Component** (`ui/component.ts`):
87
- ```typescript
88
- @Component({
89
- selector: 'app-product-feature',
90
- standalone: true,
91
- imports: [CommonModule],
92
- template: `
93
- <div class="product-feature">
94
- <h1>Product Feature</h1>
95
- @if (store.loading()) {
96
- <p>Loading...</p>
97
- } @else {
98
- <p>Ready to build your product feature!</p>
99
- }
100
- </div>
101
- `,
102
- })
103
- export class ProductComponent {
104
- protected readonly store = inject(ProductStore);
268
+ ---
269
+
270
+ ## 📂 Feature Schema (Batch Generation)
271
+
272
+ The CLI automatically stores feature definitions in `feature-schema.json`. When you run `aca g feature` without arguments, it can batch-generate all features defined in this schema.
273
+
274
+ ### Schema Format
275
+
276
+ ```json
277
+ {
278
+ "version": "1.0",
279
+ "lastUpdated": "2026-01-04T20:11:51.889Z",
280
+ "features": {
281
+ "product": {
282
+ "name": "product",
283
+ "attributes": [
284
+ { "name": "name", "type": "string" },
285
+ { "name": "price", "type": "number" }
286
+ ]
287
+ },
288
+ "book": {
289
+ "name": "book",
290
+ "attributes": [
291
+ { "name": "title", "type": "string" },
292
+ { "name": "author", "type": "string" }
293
+ ]
294
+ }
295
+ }
105
296
  }
106
297
  ```
107
298
 
108
- ## Template Structure
299
+ ### Batch Generation
109
300
 
110
- Templates are located in `src/generators/clean-feature/files/`:
301
+ ```bash
302
+ # Running without a name triggers batch generation from feature-schema.json
303
+ aca g feature
111
304
 
305
+ # Output:
306
+ # 🚀 Found 4 features in feature-schema.json. Generating...
307
+ # ✓ Generated feature "product" in src/app/features/products
308
+ # ✓ Generated feature "book" in src/app/features/books
112
309
  ```
113
- files/
114
- ├── application/
115
- │ └── store.ts.template # SignalStore template
116
- ├── domain/
117
- │ └── model.ts.template # Interface template
118
- ├── infrastructure/
119
- │ └── service.ts.template # Service template with CRUD
120
- └── ui/
121
- └── component.ts.template # Component template with store
310
+
311
+ ---
312
+
313
+ ## 🏛️ Architecture Overview
314
+
315
+ Generated features follow **Clean Architecture** (Hexagonal Architecture) principles:
316
+
317
+ ```
318
+ ┌─────────────────────────────────────────────────────────┐
319
+ │ UI Layer │
320
+ │ (Components, Templates, Styles) │
321
+ ├─────────────────────────────────────────────────────────┤
322
+ │ Application Layer │
323
+ │ (NgRx SignalStore, Selectors) │
324
+ ├─────────────────────────────────────────────────────────┤
325
+ │ Infrastructure Layer │
326
+ │ (HTTP Services, API Clients) │
327
+ ├─────────────────────────────────────────────────────────┤
328
+ │ Domain Layer │
329
+ │ (Interfaces, Types, Business Rules) │
330
+ └─────────────────────────────────────────────────────────┘
331
+ ```
332
+
333
+ ### Dependency Flow
334
+
335
+ ```
336
+ UI → Application → Infrastructure → Domain
337
+
338
+ External APIs
122
339
  ```
123
340
 
124
- Templates use EJS syntax:
125
- - `<%= name %>` - Original kebab-case feature name
126
- - `<%= pascalName %>` - PascalCase version of the name
341
+ - **Domain**: Pure TypeScript, zero dependencies
342
+ - **Infrastructure**: Depends on Domain
343
+ - **Application**: Depends on Infrastructure + Domain
344
+ - **UI**: Depends on Application
345
+
346
+ ---
127
347
 
128
- ## Development
348
+ ## 💡 Best Practices
129
349
 
130
- ### Build the CLI
350
+ ### Feature Naming
131
351
 
132
352
  ```bash
133
- npm run cli:build
353
+ # Good (singular, kebab-case)
354
+ aca g feature product
355
+ aca g feature user-profile
356
+ aca g feature order-item
357
+
358
+ # Avoid
359
+ aca g feature products # Will become "productss"
360
+ aca g feature UserProfile # Use kebab-case
134
361
  ```
135
362
 
136
- ### Test the CLI
363
+ ### Attribute Types
137
364
 
138
365
  ```bash
139
- npm run cli:test
366
+ # Use appropriate TypeScript types
367
+ --attributes="name:string,age:number,isActive:boolean,createdAt:Date,tags:string[]"
140
368
  ```
141
369
 
142
- ### Lint the CLI
370
+ ### Blueprint Organization
371
+
372
+ ```
373
+ project-root/
374
+ ├── blueprints/
375
+ │ ├── user.json
376
+ │ ├── product.json
377
+ │ └── order.json
378
+ └── src/
379
+ ```
380
+
381
+ ---
382
+
383
+ ## 🔗 Nx Workspace Integration
384
+
385
+ When using within an Nx monorepo:
143
386
 
144
387
  ```bash
145
- npm run cli:lint
388
+ # Generate feature using Nx
389
+ nx g cli:feature product
390
+
391
+ # Generate core assets
392
+ nx g cli:core app --type=navbar
393
+
394
+ # Generate shared components
395
+ nx g cli:shared button --type=ui
146
396
  ```
147
397
 
148
- ### Development Workflow
398
+ ---
399
+
400
+ ## 📚 Resources
401
+
402
+ - [Architecture Documentation](https://github.com/MohamedBouattour/angular-clean-architecture/blob/main/ARCHITECTURE.md)
403
+ - [Examples & Scenarios](./EXAMPLES.md)
404
+ - [Roadmap](https://github.com/MohamedBouattour/angular-clean-architecture/blob/main/ROADMAP.md)
405
+ - [GitHub Issues](https://github.com/MohamedBouattour/angular-clean-architecture/issues)
406
+
407
+ ---
149
408
 
150
- 1. **Modify templates** in `src/generators/clean-feature/files/`
151
- 2. **Update generator logic** in `generator.ts` if needed
152
- 3. **Build**: `npm run cli:build`
153
- 4. **Test**: Generate a feature with `npm run generate:feature -- --name=test`
154
- 5. **Verify**: Check generated code in `apps/sandbox/src/app/features/test`
155
- 6. **Clean up**: Delete test feature after verification
409
+ ## 🤝 Contributing
156
410
 
157
- ### Adding New Template Variables
411
+ 1. Fork the repository
412
+ 2. Create your feature branch: `git checkout -b feature/amazing-feature`
413
+ 3. Commit your changes: `git commit -m 'Add amazing feature'`
414
+ 4. Push to the branch: `git push origin feature/amazing-feature`
415
+ 5. Open a Pull Request
158
416
 
159
- To add new template variables:
417
+ ---
160
418
 
161
- 1. Update `generator.ts`:
162
- ```typescript
163
- generateFiles(tree, ..., targetPath, {
164
- ...options,
165
- name,
166
- pascalName,
167
- yourNewVariable: computeValue(name), // Add here
168
- tmpl: '',
169
- });
170
- ```
419
+ ## 📝 License
171
420
 
172
- 2. Use in templates:
173
- ```typescript
174
- // In any .template file
175
- export class <%= yourNewVariable %>Something { }
176
- ```
421
+ MIT © [Mohamed Bouattour](https://github.com/MohamedBouattour)
177
422
 
178
- ## Tips
423
+ ---
179
424
 
180
- - **Feature naming**: Use kebab-case for multi-word features (e.g., `user-profile`, not `userProfile`)
181
- - **Testing**: Always test generated code in the sandbox app
182
- - **Customization**: Modify templates to match your team's conventions
183
- - **Validation**: Consider adding name validation in `generator.ts` to prevent duplicates
425
+ **Built with ❤️ for the Angular community**
package/bin/index.js CHANGED
@@ -1,4 +1,102 @@
1
- #!/usr/bin/env node
1
+ #!/usr/bin/env node
2
+ const { spawn } = require('child_process');
3
+ const path = require('path');
4
+ const fs = require('fs');
5
+
6
+ const args = process.argv.slice(2);
7
+
8
+ function findWorkspaceRoot(dir) {
9
+ if (fs.existsSync(path.join(dir, 'nx.json')) || fs.existsSync(path.join(dir, 'package.json'))) {
10
+ if (fs.existsSync(path.join(dir, 'nx.json'))) {
11
+ return dir;
12
+ }
13
+ }
14
+ const parent = path.dirname(dir);
15
+ if (parent === dir) return null;
16
+ return findWorkspaceRoot(parent);
17
+ }
18
+
19
+ const root = findWorkspaceRoot(process.cwd());
20
+
21
+ /**
22
+ * Executes an Nx generator command
23
+ * @param {string} generator - The generator name (e.g., 'feature', 'core', 'shared')
24
+ * @param {string[]} remainingArgs - Additional arguments to pass
25
+ */
26
+ function runGenerator(generator, remainingArgs) {
27
+ const nxArgs = ['g', `cli:${generator}`];
28
+
29
+ remainingArgs.forEach(arg => {
30
+ nxArgs.push(arg);
31
+ });
32
+
33
+ console.log(`Executing: npx nx ${nxArgs.join(' ')}`);
34
+
35
+ const child = spawn('npx', ['nx', ...nxArgs], {
36
+ stdio: 'inherit',
37
+ shell: true,
38
+ cwd: root || process.cwd(),
39
+ });
40
+
41
+ child.on('exit', (code) => {
42
+ process.exit(code || 0);
43
+ });
44
+ }
45
+
46
+ // Parse commands
47
+ if (args[0] === 'generate' || args[0] === 'g') {
48
+ const generatorType = args[1];
49
+ const remainingArgs = args.slice(2);
50
+
51
+ // Parse name from positional argument
52
+ const nxArgs = [];
53
+ if (remainingArgs[0] && !remainingArgs[0].startsWith('-')) {
54
+ nxArgs.push(`--name=${remainingArgs[0]}`);
55
+ remainingArgs.shift();
56
+ }
57
+
58
+ // Pass through all other flags
59
+ remainingArgs.forEach(arg => nxArgs.push(arg));
60
+
61
+ switch (generatorType) {
62
+ case 'feature':
63
+ case 'f':
64
+ runGenerator('feature', nxArgs);
65
+ break;
66
+ case 'core':
67
+ case 'c':
68
+ runGenerator('core', nxArgs);
69
+ break;
70
+ case 'shared':
71
+ case 's':
72
+ runGenerator('shared', nxArgs);
73
+ break;
74
+ default:
75
+ console.log('\x1b[31m%s\x1b[0m', `Unknown generator: ${generatorType}`);
76
+ console.log('Available generators: feature (f), core (c), shared (s)');
77
+ process.exit(1);
78
+ }
79
+ } else {
80
+ console.log('\x1b[36m%s\x1b[0m', 'Angular Clean Architecture CLI');
81
+ console.log('');
82
+ console.log('Usage:');
83
+ console.log(' aca generate <generator> [name] [options]');
84
+ console.log(' aca g <generator> [name] [options]');
85
+ console.log('');
86
+ console.log('Generators:');
87
+ console.log(' feature (f) Generate a Clean Architecture feature');
88
+ console.log(' core (c) Generate a core asset (auth, guard, interceptor, etc.)');
89
+ console.log(' shared (s) Generate a shared component or utility');
90
+ console.log('');
91
+ console.log('Examples:');
92
+ console.log(' aca g feature products --attributes="name:string,price:number"');
93
+ console.log(' aca g core auth-service --type=service');
94
+ console.log(' aca g core app --type=navbar');
95
+ console.log(' aca g shared button --type=ui');
96
+ console.log('');
97
+ console.log('Run without options for interactive mode:');
98
+ console.log(' aca g feature');
99
+ console.log(' aca g core');
100
+ process.exit(0);
101
+ }
2
102
 
3
- console.log("ACA CLI installed successfully!");
4
- console.log("To use the generator, run: nx g @devmed555/angular-clean-architecture-cli:clean-feature");
package/generators.json CHANGED
@@ -1,9 +1,19 @@
1
- {
2
- "generators": {
3
- "clean-feature": {
4
- "factory": "./src/generators/clean-feature/generator",
5
- "schema": "./src/generators/clean-feature/schema.json",
6
- "description": "clean-feature generator"
7
- }
8
- }
9
- }
1
+ {
2
+ "generators": {
3
+ "feature": {
4
+ "factory": "./src/generators/feature/generator",
5
+ "schema": "./src/generators/feature/schema.json",
6
+ "description": "Generate a Clean Architecture feature with domain, infrastructure, application, and UI layers"
7
+ },
8
+ "shared": {
9
+ "factory": "./src/generators/shared/generator",
10
+ "schema": "./src/generators/shared/schema.json",
11
+ "description": "Generate a shared UI component or utility"
12
+ },
13
+ "core": {
14
+ "factory": "./src/generators/core/generator",
15
+ "schema": "./src/generators/core/schema.json",
16
+ "description": "Generate a core system asset (Auth, Guard, Interceptor, Service)"
17
+ }
18
+ }
19
+ }