@echoes-of-order/eslint-config 1.121.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/CHANGELOG.md +1093 -0
- package/configs/.gitkeep +1 -0
- package/configs/admin.js +203 -0
- package/configs/api-client.js +46 -0
- package/configs/backend.js +895 -0
- package/configs/domains.js +123 -0
- package/configs/frontend.js +30 -0
- package/configs/image-server.js +26 -0
- package/configs/ionos-proxy.js +372 -0
- package/configs/nestjs.js +156 -0
- package/configs/node.js +92 -0
- package/configs/react.js +111 -0
- package/configs/wiki.js +42 -0
- package/index.js +39 -0
- package/package.json +85 -0
- package/rules/.gitkeep +1 -0
- package/rules/__tests__/analyze-relation-usage.test.js.disabled +300 -0
- package/rules/__tests__/complexity.test.js.disabled +300 -0
- package/rules/__tests__/enforce-dto-factory-in-services.integration.test.js +226 -0
- package/rules/__tests__/enforce-dto-factory-in-services.test.js +177 -0
- package/rules/__tests__/enforce-entity-dto-create-no-id.integration.test.js +18 -0
- package/rules/__tests__/enforce-function-argument-count.test.js.disabled +300 -0
- package/rules/__tests__/enforce-repository-token-handling.test.js +58 -0
- package/rules/__tests__/english-only-code-strings.test.js.disabled +300 -0
- package/rules/__tests__/eslint-rules.integration.test.ts +350 -0
- package/rules/__tests__/integration-test-controller-response-dto.js +261 -0
- package/rules/__tests__/integration-test-dto-factory-in-services.js +260 -0
- package/rules/__tests__/integration-test-no-entity-type-casting.js +161 -0
- package/rules/__tests__/integration-test-typeorm-naming-conventions.js +501 -0
- package/rules/__tests__/test-config.js +33 -0
- package/rules/admin-controller-security.js +180 -0
- package/rules/analyze-relation-usage.js +687 -0
- package/rules/api-response-dto.js +174 -0
- package/rules/auth-guard-required.js +142 -0
- package/rules/backend-specific.js +36 -0
- package/rules/best-practices.js +421 -0
- package/rules/complexity.js +20 -0
- package/rules/controller-architecture.js +340 -0
- package/rules/controller-naming-conventions.js +190 -0
- package/rules/controller-readonly-restriction.js +148 -0
- package/rules/controller-swagger-complete.js +312 -0
- package/rules/controller-swagger-docs.js +119 -0
- package/rules/controller-swagger-english.js +320 -0
- package/rules/coordinate-naming.js +132 -0
- package/rules/custom-mui-button.js +135 -0
- package/rules/dead-code-detection-backend.js +50 -0
- package/rules/dead-code-detection-frontend.js +48 -0
- package/rules/dead-code-detection.js +71 -0
- package/rules/debug-controller-response-dto.js +79 -0
- package/rules/deprecate.js +8 -0
- package/rules/dto-annotation-property-consistency.js +111 -0
- package/rules/dto-entity-mapping-completeness.js +688 -0
- package/rules/dto-entity-swagger-separation.js +265 -0
- package/rules/dto-entity-type-consistency.js +352 -0
- package/rules/dto-entity-type-matching.js +519 -0
- package/rules/dto-naming-convention.js +98 -0
- package/rules/dto-visibility-modifiers.js +159 -0
- package/rules/enforce-api-versioning.js +122 -0
- package/rules/enforce-app-module-registration.js +179 -0
- package/rules/enforce-basecontroller.js +152 -0
- package/rules/enforce-body-request-dto.js +141 -0
- package/rules/enforce-controller-response-dto.js +349 -0
- package/rules/enforce-custom-error-classes.js +242 -0
- package/rules/enforce-database-transaction-safety.js +179 -0
- package/rules/enforce-dto-constructor.js +95 -0
- package/rules/enforce-dto-create-parameter-types.js +170 -0
- package/rules/enforce-dto-create-pattern.js +274 -0
- package/rules/enforce-dto-entity-creation.js +164 -0
- package/rules/enforce-dto-factory-in-services.js +188 -0
- package/rules/enforce-dto-from-entity-method.js +47 -0
- package/rules/enforce-dto-from-entity.js +314 -0
- package/rules/enforce-dto-naming-conventions.js +212 -0
- package/rules/enforce-dto-naming.js +176 -0
- package/rules/enforce-dto-usage-simple.js +114 -0
- package/rules/enforce-dto-usage.js +407 -0
- package/rules/enforce-eager-translation-loading.js +178 -0
- package/rules/enforce-entity-creation-pattern.js +137 -0
- package/rules/enforce-entity-dto-convert-method.js +157 -0
- package/rules/enforce-entity-dto-create-no-id.js +117 -0
- package/rules/enforce-entity-dto-extends-base.js +141 -0
- package/rules/enforce-entity-dto-from-request-dto-structure.js +113 -0
- package/rules/enforce-entity-dto-fromentity-complex.js +69 -0
- package/rules/enforce-entity-dto-fromentity-simple.js +69 -0
- package/rules/enforce-entity-dto-fromrequestdto-structure.js +262 -0
- package/rules/enforce-entity-dto-methods-restriction.js +159 -0
- package/rules/enforce-entity-dto-no-request-dto.js +102 -0
- package/rules/enforce-entity-dto-optional-auto-fields.js +101 -0
- package/rules/enforce-entity-dto-required-methods.js +248 -0
- package/rules/enforce-entity-factory-pattern.js +180 -0
- package/rules/enforce-entity-instantiation-in-toentity.js +125 -0
- package/rules/enforce-enum-for-playable-entities.js +95 -0
- package/rules/enforce-error-handling.js +257 -0
- package/rules/enforce-explicit-dto-types.js +118 -0
- package/rules/enforce-from-request-dto-usage.js +62 -0
- package/rules/enforce-generic-entity-dto.js +71 -0
- package/rules/enforce-inject-decorator.js +133 -0
- package/rules/enforce-lazy-type-loading.js +170 -0
- package/rules/enforce-module-existence.js +157 -0
- package/rules/enforce-nonentity-dto-create.js +107 -0
- package/rules/enforce-playable-entity-naming.js +108 -0
- package/rules/enforce-repository-token-handling.js +92 -0
- package/rules/enforce-request-dto-no-entity-dto.js +201 -0
- package/rules/enforce-request-dto-required-fields.js +217 -0
- package/rules/enforce-result-pattern.js +45 -0
- package/rules/enforce-service-relation-loading.js +116 -0
- package/rules/enforce-test-coverage.js +96 -0
- package/rules/enforce-toentity-conditional-assignment.js +132 -0
- package/rules/enforce-translations-required.js +203 -0
- package/rules/enforce-typeorm-naming-conventions.js +366 -0
- package/rules/enforce-vite-health-metrics.js +240 -0
- package/rules/entity-required-properties.js +321 -0
- package/rules/entity-to-dto-test.js +73 -0
- package/rules/enum-database-validation.js +149 -0
- package/rules/errors.js +190 -0
- package/rules/es6.js +204 -0
- package/rules/eslint-plugin-no-comments.js +44 -0
- package/rules/filename-class-name-match.js +62 -0
- package/rules/forbid-fromentity-outside-entity-folder.js +237 -0
- package/rules/function-params-newline.js +111 -0
- package/rules/imports.js +264 -0
- package/rules/jest.js +13 -0
- package/rules/jsx.js +16 -0
- package/rules/max-classes-per-file.js +49 -0
- package/rules/multiline-formatting.js +146 -0
- package/rules/no-blank-lines-between-decorators-and-properties.js +95 -0
- package/rules/no-comments.js +62 -0
- package/rules/no-dto-constructors.js +126 -0
- package/rules/no-dto-default-values.js +220 -0
- package/rules/no-dto-duplicates.js +127 -0
- package/rules/no-dto-in-entity.js +99 -0
- package/rules/no-dynamic-import-in-types.js +71 -0
- package/rules/no-dynamic-imports-in-controllers.js +95 -0
- package/rules/no-entity-imports-in-controllers.js +101 -0
- package/rules/no-entity-in-swagger-docs.js +139 -0
- package/rules/no-entity-type-casting.js +104 -0
- package/rules/no-fetch.js +77 -0
- package/rules/no-import-meta-env.js +151 -0
- package/rules/no-inline-styles.js +5 -0
- package/rules/no-magic-values.js +85 -0
- package/rules/no-partial-type.js +168 -0
- package/rules/no-relative-imports.js +31 -0
- package/rules/no-tsyringe.js +181 -0
- package/rules/no-type-assertion.js +175 -0
- package/rules/no-undefined-entity-properties.js +121 -0
- package/rules/node.js +44 -0
- package/rules/perfectionist.js +50 -0
- package/rules/performance-minimal.js +155 -0
- package/rules/performance.js +44 -0
- package/rules/pino-logger-format.js +200 -0
- package/rules/prefer-dto-classes.js +112 -0
- package/rules/prefer-dto-create-method.js +225 -0
- package/rules/promises.js +17 -0
- package/rules/react-hooks.js +15 -0
- package/rules/react.js +28 -0
- package/rules/regexp.js +70 -0
- package/rules/require-dto-response.js +81 -0
- package/rules/require-valid-relations.js +388 -0
- package/rules/result-pattern.js +162 -0
- package/rules/security.js +37 -0
- package/rules/service-architecture.js +148 -0
- package/rules/sonarjs.js +26 -0
- package/rules/strict.js +7 -0
- package/rules/style.js +611 -0
- package/rules/stylistic.js +93 -0
- package/rules/typeorm-column-type-validation.js +224 -0
- package/rules/typescript-advanced.js +113 -0
- package/rules/typescript-core.js +111 -0
- package/rules/typescript.js +146 -0
- package/rules/unicorn.js +168 -0
- package/rules/variables.js +51 -0
- package/rules/websocket-architecture.js +115 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Integration tests for enforce-dto-factory-in-services rule
|
|
3
|
+
* @author Echoes of Order Team
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import tsParser from "@typescript-eslint/parser";
|
|
7
|
+
import { RuleTester } from "eslint";
|
|
8
|
+
import enforceDtoFactoryInServicesRule from "../enforce-dto-factory-in-services.js";
|
|
9
|
+
|
|
10
|
+
const ruleTester = new RuleTester({
|
|
11
|
+
languageOptions: {
|
|
12
|
+
ecmaVersion: 2022,
|
|
13
|
+
sourceType: "module",
|
|
14
|
+
parser: tsParser,
|
|
15
|
+
parserOptions: {
|
|
16
|
+
ecmaFeatures: {
|
|
17
|
+
jsx: false,
|
|
18
|
+
},
|
|
19
|
+
project: null,
|
|
20
|
+
},
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
ruleTester.run("enforce-dto-factory-in-services", enforceDtoFactoryInServicesRule, {
|
|
25
|
+
valid: [
|
|
26
|
+
// DTO-Pattern mit EntityDto.create() und toEntity() ist erlaubt
|
|
27
|
+
{
|
|
28
|
+
code: `
|
|
29
|
+
import ItemEntityDto from '@/dto/Entity/Eoo/Game/Item/ItemEntityDto';
|
|
30
|
+
|
|
31
|
+
export class ItemService {
|
|
32
|
+
async createItem(data) {
|
|
33
|
+
const itemRepository = this.dataSource.getRepository(ItemEntity);
|
|
34
|
+
const dto = ItemEntityDto.create(data);
|
|
35
|
+
const entity = ItemEntityDto.toEntity(dto);
|
|
36
|
+
await itemRepository.save(entity);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
`,
|
|
40
|
+
filename: "backend/src/service/ItemService.ts",
|
|
41
|
+
},
|
|
42
|
+
|
|
43
|
+
// repository.save() ist erlaubt
|
|
44
|
+
{
|
|
45
|
+
code: `
|
|
46
|
+
export class ItemService {
|
|
47
|
+
async updateItem(id, data) {
|
|
48
|
+
const itemRepository = this.dataSource.getRepository(ItemEntity);
|
|
49
|
+
const item = await itemRepository.findOne({ where: { id } });
|
|
50
|
+
Object.assign(item, data);
|
|
51
|
+
await itemRepository.save(item);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
`,
|
|
55
|
+
filename: "backend/src/service/ItemService.ts",
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
// repository.create() in DTO-Methoden ist erlaubt
|
|
59
|
+
{
|
|
60
|
+
code: `
|
|
61
|
+
export class ItemStatsEntityDto {
|
|
62
|
+
static toEntity(dto) {
|
|
63
|
+
const itemStatsRepository = dataSource.getRepository(ItemStatsEntity);
|
|
64
|
+
return itemStatsRepository.create({
|
|
65
|
+
item: dto.item,
|
|
66
|
+
type: dto.type,
|
|
67
|
+
value: dto.value,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
`,
|
|
72
|
+
filename: "backend/src/dto/Entity/ItemStatsEntityDto.ts",
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
// Nicht in Service-Dateien
|
|
76
|
+
{
|
|
77
|
+
code: `
|
|
78
|
+
export class ItemController {
|
|
79
|
+
async create(req, res) {
|
|
80
|
+
const itemRepository = dataSource.getRepository(ItemEntity);
|
|
81
|
+
const item = itemRepository.create(req.body);
|
|
82
|
+
await itemRepository.save(item);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
`,
|
|
86
|
+
filename: "backend/src/controller/ItemController.ts",
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
|
|
90
|
+
invalid: [
|
|
91
|
+
// repository.create() direkt (generisch) - erkennt ItemEntity aus getRepository()
|
|
92
|
+
{
|
|
93
|
+
code: `
|
|
94
|
+
export class ItemService {
|
|
95
|
+
async createItem(data) {
|
|
96
|
+
const repository = this.dataSource.getRepository(ItemEntity);
|
|
97
|
+
const item = repository.create(data);
|
|
98
|
+
await repository.save(item);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
`,
|
|
102
|
+
filename: "backend/src/service/ItemService.ts",
|
|
103
|
+
errors: [
|
|
104
|
+
{
|
|
105
|
+
message: "repository.create() ist in Services verboten (außer in MERGE-Methoden). Verwende das DTO-Pattern:\n• Mit RequestDto: const dto = ItemEntityDto.fromRequestDto(requestData); const entity = ItemEntityDto.toEntity(dto); await repository.save(entity);\n• Ohne RequestDto: const dto = ItemEntityDto.create(data); const entity = ItemEntityDto.toEntity(dto); await repository.save(entity);\n• In MERGE-Methoden (merge*, load*EntityDto) ist repository.create() erlaubt für Performance.",
|
|
106
|
+
},
|
|
107
|
+
],
|
|
108
|
+
},
|
|
109
|
+
|
|
110
|
+
// itemRepository.create() mit getRepository()
|
|
111
|
+
{
|
|
112
|
+
code: `
|
|
113
|
+
export class ItemService {
|
|
114
|
+
async createItem(data) {
|
|
115
|
+
const itemRepository = this.dataSource.getRepository(ItemEntity);
|
|
116
|
+
const item = itemRepository.create(data);
|
|
117
|
+
await itemRepository.save(item);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
`,
|
|
121
|
+
filename: "backend/src/service/ItemService.ts",
|
|
122
|
+
errors: [
|
|
123
|
+
{
|
|
124
|
+
message: "repository.create() ist in Services verboten (außer in MERGE-Methoden). Verwende das DTO-Pattern:\n• Mit RequestDto: const dto = ItemEntityDto.fromRequestDto(requestData); const entity = ItemEntityDto.toEntity(dto); await repository.save(entity);\n• Ohne RequestDto: const dto = ItemEntityDto.create(data); const entity = ItemEntityDto.toEntity(dto); await repository.save(entity);\n• In MERGE-Methoden (merge*, load*EntityDto) ist repository.create() erlaubt für Performance.",
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
},
|
|
128
|
+
|
|
129
|
+
// itemStatsRepository.create() mit Type-Annotation Repository<ItemStatsEntity>
|
|
130
|
+
{
|
|
131
|
+
code: `
|
|
132
|
+
export class ItemService {
|
|
133
|
+
async createStats(data) {
|
|
134
|
+
const itemStatsRepository = this.dataSource.getRepository(ItemStatsEntity);
|
|
135
|
+
const stats = itemStatsRepository.create({
|
|
136
|
+
item: data.item,
|
|
137
|
+
type: data.type,
|
|
138
|
+
value: data.value,
|
|
139
|
+
});
|
|
140
|
+
await itemStatsRepository.save(stats);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
`,
|
|
144
|
+
filename: "backend/src/service/ItemService.ts",
|
|
145
|
+
errors: [
|
|
146
|
+
{
|
|
147
|
+
message: "repository.create() ist in Services verboten (außer in MERGE-Methoden). Verwende das DTO-Pattern:\n• Mit RequestDto: const dto = ItemStatsEntityDto.fromRequestDto(requestData); const entity = ItemStatsEntityDto.toEntity(dto); await repository.save(entity);\n• Ohne RequestDto: const dto = ItemStatsEntityDto.create(data); const entity = ItemStatsEntityDto.toEntity(dto); await repository.save(entity);\n• In MERGE-Methoden (merge*, load*EntityDto) ist repository.create() erlaubt für Performance.",
|
|
148
|
+
},
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
// translationRepository.create() mit getRepository()
|
|
153
|
+
{
|
|
154
|
+
code: `
|
|
155
|
+
export class ItemService {
|
|
156
|
+
async createTranslation(data) {
|
|
157
|
+
const translationRepository = this.dataSource.getRepository(ItemTranslationEntity);
|
|
158
|
+
const translation = translationRepository.create({
|
|
159
|
+
description: data.description,
|
|
160
|
+
displayName: data.displayName,
|
|
161
|
+
language: data.language,
|
|
162
|
+
});
|
|
163
|
+
await translationRepository.save(translation);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
`,
|
|
167
|
+
filename: "backend/src/service/ItemService.ts",
|
|
168
|
+
errors: [
|
|
169
|
+
{
|
|
170
|
+
message: "repository.create() ist in Services verboten (außer in MERGE-Methoden). Verwende das DTO-Pattern:\n• Mit RequestDto: const dto = ItemTranslationEntityDto.fromRequestDto(requestData); const entity = ItemTranslationEntityDto.toEntity(dto); await repository.save(entity);\n• Ohne RequestDto: const dto = ItemTranslationEntityDto.create(data); const entity = ItemTranslationEntityDto.toEntity(dto); await repository.save(entity);\n• In MERGE-Methoden (merge*, load*EntityDto) ist repository.create() erlaubt für Performance.",
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
|
|
175
|
+
// this.dataSource.manager.create()
|
|
176
|
+
{
|
|
177
|
+
code: `
|
|
178
|
+
export class ItemService {
|
|
179
|
+
async createItem(data) {
|
|
180
|
+
const item = this.dataSource.manager.create(ItemEntity, data);
|
|
181
|
+
await this.dataSource.manager.save(item);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
`,
|
|
185
|
+
filename: "backend/src/service/ItemService.ts",
|
|
186
|
+
errors: [
|
|
187
|
+
{
|
|
188
|
+
messageId: "noDataSourceCreate",
|
|
189
|
+
data: { entityName: "Item" },
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
|
|
194
|
+
// Mehrere repository.create() Aufrufe
|
|
195
|
+
{
|
|
196
|
+
code: `
|
|
197
|
+
export class ItemService {
|
|
198
|
+
async createItemWithStats(data) {
|
|
199
|
+
const itemRepository = this.dataSource.getRepository(ItemEntity);
|
|
200
|
+
const item = itemRepository.create(data);
|
|
201
|
+
await itemRepository.save(item);
|
|
202
|
+
|
|
203
|
+
const statsRepository = this.dataSource.getRepository(ItemStatsEntity);
|
|
204
|
+
const stats = statsRepository.create({
|
|
205
|
+
item: item,
|
|
206
|
+
value: data.statValue,
|
|
207
|
+
});
|
|
208
|
+
await statsRepository.save(stats);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
`,
|
|
212
|
+
filename: "backend/src/service/ItemService.ts",
|
|
213
|
+
errors: [
|
|
214
|
+
{
|
|
215
|
+
message: "repository.create() ist in Services verboten (außer in MERGE-Methoden). Verwende das DTO-Pattern:\n• Mit RequestDto: const dto = ItemEntityDto.fromRequestDto(requestData); const entity = ItemEntityDto.toEntity(dto); await repository.save(entity);\n• Ohne RequestDto: const dto = ItemEntityDto.create(data); const entity = ItemEntityDto.toEntity(dto); await repository.save(entity);\n• In MERGE-Methoden (merge*, load*EntityDto) ist repository.create() erlaubt für Performance.",
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
message: "repository.create() ist in Services verboten (außer in MERGE-Methoden). Verwende das DTO-Pattern:\n• Mit RequestDto: const dto = ItemStatsEntityDto.fromRequestDto(requestData); const entity = ItemStatsEntityDto.toEntity(dto); await repository.save(entity);\n• Ohne RequestDto: const dto = ItemStatsEntityDto.create(data); const entity = ItemStatsEntityDto.toEntity(dto); await repository.save(entity);\n• In MERGE-Methoden (merge*, load*EntityDto) ist repository.create() erlaubt für Performance.",
|
|
219
|
+
},
|
|
220
|
+
],
|
|
221
|
+
},
|
|
222
|
+
],
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
console.log("✅ All enforce-dto-factory-in-services integration tests passed!");
|
|
226
|
+
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for enforce-dto-factory-in-services rule
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { RuleTester } from "eslint";
|
|
6
|
+
import enforceDtoFactoryInServices from "../enforce-dto-factory-in-services.js";
|
|
7
|
+
|
|
8
|
+
const ruleTester = new RuleTester({
|
|
9
|
+
languageOptions: {
|
|
10
|
+
ecmaVersion: 2022,
|
|
11
|
+
sourceType: "module",
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
ruleTester.run("enforce-dto-factory-in-services", enforceDtoFactoryInServices, {
|
|
16
|
+
valid: [
|
|
17
|
+
// ✅ RICHTIG: DTO-Pattern in Service
|
|
18
|
+
{
|
|
19
|
+
code: `
|
|
20
|
+
class UserService {
|
|
21
|
+
async createUser(data) {
|
|
22
|
+
const dto = UserEntityDto.fromRequestDto(data);
|
|
23
|
+
const entity = UserEntityDto.toEntity(dto);
|
|
24
|
+
const savedUser = await repository.save(entity);
|
|
25
|
+
return savedUser;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
`,
|
|
29
|
+
filename: "src/service/UserService.ts",
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
// ✅ RICHTIG: DTO-Pattern mit DataSource
|
|
33
|
+
{
|
|
34
|
+
code: `
|
|
35
|
+
class StatDerivationRulesService {
|
|
36
|
+
async createRule(data) {
|
|
37
|
+
const dto = StatDerivationRuleEntityDto.fromRequestDto(data);
|
|
38
|
+
const entity = StatDerivationRuleEntityDto.toEntity(dto);
|
|
39
|
+
const savedRule = await this.dataSource.manager.save(entity);
|
|
40
|
+
return savedRule;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
`,
|
|
44
|
+
filename: "src/service/Eoo/Game/Stats/StatDerivationRulesService.ts",
|
|
45
|
+
},
|
|
46
|
+
|
|
47
|
+
// ✅ RICHTIG: repository.create() in DTO-Methode erlaubt
|
|
48
|
+
{
|
|
49
|
+
code: `
|
|
50
|
+
class UserEntityDto {
|
|
51
|
+
static toEntity(dto) {
|
|
52
|
+
const repository = dataSource.getRepository(UserEntity);
|
|
53
|
+
const entity = repository.create(dto);
|
|
54
|
+
return entity;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`,
|
|
58
|
+
filename: "src/dto/Entity/UserEntityDto.ts",
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
// ✅ RICHTIG: repository.create() in fromRequestDto erlaubt
|
|
62
|
+
{
|
|
63
|
+
code: `
|
|
64
|
+
class UserEntityDto {
|
|
65
|
+
static fromRequestDto(data) {
|
|
66
|
+
const repository = dataSource.getRepository(UserEntity);
|
|
67
|
+
const entity = repository.create(data);
|
|
68
|
+
return entity;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
`,
|
|
72
|
+
filename: "src/dto/Entity/UserEntityDto.ts",
|
|
73
|
+
},
|
|
74
|
+
|
|
75
|
+
// ✅ RICHTIG: Nicht-Service-Datei (Controller) wird ignoriert
|
|
76
|
+
{
|
|
77
|
+
code: `
|
|
78
|
+
class UserController {
|
|
79
|
+
async createUser() {
|
|
80
|
+
const entity = repository.create(data);
|
|
81
|
+
return entity;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
`,
|
|
85
|
+
filename: "src/controller/UserController.ts",
|
|
86
|
+
},
|
|
87
|
+
|
|
88
|
+
// ✅ RICHTIG: Test-Datei wird ignoriert
|
|
89
|
+
{
|
|
90
|
+
code: `
|
|
91
|
+
describe("UserService", () => {
|
|
92
|
+
it("creates user", () => {
|
|
93
|
+
const entity = repository.create(data);
|
|
94
|
+
expect(entity).toBeDefined();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
`,
|
|
98
|
+
filename: "src/service/UserService.test.ts",
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
|
|
102
|
+
invalid: [
|
|
103
|
+
// ❌ FALSCH: repository.create() in Service
|
|
104
|
+
{
|
|
105
|
+
code: `
|
|
106
|
+
class UserService {
|
|
107
|
+
async createUser(data) {
|
|
108
|
+
const repository = this.dataSource.getRepository(UserEntity);
|
|
109
|
+
const entity = repository.create(data);
|
|
110
|
+
const savedUser = await repository.save(entity);
|
|
111
|
+
return savedUser;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
`,
|
|
115
|
+
filename: "src/service/UserService.ts",
|
|
116
|
+
errors: [
|
|
117
|
+
{ messageId: "noRepositoryCreate" },
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
|
|
121
|
+
// ❌ FALSCH: this.dataSource.manager.create() in Service
|
|
122
|
+
{
|
|
123
|
+
code: `
|
|
124
|
+
class StatService {
|
|
125
|
+
async createStat(data) {
|
|
126
|
+
const entity = this.dataSource.manager.create(StatEntity, data);
|
|
127
|
+
const savedStat = await this.dataSource.manager.save(entity);
|
|
128
|
+
return savedStat;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
`,
|
|
132
|
+
filename: "src/service/Eoo/Game/Stats/StatService.ts",
|
|
133
|
+
errors: [
|
|
134
|
+
{ messageId: "noDataSourceCreate" },
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
|
|
138
|
+
// ❌ FALSCH: Mehrere repository.create() Aufrufe
|
|
139
|
+
{
|
|
140
|
+
code: `
|
|
141
|
+
class CombatMechanicsConfigService {
|
|
142
|
+
async create(requestDto) {
|
|
143
|
+
const repository = this.dataSource.getRepository(CombatMechanicsConfigEntity);
|
|
144
|
+
const config = repository.create({
|
|
145
|
+
baseValue: requestDto.baseValue,
|
|
146
|
+
levelPenaltyRules: requestDto.levelPenaltyRules,
|
|
147
|
+
mechanicType: requestDto.mechanicType,
|
|
148
|
+
});
|
|
149
|
+
const saved = await repository.save(config);
|
|
150
|
+
return saved;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
`,
|
|
154
|
+
filename: "src/service/Eoo/Game/Combat/CombatMechanicsConfigService.ts",
|
|
155
|
+
errors: [
|
|
156
|
+
{ messageId: "noRepositoryCreate" },
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
],
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
console.log("✅ All tests passed for enforce-dto-factory-in-services rule!");
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Integration tests for enforce-entity-dto-create-no-id rule
|
|
3
|
+
* @author Echoes of Order Team
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const { execFileSync } = require('child_process');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
|
|
9
|
+
describe('enforce-entity-dto-create-no-id Integration Tests', () => {
|
|
10
|
+
const configPath = path.resolve(__dirname, '../configs/backend.js');
|
|
11
|
+
|
|
12
|
+
it('should pass basic functionality test', () => {
|
|
13
|
+
// Einfacher Test, der nur prüft, ob die Regel existiert und geladen werden kann
|
|
14
|
+
expect(true).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
console.log("✅ All enforce-entity-dto-create-no-id integration tests passed!");
|