@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,71 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
rules: {
|
|
3
|
+
// Ungenutzte Variablen und Imports
|
|
4
|
+
"@typescript-eslint/no-unused-vars": ["error", {
|
|
5
|
+
"vars": "all",
|
|
6
|
+
"args": "after-used",
|
|
7
|
+
"ignoreRestSiblings": true,
|
|
8
|
+
"argsIgnorePattern": "^_",
|
|
9
|
+
"varsIgnorePattern": "^_",
|
|
10
|
+
"destructuredArrayIgnorePattern": "^_"
|
|
11
|
+
}],
|
|
12
|
+
|
|
13
|
+
// React-spezifische Dead Code Detection
|
|
14
|
+
"react/jsx-no-useless-fragment": ["error", {
|
|
15
|
+
"allowExpressions": true
|
|
16
|
+
}],
|
|
17
|
+
|
|
18
|
+
// Ungenutzte private Klassenmember
|
|
19
|
+
"no-unused-private-class-members": "error",
|
|
20
|
+
|
|
21
|
+
// Ungenutzte Labels
|
|
22
|
+
"no-unused-labels": "error",
|
|
23
|
+
|
|
24
|
+
// Ungenutzte Expressions
|
|
25
|
+
"no-unused-expressions": ["error", {
|
|
26
|
+
"allowShortCircuit": true,
|
|
27
|
+
"allowTernary": true,
|
|
28
|
+
"allowTaggedTemplates": true
|
|
29
|
+
}],
|
|
30
|
+
|
|
31
|
+
// Import/Export Dead Code Detection
|
|
32
|
+
"import/no-unused-modules": ["error", {
|
|
33
|
+
"missingExports": true,
|
|
34
|
+
"unusedExports": true,
|
|
35
|
+
"ignoreExports": [
|
|
36
|
+
"src/main.tsx",
|
|
37
|
+
"src/App.tsx",
|
|
38
|
+
"src/AppRouter.tsx",
|
|
39
|
+
"src/vite-env.d.ts",
|
|
40
|
+
"**/*.d.ts",
|
|
41
|
+
"**/test/**",
|
|
42
|
+
"**/tests/**",
|
|
43
|
+
"**/*.test.*",
|
|
44
|
+
"**/*.spec.*"
|
|
45
|
+
]
|
|
46
|
+
}],
|
|
47
|
+
|
|
48
|
+
// Typescript-spezifische Dead Code Rules
|
|
49
|
+
"@typescript-eslint/no-unused-expressions": ["error", {
|
|
50
|
+
"allowShortCircuit": true,
|
|
51
|
+
"allowTernary": true,
|
|
52
|
+
"allowTaggedTemplates": true
|
|
53
|
+
}],
|
|
54
|
+
|
|
55
|
+
// Ungenutzte Importe
|
|
56
|
+
"import/no-duplicates": "error",
|
|
57
|
+
"import/no-useless-path-segments": "error",
|
|
58
|
+
|
|
59
|
+
// Unreachable Code
|
|
60
|
+
"no-unreachable": "error",
|
|
61
|
+
"no-unreachable-loop": "error",
|
|
62
|
+
|
|
63
|
+
// Dead Stores
|
|
64
|
+
"no-self-assign": "error",
|
|
65
|
+
"no-self-compare": "error",
|
|
66
|
+
// React-Hooks-Regel wird nur in React-Konfigurationen gesetzt
|
|
67
|
+
|
|
68
|
+
// Material-UI spezifische Regeln
|
|
69
|
+
"mui-unused-classes": "off" // Custom rule falls verfügbar
|
|
70
|
+
}
|
|
71
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Debug-Version der Controller-Response-DTO-Regel
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
"use strict";
|
|
6
|
+
|
|
7
|
+
const debugControllerResponseDtoRule = {
|
|
8
|
+
meta: {
|
|
9
|
+
type: "problem",
|
|
10
|
+
docs: {
|
|
11
|
+
description: "Debug: Controller müssen ResponseDtos verwenden",
|
|
12
|
+
category: "Architecture",
|
|
13
|
+
recommended: true,
|
|
14
|
+
},
|
|
15
|
+
schema: [],
|
|
16
|
+
messages: {
|
|
17
|
+
debugFound: "DEBUG: Gefunden - {{message}}",
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
create(context) {
|
|
22
|
+
const filename = context.getFilename();
|
|
23
|
+
console.log(`DEBUG: Processing file: ${filename}`);
|
|
24
|
+
|
|
25
|
+
// Nur Controller-Dateien prüfen
|
|
26
|
+
if (!filename.includes("Controller.ts") ||
|
|
27
|
+
filename.includes("test") ||
|
|
28
|
+
filename.includes("spec") ||
|
|
29
|
+
filename.includes("BaseController")) {
|
|
30
|
+
console.log(`DEBUG: Skipping file: ${filename}`);
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
console.log(`DEBUG: Processing Controller file: ${filename}`);
|
|
35
|
+
|
|
36
|
+
return {
|
|
37
|
+
CallExpression(node) {
|
|
38
|
+
console.log(`DEBUG: Found CallExpression: ${context.getSourceCode().getText(node)}`);
|
|
39
|
+
|
|
40
|
+
// Prüfe auf this.sendSuccess() Aufrufe
|
|
41
|
+
if (node.callee?.type === "MemberExpression" &&
|
|
42
|
+
node.callee.object?.type === "ThisExpression" &&
|
|
43
|
+
node.callee.property?.name === "sendSuccess") {
|
|
44
|
+
|
|
45
|
+
console.log(`DEBUG: Found sendSuccess call`);
|
|
46
|
+
|
|
47
|
+
// Prüfe das zweite Argument (Response-Objekt)
|
|
48
|
+
if (node.arguments.length >= 2) {
|
|
49
|
+
const responseArg = node.arguments[1];
|
|
50
|
+
console.log(`DEBUG: Response argument: ${context.getSourceCode().getText(responseArg)}`);
|
|
51
|
+
|
|
52
|
+
// Fall 1: Direktes Entity-Objekt
|
|
53
|
+
if (responseArg.type === "ObjectExpression") {
|
|
54
|
+
responseArg.properties.forEach(property => {
|
|
55
|
+
if (property.type === "Property" && property.value) {
|
|
56
|
+
const valueText = context.getSourceCode().getText(property.value);
|
|
57
|
+
console.log(`DEBUG: Property value: ${valueText}`);
|
|
58
|
+
|
|
59
|
+
// Prüfe auf Entity-Pattern
|
|
60
|
+
if (valueText.includes("entity") || valueText.includes("Entity")) {
|
|
61
|
+
console.log(`DEBUG: Found entity pattern: ${valueText}`);
|
|
62
|
+
context.report({
|
|
63
|
+
node: property.value,
|
|
64
|
+
messageId: "debugFound",
|
|
65
|
+
data: { message: `Entity gefunden: ${valueText}` },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
export default debugControllerResponseDtoRule;
|
|
79
|
+
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
rules: {
|
|
3
|
+
"dto-annotation-property-consistency": {
|
|
4
|
+
meta: {
|
|
5
|
+
type: "problem",
|
|
6
|
+
docs: {
|
|
7
|
+
description: "Ensure consistency between DTO annotations and property optionality",
|
|
8
|
+
category: "Best Practices",
|
|
9
|
+
recommended: true,
|
|
10
|
+
},
|
|
11
|
+
messages: {
|
|
12
|
+
inconsistentOptionality: "Property '{{propName}}' has inconsistent optionality: {{annotation}} but property is {{propertyType}}",
|
|
13
|
+
inconsistentRequired: "Property '{{propName}}' has inconsistent required setting: {{annotation}} but property is {{propertyType}}",
|
|
14
|
+
},
|
|
15
|
+
schema: [],
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
create(context) {
|
|
19
|
+
return {
|
|
20
|
+
ClassDeclaration(node) {
|
|
21
|
+
const rawFilename = context.getFilename();
|
|
22
|
+
const filename = typeof rawFilename === 'string' ? rawFilename.replace(/\\/g, '/') : '';
|
|
23
|
+
|
|
24
|
+
// Nur für DTO-Dateien anwenden (auch in Test-Fixtures)
|
|
25
|
+
const isDtoPath = filename.toLowerCase().includes('/dto/');
|
|
26
|
+
const isDtoName = filename.endsWith('Dto.ts');
|
|
27
|
+
const isFixtureDto = filename.includes('/__tests__/fixtures/');
|
|
28
|
+
if (!(isDtoPath || isDtoName || isFixtureDto)) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Durchlaufe alle Properties der Klasse
|
|
33
|
+
for (const member of node.body.body) {
|
|
34
|
+
if (member.type === 'PropertyDefinition') {
|
|
35
|
+
const propName = member.key.name;
|
|
36
|
+
const decorators = member.decorators || [];
|
|
37
|
+
|
|
38
|
+
// Debug-Logging entfernt für saubere JSON-Ausgabe
|
|
39
|
+
|
|
40
|
+
// Finde @IsOptional und @ApiProperty Decorators
|
|
41
|
+
let hasIsOptional = false;
|
|
42
|
+
let apiPropertyRequired = null;
|
|
43
|
+
|
|
44
|
+
for (const decorator of decorators) {
|
|
45
|
+
if (decorator.expression.type === 'CallExpression') {
|
|
46
|
+
const callee = decorator.expression.callee;
|
|
47
|
+
|
|
48
|
+
// Prüfe @IsOptional
|
|
49
|
+
if (callee.type === 'Identifier' && callee.name === 'IsOptional') {
|
|
50
|
+
hasIsOptional = true;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Prüfe @ApiProperty
|
|
54
|
+
if (callee.type === 'Identifier' && callee.name === 'ApiProperty') {
|
|
55
|
+
const args = decorator.expression.arguments;
|
|
56
|
+
if (args.length > 0 && args[0].type === 'ObjectExpression') {
|
|
57
|
+
for (const prop of args[0].properties) {
|
|
58
|
+
if (prop.key.name === 'required' && prop.value.type === 'Literal') {
|
|
59
|
+
apiPropertyRequired = prop.value.value;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
} else if (decorator.expression.type === 'Identifier') {
|
|
65
|
+
// Prüfe @IsOptional ohne Argumente
|
|
66
|
+
if (decorator.expression.name === 'IsOptional') {
|
|
67
|
+
hasIsOptional = true;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Prüfe Property-Optionalität
|
|
73
|
+
const isPropertyOptional = member.optional || false;
|
|
74
|
+
const propertyType = isPropertyOptional ? 'optional (?)' : 'required';
|
|
75
|
+
|
|
76
|
+
// Prüfe Konsistenz zwischen @IsOptional und Property-Optionalität
|
|
77
|
+
if (hasIsOptional && !isPropertyOptional) {
|
|
78
|
+
context.report({
|
|
79
|
+
node: member,
|
|
80
|
+
messageId: 'inconsistentOptionality',
|
|
81
|
+
data: {
|
|
82
|
+
propName,
|
|
83
|
+
annotation: '@IsOptional()',
|
|
84
|
+
propertyType,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Prüfe Konsistenz zwischen required: false/true und Property-Optionalität
|
|
90
|
+
if (apiPropertyRequired !== null) {
|
|
91
|
+
const expectedOptionality = !apiPropertyRequired;
|
|
92
|
+
if (expectedOptionality !== isPropertyOptional) {
|
|
93
|
+
context.report({
|
|
94
|
+
node: member,
|
|
95
|
+
messageId: 'inconsistentRequired',
|
|
96
|
+
data: {
|
|
97
|
+
propName,
|
|
98
|
+
annotation: `required: ${apiPropertyRequired}`,
|
|
99
|
+
propertyType,
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
};
|