nestcraftx 0.2.5 → 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/CLI_USAGE.fr.md +331 -331
- package/CLI_USAGE.md +364 -364
- package/LICENSE +21 -21
- 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/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 +1 -1
- package/utils/cliParser.js +133 -76
- package/utils/colors.js +62 -62
- package/utils/configs/configureDocker.js +120 -120
- package/utils/configs/setupCleanArchitecture.js +15 -13
- package/utils/configs/setupLightArchitecture.js +15 -9
- 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/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/setupAuth.js +28 -15
- package/utils/setups/setupDatabase.js +75 -75
- package/utils/setups/setupPrisma.js +802 -630
- 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 +27 -27
package/utils/utils.js
CHANGED
|
@@ -63,7 +63,7 @@ export async function generateEntityFileContent(entity, mode = "full") {
|
|
|
63
63
|
const constructorParams = allFields
|
|
64
64
|
.map(
|
|
65
65
|
(f) => `
|
|
66
|
-
private readonly ${f.name}: ${getFormattedType(f)}
|
|
66
|
+
private readonly ${f.name}: ${getFormattedType(f)},`,
|
|
67
67
|
)
|
|
68
68
|
.join("");
|
|
69
69
|
|
|
@@ -77,7 +77,7 @@ export async function generateEntityFileContent(entity, mode = "full") {
|
|
|
77
77
|
get${capitalize(f.name)}(): ${getFormattedType(f)}
|
|
78
78
|
{
|
|
79
79
|
return this.${f.name};
|
|
80
|
-
}
|
|
80
|
+
}`,
|
|
81
81
|
)
|
|
82
82
|
.join("\n");
|
|
83
83
|
|
|
@@ -156,7 +156,7 @@ export async function generateMapper(entity) {
|
|
|
156
156
|
|
|
157
157
|
const toUpdateFields = filteredFields
|
|
158
158
|
.map(
|
|
159
|
-
(f) => `if (dto.${f.name} !== undefined) data.${f.name} = dto.${f.name}
|
|
159
|
+
(f) => `if (dto.${f.name} !== undefined) data.${f.name} = dto.${f.name};`,
|
|
160
160
|
)
|
|
161
161
|
.join("\n ");
|
|
162
162
|
|
|
@@ -172,10 +172,10 @@ export async function generateMapper(entity) {
|
|
|
172
172
|
|
|
173
173
|
import { Injectable } from '@nestjs/common';
|
|
174
174
|
import { ${entityName}Entity } from 'src/${decapitalize(
|
|
175
|
-
entity.name
|
|
175
|
+
entity.name,
|
|
176
176
|
)}/domain/entities/${decapitalize(entity.name)}.entity';
|
|
177
177
|
import { Create${entityName}Dto, Update${entityName}Dto } from 'src/${decapitalize(
|
|
178
|
-
entity.name
|
|
178
|
+
entity.name,
|
|
179
179
|
)}/application/dtos/${decapitalize(entity.name)}.dto';
|
|
180
180
|
|
|
181
181
|
@Injectable()
|
|
@@ -215,7 +215,7 @@ export async function generateDtox(
|
|
|
215
215
|
entity,
|
|
216
216
|
useSwagger,
|
|
217
217
|
isAuthDto = false,
|
|
218
|
-
mode = "full"
|
|
218
|
+
mode = "full",
|
|
219
219
|
) {
|
|
220
220
|
const entityName = capitalize(entity.name);
|
|
221
221
|
const entityNameLower = entity.name.toLowerCase();
|
|
@@ -337,7 +337,7 @@ export async function generateDtox(
|
|
|
337
337
|
validators.push("@IsEmail()");
|
|
338
338
|
} else if (name.toLowerCase().includes("password")) {
|
|
339
339
|
validators.push(
|
|
340
|
-
"@MinLength(8, { message: 'Password is too short (min 8 characters)' })"
|
|
340
|
+
"@MinLength(8, { message: 'Password is too short (min 8 characters)' })",
|
|
341
341
|
);
|
|
342
342
|
}
|
|
343
343
|
|
|
@@ -350,7 +350,7 @@ export async function generateDtox(
|
|
|
350
350
|
case "number":
|
|
351
351
|
case "float":
|
|
352
352
|
validators.push(
|
|
353
|
-
isArray ? "@IsNumber({}, { each: true })" : "@IsNumber()"
|
|
353
|
+
isArray ? "@IsNumber({}, { each: true })" : "@IsNumber()",
|
|
354
354
|
);
|
|
355
355
|
break;
|
|
356
356
|
case "int":
|
|
@@ -358,7 +358,7 @@ export async function generateDtox(
|
|
|
358
358
|
break;
|
|
359
359
|
case "boolean":
|
|
360
360
|
validators.push(
|
|
361
|
-
isArray ? "@IsBoolean({ each: true })" : "@IsBoolean()"
|
|
361
|
+
isArray ? "@IsBoolean({ each: true })" : "@IsBoolean()",
|
|
362
362
|
);
|
|
363
363
|
break;
|
|
364
364
|
case "uuid":
|
|
@@ -381,7 +381,7 @@ export async function generateDtox(
|
|
|
381
381
|
description: getFieldDescription(f),
|
|
382
382
|
},
|
|
383
383
|
null,
|
|
384
|
-
2
|
|
384
|
+
2,
|
|
385
385
|
).replace(/"([^"]+)":/g, "$1:");
|
|
386
386
|
|
|
387
387
|
swaggerDecorator = `${decorator}(${options})\n `;
|
|
@@ -482,7 +482,7 @@ export async function generateDto(
|
|
|
482
482
|
entity,
|
|
483
483
|
useSwagger,
|
|
484
484
|
isAuthDto = false,
|
|
485
|
-
mode = "full"
|
|
485
|
+
mode = "full",
|
|
486
486
|
) {
|
|
487
487
|
const entityName = capitalize(entity.name);
|
|
488
488
|
const entityNameLower = entity.name.toLowerCase();
|
|
@@ -563,7 +563,7 @@ export async function generateDto(
|
|
|
563
563
|
if (name.toLowerCase().includes("email")) validators.push("@IsEmail()");
|
|
564
564
|
else if (name.toLowerCase().includes("password"))
|
|
565
565
|
validators.push(
|
|
566
|
-
"@MinLength(8, { message: 'Password is too short (min 8 characters)' })"
|
|
566
|
+
"@MinLength(8, { message: 'Password is too short (min 8 characters)' })",
|
|
567
567
|
);
|
|
568
568
|
|
|
569
569
|
switch (cleanType) {
|
|
@@ -577,12 +577,12 @@ export async function generateDto(
|
|
|
577
577
|
case "int":
|
|
578
578
|
case "float":
|
|
579
579
|
validators.push(
|
|
580
|
-
isArray ? "@IsNumber({}, { each: true })" : "@IsNumber()"
|
|
580
|
+
isArray ? "@IsNumber({}, { each: true })" : "@IsNumber()",
|
|
581
581
|
);
|
|
582
582
|
break;
|
|
583
583
|
case "boolean":
|
|
584
584
|
validators.push(
|
|
585
|
-
isArray ? "@IsBoolean({ each: true })" : "@IsBoolean()"
|
|
585
|
+
isArray ? "@IsBoolean({ each: true })" : "@IsBoolean()",
|
|
586
586
|
);
|
|
587
587
|
break;
|
|
588
588
|
case "uuid":
|
|
@@ -603,13 +603,13 @@ export async function generateDto(
|
|
|
603
603
|
description: getFieldDescription(f),
|
|
604
604
|
},
|
|
605
605
|
null,
|
|
606
|
-
2
|
|
606
|
+
2,
|
|
607
607
|
).replace(/"([^"]+)":/g, "$1:");
|
|
608
608
|
swaggerDecorator = `${decorator}(${options})\n `;
|
|
609
609
|
}
|
|
610
610
|
|
|
611
611
|
return `${swaggerDecorator}${validators.join("\n ")}\n ${name}${
|
|
612
|
-
optional ? "?" : ""
|
|
612
|
+
optional ? "?" : "!"
|
|
613
613
|
}: ${formatType(f.type)};`;
|
|
614
614
|
};
|
|
615
615
|
|
|
@@ -821,7 +821,7 @@ export class ${entityNameCapitalized}Controller {
|
|
|
821
821
|
|
|
822
822
|
export async function generateMiddlewares(orm = "global") {
|
|
823
823
|
logInfo(
|
|
824
|
-
"\u2728 G\u00e9n\u00e9ration des middlewares, interceptors, guards et filters personnalis\u00e9s..."
|
|
824
|
+
"\u2728 G\u00e9n\u00e9ration des middlewares, interceptors, guards et filters personnalis\u00e9s...",
|
|
825
825
|
);
|
|
826
826
|
|
|
827
827
|
const basePath = "src/common";
|
|
@@ -998,7 +998,7 @@ import { ValidationPipe } from '@nestjs/common';`;
|
|
|
998
998
|
});
|
|
999
999
|
|
|
1000
1000
|
logSuccess(
|
|
1001
|
-
"\u2705 Middlewares, filters, interceptors et guards g\u00e9n\u00e9r\u00e9s avec succ\u00e8s !"
|
|
1001
|
+
"\u2705 Middlewares, filters, interceptors et guards g\u00e9n\u00e9r\u00e9s avec succ\u00e8s !",
|
|
1002
1002
|
);
|
|
1003
1003
|
}
|
|
1004
1004
|
|
|
@@ -1063,7 +1063,7 @@ import { Repository } from 'typeorm';
|
|
|
1063
1063
|
import { InjectRepository } from '@nestjs/typeorm';
|
|
1064
1064
|
import { ${entityNameCapitalized}Entity } from '${entityPath}/domain/entities/${entityNameLower}.entity';
|
|
1065
1065
|
import { ${entityNameCapitalized} } from 'src/entities/${entityNameCapitalized}.entity';
|
|
1066
|
-
import { I${entityNameCapitalized}Repository } from '${entityPath}/domain/interfaces/${entityNameLower}.repository.interface';
|
|
1066
|
+
import type { I${entityNameCapitalized}Repository } from '${entityPath}/domain/interfaces/${entityNameLower}.repository.interface';
|
|
1067
1067
|
import { Create${entityNameCapitalized}Dto, Update${entityNameCapitalized}Dto } from '${entityPath}/application/dtos/${entityNameLower}.dto';
|
|
1068
1068
|
import { ${entityNameCapitalized}Mapper } from '${entityPath}/infrastructure/mappers/${entityNameLower}.mapper';
|
|
1069
1069
|
|
|
@@ -1315,7 +1315,7 @@ export class ${entityNameCapitalized}Repository implements I${entityNameCapitali
|
|
|
1315
1315
|
export async function generateMongooseSchemaFileContentx(
|
|
1316
1316
|
entity,
|
|
1317
1317
|
entitiesData,
|
|
1318
|
-
mode = "full"
|
|
1318
|
+
mode = "full",
|
|
1319
1319
|
) {
|
|
1320
1320
|
const entityName = capitalize(entity.name);
|
|
1321
1321
|
const entityNameLower = entity.name.toLowerCase();
|
|
@@ -1330,7 +1330,7 @@ export async function generateMongooseSchemaFileContentx(
|
|
|
1330
1330
|
|
|
1331
1331
|
// On retire les doublons et l'entité elle-même
|
|
1332
1332
|
const uniqueRelated = [...new Set(relatedEntities)].filter(
|
|
1333
|
-
(e) => e !== entityNameLower
|
|
1333
|
+
(e) => e !== entityNameLower,
|
|
1334
1334
|
);
|
|
1335
1335
|
|
|
1336
1336
|
uniqueRelated.forEach((target) => {
|
|
@@ -1413,7 +1413,7 @@ export async function generateMongooseSchemaFileContentx(
|
|
|
1413
1413
|
if (fieldNameLow.endsWith("id")) {
|
|
1414
1414
|
const targetEntity = fieldNameLow.replace("id", "");
|
|
1415
1415
|
const hasRelation = entitiesData.relations.some(
|
|
1416
|
-
(r) => r.from === targetEntity || r.to === targetEntity
|
|
1416
|
+
(r) => r.from === targetEntity || r.to === targetEntity,
|
|
1417
1417
|
);
|
|
1418
1418
|
|
|
1419
1419
|
if (hasRelation) {
|
|
@@ -1477,7 +1477,7 @@ export async function generateMongooseSchemaFileContentx(
|
|
|
1477
1477
|
.filter(Boolean);
|
|
1478
1478
|
|
|
1479
1479
|
const allFields = [...new Set([...directFields, ...dynamicRelations])].join(
|
|
1480
|
-
"\n\n"
|
|
1480
|
+
"\n\n",
|
|
1481
1481
|
);
|
|
1482
1482
|
|
|
1483
1483
|
return `
|
|
@@ -1500,7 +1500,7 @@ export const ${entityName}Schema = SchemaFactory.createForClass(${entityName});
|
|
|
1500
1500
|
export async function generateMongooseSchemaFileContent(
|
|
1501
1501
|
entity,
|
|
1502
1502
|
entitiesData,
|
|
1503
|
-
mode = "full"
|
|
1503
|
+
mode = "full",
|
|
1504
1504
|
) {
|
|
1505
1505
|
const entityName = capitalize(entity.name);
|
|
1506
1506
|
const entityNameLower = entity.name.toLowerCase();
|
|
@@ -1512,7 +1512,7 @@ export async function generateMongooseSchemaFileContent(
|
|
|
1512
1512
|
.map((rel) => (rel.from === entityNameLower ? rel.to : rel.from));
|
|
1513
1513
|
|
|
1514
1514
|
const uniqueRelated = [...new Set(relatedEntities)].filter(
|
|
1515
|
-
(e) => e !== entityNameLower
|
|
1515
|
+
(e) => e !== entityNameLower,
|
|
1516
1516
|
);
|
|
1517
1517
|
|
|
1518
1518
|
let extraImports = "";
|
|
@@ -1604,7 +1604,7 @@ export async function generateMongooseSchemaFileContent(
|
|
|
1604
1604
|
const nameLow = f.name.toLowerCase();
|
|
1605
1605
|
// On dégage tout ce qui ressemble à une relation pour éviter les doublons avec dynamicRelations
|
|
1606
1606
|
const isRelId = uniqueRelated.some(
|
|
1607
|
-
(rel) => nameLow === rel + "id" || nameLow === rel
|
|
1607
|
+
(rel) => nameLow === rel + "id" || nameLow === rel,
|
|
1608
1608
|
);
|
|
1609
1609
|
return scalarTypes.includes(f.type.toLowerCase()) && !isRelId;
|
|
1610
1610
|
})
|
|
@@ -1651,7 +1651,7 @@ export async function generateMongooseSchemaFileContent(
|
|
|
1651
1651
|
});
|
|
1652
1652
|
|
|
1653
1653
|
const allFields = [...new Set([...directFields, ...dynamicRelations])].join(
|
|
1654
|
-
"\n\n"
|
|
1654
|
+
"\n\n",
|
|
1655
1655
|
);
|
|
1656
1656
|
|
|
1657
1657
|
return `import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
|