@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,501 @@
|
|
|
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 enforce-typeorm-naming-conventions Regel');
|
|
7
|
+
console.log('====================================================================================');
|
|
8
|
+
console.log('');
|
|
9
|
+
|
|
10
|
+
// Test 1: Tabellennamen müssen snake_case sein
|
|
11
|
+
console.log('📋 Test 1: @Entity - Tabellennamen müssen snake_case sein');
|
|
12
|
+
console.log('----------------------------------------------------------');
|
|
13
|
+
|
|
14
|
+
try {
|
|
15
|
+
const badEntityContent = `
|
|
16
|
+
import {
|
|
17
|
+
Column,
|
|
18
|
+
Entity,
|
|
19
|
+
PrimaryGeneratedColumn,
|
|
20
|
+
} from "typeorm";
|
|
21
|
+
|
|
22
|
+
@Entity("UserProfileData")
|
|
23
|
+
export default class UserEntity {
|
|
24
|
+
@PrimaryGeneratedColumn("uuid")
|
|
25
|
+
id: string;
|
|
26
|
+
|
|
27
|
+
@Column()
|
|
28
|
+
name: string;
|
|
29
|
+
}`;
|
|
30
|
+
|
|
31
|
+
fs.writeFileSync('/app/backend/src/entity/BadTableNameEntity.ts', badEntityContent);
|
|
32
|
+
|
|
33
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/entity/BadTableNameEntity.ts --no-color', {
|
|
34
|
+
encoding: 'utf8',
|
|
35
|
+
stdio: 'pipe'
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
console.log('❌ Unerwartet: Keine Fehler bei PascalCase-Tabellennamen gefunden');
|
|
39
|
+
|
|
40
|
+
} catch (error) {
|
|
41
|
+
if (error.stdout && error.stdout.includes('enforce-typeorm-naming-conventions')) {
|
|
42
|
+
console.log('✅ Regel erkennt PascalCase-Tabellennamen korrekt:');
|
|
43
|
+
const errorLines = error.stdout.split('\n').filter(line =>
|
|
44
|
+
line.includes('enforce-typeorm-naming-conventions') || line.includes('tableNotSnakeCase')
|
|
45
|
+
);
|
|
46
|
+
errorLines.slice(0, 2).forEach(line => {
|
|
47
|
+
console.log(' ', line.trim());
|
|
48
|
+
});
|
|
49
|
+
console.log(' ✓ Vorschlag: "UserProfileData" → "user_profile_data"');
|
|
50
|
+
} else {
|
|
51
|
+
console.log('❌ Regel meldet keine Fehler bei PascalCase-Tabellennamen');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
console.log('');
|
|
56
|
+
|
|
57
|
+
// Test 2: Spaltennamen müssen explizit mit name-Parameter angegeben werden
|
|
58
|
+
console.log('📋 Test 2: @Column - Spaltennamen müssen explizit angegeben werden');
|
|
59
|
+
console.log('----------------------------------------------------------------');
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const missingColumnNameContent = `
|
|
63
|
+
import {
|
|
64
|
+
Column,
|
|
65
|
+
Entity,
|
|
66
|
+
PrimaryGeneratedColumn,
|
|
67
|
+
} from "typeorm";
|
|
68
|
+
|
|
69
|
+
@Entity("user_profile")
|
|
70
|
+
export default class UserEntity {
|
|
71
|
+
@PrimaryGeneratedColumn("uuid")
|
|
72
|
+
id: string;
|
|
73
|
+
|
|
74
|
+
@Column({ type: "varchar" })
|
|
75
|
+
firstName: string;
|
|
76
|
+
|
|
77
|
+
@Column()
|
|
78
|
+
lastName: string;
|
|
79
|
+
|
|
80
|
+
@Column({ nullable: true })
|
|
81
|
+
middleName: string;
|
|
82
|
+
}`;
|
|
83
|
+
|
|
84
|
+
fs.writeFileSync('/app/backend/src/entity/MissingColumnNameEntity.ts', missingColumnNameContent);
|
|
85
|
+
|
|
86
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/entity/MissingColumnNameEntity.ts --no-color', {
|
|
87
|
+
encoding: 'utf8',
|
|
88
|
+
stdio: 'pipe'
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
console.log('❌ Unerwartet: Keine Fehler bei fehlenden Spaltennamen gefunden');
|
|
92
|
+
|
|
93
|
+
} catch (error) {
|
|
94
|
+
if (error.stdout && error.stdout.includes('columnNameRequired')) {
|
|
95
|
+
console.log('✅ Regel erkennt fehlende Spaltennamen korrekt:');
|
|
96
|
+
const errorLines = error.stdout.split('\n').filter(line =>
|
|
97
|
+
line.includes('columnNameRequired')
|
|
98
|
+
);
|
|
99
|
+
console.log(` - ${errorLines.length} Fehler gefunden (erwartet: 4 - id, firstName, lastName, middleName)`);
|
|
100
|
+
errorLines.slice(0, 3).forEach(line => {
|
|
101
|
+
console.log(' ', line.trim());
|
|
102
|
+
});
|
|
103
|
+
} else {
|
|
104
|
+
console.log('❌ Regel meldet keine Fehler bei fehlenden Spaltennamen');
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
console.log('');
|
|
109
|
+
|
|
110
|
+
// Test 3: Spaltennamen müssen snake_case sein
|
|
111
|
+
console.log('📋 Test 3: @Column - Spaltennamen müssen snake_case Format haben');
|
|
112
|
+
console.log('----------------------------------------------------------------');
|
|
113
|
+
|
|
114
|
+
try {
|
|
115
|
+
const wrongCaseColumnContent = `
|
|
116
|
+
import {
|
|
117
|
+
Column,
|
|
118
|
+
Entity,
|
|
119
|
+
PrimaryGeneratedColumn,
|
|
120
|
+
} from "typeorm";
|
|
121
|
+
|
|
122
|
+
@Entity("user_profile")
|
|
123
|
+
export default class UserEntity {
|
|
124
|
+
@PrimaryGeneratedColumn("uuid", { name: "userId" })
|
|
125
|
+
id: string;
|
|
126
|
+
|
|
127
|
+
@Column({ type: "varchar", name: "FirstName" })
|
|
128
|
+
firstName: string;
|
|
129
|
+
|
|
130
|
+
@Column({ name: "LastName" })
|
|
131
|
+
lastName: string;
|
|
132
|
+
}`;
|
|
133
|
+
|
|
134
|
+
fs.writeFileSync('/app/backend/src/entity/WrongCaseColumnEntity.ts', wrongCaseColumnContent);
|
|
135
|
+
|
|
136
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/entity/WrongCaseColumnEntity.ts --no-color', {
|
|
137
|
+
encoding: 'utf8',
|
|
138
|
+
stdio: 'pipe'
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
console.log('❌ Unerwartet: Keine Fehler bei falschen Spaltennamen gefunden');
|
|
142
|
+
|
|
143
|
+
} catch (error) {
|
|
144
|
+
if (error.stdout && error.stdout.includes('columnNotSnakeCase')) {
|
|
145
|
+
console.log('✅ Regel erkennt falsche Spaltennamen-Formate korrekt:');
|
|
146
|
+
const errorLines = error.stdout.split('\n').filter(line =>
|
|
147
|
+
line.includes('columnNotSnakeCase')
|
|
148
|
+
);
|
|
149
|
+
console.log(` - ${errorLines.length} Fehler gefunden (erwartet: 3)`);
|
|
150
|
+
errorLines.slice(0, 3).forEach(line => {
|
|
151
|
+
console.log(' ', line.trim());
|
|
152
|
+
});
|
|
153
|
+
console.log(' ✓ "userId" → "id"');
|
|
154
|
+
console.log(' ✓ "FirstName" → "first_name"');
|
|
155
|
+
console.log(' ✓ "LastName" → "last_name"');
|
|
156
|
+
} else {
|
|
157
|
+
console.log('❌ Regel meldet keine Fehler bei falschen Spaltennamen');
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
console.log('');
|
|
162
|
+
|
|
163
|
+
// Test 4: JoinColumn Decorator für Relationen
|
|
164
|
+
console.log('📋 Test 4: @JoinColumn - Relation-Spalten müssen explizit angegeben werden');
|
|
165
|
+
console.log('----------------------------------------------------------------------------');
|
|
166
|
+
|
|
167
|
+
try {
|
|
168
|
+
const joinColumnContent = `
|
|
169
|
+
import {
|
|
170
|
+
Column,
|
|
171
|
+
Entity,
|
|
172
|
+
JoinColumn,
|
|
173
|
+
ManyToOne,
|
|
174
|
+
PrimaryGeneratedColumn,
|
|
175
|
+
} from "typeorm";
|
|
176
|
+
import AreaEntity from "@/entity/Eoo/World/AreaEntity";
|
|
177
|
+
|
|
178
|
+
@Entity("monster")
|
|
179
|
+
export default class MonsterEntity {
|
|
180
|
+
@PrimaryGeneratedColumn("uuid", { name: "id" })
|
|
181
|
+
id: string;
|
|
182
|
+
|
|
183
|
+
@ManyToOne(() => AreaEntity)
|
|
184
|
+
@JoinColumn()
|
|
185
|
+
area: AreaEntity;
|
|
186
|
+
|
|
187
|
+
@ManyToOne(() => AreaEntity)
|
|
188
|
+
@JoinColumn({ referencedColumnName: "id" })
|
|
189
|
+
spawnArea: AreaEntity;
|
|
190
|
+
}`;
|
|
191
|
+
|
|
192
|
+
fs.writeFileSync('/app/backend/src/entity/JoinColumnTestEntity.ts', joinColumnContent);
|
|
193
|
+
|
|
194
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/entity/JoinColumnTestEntity.ts --no-color', {
|
|
195
|
+
encoding: 'utf8',
|
|
196
|
+
stdio: 'pipe'
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
console.log('❌ Unerwartet: Keine Fehler bei fehlenden JoinColumn-Namen gefunden');
|
|
200
|
+
|
|
201
|
+
} catch (error) {
|
|
202
|
+
if (error.stdout && error.stdout.includes('relationColumnRequired')) {
|
|
203
|
+
console.log('✅ Regel erkennt fehlende JoinColumn-Namen korrekt:');
|
|
204
|
+
const errorLines = error.stdout.split('\n').filter(line =>
|
|
205
|
+
line.includes('relationColumnRequired')
|
|
206
|
+
);
|
|
207
|
+
console.log(` - ${errorLines.length} Fehler gefunden (erwartet: 2)`);
|
|
208
|
+
errorLines.slice(0, 2).forEach(line => {
|
|
209
|
+
console.log(' ', line.trim());
|
|
210
|
+
});
|
|
211
|
+
console.log(' ✓ Vorschlag für "area": name: "area_id"');
|
|
212
|
+
console.log(' ✓ Vorschlag für "spawnArea": name: "spawn_area_id"');
|
|
213
|
+
} else {
|
|
214
|
+
console.log('❌ Regel meldet keine Fehler bei fehlenden JoinColumn-Namen');
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
console.log('');
|
|
219
|
+
|
|
220
|
+
// Test 5: Korrekte Entity sollte keine Fehler verursachen
|
|
221
|
+
console.log('📋 Test 5: Korrekte Entity - Keine Fehler bei korrekter Verwendung');
|
|
222
|
+
console.log('----------------------------------------------------------------------');
|
|
223
|
+
|
|
224
|
+
try {
|
|
225
|
+
const correctEntityContent = `
|
|
226
|
+
import {
|
|
227
|
+
Column,
|
|
228
|
+
CreateDateColumn,
|
|
229
|
+
Entity,
|
|
230
|
+
JoinColumn,
|
|
231
|
+
ManyToOne,
|
|
232
|
+
PrimaryGeneratedColumn,
|
|
233
|
+
UpdateDateColumn,
|
|
234
|
+
} from "typeorm";
|
|
235
|
+
import AreaEntity from "@/entity/Eoo/World/AreaEntity";
|
|
236
|
+
|
|
237
|
+
@Entity("character_stats")
|
|
238
|
+
export default class CharacterStatsEntity {
|
|
239
|
+
@PrimaryGeneratedColumn("uuid", { name: "id" })
|
|
240
|
+
id: string;
|
|
241
|
+
|
|
242
|
+
@Column({ type: "varchar", name: "character_name" })
|
|
243
|
+
characterName: string;
|
|
244
|
+
|
|
245
|
+
@Column({ type: "int", name: "level" })
|
|
246
|
+
level: number;
|
|
247
|
+
|
|
248
|
+
@Column({ type: "int", name: "experience_points" })
|
|
249
|
+
experiencePoints: number;
|
|
250
|
+
|
|
251
|
+
@ManyToOne(() => AreaEntity)
|
|
252
|
+
@JoinColumn({ name: "current_area_id" })
|
|
253
|
+
currentArea: AreaEntity;
|
|
254
|
+
|
|
255
|
+
@CreateDateColumn({ name: "created_at" })
|
|
256
|
+
createdAt: Date;
|
|
257
|
+
|
|
258
|
+
@UpdateDateColumn({ name: "updated_at" })
|
|
259
|
+
updatedAt: Date;
|
|
260
|
+
}`;
|
|
261
|
+
|
|
262
|
+
fs.writeFileSync('/app/backend/src/entity/CorrectEntity.ts', correctEntityContent);
|
|
263
|
+
|
|
264
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/entity/CorrectEntity.ts --no-color', {
|
|
265
|
+
encoding: 'utf8',
|
|
266
|
+
stdio: 'pipe'
|
|
267
|
+
});
|
|
268
|
+
|
|
269
|
+
console.log('✅ Korrekte Entity: Keine Fehler bei korrekter Verwendung');
|
|
270
|
+
console.log(' ✓ Tabellenname im snake_case: "character_stats"');
|
|
271
|
+
console.log(' ✓ Alle Spalten haben explizite snake_case Namen');
|
|
272
|
+
console.log(' ✓ JoinColumn hat expliziten Namen: "current_area_id"');
|
|
273
|
+
|
|
274
|
+
} catch (error) {
|
|
275
|
+
if (error.stdout && error.stdout.includes('enforce-typeorm-naming-conventions')) {
|
|
276
|
+
console.log('❌ Korrekte Entity meldet False Positives:');
|
|
277
|
+
const errorLines = error.stdout.split('\n').filter(line =>
|
|
278
|
+
line.includes('enforce-typeorm-naming-conventions')
|
|
279
|
+
);
|
|
280
|
+
errorLines.slice(0, 3).forEach(line => {
|
|
281
|
+
console.log(' ', line.trim());
|
|
282
|
+
});
|
|
283
|
+
} else {
|
|
284
|
+
console.log('✅ Korrekte Entity: Keine Fehler');
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
console.log('');
|
|
289
|
+
|
|
290
|
+
// Test 6: Auto-Fix Funktionalität
|
|
291
|
+
console.log('📋 Test 6: Auto-Fix - Automatische Korrektur der Naming Conventions');
|
|
292
|
+
console.log('---------------------------------------------------------------------');
|
|
293
|
+
|
|
294
|
+
try {
|
|
295
|
+
const autoFixContent = `
|
|
296
|
+
import {
|
|
297
|
+
Column,
|
|
298
|
+
Entity,
|
|
299
|
+
PrimaryGeneratedColumn,
|
|
300
|
+
} from "typeorm";
|
|
301
|
+
|
|
302
|
+
@Entity("UserAccount")
|
|
303
|
+
export default class UserEntity {
|
|
304
|
+
@PrimaryGeneratedColumn("uuid")
|
|
305
|
+
id: string;
|
|
306
|
+
|
|
307
|
+
@Column({ type: "varchar" })
|
|
308
|
+
firstName: string;
|
|
309
|
+
|
|
310
|
+
@Column({ type: "varchar", name: "LastName" })
|
|
311
|
+
lastName: string;
|
|
312
|
+
}`;
|
|
313
|
+
|
|
314
|
+
fs.writeFileSync('/app/backend/src/entity/AutoFixTestEntity.ts', autoFixContent);
|
|
315
|
+
|
|
316
|
+
// Führe Auto-Fix aus
|
|
317
|
+
execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/entity/AutoFixTestEntity.ts --fix --no-color', {
|
|
318
|
+
encoding: 'utf8',
|
|
319
|
+
stdio: 'pipe'
|
|
320
|
+
});
|
|
321
|
+
|
|
322
|
+
// Lese korrigierte Datei
|
|
323
|
+
const fixedContent = fs.readFileSync('/app/backend/src/entity/AutoFixTestEntity.ts', 'utf8');
|
|
324
|
+
|
|
325
|
+
// Prüfe ob Korrekturen angewendet wurden
|
|
326
|
+
const hasSnakeCaseTable = fixedContent.includes('"user_account"');
|
|
327
|
+
const hasFirstNameColumn = fixedContent.includes('name: "first_name"') || fixedContent.includes("name: 'first_name'");
|
|
328
|
+
const hasLastNameColumn = fixedContent.includes('name: "last_name"') || fixedContent.includes("name: 'last_name'");
|
|
329
|
+
const hasIdColumn = fixedContent.includes('name: "id"') || fixedContent.includes("name: 'id'");
|
|
330
|
+
|
|
331
|
+
if (hasSnakeCaseTable && hasFirstNameColumn && hasLastNameColumn && hasIdColumn) {
|
|
332
|
+
console.log('✅ Auto-Fix funktioniert korrekt:');
|
|
333
|
+
console.log(' ✓ "UserAccount" → "user_account"');
|
|
334
|
+
console.log(' ✓ PrimaryGeneratedColumn erhielt: name: "id"');
|
|
335
|
+
console.log(' ✓ firstName Column erhielt: name: "first_name"');
|
|
336
|
+
console.log(' ✓ "LastName" → "last_name"');
|
|
337
|
+
} else {
|
|
338
|
+
console.log('❌ Auto-Fix nicht vollständig:');
|
|
339
|
+
if (!hasSnakeCaseTable) console.log(' ✗ Tabellenname nicht korrigiert');
|
|
340
|
+
if (!hasIdColumn) console.log(' ✗ ID-Spalte nicht korrigiert');
|
|
341
|
+
if (!hasFirstNameColumn) console.log(' ✗ firstName-Spalte nicht korrigiert');
|
|
342
|
+
if (!hasLastNameColumn) console.log(' ✗ lastName-Spalte nicht korrigiert');
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
} catch (error) {
|
|
346
|
+
console.log('❌ Auto-Fix Fehler:', error.message);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
console.log('');
|
|
350
|
+
|
|
351
|
+
// Test 7: Verschiedene Decorator-Typen
|
|
352
|
+
console.log('📋 Test 7: Verschiedene Decorator-Typen - CreateDateColumn, UpdateDateColumn, etc.');
|
|
353
|
+
console.log('------------------------------------------------------------------------------------');
|
|
354
|
+
|
|
355
|
+
try {
|
|
356
|
+
const decoratorTypesContent = `
|
|
357
|
+
import {
|
|
358
|
+
Column,
|
|
359
|
+
CreateDateColumn,
|
|
360
|
+
DeleteDateColumn,
|
|
361
|
+
Entity,
|
|
362
|
+
PrimaryGeneratedColumn,
|
|
363
|
+
UpdateDateColumn,
|
|
364
|
+
VersionColumn,
|
|
365
|
+
} from "typeorm";
|
|
366
|
+
|
|
367
|
+
@Entity("audit_log")
|
|
368
|
+
export default class AuditEntity {
|
|
369
|
+
@PrimaryGeneratedColumn("uuid")
|
|
370
|
+
id: string;
|
|
371
|
+
|
|
372
|
+
@Column({ type: "varchar" })
|
|
373
|
+
action: string;
|
|
374
|
+
|
|
375
|
+
@CreateDateColumn()
|
|
376
|
+
createdAt: Date;
|
|
377
|
+
|
|
378
|
+
@UpdateDateColumn()
|
|
379
|
+
updatedAt: Date;
|
|
380
|
+
|
|
381
|
+
@DeleteDateColumn()
|
|
382
|
+
deletedAt: Date;
|
|
383
|
+
|
|
384
|
+
@VersionColumn()
|
|
385
|
+
version: number;
|
|
386
|
+
}`;
|
|
387
|
+
|
|
388
|
+
fs.writeFileSync('/app/backend/src/entity/DecoratorTypesTestEntity.ts', decoratorTypesContent);
|
|
389
|
+
|
|
390
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/entity/DecoratorTypesTestEntity.ts --no-color', {
|
|
391
|
+
encoding: 'utf8',
|
|
392
|
+
stdio: 'pipe'
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
console.log('❌ Unerwartet: Keine Fehler bei fehlenden Namen in verschiedenen Decorators');
|
|
396
|
+
|
|
397
|
+
} catch (error) {
|
|
398
|
+
if (error.stdout && error.stdout.includes('columnNameRequired')) {
|
|
399
|
+
console.log('✅ Regel erkennt alle Decorator-Typen korrekt:');
|
|
400
|
+
const errorLines = error.stdout.split('\n').filter(line =>
|
|
401
|
+
line.includes('columnNameRequired')
|
|
402
|
+
);
|
|
403
|
+
console.log(` - ${errorLines.length} Fehler gefunden`);
|
|
404
|
+
console.log(' ✓ PrimaryGeneratedColumn benötigt name: "id"');
|
|
405
|
+
console.log(' ✓ Column benötigt name: "action"');
|
|
406
|
+
console.log(' ✓ CreateDateColumn benötigt name: "created_at"');
|
|
407
|
+
console.log(' ✓ UpdateDateColumn benötigt name: "updated_at"');
|
|
408
|
+
console.log(' ✓ DeleteDateColumn benötigt name: "deleted_at"');
|
|
409
|
+
console.log(' ✓ VersionColumn benötigt name: "version"');
|
|
410
|
+
} else {
|
|
411
|
+
console.log('❌ Regel erkennt nicht alle Decorator-Typen');
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
console.log('');
|
|
416
|
+
|
|
417
|
+
// Test 8: Echte Entity-Datei testen
|
|
418
|
+
console.log('📋 Test 8: Echte Entity - CharacterRefEquippedItemEntity.ts testen');
|
|
419
|
+
console.log('---------------------------------------------------------------------');
|
|
420
|
+
|
|
421
|
+
try {
|
|
422
|
+
const result = execSync('cd /app/backend && yarn run eslint -c eslint.config.js src/entity/Eoo/Profile/Character/CharacterRefEquippedItemEntity.ts --no-color', {
|
|
423
|
+
encoding: 'utf8',
|
|
424
|
+
stdio: 'pipe'
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
console.log('✅ CharacterRefEquippedItemEntity.ts: Keine Fehler');
|
|
428
|
+
console.log(' - Naming Conventions sind bereits korrekt');
|
|
429
|
+
|
|
430
|
+
} catch (error) {
|
|
431
|
+
if (error.stdout && error.stdout.includes('enforce-typeorm-naming-conventions')) {
|
|
432
|
+
console.log('❌ CharacterRefEquippedItemEntity.ts hat Naming Convention Fehler:');
|
|
433
|
+
const errorLines = error.stdout.split('\n').filter(line =>
|
|
434
|
+
line.includes('enforce-typeorm-naming-conventions') ||
|
|
435
|
+
line.includes('tableNotSnakeCase') ||
|
|
436
|
+
line.includes('columnNameRequired') ||
|
|
437
|
+
line.includes('columnNotSnakeCase')
|
|
438
|
+
);
|
|
439
|
+
console.log(` - ${errorLines.length} Fehler gefunden`);
|
|
440
|
+
errorLines.slice(0, 5).forEach(line => {
|
|
441
|
+
console.log(' ', line.trim());
|
|
442
|
+
});
|
|
443
|
+
} else {
|
|
444
|
+
console.log('✅ CharacterRefEquippedItemEntity.ts: Keine Naming Convention Fehler');
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
console.log('');
|
|
449
|
+
|
|
450
|
+
// Cleanup
|
|
451
|
+
console.log('🧹 Cleanup - Entferne Test-Dateien');
|
|
452
|
+
console.log('------------------------------------');
|
|
453
|
+
|
|
454
|
+
const testFiles = [
|
|
455
|
+
'/app/backend/src/entity/BadTableNameEntity.ts',
|
|
456
|
+
'/app/backend/src/entity/MissingColumnNameEntity.ts',
|
|
457
|
+
'/app/backend/src/entity/WrongCaseColumnEntity.ts',
|
|
458
|
+
'/app/backend/src/entity/JoinColumnTestEntity.ts',
|
|
459
|
+
'/app/backend/src/entity/CorrectEntity.ts',
|
|
460
|
+
'/app/backend/src/entity/AutoFixTestEntity.ts',
|
|
461
|
+
'/app/backend/src/entity/DecoratorTypesTestEntity.ts',
|
|
462
|
+
];
|
|
463
|
+
|
|
464
|
+
let cleanedCount = 0;
|
|
465
|
+
testFiles.forEach(file => {
|
|
466
|
+
try {
|
|
467
|
+
fs.unlinkSync(file);
|
|
468
|
+
cleanedCount++;
|
|
469
|
+
} catch (cleanupError) {
|
|
470
|
+
// Datei existiert möglicherweise nicht
|
|
471
|
+
}
|
|
472
|
+
});
|
|
473
|
+
|
|
474
|
+
console.log(`✅ ${cleanedCount} Test-Dateien erfolgreich entfernt`);
|
|
475
|
+
|
|
476
|
+
console.log('');
|
|
477
|
+
console.log('🎯 Integrationstest für enforce-typeorm-naming-conventions Regel abgeschlossen');
|
|
478
|
+
console.log('===================================================================================');
|
|
479
|
+
console.log('');
|
|
480
|
+
console.log('📊 Test-Zusammenfassung:');
|
|
481
|
+
console.log(' ✓ Test 1: Tabellennamen snake_case Validierung');
|
|
482
|
+
console.log(' ✓ Test 2: Explizite Spaltennamen-Anforderung');
|
|
483
|
+
console.log(' ✓ Test 3: Spaltennamen snake_case Validierung');
|
|
484
|
+
console.log(' ✓ Test 4: JoinColumn Validierung');
|
|
485
|
+
console.log(' ✓ Test 5: Korrekte Entity ohne Fehler');
|
|
486
|
+
console.log(' ✓ Test 6: Auto-Fix Funktionalität');
|
|
487
|
+
console.log(' ✓ Test 7: Verschiedene Decorator-Typen');
|
|
488
|
+
console.log(' ✓ Test 8: Echte Entity-Datei');
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import typescriptParser from '@typescript-eslint/parser';
|
|
2
|
+
import { RuleTester } from 'eslint';
|
|
3
|
+
|
|
4
|
+
// Standard-Konfiguration für alle Tests
|
|
5
|
+
export const createRuleTester = (options = {}) => {
|
|
6
|
+
return new RuleTester({
|
|
7
|
+
languageOptions: {
|
|
8
|
+
ecmaVersion: 2024,
|
|
9
|
+
sourceType: 'module',
|
|
10
|
+
parser: typescriptParser,
|
|
11
|
+
parserOptions: {
|
|
12
|
+
ecmaFeatures: {
|
|
13
|
+
experimentalDecorators: true,
|
|
14
|
+
},
|
|
15
|
+
project: './tsconfig.json',
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
...options,
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// Vereinfachte Konfiguration für Tests ohne TypeScript
|
|
23
|
+
export const createSimpleRuleTester = (options = {}) => {
|
|
24
|
+
return new RuleTester({
|
|
25
|
+
languageOptions: {
|
|
26
|
+
ecmaVersion: 2024,
|
|
27
|
+
sourceType: 'module',
|
|
28
|
+
},
|
|
29
|
+
...options,
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export default createRuleTester;
|