@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,237 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint-Regel: Verbotet fromEntity-Methoden außerhalb des /dto/Entity/ Ordners
|
|
3
|
+
*
|
|
4
|
+
* Diese Regel stellt sicher, dass:
|
|
5
|
+
* - DTOs im /dto/Entity/ Ordner fromEntity-Methoden haben DÜRFEN
|
|
6
|
+
* - DTOs außerhalb des /dto/Entity/ Ordners KEINE fromEntity-Methoden haben DÜRFEN
|
|
7
|
+
* - Request-, Response- und andere DTOs sind reine Datenstrukturen ohne Entity-Konvertierung
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
/** @type {import('eslint').Rule.RuleModule} */
|
|
11
|
+
const forbidFromEntityOutsideEntityFolderRule = {
|
|
12
|
+
meta: {
|
|
13
|
+
type: "problem",
|
|
14
|
+
docs: {
|
|
15
|
+
description: "fromEntity-Methoden sind nur in DTOs im /dto/Entity/ Ordner erlaubt",
|
|
16
|
+
category: "Architecture",
|
|
17
|
+
recommended: true,
|
|
18
|
+
},
|
|
19
|
+
hasSuggestions: true,
|
|
20
|
+
schema: [],
|
|
21
|
+
messages: {
|
|
22
|
+
forbiddenFromEntityOutsideEntityFolder: "fromEntity-Methode ist in DTO '{{dtoName}}' nicht erlaubt. Diese Datei liegt außerhalb des /dto/Entity/ Ordners. fromEntity-Methoden sind nur für Entity-DTOs erlaubt.",
|
|
23
|
+
forbiddenFromEntityArrayOutsideEntityFolder: "fromEntityArray-Methode ist in DTO '{{dtoName}}' nicht erlaubt. Diese Datei liegt außerhalb des /dto/Entity/ Ordners. fromEntityArray-Methoden sind nur für Entity-DTOs erlaubt.",
|
|
24
|
+
suggestMoveToEntityFolder: "DTO '{{dtoName}}' sollte in den /dto/Entity/ Ordner verschoben werden, wenn es Entity-Konvertierung benötigt.",
|
|
25
|
+
suggestRemoveFromEntityMethod: "fromEntity-Methode entfernen, da dieser DTO keine Entity-Konvertierung benötigt.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
|
|
29
|
+
create(context) {
|
|
30
|
+
return {
|
|
31
|
+
ClassDeclaration(node) {
|
|
32
|
+
const filename = context.getFilename();
|
|
33
|
+
const dtoName = node.id?.name;
|
|
34
|
+
|
|
35
|
+
if (!dtoName || !dtoName.endsWith("Dto")) {
|
|
36
|
+
return; // Kein DTO
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Prüfe, ob die Datei im /dto/Entity/ Ordner liegt
|
|
40
|
+
const isInEntityFolder = filename.includes("/dto/Entity/");
|
|
41
|
+
|
|
42
|
+
if (isInEntityFolder) {
|
|
43
|
+
return; // Entity-DTOs dürfen fromEntity-Methoden haben
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Prüfe auf fromEntity und fromEntityArray Methoden
|
|
47
|
+
const hasFromEntity = node.body.body.some(member =>
|
|
48
|
+
member.type === "MethodDefinition" &&
|
|
49
|
+
member.static &&
|
|
50
|
+
member.key?.name === "fromEntity"
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const hasFromEntityArray = node.body.body.some(member =>
|
|
54
|
+
member.type === "MethodDefinition" &&
|
|
55
|
+
member.static &&
|
|
56
|
+
member.key?.name === "fromEntityArray"
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
if (hasFromEntity) {
|
|
60
|
+
context.report({
|
|
61
|
+
node,
|
|
62
|
+
messageId: "forbiddenFromEntityOutsideEntityFolder",
|
|
63
|
+
data: {
|
|
64
|
+
dtoName,
|
|
65
|
+
},
|
|
66
|
+
suggest: [
|
|
67
|
+
{
|
|
68
|
+
messageId: "suggestMoveToEntityFolder",
|
|
69
|
+
data: { dtoName },
|
|
70
|
+
fix: () => null, // Keine automatische Korrektur
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
messageId: "suggestRemoveFromEntityMethod",
|
|
74
|
+
data: { dtoName },
|
|
75
|
+
fix: (fixer) => {
|
|
76
|
+
// Finde und entferne die fromEntity-Methode
|
|
77
|
+
const fromEntityMethod = node.body.body.find(member =>
|
|
78
|
+
member.type === "MethodDefinition" &&
|
|
79
|
+
member.static &&
|
|
80
|
+
member.key?.name === "fromEntity"
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
if (fromEntityMethod) {
|
|
84
|
+
return fixer.remove(fromEntityMethod);
|
|
85
|
+
}
|
|
86
|
+
return null;
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
],
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (hasFromEntityArray) {
|
|
94
|
+
context.report({
|
|
95
|
+
node,
|
|
96
|
+
messageId: "forbiddenFromEntityArrayOutsideEntityFolder",
|
|
97
|
+
data: {
|
|
98
|
+
dtoName,
|
|
99
|
+
},
|
|
100
|
+
suggest: [
|
|
101
|
+
{
|
|
102
|
+
messageId: "suggestMoveToEntityFolder",
|
|
103
|
+
data: { dtoName },
|
|
104
|
+
fix: () => null, // Keine automatische Korrektur
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
messageId: "suggestRemoveFromEntityMethod",
|
|
108
|
+
data: { dtoName },
|
|
109
|
+
fix: (fixer) => {
|
|
110
|
+
// Finde und entferne die fromEntityArray-Methode
|
|
111
|
+
const fromEntityArrayMethod = node.body.body.find(member =>
|
|
112
|
+
member.type === "MethodDefinition" &&
|
|
113
|
+
member.static &&
|
|
114
|
+
member.key?.name === "fromEntityArray"
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
if (fromEntityArrayMethod) {
|
|
118
|
+
return fixer.remove(fromEntityArrayMethod);
|
|
119
|
+
}
|
|
120
|
+
return null;
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
|
|
128
|
+
// Auch für export default class
|
|
129
|
+
ExportDefaultDeclaration(node) {
|
|
130
|
+
if (node.declaration.type !== "ClassDeclaration") {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const filename = context.getFilename();
|
|
135
|
+
const dtoName = node.declaration.id?.name;
|
|
136
|
+
|
|
137
|
+
if (!dtoName || !dtoName.endsWith("Dto")) {
|
|
138
|
+
return; // Kein DTO
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Prüfe, ob die Datei im /dto/Entity/ Ordner liegt
|
|
142
|
+
const isInEntityFolder = filename.includes("/dto/Entity/");
|
|
143
|
+
|
|
144
|
+
if (isInEntityFolder) {
|
|
145
|
+
return; // Entity-DTOs dürfen fromEntity-Methoden haben
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Prüfe auf fromEntity und fromEntityArray Methoden
|
|
149
|
+
const hasFromEntity = node.declaration.body.body.some(member =>
|
|
150
|
+
member.type === "MethodDefinition" &&
|
|
151
|
+
member.static &&
|
|
152
|
+
member.key?.name === "fromEntity"
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
const hasFromEntityArray = node.declaration.body.body.some(member =>
|
|
156
|
+
member.type === "MethodDefinition" &&
|
|
157
|
+
member.static &&
|
|
158
|
+
member.key?.name === "fromEntityArray"
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
if (hasFromEntity) {
|
|
162
|
+
context.report({
|
|
163
|
+
node,
|
|
164
|
+
messageId: "forbiddenFromEntityOutsideEntityFolder",
|
|
165
|
+
data: {
|
|
166
|
+
dtoName,
|
|
167
|
+
},
|
|
168
|
+
suggest: [
|
|
169
|
+
{
|
|
170
|
+
messageId: "suggestMoveToEntityFolder",
|
|
171
|
+
data: { dtoName },
|
|
172
|
+
fix: () => null, // Keine automatische Korrektur
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
messageId: "suggestRemoveFromEntityMethod",
|
|
176
|
+
data: { dtoName },
|
|
177
|
+
fix: (fixer) => {
|
|
178
|
+
// Finde und entferne die fromEntity-Methode
|
|
179
|
+
const fromEntityMethod = node.declaration.body.body.find(member =>
|
|
180
|
+
member.type === "MethodDefinition" &&
|
|
181
|
+
member.static &&
|
|
182
|
+
member.key?.name === "fromEntity"
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
if (fromEntityMethod) {
|
|
186
|
+
return fixer.remove(fromEntityMethod);
|
|
187
|
+
}
|
|
188
|
+
return null;
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
],
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (hasFromEntityArray) {
|
|
196
|
+
context.report({
|
|
197
|
+
node,
|
|
198
|
+
messageId: "forbiddenFromEntityArrayOutsideEntityFolder",
|
|
199
|
+
data: {
|
|
200
|
+
dtoName,
|
|
201
|
+
},
|
|
202
|
+
suggest: [
|
|
203
|
+
{
|
|
204
|
+
messageId: "suggestMoveToEntityFolder",
|
|
205
|
+
data: { dtoName },
|
|
206
|
+
fix: () => null, // Keine automatische Korrektur
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
messageId: "suggestRemoveFromEntityMethod",
|
|
210
|
+
data: { dtoName },
|
|
211
|
+
fix: (fixer) => {
|
|
212
|
+
// Finde und entferne die fromEntityArray-Methode
|
|
213
|
+
const fromEntityArrayMethod = node.declaration.body.body.find(member =>
|
|
214
|
+
member.type === "MethodDefinition" &&
|
|
215
|
+
member.static &&
|
|
216
|
+
member.key?.name === "fromEntityArray"
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
if (fromEntityArrayMethod) {
|
|
220
|
+
return fixer.remove(fromEntityArrayMethod);
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
],
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
export default {
|
|
234
|
+
rules: {
|
|
235
|
+
"forbid-fromentity-outside-entity-folder": forbidFromEntityOutsideEntityFolderRule,
|
|
236
|
+
},
|
|
237
|
+
};
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ESLint Custom Rule: function-params-newline
|
|
3
|
+
*
|
|
4
|
+
* Erzwingt Zeilenumbrüche bei Funktionsdeklarationen mit mehreren Parametern.
|
|
5
|
+
*
|
|
6
|
+
* Bei mehr als einem Parameter soll immer umgebrochen werden:
|
|
7
|
+
*
|
|
8
|
+
* ❌ Falsch:
|
|
9
|
+
* public async getAll (@Req() _req: Request, @Query() queryParams: ItemQueryRequestDto, @Res() res: Response): Promise<void> {
|
|
10
|
+
*
|
|
11
|
+
* ✅ Richtig:
|
|
12
|
+
* public async getAll (
|
|
13
|
+
* @Req() _req: Request,
|
|
14
|
+
* @Query() queryParams: ItemQueryRequestDto,
|
|
15
|
+
* @Res() res: Response
|
|
16
|
+
* ): Promise<void> {
|
|
17
|
+
*
|
|
18
|
+
* Diese Regel gilt für:
|
|
19
|
+
* - Funktionsdeklarationen
|
|
20
|
+
* - Funktionsausdrücke
|
|
21
|
+
* - Arrow-Funktionen
|
|
22
|
+
* - Methoden in Klassen
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
meta: {
|
|
27
|
+
type: "layout",
|
|
28
|
+
docs: {
|
|
29
|
+
description: "Erzwingt Zeilenumbrüche bei Funktionen mit mehreren Parametern",
|
|
30
|
+
category: "Stylistic Issues",
|
|
31
|
+
recommended: false,
|
|
32
|
+
},
|
|
33
|
+
fixable: "whitespace",
|
|
34
|
+
messages: {
|
|
35
|
+
missingNewline: "Bei mehr als einem Parameter soll jeder Parameter auf einer eigenen Zeile stehen",
|
|
36
|
+
},
|
|
37
|
+
schema: [],
|
|
38
|
+
},
|
|
39
|
+
|
|
40
|
+
create (context) {
|
|
41
|
+
const sourceCode = context.sourceCode ?? context.getSourceCode();
|
|
42
|
+
|
|
43
|
+
function checkParams (node) {
|
|
44
|
+
if (!node.params || node.params.length <= 1) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
const firstParam = node.params[0];
|
|
49
|
+
const lastParam = node.params[node.params.length - 1];
|
|
50
|
+
|
|
51
|
+
const openParen = sourceCode.getTokenBefore(firstParam);
|
|
52
|
+
const closeParen = sourceCode.getTokenAfter(lastParam);
|
|
53
|
+
|
|
54
|
+
if (!openParen || !closeParen) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const firstParamLine = firstParam.loc.start.line;
|
|
59
|
+
const openParenLine = openParen.loc.end.line;
|
|
60
|
+
|
|
61
|
+
if (firstParamLine === openParenLine) {
|
|
62
|
+
const lastParamLine = lastParam.loc.end.line;
|
|
63
|
+
|
|
64
|
+
if (firstParamLine === lastParamLine) {
|
|
65
|
+
context.report({
|
|
66
|
+
node,
|
|
67
|
+
loc: {
|
|
68
|
+
start: openParen.loc.start,
|
|
69
|
+
end: closeParen.loc.end,
|
|
70
|
+
},
|
|
71
|
+
messageId: "missingNewline",
|
|
72
|
+
fix (fixer) {
|
|
73
|
+
const fixes = [];
|
|
74
|
+
|
|
75
|
+
fixes.push(fixer.insertTextAfter(openParen, "\n "));
|
|
76
|
+
|
|
77
|
+
for (let index = 0; index < node.params.length - 1; index++) {
|
|
78
|
+
const param = node.params[index];
|
|
79
|
+
const comma = sourceCode.getTokenAfter(param);
|
|
80
|
+
|
|
81
|
+
if (comma && comma.value === ",") {
|
|
82
|
+
fixes.push(fixer.insertTextAfter(comma, "\n "));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
fixes.push(fixer.insertTextBefore(closeParen, "\n"));
|
|
87
|
+
|
|
88
|
+
return fixes;
|
|
89
|
+
},
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
FunctionDeclaration: checkParams,
|
|
97
|
+
FunctionExpression: checkParams,
|
|
98
|
+
ArrowFunctionExpression: checkParams,
|
|
99
|
+
MethodDefinition (node) {
|
|
100
|
+
if (node.value && node.value.params) {
|
|
101
|
+
checkParams(node.value);
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
};
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
|
package/rules/imports.js
ADDED
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
rules: {
|
|
3
|
+
// Static analysis:
|
|
4
|
+
|
|
5
|
+
// ensure named imports coupled with named exports
|
|
6
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/named.md#when-not-to-use-it
|
|
7
|
+
"import/named": "error",
|
|
8
|
+
|
|
9
|
+
// ensure default import coupled with default export
|
|
10
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/default.md#when-not-to-use-it
|
|
11
|
+
"import/default": "off",
|
|
12
|
+
|
|
13
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/namespace.md
|
|
14
|
+
"import/namespace": "off",
|
|
15
|
+
|
|
16
|
+
// Helpful warnings:
|
|
17
|
+
|
|
18
|
+
// disallow invalid exports, e.g. multiple defaults
|
|
19
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/export.md
|
|
20
|
+
"import/export": "error",
|
|
21
|
+
|
|
22
|
+
// do not allow a default import name to match a named export
|
|
23
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-as-default.md
|
|
24
|
+
"import/no-named-as-default": "error",
|
|
25
|
+
|
|
26
|
+
// warn on accessing default export property names that are also named exports
|
|
27
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-as-default-member.md
|
|
28
|
+
"import/no-named-as-default-member": "error",
|
|
29
|
+
|
|
30
|
+
// disallow use of jsdoc-marked-deprecated imports
|
|
31
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-deprecated.md
|
|
32
|
+
"import/no-deprecated": "off",
|
|
33
|
+
|
|
34
|
+
// Forbid the use of extraneous packages
|
|
35
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-extraneous-dependencies.md
|
|
36
|
+
// paths are treated both as absolute paths, and relative to process.cwd()
|
|
37
|
+
"import/no-extraneous-dependencies": [
|
|
38
|
+
"error",
|
|
39
|
+
{
|
|
40
|
+
devDependencies: [
|
|
41
|
+
"test/**", // tape, common npm pattern
|
|
42
|
+
"tests/**", // also common npm pattern
|
|
43
|
+
"spec/**", // mocha, rspec-like pattern
|
|
44
|
+
"**/__tests__/**", // jest pattern
|
|
45
|
+
"**/__mocks__/**", // jest pattern
|
|
46
|
+
"test.{js,jsx}", // repos with a single test file
|
|
47
|
+
"test-*.{js,jsx}", // repos with multiple top-level test files
|
|
48
|
+
"**/*{.,_}{test,spec}.{js,jsx}", // tests where the extension or filename suffix denotes that it is a test
|
|
49
|
+
"**/jest.config.js", // jest config
|
|
50
|
+
"**/jest.setup.js", // jest setup
|
|
51
|
+
"**/vue.config.js", // vue-cli config
|
|
52
|
+
"**/webpack.config.js", // webpack config
|
|
53
|
+
"**/webpack.config.*.js", // webpack config
|
|
54
|
+
"**/rollup.config.js", // rollup config
|
|
55
|
+
"**/rollup.config.*.js", // rollup config
|
|
56
|
+
"**/gulpfile.js", // gulp config
|
|
57
|
+
"**/gulpfile.*.js", // gulp config
|
|
58
|
+
"**/Gruntfile{,.js}", // grunt config
|
|
59
|
+
"**/protractor.conf.js", // protractor config
|
|
60
|
+
"**/protractor.conf.*.js", // protractor config
|
|
61
|
+
"**/karma.conf.js", // karma config
|
|
62
|
+
"**/.eslintrc.js", // eslint config
|
|
63
|
+
],
|
|
64
|
+
optionalDependencies: false,
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
|
|
68
|
+
// Forbid mutable exports
|
|
69
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-mutable-exports.md
|
|
70
|
+
"import/no-mutable-exports": "error",
|
|
71
|
+
|
|
72
|
+
// Module systems:
|
|
73
|
+
|
|
74
|
+
// disallow require()
|
|
75
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-commonjs.md
|
|
76
|
+
"import/no-commonjs": "off",
|
|
77
|
+
|
|
78
|
+
// disallow AMD require/define
|
|
79
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-amd.md
|
|
80
|
+
"import/no-amd": "error",
|
|
81
|
+
|
|
82
|
+
// No Node.js builtin modules
|
|
83
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-nodejs-modules.md
|
|
84
|
+
// TODO: enable?
|
|
85
|
+
"import/no-nodejs-modules": "off",
|
|
86
|
+
|
|
87
|
+
// Style guide:
|
|
88
|
+
|
|
89
|
+
// disallow non-import statements appearing before import statements
|
|
90
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/first.md
|
|
91
|
+
"import/first": "error",
|
|
92
|
+
|
|
93
|
+
// disallow non-import statements appearing before import statements
|
|
94
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/imports-first.md
|
|
95
|
+
// deprecated: use `import/first`
|
|
96
|
+
"import/imports-first": "off",
|
|
97
|
+
|
|
98
|
+
// disallow duplicate imports
|
|
99
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-duplicates.md
|
|
100
|
+
"import/no-duplicates": "error",
|
|
101
|
+
|
|
102
|
+
// disallow namespace imports
|
|
103
|
+
// TODO: enable?
|
|
104
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-namespace.md
|
|
105
|
+
"import/no-namespace": "off",
|
|
106
|
+
|
|
107
|
+
// Ensure consistent use of file extension within the import path
|
|
108
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md
|
|
109
|
+
"import/extensions": [
|
|
110
|
+
"error",
|
|
111
|
+
"never",
|
|
112
|
+
{
|
|
113
|
+
scss: "always"
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
|
|
117
|
+
// ensure absolute imports are above relative imports and that unassigned imports are ignored
|
|
118
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/order.md
|
|
119
|
+
// TODO: enforce a stricter convention in module import order?
|
|
120
|
+
"import/order": [
|
|
121
|
+
"error",
|
|
122
|
+
{
|
|
123
|
+
pathGroupsExcludedImportTypes: ["react"],
|
|
124
|
+
"newlines-between": "always",
|
|
125
|
+
alphabetize: {
|
|
126
|
+
order: "asc",
|
|
127
|
+
caseInsensitive: true,
|
|
128
|
+
},
|
|
129
|
+
groups: [
|
|
130
|
+
"builtin",
|
|
131
|
+
["external", "internal"],
|
|
132
|
+
"parent",
|
|
133
|
+
"sibling",
|
|
134
|
+
"object",
|
|
135
|
+
],
|
|
136
|
+
},
|
|
137
|
+
],
|
|
138
|
+
|
|
139
|
+
// Require a newline after the last import/require in a group
|
|
140
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/newline-after-import.md
|
|
141
|
+
"import/newline-after-import": "error",
|
|
142
|
+
|
|
143
|
+
// Require modules with a single export to use a default export
|
|
144
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/prefer-default-export.md
|
|
145
|
+
"import/prefer-default-export": "error",
|
|
146
|
+
|
|
147
|
+
// Restrict which files can be imported in a given folder
|
|
148
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-restricted-paths.md
|
|
149
|
+
"import/no-restricted-paths": "off",
|
|
150
|
+
|
|
151
|
+
// Forbid modules to have too many dependencies
|
|
152
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/max-dependencies.md
|
|
153
|
+
"import/max-dependencies": ["off", { max: 10 }],
|
|
154
|
+
|
|
155
|
+
// Forbid import of modules using absolute paths
|
|
156
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-absolute-path.md
|
|
157
|
+
"import/no-absolute-path": "error",
|
|
158
|
+
|
|
159
|
+
// Forbid require() calls with expressions
|
|
160
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-dynamic-require.md
|
|
161
|
+
"import/no-dynamic-require": "error",
|
|
162
|
+
|
|
163
|
+
// prevent importing the submodules of other modules
|
|
164
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-internal-modules.md
|
|
165
|
+
"import/no-internal-modules": [
|
|
166
|
+
"off",
|
|
167
|
+
{
|
|
168
|
+
allow: [],
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
|
|
172
|
+
// Warn if a module could be mistakenly parsed as a script by a consumer
|
|
173
|
+
// leveraging Unambiguous JavaScript Grammar
|
|
174
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/unambiguous.md
|
|
175
|
+
// this should not be enabled until this proposal has at least been *presented* to TC39.
|
|
176
|
+
// At the moment, it's not a thing.
|
|
177
|
+
"import/unambiguous": "off",
|
|
178
|
+
|
|
179
|
+
// Forbid Webpack loader syntax in imports
|
|
180
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-webpack-loader-syntax.md
|
|
181
|
+
"import/no-webpack-loader-syntax": "error",
|
|
182
|
+
|
|
183
|
+
// Prevent unassigned imports
|
|
184
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-unassigned-import.md
|
|
185
|
+
// importing for side effects is perfectly acceptable, if you need side effects.
|
|
186
|
+
"import/no-unassigned-import": "off",
|
|
187
|
+
|
|
188
|
+
// Prevent importing the default as if it were named
|
|
189
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-named-default.md
|
|
190
|
+
"import/no-named-default": "error",
|
|
191
|
+
|
|
192
|
+
// Reports if a module's default export is unnamed
|
|
193
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/d9b712ac7fd1fddc391f7b234827925c160d956f/docs/rules/no-anonymous-default-export.md
|
|
194
|
+
"import/no-anonymous-default-export": [
|
|
195
|
+
"off",
|
|
196
|
+
{
|
|
197
|
+
allowArray: false,
|
|
198
|
+
allowArrowFunction: false,
|
|
199
|
+
allowAnonymousClass: false,
|
|
200
|
+
allowAnonymousFunction: false,
|
|
201
|
+
allowLiteral: false,
|
|
202
|
+
allowObject: false,
|
|
203
|
+
},
|
|
204
|
+
],
|
|
205
|
+
|
|
206
|
+
// This rule enforces that all exports are declared at the bottom of the file.
|
|
207
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/98acd6afd04dcb6920b81330114e146dc8532ea4/docs/rules/exports-last.md
|
|
208
|
+
// TODO: enable?
|
|
209
|
+
"import/exports-last": "off",
|
|
210
|
+
|
|
211
|
+
// Reports when named exports are not grouped together in a single export declaration
|
|
212
|
+
// or when multiple assignments to CommonJS module.exports or exports object are present
|
|
213
|
+
// in a single file.
|
|
214
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/group-exports.md
|
|
215
|
+
"import/group-exports": "off",
|
|
216
|
+
|
|
217
|
+
// forbid default exports. this is a terrible rule, do not use it.
|
|
218
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-default-export.md
|
|
219
|
+
"import/no-default-export": "off",
|
|
220
|
+
|
|
221
|
+
// Prohibit named exports. this is a terrible rule, do not use it.
|
|
222
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/1ec80fa35fa1819e2d35a70e68fb6a149fb57c5e/docs/rules/no-named-export.md
|
|
223
|
+
"import/no-named-export": "off",
|
|
224
|
+
|
|
225
|
+
// Forbid a module from importing itself
|
|
226
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/44a038c06487964394b1e15b64f3bd34e5d40cde/docs/rules/no-self-import.md
|
|
227
|
+
"import/no-self-import": "error",
|
|
228
|
+
|
|
229
|
+
// Forbid cyclical dependencies between modules
|
|
230
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/d81f48a2506182738409805f5272eff4d77c9348/docs/rules/no-cycle.md
|
|
231
|
+
"import/no-cycle": ["error", { maxDepth: "∞" }],
|
|
232
|
+
|
|
233
|
+
// Ensures that there are no useless path segments
|
|
234
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/no-useless-path-segments.md
|
|
235
|
+
"import/no-useless-path-segments": ["error", { commonjs: true }],
|
|
236
|
+
|
|
237
|
+
// dynamic imports require a leading comment with a webpackChunkName
|
|
238
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/ebafcbf59ec9f653b2ac2a0156ca3bcba0a7cf57/docs/rules/dynamic-import-chunkname.md
|
|
239
|
+
"import/dynamic-import-chunkname": [
|
|
240
|
+
"off",
|
|
241
|
+
{
|
|
242
|
+
importFunctions: [],
|
|
243
|
+
webpackChunknameFormat: "[0-9a-zA-Z-_/.]+",
|
|
244
|
+
},
|
|
245
|
+
],
|
|
246
|
+
|
|
247
|
+
// Use this rule to prevent imports to folders in relative parent paths.
|
|
248
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/c34f14f67f077acd5a61b3da9c0b0de298d20059/docs/rules/no-relative-parent-imports.md
|
|
249
|
+
"import/no-relative-parent-imports": "error",
|
|
250
|
+
|
|
251
|
+
// Reports the use of import declarations with CommonJS exports in any module except for the main module.
|
|
252
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/1012eb951767279ce3b540a4ec4f29236104bb5b/docs/rules/no-import-module-exports.md
|
|
253
|
+
"import/no-import-module-exports": [
|
|
254
|
+
"error",
|
|
255
|
+
{
|
|
256
|
+
exceptions: [],
|
|
257
|
+
},
|
|
258
|
+
],
|
|
259
|
+
|
|
260
|
+
// Use this rule to prevent importing packages through relative paths.
|
|
261
|
+
// https://github.com/benmosher/eslint-plugin-import/blob/1012eb951767279ce3b540a4ec4f29236104bb5b/docs/rules/no-relative-packages.md
|
|
262
|
+
"import/no-relative-packages": "error",
|
|
263
|
+
},
|
|
264
|
+
};
|
package/rules/jest.js
ADDED
package/rules/jsx.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export default {
|
|
2
|
+
rules: {
|
|
3
|
+
"jsx-a11y/anchor-is-valid": "error",
|
|
4
|
+
"jsx-a11y/no-noninteractive-element-interactions": "error",
|
|
5
|
+
"jsx-a11y/no-onchange": "off",
|
|
6
|
+
"jsx-a11y/no-static-element-interactions": "error",
|
|
7
|
+
"jsx-a11y/click-events-have-key-events": "off",
|
|
8
|
+
"jsx-a11y/mouse-events-have-key-events": "off",
|
|
9
|
+
"jsx-a11y/no-autofocus": "off",
|
|
10
|
+
"jsx-quotes": "error",
|
|
11
|
+
"jsx-a11y/alt-text": "error",
|
|
12
|
+
"jsx-a11y/img-redundant-alt": "error",
|
|
13
|
+
"jsx-a11y/aria-role": "error",
|
|
14
|
+
"jsx-a11y/no-access-key": "error",
|
|
15
|
+
},
|
|
16
|
+
};
|