@0kmpo/openapi-clean-arch-generator 1.3.10

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 (52) hide show
  1. package/.gitea/workflows/lint.yaml +41 -0
  2. package/.gitea/workflows/publish.yml +105 -0
  3. package/.openapi-generator-ignore +33 -0
  4. package/.prettierrc +7 -0
  5. package/LICENSE +21 -0
  6. package/README.md +333 -0
  7. package/dist/main.js +180 -0
  8. package/eslint.config.js +33 -0
  9. package/example-swagger.yaml +150 -0
  10. package/generation-config.json +24 -0
  11. package/main.ts +233 -0
  12. package/openapitools.json +23 -0
  13. package/package.json +70 -0
  14. package/src/generators/clean-arch.generator.ts +537 -0
  15. package/src/generators/dto.generator.ts +126 -0
  16. package/src/generators/lint.generator.ts +124 -0
  17. package/src/generators/report.generator.ts +80 -0
  18. package/src/swagger/analyzer.ts +32 -0
  19. package/src/types/cli.types.ts +36 -0
  20. package/src/types/generation.types.ts +50 -0
  21. package/src/types/index.ts +8 -0
  22. package/src/types/openapi.types.ts +126 -0
  23. package/src/types/swagger.types.ts +9 -0
  24. package/src/utils/config.ts +118 -0
  25. package/src/utils/environment-finder.ts +53 -0
  26. package/src/utils/filesystem.ts +31 -0
  27. package/src/utils/logger.ts +60 -0
  28. package/src/utils/mock-value-resolver.ts +70 -0
  29. package/src/utils/name-formatter.ts +12 -0
  30. package/src/utils/openapi-generator.ts +24 -0
  31. package/src/utils/prompt.ts +183 -0
  32. package/src/utils/type-mapper.ts +14 -0
  33. package/templates/api.repository.contract.mustache +34 -0
  34. package/templates/api.repository.impl.mock.mustache +21 -0
  35. package/templates/api.repository.impl.mustache +58 -0
  36. package/templates/api.repository.impl.spec.mustache +97 -0
  37. package/templates/api.use-cases.contract.mustache +34 -0
  38. package/templates/api.use-cases.impl.mustache +32 -0
  39. package/templates/api.use-cases.impl.spec.mustache +94 -0
  40. package/templates/api.use-cases.mock.mustache +21 -0
  41. package/templates/dto.mock.mustache +16 -0
  42. package/templates/mapper.mustache +28 -0
  43. package/templates/mapper.spec.mustache +39 -0
  44. package/templates/model-entity.mustache +24 -0
  45. package/templates/model-entity.spec.mustache +34 -0
  46. package/templates/model.mock.mustache +14 -0
  47. package/templates/model.mustache +20 -0
  48. package/templates/repository.provider.mock.mustache +20 -0
  49. package/templates/repository.provider.mustache +26 -0
  50. package/templates/use-cases.provider.mock.mustache +20 -0
  51. package/templates/use-cases.provider.mustache +26 -0
  52. package/tsconfig.json +17 -0
