@db-ux/core-eslint-plugin 4.4.2-eslint-plugin-28ea614 → 4.4.2-eslint-plugin2-696cb23

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 (52) hide show
  1. package/README.md +89 -0
  2. package/build/index.d.ts +308 -55
  3. package/build/index.js +17 -14
  4. package/build/rules/accordion/accordion-item-headline-required.d.ts +16 -0
  5. package/build/rules/accordion/accordion-item-headline-required.js +61 -0
  6. package/build/rules/accordion/no-nested-accordion.d.ts +14 -3
  7. package/build/rules/accordion/no-nested-accordion.js +40 -23
  8. package/build/rules/badge/badge-corner-placement-rules.d.ts +16 -3
  9. package/build/rules/badge/badge-corner-placement-rules.js +96 -58
  10. package/build/rules/badge/badge-no-inline-in-interactive.d.ts +15 -3
  11. package/build/rules/badge/badge-no-inline-in-interactive.js +102 -40
  12. package/build/rules/button/button-no-text-requires-tooltip.d.ts +16 -3
  13. package/build/rules/button/button-no-text-requires-tooltip.js +85 -35
  14. package/build/rules/button/button-single-icon-attribute.d.ts +14 -3
  15. package/build/rules/button/button-single-icon-attribute.js +37 -23
  16. package/build/rules/button/button-type-required.d.ts +15 -3
  17. package/build/rules/button/button-type-required.js +45 -32
  18. package/build/rules/close-button/close-button-text-required.d.ts +14 -3
  19. package/build/rules/close-button/close-button-text-required.js +21 -23
  20. package/build/rules/content/text-or-children-required.d.ts +14 -3
  21. package/build/rules/content/text-or-children-required.js +26 -28
  22. package/build/rules/form/form-label-required.d.ts +14 -3
  23. package/build/rules/form/form-label-required.js +23 -25
  24. package/build/rules/form/form-validation-message-required.d.ts +14 -3
  25. package/build/rules/form/form-validation-message-required.js +65 -67
  26. package/build/rules/header/header-burger-menu-label-required.d.ts +14 -3
  27. package/build/rules/header/header-burger-menu-label-required.js +31 -20
  28. package/build/rules/icon/prefer-icon-attribute.d.ts +15 -3
  29. package/build/rules/icon/prefer-icon-attribute.js +48 -33
  30. package/build/rules/input/input-file-type-validation.d.ts +16 -3
  31. package/build/rules/input/input-file-type-validation.js +36 -38
  32. package/build/rules/input/input-type-required.d.ts +15 -3
  33. package/build/rules/input/input-type-required.js +41 -27
  34. package/build/rules/link/link-external-security.d.ts +17 -3
  35. package/build/rules/link/link-external-security.js +148 -32
  36. package/build/rules/navigation/navigation-item-back-button-text-required.d.ts +14 -3
  37. package/build/rules/navigation/navigation-item-back-button-text-required.js +31 -20
  38. package/build/rules/select/custom-select-tags-remove-text-required.d.ts +14 -3
  39. package/build/rules/select/custom-select-tags-remove-text-required.js +21 -23
  40. package/build/rules/select/select-requires-options.d.ts +14 -3
  41. package/build/rules/select/select-requires-options.js +23 -22
  42. package/build/rules/tag/tag-removable-remove-button-required.d.ts +14 -3
  43. package/build/rules/tag/tag-removable-remove-button-required.js +37 -23
  44. package/build/rules/tooltip/no-interactive-tooltip-content.d.ts +13 -3
  45. package/build/rules/tooltip/no-interactive-tooltip-content.js +28 -26
  46. package/build/rules/tooltip/tooltip-requires-interactive-parent.d.ts +13 -3
  47. package/build/rules/tooltip/tooltip-requires-interactive-parent.js +30 -30
  48. package/build/shared/constants.d.ts +58 -0
  49. package/build/shared/constants.js +98 -0
  50. package/build/shared/utils.d.ts +53 -4
  51. package/build/shared/utils.js +145 -28
  52. package/package.json +8 -3
