@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.
- package/README.md +370 -128
- package/bin/index.js +101 -3
- package/generators.json +19 -9
- package/package.json +2 -4
- package/src/generators/core/files/auth/auth.guard.ts.template +14 -0
- package/src/generators/core/files/auth/auth.service.ts.template +137 -0
- package/src/generators/core/files/auth/login.component.ts.template +165 -0
- package/src/generators/core/files/auth/signup.component.ts.template +171 -0
- package/src/generators/core/files/guard/__name__.guard.ts.template +6 -0
- package/src/generators/core/files/interceptor/__name__.interceptor.ts.template +6 -0
- package/src/generators/core/files/language-selector/language-selector.component.ts.template +82 -0
- package/src/generators/core/files/menu/__name__.component.html.template +14 -0
- package/src/generators/core/files/menu/__name__.component.scss.template +66 -0
- package/src/generators/core/files/menu/__name__.component.ts.template +24 -0
- package/src/generators/core/files/navbar/__name__.component.html.template +45 -0
- package/src/generators/core/files/navbar/__name__.component.scss.template +134 -0
- package/src/generators/core/files/navbar/__name__.component.ts.template +38 -0
- package/src/generators/core/files/service/__name__.service.ts.template +26 -0
- package/src/generators/core/files/theme-selector/theme-selector.component.ts.template +49 -0
- package/src/generators/core/files/translate/translate.pipe.ts.template +15 -0
- package/src/generators/core/files/translate/translate.service.ts.template +24 -0
- package/src/generators/core/generator.d.ts +7 -0
- package/src/generators/core/generator.js +49 -0
- package/src/generators/core/generator.js.map +1 -0
- package/src/generators/core/schema.json +34 -0
- package/src/generators/feature/blueprint.schema.json +34 -0
- package/src/generators/feature/files/application/store.ts.template +135 -0
- package/src/generators/feature/files/domain/model.ts.template +9 -0
- package/src/generators/{clean-feature → feature}/files/infrastructure/service.ts.template +5 -5
- package/src/generators/feature/files/ui/__singularName__.component.html.template +109 -0
- package/src/generators/feature/files/ui/__singularName__.component.scss.template +162 -0
- package/src/generators/feature/files/ui/__singularName__.component.ts.template +131 -0
- package/src/generators/feature/files/ui/_theme.scss.template +35 -0
- package/src/generators/feature/files/ui/form/form.component.ts.template +122 -0
- package/src/generators/feature/generator.d.ts +4 -0
- package/src/generators/feature/generator.js +209 -0
- package/src/generators/feature/generator.js.map +1 -0
- package/src/generators/feature/schema.d.ts +5 -0
- package/src/generators/{clean-feature → feature}/schema.json +25 -23
- package/src/generators/shared/files/ui/__name__.component.ts.template +57 -0
- package/src/generators/shared/files/util/__name__.ts.template +7 -0
- package/src/generators/shared/generator.d.ts +7 -0
- package/src/generators/shared/generator.js +31 -0
- package/src/generators/shared/generator.js.map +1 -0
- package/src/generators/shared/schema.json +23 -0
- package/src/index.js +1 -0
- package/src/utils/string-utils.d.ts +16 -0
- package/src/utils/string-utils.js +33 -0
- package/src/utils/string-utils.js.map +1 -0
- package/src/generators/clean-feature/files/application/store.ts.template +0 -6
- package/src/generators/clean-feature/files/domain/model.ts.template +0 -4
- package/src/generators/clean-feature/files/ui/component.ts.template +0 -44
- package/src/generators/clean-feature/generator.d.ts +0 -4
- package/src/generators/clean-feature/generator.js +0 -52
- package/src/generators/clean-feature/generator.js.map +0 -1
- package/src/generators/clean-feature/schema.d.ts +0 -4
package/README.md
CHANGED
|
@@ -1,183 +1,425 @@
|
|
|
1
|
-
# CLI
|
|
1
|
+
# Angular Clean Architecture CLI
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@devmed555/angular-clean-architecture-cli)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
> 🚀 Scaffold Angular features following Clean Architecture principles with NgRx SignalStore.
|
|
6
7
|
|
|
7
|
-
|
|
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
|
-
|
|
76
|
+
# Interactive mode
|
|
77
|
+
aca g feature
|
|
78
|
+
|
|
79
|
+
# With name argument
|
|
80
|
+
aca g feature product
|
|
11
81
|
|
|
12
|
-
#
|
|
13
|
-
|
|
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
|
-
#
|
|
18
|
-
|
|
85
|
+
# From blueprint file
|
|
86
|
+
aca g feature --blueprint=./my-feature.json
|
|
19
87
|
```
|
|
20
88
|
|
|
21
|
-
###
|
|
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
|
-
|
|
24
|
-
| --- | --- | --- |
|
|
25
|
-
| `--name` | The name of the feature to generate (kebab-case recommended). | Yes |
|
|
107
|
+
### Interactive Mode Example
|
|
26
108
|
|
|
27
|
-
|
|
109
|
+
```
|
|
110
|
+
$ aca g feature
|
|
28
111
|
|
|
29
|
-
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
163
|
+
---
|
|
54
164
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
299
|
+
### Batch Generation
|
|
109
300
|
|
|
110
|
-
|
|
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
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
125
|
-
-
|
|
126
|
-
-
|
|
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
|
-
##
|
|
348
|
+
## 💡 Best Practices
|
|
129
349
|
|
|
130
|
-
###
|
|
350
|
+
### ✅ Feature Naming
|
|
131
351
|
|
|
132
352
|
```bash
|
|
133
|
-
|
|
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
|
-
###
|
|
363
|
+
### ✅ Attribute Types
|
|
137
364
|
|
|
138
365
|
```bash
|
|
139
|
-
|
|
366
|
+
# Use appropriate TypeScript types
|
|
367
|
+
--attributes="name:string,age:number,isActive:boolean,createdAt:Date,tags:string[]"
|
|
140
368
|
```
|
|
141
369
|
|
|
142
|
-
###
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
417
|
+
---
|
|
160
418
|
|
|
161
|
-
|
|
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
|
-
|
|
173
|
-
```typescript
|
|
174
|
-
// In any .template file
|
|
175
|
-
export class <%= yourNewVariable %>Something { }
|
|
176
|
-
```
|
|
421
|
+
MIT © [Mohamed Bouattour](https://github.com/MohamedBouattour)
|
|
177
422
|
|
|
178
|
-
|
|
423
|
+
---
|
|
179
424
|
|
|
180
|
-
|
|
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
|
-
"
|
|
4
|
-
"factory": "./src/generators/
|
|
5
|
-
"schema": "./src/generators/
|
|
6
|
-
"description": "
|
|
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
|
+
}
|