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.
Files changed (40) hide show
  1. package/CLI_USAGE.fr.md +331 -331
  2. package/CLI_USAGE.md +364 -364
  3. package/LICENSE +21 -21
  4. package/bin/nestcraft.js +84 -64
  5. package/commands/demo.js +333 -330
  6. package/commands/generate.js +93 -0
  7. package/commands/generateConf.js +91 -0
  8. package/commands/info.js +48 -48
  9. package/commands/new.js +338 -335
  10. package/commands/start.js +19 -19
  11. package/commands/test.js +7 -7
  12. package/package.json +1 -1
  13. package/utils/cliParser.js +133 -76
  14. package/utils/colors.js +62 -62
  15. package/utils/configs/configureDocker.js +120 -120
  16. package/utils/configs/setupCleanArchitecture.js +15 -13
  17. package/utils/configs/setupLightArchitecture.js +15 -9
  18. package/utils/file-utils/saveProjectConfig.js +36 -0
  19. package/utils/fullModeInput.js +607 -607
  20. package/utils/generators/application/dtoUpdater.js +54 -0
  21. package/utils/generators/cleanModuleGenerator.js +475 -0
  22. package/utils/generators/database/setupDatabase.js +31 -0
  23. package/utils/generators/domain/entityUpdater.js +78 -0
  24. package/utils/generators/infrastructure/mapperUpdater.js +65 -0
  25. package/utils/generators/lightModuleGenerator.js +131 -0
  26. package/utils/generators/relation/relation.engine.js +64 -0
  27. package/utils/interactive/askEntityInputs.js +165 -0
  28. package/utils/loggers/logError.js +7 -7
  29. package/utils/loggers/logInfo.js +7 -7
  30. package/utils/loggers/logSuccess.js +7 -7
  31. package/utils/loggers/logWarning.js +7 -7
  32. package/utils/setups/orms/typeOrmSetup.js +630 -630
  33. package/utils/setups/setupAuth.js +28 -15
  34. package/utils/setups/setupDatabase.js +75 -75
  35. package/utils/setups/setupPrisma.js +802 -630
  36. package/utils/shell.js +32 -32
  37. package/utils/spinner.js +57 -57
  38. package/utils/systemCheck.js +124 -124
  39. package/utils/userInput.js +421 -421
  40. 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';