@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.
Files changed (171) hide show
  1. package/CHANGELOG.md +1093 -0
  2. package/configs/.gitkeep +1 -0
  3. package/configs/admin.js +203 -0
  4. package/configs/api-client.js +46 -0
  5. package/configs/backend.js +895 -0
  6. package/configs/domains.js +123 -0
  7. package/configs/frontend.js +30 -0
  8. package/configs/image-server.js +26 -0
  9. package/configs/ionos-proxy.js +372 -0
  10. package/configs/nestjs.js +156 -0
  11. package/configs/node.js +92 -0
  12. package/configs/react.js +111 -0
  13. package/configs/wiki.js +42 -0
  14. package/index.js +39 -0
  15. package/package.json +85 -0
  16. package/rules/.gitkeep +1 -0
  17. package/rules/__tests__/analyze-relation-usage.test.js.disabled +300 -0
  18. package/rules/__tests__/complexity.test.js.disabled +300 -0
  19. package/rules/__tests__/enforce-dto-factory-in-services.integration.test.js +226 -0
  20. package/rules/__tests__/enforce-dto-factory-in-services.test.js +177 -0
  21. package/rules/__tests__/enforce-entity-dto-create-no-id.integration.test.js +18 -0
  22. package/rules/__tests__/enforce-function-argument-count.test.js.disabled +300 -0
  23. package/rules/__tests__/enforce-repository-token-handling.test.js +58 -0
  24. package/rules/__tests__/english-only-code-strings.test.js.disabled +300 -0
  25. package/rules/__tests__/eslint-rules.integration.test.ts +350 -0
  26. package/rules/__tests__/integration-test-controller-response-dto.js +261 -0
  27. package/rules/__tests__/integration-test-dto-factory-in-services.js +260 -0
  28. package/rules/__tests__/integration-test-no-entity-type-casting.js +161 -0
  29. package/rules/__tests__/integration-test-typeorm-naming-conventions.js +501 -0
  30. package/rules/__tests__/test-config.js +33 -0
  31. package/rules/admin-controller-security.js +180 -0
  32. package/rules/analyze-relation-usage.js +687 -0
  33. package/rules/api-response-dto.js +174 -0
  34. package/rules/auth-guard-required.js +142 -0
  35. package/rules/backend-specific.js +36 -0
  36. package/rules/best-practices.js +421 -0
  37. package/rules/complexity.js +20 -0
  38. package/rules/controller-architecture.js +340 -0
  39. package/rules/controller-naming-conventions.js +190 -0
  40. package/rules/controller-readonly-restriction.js +148 -0
  41. package/rules/controller-swagger-complete.js +312 -0
  42. package/rules/controller-swagger-docs.js +119 -0
  43. package/rules/controller-swagger-english.js +320 -0
  44. package/rules/coordinate-naming.js +132 -0
  45. package/rules/custom-mui-button.js +135 -0
  46. package/rules/dead-code-detection-backend.js +50 -0
  47. package/rules/dead-code-detection-frontend.js +48 -0
  48. package/rules/dead-code-detection.js +71 -0
  49. package/rules/debug-controller-response-dto.js +79 -0
  50. package/rules/deprecate.js +8 -0
  51. package/rules/dto-annotation-property-consistency.js +111 -0
  52. package/rules/dto-entity-mapping-completeness.js +688 -0
  53. package/rules/dto-entity-swagger-separation.js +265 -0
  54. package/rules/dto-entity-type-consistency.js +352 -0
  55. package/rules/dto-entity-type-matching.js +519 -0
  56. package/rules/dto-naming-convention.js +98 -0
  57. package/rules/dto-visibility-modifiers.js +159 -0
  58. package/rules/enforce-api-versioning.js +122 -0
  59. package/rules/enforce-app-module-registration.js +179 -0
  60. package/rules/enforce-basecontroller.js +152 -0
  61. package/rules/enforce-body-request-dto.js +141 -0
  62. package/rules/enforce-controller-response-dto.js +349 -0
  63. package/rules/enforce-custom-error-classes.js +242 -0
  64. package/rules/enforce-database-transaction-safety.js +179 -0
  65. package/rules/enforce-dto-constructor.js +95 -0
  66. package/rules/enforce-dto-create-parameter-types.js +170 -0
  67. package/rules/enforce-dto-create-pattern.js +274 -0
  68. package/rules/enforce-dto-entity-creation.js +164 -0
  69. package/rules/enforce-dto-factory-in-services.js +188 -0
  70. package/rules/enforce-dto-from-entity-method.js +47 -0
  71. package/rules/enforce-dto-from-entity.js +314 -0
  72. package/rules/enforce-dto-naming-conventions.js +212 -0
  73. package/rules/enforce-dto-naming.js +176 -0
  74. package/rules/enforce-dto-usage-simple.js +114 -0
  75. package/rules/enforce-dto-usage.js +407 -0
  76. package/rules/enforce-eager-translation-loading.js +178 -0
  77. package/rules/enforce-entity-creation-pattern.js +137 -0
  78. package/rules/enforce-entity-dto-convert-method.js +157 -0
  79. package/rules/enforce-entity-dto-create-no-id.js +117 -0
  80. package/rules/enforce-entity-dto-extends-base.js +141 -0
  81. package/rules/enforce-entity-dto-from-request-dto-structure.js +113 -0
  82. package/rules/enforce-entity-dto-fromentity-complex.js +69 -0
  83. package/rules/enforce-entity-dto-fromentity-simple.js +69 -0
  84. package/rules/enforce-entity-dto-fromrequestdto-structure.js +262 -0
  85. package/rules/enforce-entity-dto-methods-restriction.js +159 -0
  86. package/rules/enforce-entity-dto-no-request-dto.js +102 -0
  87. package/rules/enforce-entity-dto-optional-auto-fields.js +101 -0
  88. package/rules/enforce-entity-dto-required-methods.js +248 -0
  89. package/rules/enforce-entity-factory-pattern.js +180 -0
  90. package/rules/enforce-entity-instantiation-in-toentity.js +125 -0
  91. package/rules/enforce-enum-for-playable-entities.js +95 -0
  92. package/rules/enforce-error-handling.js +257 -0
  93. package/rules/enforce-explicit-dto-types.js +118 -0
  94. package/rules/enforce-from-request-dto-usage.js +62 -0
  95. package/rules/enforce-generic-entity-dto.js +71 -0
  96. package/rules/enforce-inject-decorator.js +133 -0
  97. package/rules/enforce-lazy-type-loading.js +170 -0
  98. package/rules/enforce-module-existence.js +157 -0
  99. package/rules/enforce-nonentity-dto-create.js +107 -0
  100. package/rules/enforce-playable-entity-naming.js +108 -0
  101. package/rules/enforce-repository-token-handling.js +92 -0
  102. package/rules/enforce-request-dto-no-entity-dto.js +201 -0
  103. package/rules/enforce-request-dto-required-fields.js +217 -0
  104. package/rules/enforce-result-pattern.js +45 -0
  105. package/rules/enforce-service-relation-loading.js +116 -0
  106. package/rules/enforce-test-coverage.js +96 -0
  107. package/rules/enforce-toentity-conditional-assignment.js +132 -0
  108. package/rules/enforce-translations-required.js +203 -0
  109. package/rules/enforce-typeorm-naming-conventions.js +366 -0
  110. package/rules/enforce-vite-health-metrics.js +240 -0
  111. package/rules/entity-required-properties.js +321 -0
  112. package/rules/entity-to-dto-test.js +73 -0
  113. package/rules/enum-database-validation.js +149 -0
  114. package/rules/errors.js +190 -0
  115. package/rules/es6.js +204 -0
  116. package/rules/eslint-plugin-no-comments.js +44 -0
  117. package/rules/filename-class-name-match.js +62 -0
  118. package/rules/forbid-fromentity-outside-entity-folder.js +237 -0
  119. package/rules/function-params-newline.js +111 -0
  120. package/rules/imports.js +264 -0
  121. package/rules/jest.js +13 -0
  122. package/rules/jsx.js +16 -0
  123. package/rules/max-classes-per-file.js +49 -0
  124. package/rules/multiline-formatting.js +146 -0
  125. package/rules/no-blank-lines-between-decorators-and-properties.js +95 -0
  126. package/rules/no-comments.js +62 -0
  127. package/rules/no-dto-constructors.js +126 -0
  128. package/rules/no-dto-default-values.js +220 -0
  129. package/rules/no-dto-duplicates.js +127 -0
  130. package/rules/no-dto-in-entity.js +99 -0
  131. package/rules/no-dynamic-import-in-types.js +71 -0
  132. package/rules/no-dynamic-imports-in-controllers.js +95 -0
  133. package/rules/no-entity-imports-in-controllers.js +101 -0
  134. package/rules/no-entity-in-swagger-docs.js +139 -0
  135. package/rules/no-entity-type-casting.js +104 -0
  136. package/rules/no-fetch.js +77 -0
  137. package/rules/no-import-meta-env.js +151 -0
  138. package/rules/no-inline-styles.js +5 -0
  139. package/rules/no-magic-values.js +85 -0
  140. package/rules/no-partial-type.js +168 -0
  141. package/rules/no-relative-imports.js +31 -0
  142. package/rules/no-tsyringe.js +181 -0
  143. package/rules/no-type-assertion.js +175 -0
  144. package/rules/no-undefined-entity-properties.js +121 -0
  145. package/rules/node.js +44 -0
  146. package/rules/perfectionist.js +50 -0
  147. package/rules/performance-minimal.js +155 -0
  148. package/rules/performance.js +44 -0
  149. package/rules/pino-logger-format.js +200 -0
  150. package/rules/prefer-dto-classes.js +112 -0
  151. package/rules/prefer-dto-create-method.js +225 -0
  152. package/rules/promises.js +17 -0
  153. package/rules/react-hooks.js +15 -0
  154. package/rules/react.js +28 -0
  155. package/rules/regexp.js +70 -0
  156. package/rules/require-dto-response.js +81 -0
  157. package/rules/require-valid-relations.js +388 -0
  158. package/rules/result-pattern.js +162 -0
  159. package/rules/security.js +37 -0
  160. package/rules/service-architecture.js +148 -0
  161. package/rules/sonarjs.js +26 -0
  162. package/rules/strict.js +7 -0
  163. package/rules/style.js +611 -0
  164. package/rules/stylistic.js +93 -0
  165. package/rules/typeorm-column-type-validation.js +224 -0
  166. package/rules/typescript-advanced.js +113 -0
  167. package/rules/typescript-core.js +111 -0
  168. package/rules/typescript.js +146 -0
  169. package/rules/unicorn.js +168 -0
  170. package/rules/variables.js +51 -0
  171. 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,8 @@
1
+ // Deprecation Rules
2
+ export default {
3
+ rules: {
4
+ "deprecate/function": "error",
5
+ "deprecate/member-expression": "error",
6
+ "deprecate/import": "error",
7
+ },
8
+ };
@@ -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
+ };