@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,260 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
|
|
6
|
+
console.log('🧪 ESLint-Plugin Integrationstests für DTO-Factory-in-Services-Regel');
|
|
7
|
+
console.log('=====================================================================');
|
|
8
|
+
console.log('');
|
|
9
|
+
|
|
10
|
+
// Test 1: Korrekte DTO-Pattern-Verwendung
|
|
11
|
+
console.log('📋 Test 1: Korrekte DTO-Pattern-Verwendung in Service');
|
|
12
|
+
console.log('------------------------------------------------------');
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const correctServiceContent = `
|
|
16
|
+
import { Injectable, Inject } from '@nestjs/common';
|
|
17
|
+
import { DataSource } from 'typeorm';
|
|
18
|
+
import UserEntityDto from '@/dto/Entity/UserEntityDto';
|
|
19
|
+
import UserEntity from '@/entity/UserEntity';
|
|
20
|
+
|
|
21
|
+
@Injectable()
|
|
22
|
+
export class UserService {
|
|
23
|
+
constructor(@Inject(DataSource) private dataSource: DataSource) {}
|
|
24
|
+
|
|
25
|
+
async createUser(data) {
|
|
26
|
+
const repository = this.dataSource.getRepository(UserEntity);
|
|
27
|
+
|
|
28
|
+
const dto = UserEntityDto.fromRequestDto(data);
|
|
29
|
+
const entity = UserEntityDto.toEntity(dto);
|
|
30
|
+
const savedUser = await repository.save(entity);
|
|
31
|
+
|
|
32
|
+
return savedUser;
|
|
33
|
+
}
|
|
34
|
+
}`;
|
|
35
|
+
|
|
36
|
+
fs.writeFileSync('/app/backend/src/service/TestCorrectService.ts', correctServiceContent);
|
|
37
|
+
|
|
38
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/service/TestCorrectService.ts --no-color', {
|
|
39
|
+
encoding: 'utf8',
|
|
40
|
+
stdio: 'pipe'
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
console.log('✅ Korrekte DTO-Pattern-Verwendung: Keine Fehler');
|
|
44
|
+
console.log(' - EntityDto.fromRequestDto() → toEntity() → save()');
|
|
45
|
+
|
|
46
|
+
} catch (error) {
|
|
47
|
+
if (error.stdout && error.stdout.includes('enforce-dto-factory-in-services')) {
|
|
48
|
+
console.log('❌ DTO-Pattern-Verwendung wird fälschlicherweise als Fehler erkannt:');
|
|
49
|
+
console.log(' ', error.stdout.split('\n').filter(line => line.includes('enforce-dto-factory-in-services')).slice(0, 3).join('\n '));
|
|
50
|
+
} else {
|
|
51
|
+
console.log('✅ Korrekte DTO-Pattern-Verwendung: Keine enforce-dto-factory-in-services Fehler');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
console.log('');
|
|
56
|
+
|
|
57
|
+
// Test 2: Verbotene repository.create() Verwendung
|
|
58
|
+
console.log('📋 Test 2: Verbotene repository.create() in Service');
|
|
59
|
+
console.log('---------------------------------------------------');
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const incorrectRepositoryCreateContent = `
|
|
63
|
+
import { Injectable, Inject } from '@nestjs/common';
|
|
64
|
+
import { DataSource } from 'typeorm';
|
|
65
|
+
import UserEntity from '@/entity/UserEntity';
|
|
66
|
+
|
|
67
|
+
@Injectable()
|
|
68
|
+
export class UserService {
|
|
69
|
+
constructor(@Inject(DataSource) private dataSource: DataSource) {}
|
|
70
|
+
|
|
71
|
+
async createUser(data) {
|
|
72
|
+
const repository = this.dataSource.getRepository(UserEntity);
|
|
73
|
+
const entity = repository.create(data);
|
|
74
|
+
const savedUser = await repository.save(entity);
|
|
75
|
+
return savedUser;
|
|
76
|
+
}
|
|
77
|
+
}`;
|
|
78
|
+
|
|
79
|
+
fs.writeFileSync('/app/backend/src/service/TestIncorrectRepositoryCreate.ts', incorrectRepositoryCreateContent);
|
|
80
|
+
|
|
81
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/service/TestIncorrectRepositoryCreate.ts --no-color', {
|
|
82
|
+
encoding: 'utf8',
|
|
83
|
+
stdio: 'pipe'
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
console.log('❌ Unerwartet: repository.create() wurde nicht als Fehler erkannt');
|
|
87
|
+
|
|
88
|
+
} catch (error) {
|
|
89
|
+
if (error.stdout && error.stdout.includes('enforce-dto-factory-in-services')) {
|
|
90
|
+
console.log('✅ Korrekte Fehlererkennung: repository.create() wird korrekt verboten');
|
|
91
|
+
console.log(' - enforce-dto-factory-in-services Regel funktioniert');
|
|
92
|
+
console.log(' - Fehler:', error.stdout.split('\n').filter(line => line.includes('repository.create')).slice(0, 2).join('\n '));
|
|
93
|
+
} else {
|
|
94
|
+
console.log('❌ enforce-dto-factory-in-services Regel erkennt repository.create() nicht');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
console.log('');
|
|
99
|
+
|
|
100
|
+
// Test 3: Verbotene this.dataSource.manager.create() Verwendung
|
|
101
|
+
console.log('📋 Test 3: Verbotene this.dataSource.manager.create() in Service');
|
|
102
|
+
console.log('-----------------------------------------------------------------');
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
const incorrectDataSourceCreateContent = `
|
|
106
|
+
import { Injectable, Inject } from '@nestjs/common';
|
|
107
|
+
import { DataSource } from 'typeorm';
|
|
108
|
+
import UserEntity from '@/entity/UserEntity';
|
|
109
|
+
|
|
110
|
+
@Injectable()
|
|
111
|
+
export class UserService {
|
|
112
|
+
constructor(@Inject(DataSource) private dataSource: DataSource) {}
|
|
113
|
+
|
|
114
|
+
async createUser(data) {
|
|
115
|
+
const entity = this.dataSource.manager.create(UserEntity, data);
|
|
116
|
+
const savedUser = await this.dataSource.manager.save(entity);
|
|
117
|
+
return savedUser;
|
|
118
|
+
}
|
|
119
|
+
}`;
|
|
120
|
+
|
|
121
|
+
fs.writeFileSync('/app/backend/src/service/TestIncorrectDataSourceCreate.ts', incorrectDataSourceCreateContent);
|
|
122
|
+
|
|
123
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/service/TestIncorrectDataSourceCreate.ts --no-color', {
|
|
124
|
+
encoding: 'utf8',
|
|
125
|
+
stdio: 'pipe'
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
console.log('❌ Unerwartet: this.dataSource.manager.create() wurde nicht als Fehler erkannt');
|
|
129
|
+
|
|
130
|
+
} catch (error) {
|
|
131
|
+
if (error.stdout && error.stdout.includes('enforce-dto-factory-in-services')) {
|
|
132
|
+
console.log('✅ Korrekte Fehlererkennung: this.dataSource.manager.create() wird korrekt verboten');
|
|
133
|
+
console.log(' - enforce-dto-factory-in-services Regel funktioniert');
|
|
134
|
+
console.log(' - Fehler:', error.stdout.split('\n').filter(line => line.includes('dataSource.manager.create')).slice(0, 2).join('\n '));
|
|
135
|
+
} else {
|
|
136
|
+
console.log('❌ enforce-dto-factory-in-services Regel erkennt this.dataSource.manager.create() nicht');
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
console.log('');
|
|
141
|
+
|
|
142
|
+
// Test 4: repository.create() in DTO-Methode erlaubt
|
|
143
|
+
console.log('📋 Test 4: repository.create() in DTO-Methode erlaubt');
|
|
144
|
+
console.log('-----------------------------------------------------');
|
|
145
|
+
|
|
146
|
+
try {
|
|
147
|
+
const dtoMethodContent = `
|
|
148
|
+
import UserEntity from '@/entity/UserEntity';
|
|
149
|
+
|
|
150
|
+
export class UserEntityDto {
|
|
151
|
+
static fromRequestDto(data) {
|
|
152
|
+
const repository = dataSource.getRepository(UserEntity);
|
|
153
|
+
const entity = repository.create(data);
|
|
154
|
+
return this.fromEntity(entity);
|
|
155
|
+
}
|
|
156
|
+
}`;
|
|
157
|
+
|
|
158
|
+
fs.writeFileSync('/app/backend/src/dto/TestDtoMethod.ts', dtoMethodContent);
|
|
159
|
+
|
|
160
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/dto/TestDtoMethod.ts --no-color', {
|
|
161
|
+
encoding: 'utf8',
|
|
162
|
+
stdio: 'pipe'
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
console.log('✅ repository.create() in DTO-Methode: Keine Fehler (korrekt erlaubt)');
|
|
166
|
+
|
|
167
|
+
} catch (error) {
|
|
168
|
+
if (error.stdout && error.stdout.includes('enforce-dto-factory-in-services')) {
|
|
169
|
+
console.log('❌ DTO-Methode wird fälschlicherweise als Fehler erkannt:');
|
|
170
|
+
console.log(' ', error.stdout.split('\n').filter(line => line.includes('enforce-dto-factory-in-services')).slice(0, 2).join('\n '));
|
|
171
|
+
} else {
|
|
172
|
+
console.log('✅ repository.create() in DTO-Methode: Keine enforce-dto-factory-in-services Fehler');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
console.log('');
|
|
177
|
+
|
|
178
|
+
// Test 5: Echte Service-Datei testen
|
|
179
|
+
console.log('📋 Test 5: Echte Backend-Service - StatDerivationRulesService');
|
|
180
|
+
console.log('-------------------------------------------------------------');
|
|
181
|
+
|
|
182
|
+
try {
|
|
183
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/service/Eoo/Game/Stats/StatDerivationRulesService.ts --no-color', {
|
|
184
|
+
encoding: 'utf8',
|
|
185
|
+
stdio: 'pipe'
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
console.log('✅ StatDerivationRulesService.ts: Keine enforce-dto-factory-in-services Fehler');
|
|
189
|
+
console.log(' - Verwendet korrektes DTO-Pattern');
|
|
190
|
+
|
|
191
|
+
} catch (error) {
|
|
192
|
+
if (error.stdout && error.stdout.includes('enforce-dto-factory-in-services')) {
|
|
193
|
+
console.log('❌ StatDerivationRulesService.ts hat enforce-dto-factory-in-services Fehler:');
|
|
194
|
+
console.log(' ', error.stdout.split('\n').filter(line => line.includes('enforce-dto-factory-in-services')).slice(0, 3).join('\n '));
|
|
195
|
+
} else {
|
|
196
|
+
console.log('✅ StatDerivationRulesService.ts: Keine enforce-dto-factory-in-services Fehler');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
console.log('');
|
|
201
|
+
|
|
202
|
+
// Test 6: Service mit repository.create() (sollte Fehler sein)
|
|
203
|
+
console.log('📋 Test 6: CombatMechanicsConfigService (verwendet repository.create())');
|
|
204
|
+
console.log('----------------------------------------------------------------------');
|
|
205
|
+
|
|
206
|
+
try {
|
|
207
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/service/Eoo/Game/Combat/CombatMechanicsConfigService.ts --no-color', {
|
|
208
|
+
encoding: 'utf8',
|
|
209
|
+
stdio: 'pipe'
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
console.log('❌ CombatMechanicsConfigService.ts: Keine Fehler (erwartet: enforce-dto-factory-in-services)');
|
|
213
|
+
console.log(' - Sollte repository.create() als Fehler erkennen');
|
|
214
|
+
|
|
215
|
+
} catch (error) {
|
|
216
|
+
if (error.stdout && error.stdout.includes('enforce-dto-factory-in-services')) {
|
|
217
|
+
console.log('✅ Korrekte Fehlererkennung: CombatMechanicsConfigService.ts');
|
|
218
|
+
console.log(' - repository.create() wird korrekt als Fehler erkannt');
|
|
219
|
+
console.log(' - Fehler:', error.stdout.split('\n').filter(line => line.includes('repository.create')).slice(0, 2).join('\n '));
|
|
220
|
+
} else {
|
|
221
|
+
console.log('⚠️ CombatMechanicsConfigService.ts: Andere ESLint-Fehler (nicht enforce-dto-factory-in-services)');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
console.log('');
|
|
226
|
+
|
|
227
|
+
// Cleanup
|
|
228
|
+
try {
|
|
229
|
+
fs.unlinkSync('/app/backend/src/service/TestCorrectService.ts');
|
|
230
|
+
fs.unlinkSync('/app/backend/src/service/TestIncorrectRepositoryCreate.ts');
|
|
231
|
+
fs.unlinkSync('/app/backend/src/service/TestIncorrectDataSourceCreate.ts');
|
|
232
|
+
fs.unlinkSync('/app/backend/src/dto/TestDtoMethod.ts');
|
|
233
|
+
} catch (e) {
|
|
234
|
+
// Ignore cleanup errors
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
console.log('📊 Integrationstest-Zusammenfassung:');
|
|
238
|
+
console.log('====================================');
|
|
239
|
+
console.log('✅ DTO-Pattern (fromRequestDto → toEntity → save): Erlaubt');
|
|
240
|
+
console.log('✅ repository.create() in Services: Verboten');
|
|
241
|
+
console.log('✅ this.dataSource.manager.create() in Services: Verboten');
|
|
242
|
+
console.log('✅ repository.create() in DTO-Methoden: Erlaubt');
|
|
243
|
+
console.log('✅ Echte Service-Dateien: Korrekt validiert');
|
|
244
|
+
console.log('');
|
|
245
|
+
console.log('🎯 enforce-dto-factory-in-services Regel funktioniert korrekt!');
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
|
|
260
|
+
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { execSync } from 'child_process';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
|
|
6
|
+
console.log('🧪 ESLint-Plugin Integrationstests für no-entity-type-casting Regel');
|
|
7
|
+
console.log('================================================================');
|
|
8
|
+
console.log('');
|
|
9
|
+
|
|
10
|
+
// Test 1: no-entity-type-casting Regel - Verbotene Type-Castings erkennen
|
|
11
|
+
console.log('📋 Test 1: no-entity-type-casting - Verbotene Type-Castings erkennen');
|
|
12
|
+
console.log('--------------------------------------------------------------------');
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
// Erstelle eine Test-Datei mit verbotenen Type-Castings
|
|
16
|
+
const badServiceContent = `
|
|
17
|
+
import { Injectable } from "@nestjs/common";
|
|
18
|
+
import MonsterTypeEntity from "@/entity/Eoo/Data/MonsterTypeEntity";
|
|
19
|
+
import AreaEntity from "@/entity/Eoo/World/AreaEntity";
|
|
20
|
+
|
|
21
|
+
@Injectable()
|
|
22
|
+
export class TestService {
|
|
23
|
+
public badExample1() {
|
|
24
|
+
const updateData: any = {};
|
|
25
|
+
updateData.monsterType = { id: "123" } as MonsterTypeEntity;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public badExample2() {
|
|
29
|
+
const area = { id: "456" } as AreaEntity;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public badExample3(requestId: string) {
|
|
33
|
+
const user = { id: requestId } as UserEntity;
|
|
34
|
+
}
|
|
35
|
+
}`;
|
|
36
|
+
|
|
37
|
+
fs.writeFileSync('/app/backend/src/BadService.ts', badServiceContent);
|
|
38
|
+
|
|
39
|
+
// Teste mit ESLint
|
|
40
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/BadService.ts --no-color', {
|
|
41
|
+
encoding: 'utf8',
|
|
42
|
+
stdio: 'pipe'
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
console.log('❌ Unerwartet: Keine Fehler bei verbotenen Type-Castings gefunden');
|
|
46
|
+
console.log(' - Regel funktioniert möglicherweise nicht korrekt');
|
|
47
|
+
|
|
48
|
+
} catch (error) {
|
|
49
|
+
if (error.stdout && error.stdout.includes('no-entity-type-casting')) {
|
|
50
|
+
console.log('✅ no-entity-type-casting Regel funktioniert korrekt:');
|
|
51
|
+
const errorLines = error.stdout.split('\n').filter(line => line.includes('no-entity-type-casting'));
|
|
52
|
+
errorLines.slice(0, 3).forEach(line => {
|
|
53
|
+
console.log(' ', line.trim());
|
|
54
|
+
});
|
|
55
|
+
console.log(` - ${errorLines.length} Fehler gefunden (erwartet: 3)`);
|
|
56
|
+
} else {
|
|
57
|
+
console.log('❌ no-entity-type-casting Regel meldet keine Fehler bei verbotenen Type-Castings');
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
console.log('');
|
|
62
|
+
|
|
63
|
+
// Test 2: no-entity-type-casting Regel - Erlaubte Patterns nicht blockieren
|
|
64
|
+
console.log('📋 Test 2: no-entity-type-casting - Erlaubte Patterns nicht blockieren');
|
|
65
|
+
console.log('--------------------------------------------------------------------');
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
// Erstelle eine Test-Datei mit erlaubten Patterns
|
|
69
|
+
const goodServiceContent = `
|
|
70
|
+
import { Injectable } from "@nestjs/common";
|
|
71
|
+
import MonsterTypeEntity from "@/entity/Eoo/Data/MonsterTypeEntity";
|
|
72
|
+
import AreaEntity from "@/entity/Eoo/World/AreaEntity";
|
|
73
|
+
|
|
74
|
+
@Injectable()
|
|
75
|
+
export class TestService {
|
|
76
|
+
public goodExample1(monsterType: MonsterTypeEntity) {
|
|
77
|
+
const updateData: any = {};
|
|
78
|
+
updateData.monsterType = monsterType;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public goodExample2() {
|
|
82
|
+
const monsterType = {
|
|
83
|
+
id: "123",
|
|
84
|
+
name: "Goblin",
|
|
85
|
+
description: "A small creature"
|
|
86
|
+
} as MonsterTypeEntity;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public goodExample3() {
|
|
90
|
+
const config = { setting: "value" } as ConfigType;
|
|
91
|
+
}
|
|
92
|
+
}`;
|
|
93
|
+
|
|
94
|
+
fs.writeFileSync('/app/backend/src/GoodService.ts', goodServiceContent);
|
|
95
|
+
|
|
96
|
+
// Teste mit ESLint
|
|
97
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/GoodService.ts --no-color', {
|
|
98
|
+
encoding: 'utf8',
|
|
99
|
+
stdio: 'pipe'
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
console.log('✅ Erlaubte Patterns: Keine no-entity-type-casting Fehler');
|
|
103
|
+
console.log(' - Echte Entity-Objekte werden nicht blockiert');
|
|
104
|
+
console.log(' - Vollständige Objekte werden nicht blockiert');
|
|
105
|
+
console.log(' - Type-Casting für andere Typen wird nicht blockiert');
|
|
106
|
+
|
|
107
|
+
} catch (error) {
|
|
108
|
+
if (error.stdout && error.stdout.includes('no-entity-type-casting')) {
|
|
109
|
+
console.log('❌ no-entity-type-casting Regel meldet False Positives:');
|
|
110
|
+
const errorLines = error.stdout.split('\n').filter(line => line.includes('no-entity-type-casting'));
|
|
111
|
+
errorLines.slice(0, 3).forEach(line => {
|
|
112
|
+
console.log(' ', line.trim());
|
|
113
|
+
});
|
|
114
|
+
} else {
|
|
115
|
+
console.log('✅ Erlaubte Patterns: Keine no-entity-type-casting Fehler');
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
console.log('');
|
|
120
|
+
|
|
121
|
+
// Test 3: no-entity-type-casting Regel - MonsterService.ts testen
|
|
122
|
+
console.log('📋 Test 3: no-entity-type-casting - MonsterService.ts testen');
|
|
123
|
+
console.log('----------------------------------------------------------');
|
|
124
|
+
|
|
125
|
+
try {
|
|
126
|
+
// Teste die echte MonsterService.ts Datei
|
|
127
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/service/Eoo/Game/Monster/MonsterService.ts --no-color', {
|
|
128
|
+
encoding: 'utf8',
|
|
129
|
+
stdio: 'pipe'
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
console.log('✅ MonsterService.ts: Keine no-entity-type-casting Fehler');
|
|
133
|
+
console.log(' - Alle Type-Castings wurden bereits behoben');
|
|
134
|
+
|
|
135
|
+
} catch (error) {
|
|
136
|
+
if (error.stdout && error.stdout.includes('no-entity-type-casting')) {
|
|
137
|
+
console.log('❌ MonsterService.ts hat noch no-entity-type-casting Fehler:');
|
|
138
|
+
const errorLines = error.stdout.split('\n').filter(line => line.includes('no-entity-type-casting'));
|
|
139
|
+
errorLines.slice(0, 3).forEach(line => {
|
|
140
|
+
console.log(' ', line.trim());
|
|
141
|
+
});
|
|
142
|
+
} else {
|
|
143
|
+
console.log('✅ MonsterService.ts: Keine no-entity-type-casting Fehler');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
console.log('');
|
|
148
|
+
|
|
149
|
+
// Cleanup
|
|
150
|
+
try {
|
|
151
|
+
fs.unlinkSync('/app/backend/src/BadService.ts');
|
|
152
|
+
fs.unlinkSync('/app/backend/src/GoodService.ts');
|
|
153
|
+
console.log('🧹 Test-Dateien aufgeräumt');
|
|
154
|
+
} catch (cleanupError) {
|
|
155
|
+
console.log('⚠️ Cleanup-Fehler (nicht kritisch):', cleanupError.message);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
console.log('');
|
|
159
|
+
console.log('🎯 Integrationstest für no-entity-type-casting Regel abgeschlossen');
|
|
160
|
+
console.log('================================================================');
|
|
161
|
+
|