@mikemajesty/microservice-crud 6.0.16 → 6.0.17

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 (26) hide show
  1. package/package.json +1 -1
  2. package/src/templates/mongo/core/use-cases/__tests__/create.spec.js +4 -4
  3. package/src/templates/mongo/core/use-cases/__tests__/delete.spec.js +8 -9
  4. package/src/templates/mongo/core/use-cases/__tests__/get-by-id.spec.js +8 -8
  5. package/src/templates/mongo/core/use-cases/__tests__/list.spec.js +9 -9
  6. package/src/templates/mongo/core/use-cases/__tests__/update.spec.js +8 -8
  7. package/src/templates/mongo/core/use-cases/create.js +5 -5
  8. package/src/templates/mongo/core/use-cases/delete.js +8 -8
  9. package/src/templates/mongo/core/use-cases/get-by-id.js +6 -6
  10. package/src/templates/mongo/core/use-cases/list.js +7 -7
  11. package/src/templates/mongo/core/use-cases/update.js +10 -10
  12. package/src/templates/mongo/modules/controller.js +11 -11
  13. package/src/templates/mongo/modules/swagger.js +13 -13
  14. package/src/templates/postgres/core/use-cases/__tests__/create.spec.js +4 -4
  15. package/src/templates/postgres/core/use-cases/__tests__/delete.spec.js +8 -8
  16. package/src/templates/postgres/core/use-cases/__tests__/get-by-id.spec.js +8 -8
  17. package/src/templates/postgres/core/use-cases/__tests__/list.spec.js +8 -8
  18. package/src/templates/postgres/core/use-cases/__tests__/update.spec.js +8 -8
  19. package/src/templates/postgres/core/use-cases/create.js +5 -5
  20. package/src/templates/postgres/core/use-cases/delete.js +8 -8
  21. package/src/templates/postgres/core/use-cases/get-by-id.js +6 -6
  22. package/src/templates/postgres/core/use-cases/list.js +3 -3
  23. package/src/templates/postgres/core/use-cases/update.js +10 -10
  24. package/src/templates/postgres/modules/controller.js +11 -11
  25. package/src/templates/postgres/modules/swagger.js +12 -12
  26. package/src/textUtils.js +9 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikemajesty/microservice-crud",
3
- "version": "6.0.16",
3
+ "version": "6.0.17",
4
4
  "description": "Monorepo CLI",
5
5
  "main": "src/cli.js",
