nestjs-ddd-cli 3.2.2 → 3.3.0
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/README.md +118 -9
- package/ddd.schema.json +11 -1
- package/dist/commands/doctor-enhanced.d.ts +1 -0
- package/dist/commands/doctor-enhanced.js +94 -79
- package/dist/commands/doctor-enhanced.js.map +1 -1
- package/dist/commands/doctor.d.ts +9 -0
- package/dist/commands/doctor.js +68 -21
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate-all.js +54 -28
- package/dist/commands/generate-all.js.map +1 -1
- package/dist/commands/generate-controller.d.ts +1 -0
- package/dist/commands/generate-controller.js +71 -0
- package/dist/commands/generate-controller.js.map +1 -0
- package/dist/commands/generate-domain-service.d.ts +1 -1
- package/dist/commands/generate-domain-service.js +6 -4
- package/dist/commands/generate-domain-service.js.map +1 -1
- package/dist/commands/generate-dto.d.ts +4 -0
- package/dist/commands/generate-dto.js +162 -0
- package/dist/commands/generate-dto.js.map +1 -0
- package/dist/commands/generate-entity.js +7 -2
- package/dist/commands/generate-entity.js.map +1 -1
- package/dist/commands/generate-event.js +10 -4
- package/dist/commands/generate-event.js.map +1 -1
- package/dist/commands/generate-migration-deployment.d.ts +15 -0
- package/dist/commands/generate-migration-deployment.js +326 -0
- package/dist/commands/generate-migration-deployment.js.map +1 -0
- package/dist/commands/generate-migration-deployment.spec.d.ts +1 -0
- package/dist/commands/generate-migration-deployment.spec.js +337 -0
- package/dist/commands/generate-migration-deployment.spec.js.map +1 -0
- package/dist/commands/generate-module.js +4 -2
- package/dist/commands/generate-module.js.map +1 -1
- package/dist/commands/generate-query.js +23 -4
- package/dist/commands/generate-query.js.map +1 -1
- package/dist/commands/generate-repository.d.ts +1 -1
- package/dist/commands/generate-repository.js +17 -34
- package/dist/commands/generate-repository.js.map +1 -1
- package/dist/commands/generate-service.js +19 -4
- package/dist/commands/generate-service.js.map +1 -1
- package/dist/commands/generate-usecase.js +12 -31
- package/dist/commands/generate-usecase.js.map +1 -1
- package/dist/commands/generate-value-object.js +3 -14
- package/dist/commands/generate-value-object.js.map +1 -1
- package/dist/commands/init-project.d.ts +3 -0
- package/dist/commands/init-project.js +19 -9
- package/dist/commands/init-project.js.map +1 -1
- package/dist/commands/interactive-scaffold.js +10 -0
- package/dist/commands/interactive-scaffold.js.map +1 -1
- package/dist/commands/migration.d.ts +3 -0
- package/dist/commands/migration.js +83 -48
- package/dist/commands/migration.js.map +1 -1
- package/dist/commands/recipe.d.ts +2 -0
- package/dist/commands/recipe.js +229 -85
- package/dist/commands/recipe.js.map +1 -1
- package/dist/commands/recipes/banklink-connector-contract.recipe.d.ts +1 -0
- package/dist/commands/recipes/banklink-connector-contract.recipe.js +161 -0
- package/dist/commands/recipes/banklink-connector-contract.recipe.js.map +1 -0
- package/dist/commands/recipes/bounded-json-http.recipe.d.ts +2 -0
- package/dist/commands/recipes/bounded-json-http.recipe.js +53 -0
- package/dist/commands/recipes/bounded-json-http.recipe.js.map +1 -0
- package/dist/commands/recipes/business-reference-identifiers.recipe.d.ts +1 -0
- package/dist/commands/recipes/business-reference-identifiers.recipe.js +223 -0
- package/dist/commands/recipes/business-reference-identifiers.recipe.js.map +1 -0
- package/dist/commands/recipes/event-backbone.recipe.d.ts +1 -0
- package/dist/commands/recipes/event-backbone.recipe.js +1118 -0
- package/dist/commands/recipes/event-backbone.recipe.js.map +1 -0
- package/dist/commands/recipes/external-projection-worker.recipe.d.ts +6 -0
- package/dist/commands/recipes/external-projection-worker.recipe.js +211 -0
- package/dist/commands/recipes/external-projection-worker.recipe.js.map +1 -0
- package/dist/commands/recipes/index.d.ts +11 -0
- package/dist/commands/recipes/index.js +11 -0
- package/dist/commands/recipes/index.js.map +1 -1
- package/dist/commands/recipes/jest-cjs-compat.recipe.d.ts +3 -0
- package/dist/commands/recipes/jest-cjs-compat.recipe.js +130 -0
- package/dist/commands/recipes/jest-cjs-compat.recipe.js.map +1 -0
- package/dist/commands/recipes/joi-env.recipe.js +1 -1
- package/dist/commands/recipes/kafka-consumer.recipe.d.ts +1 -0
- package/dist/commands/recipes/kafka-consumer.recipe.js +65 -0
- package/dist/commands/recipes/kafka-consumer.recipe.js.map +1 -0
- package/dist/commands/recipes/oauth2-client-credentials.recipe.d.ts +1 -0
- package/dist/commands/recipes/oauth2-client-credentials.recipe.js +60 -0
- package/dist/commands/recipes/oauth2-client-credentials.recipe.js.map +1 -0
- package/dist/commands/recipes/oauth2-token-introspection.recipe.d.ts +1 -0
- package/dist/commands/recipes/oauth2-token-introspection.recipe.js +67 -0
- package/dist/commands/recipes/oauth2-token-introspection.recipe.js.map +1 -0
- package/dist/commands/recipes/oidc-bff-session.recipe.d.ts +1 -0
- package/dist/commands/recipes/oidc-bff-session.recipe.js +57 -0
- package/dist/commands/recipes/oidc-bff-session.recipe.js.map +1 -0
- package/dist/commands/recipes/oidc-dashboard.recipe.d.ts +1 -0
- package/dist/commands/recipes/oidc-dashboard.recipe.js +463 -0
- package/dist/commands/recipes/oidc-dashboard.recipe.js.map +1 -0
- package/dist/commands/recipes/oidc-resource-server.recipe.d.ts +1 -0
- package/dist/commands/recipes/oidc-resource-server.recipe.js +85 -0
- package/dist/commands/recipes/oidc-resource-server.recipe.js.map +1 -0
- package/dist/commands/recipes/platform-context.recipe.d.ts +1 -0
- package/dist/commands/recipes/platform-context.recipe.js +229 -0
- package/dist/commands/recipes/platform-context.recipe.js.map +1 -0
- package/dist/commands/recipes/platform-parc-authorization.recipe.d.ts +1 -0
- package/dist/commands/recipes/platform-parc-authorization.recipe.js +339 -0
- package/dist/commands/recipes/platform-parc-authorization.recipe.js.map +1 -0
- package/dist/commands/recipes/platform-parc-bound-authorization.recipe.d.ts +1 -0
- package/dist/commands/recipes/platform-parc-bound-authorization.recipe.js +56 -0
- package/dist/commands/recipes/platform-parc-bound-authorization.recipe.js.map +1 -0
- package/dist/commands/recipes/platform-service-access-request-context.recipe.d.ts +1 -0
- package/dist/commands/recipes/platform-service-access-request-context.recipe.js +103 -0
- package/dist/commands/recipes/platform-service-access-request-context.recipe.js.map +1 -0
- package/dist/commands/recipes/platform-service-runtime.recipe.d.ts +1 -0
- package/dist/commands/recipes/platform-service-runtime.recipe.js +415 -0
- package/dist/commands/recipes/platform-service-runtime.recipe.js.map +1 -0
- package/dist/index.js +77 -9
- package/dist/index.js.map +1 -1
- package/dist/templates/ai-context/CLAUDE.md.hbs +39 -3
- package/dist/templates/ai-context/conventions.md.hbs +13 -8
- package/dist/templates/command/create-command.hbs +8 -3
- package/dist/templates/command/delete-command.hbs +1 -1
- package/dist/templates/command/update-command.hbs +1 -1
- package/dist/templates/controller/application-controller.hbs +7 -0
- package/dist/templates/controller/controller.hbs +6 -0
- package/dist/templates/dto/create-dto.hbs +17 -5
- package/dist/templates/dto/filter-dto.hbs +1 -1
- package/dist/templates/dto/response-dto.hbs +1 -1
- package/dist/templates/entity/entity.hbs +4 -0
- package/dist/templates/mapper/mapper.hbs +5 -1
- package/dist/templates/orm-entity/orm-entity.hbs +9 -1
- package/dist/templates/prisma/prisma-mapper.hbs +6 -0
- package/dist/templates/prisma/prisma-repository.hbs +57 -5
- package/dist/templates/prisma/prisma-schema.hbs +2 -0
- package/dist/templates/query/get-all.query.hbs +10 -2
- package/dist/templates/recipes/bounded-json-http/README.md.hbs +36 -0
- package/dist/templates/recipes/external-projection-worker/README.md.hbs +157 -0
- package/dist/templates/recipes/external-projection-worker/canonical-json.ts.hbs +123 -0
- package/dist/templates/recipes/external-projection-worker/enqueuer.ts.hbs +167 -0
- package/dist/templates/recipes/external-projection-worker/index.ts.hbs +6 -0
- package/dist/templates/recipes/external-projection-worker/migration.ts.hbs +88 -0
- package/dist/templates/recipes/external-projection-worker/module.ts.hbs +36 -0
- package/dist/templates/recipes/external-projection-worker/store.ts.hbs +354 -0
- package/dist/templates/recipes/external-projection-worker/types.ts.hbs +134 -0
- package/dist/templates/recipes/external-projection-worker/worker.ts.hbs +296 -0
- package/dist/templates/recipes/kafka-consumer/README.md.hbs +50 -0
- package/dist/templates/recipes/kafka-consumer/kafka-consumer.ts.hbs +135 -0
- package/dist/templates/recipes/kafka-consumer/migration.ts.hbs +17 -0
- package/dist/templates/recipes/oauth2-client-credentials/README.md.hbs +40 -0
- package/dist/templates/recipes/oauth2-client-credentials/client.spec.ts.hbs +234 -0
- package/dist/templates/recipes/oauth2-client-credentials/client.ts.hbs +210 -0
- package/dist/templates/recipes/oauth2-client-credentials/index.ts.hbs +2 -0
- package/dist/templates/recipes/oauth2-client-credentials/module.ts.hbs +58 -0
- package/dist/templates/recipes/oauth2-token-introspection/README.md.hbs +158 -0
- package/dist/templates/recipes/oauth2-token-introspection/client.spec.ts.hbs +350 -0
- package/dist/templates/recipes/oauth2-token-introspection/client.ts.hbs +241 -0
- package/dist/templates/recipes/oauth2-token-introspection/http-client.spec.ts.hbs +411 -0
- package/dist/templates/recipes/oauth2-token-introspection/http-client.ts.hbs +343 -0
- package/dist/templates/recipes/oauth2-token-introspection/index.ts.hbs +3 -0
- package/dist/templates/recipes/oauth2-token-introspection/module.ts.hbs +58 -0
- package/dist/templates/recipes/oidc-bff-session/README.md.hbs +96 -0
- package/dist/templates/recipes/oidc-bff-session/client.test.ts.hbs +663 -0
- package/dist/templates/recipes/oidc-bff-session/client.ts.hbs +635 -0
- package/dist/templates/recipes/oidc-bff-session/index.ts.hbs +3 -0
- package/dist/templates/recipes/oidc-bff-session/store.integration.test.ts.hbs +480 -0
- package/dist/templates/recipes/oidc-bff-session/store.test.ts.hbs +87 -0
- package/dist/templates/recipes/oidc-bff-session/store.ts.hbs +549 -0
- package/dist/templates/recipes/oidc-bff-session/valkey.test.ts.hbs +158 -0
- package/dist/templates/recipes/oidc-bff-session/valkey.ts.hbs +148 -0
- package/dist/templates/recipes/oidc-resource-server/README.md.hbs +74 -0
- package/dist/templates/recipes/oidc-resource-server/index.ts.hbs +2 -0
- package/dist/templates/recipes/oidc-resource-server/module.ts.hbs +51 -0
- package/dist/templates/recipes/oidc-resource-server/verifier.spec.ts.hbs +186 -0
- package/dist/templates/recipes/oidc-resource-server/verifier.ts.hbs +440 -0
- package/dist/templates/recipes/platform-parc-bound-authorization/README.md.hbs +92 -0
- package/dist/templates/recipes/platform-parc-bound-authorization/client.ts.hbs +142 -0
- package/dist/templates/recipes/platform-service-access-request-context/docs.md.hbs +61 -0
- package/dist/templates/recipes/platform-service-access-request-context/env.example.hbs +7 -0
- package/dist/templates/recipes/platform-service-access-request-context/index.ts.hbs +7 -0
- package/dist/templates/recipes/platform-service-access-request-context/request-context-headers.ts.hbs +61 -0
- package/dist/templates/recipes/platform-service-access-request-context/request-context-introspection.parser.ts.hbs +132 -0
- package/dist/templates/recipes/platform-service-access-request-context/request-context-introspection.types.ts.hbs +40 -0
- package/dist/templates/recipes/platform-service-access-request-context/service-access-request-context.client.ts.hbs +45 -0
- package/dist/templates/recipes/platform-service-access-request-context/service-access-request-context.config.ts.hbs +142 -0
- package/dist/templates/recipes/platform-service-access-request-context/service-access-request-context.guard.ts.hbs +77 -0
- package/dist/templates/recipes/platform-service-access-request-context/service-access-request-context.module.ts.hbs +17 -0
- package/dist/templates/repository/repository.hbs +42 -4
- package/dist/templates/resolver/graphql-input.hbs +23 -6
- package/dist/templates/resolver/resolver.hbs +4 -0
- package/dist/templates/service/domain-service.hbs +2 -2
- package/dist/templates/test/controller.spec.hbs +5 -1
- package/dist/templates/test/prisma-repository.spec.hbs +192 -0
- package/dist/templates/test/repository.spec.hbs +40 -1
- package/dist/templates/test/usecase.spec.hbs +23 -4
- package/dist/templates/usecase/application-usecase.hbs +17 -0
- package/dist/templates/usecase/create-usecase.hbs +34 -3
- package/dist/templates/usecase/update-usecase.hbs +15 -1
- package/dist/utils/config.utils.d.ts +2 -0
- package/dist/utils/config.utils.js +14 -2
- package/dist/utils/config.utils.js.map +1 -1
- package/dist/utils/dependency.utils.d.ts +16 -2
- package/dist/utils/dependency.utils.js +100 -12
- package/dist/utils/dependency.utils.js.map +1 -1
- package/dist/utils/field.utils.d.ts +6 -0
- package/dist/utils/field.utils.js +50 -8
- package/dist/utils/field.utils.js.map +1 -1
- package/dist/utils/field.utils.spec.d.ts +1 -0
- package/dist/utils/field.utils.spec.js +38 -0
- package/dist/utils/field.utils.spec.js.map +1 -0
- package/dist/utils/file.utils.d.ts +23 -1
- package/dist/utils/file.utils.js +37 -1
- package/dist/utils/file.utils.js.map +1 -1
- package/dist/utils/naming.utils.js +5 -4
- package/dist/utils/naming.utils.js.map +1 -1
- package/dist/utils/static-recipe.utils.d.ts +4 -0
- package/dist/utils/static-recipe.utils.js +148 -0
- package/dist/utils/static-recipe.utils.js.map +1 -0
- package/package.json +12 -5
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import { Injectable } from "@nestjs/common";
|
|
2
|
-
import { {{entityNamePascal}}Entity } from "@modules/{{moduleNameKebab}}/application/domain/entities/{{entityNameKebab}}.entity";
|
|
1
|
+
import { Injectable{{#if hasServerOwnedFields}}, InternalServerErrorException{{/if}} } from "@nestjs/common";
|
|
2
|
+
import { {{entityNamePascal}}Entity{{#if hasServerOwnedFields}}, {{entityNamePascal}}EntityProps{{/if}} } from "@modules/{{moduleNameKebab}}/application/domain/entities/{{entityNameKebab}}.entity";
|
|
3
3
|
import { {{entityNamePascal}}Repository } from "@modules/{{moduleNameKebab}}/infrastructure/repositories/{{entityNameKebab}}.repository";
|
|
4
4
|
import { {{entityNamePascal}}Mapper } from "@modules/{{moduleNameKebab}}/infrastructure/mappers/{{entityNameKebab}}.mapper";
|
|
5
5
|
import { Create{{entityNamePascal}}Dto } from "@modules/{{moduleNameKebab}}/application/dto/requests/create-{{entityNameKebab}}.dto";
|
|
6
6
|
import { {{entityNamePascal}}ResponseDto } from "@modules/{{moduleNameKebab}}/application/dto/responses/{{entityNameKebab}}.response.dto";
|
|
7
7
|
|
|
8
|
+
{{#if hasServerOwnedFields}}
|
|
9
|
+
export type Create{{entityNamePascal}}ServerOwnedFields = Pick<
|
|
10
|
+
{{entityNamePascal}}EntityProps,
|
|
11
|
+
{{#each serverOwnedFields}}
|
|
12
|
+
| "{{this.camelCase}}"
|
|
13
|
+
{{/each}}
|
|
14
|
+
>;
|
|
15
|
+
|
|
16
|
+
{{/if}}
|
|
8
17
|
@Injectable()
|
|
9
18
|
export class Create{{entityNamePascal}}UseCase {
|
|
10
19
|
constructor(
|
|
@@ -12,9 +21,31 @@ export class Create{{entityNamePascal}}UseCase {
|
|
|
12
21
|
private readonly mapper: {{entityNamePascal}}Mapper,
|
|
13
22
|
) {}
|
|
14
23
|
|
|
15
|
-
async execute(
|
|
24
|
+
async execute(
|
|
25
|
+
dto: Create{{entityNamePascal}}Dto,
|
|
26
|
+
{{#if hasServerOwnedFields}}
|
|
27
|
+
serverOwnedFields?: Create{{entityNamePascal}}ServerOwnedFields,
|
|
28
|
+
{{/if}}
|
|
29
|
+
): Promise<{{entityNamePascal}}ResponseDto> {
|
|
30
|
+
{{#if hasServerOwnedFields}}
|
|
31
|
+
if (!serverOwnedFields) {
|
|
32
|
+
throw new InternalServerErrorException(
|
|
33
|
+
"Trusted server-owned fields are required to create {{entityNamePascal}}: {{#each serverOwnedFields}}{{#unless @first}}, {{/unless}}{{this.camelCase}}{{/each}}",
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
{{/if}}
|
|
16
38
|
const entity = new {{entityNamePascal}}Entity({
|
|
39
|
+
{{#if hasServerOwnedFields}}
|
|
40
|
+
{{#each requestFields}}
|
|
41
|
+
{{this.camelCase}}: dto.{{this.camelCase}},
|
|
42
|
+
{{/each}}
|
|
43
|
+
{{#each serverOwnedFields}}
|
|
44
|
+
{{this.camelCase}}: serverOwnedFields.{{this.camelCase}},
|
|
45
|
+
{{/each}}
|
|
46
|
+
{{else}}
|
|
17
47
|
...dto,
|
|
48
|
+
{{/if}}
|
|
18
49
|
isActive: true,
|
|
19
50
|
createdAt: new Date(),
|
|
20
51
|
updatedAt: new Date(),
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Injectable, NotFoundException } from "@nestjs/common";
|
|
2
|
-
import { {{entityNamePascal}}Entity } from "@modules/{{moduleNameKebab}}/application/domain/entities/{{entityNameKebab}}.entity";
|
|
2
|
+
import { {{entityNamePascal}}Entity{{#if hasServerOwnedFields}}, {{entityNamePascal}}EntityProps{{/if}} } from "@modules/{{moduleNameKebab}}/application/domain/entities/{{entityNameKebab}}.entity";
|
|
3
3
|
import { {{entityNamePascal}}Repository } from "@modules/{{moduleNameKebab}}/infrastructure/repositories/{{entityNameKebab}}.repository";
|
|
4
4
|
import { {{entityNamePascal}}Mapper } from "@modules/{{moduleNameKebab}}/infrastructure/mappers/{{entityNameKebab}}.mapper";
|
|
5
5
|
import { Update{{entityNamePascal}}Dto } from "@modules/{{moduleNameKebab}}/application/dto/requests/update-{{entityNameKebab}}.dto";
|
|
@@ -19,11 +19,25 @@ export class Update{{entityNamePascal}}UseCase {
|
|
|
19
19
|
throw new NotFoundException(`{{entityNamePascal}} with id '${id}' not found`);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
+
{{#if hasServerOwnedFields}}
|
|
23
|
+
const updates: Partial<{{entityNamePascal}}EntityProps> = {};
|
|
24
|
+
{{#each requestFields}}
|
|
25
|
+
if (dto.{{this.camelCase}} !== undefined) {
|
|
26
|
+
updates.{{this.camelCase}} = dto.{{this.camelCase}};
|
|
27
|
+
}
|
|
28
|
+
{{/each}}
|
|
29
|
+
if (dto.isActive !== undefined) {
|
|
30
|
+
updates.isActive = dto.isActive;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const updatedEntity = existingEntity.update(updates);
|
|
34
|
+
{{else}}
|
|
22
35
|
const updatedEntity = new {{entityNamePascal}}Entity({
|
|
23
36
|
...existingEntity,
|
|
24
37
|
...dto,
|
|
25
38
|
updatedAt: new Date(),
|
|
26
39
|
});
|
|
40
|
+
{{/if}}
|
|
27
41
|
|
|
28
42
|
const savedEntity = await this.repository.update(id, updatedEntity);
|
|
29
43
|
return this.mapper.toResponseDto(savedEntity);
|
|
@@ -46,13 +46,15 @@ const DEFAULT_CONFIG = {
|
|
|
46
46
|
database: 'postgres',
|
|
47
47
|
naming: {
|
|
48
48
|
table: 'snake_case',
|
|
49
|
-
dto: '
|
|
49
|
+
dto: 'camelCase',
|
|
50
50
|
file: 'kebab-case',
|
|
51
51
|
},
|
|
52
52
|
features: {
|
|
53
53
|
swagger: true,
|
|
54
54
|
pagination: true,
|
|
55
|
+
delete: true,
|
|
55
56
|
softDelete: true,
|
|
57
|
+
hardDelete: false,
|
|
56
58
|
timestamps: true,
|
|
57
59
|
tests: false,
|
|
58
60
|
events: false,
|
|
@@ -168,7 +170,7 @@ function getConfigSchema() {
|
|
|
168
170
|
dto: {
|
|
169
171
|
type: 'string',
|
|
170
172
|
enum: ['snake_case', 'camelCase'],
|
|
171
|
-
default: '
|
|
173
|
+
default: 'camelCase',
|
|
172
174
|
},
|
|
173
175
|
file: {
|
|
174
176
|
type: 'string',
|
|
@@ -182,7 +184,17 @@ function getConfigSchema() {
|
|
|
182
184
|
properties: {
|
|
183
185
|
swagger: { type: 'boolean', default: true },
|
|
184
186
|
pagination: { type: 'boolean', default: true },
|
|
187
|
+
delete: {
|
|
188
|
+
type: 'boolean',
|
|
189
|
+
default: true,
|
|
190
|
+
description: 'Generate the generic aggregate deletion surface',
|
|
191
|
+
},
|
|
185
192
|
softDelete: { type: 'boolean', default: true },
|
|
193
|
+
hardDelete: {
|
|
194
|
+
type: 'boolean',
|
|
195
|
+
default: false,
|
|
196
|
+
description: 'Generate an explicit hardDelete compatibility helper when softDelete is enabled',
|
|
197
|
+
},
|
|
186
198
|
timestamps: { type: 'boolean', default: true },
|
|
187
199
|
tests: { type: 'boolean', default: false },
|
|
188
200
|
events: { type: 'boolean', default: false },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.utils.js","sourceRoot":"","sources":["../../src/utils/config.utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"config.utils.js","sourceRoot":"","sources":["../../src/utils/config.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,14 +24,28 @@ export declare function isNestJSCliInstalled(): Promise<boolean>;
|
|
|
24
24
|
* Install NestJS CLI globally
|
|
25
25
|
*/
|
|
26
26
|
export declare function installNestJSCli(): Promise<void>;
|
|
27
|
+
export declare function getNestProjectExecution(projectName: string, options?: {
|
|
28
|
+
directory?: string;
|
|
29
|
+
skipInstall?: boolean;
|
|
30
|
+
packageManager?: 'npm' | 'bun';
|
|
31
|
+
collection?: string;
|
|
32
|
+
}): {
|
|
33
|
+
args: string[];
|
|
34
|
+
cwd: string;
|
|
35
|
+
};
|
|
27
36
|
/**
|
|
28
37
|
* Create a new NestJS project
|
|
29
38
|
*/
|
|
30
|
-
export declare function createNestJSProject(projectName: string, options?:
|
|
39
|
+
export declare function createNestJSProject(projectName: string, options?: {
|
|
40
|
+
directory?: string;
|
|
41
|
+
skipInstall?: boolean;
|
|
42
|
+
packageManager?: 'npm' | 'bun';
|
|
43
|
+
collection?: string;
|
|
44
|
+
}): Promise<void>;
|
|
31
45
|
/**
|
|
32
46
|
* Install dependencies in a project
|
|
33
47
|
*/
|
|
34
|
-
export declare function installDependencies(projectPath: string, dependencies: string[], dev?: boolean): Promise<void>;
|
|
48
|
+
export declare function installDependencies(projectPath: string, dependencies: string[], dev?: boolean, packageManager?: 'npm' | 'bun'): Promise<void>;
|
|
35
49
|
/**
|
|
36
50
|
* Check for outdated dependencies in a project
|
|
37
51
|
*/
|
|
@@ -44,6 +44,7 @@ exports.compareVersions = compareVersions;
|
|
|
44
44
|
exports.updatePackageGlobally = updatePackageGlobally;
|
|
45
45
|
exports.isNestJSCliInstalled = isNestJSCliInstalled;
|
|
46
46
|
exports.installNestJSCli = installNestJSCli;
|
|
47
|
+
exports.getNestProjectExecution = getNestProjectExecution;
|
|
47
48
|
exports.createNestJSProject = createNestJSProject;
|
|
48
49
|
exports.installDependencies = installDependencies;
|
|
49
50
|
exports.checkOutdatedDependencies = checkOutdatedDependencies;
|
|
@@ -54,8 +55,10 @@ const child_process_1 = require("child_process");
|
|
|
54
55
|
const util_1 = require("util");
|
|
55
56
|
const fs = __importStar(require("fs-extra"));
|
|
56
57
|
const path = __importStar(require("path"));
|
|
58
|
+
const node_os_1 = require("node:os");
|
|
57
59
|
const chalk_1 = __importDefault(require("chalk"));
|
|
58
60
|
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
61
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
59
62
|
/**
|
|
60
63
|
* Check if a package is installed globally
|
|
61
64
|
*/
|
|
@@ -164,26 +167,104 @@ async function installNestJSCli() {
|
|
|
164
167
|
throw new Error(`Failed to install @nestjs/cli: ${error.message}`);
|
|
165
168
|
}
|
|
166
169
|
}
|
|
170
|
+
function getNestProjectExecution(projectName, options = {}) {
|
|
171
|
+
const args = [
|
|
172
|
+
'new',
|
|
173
|
+
projectName,
|
|
174
|
+
'--skip-git',
|
|
175
|
+
'--package-manager',
|
|
176
|
+
options.packageManager ?? 'npm',
|
|
177
|
+
];
|
|
178
|
+
let cwd = process.cwd();
|
|
179
|
+
if (options.collection)
|
|
180
|
+
args.push('--collection', options.collection);
|
|
181
|
+
if (options.directory) {
|
|
182
|
+
const targetDirectory = path.resolve(options.directory);
|
|
183
|
+
cwd = path.dirname(targetDirectory);
|
|
184
|
+
args.push('--directory', path.basename(targetDirectory));
|
|
185
|
+
}
|
|
186
|
+
if (options.skipInstall || options.packageManager === 'bun') {
|
|
187
|
+
args.push('--skip-install');
|
|
188
|
+
}
|
|
189
|
+
return { args, cwd };
|
|
190
|
+
}
|
|
167
191
|
/**
|
|
168
192
|
* Create a new NestJS project
|
|
169
193
|
*/
|
|
170
194
|
async function createNestJSProject(projectName, options = {}) {
|
|
171
195
|
try {
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
196
|
+
let bunNest;
|
|
197
|
+
if (options.packageManager === 'bun') {
|
|
198
|
+
for (const directory of (process.env['PATH'] ?? '').split(path.delimiter)) {
|
|
199
|
+
if (!directory)
|
|
200
|
+
continue;
|
|
201
|
+
const executable = path.join(directory, 'nest');
|
|
202
|
+
try {
|
|
203
|
+
await fs.access(executable, fs.constants.X_OK);
|
|
204
|
+
bunNest = await fs.realpath(executable);
|
|
205
|
+
break;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
/* Inspect next existing executable; never install globally. */
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (!bunNest)
|
|
212
|
+
throw new Error('Bun init requires an existing Nest CLI executable');
|
|
213
|
+
}
|
|
214
|
+
else {
|
|
215
|
+
// Existing defaults remain intact; explicit Bun skips npm probes/installation.
|
|
216
|
+
const isInstalled = await isNestJSCliInstalled();
|
|
217
|
+
if (!isInstalled)
|
|
218
|
+
await installNestJSCli();
|
|
176
219
|
}
|
|
177
220
|
console.log(chalk_1.default.blue(`Creating new NestJS project: ${projectName}...`));
|
|
178
|
-
|
|
179
|
-
let command = `nest new ${projectName} --skip-git --package-manager npm`;
|
|
221
|
+
const { args, cwd } = getNestProjectExecution(projectName, options);
|
|
180
222
|
if (options.directory) {
|
|
181
|
-
|
|
223
|
+
await fs.ensureDir(cwd);
|
|
224
|
+
}
|
|
225
|
+
// Avoid shell parsing of user-provided project names and paths.
|
|
226
|
+
if (bunNest) {
|
|
227
|
+
// Nest's schematics runner hardcodes `node`. The private invocation shim
|
|
228
|
+
// keeps those children on Bun without changing global PATH or installs.
|
|
229
|
+
const runtimeDirectory = await fs.mkdtemp(path.join((0, node_os_1.tmpdir)(), 'ddd-bun-init-'));
|
|
230
|
+
try {
|
|
231
|
+
let bunRuntime;
|
|
232
|
+
for (const directory of (process.env['PATH'] ?? '').split(path.delimiter)) {
|
|
233
|
+
if (!directory)
|
|
234
|
+
continue;
|
|
235
|
+
try {
|
|
236
|
+
const candidate = path.join(directory, 'bun');
|
|
237
|
+
await fs.access(candidate, fs.constants.X_OK);
|
|
238
|
+
bunRuntime = await fs.realpath(candidate);
|
|
239
|
+
break;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
/* No global installation. */
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (!bunRuntime)
|
|
246
|
+
throw new Error('Bun init requires an existing Bun executable');
|
|
247
|
+
await fs.symlink(bunRuntime, path.join(runtimeDirectory, 'node'));
|
|
248
|
+
await execFileAsync('bun', [bunNest, ...args], {
|
|
249
|
+
cwd,
|
|
250
|
+
env: {
|
|
251
|
+
...process.env,
|
|
252
|
+
PATH: `${runtimeDirectory}${path.delimiter}${process.env['PATH'] ?? ''}`,
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
await fs.remove(runtimeDirectory);
|
|
258
|
+
}
|
|
182
259
|
}
|
|
183
|
-
|
|
184
|
-
|
|
260
|
+
else {
|
|
261
|
+
await execFileAsync('nest', args, { cwd });
|
|
262
|
+
}
|
|
263
|
+
if (options.packageManager === 'bun' && !options.skipInstall) {
|
|
264
|
+
await execFileAsync('bun', ['install'], {
|
|
265
|
+
cwd: options.directory ? path.resolve(options.directory) : path.resolve(cwd, projectName),
|
|
266
|
+
});
|
|
185
267
|
}
|
|
186
|
-
await execAsync(command);
|
|
187
268
|
console.log(chalk_1.default.green(`✅ NestJS project ${projectName} created successfully!`));
|
|
188
269
|
}
|
|
189
270
|
catch (error) {
|
|
@@ -193,11 +274,18 @@ async function createNestJSProject(projectName, options = {}) {
|
|
|
193
274
|
/**
|
|
194
275
|
* Install dependencies in a project
|
|
195
276
|
*/
|
|
196
|
-
async function installDependencies(projectPath, dependencies, dev = false) {
|
|
277
|
+
async function installDependencies(projectPath, dependencies, dev = false, packageManager = 'npm') {
|
|
197
278
|
try {
|
|
198
279
|
const flag = dev ? '--save-dev' : '--save';
|
|
199
280
|
console.log(chalk_1.default.blue(`Installing ${dev ? 'dev ' : ''}dependencies: ${dependencies.join(', ')}...`));
|
|
200
|
-
|
|
281
|
+
if (packageManager === 'bun') {
|
|
282
|
+
await execFileAsync('bun', ['add', ...(dev ? ['--dev'] : []), ...dependencies], {
|
|
283
|
+
cwd: projectPath,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
await execAsync(`npm install ${flag} ${dependencies.join(' ')}`, { cwd: projectPath });
|
|
288
|
+
}
|
|
201
289
|
console.log(chalk_1.default.green('✅ Dependencies installed successfully!'));
|
|
202
290
|
}
|
|
203
291
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency.utils.js","sourceRoot":"","sources":["../../src/utils/dependency.utils.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"dependency.utils.js","sourceRoot":"","sources":["../../src/utils/dependency.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@ export interface FieldDefinition {
|
|
|
10
10
|
isRequired: boolean;
|
|
11
11
|
isOptional: boolean;
|
|
12
12
|
isUnique: boolean;
|
|
13
|
+
isMoney: boolean;
|
|
14
|
+
isServerOwned: boolean;
|
|
13
15
|
isArray: boolean;
|
|
14
16
|
validators: string[];
|
|
15
17
|
description: string;
|
|
@@ -27,6 +29,8 @@ export interface ParsedFields {
|
|
|
27
29
|
hasDate: boolean;
|
|
28
30
|
hasEnum: boolean;
|
|
29
31
|
hasRelation: boolean;
|
|
32
|
+
hasMoney: boolean;
|
|
33
|
+
hasServerOwned: boolean;
|
|
30
34
|
}
|
|
31
35
|
/**
|
|
32
36
|
* Parse field definitions from CLI --fields flag
|
|
@@ -37,6 +41,8 @@ export interface ParsedFields {
|
|
|
37
41
|
* "email:string:unique" -> required unique string with IsEmail
|
|
38
42
|
* "age:number:optional" -> optional number
|
|
39
43
|
* "status:enum:active,inactive" -> enum with values
|
|
44
|
+
* "amount:money" -> exact decimal stored as a TypeScript string
|
|
45
|
+
* "tenantId:uuid:serverOwned" -> persisted field excluded from request DTOs
|
|
40
46
|
* "tags:string[]" -> string array
|
|
41
47
|
* "userId:uuid:relation" -> foreign key relation
|
|
42
48
|
*/
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.parseFields = parseFields;
|
|
4
4
|
exports.generateFieldsTemplateData = generateFieldsTemplateData;
|
|
5
5
|
const naming_utils_1 = require("./naming.utils");
|
|
6
|
+
const BASE_ENTITY_FIELD_NAMES = new Set(['id', 'isActive', 'createdAt', 'updatedAt', 'deletedAt']);
|
|
6
7
|
/**
|
|
7
8
|
* Parse field definitions from CLI --fields flag
|
|
8
9
|
* Format: "name:type:modifier1:modifier2"
|
|
@@ -12,18 +13,36 @@ const naming_utils_1 = require("./naming.utils");
|
|
|
12
13
|
* "email:string:unique" -> required unique string with IsEmail
|
|
13
14
|
* "age:number:optional" -> optional number
|
|
14
15
|
* "status:enum:active,inactive" -> enum with values
|
|
16
|
+
* "amount:money" -> exact decimal stored as a TypeScript string
|
|
17
|
+
* "tenantId:uuid:serverOwned" -> persisted field excluded from request DTOs
|
|
15
18
|
* "tags:string[]" -> string array
|
|
16
19
|
* "userId:uuid:relation" -> foreign key relation
|
|
17
20
|
*/
|
|
18
21
|
function parseFields(fieldsString) {
|
|
19
22
|
if (!fieldsString || fieldsString.trim() === '') {
|
|
20
|
-
return {
|
|
23
|
+
return {
|
|
24
|
+
fields: [],
|
|
25
|
+
hasEmail: false,
|
|
26
|
+
hasDate: false,
|
|
27
|
+
hasEnum: false,
|
|
28
|
+
hasRelation: false,
|
|
29
|
+
hasMoney: false,
|
|
30
|
+
hasServerOwned: false,
|
|
31
|
+
};
|
|
21
32
|
}
|
|
22
|
-
const fieldDefs = fieldsString
|
|
33
|
+
const fieldDefs = fieldsString
|
|
34
|
+
.split(' ')
|
|
35
|
+
.filter((fieldDefinition) => fieldDefinition.trim() !== '')
|
|
36
|
+
.filter((fieldDefinition) => {
|
|
37
|
+
const fieldName = (0, naming_utils_1.toCamelCase)(fieldDefinition.split(':')[0]?.trim() ?? '');
|
|
38
|
+
return !BASE_ENTITY_FIELD_NAMES.has(fieldName);
|
|
39
|
+
});
|
|
23
40
|
let hasEmail = false;
|
|
24
41
|
let hasDate = false;
|
|
25
42
|
let hasEnum = false;
|
|
26
43
|
let hasRelation = false;
|
|
44
|
+
let hasMoney = false;
|
|
45
|
+
let hasServerOwned = false;
|
|
27
46
|
const fields = fieldDefs.map((fieldDef) => {
|
|
28
47
|
const parts = fieldDef.split(':');
|
|
29
48
|
const name = parts[0]?.trim();
|
|
@@ -36,6 +55,8 @@ function parseFields(fieldsString) {
|
|
|
36
55
|
const baseType = isArray ? typeWithArray.slice(0, -2) : typeWithArray;
|
|
37
56
|
const isOptional = modifiers.includes('optional');
|
|
38
57
|
const isUnique = modifiers.includes('unique');
|
|
58
|
+
const isMoney = baseType.toLowerCase() === 'money';
|
|
59
|
+
const isServerOwned = modifiers.includes('serverOwned') || modifiers.includes('internal');
|
|
39
60
|
// Check for relation type
|
|
40
61
|
const relationTypes = ['OneToOne', 'OneToMany', 'ManyToOne', 'ManyToMany'];
|
|
41
62
|
const relationTypeModifier = modifiers.find((m) => relationTypes.includes(m));
|
|
@@ -53,7 +74,9 @@ function parseFields(fieldsString) {
|
|
|
53
74
|
relationInverse = modifiers.find((m) => !relationTypes.includes(m) &&
|
|
54
75
|
m !== relationTarget &&
|
|
55
76
|
m !== 'optional' &&
|
|
56
|
-
m !== 'unique'
|
|
77
|
+
m !== 'unique' &&
|
|
78
|
+
m !== 'serverOwned' &&
|
|
79
|
+
m !== 'internal');
|
|
57
80
|
}
|
|
58
81
|
else {
|
|
59
82
|
// Legacy format or uuid:relation
|
|
@@ -83,6 +106,10 @@ function parseFields(fieldsString) {
|
|
|
83
106
|
hasEnum = true;
|
|
84
107
|
if (isRelation)
|
|
85
108
|
hasRelation = true;
|
|
109
|
+
if (isMoney)
|
|
110
|
+
hasMoney = true;
|
|
111
|
+
if (isServerOwned)
|
|
112
|
+
hasServerOwned = true;
|
|
86
113
|
const camelCase = (0, naming_utils_1.toCamelCase)(name);
|
|
87
114
|
const snakeCase = (0, naming_utils_1.toSnakeCase)(name);
|
|
88
115
|
const pascalCase = name.charAt(0).toUpperCase() + (0, naming_utils_1.toCamelCase)(name).slice(1);
|
|
@@ -102,6 +129,8 @@ function parseFields(fieldsString) {
|
|
|
102
129
|
isRequired: !isOptional,
|
|
103
130
|
isOptional,
|
|
104
131
|
isUnique,
|
|
132
|
+
isMoney,
|
|
133
|
+
isServerOwned,
|
|
105
134
|
isArray,
|
|
106
135
|
validators,
|
|
107
136
|
description: generateDescription(name, baseType),
|
|
@@ -113,7 +142,7 @@ function parseFields(fieldsString) {
|
|
|
113
142
|
relationInverse,
|
|
114
143
|
};
|
|
115
144
|
});
|
|
116
|
-
return { fields, hasEmail, hasDate, hasEnum, hasRelation };
|
|
145
|
+
return { fields, hasEmail, hasDate, hasEnum, hasRelation, hasMoney, hasServerOwned };
|
|
117
146
|
}
|
|
118
147
|
function mapToTsType(type, enumValues) {
|
|
119
148
|
const typeMap = {
|
|
@@ -123,6 +152,7 @@ function mapToTsType(type, enumValues) {
|
|
|
123
152
|
integer: 'number',
|
|
124
153
|
float: 'number',
|
|
125
154
|
decimal: 'number',
|
|
155
|
+
money: 'string',
|
|
126
156
|
boolean: 'boolean',
|
|
127
157
|
bool: 'boolean',
|
|
128
158
|
date: 'Date',
|
|
@@ -143,6 +173,7 @@ function mapToDbType(type, isArray) {
|
|
|
143
173
|
integer: 'int',
|
|
144
174
|
float: 'float',
|
|
145
175
|
decimal: 'decimal',
|
|
176
|
+
money: 'decimal',
|
|
146
177
|
boolean: 'boolean',
|
|
147
178
|
bool: 'boolean',
|
|
148
179
|
date: 'date',
|
|
@@ -164,6 +195,7 @@ function mapToPrismaType(type, isArray) {
|
|
|
164
195
|
integer: 'Int',
|
|
165
196
|
float: 'Float',
|
|
166
197
|
decimal: 'Decimal',
|
|
198
|
+
money: 'Decimal',
|
|
167
199
|
boolean: 'Boolean',
|
|
168
200
|
bool: 'Boolean',
|
|
169
201
|
date: 'DateTime',
|
|
@@ -254,6 +286,11 @@ function generateValidators(name, type, isOptional, _isUnique, isArray, enumValu
|
|
|
254
286
|
validators.push('@Min(-1e15)');
|
|
255
287
|
validators.push('@Max(1e15)');
|
|
256
288
|
break;
|
|
289
|
+
case 'money':
|
|
290
|
+
validators.push('@IsString()');
|
|
291
|
+
validators.push("@IsDecimal({ decimal_digits: '0,18', force_decimal: false })");
|
|
292
|
+
validators.push('@MaxLength(64)');
|
|
293
|
+
break;
|
|
257
294
|
case 'boolean':
|
|
258
295
|
case 'bool':
|
|
259
296
|
validators.push('@IsBoolean()');
|
|
@@ -297,16 +334,20 @@ function generateRelationDecorator(f) {
|
|
|
297
334
|
return ` // Unknown relation type for ${camelCase}`;
|
|
298
335
|
}
|
|
299
336
|
}
|
|
300
|
-
function generateDescription(name,
|
|
337
|
+
function generateDescription(name, type) {
|
|
301
338
|
const readableName = name
|
|
302
339
|
.replace(/([A-Z])/g, ' $1')
|
|
303
340
|
.replace(/[_-]/g, ' ')
|
|
304
341
|
.trim()
|
|
305
342
|
.toLowerCase();
|
|
306
|
-
return
|
|
343
|
+
return type.toLowerCase() === 'money'
|
|
344
|
+
? `The ${readableName} of the entity as an exact decimal string`
|
|
345
|
+
: `The ${readableName} of the entity`;
|
|
307
346
|
}
|
|
308
347
|
function generateExample(name, type) {
|
|
309
348
|
const lowerName = name.toLowerCase();
|
|
349
|
+
if (type.toLowerCase() === 'money')
|
|
350
|
+
return '1250.00';
|
|
310
351
|
if (lowerName.includes('email'))
|
|
311
352
|
return 'user@example.com';
|
|
312
353
|
if (lowerName.includes('name'))
|
|
@@ -350,6 +391,7 @@ function generateFieldsTemplateData(fields) {
|
|
|
350
391
|
.map((f) => ` ${f.camelCase}${f.isOptional ? '?' : ''}: ${f.tsType};`)
|
|
351
392
|
.join('\n');
|
|
352
393
|
const dtoProperties = fields
|
|
394
|
+
.filter((field) => !field.isServerOwned)
|
|
353
395
|
.map((f) => {
|
|
354
396
|
const decorators = [
|
|
355
397
|
` @ApiProperty({ description: "${f.description}"${f.example ? `, example: "${f.example}"` : ''} })`,
|
|
@@ -378,11 +420,11 @@ function generateFieldsTemplateData(fields) {
|
|
|
378
420
|
.join('\n\n');
|
|
379
421
|
const migrationColumns = fields
|
|
380
422
|
.map((f) => {
|
|
423
|
+
const uniqueLine = f.isUnique ? '\n isUnique: true,' : '';
|
|
381
424
|
return ` {
|
|
382
425
|
name: "${f.snakeCase}",
|
|
383
426
|
type: "${f.dbType}",
|
|
384
|
-
isNullable: ${f.isOptional}
|
|
385
|
-
${f.isUnique ? 'isUnique: true,' : ''}
|
|
427
|
+
isNullable: ${f.isOptional},${uniqueLine}
|
|
386
428
|
},`;
|
|
387
429
|
})
|
|
388
430
|
.join('\n');
|