package/README.md CHANGED
@@ -8,6 +8,24 @@ ESLint plugin to validate correct usage of DB UX Design System components across
8
8
  npm install eslint @db-ux/eslint-plugin --save-dev
9
9
  ```
10
10
 
11
+ **For Vue projects**, also install `vue-eslint-parser`:
12
+
13
+ ```shell
14
+ npm install vue-eslint-parser --save-dev
15
+ ```
16
+
17
+ **For Angular projects**, also install `@angular-eslint/template-parser`:
18
+
19
+ ```shell
20
+ npm install @angular-eslint/template-parser --save-dev
21
+ ```
22
+
23
+ **For React/TypeScript projects**, also install `@typescript-eslint/parser`:
24
+
25
+ ```shell
26
+ npm install @typescript-eslint/parser --save-dev
27
+ ```
28
+
11
29
  ## Usage
12
30
 
13
31
  Add to your ESLint config:
@@ -27,6 +45,52 @@ export default [
27
45
  ];
28
46
  ```
29
47
 
48
+ **For Vue projects**, configure the Vue parser:
49
+
50
+ ```js
51
+ import dbUx from "@db-ux/eslint-plugin";
52
+ import vueParser from "vue-eslint-parser";
53
+ import tsParser from "@typescript-eslint/parser";
54
+
55
+ export default [
56
+ {
57
+ files: ["**/*.vue"],
58
+ languageOptions: {
59
+ parser: vueParser,
60
+ parserOptions: {
61
+ parser: tsParser,
62
+ ecmaVersion: "latest",
63
+ sourceType: "module"
64
+ }
65
+ },
66
+ plugins: {
67
+ "db-ux": dbUx
68
+ },
69
+ rules: dbUx.configs.recommended.rules
70
+ }
71
+ ];
72
+ ```
73
+
74
+ **For Angular projects**, configure the Angular template parser:
75
+
76
+ ```js
77
+ import dbUx from "@db-ux/eslint-plugin";
78
+ import angularTemplateParser from "@angular-eslint/template-parser";
79
+
80
+ export default [
81
+ {
82
+ files: ["**/*.html"],
83
+ languageOptions: {
84
+ parser: angularTemplateParser
85
+ },
86
+ plugins: {
87
+ "db-ux": dbUx
88
+ },
89
+ rules: dbUx.configs.recommended.rules
90
+ }
91
+ ];
92
+ ```
93
+
30
94
  **Or enable rules individually:**
31
95
 
32
96
  ```js
@@ -44,6 +108,31 @@ export default [
44
108
  ];
45
109
  ```
46
110
 
111
+ **For React/TypeScript projects**, configure the TypeScript parser:
112
+
113
+ ```js
114
+ import dbUx from "@db-ux/eslint-plugin";
115
+ import tsParser from "@typescript-eslint/parser";
116
+
117
+ export default [
118
+ {
119
+ files: ["**/*.ts", "**/*.tsx"],
120
+ languageOptions: {
121
+ parser: tsParser,
122
+ parserOptions: {
123
+ ecmaVersion: "latest",
124
+ sourceType: "module",
125
+ ecmaFeatures: { jsx: true }
126
+ }
127
+ },
128
+ plugins: {
129
+ "db-ux": dbUx
130
+ },
131
+ rules: dbUx.configs.recommended.rules
132
+ }
133
+ ];
134
+ ```
135
+
47
136
  ## Rules
48
137
 
49
138
  ### `button-no-text-requires-tooltip`
package/build/index.d.ts CHANGED
@@ -4,94 +4,347 @@ declare const plugin: {
4
4
  version: string;
5
5
  };