6
6
  "scripts": {
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseCreateTest = (name) => `import { Test } from '@nestjs/testing';
4
4
  import { ZodIssue } from 'zod';
@@ -30,8 +30,8 @@ describe(${dashToPascal(name)}CreateUsecase.name, () => {
30
30
  },
31
31
  {
32
32
  provide: I${dashToPascal(name)}CreateAdapter,
33
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository, logger: ILoggerAdapter) => {
34
- return new ${dashToPascal(name)}CreateUsecase(${name}Repository, logger);
33
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository, logger: ILoggerAdapter) => {
34
+ return new ${dashToPascal(name)}CreateUsecase(${snakeToCamel(name)}Repository, logger);
35
35
  },
36
36
  inject: [I${dashToPascal(name)}Repository, ILoggerAdapter]
37
37
  }
@@ -55,7 +55,7 @@ describe(${dashToPascal(name)}CreateUsecase.name, () => {
55
55
  name: 'name'
56
56
  };
57
57
 
58
- test('when ${name} created successfully, should expect a ${name}', async () => {
58
+ test('when ${snakeToCamel(name)} created successfully, should expect a ${snakeToCamel(name)}', async () => {
59
59
  const output: ${dashToPascal(name)}CreateOutput = { created: true, id: TestUtils.getMockUUID() };
60
60
  repository.findOne = jest.fn().mockResolvedValue(null);
61
61
  repository.create = jest.fn().mockResolvedValue(output);
@@ -1,5 +1,4 @@
1
- const { dashToPascal } = require("../../../../../textUtils")
2
-
1
+ const { dashToPascal, snakeToCamel } = require("../../../../../textUtils")
3
2
  const getCoreUsecaseDeleteTest = (name) => `import { Test } from '@nestjs/testing';
4
3
  import { ZodIssue } from 'zod';
5
4
 
@@ -25,8 +24,8 @@ describe(${dashToPascal(name)}DeleteUsecase.name, () => {
25
24
  },
26
25
  {
27
26
  provide: I${dashToPascal(name)}DeleteAdapter,
28
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository) => {
29
- return new ${dashToPascal(name)}DeleteUsecase(${name}Repository);
27
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) => {
28
+ return new ${dashToPascal(name)}DeleteUsecase(${snakeToCamel(name)}Repository);
30
29
  },
31
30
  inject: [I${dashToPascal(name)}Repository]
32
31
  }
@@ -50,23 +49,23 @@ describe(${dashToPascal(name)}DeleteUsecase.name, () => {
50
49
  id: TestUtils.getMockUUID()
51
50
  };
52
51
 
53
- test('when ${name} not found, should expect an error', async () => {
52
+ test('when ${snakeToCamel(name)} not found, should expect an error', async () => {
54
53
  repository.findById = jest.fn().mockResolvedValue(null);
55
54
 
56
55
  await expect(usecase.execute(input)).rejects.toThrow(ApiNotFoundException);
57
56
  });
58
57
 
59
- const ${name} = new ${dashToPascal(name)}Entity({
58
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity({
60
59
  id: TestUtils.getMockUUID(),
61
60
  name: 'dummy'
62
61
  });
63
62
 
64
- test('when ${name} deleted successfully, should expect a ${name}', async () => {
65
- repository.findById = jest.fn().mockResolvedValue(${name});
63
+ test('when ${snakeToCamel(name)} deleted successfully, should expect a ${snakeToCamel(name)}', async () => {
64
+ repository.findById = jest.fn().mockResolvedValue(${snakeToCamel(name)});
66
65
  repository.updateOne = jest.fn();
67
66
 
68
67
  await expect(usecase.execute(input)).resolves.toEqual({
69
- ...${name},
68
+ ...${snakeToCamel(name)},
70
69
  deletedAt: expect.any(Date)
71
70
  });
72
71
  });
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseGetByIdTest = (name) => `import { Test } from '@nestjs/testing';
4
4
  import { ZodIssue } from 'zod';
@@ -25,8 +25,8 @@ describe(${dashToPascal(name)}GetByIdUsecase.name, () => {
25
25
  },
26
26
  {
27
27
  provide: I${dashToPascal(name)}GetByIdAdapter,
28
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository) => {
29
- return new ${dashToPascal(name)}GetByIdUsecase(${name}Repository);
28
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) => {
29
+ return new ${dashToPascal(name)}GetByIdUsecase(${snakeToCamel(name)}Repository);
30
30
  },
31
31
  inject: [I${dashToPascal(name)}Repository]
32
32
  }
@@ -50,21 +50,21 @@ describe(${dashToPascal(name)}GetByIdUsecase.name, () => {
50
50
  id: TestUtils.getMockUUID()
51
51
  };
52
52
 
53
- test('when ${name} not found, should expect an error', async () => {
53
+ test('when ${snakeToCamel(name)} not found, should expect an error', async () => {
54
54
  repository.findById = jest.fn().mockResolvedValue(null);
55
55
 
56
56
  await expect(usecase.execute(input)).rejects.toThrow(ApiNotFoundException);
57
57
  });
58
58
 
59
- const ${name} = new ${dashToPascal(name)}Entity({
59
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity({
60
60
  id: '61cc35f3-03d9-4b7f-9c63-59f32b013ef5',
61
61
  name: 'dummy'
62
62
  });
63
63
 
64
- test('when ${name} found, should expect a ${name}', async () => {
65
- repository.findById = jest.fn().mockResolvedValue(${name});
64
+ test('when ${snakeToCamel(name)} found, should expect a ${snakeToCamel(name)}', async () => {
65
+ repository.findById = jest.fn().mockResolvedValue(${snakeToCamel(name)});
66
66
 
67
- await expect(usecase.execute(input)).resolves.toEqual(${name});
67
+ await expect(usecase.execute(input)).resolves.toEqual(${snakeToCamel(name)});
68
68
  });
69
69
  });
70
70
  `
@@ -1,6 +1,6 @@
1
1
 
2
2
  const pluralize = require('pluralize')
3
- const { dashToPascal } = require('../../../../../textUtils')
3
+ const { dashToPascal, snakeToCamel } = require('../../../../../textUtils')
4
4
 
5
5
  const getCoreUsecaseListTest = (name) => `import { Test } from '@nestjs/testing';
6
6
  import { ZodIssue } from 'zod';
@@ -26,8 +26,8 @@ describe(${dashToPascal(name)}ListUsecase.name, () => {
26
26
  },
27
27
  {
28
28
  provide: I${dashToPascal(name)}ListAdapter,
29
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository) => {
30
- return new ${dashToPascal(name)}ListUsecase(${name}Repository);
29
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) => {
30
+ return new ${dashToPascal(name)}ListUsecase(${snakeToCamel(name)}Repository);
31
31
  },
32
32
  inject: [I${dashToPascal(name)}Repository]
33
33
  }
@@ -52,28 +52,28 @@ describe(${dashToPascal(name)}ListUsecase.name, () => {
52
52
 
53
53
  const input: ${dashToPascal(name)}ListInput = { limit: 1, page: 1, search: {}, sort: { createdAt: -1 } };
54
54
 
55
- const ${name} = new ${dashToPascal(name)}Entity({
55
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity({
56
56
  id: TestUtils.getMockUUID(),
57
57
  name: 'dummy',
58
58
  createdAt: new Date(),
59
59
  updatedAt: new Date()
60
60
  });
61
61
 
62
- const ${pluralize(name)} = [${name}];
62
+ const ${pluralize(snakeToCamel(name))} = [${snakeToCamel(name)}];
63
63
 
64
- test('when ${name} are found, should expect an ${name} list', async () => {
65
- const output: ${dashToPascal(name)}ListOutput = { docs: ${pluralize(name)}, page: 1, limit: 1, total: 1 };
64
+ test('when ${snakeToCamel(name)} are found, should expect an ${snakeToCamel(name)} list', async () => {
65
+ const output: ${dashToPascal(name)}ListOutput = { docs: ${pluralize(snakeToCamel(name))}, page: 1, limit: 1, total: 1 };
66
66
  repository.paginate = jest.fn().mockResolvedValue(output);
67
67
 
68
68
  await expect(usecase.execute(input)).resolves.toEqual({
69
- docs: ${pluralize(name)},
69
+ docs: ${pluralize(snakeToCamel(name))},
70
70
  page: 1,
71
71
  limit: 1,
72
72
  total: 1
73
73
  });
74
74
  });
75
75
 
76
- test('when ${name} not found, should expect an empty list', async () => {
76
+ test('when ${snakeToCamel(name)} not found, should expect an empty list', async () => {
77
77
  const output: ${dashToPascal(name)}ListOutput = { docs: [], page: 1, limit: 1, total: 1 };
78
78
  repository.paginate = jest.fn().mockResolvedValue(output);
79
79
 
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseUpdateTest = (name) => `import { Test } from '@nestjs/testing';
4
4
  import { ZodIssue } from 'zod';
@@ -26,8 +26,8 @@ describe(${dashToPascal(name)}UpdateUsecase.name, () => {
26
26
  },
27
27
  {
28
28
  provide: I${dashToPascal(name)}UpdateAdapter,
29
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository, logger: ILoggerAdapter) => {
30
- return new ${dashToPascal(name)}UpdateUsecase(${name}Repository, logger);
29
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository, logger: ILoggerAdapter) => {
30
+ return new ${dashToPascal(name)}UpdateUsecase(${snakeToCamel(name)}Repository, logger);
31
31
  },
32
32
  inject: [I${dashToPascal(name)}Repository, ILoggerAdapter]
33
33
  }
@@ -51,22 +51,22 @@ describe(${dashToPascal(name)}UpdateUsecase.name, () => {
51
51
  id: TestUtils.getMockUUID()
52
52
  };
53
53
 
54
- test('when ${name} not found, should expect an error', async () => {
54
+ test('when ${snakeToCamel(name)} not found, should expect an error', async () => {
55
55
  repository.findById = jest.fn().mockResolvedValue(null);
56
56
 
57
57
  await expect(usecase.execute(input)).rejects.toThrow(ApiNotFoundException);
58
58
  });
59
59
 
60
- const ${name}: ${dashToPascal(name)}UpdateOutput = new ${dashToPascal(name)}Entity({
60
+ const ${snakeToCamel(name)}: ${dashToPascal(name)}UpdateOutput = new ${dashToPascal(name)}Entity({
61
61
  id: TestUtils.getMockUUID(),
62
62
  name: 'dummy'
63
63
  });
64
64
 
65
- test('when ${name} updated successfully, should expect an ${name}', async () => {
66
- repository.findById = jest.fn().mockResolvedValue(${name});
65
+ test('when ${snakeToCamel(name)} updated successfully, should expect an ${snakeToCamel(name)}', async () => {
66
+ repository.findById = jest.fn().mockResolvedValue(${snakeToCamel(name)});
67
67
  repository.updateOne = jest.fn().mockResolvedValue(null);
68
68
 
69
- await expect(usecase.execute(input)).resolves.toEqual(${name});
69
+ await expect(usecase.execute(input)).resolves.toEqual(${snakeToCamel(name)});
70
70
  });
71
71
  });
72
72
  `
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseCreate = (name) => `import { z } from 'zod';
4
4
 
@@ -20,7 +20,7 @@ export type ${dashToPascal(name)}CreateOutput = CreatedModel;
20
20
 
21
21
  export class ${dashToPascal(name)}CreateUsecase implements IUsecase {
22
22
  constructor(
23
- private readonly ${name}Repository: I${dashToPascal(name)}Repository,
23
+ private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository,
24
24
  private readonly loggerService: ILoggerAdapter
25
25
  ) {}
26
26
 
@@ -28,10 +28,10 @@ export class ${dashToPascal(name)}CreateUsecase implements IUsecase {
28
28
  async execute(input: ${dashToPascal(name)}CreateInput): Promise<${dashToPascal(name)}CreateOutput> {
29
29
  const entity = new ${dashToPascal(name)}Entity({ id: UUIDUtils.create(), ...input });
30
30
 
31
- const ${name} = await this.${name}Repository.create(entity);
31
+ const ${snakeToCamel(name)} = await this.${snakeToCamel(name)}Repository.create(entity);
32
32
 
33
- this.loggerService.info({ message: '${name} created.', obj: { ${name} } });
34
- return ${name};
33
+ this.loggerService.info({ message: '${snakeToCamel(name)} created.', obj: { ${snakeToCamel(name)} } });
34
+ return ${snakeToCamel(name)};
35
35
  }
36
36
  }
37
37
  `
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseDelete = (name) => `import { z } from 'zod';
4
4
 
@@ -17,23 +17,23 @@ export type ${dashToPascal(name)}DeleteInput = z.infer<typeof ${dashToPascal(nam
17
17
  export type ${dashToPascal(name)}DeleteOutput = ${dashToPascal(name)}Entity;
18
18
 
19
19
  export class ${dashToPascal(name)}DeleteUsecase implements IUsecase {
20
- constructor(private readonly ${name}Repository: I${dashToPascal(name)}Repository) {}
20
+ constructor(private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) {}
21
21
 
22
22
  @ValidateSchema(${dashToPascal(name)}DeleteSchema)
23
23
  async execute({ id }: ${dashToPascal(name)}DeleteInput): Promise<${dashToPascal(name)}DeleteOutput> {
24
- const model = await this.${name}Repository.findById(id);
24
+ const model = await this.${snakeToCamel(name)}Repository.findById(id);
25
25
 
26
26
  if (!model) {
27
- throw new ApiNotFoundException('${name}NotFound');
27
+ throw new ApiNotFoundException('${snakeToCamel(name)}NotFound');
28
28
  }
29
29
 
30
- const ${name} = new ${dashToPascal(name)}Entity(model);
30
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity(model);
31
31
 
32
- ${name}.deactivated();
32
+ ${snakeToCamel(name)}.deactivated();
33
33
 
34
- await this.${name}Repository.updateOne({ id: ${name}.id }, ${name});
34
+ await this.${snakeToCamel(name)}Repository.updateOne({ id: ${snakeToCamel(name)}.id }, ${snakeToCamel(name)});
35
35
 
36
- return ${name};
36
+ return ${snakeToCamel(name)};
37
37
  }
38
38
  }
39
39
  `
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseGetById = (name) => `import { z } from 'zod';
4
4
 
@@ -16,17 +16,17 @@ export type ${dashToPascal(name)}GetByIdInput = z.infer<typeof ${dashToPascal(na
16
16
  export type ${dashToPascal(name)}GetByIdOutput = ${dashToPascal(name)}Entity;
17
17
 
18
18
  export class ${dashToPascal(name)}GetByIdUsecase implements IUsecase {
19
- constructor(private readonly ${name}Repository: I${dashToPascal(name)}Repository) {}
19
+ constructor(private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) {}
20
20
 
21
21
  @ValidateSchema(${dashToPascal(name)}GetByIdSchema)
22
22
  async execute({ id }: ${dashToPascal(name)}GetByIdInput): Promise<${dashToPascal(name)}GetByIdOutput> {
23
- const ${name} = await this.${name}Repository.findById(id);
23
+ const ${snakeToCamel(name)} = await this.${snakeToCamel(name)}Repository.findById(id);
24
24
 
25
- if (!${name}) {
26
- throw new ApiNotFoundException('${name}NotFound');
25
+ if (!${snakeToCamel(name)}) {
26
+ throw new ApiNotFoundException('${snakeToCamel(name)}NotFound');
27
27
  }
28
28
 
29
- const entity = new ${dashToPascal(name)}Entity(${name});
29
+ const entity = new ${dashToPascal(name)}Entity(${snakeToCamel(name)});
30
30
 
31
31
  return entity;
32
32
  }
@@ -1,5 +1,5 @@
1
1
  const pluralize = require('pluralize')
2
- const { dashToPascal } = require('../../../../textUtils')
2
+ const { dashToPascal, snakeToCamel } = require('../../../../textUtils')
3
3
 
4
4
  const getCoreUsecaseList = (name) => `import { z } from 'zod';
5
5
 
@@ -18,17 +18,17 @@ export type ${dashToPascal(name)}ListInput = PaginationInput<${dashToPascal(name
18
18
  export type ${dashToPascal(name)}ListOutput = PaginationOutput<${dashToPascal(name)}Entity>;
19
19
 
20
20
  export class ${dashToPascal(name)}ListUsecase implements IUsecase {
21
- constructor(private readonly ${name}Repository: I${dashToPascal(name)}Repository) {}
21
+ constructor(private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) {}
22
22
 
23
23
  @ValidateSchema(${dashToPascal(name)}ListSchema)
24
24
  async execute(input: ${dashToPascal(name)}ListInput): Promise<${dashToPascal(name)}ListOutput> {
25
- const ${pluralize(name)} = await this.${name}Repository.paginate(input);
25
+ const ${pluralize(snakeToCamel(name))} = await this.${snakeToCamel(name)}Repository.paginate(input);
26
26
 
27
27
  return {
28
- docs: ${pluralize(name)}.docs.map((u) => new ${dashToPascal(name)}Entity(u)),
29
- limit: ${pluralize(name)}.limit,
30
- page: ${pluralize(name)}.page,
31
- total: ${pluralize(name)}.total
28
+ docs: ${pluralize(snakeToCamel(name))}.docs.map((u) => new ${dashToPascal(name)}Entity(u)),
29
+ limit: ${pluralize(snakeToCamel(name))}.limit,
30
+ page: ${pluralize(snakeToCamel(name))}.page,
31
+ total: ${pluralize(snakeToCamel(name))}.total
32
32
  };
33
33
  }
34
34
  }
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseUpdate = (name) => `import { z } from 'zod';
4
4
 
@@ -19,27 +19,27 @@ export type ${dashToPascal(name)}UpdateOutput = ${dashToPascal(name)}Entity;
19
19
 
20
20
  export class ${dashToPascal(name)}UpdateUsecase implements IUsecase {
21
21
  constructor(
22
- private readonly ${name}Repository: I${dashToPascal(name)}Repository,
22
+ private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository,
23
23
  private readonly loggerService: ILoggerAdapter
24
24
  ) {}
25
25
 
26
26
  @ValidateSchema(${dashToPascal(name)}UpdateSchema)
27
27
  async execute(input: ${dashToPascal(name)}UpdateInput): Promise<${dashToPascal(name)}UpdateOutput> {
28
- const ${name} = await this.${name}Repository.findById(input.id as string);
28
+ const ${snakeToCamel(name)} = await this.${snakeToCamel(name)}Repository.findById(input.id as string);
29
29
 
30
- if (!${name}) {
31
- throw new ApiNotFoundException('${name}NotFound');
30
+ if (!${snakeToCamel(name)}) {
31
+ throw new ApiNotFoundException('${snakeToCamel(name)}NotFound');
32
32
  }
33
33
 
34
- const ${name}Found = new ${dashToPascal(name)}Entity(${name});
34
+ const ${snakeToCamel(name)}Found = new ${dashToPascal(name)}Entity(${name});
35
35
 
36
- const entity = new ${dashToPascal(name)}Entity({ ...${name}Found, ...input });
36
+ const entity = new ${dashToPascal(name)}Entity({ ...${snakeToCamel(name)}Found, ...input });
37
37
 
38
- await this.${name}Repository.updateOne({ id: entity.id }, entity);
38
+ await this.${snakeToCamel(name)}Repository.updateOne({ id: entity.id }, entity);
39
39
 
40
- this.loggerService.info({ message: '${name} updated.', obj: { ${name}: input } });
40
+ this.loggerService.info({ message: '${snakeToCamel(name)} updated.', obj: { ${snakeToCamel(name)}: input } });
41
41
 
42
- const updated = await this.${name}Repository.findById(entity.id);
42
+ const updated = await this.${snakeToCamel(name)}Repository.findById(entity.id);
43
43
 
44
44
  return new ${dashToPascal(name)}Entity(updated as ${dashToPascal(name)}Entity);
45
45
  }
@@ -1,5 +1,5 @@
1
1
  const pluralize = require('pluralize')
2
- const { dashToPascal } = require('../../../textUtils')
2
+ const { dashToPascal, snakeToCamel } = require('../../../textUtils')
3
3
 
4
4
  const getModuleController = (name) => `import { Controller, Delete, Get, Post, Put, Req } from '@nestjs/common';
5
5
  import { ApiBearerAuth, ApiBody, ApiParam, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger';
@@ -27,18 +27,18 @@ import { SwaggerRequest, SwaggerResponse } from './swagger';
27
27
  @ApiBearerAuth()
28
28
  export class ${dashToPascal(name)}Controller {
29
29
  constructor(
30
- private readonly ${name}CreateUsecase: I${dashToPascal(name)}CreateAdapter,
31
- private readonly ${name}UpdateUsecase: I${dashToPascal(name)}UpdateAdapter,
32
- private readonly ${name}DeleteUsecase: I${dashToPascal(name)}DeleteAdapter,
33
- private readonly ${name}ListUsecase: I${dashToPascal(name)}ListAdapter,
34
- private readonly ${name}GetByIdUsecase: I${dashToPascal(name)}GetByIdAdapter
30
+ private readonly ${snakeToCamel(name)}CreateUsecase: I${dashToPascal(name)}CreateAdapter,
31
+ private readonly ${snakeToCamel(name)}UpdateUsecase: I${dashToPascal(name)}UpdateAdapter,
32
+ private readonly ${snakeToCamel(name)}DeleteUsecase: I${dashToPascal(name)}DeleteAdapter,
33
+ private readonly ${snakeToCamel(name)}ListUsecase: I${dashToPascal(name)}ListAdapter,
34
+ private readonly ${snakeToCamel(name)}GetByIdUsecase: I${dashToPascal(name)}GetByIdAdapter
35
35
  ) {}
36
36
 
37
37
  @Post()
38
38
  @ApiResponse(SwaggerResponse.create[200])
39
39
  @ApiBody(SwaggerRequest.createBody)
40
40
  async create(@Req() { body }: ApiRequest): Promise<${dashToPascal(name)}CreateOutput> {
41
- return this.${name}CreateUsecase.execute(body as ${dashToPascal(name)}CreateInput);
41
+ return this.${snakeToCamel(name)}CreateUsecase.execute(body as ${dashToPascal(name)}CreateInput);
42
42
  }
43
43
 
44
44
  @Put(':id')
@@ -47,7 +47,7 @@ export class ${dashToPascal(name)}Controller {
47
47
  @ApiBody(SwaggerRequest.updateBody)
48
48
  @ApiParam({ name: 'id', required: true })
49
49
  async update(@Req() { body, params }: ApiRequest): Promise<${dashToPascal(name)}UpdateOutput> {
50
- return this.${name}UpdateUsecase.execute({ ...body, id: params.id } as ${dashToPascal(name)}UpdateInput);
50
+ return this.${snakeToCamel(name)}UpdateUsecase.execute({ ...body, id: params.id } as ${dashToPascal(name)}UpdateInput);
51
51
  }
52
52
 
53
53
  @Get()
@@ -64,7 +64,7 @@ export class ${dashToPascal(name)}Controller {
64
64
  page: Number(query.page)
65
65
  };
66
66
 
67
- return await this.${name}ListUsecase.execute(input);
67
+ return await this.${snakeToCamel(name)}ListUsecase.execute(input);
68
68
  }
69
69
 
70
70
  @Get('/:id')
@@ -72,7 +72,7 @@ export class ${dashToPascal(name)}Controller {
72
72
  @ApiResponse(SwaggerResponse.getById[200])
73
73
  @ApiResponse(SwaggerResponse.getById[404])
74
74
  async getById(@Req() { params }: ApiRequest): Promise<${dashToPascal(name)}GetByIdOutput> {
75
- return await this.${name}GetByIdUsecase.execute(params as ${dashToPascal(name)}GetByIdInput);
75
+ return await this.${snakeToCamel(name)}GetByIdUsecase.execute(params as ${dashToPascal(name)}GetByIdInput);
76
76
  }
77
77
 
78
78
  @Delete('/:id')
@@ -80,7 +80,7 @@ export class ${dashToPascal(name)}Controller {
80
80
  @ApiResponse(SwaggerResponse.delete[200])
81
81
  @ApiResponse(SwaggerResponse.delete[404])
82
82
  async delete(@Req() { params }: ApiRequest): Promise<${dashToPascal(name)}DeleteOutput> {
83
- return await this.${name}DeleteUsecase.execute(params as ${dashToPascal(name)}DeleteInput);
83
+ return await this.${snakeToCamel(name)}DeleteUsecase.execute(params as ${dashToPascal(name)}DeleteInput);
84
84
  }
85
85
  }
86
86
  `
@@ -1,5 +1,5 @@
1
1
  const pluralize = require('pluralize')
2
- const { dashToPascal } = require('../../../textUtils')
2
+ const { dashToPascal, snakeToCamel } = require('../../../textUtils')
3
3
 
4
4
 
5
5
  const getModuleSwagger = (name) => `import { ${dashToPascal(name)}Entity } from '@/core/${name}/entity/${name}';
@@ -18,60 +18,60 @@ const input = new ${dashToPascal(name)}Entity({
18
18
 
19
19
  const output = new ${dashToPascal(name)}Entity({ ...input, updatedAt: new Date(), createdAt: new Date(), deletedAt: null });
20
20
 
21
- const BASE_URL = 'api/v1/${pluralize(name)}';
21
+ const BASE_URL = 'api/v1/${pluralize(snakeToCamel(name))}';
22
22
 
23
23
  export const SwaggerResponse = {
24
24
  create: {
25
25
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}CreateOutput>({
26
26
  status: 200,
27
27
  json: { created: true, id: 'uuid' },
28
- description: '${name} created.'
28
+ description: '${snakeToCamel(name)} created.'
29
29
  })
30
30
  },
31
31
  update: {
32
32
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}UpdateOutput>({
33
33
  status: 200,
34
34
  json: output,
35
- description: '${name} updated.'
35
+ description: '${snakeToCamel(name)} updated.'
36
36
  }),
37
37
  404: Swagger.defaultResponseError({
38
38
  status: 404,
39
39
  route: BASE_URL.concat('/:id'),
40
- message: '${name}NotFound',
41
- description: '${name} not found.'
40
+ message: '${snakeToCamel(name)}NotFound',
41
+ description: '${snakeToCamel(name)} not found.'
42
42
  })
43
43
  },
44
44
  getById: {
45
45
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}GetByIdOutput>({
46
46
  status: 200,
47
47
  json: output,
48
- description: '${name} found.'
48
+ description: '${snakeToCamel(name)} found.'
49
49
  }),
50
50
  404: Swagger.defaultResponseError({
51
51
  status: 404,
52
52
  route: BASE_URL.concat('/:id'),
53
- message: '${name}NotFound',
54
- description: '${name} not found.'
53
+ message: '${snakeToCamel(name)}NotFound',
54
+ description: '${snakeToCamel(name)} not found.'
55
55
  })
56
56
  },
57
57
  delete: {
58
58
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}DeleteOutput>({
59
59
  status: 200,
60
60
  json: output,
61
- description: '${name} deleted.'
61
+ description: '${snakeToCamel(name)} deleted.'
62
62
  }),
63
63
  404: Swagger.defaultResponseError({
64
64
  status: 404,
65
65
  route: BASE_URL.concat('/:id'),
66
- message: '${name}NotFound',
67
- description: '${name} not found.'
66
+ message: '${snakeToCamel(name)}NotFound',
67
+ description: '${snakeToCamel(name)} not found.'
68
68
  })
69
69
  },
70
70
  list: {
71
71
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}ListOutput>({
72
72
  status: 200,
73
73
  json: { docs: [output], page: 1, limit: 1, total: 1 },
74
- description: 'list ${pluralize(name)}.'
74
+ description: 'list ${pluralize(snakeToCamel(name))}.'
75
75
  })
76
76
  }
77
77
  };
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseCreateTest = (name) => `import { Test } from '@nestjs/testing';
4
4
  import { ZodIssue } from 'zod';
@@ -30,8 +30,8 @@ describe(${dashToPascal(name)}CreateUsecase.name, () => {
30
30
  },
31
31
  {
32
32
  provide: I${dashToPascal(name)}CreateAdapter,
33
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository, logger: ILoggerAdapter) => {
34
- return new ${dashToPascal(name)}CreateUsecase(${name}Repository, logger);
33
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository, logger: ILoggerAdapter) => {
34
+ return new ${dashToPascal(name)}CreateUsecase(${snakeToCamel(name)}Repository, logger);
35
35
  },
36
36
  inject: [I${dashToPascal(name)}Repository, ILoggerAdapter]
37
37
  }
@@ -55,7 +55,7 @@ describe(${dashToPascal(name)}CreateUsecase.name, () => {
55
55
  name: 'dummy'
56
56
  };
57
57
 
58
- test('when ${name} created successfully, should expect a ${name}', async () => {
58
+ test('when ${snakeToCamel(name)} created successfully, should expect a ${snakeToCamel(name)}', async () => {
59
59
  const output: ${dashToPascal(name)}CreateOutput = { created: true, id: TestUtils.getMockUUID() };
60
60
  repository.create = jest.fn().mockResolvedValue(output);
61
61
 
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseDeleteTest = (name) => `import { Test } from '@nestjs/testing';
4
4
  import { ZodIssue } from 'zod';
@@ -24,8 +24,8 @@ describe(${dashToPascal(name)}DeleteUsecase.name, () => {
24
24
  },
25
25
  {
26
26
  provide: I${dashToPascal(name)}DeleteAdapter,
27
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository) => {
28
- return new ${dashToPascal(name)}DeleteUsecase(${name}Repository);
27
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) => {
28
+ return new ${dashToPascal(name)}DeleteUsecase(${snakeToCamel(name)}Repository);
29
29
  },
30
30
  inject: [I${dashToPascal(name)}Repository]
31
31
  }
@@ -49,23 +49,23 @@ describe(${dashToPascal(name)}DeleteUsecase.name, () => {
49
49
  id: TestUtils.getMockUUID()
50
50
  };
51
51
 
52
- test('when ${name} not found, should expect an error', async () => {
52
+ test('when ${snakeToCamel(name)} not found, should expect an error', async () => {
53
53
  repository.findById = jest.fn().mockResolvedValue(null);
54
54
 
55
55
  await expect(usecase.execute(input)).rejects.toThrow(ApiNotFoundException);
56
56
  });
57
57
 
58
- const ${name} = new ${dashToPascal(name)}Entity({
58
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity({
59
59
  id: TestUtils.getMockUUID(),
60
60
  name: 'dummy'
61
61
  });
62
62
 
63
- test('when ${name} deleted successfully, should expect a ${name}', async () => {
64
- repository.findById = jest.fn().mockResolvedValue(${name});
63
+ test('when ${snakeToCamel(name)} deleted successfully, should expect a ${snakeToCamel(name)}', async () => {
64
+ repository.findById = jest.fn().mockResolvedValue(${snakeToCamel(name)});
65
65
  repository.updateOne = jest.fn();
66
66
 
67
67
  await expect(usecase.execute(input)).resolves.toEqual({
68
- ...${name},
68
+ ...${snakeToCamel(name)},
69
69
  deletedAt: expect.any(Date)
70
70
  });
71
71
  });
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseGetByIdTest = (name) => `import { Test } from '@nestjs/testing';
4
4
  import { ZodIssue } from 'zod';
@@ -24,8 +24,8 @@ describe(${dashToPascal(name)}GetByIdUsecase.name, () => {
24
24
  },
25
25
  {
26
26
  provide: I${dashToPascal(name)}GetByIdAdapter,
27
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository) => {
28
- return new ${dashToPascal(name)}GetByIdUsecase(${name}Repository);
27
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) => {
28
+ return new ${dashToPascal(name)}GetByIdUsecase(${snakeToCamel(name)}Repository);
29
29
  },
30
30
  inject: [I${dashToPascal(name)}Repository]
31
31
  }
@@ -49,21 +49,21 @@ describe(${dashToPascal(name)}GetByIdUsecase.name, () => {
49
49
  id: TestUtils.getMockUUID()
50
50
  };
51
51
 
52
- test('when ${name} not found, should expect an error', async () => {
52
+ test('when ${snakeToCamel(name)} not found, should expect an error', async () => {
53
53
  repository.findById = jest.fn().mockResolvedValue(null);
54
54
 
55
55
  await expect(usecase.execute(input)).rejects.toThrow(ApiNotFoundException);
56
56
  });
57
57
 
58
- const ${name} = new ${dashToPascal(name)}Entity({
58
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity({
59
59
  id: TestUtils.getMockUUID(),
60
60
  name: 'dummy'
61
61
  });
62
62
 
63
- test('when ${name} found, should expect a ${name}', async () => {
64
- repository.findById = jest.fn().mockResolvedValue(${name});
63
+ test('when ${snakeToCamel(name)} found, should expect a ${snakeToCamel(name)}', async () => {
64
+ repository.findById = jest.fn().mockResolvedValue(${snakeToCamel(name)});
65
65
 
66
- await expect(usecase.execute(input)).resolves.toEqual(${name});
66
+ await expect(usecase.execute(input)).resolves.toEqual(${snakeToCamel(name)});
67
67
  });
68
68
  });
69
69
  `
@@ -1,6 +1,6 @@
1
1
 
2
2
  const pluralize = require('pluralize')
3
- const { dashToPascal } = require('../../../../../textUtils')
3
+ const { dashToPascal, snakeToCamel } = require('../../../../../textUtils')
4
4
 
5
5
  const getCoreUsecaseListTest = (name) => `import { Test } from '@nestjs/testing';
6
6
  import { ZodIssue } from 'zod';
@@ -25,8 +25,8 @@ describe(${dashToPascal(name)}ListUsecase.name, () => {
25
25
  },
26
26
  {
27
27
  provide: I${dashToPascal(name)}ListAdapter,
28
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository) => {
29
- return new ${dashToPascal(name)}ListUsecase(${name}Repository);
28
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) => {
29
+ return new ${dashToPascal(name)}ListUsecase(${snakeToCamel(name)}Repository);
30
30
  },
31
31
  inject: [I${dashToPascal(name)}Repository]
32
32
  }
@@ -51,28 +51,28 @@ describe(${dashToPascal(name)}ListUsecase.name, () => {
51
51
 
52
52
  const input: ${dashToPascal(name)}ListInput = { limit: 1, page: 1, search: {}, sort: { createdAt: -1 } };
53
53
 
54
- const ${name} = new ${dashToPascal(name)}Entity({
54
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity({
55
55
  id: TestUtils.getMockUUID(),
56
56
  name: 'dummy',
57
57
  createdAt: new Date(),
58
58
  updatedAt: new Date()
59
59
  });
60
60
 
61
- const ${pluralize(name)} = [${name}];
61
+ const ${pluralize(snakeToCamel(name))} = [${snakeToCamel(name)}];
62
62
 
63
- test('when ${name} are found, should expect an ${name} list', async () => {
63
+ test('when ${snakeToCamel(name)} are found, should expect an ${snakeToCamel(name)} list', async () => {
64
64
  const output: ${dashToPascal(name)}ListOutput = { docs: ${pluralize(name)}, page: 1, limit: 1, total: 1 };
65
65
  repository.paginate = jest.fn().mockResolvedValue(output);
66
66
 
67
67
  await expect(usecase.execute(input)).resolves.toEqual({
68
- docs: ${pluralize(name)},
68
+ docs: ${pluralize(snakeToCamel(name))},
69
69
  page: 1,
70
70
  limit: 1,
71
71
  total: 1
72
72
  });
73
73
  });
74
74
 
75
- test('when ${name} not found, should expect an empty list', async () => {
75
+ test('when ${snakeToCamel(name)} not found, should expect an empty list', async () => {
76
76
  const output: ${dashToPascal(name)}ListOutput = { docs: [], page: 1, limit: 1, total: 1 };
77
77
  repository.paginate = jest.fn().mockResolvedValue(output);
78
78
 
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseUpdateTest = (name) => `import { Test } from '@nestjs/testing';
4
4
  import { ZodIssue } from 'zod';
@@ -31,8 +31,8 @@ describe(${dashToPascal(name)}UpdateUsecase.name, () => {
31
31
  },
32
32
  {
33
33
  provide: I${dashToPascal(name)}UpdateAdapter,
34
- useFactory: (${name}Repository: I${dashToPascal(name)}Repository, logger: ILoggerAdapter) => {
35
- return new ${dashToPascal(name)}UpdateUsecase(${name}Repository, logger);
34
+ useFactory: (${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository, logger: ILoggerAdapter) => {
35
+ return new ${dashToPascal(name)}UpdateUsecase(${snakeToCamel(name)}Repository, logger);
36
36
  },
37
37
  inject: [I${dashToPascal(name)}Repository, ILoggerAdapter]
38
38
  }
@@ -56,22 +56,22 @@ describe(${dashToPascal(name)}UpdateUsecase.name, () => {
56
56
  id: TestUtils.getMockUUID()
57
57
  };
58
58
 
59
- test('when ${name} not found, should expect an error', async () => {
59
+ test('when ${snakeToCamel(name)} not found, should expect an error', async () => {
60
60
  repository.findById = jest.fn().mockResolvedValue(null);
61
61
 
62
62
  await expect(usecase.execute(input)).rejects.toThrow(ApiNotFoundException);
63
63
  });
64
64
 
65
- const ${name} = new ${dashToPascal(name)}Entity({
65
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity({
66
66
  id: TestUtils.getMockUUID(),
67
67
  name: 'dummy'
68
68
  });
69
69
 
70
- test('when ${name} updated successfully, should expect an ${name}', async () => {
71
- repository.findById = jest.fn().mockResolvedValue(${name});
70
+ test('when ${snakeToCamel(name)} updated successfully, should expect an ${snakeToCamel(name)}', async () => {
71
+ repository.findById = jest.fn().mockResolvedValue(${snakeToCamel(name)});
72
72
  repository.updateOne = jest.fn().mockResolvedValue(null);
73
73
 
74
- await expect(usecase.execute(input)).resolves.toEqual(${name});
74
+ await expect(usecase.execute(input)).resolves.toEqual(${snakeToCamel(name)});
75
75
  });
76
76
  });
77
77
  `
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseCreate = (name) => `import { z } from 'zod';
4
4
 
@@ -20,7 +20,7 @@ export type ${dashToPascal(name)}CreateOutput = CreatedModel;
20
20
 
21
21
  export class ${dashToPascal(name)}CreateUsecase implements IUsecase {
22
22
  constructor(
23
- private readonly ${name}Repository: I${dashToPascal(name)}Repository,
23
+ private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository,
24
24
  private readonly loggerService: ILoggerAdapter
25
25
  ) {}
26
26
 
@@ -28,11 +28,11 @@ export class ${dashToPascal(name)}CreateUsecase implements IUsecase {
28
28
  async execute(input: ${dashToPascal(name)}CreateInput): Promise<${dashToPascal(name)}CreateOutput> {
29
29
  const entity = new ${dashToPascal(name)}Entity({ id: UUIDUtils.create(), ...input });
30
30
 
31
- const ${name} = await this.${name}Repository.create(entity);
31
+ const ${snakeToCamel(name)} = await this.${snakeToCamel(name)}Repository.create(entity);
32
32
 
33
- this.loggerService.info({ message: '${name} created.', obj: { ${name} } });
33
+ this.loggerService.info({ message: '${snakeToCamel(name)} created.', obj: { ${snakeToCamel(name)} } });
34
34
 
35
- return ${name};
35
+ return ${snakeToCamel(name)};
36
36
  }
37
37
  }
38
38
  `
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseDelete = (name) => `import { z } from 'zod';
4
4
 
@@ -17,23 +17,23 @@ export type ${dashToPascal(name)}DeleteInput = z.infer<typeof ${dashToPascal(nam
17
17
  export type ${dashToPascal(name)}DeleteOutput = ${dashToPascal(name)}Entity;
18
18
 
19
19
  export class ${dashToPascal(name)}DeleteUsecase implements IUsecase {
20
- constructor(private readonly ${name}Repository: I${dashToPascal(name)}Repository) {}
20
+ constructor(private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) {}
21
21
 
22
22
  @ValidateSchema(${dashToPascal(name)}DeleteSchema)
23
23
  async execute({ id }: ${dashToPascal(name)}DeleteInput): Promise<${dashToPascal(name)}DeleteOutput> {
24
- const model = await this.${name}Repository.findById(id);
24
+ const model = await this.${snakeToCamel(name)}Repository.findById(id);
25
25
 
26
26
  if (!model) {
27
- throw new ApiNotFoundException('${name}NotFound');
27
+ throw new ApiNotFoundException('${snakeToCamel(name)}NotFound');
28
28
  }
29
29
 
30
- const ${name} = new ${dashToPascal(name)}Entity(model);
30
+ const ${snakeToCamel(name)} = new ${dashToPascal(name)}Entity(model);
31
31
 
32
- ${name}.deactivated();
32
+ ${snakeToCamel(name)}.deactivated();
33
33
 
34
- await this.${name}Repository.updateOne({ id: ${name}.id }, ${name});
34
+ await this.${snakeToCamel(name)}Repository.updateOne({ id: ${snakeToCamel(name)}.id }, ${snakeToCamel(name)});
35
35
 
36
- return ${name};
36
+ return ${snakeToCamel(name)};
37
37
  }
38
38
  }
39
39
  `
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseGetById = (name) => `import { z } from 'zod';
4
4
 
@@ -18,17 +18,17 @@ export type ${dashToPascal(name)}GetByIdInput = z.infer<typeof ${dashToPascal(na
18
18
  export type ${dashToPascal(name)}GetByIdOutput = ${dashToPascal(name)}Entity;
19
19
 
20
20
  export class ${dashToPascal(name)}GetByIdUsecase implements IUsecase {
21
- constructor(private readonly ${name}Repository: I${dashToPascal(name)}Repository) {}
21
+ constructor(private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) {}
22
22
 
23
23
  @ValidateSchema(${dashToPascal(name)}GetByIdSchema)
24
24
  async execute({ id }: ${dashToPascal(name)}GetByIdInput): Promise<${dashToPascal(name)}GetByIdOutput> {
25
- const ${name} = await this.${name}Repository.findById(id);
25
+ const ${snakeToCamel(name)} = await this.${snakeToCamel(name)}Repository.findById(id);
26
26
 
27
- if (!${name}) {
28
- throw new ApiNotFoundException('${name}NotFound');
27
+ if (!${snakeToCamel(name)}) {
28
+ throw new ApiNotFoundException('${snakeToCamel(name)}NotFound');
29
29
  }
30
30
 
31
- return new ${dashToPascal(name)}Entity(${name});
31
+ return new ${dashToPascal(name)}Entity(${snakeToCamel(name)});
32
32
  }
33
33
  }
34
34
  `
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseList = (name) => `import { z } from 'zod';
4
4
 
@@ -17,11 +17,11 @@ export type ${dashToPascal(name)}ListInput = PaginationInput<${dashToPascal(name
17
17
  export type ${dashToPascal(name)}ListOutput = PaginationOutput<${dashToPascal(name)}Entity>;
18
18
 
19
19
  export class ${dashToPascal(name)}ListUsecase implements IUsecase {
20
- constructor(private readonly ${name}Repository: I${dashToPascal(name)}Repository) {}
20
+ constructor(private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository) {}
21
21
 
22
22
  @ValidateSchema(${dashToPascal(name)}ListSchema)
23
23
  async execute(input: ${dashToPascal(name)}ListInput): Promise<${dashToPascal(name)}ListOutput> {
24
- return await this.${name}Repository.paginate(input);
24
+ return await this.${snakeToCamel(name)}Repository.paginate(input);
25
25
  }
26
26
  }
27
27
  `
@@ -1,4 +1,4 @@
1
- const { dashToPascal } = require("../../../../textUtils")
1
+ const { dashToPascal, snakeToCamel } = require("../../../../textUtils")
2
2
 
3
3
  const getCoreUsecaseUpdate = (name) => `import { z } from 'zod';
4
4
 
@@ -19,27 +19,27 @@ export type ${dashToPascal(name)}UpdateOutput = ${dashToPascal(name)}Entity;
19
19
 
20
20
  export class ${dashToPascal(name)}UpdateUsecase implements IUsecase {
21
21
  constructor(
22
- private readonly ${name}Repository: I${dashToPascal(name)}Repository,
22
+ private readonly ${snakeToCamel(name)}Repository: I${dashToPascal(name)}Repository,
23
23
  private readonly loggerService: ILoggerAdapter
24
24
  ) {}
25
25
 
26
26
  @ValidateSchema(${dashToPascal(name)}UpdateSchema)
27
27
  async execute(input: ${dashToPascal(name)}UpdateInput): Promise<${dashToPascal(name)}UpdateOutput> {
28
- const ${name} = await this.${name}Repository.findById(input.id);
28
+ const ${snakeToCamel(name)} = await this.${snakeToCamel(name)}Repository.findById(input.id);
29
29
 
30
- if (!${name}) {
31
- throw new ApiNotFoundException('${name}NotFound');
30
+ if (!${snakeToCamel(name)}) {
31
+ throw new ApiNotFoundException('${snakeToCamel(name)}NotFound');
32
32
  }
33
33
 
34
- const ${name}Found = new ${dashToPascal(name)}Entity(${name});
34
+ const ${snakeToCamel(name)}Found = new ${dashToPascal(name)}Entity(${name});
35
35
 
36
- const entity = new ${dashToPascal(name)}Entity({ ...${name}Found, ...input });
36
+ const entity = new ${dashToPascal(name)}Entity({ ...${snakeToCamel(name)}Found, ...input });
37
37
 
38
- await this.${name}Repository.updateOne({ id: entity.id }, entity);
38
+ await this.${snakeToCamel(name)}Repository.updateOne({ id: entity.id }, entity);
39
39
 
40
- this.loggerService.info({ message: '${name} updated.', obj: { ${name}: input } });
40
+ this.loggerService.info({ message: '${snakeToCamel(name)} updated.', obj: { ${snakeToCamel(name)}: input } });
41
41
 
42
- const updated = await this.${name}Repository.findById(entity.id);
42
+ const updated = await this.${snakeToCamel(name)}Repository.findById(entity.id);
43
43
 
44
44
  return new ${dashToPascal(name)}Entity(updated as ${dashToPascal(name)}Entity);
45
45
  }
@@ -1,5 +1,5 @@
1
1
  const pluralize = require('pluralize')
2
- const { dashToPascal } = require('../../../textUtils')
2
+ const { dashToPascal, snakeToCamel } = require('../../../textUtils')
3
3
 
4
4
  const getModuleController = (name) => `import { Controller, Delete, Get, Post, Put, Req } from '@nestjs/common';
5
5
  import { ApiBearerAuth, ApiBody, ApiParam, ApiQuery, ApiResponse, ApiTags } from '@nestjs/swagger';
@@ -27,18 +27,18 @@ import { SwaggerRequest, SwaggerResponse } from './swagger';
27
27
  @ApiBearerAuth()
28
28
  export class ${dashToPascal(name)}Controller {
29
29
  constructor(
30
- private readonly ${name}Create: I${dashToPascal(name)}CreateAdapter,
31
- private readonly ${name}Update: I${dashToPascal(name)}UpdateAdapter,
32
- private readonly ${name}GetById: I${dashToPascal(name)}GetByIdAdapter,
33
- private readonly ${name}List: I${dashToPascal(name)}ListAdapter,
34
- private readonly ${name}Delete: I${dashToPascal(name)}DeleteAdapter
30
+ private readonly ${snakeToCamel(name)}Create: I${dashToPascal(name)}CreateAdapter,
31
+ private readonly ${snakeToCamel(name)}Update: I${dashToPascal(name)}UpdateAdapter,
32
+ private readonly ${snakeToCamel(name)}GetById: I${dashToPascal(name)}GetByIdAdapter,
33
+ private readonly ${snakeToCamel(name)}List: I${dashToPascal(name)}ListAdapter,
34
+ private readonly ${snakeToCamel(name)}Delete: I${dashToPascal(name)}DeleteAdapter
35
35
  ) {}
36
36
 
37
37
  @Post()
38
38
  @ApiResponse(SwaggerResponse.create[200])
39
39
  @ApiBody(SwaggerRequest.createBody)
40
40
  async create(@Req() { body }: ApiRequest): Promise<${dashToPascal(name)}CreateOutput> {
41
- return await this.${name}Create.execute(body as ${dashToPascal(name)}CreateInput);
41
+ return await this.${snakeToCamel(name)}Create.execute(body as ${dashToPascal(name)}CreateInput);
42
42
  }
43
43
 
44
44
  @Put(':id')
@@ -47,7 +47,7 @@ export class ${dashToPascal(name)}Controller {
47
47
  @ApiBody(SwaggerRequest.updateBody)
48
48
  @ApiParam({ name: 'id', required: true })
49
49
  async update(@Req() { body, params }: ApiRequest): Promise<${dashToPascal(name)}UpdateOutput> {
50
- return await this.${name}Update.execute({ ...body, id: params.id } as ${dashToPascal(name)}UpdateInput);
50
+ return await this.${snakeToCamel(name)}Update.execute({ ...body, id: params.id } as ${dashToPascal(name)}UpdateInput);
51
51
  }
52
52
 
53
53
  @Get('/:id')
@@ -55,7 +55,7 @@ export class ${dashToPascal(name)}Controller {
55
55
  @ApiResponse(SwaggerResponse.getById[200])
56
56
  @ApiResponse(SwaggerResponse.getById[404])
57
57
  async getById(@Req() { params }: ApiRequest): Promise<${dashToPascal(name)}GetByIdOutput> {
58
- return await this.${name}GetById.execute(params as ${dashToPascal(name)}GetByIdInput);
58
+ return await this.${snakeToCamel(name)}GetById.execute(params as ${dashToPascal(name)}GetByIdInput);
59
59
  }
60
60
 
61
61
  @Get()
@@ -72,7 +72,7 @@ export class ${dashToPascal(name)}Controller {
72
72
  page: Number(query.page)
73
73
  };
74
74
 
75
- return await this.${name}List.execute(input);
75
+ return await this.${snakeToCamel(name)}List.execute(input);
76
76
  }
77
77
 
78
78
  @Delete('/:id')
@@ -80,7 +80,7 @@ export class ${dashToPascal(name)}Controller {
80
80
  @ApiResponse(SwaggerResponse.delete[200])
81
81
  @ApiResponse(SwaggerResponse.delete[404])
82
82
  async delete(@Req() { params }: ApiRequest): Promise<${dashToPascal(name)}DeleteOutput> {
83
- return await this.${name}Delete.execute(params as ${dashToPascal(name)}DeleteInput);
83
+ return await this.${snakeToCamel(name)}Delete.execute(params as ${dashToPascal(name)}DeleteInput);
84
84
  }
85
85
  }
86
86
  `
@@ -1,5 +1,5 @@
1
1
  const pluralize = require('pluralize')
2
- const { dashToPascal } = require('../../../textUtils')
2
+ const { dashToPascal, snakeToCamel } = require('../../../textUtils')
3
3
 
4
4
  const getModuleSwagger = (name) => `import { ${dashToPascal(name)}Entity } from '@/core/${name}/entity/${name}';
5
5
  import { ${dashToPascal(name)}CreateOutput } from '@/core/${name}/use-cases/${name}-create';
@@ -24,53 +24,53 @@ export const SwaggerResponse = {
24
24
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}CreateOutput>({
25
25
  status: 200,
26
26
  json: { created: true, id: 'uuid' },
27
- description: '${name} created.'
27
+ description: '${snakeToCamel(name)} created.'
28
28
  })
29
29
  },
30
30
  update: {
31
31
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}UpdateOutput>({
32
32
  status: 200,
33
33
  json: output,
34
- description: '${name} updated.'
34
+ description: '${snakeToCamel(name)} updated.'
35
35
  }),
36
36
  404: Swagger.defaultResponseError({
37
37
  status: 404,
38
38
  route: BASE_URL.concat('/:id'),
39
- message: '${name}NotFound',
40
- description: '${name} not found.'
39
+ message: '${snakeToCamel(name)}NotFound',
40
+ description: '${snakeToCamel(name)} not found.'
41
41
  })
42
42
  },
43
43
  getById: {
44
44
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}GetByIdOutput>({
45
45
  status: 200,
46
46
  json: output,
47
- description: '${name} found.'
47
+ description: '${snakeToCamel(name)} found.'
48
48
  }),
49
49
  404: Swagger.defaultResponseError({
50
50
  status: 404,
51
51
  route: BASE_URL.concat('/:id'),
52
- message: '${name}NotFound',
53
- description: '${name} not found.'
52
+ message: '${snakeToCamel(name)}NotFound',
53
+ description: '${snakeToCamel(name)} not found.'
54
54
  })
55
55
  },
56
56
  delete: {
57
57
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}DeleteOutput>({
58
58
  status: 200,
59
59
  json: output,
60
- description: '${name} deleted.'
60
+ description: '${snakeToCamel(name)} deleted.'
61
61
  }),
62
62
  404: Swagger.defaultResponseError({
63
63
  status: 404,
64
64
  route: BASE_URL.concat('/:id'),
65
- message: '${name}NotFound',
66
- description: '${name} not found.'
65
+ message: '${snakeToCamel(name)}NotFound',
66
+ description: '${snakeToCamel(name)} not found.'
67
67
  })
68
68
  },
69
69
  list: {
70
70
  200: Swagger.defaultResponseJSON<${dashToPascal(name)}ListOutput>({
71
71
  status: 200,
72
72
  json: { docs: [output], page: 1, limit: 1, total: 1 },
73
- description: 'list ${pluralize(name)}.'
73
+ description: 'list ${pluralize(snakeToCamel(name))}.'
74
74
  })
75
75
  }
76
76
  };
package/src/textUtils.js CHANGED
@@ -6,4 +6,12 @@ export const dashToPascal = (string) => {
6
6
  substr.slice(1))
7
7
  .join(""))
8
8
  .join("/");
9
- };
9
+ };
10
+
11
+ export const snakeToCamel = str =>
12
+ str.toLowerCase().replace(/([-_][a-z])/g, group =>
13
+ group
14
+ .toUpperCase()
15
+ .replace('-', '')
16
+ .replace('_', '')
17
+ );