nestcraftx 0.2.4 → 0.2.6
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/.gitattributes +6 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +33 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- package/.github/ISSUE_TEMPLATE/pull_request_template.md +24 -0
- package/CHANGELOG.fr.md +97 -97
- package/CHANGELOG.md +98 -98
- package/CLI_USAGE.fr.md +331 -331
- package/CLI_USAGE.md +364 -364
- package/DEMO.fr.md +292 -292
- package/DEMO.md +294 -294
- package/LICENSE +21 -21
- package/MIGRATION_GUIDE.fr.md +127 -127
- package/MIGRATION_GUIDE.md +124 -124
- package/QUICK_START.fr.md +152 -152
- package/QUICK_START.md +169 -169
- package/README.fr.md +653 -659
- package/SECURITY.md +10 -0
- package/bin/nestcraft.js +84 -64
- package/commands/demo.js +333 -330
- package/commands/generate.js +93 -0
- package/commands/generateConf.js +91 -0
- package/commands/help.js +78 -78
- package/commands/info.js +48 -48
- package/commands/new.js +338 -335
- package/commands/start.js +19 -19
- package/commands/test.js +7 -7
- package/package.json +41 -41
- package/readme.md +638 -643
- package/utils/cliParser.js +133 -76
- package/utils/colors.js +62 -62
- package/utils/configs/configureDocker.js +120 -120
- package/utils/configs/setupCleanArchitecture.js +563 -557
- package/utils/configs/setupLightArchitecture.js +701 -660
- package/utils/envGenerator.js +122 -122
- package/utils/file-utils/packageJsonUtils.js +49 -55
- package/utils/file-utils/saveProjectConfig.js +36 -0
- package/utils/fullModeInput.js +607 -607
- package/utils/generators/application/dtoUpdater.js +54 -0
- package/utils/generators/cleanModuleGenerator.js +475 -0
- package/utils/generators/database/setupDatabase.js +31 -0
- package/utils/generators/domain/entityUpdater.js +78 -0
- package/utils/generators/infrastructure/mapperUpdater.js +65 -0
- package/utils/generators/lightModuleGenerator.js +131 -0
- package/utils/generators/relation/relation.engine.js +64 -0
- package/utils/interactive/askEntityInputs.js +165 -0
- package/utils/lightModeInput.js +460 -460
- package/utils/loggers/logError.js +7 -7
- package/utils/loggers/logInfo.js +7 -7
- package/utils/loggers/logSuccess.js +7 -7
- package/utils/loggers/logWarning.js +7 -7
- package/utils/setups/orms/typeOrmSetup.js +630 -630
- package/utils/setups/projectSetup.js +46 -46
- package/utils/setups/setupAuth.js +973 -926
- package/utils/setups/setupDatabase.js +75 -75
- package/utils/setups/setupLogger.js +69 -59
- package/utils/setups/setupMongoose.js +377 -432
- package/utils/setups/setupPrisma.js +802 -630
- package/utils/setups/setupSwagger.js +97 -88
- package/utils/shell.js +32 -32
- package/utils/spinner.js +57 -57
- package/utils/systemCheck.js +124 -124
- package/utils/userInput.js +421 -421
- package/utils/utils.js +2197 -1762
|
@@ -1,557 +1,563 @@
|
|
|
1
|
-
const { logInfo } = require("../loggers/logInfo");
|
|
2
|
-
const {
|
|
3
|
-
createDirectory,
|
|
4
|
-
createFile,
|
|
5
|
-
updateFile,
|
|
6
|
-
safeUpdateAppModule,
|
|
7
|
-
} = require("../userInput");
|
|
8
|
-
const { logError } = require("../loggers/logError");
|
|
9
|
-
const { logSuccess } = require("../loggers/logSuccess");
|
|
10
|
-
const {
|
|
11
|
-
generateEntityFileContent,
|
|
12
|
-
generateMapper,
|
|
13
|
-
generateDto,
|
|
14
|
-
generateMiddlewares,
|
|
15
|
-
generateRepository,
|
|
16
|
-
generateController,
|
|
17
|
-
generateMongooseSchemaFileContent,
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"domain/
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"infrastructure/
|
|
39
|
-
"
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
this.logger.
|
|
288
|
-
throw
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
*
|
|
340
|
-
*
|
|
341
|
-
*
|
|
342
|
-
*
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
import {
|
|
350
|
-
import {
|
|
351
|
-
import {
|
|
352
|
-
import { ${entityNameCapitalized}
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
private readonly
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
}
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
//
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
`
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
*
|
|
480
|
-
*
|
|
481
|
-
* -
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
import {
|
|
488
|
-
|
|
489
|
-
import {
|
|
490
|
-
import {
|
|
491
|
-
import {
|
|
492
|
-
import { ${entityNameCapitalized}
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
${
|
|
503
|
-
],
|
|
504
|
-
|
|
505
|
-
${entityNameCapitalized}
|
|
506
|
-
]
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
await
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
);
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
1
|
+
const { logInfo } = require("../loggers/logInfo");
|
|
2
|
+
const {
|
|
3
|
+
createDirectory,
|
|
4
|
+
createFile,
|
|
5
|
+
updateFile,
|
|
6
|
+
safeUpdateAppModule,
|
|
7
|
+
} = require("../userInput");
|
|
8
|
+
const { logError } = require("../loggers/logError");
|
|
9
|
+
const { logSuccess } = require("../loggers/logSuccess");
|
|
10
|
+
const {
|
|
11
|
+
generateEntityFileContent,
|
|
12
|
+
generateMapper,
|
|
13
|
+
generateDto,
|
|
14
|
+
generateMiddlewares,
|
|
15
|
+
generateRepository,
|
|
16
|
+
generateController,
|
|
17
|
+
generateMongooseSchemaFileContent,
|
|
18
|
+
pluralize,
|
|
19
|
+
} = require("../utils");
|
|
20
|
+
|
|
21
|
+
async function setupCleanArchitecture(inputs) {
|
|
22
|
+
logInfo("Generating Clean Architecture structure");
|
|
23
|
+
|
|
24
|
+
const entitiesData = inputs.entitiesData;
|
|
25
|
+
const dbConfig = inputs.dbConfig;
|
|
26
|
+
const useSwagger = inputs.useSwagger;
|
|
27
|
+
const useAuth = inputs.useAuth;
|
|
28
|
+
const mode = "full";
|
|
29
|
+
|
|
30
|
+
const srcPath = "src";
|
|
31
|
+
const baseFolders = [
|
|
32
|
+
"application/use-cases",
|
|
33
|
+
"application/dtos",
|
|
34
|
+
"domain/interfaces",
|
|
35
|
+
"domain/entities",
|
|
36
|
+
// "domain/enums",
|
|
37
|
+
"infrastructure/mappers",
|
|
38
|
+
"infrastructure/repositories",
|
|
39
|
+
"application/services",
|
|
40
|
+
"infrastructure/adapters",
|
|
41
|
+
"presentation/controllers",
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
// modifier app module pour exporter configService globalement
|
|
46
|
+
const appModuleTsPath = "src/app.module.ts";
|
|
47
|
+
|
|
48
|
+
// ajouter l'import configModule
|
|
49
|
+
await updateFile({
|
|
50
|
+
path: appModuleTsPath,
|
|
51
|
+
pattern: "import { Module } from '@nestjs/common';",
|
|
52
|
+
replacement: `import { Module } from '@nestjs/common';\nimport { ConfigModule } from '@nestjs/config';`,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// configurer configservice
|
|
56
|
+
await updateFile({
|
|
57
|
+
path: "src/app.module.ts",
|
|
58
|
+
pattern: "imports: [",
|
|
59
|
+
replacement: `imports: [
|
|
60
|
+
ConfigModule.forRoot({
|
|
61
|
+
isGlobal: true, // Make ConfigModule globally accessible
|
|
62
|
+
envFilePath: '.env', // Load environment variables
|
|
63
|
+
}),`,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
for (const entity of entitiesData.entities) {
|
|
67
|
+
const entityNameCapitalized = capitalize(entity.name);
|
|
68
|
+
const entityNameLower = decapitalize(entity.name);
|
|
69
|
+
|
|
70
|
+
if (entityNameLower == "session") continue;
|
|
71
|
+
|
|
72
|
+
const entityPath = `${srcPath}/${entityNameLower}`;
|
|
73
|
+
|
|
74
|
+
for (const folder of baseFolders) {
|
|
75
|
+
await createDirectory(`${entityPath}/${folder}`);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (dbConfig.orm === "mongoose") {
|
|
79
|
+
const mongooseSchemaContent = await generateMongooseSchemaFileContent(
|
|
80
|
+
entity,
|
|
81
|
+
entitiesData,
|
|
82
|
+
mode,
|
|
83
|
+
);
|
|
84
|
+
|
|
85
|
+
const schemaPath = `src/${entity.name}/infrastructure/persistence/mongoose`;
|
|
86
|
+
await createDirectory(schemaPath);
|
|
87
|
+
|
|
88
|
+
await createFile({
|
|
89
|
+
path: `${schemaPath}/${entity.name}.schema.ts`,
|
|
90
|
+
contente: mongooseSchemaContent,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// 1. Entité
|
|
95
|
+
const entityContent = await generateEntityFileContent(entity);
|
|
96
|
+
await createFile({
|
|
97
|
+
path: `${entityPath}/domain/entities/${entityNameLower}.entity.ts`,
|
|
98
|
+
contente: entityContent,
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
let findByEmailMethod = "";
|
|
102
|
+
if (entityNameLower == "user") {
|
|
103
|
+
findByEmailMethod = `
|
|
104
|
+
findByEmail(email: string): Promise<${entityNameCapitalized}Entity | null>;
|
|
105
|
+
`;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// 2. Interface Repository
|
|
109
|
+
await createFile({
|
|
110
|
+
path: `${entityPath}/domain/interfaces/${entityNameLower}.repository.interface.ts`,
|
|
111
|
+
contente: `import { Create${entityNameCapitalized}Dto, Update${entityNameCapitalized}Dto } from 'src/${entityNameLower}/application/dtos/${entityNameLower}.dto';
|
|
112
|
+
import { ${entityNameCapitalized}Entity } from 'src/${entityNameLower}/domain/entities/${entityNameLower}.entity';
|
|
113
|
+
|
|
114
|
+
export const I${entityNameCapitalized}RepositoryName = 'I${entityNameCapitalized}Repository';
|
|
115
|
+
|
|
116
|
+
export interface I${entityNameCapitalized}Repository {
|
|
117
|
+
create(data: Create${entityNameCapitalized}Dto): Promise<${entityNameCapitalized}Entity>;
|
|
118
|
+
findById(id: string): Promise<${entityNameCapitalized}Entity | null>;
|
|
119
|
+
findAll(): Promise<${entityNameCapitalized}Entity[]>;
|
|
120
|
+
update(id: string, data: Update${entityNameCapitalized}Dto): Promise<${entityNameCapitalized}Entity | null>;
|
|
121
|
+
delete(id: string): Promise<void>;
|
|
122
|
+
${findByEmailMethod}
|
|
123
|
+
}`,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// 3. Repository Implémentation
|
|
127
|
+
await generateRepository(entity.name, dbConfig.orm);
|
|
128
|
+
|
|
129
|
+
// 4. Use Cases
|
|
130
|
+
const useCases = ["Create", "GetById", "GetAll", "Update", "Delete"];
|
|
131
|
+
useCases.forEach(async (useCase) => {
|
|
132
|
+
let content = "";
|
|
133
|
+
const entityName = capitalize(entity.name);
|
|
134
|
+
const entityNameLower = decapitalize(entity.name);
|
|
135
|
+
|
|
136
|
+
switch (useCase) {
|
|
137
|
+
case "Create":
|
|
138
|
+
content = `/**
|
|
139
|
+
* Use case to handle the creation of a new ${entityName}.
|
|
140
|
+
*/
|
|
141
|
+
|
|
142
|
+
import { Inject, Logger } from '@nestjs/common';
|
|
143
|
+
import { Create${entityName}Dto } from 'src/${entity.name}/application/dtos/${entity.name}.dto';
|
|
144
|
+
import { I${entityName}RepositoryName, type I${entityName}Repository } from 'src/${entity.name}/domain/interfaces/${entity.name}.repository.interface';
|
|
145
|
+
import { ${entityName}Entity } from 'src/${entity.name}/domain/entities/${entityNameLower}.entity';
|
|
146
|
+
|
|
147
|
+
export class Create${entityName}UseCase {
|
|
148
|
+
private readonly logger = new Logger(Create${entityName}UseCase.name);
|
|
149
|
+
|
|
150
|
+
constructor(
|
|
151
|
+
@Inject(I${entityName}RepositoryName)
|
|
152
|
+
private readonly ${entityNameLower}Repository: I${entityName}Repository,
|
|
153
|
+
) {}
|
|
154
|
+
|
|
155
|
+
async execute(data: Create${entityName}Dto): Promise<${entityName}Entity> {
|
|
156
|
+
this.logger.log('Starting creation process for ${entityName}');
|
|
157
|
+
const result = await this.${entityNameLower}Repository.create(data);
|
|
158
|
+
this.logger.log(\`Successfully created ${entityName} (ID: \${result.getId()})\`);
|
|
159
|
+
return result;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
`;
|
|
163
|
+
break;
|
|
164
|
+
|
|
165
|
+
case "GetById":
|
|
166
|
+
content = `/**
|
|
167
|
+
* Use case to retrieve a specific ${entityName} by its unique identifier.
|
|
168
|
+
*/
|
|
169
|
+
|
|
170
|
+
import { Inject, Logger, NotFoundException } from '@nestjs/common';
|
|
171
|
+
import { I${entityName}RepositoryName, type I${entityName}Repository } from 'src/${entity.name}/domain/interfaces/${entity.name}.repository.interface';
|
|
172
|
+
import { ${entityName}Entity } from 'src/${entity.name}/domain/entities/${entityNameLower}.entity';
|
|
173
|
+
|
|
174
|
+
export class GetById${entityName}UseCase {
|
|
175
|
+
private readonly logger = new Logger(GetById${entityName}UseCase.name);
|
|
176
|
+
|
|
177
|
+
constructor(
|
|
178
|
+
@Inject(I${entityName}RepositoryName)
|
|
179
|
+
private readonly ${entityNameLower}Repository: I${entityName}Repository,
|
|
180
|
+
) {}
|
|
181
|
+
|
|
182
|
+
async execute(id: string): Promise<${entityName}Entity> {
|
|
183
|
+
this.logger.log(\`Fetching ${entityName} (ID: \${id})\`);
|
|
184
|
+
const result = await this.${entityNameLower}Repository.findById(id);
|
|
185
|
+
|
|
186
|
+
if (!result) {
|
|
187
|
+
this.logger.warn(\`${entityName} \${id} not found\`);
|
|
188
|
+
throw new NotFoundException(\`${entityName} not found\`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
this.logger.log(\`Successfully retrieved ${entityName}\`);
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
`;
|
|
196
|
+
break;
|
|
197
|
+
|
|
198
|
+
case "GetAll":
|
|
199
|
+
content = `/**
|
|
200
|
+
* Use case to retrieve all ${entityName} records from the database.
|
|
201
|
+
*/
|
|
202
|
+
|
|
203
|
+
import { Inject, Logger } from '@nestjs/common';
|
|
204
|
+
import { I${entityName}RepositoryName, type I${entityName}Repository } from 'src/${entity.name}/domain/interfaces/${entity.name}.repository.interface';
|
|
205
|
+
import { ${entityName}Entity } from 'src/${entity.name}/domain/entities/${entityNameLower}.entity';
|
|
206
|
+
|
|
207
|
+
export class GetAll${entityName}UseCase {
|
|
208
|
+
private readonly logger = new Logger(GetAll${entityName}UseCase.name);
|
|
209
|
+
|
|
210
|
+
constructor(
|
|
211
|
+
@Inject(I${entityName}RepositoryName)
|
|
212
|
+
private readonly ${entityNameLower}Repository: I${entityName}Repository,
|
|
213
|
+
) {}
|
|
214
|
+
|
|
215
|
+
async execute(): Promise<${entityName}Entity[]> {
|
|
216
|
+
this.logger.log('Requesting all ${entityName} records');
|
|
217
|
+
const results = await this.${entityNameLower}Repository.findAll();
|
|
218
|
+
this.logger.log(\`Retrieved \${results.length} ${entityName}(s)\`);
|
|
219
|
+
return results;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
`;
|
|
223
|
+
break;
|
|
224
|
+
|
|
225
|
+
case "Update":
|
|
226
|
+
content = `/**
|
|
227
|
+
* Use case to update the data of an existing ${entityName}.
|
|
228
|
+
*/
|
|
229
|
+
|
|
230
|
+
import { Inject, Logger, NotFoundException } from '@nestjs/common';
|
|
231
|
+
import { Update${entityName}Dto } from 'src/${entity.name}/application/dtos/${entity.name}.dto';
|
|
232
|
+
import { I${entityName}RepositoryName, type I${entityName}Repository } from 'src/${entity.name}/domain/interfaces/${entity.name}.repository.interface';
|
|
233
|
+
import { ${entityName}Entity } from 'src/${entity.name}/domain/entities/${entityNameLower}.entity';
|
|
234
|
+
|
|
235
|
+
export class Update${entityName}UseCase {
|
|
236
|
+
private readonly logger = new Logger(Update${entityName}UseCase.name);
|
|
237
|
+
|
|
238
|
+
constructor(
|
|
239
|
+
@Inject(I${entityName}RepositoryName)
|
|
240
|
+
private readonly ${entityNameLower}Repository: I${entityName}Repository,
|
|
241
|
+
) {}
|
|
242
|
+
|
|
243
|
+
async execute(id: string, data: Update${entityName}Dto): Promise<${entityName}Entity> {
|
|
244
|
+
this.logger.log(\`Updating ${entityName} (ID: \${id})\`);
|
|
245
|
+
|
|
246
|
+
const existing = await this.${entityNameLower}Repository.findById(id);
|
|
247
|
+
if (!existing) {
|
|
248
|
+
this.logger.warn(\`${entityName} \${id} not found for update\`);
|
|
249
|
+
throw new NotFoundException(\`${entityName} not found\`);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const result = await this.${entityNameLower}Repository.update(id, data);
|
|
253
|
+
|
|
254
|
+
if (!result) {
|
|
255
|
+
this.logger.error(\`Update failed for ${entityName} \${id} - entity disappeared\`);
|
|
256
|
+
throw new NotFoundException(\`${entityName} update failed\`);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
this.logger.log(\`Successfully updated ${entityName} \${id}\`);
|
|
260
|
+
return result;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
`;
|
|
264
|
+
break;
|
|
265
|
+
|
|
266
|
+
case "Delete":
|
|
267
|
+
content = `/**
|
|
268
|
+
* Use case to permanently remove an ${entityName} from the system.
|
|
269
|
+
*/
|
|
270
|
+
|
|
271
|
+
import { Inject, Logger, NotFoundException } from '@nestjs/common';
|
|
272
|
+
import { I${entityName}RepositoryName, type I${entityName}Repository } from 'src/${entity.name}/domain/interfaces/${entity.name}.repository.interface';
|
|
273
|
+
|
|
274
|
+
export class Delete${entityName}UseCase {
|
|
275
|
+
private readonly logger = new Logger(Delete${entityName}UseCase.name);
|
|
276
|
+
|
|
277
|
+
constructor(
|
|
278
|
+
@Inject(I${entityName}RepositoryName)
|
|
279
|
+
private readonly ${entityNameLower}Repository: I${entityName}Repository,
|
|
280
|
+
) {}
|
|
281
|
+
|
|
282
|
+
async execute(id: string): Promise<void> {
|
|
283
|
+
this.logger.log(\`Deleting ${entityName} (ID: \${id})\`);
|
|
284
|
+
|
|
285
|
+
const existing = await this.${entityNameLower}Repository.findById(id);
|
|
286
|
+
if (!existing) {
|
|
287
|
+
this.logger.warn(\`${entityName} \${id} not found for deletion\`);
|
|
288
|
+
throw new NotFoundException(\`${entityName} not found\`);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
await this.${entityNameLower}Repository.delete(id);
|
|
292
|
+
this.logger.log(\`Successfully deleted ${entityName} \${id}\`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
`;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
await createFile({
|
|
300
|
+
path: `${entityPath}/application/use-cases/${decapitalize(useCase)}-${
|
|
301
|
+
entity.name
|
|
302
|
+
}.use-case.ts`,
|
|
303
|
+
contente: content.trim(),
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
// 5. DTOs
|
|
308
|
+
const DtoFileContent = await generateDto(entity, useSwagger);
|
|
309
|
+
await createFile({
|
|
310
|
+
path: `${entityPath}/application/dtos/${entity.name}.dto.ts`,
|
|
311
|
+
contente: DtoFileContent,
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
if (entity.name.toLowerCase() === "user") {
|
|
315
|
+
await createDirectory(`${entityPath}/domain/enums`);
|
|
316
|
+
await createFile({
|
|
317
|
+
path: `${entityPath}/domain/enums/role.enum.ts`,
|
|
318
|
+
contente: `// Enumération des rôles utilisateurs
|
|
319
|
+
export enum Role {
|
|
320
|
+
USER = 'USER',
|
|
321
|
+
ADMIN = 'ADMIN',
|
|
322
|
+
SUPER_ADMIN = 'SUPER_ADMIN',
|
|
323
|
+
}
|
|
324
|
+
`,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// 7. Mapper
|
|
329
|
+
const mapperFileContent = await generateMapper(entity);
|
|
330
|
+
await createFile({
|
|
331
|
+
path: `${entityPath}/infrastructure/mappers/${entityNameLower}.mapper.ts`,
|
|
332
|
+
contente: mapperFileContent,
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
// 8. Service
|
|
336
|
+
await createFile({
|
|
337
|
+
path: `${entityPath}/application/services/${entityNameLower}.service.ts`,
|
|
338
|
+
contente: `/**
|
|
339
|
+
* PostService handles business logic
|
|
340
|
+
* for the Post entity.
|
|
341
|
+
*
|
|
342
|
+
* It acts as a bridge between the Controller and the Repository.
|
|
343
|
+
* Responsibilities include:
|
|
344
|
+
* - Data validation and transformation
|
|
345
|
+
* - Orchestrating use cases
|
|
346
|
+
* - Managing transactions
|
|
347
|
+
*/
|
|
348
|
+
|
|
349
|
+
import { Injectable } from '@nestjs/common';
|
|
350
|
+
import { Create${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/create-${entityNameLower}.use-case';
|
|
351
|
+
import { Update${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/update-${entityNameLower}.use-case';
|
|
352
|
+
import { GetById${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/getById-${entityNameLower}.use-case';
|
|
353
|
+
import { GetAll${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/getAll-${entityNameLower}.use-case';
|
|
354
|
+
import { Delete${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/delete-${entityNameLower}.use-case';
|
|
355
|
+
import { Create${entityNameCapitalized}Dto, Update${entityNameCapitalized}Dto } from 'src/${entityNameLower}/application/dtos/${entityNameLower}.dto';
|
|
356
|
+
import { ${entityNameCapitalized}Entity } from 'src/${entityNameLower}/domain/entities/${entityNameLower}.entity';
|
|
357
|
+
|
|
358
|
+
@Injectable()
|
|
359
|
+
export class ${entityNameCapitalized}Service {
|
|
360
|
+
constructor(
|
|
361
|
+
private readonly createUseCase: Create${entityNameCapitalized}UseCase,
|
|
362
|
+
private readonly updateUseCase: Update${entityNameCapitalized}UseCase,
|
|
363
|
+
private readonly getByIdUseCase: GetById${entityNameCapitalized}UseCase,
|
|
364
|
+
private readonly getAllUseCase: GetAll${entityNameCapitalized}UseCase,
|
|
365
|
+
private readonly deleteUseCase: Delete${entityNameCapitalized}UseCase,
|
|
366
|
+
) {}
|
|
367
|
+
|
|
368
|
+
async create(dto: Create${entityNameCapitalized}Dto): Promise<${entityNameCapitalized}Entity> {
|
|
369
|
+
return await this.createUseCase.execute(dto);
|
|
370
|
+
}
|
|
371
|
+
async update(id: string, dto: Update${entityNameCapitalized}Dto): Promise<${entityNameCapitalized}Entity | null> {
|
|
372
|
+
return await this.updateUseCase.execute(id, dto);
|
|
373
|
+
}
|
|
374
|
+
async getById(id: string): Promise<${entityNameCapitalized}Entity | null> {
|
|
375
|
+
return await this.getByIdUseCase.execute(id);
|
|
376
|
+
}
|
|
377
|
+
async getAll(): Promise<${entityNameCapitalized}Entity[]> {
|
|
378
|
+
return await this.getAllUseCase.execute();
|
|
379
|
+
}
|
|
380
|
+
async delete(id: string): Promise<void> {
|
|
381
|
+
return await this.deleteUseCase.execute(id);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
`.trim(),
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
// 9. Adapter
|
|
388
|
+
await createFile({
|
|
389
|
+
path: `${entityPath}/infrastructure/adapters/${entityNameLower}.adapter.ts`,
|
|
390
|
+
contente: `
|
|
391
|
+
// L'adaptateur permet de transformer ou d'adapter les données d'un format source vers un format cible.
|
|
392
|
+
// Cela est particulièrement utile lorsque nous devons interagir avec des API externes ou des services ayant des structures de données différentes.
|
|
393
|
+
|
|
394
|
+
export class ${entityNameCapitalized}Adapter {
|
|
395
|
+
// La méthode 'adapt' prend des données brutes d'un format spécifique et les transforme
|
|
396
|
+
// en un format qui est attendu par le système de notre domaine.
|
|
397
|
+
adapt(data: any) {
|
|
398
|
+
// Exemple d'adaptation des données - ceci est un exemple générique.
|
|
399
|
+
// Nous transformons les données pour que le format interne du système soit respecté.
|
|
400
|
+
|
|
401
|
+
const adaptedData = {
|
|
402
|
+
// Assurez-vous que vous mappez les propriétés nécessaires et les transformez.
|
|
403
|
+
id: data.id, // Mapping de l'ID de la donnée source à notre format interne
|
|
404
|
+
name: data.fullName || data.name, // Exemple de transformation de champ
|
|
405
|
+
description: data.details || data.description, // Gestion des données optionnelles
|
|
406
|
+
createdAt: new Date(data.createdAt), // Transformation de la date
|
|
407
|
+
updatedAt: new Date(data.updatedAt), // Idem pour la date de mise à jour
|
|
408
|
+
// Vous pouvez adapter d'autres champs en fonction des exigences spécifiques
|
|
409
|
+
};
|
|
410
|
+
|
|
411
|
+
// Retournez les données adaptées dans un format compréhensible pour le système
|
|
412
|
+
return adaptedData;
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
`,
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
// 10. Controller
|
|
419
|
+
const controllerContente = await generateController(
|
|
420
|
+
entity.name,
|
|
421
|
+
entityPath,
|
|
422
|
+
useSwagger,
|
|
423
|
+
);
|
|
424
|
+
await createFile({
|
|
425
|
+
path: `${entityPath}/presentation/controllers/${entityNameLower}.controller.ts`,
|
|
426
|
+
contente: controllerContente,
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
// 11. Module
|
|
430
|
+
let importsBlock = [];
|
|
431
|
+
let providersBlock = [];
|
|
432
|
+
let extraImports = "";
|
|
433
|
+
let forwardRefImport = "";
|
|
434
|
+
|
|
435
|
+
if (dbConfig.orm === "prisma") {
|
|
436
|
+
extraImports = `import { PrismaModule } from 'src/prisma/prisma.module';`;
|
|
437
|
+
importsBlock.push("PrismaModule");
|
|
438
|
+
} else if (dbConfig.orm === "typeorm") {
|
|
439
|
+
extraImports = `import { ${entityNameCapitalized} } from 'src/entities/${entityNameCapitalized}.entity';\nimport { TypeOrmModule } from '@nestjs/typeorm';`;
|
|
440
|
+
importsBlock.push(
|
|
441
|
+
`TypeOrmModule.forFeature([${entityNameCapitalized}])`,
|
|
442
|
+
);
|
|
443
|
+
} else if (dbConfig.orm === "mongoose") {
|
|
444
|
+
extraImports = `import { MongooseModule } from '@nestjs/mongoose';
|
|
445
|
+
import { ${entityNameCapitalized}, ${entityNameCapitalized}Schema } from '${entityPath}/infrastructure/persistence/mongoose/${entityNameLower}.schema';`;
|
|
446
|
+
importsBlock.push(
|
|
447
|
+
`MongooseModule.forFeature([{ name: ${entityNameCapitalized}.name, schema: ${entityNameCapitalized}Schema }])`,
|
|
448
|
+
);
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
if (entityNameLower == "user" && useAuth) {
|
|
452
|
+
extraImports += "\nimport { AuthModule } from 'src/auth/auth.module';";
|
|
453
|
+
importsBlock.push("forwardRef(() => AuthModule)");
|
|
454
|
+
forwardRefImport = " forwardRef,";
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// Ajoute l'import du service
|
|
458
|
+
extraImports += `\nimport { ${entityNameCapitalized}Service } from '${entityPath}/application/services/${entityNameLower}.service';`;
|
|
459
|
+
|
|
460
|
+
// Always necessary providers
|
|
461
|
+
providersBlock.push(
|
|
462
|
+
`{
|
|
463
|
+
provide: I${entityNameCapitalized}RepositoryName,
|
|
464
|
+
useClass: ${entityNameCapitalized}Repository,
|
|
465
|
+
}`,
|
|
466
|
+
`${entityNameCapitalized}Service`,
|
|
467
|
+
`Create${entityNameCapitalized}UseCase`,
|
|
468
|
+
`Update${entityNameCapitalized}UseCase`,
|
|
469
|
+
`GetById${entityNameCapitalized}UseCase`,
|
|
470
|
+
`GetAll${entityNameCapitalized}UseCase`,
|
|
471
|
+
`Delete${entityNameCapitalized}UseCase`,
|
|
472
|
+
`${entityNameCapitalized}Mapper`,
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
await createFile({
|
|
476
|
+
path: `${entityPath}/${entityNameLower}.module.ts`,
|
|
477
|
+
contente: `
|
|
478
|
+
/**
|
|
479
|
+
* ${entityNameCapitalized}Module est le module principal qui gère l'entité ${entityNameCapitalized}.
|
|
480
|
+
* Il regroupe tous les composants nécessaires pour traiter cette entité :
|
|
481
|
+
* - Contrôleur
|
|
482
|
+
* - Repository
|
|
483
|
+
* - Use Cases
|
|
484
|
+
* - Mapper
|
|
485
|
+
* - Service
|
|
486
|
+
*/
|
|
487
|
+
import {${forwardRefImport} Module } from '@nestjs/common';
|
|
488
|
+
${extraImports}
|
|
489
|
+
import { ${entityNameCapitalized}Controller } from '${entityPath}/presentation/controllers/${entityNameLower}.controller';
|
|
490
|
+
import { ${entityNameCapitalized}Repository } from '${entityPath}/infrastructure/repositories/${entityNameLower}.repository';
|
|
491
|
+
import { Create${entityNameCapitalized}UseCase } from '${entityPath}/application/use-cases/create-${entityNameLower}.use-case';
|
|
492
|
+
import { Update${entityNameCapitalized}UseCase } from '${entityPath}/application/use-cases/update-${entityNameLower}.use-case';
|
|
493
|
+
import { GetById${entityNameCapitalized}UseCase } from '${entityPath}/application/use-cases/getById-${entityNameLower}.use-case';
|
|
494
|
+
import { GetAll${entityNameCapitalized}UseCase } from '${entityPath}/application/use-cases/getAll-${entityNameLower}.use-case';
|
|
495
|
+
import { Delete${entityNameCapitalized}UseCase } from '${entityPath}/application/use-cases/delete-${entityNameLower}.use-case';
|
|
496
|
+
import { ${entityNameCapitalized}Mapper } from '${entityPath}/infrastructure/mappers/${entityNameLower}.mapper';
|
|
497
|
+
import { I${entityNameCapitalized}RepositoryName } from './domain/interfaces/${entityNameLower}.repository.interface';
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
@Module({
|
|
501
|
+
imports: [
|
|
502
|
+
${importsBlock.join(",\n ")}
|
|
503
|
+
],
|
|
504
|
+
controllers: [
|
|
505
|
+
${entityNameCapitalized}Controller
|
|
506
|
+
],
|
|
507
|
+
providers: [
|
|
508
|
+
${providersBlock.join(",\n ")}
|
|
509
|
+
],
|
|
510
|
+
exports: [
|
|
511
|
+
${entityNameCapitalized}Service, I${entityNameCapitalized}RepositoryName
|
|
512
|
+
]
|
|
513
|
+
})
|
|
514
|
+
export class ${entityNameCapitalized}Module {}
|
|
515
|
+
`.trim(),
|
|
516
|
+
});
|
|
517
|
+
|
|
518
|
+
await safeUpdateAppModule(entityNameLower);
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
await generateMiddlewares(dbConfig.orm);
|
|
522
|
+
|
|
523
|
+
// modification de AppModule
|
|
524
|
+
const appModulePath = "src/app.module.ts";
|
|
525
|
+
|
|
526
|
+
// Étape 1 : Ajouter les imports nécessaires
|
|
527
|
+
await updateFile({
|
|
528
|
+
path: appModulePath,
|
|
529
|
+
pattern: `import { Module } from '@nestjs/common';`,
|
|
530
|
+
replacement: `import { Module } from '@nestjs/common';
|
|
531
|
+
import { ResponseInterceptor } from './common/interceptors/response.interceptor';
|
|
532
|
+
import { APP_INTERCEPTOR } from '@nestjs/core';`,
|
|
533
|
+
});
|
|
534
|
+
|
|
535
|
+
// Étape 2 : Ajouter le provider APP_INTERCEPTOR dans providers[]
|
|
536
|
+
await updateFile({
|
|
537
|
+
path: appModulePath,
|
|
538
|
+
pattern: `providers: \\[`,
|
|
539
|
+
replacement: `providers: [
|
|
540
|
+
{
|
|
541
|
+
provide: APP_INTERCEPTOR,
|
|
542
|
+
useClass: ResponseInterceptor,
|
|
543
|
+
},`,
|
|
544
|
+
});
|
|
545
|
+
|
|
546
|
+
logSuccess(`Structure generated successfully!`);
|
|
547
|
+
} catch (error) {
|
|
548
|
+
logError(
|
|
549
|
+
`Process encountered an error during Clean Architecture setup: ${error}`,
|
|
550
|
+
);
|
|
551
|
+
throw error;
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
function capitalize(str) {
|
|
556
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
function decapitalize(str) {
|
|
560
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
module.exports = { setupCleanArchitecture };
|