6
6
  rules: {
7
- 'button-no-text-requires-tooltip': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingIcon" | "missingTooltip", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
8
- name: string;
7
+ 'button-no-text-requires-tooltip': {
8
+ meta: {
9
+ type: string;
10
+ docs: {
11
+ description: string;
12
+ url: string;
13
+ };
14
+ fixable: string;
15
+ messages: {
16
+ [x: string]: string;
17
+ };
18
+ schema: never[];
19
+ };
20
+ create(context: any): any;
9
21
  };
10
- 'button-type-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingType", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
11
- name: string;
22
+ 'button-type-required': {
23
+ meta: {
24
+ type: string;
25
+ docs: {
26
+ description: string;
27
+ url: string;
28
+ };
29
+ fixable: string;
30
+ messages: {
31
+ [x: string]: string;
32
+ };
33
+ schema: never[];
34
+ };
35
+ create(context: any): any;
12
36
  };
13
- 'button-single-icon-attribute': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"multipleIcons", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
14
- name: string;
37
+ 'button-single-icon-attribute': {
38
+ meta: {
39
+ type: string;
40
+ docs: {
41
+ description: string;
42
+ url: string;
43
+ };
44
+ messages: {
45
+ [x: string]: string;
46
+ };
47
+ schema: never[];
48
+ };
49
+ create(context: any): any;
15
50
  };
16
- 'form-label-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingLabel", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
17
- name: string;
51
+ 'form-label-required': {
52
+ meta: {
53
+ type: string;
54
+ docs: {
55
+ description: string;
56
+ url: string;
57
+ };
58
+ messages: {
59
+ [x: string]: string;
60
+ };
61
+ schema: never[];
62
+ };
63
+ create(context: any): any;
18
64
  };
19
- 'form-validation-message-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingInvalidMessage", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
20
- name: string;
65
+ 'form-validation-message-required': {
66
+ meta: {
67
+ type: string;
68
+ docs: {
69
+ description: string;
70
+ url: string;
71
+ };
72
+ messages: {
73
+ [x: string]: string;
74
+ };
75
+ schema: never[];
76
+ };
77
+ create(context: any): any;
21
78
  };
22
- 'prefer-icon-attribute': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"preferAttribute", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
23
- name: string;
79
+ 'prefer-icon-attribute': {
80
+ meta: {
81
+ type: string;
82
+ docs: {
83
+ description: string;
84
+ url: string;
85
+ };
86
+ fixable: string;
87
+ messages: {
88
+ [x: string]: string;
89
+ };
90
+ schema: never[];
91
+ };
92
+ create(context: any): any;
24
93
  };
25
- 'text-or-children-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingContent", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
26
- name: string;
94
+ 'text-or-children-required': {
95
+ meta: {
96
+ type: string;
97
+ docs: {
98
+ description: string;
99
+ url: string;
100
+ };
101
+ messages: {
102
+ [x: string]: string;
103
+ };
104
+ schema: never[];
105
+ };
106
+ create(context: any): any;
27
107
  };
28
- 'no-interactive-tooltip-content': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"noInteractive", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
29
- name: string;
108
+ 'no-interactive-tooltip-content': {
109
+ meta: {
110
+ type: string;
111
+ docs: {
112
+ description: string;
113
+ url: string;
114
+ };
115
+ messages: {
116
+ noInteractive: string;
117
+ };
118
+ schema: never[];
119
+ };
120
+ create(context: any): any;
30
121
  };
31
- 'tooltip-requires-interactive-parent': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"requiresInteractive", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
32
- name: string;
122
+ 'tooltip-requires-interactive-parent': {
123
+ meta: {
124
+ type: string;
125
+ docs: {
126
+ description: string;
127
+ url: string;
128
+ };
129
+ messages: {
130
+ requiresInteractive: string;
131
+ };
132
+ schema: never[];
133
+ };
134
+ create(context: any): any;
33
135
  };
34
- 'no-nested-accordion': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"noNested", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
35
- name: string;
136
+ 'no-nested-accordion': {
137
+ meta: {
138
+ type: string;
139
+ docs: {
140
+ description: string;
141
+ url: string;
142
+ };
143
+ messages: {
144
+ [x: string]: string;
145
+ };
146
+ schema: never[];
147
+ };
148
+ create(context: any): any;
36
149
  };
37
- 'badge-corner-placement-rules': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"textTooLong" | "missingLabel", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
38
- name: string;
150
+ 'accordion-item-headline-required': {
151
+ meta: {
152
+ type: string;
153
+ docs: {
154
+ description: string;
155
+ url: string;
156
+ };
157
+ messages: {
158
+ [x: string]: string;
159
+ };
160
+ schema: never[];
161
+ };
162
+ create(context: any): any;
39
163
  };
40
- 'badge-no-inline-in-interactive': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"noInline", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
41
- name: string;
164
+ 'badge-corner-placement-rules': {
165
+ meta: {
166
+ type: string;
167
+ docs: {
168
+ description: string;
169
+ url: string;
170
+ };
171
+ fixable: string;
172
+ messages: {
173
+ [x: string]: string;
174
+ };
175
+ schema: never[];
176
+ };
177
+ create(context: any): any;
42
178
  };
43
- 'link-external-security': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingTargetBlank" | "missingReferrerPolicy" | "missingContentExternal", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
44
- name: string;
179
+ 'badge-no-inline-in-interactive': {
180
+ meta: {
181
+ type: string;
182
+ docs: {
183
+ description: string;
184
+ url: string;
185
+ };
186
+ fixable: string;
187
+ messages: {
188
+ [x: string]: string;
189
+ };
190
+ schema: never[];
191
+ };
192
+ create(context: any): any;
45
193
  };
46
- 'select-requires-options': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingOptions", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
47
- name: string;
194
+ 'link-external-security': {
195
+ meta: {
196
+ type: string;
197
+ docs: {
198
+ description: string;
199
+ url: string;
200
+ };
201
+ fixable: string;
202
+ messages: {
203
+ [x: string]: string;
204
+ };
205
+ schema: never[];
206
+ };
207
+ create(context: any): any;
208
+ };
209
+ 'select-requires-options': {
210
+ meta: {
211
+ type: string;
212
+ docs: {
213
+ description: string;
214
+ url: string;
215
+ };
216
+ messages: {
217
+ [x: string]: string;
218
+ };
219
+ schema: never[];
220
+ };
221
+ create(context: any): any;
48
222
  };
49
- 'custom-select-tags-remove-text-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingRemoveTagsTexts", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
50
- name: string;
223
+ 'custom-select-tags-remove-text-required': {
224
+ meta: {
225
+ type: string;
226
+ docs: {
227
+ description: string;
228
+ url: string;
229
+ };
230
+ messages: {
231
+ [x: string]: string;
232
+ };
233
+ schema: never[];
234
+ };
235
+ create(context: any): any;
51
236
  };
52
- 'close-button-text-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingCloseButtonText", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
53
- name: string;
237
+ 'close-button-text-required': {
238
+ meta: {
239
+ type: string;
240
+ docs: {
241
+ description: string;
242
+ url: string;
243
+ };
244
+ messages: {
245
+ [x: string]: string;
246
+ };
247
+ schema: never[];
248
+ };
249
+ create(context: any): any;
54
250
  };
55
- 'header-burger-menu-label-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingBurgerMenuLabel", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
56
- name: string;
251
+ 'header-burger-menu-label-required': {
252
+ meta: {
253
+ type: string;
254
+ docs: {
255
+ description: string;
256
+ url: string;
257
+ };
258
+ messages: {
259
+ [x: string]: string;
260
+ };
261
+ schema: never[];
262
+ };
263
+ create(context: any): any;
57
264
  };
58
- 'navigation-item-back-button-text-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingBackButtonText", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
59
- name: string;
265
+ 'navigation-item-back-button-text-required': {
266
+ meta: {
267
+ type: string;
268
+ docs: {
269
+ description: string;
270
+ url: string;
271
+ };
272
+ messages: {
273
+ [x: string]: string;
274
+ };
275
+ schema: never[];
276
+ };
277
+ create(context: any): any;
60
278
  };
61
- 'tag-removable-remove-button-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingRemoveButton", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
62
- name: string;
279
+ 'tag-removable-remove-button-required': {
280
+ meta: {
281
+ type: string;
282
+ docs: {
283
+ description: string;
284
+ url: string;
285
+ };
286
+ messages: {
287
+ [x: string]: string;
288
+ };
289
+ schema: never[];
290
+ };
291
+ create(context: any): any;
63
292
  };
64
- 'input-type-required': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingType", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
65
- name: string;
293
+ 'input-type-required': {
294
+ meta: {
295
+ type: string;
296
+ docs: {
297
+ description: string;
298
+ url: string;
299
+ };
300
+ fixable: string;
301
+ messages: {
302
+ [x: string]: string;
303
+ };
304
+ schema: never[];
305
+ };
306
+ create(context: any): any;
66
307
  };
67
- 'input-file-type-validation': import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleModule<"missingAccept" | "invalidMultiple" | "invalidAccept", [], unknown, import("@typescript-eslint/utils/dist/ts-eslint/Rule.js").RuleListener> & {
68
- name: string;
308
+ 'input-file-type-validation': {
309
+ meta: {
310
+ type: string;
311
+ docs: {
312
+ description: string;
313
+ url: string;
314
+ };
315
+ messages: {
316
+ [x: string]: string;
317
+ };
318
+ schema: never[];
319
+ };
320
+ create(context: any): any;
69
321
  };
70
322
  };
71
323
  configs: {
72
324
  recommended: {
73
325
  rules: {
326
+ 'db-ux/accordion-item-headline-required': string;
327
+ 'db-ux/badge-corner-placement-rules': string;
328
+ 'db-ux/badge-no-inline-in-interactive': string;
74
329
  'db-ux/button-no-text-requires-tooltip': string;
75
- 'db-ux/button-type-required': string;
76
330
  'db-ux/button-single-icon-attribute': string;
331
+ 'db-ux/button-type-required': string;
332
+ 'db-ux/close-button-text-required': string;
333
+ 'db-ux/custom-select-tags-remove-text-required': string;
77
334
  'db-ux/form-label-required': string;
78
335
  'db-ux/form-validation-message-required': string;
79
- 'db-ux/prefer-icon-attribute': string;
80
- 'db-ux/text-or-children-required': string;
336
+ 'db-ux/header-burger-menu-label-required': string;
337
+ 'db-ux/input-file-type-validation': string;
338
+ 'db-ux/input-type-required': string;
339
+ 'db-ux/link-external-security': string;
340
+ 'db-ux/navigation-item-back-button-text-required': string;
81
341
  'db-ux/no-interactive-tooltip-content': string;
82
- 'db-ux/tooltip-requires-interactive-parent': string;
83
342
  'db-ux/no-nested-accordion': string;
84
- 'db-ux/badge-corner-placement-rules': string;
85
- 'db-ux/badge-no-inline-in-interactive': string;
86
- 'db-ux/link-external-security': string;
343
+ 'db-ux/prefer-icon-attribute': string;
87
344
  'db-ux/select-requires-options': string;
88
- 'db-ux/custom-select-tags-remove-text-required': string;
89
- 'db-ux/close-button-text-required': string;
90
- 'db-ux/header-burger-menu-label-required': string;
91
- 'db-ux/navigation-item-back-button-text-required': string;
92
345
  'db-ux/tag-removable-remove-button-required': string;
93
- 'db-ux/input-type-required': string;
94
- 'db-ux/input-file-type-validation': string;
346
+ 'db-ux/text-or-children-required': string;
347
+ 'db-ux/tooltip-requires-interactive-parent': string;
95
348
  };
96
349
  };
97
350
  };
package/build/index.js CHANGED
@@ -1,3 +1,4 @@
1
+ import accordionItemHeadlineRequired from './rules/accordion/accordion-item-headline-required.js';
1
2
  import noNestedAccordion from './rules/accordion/no-nested-accordion.js';
2
3
  import badgeCornerPlacementRules from './rules/badge/badge-corner-placement-rules.js';
3
4
  import badgeNoInlineInInteractive from './rules/badge/badge-no-inline-in-interactive.js';
@@ -21,27 +22,28 @@ import noInteractiveTooltipContent from './rules/tooltip/no-interactive-tooltip-
21
22
  import tooltipRequiresInteractiveParent from './rules/tooltip/tooltip-requires-interactive-parent.js';
22
23
  const recommended = {
23
24
  rules: {
25
+ 'db-ux/accordion-item-headline-required': 'error',
26
+ 'db-ux/badge-corner-placement-rules': 'error',
27
+ 'db-ux/badge-no-inline-in-interactive': 'error',
24
28
  'db-ux/button-no-text-requires-tooltip': 'error',
25
- 'db-ux/button-type-required': 'error',
26
29
  'db-ux/button-single-icon-attribute': 'error',
30
+ 'db-ux/button-type-required': 'error',
31
+ 'db-ux/close-button-text-required': 'error',
32
+ 'db-ux/custom-select-tags-remove-text-required': 'error',
27
33
  'db-ux/form-label-required': 'error',
28
- 'db-ux/form-validation-message-required': 'error',
29
- 'db-ux/prefer-icon-attribute': 'warn',
30
- 'db-ux/text-or-children-required': 'error',
34
+ 'db-ux/form-validation-message-required': 'warn',
35
+ 'db-ux/header-burger-menu-label-required': 'error',
36
+ 'db-ux/input-file-type-validation': 'error',
37
+ 'db-ux/input-type-required': 'warn',
38
+ 'db-ux/link-external-security': 'warn',
39
+ 'db-ux/navigation-item-back-button-text-required': 'error',
31
40
  'db-ux/no-interactive-tooltip-content': 'error',
32
- 'db-ux/tooltip-requires-interactive-parent': 'error',
33
41
  'db-ux/no-nested-accordion': 'error',
34
- 'db-ux/badge-corner-placement-rules': 'error',
35
- 'db-ux/badge-no-inline-in-interactive': 'error',
36
- 'db-ux/link-external-security': 'warn',
42
+ 'db-ux/prefer-icon-attribute': 'warn',
37
43
  'db-ux/select-requires-options': 'error',
38
- 'db-ux/custom-select-tags-remove-text-required': 'error',
39
- 'db-ux/close-button-text-required': 'error',
40
- 'db-ux/header-burger-menu-label-required': 'error',
41
- 'db-ux/navigation-item-back-button-text-required': 'error',
42
44
  'db-ux/tag-removable-remove-button-required': 'error',
43
- 'db-ux/input-type-required': 'warn',
44
- 'db-ux/input-file-type-validation': 'error'
45
+ 'db-ux/text-or-children-required': 'error',
46
+ 'db-ux/tooltip-requires-interactive-parent': 'error'
45
47
  }
46
48
  };
47
49
  const plugin = {
@@ -60,6 +62,7 @@ const plugin = {
60
62
  'no-interactive-tooltip-content': noInteractiveTooltipContent,
61
63
  'tooltip-requires-interactive-parent': tooltipRequiresInteractiveParent,
62
64
  'no-nested-accordion': noNestedAccordion,
65
+ 'accordion-item-headline-required': accordionItemHeadlineRequired,
63
66
  'badge-corner-placement-rules': badgeCornerPlacementRules,
64
67
  'badge-no-inline-in-interactive': badgeNoInlineInInteractive,
65
68
  'link-external-security': linkExternalSecurity,
@@ -0,0 +1,16 @@
1
+ import { MESSAGE_IDS } from '../../shared/constants.js';
2
+ declare const _default: {
3
+ meta: {
4
+ type: string;
5
+ docs: {
6
+ description: string;
7
+ url: string;
8
+ };
9
+ messages: {
10
+ [MESSAGE_IDS.ACCORDION_ITEM_HEADLINE_REQUIRED]: string;
11
+ };
12
+ schema: never[];
13
+ };
14
+ create(context: any): any;
15
+ };
16
+ export default _default;
@@ -0,0 +1,61 @@
1
+ import { createAngularVisitors, defineTemplateBodyVisitor, getAttributeValue, isDBComponent } from '../../shared/utils.js';
2
+ import { COMPONENTS, MESSAGES, MESSAGE_IDS } from '../../shared/constants.js';
3
+ function hasHeadlineSlot(node) {
4
+ return node.children?.some((child) => {
5
+ // Angular: <div slot="headline">
6
+ if (child.type === 'Element') {
7
+ const slotAttr = child.attributes?.find((a) => a.name === 'slot');
8
+ return slotAttr?.value === 'headline';
9
+ }
10
+ // Vue: <template #headline> or <template v-slot:headline>
11
+ if (child.type === 'VElement' && child.rawName === 'template') {
12
+ return child.startTag.attributes.some((a) => a.key.name === 'slot' && a.key.argument?.name === 'headline' ||
13
+ a.key.name === 'headline');
14
+ }
15
+ return false;
16
+ });
17
+ }
18
+ export default {
19
+ meta: {
20
+ type: 'problem',
21
+ docs: {
22
+ description: 'Ensure DBAccordionItem has headline or headlinePlain',
23
+ url: 'https://github.com/db-ux-design-system/core-web/blob/main/packages/eslint-plugin/README.md#accordion-item-headline-required'
24
+ },
25
+ messages: {
26
+ [MESSAGE_IDS.ACCORDION_ITEM_HEADLINE_REQUIRED]: MESSAGES.ACCORDION_ITEM_HEADLINE_REQUIRED
27
+ },
28
+ schema: []
29
+ },
30
+ create(context) {
31
+ const angularHandler = (node, parserServices) => {
32
+ const headlinePlain = getAttributeValue(node, 'headlinePlain');
33
+ const hasSlot = hasHeadlineSlot(node);
34
+ if (!headlinePlain && !hasSlot) {
35
+ const loc = parserServices.convertNodeSourceSpanToLoc(node.sourceSpan);
36
+ context.report({
37
+ loc,
38
+ messageId: MESSAGE_IDS.ACCORDION_ITEM_HEADLINE_REQUIRED
39
+ });
40
+ }
41
+ };
42
+ const angularVisitors = createAngularVisitors(context, COMPONENTS.DBAccordionItem, angularHandler);
43
+ if (angularVisitors)
44
+ return angularVisitors;
45
+ const checkAccordionItem = (node) => {
46
+ const openingElement = node.openingElement || node;
47
+ if (!isDBComponent(openingElement, COMPONENTS.DBAccordionItem))
48
+ return;
49
+ const headlinePlain = getAttributeValue(openingElement, 'headlinePlain');
50
+ const headline = getAttributeValue(openingElement, 'headline');
51
+ const hasSlot = hasHeadlineSlot(node);
52
+ if (!headlinePlain && !headline && !hasSlot) {
53
+ context.report({
54
+ node: openingElement,
55
+ messageId: MESSAGE_IDS.ACCORDION_ITEM_HEADLINE_REQUIRED
56
+ });
57
+ }
58
+ };
59
+ return defineTemplateBodyVisitor(context, { VElement: checkAccordionItem, Element: checkAccordionItem }, { JSXElement: checkAccordionItem });
60
+ }
61
+ };
@@ -1,5 +1,16 @@
1
- import { ESLintUtils } from '@typescript-eslint/utils';
2
- declare const _default: ESLintUtils.RuleModule<"noNested", [], unknown, ESLintUtils.RuleListener> & {
3
- name: string;
1
+ import { MESSAGE_IDS } from '../../shared/constants.js';
2
+ declare const _default: {
3
+ meta: {
4
+ type: string;
5
+ docs: {
6
+ description: string;
7
+ url: string;
8
+ };
9
+ messages: {
10
+ [MESSAGE_IDS.ACCORDION_NO_NESTED]: string;
11
+ };
12
+ schema: never[];
13
+ };
14
+ create(context: any): any;
4
15
  };
5
16
  export default _default;