@@ -0,0 +1,97 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
5
+ import { TestBed } from '@angular/core/testing';
6
+
7
+ import { {{classname}}RepositoryImpl } from './{{classFilename}}.repository.impl';
8
+ {{#returnImports}}
9
+ import { mock{{classname}}Dto } from '@/dtos/{{classFilename}}.dto.mock';
10
+ import { mock{{classname}}Model } from '@/entities/models/{{classFilename}}.model.mock';
11
+ {{/returnImports}}
12
+
13
+ describe('{{classname}}RepositoryImpl', () => {
14
+ let repository: {{classname}}RepositoryImpl;
15
+ let httpMock: HttpTestingController;
16
+
17
+ beforeEach(() => {
18
+ TestBed.configureTestingModule({
19
+ imports: [HttpClientTestingModule],
20
+ providers: [{{classname}}RepositoryImpl]
21
+ });
22
+
23
+ repository = TestBed.inject({{classname}}RepositoryImpl);
24
+ httpMock = TestBed.inject(HttpTestingController);
25
+ });
26
+
27
+ afterEach(() => {
28
+ httpMock.verify();
29
+ });
30
+
31
+ it('should be created', () => {
32
+ expect(repository).toBeTruthy();
33
+ });
34
+
35
+ {{#operation}}
36
+ describe('{{nickname}}', () => {
37
+ it('should perform a {{uppercaseHttpMethod}} request', () => {
38
+ repository.{{nickname}}({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}}).subscribe();
39
+
40
+ const req = httpMock.expectOne((r) => r.method === '{{uppercaseHttpMethod}}');
41
+ expect(req.request.method).toBe('{{uppercaseHttpMethod}}');
42
+ {{#isListContainer}}
43
+ req.flush({ items: [mock{{returnBaseType}}Dto()] });
44
+ {{/isListContainer}}
45
+ {{^isListContainer}}
46
+ {{#returnType}}
47
+ req.flush(mock{{returnBaseType}}Dto());
48
+ {{/returnType}}
49
+ {{^returnType}}
50
+ req.flush(null);
51
+ {{/returnType}}
52
+ {{/isListContainer}}
53
+ });
54
+
55
+ {{#returnType}}
56
+ it('should map the response to the domain model', () => {
57
+ const dto = mock{{returnBaseType}}Dto();
58
+ const expectedModel = mock{{returnBaseType}}Model();
59
+
60
+ {{#isListContainer}}
61
+ repository.{{nickname}}({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}}).subscribe((result) => {
62
+ expect(result).toBeTruthy();
63
+ expect(result.length).toBeGreaterThan(0);
64
+ });
65
+
66
+ httpMock.expectOne((r) => r.method === '{{uppercaseHttpMethod}}').flush({ items: [dto] });
67
+ {{/isListContainer}}
68
+ {{^isListContainer}}
69
+ repository.{{nickname}}({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}}).subscribe((result) => {
70
+ expect(result).toEqual(expectedModel);
71
+ });
72
+
73
+ httpMock.expectOne((r) => r.method === '{{uppercaseHttpMethod}}').flush(dto);
74
+ {{/isListContainer}}
75
+ });
76
+
77
+ {{/returnType}}
78
+ it('should propagate HTTP errors', (done) => {
79
+ repository.{{nickname}}({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}}).subscribe({
80
+ error: (err) => {
81
+ expect(err.status).toBe(500);
82
+ done();
83
+ }
84
+ });
85
+
86
+ httpMock
87
+ .expectOne((r) => r.method === '{{uppercaseHttpMethod}}')
88
+ .flush('Internal Server Error', { status: 500, statusText: 'Internal Server Error' });
89
+ });
90
+ });
91
+
92
+ {{/operation}}
93
+ });
94
+
95
+ {{/operations}}
96
+ {{/apis}}
97
+ {{/apiInfo}}
@@ -0,0 +1,34 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { InjectionToken } from '@angular/core';
5
+ import { Observable } from 'rxjs';
6
+ {{#imports}}
7
+ import { {{classname}} } from '@/entities/models/{{classFilename}}.model';
8
+ {{/imports}}
9
+
10
+ /**
11
+ * {{classname}} Use Cases Contract
12
+ * Generated from OpenAPI tag: {{classname}}
13
+ */
14
+ export interface {{classname}}UseCases {
15
+ {{#operation}}
16
+ /**
17
+ * {{summary}}
18
+ {{#notes}}
19
+ * {{notes}}
20
+ {{/notes}}
21
+ {{#allParams}}
22
+ * @param {{paramName}} {{description}}
23
+ {{/allParams}}
24
+ */
25
+ {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}{{^-last}}, {{/-last}}{{/allParams}}): Observable<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}>;
26
+
27
+ {{/operation}}
28
+ }
29
+
30
+ export const {{constantName}}_USE_CASES = new InjectionToken<{{classname}}UseCases>('{{constantName}}_USE_CASES');
31
+
32
+ {{/operations}}
33
+ {{/apis}}
34
+ {{/apiInfo}}
@@ -0,0 +1,32 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { inject, Injectable } from '@angular/core';
5
+ import { Observable } from 'rxjs';
6
+
7
+ import { {{classname}}UseCases } from './{{classFilename}}.use-cases.contract';
8
+
9
+ import { {{constantName}}_REPOSITORY, {{classname}}Repository } from '@/domain/repositories/{{classFilename}}.repository.contract';
10
+ {{#imports}}
11
+ import { {{classname}} } from '@/entities/models/{{classFilename}}.model';
12
+ {{/imports}}
13
+
14
+ /**
15
+ * {{classname}} Use Cases Implementation
16
+ * Generated from OpenAPI tag: {{classname}}
17
+ */
18
+ @Injectable()
19
+ export class {{classname}}UseCasesImpl implements {{classname}}UseCases {
20
+ #{{classVarName}}Repository: {{classname}}Repository = inject({{constantName}}_REPOSITORY);
21
+
22
+ {{#operation}}
23
+ {{nickname}}({{#allParams}}{{paramName}}{{^required}}?{{/required}}: {{{dataType}}}{{^-last}}, {{/-last}}{{/allParams}}): Observable<{{#returnType}}{{{returnType}}}{{/returnType}}{{^returnType}}void{{/returnType}}> {
24
+ return this.#{{classVarName}}Repository.{{nickname}}({{#allParams}}{{paramName}}{{^-last}}, {{/-last}}{{/allParams}});
25
+ }
26
+
27
+ {{/operation}}
28
+ }
29
+
30
+ {{/operations}}
31
+ {{/apis}}
32
+ {{/apiInfo}}
@@ -0,0 +1,94 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { TestBed } from '@angular/core/testing';
5
+ import { of } from 'rxjs';
6
+
7
+ import { {{classname}}UseCasesImpl } from './{{classFilename}}.use-cases.impl';
8
+
9
+ import { {{constantName}}_REPOSITORY, {{classname}}Repository } from '@/domain/repositories/{{classFilename}}.repository.contract';
10
+ {{#returnImports}}
11
+ import { mock{{classname}}Model } from '@/entities/models/{{classFilename}}.model.mock';
12
+ {{/returnImports}}
13
+
14
+ describe('{{classname}}UseCasesImpl', () => {
15
+ let useCase: {{classname}}UseCasesImpl;
16
+ let mockRepository: jasmine.SpyObj<{{classname}}Repository>;
17
+
18
+ beforeEach(() => {
19
+ mockRepository = jasmine.createSpyObj('{{classname}}Repository', [{{#operation}}'{{nickname}}', {{/operation}}]);
20
+
21
+ TestBed.configureTestingModule({
22
+ providers: [
23
+ {{classname}}UseCasesImpl,
24
+ { provide: {{constantName}}_REPOSITORY, useValue: mockRepository }
25
+ ]
26
+ });
27
+
28
+ useCase = TestBed.inject({{classname}}UseCasesImpl);
29
+ });
30
+
31
+ it('should be created', () => {
32
+ expect(useCase).toBeTruthy();
33
+ });
34
+
35
+ {{#operation}}
36
+ describe('{{nickname}}', () => {
37
+ it('should delegate to the repository', () => {
38
+ {{#isListContainer}}
39
+ mockRepository.{{nickname}}.and.returnValue(of([mock{{returnBaseType}}Model()]));
40
+ {{/isListContainer}}
41
+ {{^isListContainer}}
42
+ {{#returnBaseType}}
43
+ mockRepository.{{nickname}}.and.returnValue(of(mock{{returnBaseType}}Model()));
44
+ {{/returnBaseType}}
45
+ {{^returnBaseType}}
46
+ mockRepository.{{nickname}}.and.returnValue(of(undefined));
47
+ {{/returnBaseType}}
48
+ {{/isListContainer}}
49
+
50
+ useCase.{{nickname}}({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}});
51
+
52
+ expect(mockRepository.{{nickname}}).toHaveBeenCalled();
53
+ });
54
+
55
+ it('should return the observable from the repository', (done) => {
56
+ {{#isListContainer}}
57
+ const expected = [mock{{returnBaseType}}Model()];
58
+ mockRepository.{{nickname}}.and.returnValue(of(expected));
59
+
60
+ useCase.{{nickname}}({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}}).subscribe((result) => {
61
+ expect(result).toEqual(expected);
62
+ done();
63
+ });
64
+ {{/isListContainer}}
65
+ {{^isListContainer}}
66
+ {{#returnBaseType}}
67
+ const expected = mock{{returnBaseType}}Model();
68
+ mockRepository.{{nickname}}.and.returnValue(of(expected));
69
+
70
+ useCase.{{nickname}}({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}}).subscribe((result) => {
71
+ expect(result).toEqual(expected);
72
+ done();
73
+ });
74
+ {{/returnBaseType}}
75
+ {{^returnBaseType}}
76
+ mockRepository.{{nickname}}.and.returnValue(of(undefined));
77
+
78
+ useCase.{{nickname}}({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}}).subscribe({
79
+ complete: () => {
80
+ expect(mockRepository.{{nickname}}).toHaveBeenCalledOnceWith({{#allParams}}{{{testValue}}}{{^-last}}, {{/-last}}{{/allParams}});
81
+ done();
82
+ }
83
+ });
84
+ {{/returnBaseType}}
85
+ {{/isListContainer}}
86
+ });
87
+ });
88
+
89
+ {{/operation}}
90
+ });
91
+
92
+ {{/operations}}
93
+ {{/apis}}
94
+ {{/apiInfo}}
@@ -0,0 +1,21 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { MockService } from 'ng-mocks';
5
+ import { of } from 'rxjs';
6
+
7
+ import { {{classname}}UseCasesImpl } from '@/domain/use-cases/{{classFilename}}.use-cases.impl';
8
+ {{#returnImports}}
9
+ import { mock{{classname}}Model } from '@/entities/models/{{classFilename}}.model.mock';
10
+ {{/returnImports}}
11
+
12
+ export const mock{{classname}}UseCasesImpl = () =>
13
+ MockService({{classname}}UseCasesImpl, {
14
+ {{#operation}}
15
+ {{nickname}}: () => of({{#isListContainer}}[mock{{returnBaseType}}Model()]{{/isListContainer}}{{^isListContainer}}{{#returnBaseType}}mock{{returnBaseType}}Model(){{/returnBaseType}}{{^returnBaseType}}undefined{{/returnBaseType}}{{/isListContainer}}),
16
+ {{/operation}}
17
+ });
18
+
19
+ {{/operations}}
20
+ {{/apis}}
21
+ {{/apiInfo}}
@@ -0,0 +1,16 @@
1
+ {{#models}}
2
+ {{#model}}
3
+ {{#mockImports}}
4
+ import { mock{{classname}}Dto } from './{{classFilename}}.dto.mock';
5
+ {{/mockImports}}
6
+ import { {{classname}}Dto } from './{{classFilename}}.dto';
7
+
8
+ export const mock{{classname}}Dto = (overrides: Partial<{{classname}}Dto> = {}): {{classname}}Dto => ({
9
+ {{#vars}}
10
+ {{name}}: {{{mockValue}}},
11
+ {{/vars}}
12
+ ...overrides
13
+ });
14
+
15
+ {{/model}}
16
+ {{/models}}
@@ -0,0 +1,28 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { MapFromFn } from '@mercadona/common/public';
5
+ import { Builder } from '@mercadona/common/utils';
6
+
7
+ import { {{classname}}Dto } from '@/dtos/{{classFilename}}.dto';
8
+ import { {{classname}} } from '@/entities/models/{{classFilename}}.model';
9
+
10
+ /**
11
+ * {{classname}} Mapper
12
+ * Converts DTO to Domain Entity
13
+ * Generated from OpenAPI schema: {{classname}}
14
+ */
15
+ export const {{classVarName}}Mapper: MapFromFn<{{classname}}Dto, {{classname}}> = (dto: {{classname}}Dto): {{classname}} =>
16
+ Builder.forModel({{classname}})
17
+ {{#allModels}}
18
+ {{#model}}
19
+ {{#vars}}
20
+ .{{name}}(dto.{{name}})
21
+ {{/vars}}
22
+ {{/model}}
23
+ {{/allModels}}
24
+ .build();
25
+
26
+ {{/operations}}
27
+ {{/apis}}
28
+ {{/apiInfo}}
@@ -0,0 +1,39 @@
1
+ {{#models}}
2
+ {{#model}}
3
+ import { {{classVarName}}Mapper } from './{{classFilename}}.mapper';
4
+
5
+ import { mock{{classname}}Dto } from '@/dtos/{{classFilename}}.dto.mock';
6
+ import { {{classname}} } from '@/entities/models/{{classFilename}}.model';
7
+
8
+ describe('{{classVarName}}Mapper', () => {
9
+ {{#vars}}
10
+ it('should map {{name}} from DTO to model', () => {
11
+ const dto = mock{{classname}}Dto();
12
+
13
+ const result = {{classVarName}}Mapper(dto);
14
+
15
+ expect(result.{{name}}).toBe(dto.{{name}});
16
+ });
17
+
18
+ {{/vars}}
19
+ it('should return an instance of {{classname}}', () => {
20
+ const dto = mock{{classname}}Dto();
21
+
22
+ const result = {{classVarName}}Mapper(dto);
23
+
24
+ expect(result).toBeInstanceOf({{classname}});
25
+ });
26
+
27
+ it('should map all fields correctly from a complete DTO', () => {
28
+ const dto = mock{{classname}}Dto();
29
+
30
+ const result = {{classVarName}}Mapper(dto);
31
+
32
+ {{#vars}}
33
+ expect(result.{{name}}).toBe(dto.{{name}});
34
+ {{/vars}}
35
+ });
36
+ });
37
+
38
+ {{/model}}
39
+ {{/models}}
@@ -0,0 +1,24 @@
1
+ {{#models}}
2
+ {{#model}}
3
+ {{#imports}}
4
+ import { {{classname}} } from './{{classFilename}}.model';
5
+ {{/imports}}
6
+
7
+ /**
8
+ * {{classname}} Entity
9
+ * {{#description}}{{description}}{{/description}}
10
+ * Generated from OpenAPI schema
11
+ */
12
+ export class {{classname}} {
13
+ {{#vars}}
14
+ {{#description}}
15
+ /**
16
+ * {{description}}
17
+ */
18
+ {{/description}}
19
+ {{name}}{{^required}}?{{/required}}{{#required}}!{{/required}}: {{{dataType}}};
20
+ {{/vars}}
21
+ }
22
+
23
+ {{/model}}
24
+ {{/models}}
@@ -0,0 +1,34 @@
1
+ {{#models}}
2
+ {{#model}}
3
+ import { {{classname}} } from './{{classFilename}}.model';
4
+ import { mock{{classname}}Model } from './{{classFilename}}.model.mock';
5
+
6
+ describe('{{classname}}', () => {
7
+ it('should create an instance', () => {
8
+ const model = new {{classname}}();
9
+
10
+ expect(model).toBeInstanceOf({{classname}});
11
+ });
12
+
13
+ {{#vars}}
14
+ it('should allow setting {{name}}', () => {
15
+ const model = new {{classname}}();
16
+ const expected = mock{{classname}}Model();
17
+ model.{{name}} = expected.{{name}};
18
+
19
+ expect(model.{{name}}).toBe(expected.{{name}});
20
+ });
21
+
22
+ {{/vars}}
23
+ it('should build a valid model from mock', () => {
24
+ const model = mock{{classname}}Model();
25
+
26
+ expect(model).toBeInstanceOf({{classname}});
27
+ {{#vars}}
28
+ expect(model.{{name}}).toBeDefined();
29
+ {{/vars}}
30
+ });
31
+ });
32
+
33
+ {{/model}}
34
+ {{/models}}
@@ -0,0 +1,14 @@
1
+ {{#models}}
2
+ {{#model}}
3
+ import { {{classname}} } from './{{classFilename}}.model';
4
+ import { {{classVarName}}Mapper } from '@/mappers/{{classFilename}}.mapper';
5
+ import { mock{{classname}}Dto } from '@/dtos/{{classFilename}}.dto.mock';
6
+
7
+ export const mock{{classname}}Model = (overrides: Partial<{{classname}}> = {}): {{classname}} =>
8
+ Object.assign(new {{classname}}(), {
9
+ ...{{classVarName}}Mapper(mock{{classname}}Dto()),
10
+ ...overrides
11
+ });
12
+
13
+ {{/model}}
14
+ {{/models}}
@@ -0,0 +1,20 @@
1
+ {{#models}}
2
+ {{#model}}
3
+ /**
4
+ * {{classname}} DTO
5
+ * {{#description}}{{description}}{{/description}}
6
+ * Generated from OpenAPI specification
7
+ */
8
+ export interface {{classname}} {
9
+ {{#vars}}
10
+ {{#description}}
11
+ /**
12
+ * {{description}}
13
+ */
14
+ {{/description}}
15
+ {{name}}{{^required}}?{{/required}}: {{{dataType}}};
16
+ {{/vars}}
17
+ }
18
+
19
+ {{/model}}
20
+ {{/models}}
@@ -0,0 +1,20 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { Provider } from '@angular/core';
5
+
6
+ import { {{constantName}}_REPOSITORY } from '@/domain/repositories/{{classFilename}}.repository.contract';
7
+ import { mock{{classname}}RepositoryImpl } from '@/data/repositories/{{classFilename}}.repository.impl.mock';
8
+
9
+ export function mock{{classname}}Repository(): Provider[] {
10
+ return [
11
+ {
12
+ provide: {{constantName}}_REPOSITORY,
13
+ useFactory: () => mock{{classname}}RepositoryImpl()
14
+ }
15
+ ];
16
+ }
17
+
18
+ {{/operations}}
19
+ {{/apis}}
20
+ {{/apiInfo}}
@@ -0,0 +1,26 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';
5
+
6
+ import { {{constantName}}_REPOSITORY } from '@/domain/repositories/{{classFilename}}.repository.contract';
7
+ import { {{classname}}RepositoryImpl } from '@/data/repositories/{{classFilename}}.repository.impl';
8
+
9
+ /**
10
+ * {{classname}} Repository Provider
11
+ * Binds the repository contract with its implementation
12
+ *
13
+ * @returns EnvironmentProviders
14
+ */
15
+ export function provide{{classname}}Repository(): EnvironmentProviders {
16
+ return makeEnvironmentProviders([
17
+ {
18
+ provide: {{constantName}}_REPOSITORY,
19
+ useClass: {{classname}}RepositoryImpl
20
+ }
21
+ ]);
22
+ }
23
+
24
+ {{/operations}}
25
+ {{/apis}}
26
+ {{/apiInfo}}
@@ -0,0 +1,20 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { Provider } from '@angular/core';
5
+
6
+ import { {{constantName}}_USE_CASES } from '@/domain/use-cases/{{classFilename}}.use-cases.contract';
7
+ import { mock{{classname}}UseCasesImpl } from '@/domain/use-cases/{{classFilename}}.use-cases.mock';
8
+
9
+ export function mock{{classname}}UseCases(): Provider[] {
10
+ return [
11
+ {
12
+ provide: {{constantName}}_USE_CASES,
13
+ useFactory: () => mock{{classname}}UseCasesImpl()
14
+ }
15
+ ];
16
+ }
17
+
18
+ {{/operations}}
19
+ {{/apis}}
20
+ {{/apiInfo}}
@@ -0,0 +1,26 @@
1
+ {{#apiInfo}}
2
+ {{#apis}}
3
+ {{#operations}}
4
+ import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';
5
+
6
+ import { {{constantName}}_USE_CASES } from '@/domain/use-cases/{{classFilename}}.use-cases.contract';
7
+ import { {{classname}}UseCasesImpl } from '@/domain/use-cases/{{classFilename}}.use-cases.impl';
8
+
9
+ /**
10
+ * {{classname}} Use Cases Provider
11
+ * Binds the use cases contract with its implementation
12
+ *
13
+ * @returns EnvironmentProviders
14
+ */
15
+ export function provide{{classname}}UseCases(): EnvironmentProviders {
16
+ return makeEnvironmentProviders([
17
+ {
18
+ provide: {{constantName}}_USE_CASES,
19
+ useClass: {{classname}}UseCasesImpl
20
+ }
21
+ ]);
22
+ }
23
+
24
+ {{/operations}}
25
+ {{/apis}}
26
+ {{/apiInfo}}
package/tsconfig.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "CommonJS",
5
+ "lib": ["ES2022"],
6
+ "outDir": "./dist",
7
+ "rootDir": "./",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "moduleResolution": "node",
13
+ "resolveJsonModule": true
14
+ },
15
+ "include": ["main.ts", "src/**/*.ts"],
16
+ "exclude": ["node_modules", "dist"]
17
+ }