@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,148 @@
1
+ /**
2
+ * ESLint-Regel: service-architecture
3
+ * Stellt sicher, dass Services niemals Entities, sondern nur DTOs zurückgeben
4
+ */
5
+
6
+ /** @type {import('eslint').Rule.RuleModule} */
7
+ const enforceServiceDtoRule = {
8
+ meta: {
9
+ type: "problem",
10
+ docs: {
11
+ description: "Services müssen DTOs statt Entities zurückgeben",
12
+ category: "Architecture",
13
+ recommended: true,
14
+ },
15
+ schema: [],
16
+ messages: {
17
+ serviceReturnsEntity: "Service-Methode '{{methodName}}' darf keine Entity '{{entityName}}' zurückgeben. Verwende stattdessen ein DTO.",
18
+ resultContainsEntity: "Result<{{entityName}}> ist nicht erlaubt. Services müssen Result<{{suggestedDto}}> zurückgeben.",
19
+ entityInPromiseResult: "Promise<Result<{{entityName}}>> ist nicht erlaubt. Verwende Promise<Result<{{suggestedDto}}>>.",
20
+ },
21
+ },
22
+ create(context) {
23
+ const filename = context.getFilename();
24
+ const isServiceFile = filename.includes("/service/") &&
25
+ filename.endsWith(".ts") &&
26
+ !filename.includes("test") &&
27
+ !filename.includes("BaseService");
28
+
29
+ if (!isServiceFile) return {};
30
+
31
+ function isEntityType(typeName) {
32
+ if (!typeName || typeof typeName !== "string") return false;
33
+
34
+ // Prüfe auf Entity-Suffix
35
+ if (typeName.endsWith("Entity")) return true;
36
+
37
+ // Prüfe auf bekannte Entity-Patterns
38
+ const entityPatterns = [
39
+ /.*Entity$/,
40
+ /.*Model$/, // Falls Models als Entities verwendet werden
41
+ ];
42
+
43
+ return entityPatterns.some(pattern => pattern.test(typeName));
44
+ }
45
+
46
+ function extractTypeFromResult(typeAnnotation) {
47
+ if (!typeAnnotation) return null;
48
+
49
+ const sourceCode = context.getSourceCode();
50
+ const typeText = sourceCode.getText(typeAnnotation);
51
+
52
+ // Extract type from Result<Type> or Promise<Result<Type>>
53
+ const resultMatch = typeText.match(/Result<([^>]+)>/);
54
+ if (resultMatch) {
55
+ let innerType = resultMatch[1].trim();
56
+
57
+ // Handle arrays like MonsterEntity[]
58
+ if (innerType.endsWith("[]")) {
59
+ innerType = innerType.slice(0, -2);
60
+ }
61
+
62
+ // Handle union types like MonsterEntity | null
63
+ if (innerType.includes("|")) {
64
+ const types = innerType.split("|").map(t => t.trim());
65
+ innerType = types.find(t => t !== "null" && t !== "undefined") || innerType;
66
+ }
67
+
68
+ return innerType;
69
+ }
70
+
71
+ return null;
72
+ }
73
+
74
+ function suggestDtoName(entityName) {
75
+ if (!entityName) return "SomeDto";
76
+
77
+ // Transform EntityName to EntityNameDto
78
+ let baseName = entityName;
79
+ if (baseName.endsWith("Entity")) {
80
+ baseName = baseName.slice(0, -6); // Remove "Entity"
81
+ }
82
+
83
+ return `${baseName}Dto`;
84
+ }
85
+
86
+ function checkMethodReturnType(node) {
87
+ if (!node.returnType || !node.returnType.typeAnnotation) return;
88
+
89
+ const extractedType = extractTypeFromResult(node.returnType.typeAnnotation);
90
+ if (!extractedType) return;
91
+
92
+ if (isEntityType(extractedType)) {
93
+ const methodName = node.parent?.key?.name || "unknown";
94
+ const suggestedDto = suggestDtoName(extractedType);
95
+
96
+ const sourceCode = context.getSourceCode();
97
+ const fullReturnType = sourceCode.getText(node.returnType.typeAnnotation);
98
+
99
+ if (fullReturnType.includes("Promise<Result<")) {
100
+ context.report({
101
+ node: node.returnType.typeAnnotation,
102
+ messageId: "entityInPromiseResult",
103
+ data: {
104
+ entityName: extractedType,
105
+ suggestedDto: suggestedDto,
106
+ },
107
+ });
108
+ } else if (fullReturnType.includes("Result<")) {
109
+ context.report({
110
+ node: node.returnType.typeAnnotation,
111
+ messageId: "resultContainsEntity",
112
+ data: {
113
+ entityName: extractedType,
114
+ suggestedDto: suggestedDto,
115
+ },
116
+ });
117
+ }
118
+ }
119
+ }
120
+
121
+ return {
122
+ MethodDefinition(node) {
123
+ // Prüfe nur öffentliche Methoden in Service-Klassen
124
+ if (node.accessibility === "public" &&
125
+ node.kind === "method" &&
126
+ node.key?.name !== "constructor") {
127
+
128
+ checkMethodReturnType(node.value);
129
+ }
130
+ },
131
+
132
+ // Prüfe auch Arrow Functions als Methoden
133
+ Property(node) {
134
+ if (node.value &&
135
+ (node.value.type === "ArrowFunctionExpression" ||
136
+ node.value.type === "FunctionExpression")) {
137
+ checkMethodReturnType(node.value);
138
+ }
139
+ },
140
+ };
141
+ },
142
+ };
143
+
144
+ export default {
145
+ rules: {
146
+ "enforce-service-dto": enforceServiceDtoRule,
147
+ },
148
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * SonarJS Rules
3
+ *
4
+ * SonarJS-Regeln für Code-Qualität und Sicherheit
5
+ */
6
+
7
+ export default {
8
+ rules: {
9
+ // SonarJS-Regeln (erweitert)
10
+ "sonarjs/no-all-duplicated-branches": "error",
11
+ "sonarjs/no-element-overwrite": "error",
12
+ "sonarjs/no-empty-collection": "error",
13
+ "sonarjs/no-extra-arguments": "error",
14
+ "sonarjs/no-identical-conditions": "error",
15
+ "sonarjs/no-identical-expressions": "error",
16
+ "sonarjs/no-ignored-return": "error",
17
+ "sonarjs/no-one-iteration-loop": "error",
18
+ "sonarjs/no-redundant-boolean": "error",
19
+ "sonarjs/no-redundant-jump": "error",
20
+ "sonarjs/no-same-line-conditional": "error",
21
+ "sonarjs/no-small-switch": "error",
22
+ "sonarjs/no-unused-collection": "error",
23
+ },
24
+ };
25
+
26
+
@@ -0,0 +1,7 @@
1
+ // Strict Mode Rules
2
+ export default {
3
+ rules: {
4
+ // babel inserts `'use strict';` for us
5
+ strict: ["error", "never"],
6
+ },
7
+ };