@markuplint/rules 3.15.0 → 4.0.0-alpha.10

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 (178) hide show
  1. package/.eslintrc +5 -0
  2. package/LICENSE +1 -1
  3. package/lib/attr-check.d.ts +8 -19
  4. package/lib/attr-check.js +16 -21
  5. package/lib/attr-duplication/index.d.ts +1 -3
  6. package/lib/attr-duplication/index.js +6 -6
  7. package/lib/attr-value-quotes/index.d.ts +2 -2
  8. package/lib/attr-value-quotes/index.js +8 -10
  9. package/lib/case-sensitive-attr-name/index.d.ts +1 -1
  10. package/lib/case-sensitive-attr-name/index.js +12 -13
  11. package/lib/case-sensitive-tag-name/index.d.ts +1 -1
  12. package/lib/case-sensitive-tag-name/index.js +5 -4
  13. package/lib/character-reference/index.d.ts +1 -1
  14. package/lib/character-reference/index.js +13 -12
  15. package/lib/class-naming/index.d.ts +1 -1
  16. package/lib/class-naming/index.js +14 -13
  17. package/lib/create-message.d.ts +2 -12
  18. package/lib/create-message.js +26 -26
  19. package/lib/debug.js +2 -6
  20. package/lib/deprecated-attr/index.d.ts +1 -3
  21. package/lib/deprecated-attr/index.js +9 -9
  22. package/lib/deprecated-element/index.d.ts +1 -3
  23. package/lib/deprecated-element/index.js +7 -6
  24. package/lib/disallowed-element/index.d.ts +1 -1
  25. package/lib/disallowed-element/index.js +9 -8
  26. package/lib/doctype/index.d.ts +2 -2
  27. package/lib/doctype/index.js +5 -4
  28. package/lib/end-tag/index.d.ts +1 -1
  29. package/lib/end-tag/index.js +8 -8
  30. package/lib/helpers.d.ts +17 -35
  31. package/lib/helpers.js +25 -32
  32. package/lib/id-duplication/index.d.ts +1 -3
  33. package/lib/id-duplication/index.js +5 -4
  34. package/lib/index.d.ts +21 -17
  35. package/lib/index.js +63 -66
  36. package/lib/ineffective-attr/index.d.ts +1 -3
  37. package/lib/ineffective-attr/index.js +8 -7
  38. package/lib/invalid-attr/index.d.ts +31 -38
  39. package/lib/invalid-attr/index.js +33 -33
  40. package/lib/label-has-control/index.d.ts +1 -3
  41. package/lib/label-has-control/index.js +5 -4
  42. package/lib/landmark-roles/index.d.ts +3 -3
  43. package/lib/landmark-roles/index.js +16 -18
  44. package/lib/no-boolean-attr-value/index.d.ts +1 -3
  45. package/lib/no-boolean-attr-value/index.js +9 -9
  46. package/lib/no-default-value/index.d.ts +1 -3
  47. package/lib/no-default-value/index.js +12 -12
  48. package/lib/no-empty-palpable-content/index.d.ts +3 -3
  49. package/lib/no-empty-palpable-content/index.js +9 -8
  50. package/lib/no-hard-code-id/index.d.ts +1 -3
  51. package/lib/no-hard-code-id/index.js +5 -4
  52. package/lib/no-refer-to-non-existent-id/index.d.ts +1 -1
  53. package/lib/no-refer-to-non-existent-id/index.js +37 -38
  54. package/lib/no-use-event-handler-attr/index.d.ts +2 -2
  55. package/lib/no-use-event-handler-attr/index.js +7 -6
  56. package/lib/permitted-contents/choice.d.ts +2 -8
  57. package/lib/permitted-contents/choice.js +14 -19
  58. package/lib/permitted-contents/complex-branch.d.ts +2 -8
  59. package/lib/permitted-contents/complex-branch.js +10 -14
  60. package/lib/permitted-contents/content-model.d.ts +1 -1
  61. package/lib/permitted-contents/content-model.js +10 -11
  62. package/lib/permitted-contents/count-pattern.d.ts +3 -18
  63. package/lib/permitted-contents/count-pattern.js +19 -24
  64. package/lib/permitted-contents/debug.browser.d.ts +16 -16
  65. package/lib/permitted-contents/debug.browser.js +9 -12
  66. package/lib/permitted-contents/debug.d.ts +10 -3
  67. package/lib/permitted-contents/debug.js +12 -13
  68. package/lib/permitted-contents/index.d.ts +2 -2
  69. package/lib/permitted-contents/index.js +13 -13
  70. package/lib/permitted-contents/matches-selector.d.ts +2 -7
  71. package/lib/permitted-contents/matches-selector.js +13 -18
  72. package/lib/permitted-contents/order.d.ts +2 -8
  73. package/lib/permitted-contents/order.js +19 -24
  74. package/lib/permitted-contents/recursive-branch.d.ts +3 -9
  75. package/lib/permitted-contents/recursive-branch.js +9 -13
  76. package/lib/permitted-contents/represent-transparent-nodes.d.ts +4 -8
  77. package/lib/permitted-contents/represent-transparent-nodes.js +15 -20
  78. package/lib/permitted-contents/start.d.ts +2 -7
  79. package/lib/permitted-contents/start.js +13 -21
  80. package/lib/permitted-contents/transparent.d.ts +1 -1
  81. package/lib/permitted-contents/transparent.js +6 -11
  82. package/lib/permitted-contents/types.d.ts +29 -29
  83. package/lib/permitted-contents/types.js +1 -2
  84. package/lib/permitted-contents/utils.d.ts +42 -79
  85. package/lib/permitted-contents/utils.js +72 -82
  86. package/lib/placeholder-label-option/index.d.ts +1 -1
  87. package/lib/placeholder-label-option/index.js +12 -13
  88. package/lib/require-accessible-name/index.d.ts +2 -2
  89. package/lib/require-accessible-name/index.js +12 -15
  90. package/lib/require-datetime/index.d.ts +3 -3
  91. package/lib/require-datetime/index.js +14 -13
  92. package/lib/require-datetime/types.d.ts +2 -2
  93. package/lib/require-datetime/types.js +1 -2
  94. package/lib/require-datetime/utils.d.ts +1 -1
  95. package/lib/require-datetime/utils.js +5 -12
  96. package/lib/required-attr/index.d.ts +3 -3
  97. package/lib/required-attr/index.js +11 -11
  98. package/lib/required-element/index.d.ts +2 -2
  99. package/lib/required-element/index.js +7 -7
  100. package/lib/required-h1/index.d.ts +3 -3
  101. package/lib/required-h1/index.js +6 -6
  102. package/lib/use-list/index.d.ts +6 -2
  103. package/lib/use-list/index.js +27 -11
  104. package/lib/wai-aria/checkings/abstract-role.d.ts +1 -1
  105. package/lib/wai-aria/checkings/abstract-role.js +5 -10
  106. package/lib/wai-aria/checkings/default-value.d.ts +4 -8
  107. package/lib/wai-aria/checkings/default-value.js +2 -6
  108. package/lib/wai-aria/checkings/deprecated-props.d.ts +5 -9
  109. package/lib/wai-aria/checkings/deprecated-props.js +3 -8
  110. package/lib/wai-aria/checkings/disallowed-prop.d.ts +5 -9
  111. package/lib/wai-aria/checkings/disallowed-prop.js +7 -12
  112. package/lib/wai-aria/checkings/implicit-props.d.ts +5 -9
  113. package/lib/wai-aria/checkings/implicit-props.js +12 -17
  114. package/lib/wai-aria/checkings/implicit-role.d.ts +1 -1
  115. package/lib/wai-aria/checkings/implicit-role.js +4 -9
  116. package/lib/wai-aria/checkings/interaction-in-hidden.d.ts +1 -1
  117. package/lib/wai-aria/checkings/interaction-in-hidden.js +4 -8
  118. package/lib/wai-aria/checkings/no-global-prop.d.ts +4 -8
  119. package/lib/wai-aria/checkings/no-global-prop.js +2 -7
  120. package/lib/wai-aria/checkings/non-existent-role.d.ts +1 -1
  121. package/lib/wai-aria/checkings/non-existent-role.js +4 -9
  122. package/lib/wai-aria/checkings/permitted-roles.d.ts +1 -1
  123. package/lib/wai-aria/checkings/permitted-roles.js +4 -9
  124. package/lib/wai-aria/checkings/presentational-children.d.ts +1 -1
  125. package/lib/wai-aria/checkings/presentational-children.js +5 -10
  126. package/lib/wai-aria/checkings/required-owned-elements.d.ts +4 -8
  127. package/lib/wai-aria/checkings/required-owned-elements.js +7 -11
  128. package/lib/wai-aria/checkings/required-prop.d.ts +7 -13
  129. package/lib/wai-aria/checkings/required-prop.js +2 -7
  130. package/lib/wai-aria/checkings/value.d.ts +7 -16
  131. package/lib/wai-aria/checkings/value.js +7 -13
  132. package/lib/wai-aria/index.d.ts +2 -2
  133. package/lib/wai-aria/index.js +41 -40
  134. package/lib/wai-aria/types.d.ts +10 -10
  135. package/lib/wai-aria/types.js +1 -2
  136. package/package.json +17 -13
  137. package/test/attr-check.spec.js +0 -77
  138. package/test/attr-duplication/index.spec.js +0 -159
  139. package/test/attr-value-quotes/index.spec.js +0 -133
  140. package/test/case-sensitive-attr-name/index.spec.js +0 -65
  141. package/test/case-sensitive-tag-name/index.spec.js +0 -80
  142. package/test/character-reference/index.spec.js +0 -72
  143. package/test/class-naming/index.spec.js +0 -470
  144. package/test/create-message.spec.js +0 -497
  145. package/test/deprecated-attr/index.spec.js +0 -48
  146. package/test/deprecated-element/index.spec.js +0 -35
  147. package/test/disallowed-element/index.spec.js +0 -90
  148. package/test/doctype/index.spec.js +0 -50
  149. package/test/end-tag/index.spec.js +0 -162
  150. package/test/id-duplication/index.spec.js +0 -47
  151. package/test/ineffective-attr/index.spec.js +0 -31
  152. package/test/invalid-attr/index.spec.js +0 -1631
  153. package/test/label-has-control/index.spec.js +0 -29
  154. package/test/landmark-roles/index.spec.js +0 -187
  155. package/test/no-boolean-attr-value/index.spec.js +0 -41
  156. package/test/no-default-value/index.spec.js +0 -74
  157. package/test/no-empty-palpable-content/index.spec.js +0 -115
  158. package/test/no-hard-code-id/index.spec.js +0 -100
  159. package/test/no-refer-to-non-existent-id/index.spec.js +0 -254
  160. package/test/no-use-event-handler-attr/index.spec.js +0 -57
  161. package/test/permitted-contents/choice.spec.js +0 -174
  162. package/test/permitted-contents/count-pattern.spec.js +0 -308
  163. package/test/permitted-contents/index.spec.js +0 -1395
  164. package/test/permitted-contents/matches-selector.spec.js +0 -59
  165. package/test/permitted-contents/order.spec.js +0 -351
  166. package/test/permitted-contents/recursive-branch.spec.js +0 -41
  167. package/test/permitted-contents/represent-transparent-nodes.spec.js +0 -24
  168. package/test/permitted-contents/start.spec.js +0 -67
  169. package/test/placeholder-label-option/index.spec.js +0 -113
  170. package/test/require-accessible-name/index.spec.js +0 -444
  171. package/test/require-datetime/index.spec.js +0 -54
  172. package/test/require-datetime/utils.spec.js +0 -52
  173. package/test/required-attr/index.spec.js +0 -414
  174. package/test/required-element/index.spec.js +0 -188
  175. package/test/required-h1/index.spec.js +0 -69
  176. package/test/use-list/index.spec.js +0 -109
  177. package/test/wai-aria/checkings/value.spec.js +0 -33
  178. package/test/wai-aria/index.spec.js +0 -1203
@@ -1,414 +0,0 @@
1
- const { mlRuleTest } = require('markuplint');
2
-
3
- const rule = require('../../lib/required-attr').default;
4
-
5
- test('warns if specified attribute is not appeared', async () => {
6
- const { violations } = await mlRuleTest(rule, '<img src="/path/to/image.png">', {
7
- nodeRule: [
8
- {
9
- selector: 'img',
10
- rule: {
11
- severity: 'error',
12
- value: 'alt',
13
- },
14
- },
15
- ],
16
- });
17
-
18
- expect(violations).toStrictEqual([
19
- {
20
- col: 1,
21
- line: 1,
22
- message: 'The "img" element expects the "alt" attribute',
23
- raw: '<img src="/path/to/image.png">',
24
- severity: 'error',
25
- },
26
- ]);
27
- });
28
-
29
- test('multiple required attributes', async () => {
30
- const { violations } = await mlRuleTest(rule, '<img src="/path/to/image.png">', {
31
- nodeRule: [
32
- {
33
- selector: 'img',
34
- rule: {
35
- severity: 'error',
36
- value: ['width', 'height', 'alt'],
37
- },
38
- },
39
- ],
40
- });
41
-
42
- expect(violations).toStrictEqual([
43
- {
44
- severity: 'error',
45
- message: 'The "img" element expects the "width" attribute',
46
- line: 1,
47
- col: 1,
48
- raw: '<img src="/path/to/image.png">',
49
- },
50
- {
51
- severity: 'error',
52
- message: 'The "img" element expects the "height" attribute',
53
- line: 1,
54
- col: 1,
55
- raw: '<img src="/path/to/image.png">',
56
- },
57
- {
58
- severity: 'error',
59
- message: 'The "img" element expects the "alt" attribute',
60
- line: 1,
61
- col: 1,
62
- raw: '<img src="/path/to/image.png">',
63
- },
64
- ]);
65
- });
66
-
67
- test('"alt" attribute on "<area>" is required only if the href attribute is used', async () => {
68
- expect((await mlRuleTest(rule, '<area href="path/to">')).violations.length).toBe(1);
69
-
70
- expect((await mlRuleTest(rule, '<area href="path/to" alt="alternate text">')).violations.length).toBe(0);
71
- });
72
-
73
- test('At least one of data and type must be defined to <object>.', async () => {
74
- expect((await mlRuleTest(rule, '<object data="https://example.com/data">')).violations.length).toBe(0);
75
-
76
- expect((await mlRuleTest(rule, '<object type="XXXX_YYYY_ZZZZ">')).violations.length).toBe(0);
77
-
78
- expect((await mlRuleTest(rule, '<object>')).violations.length).toBe(2);
79
- });
80
-
81
- test('The ancestors of the <source> element.', async () => {
82
- expect((await mlRuleTest(rule, '<audio><source></audio>')).violations).toStrictEqual([
83
- {
84
- severity: 'error',
85
- line: 1,
86
- col: 8,
87
- message: 'The "source" element expects the "src" attribute',
88
- raw: '<source>',
89
- },
90
- ]);
91
-
92
- expect((await mlRuleTest(rule, '<video><source></video>')).violations).toStrictEqual([
93
- {
94
- severity: 'error',
95
- line: 1,
96
- col: 8,
97
- message: 'The "source" element expects the "src" attribute',
98
- raw: '<source>',
99
- },
100
- ]);
101
-
102
- expect((await mlRuleTest(rule, '<picture><source></picture>')).violations).toStrictEqual([]);
103
- });
104
-
105
- test('with value requirement', async () => {
106
- expect(
107
- (
108
- await mlRuleTest(rule, '<img />', {
109
- rule: [
110
- {
111
- name: 'decoding',
112
- value: 'async',
113
- },
114
- ],
115
- })
116
- ).violations,
117
- ).toStrictEqual([
118
- {
119
- severity: 'error',
120
- line: 1,
121
- col: 1,
122
- message: 'The "img" element expects the "src" attribute',
123
- raw: '<img />',
124
- },
125
- {
126
- severity: 'error',
127
- line: 1,
128
- col: 1,
129
- message: 'The "img" element expects the "decoding" attribute',
130
- raw: '<img />',
131
- },
132
- ]);
133
-
134
- expect(
135
- (
136
- await mlRuleTest(rule, '<img decoding="sync" />', {
137
- rule: [
138
- {
139
- name: 'decoding',
140
- value: 'async',
141
- },
142
- ],
143
- })
144
- ).violations,
145
- ).toStrictEqual([
146
- {
147
- severity: 'error',
148
- line: 1,
149
- col: 1,
150
- message: 'The "img" element expects the "src" attribute',
151
- raw: '<img decoding="sync" />',
152
- },
153
- {
154
- severity: 'error',
155
- line: 1,
156
- col: 16,
157
- message: 'The "decoding" attribute expects "async"',
158
- raw: 'sync',
159
- },
160
- ]);
161
- });
162
-
163
- test('with value requirement (regex)', async () => {
164
- expect(
165
- (
166
- await mlRuleTest(rule, '<img src="./path/to" /><img src="/path/to" />', {
167
- rule: [
168
- {
169
- name: 'src',
170
- value: '/^\\/|^https:\\/\\//i',
171
- },
172
- ],
173
- })
174
- ).violations,
175
- ).toStrictEqual([
176
- {
177
- severity: 'error',
178
- line: 1,
179
- col: 11,
180
- message: 'The "src" attribute expects "/^\\/|^https:\\/\\//i"',
181
- raw: './path/to',
182
- },
183
- ]);
184
-
185
- expect(
186
- (
187
- await mlRuleTest(rule, '<a rel="noreferrer noopener">link</a><a rel="noreferrernoopener">link2</a>', {
188
- rule: [
189
- {
190
- name: 'rel',
191
- value: '/(?<![^\\s]+)noreferrer(?![^\\s]+)/',
192
- },
193
- ],
194
- })
195
- ).violations,
196
- ).toStrictEqual([
197
- {
198
- severity: 'error',
199
- line: 1,
200
- col: 46,
201
- message: 'The "rel" attribute expects "/(?<![^\\s]+)noreferrer(?![^\\s]+)/"',
202
- raw: 'noreferrernoopener',
203
- },
204
- ]);
205
- });
206
-
207
- test('nodeRules', async () => {
208
- const { violations } = await mlRuleTest(rule, '<img src="path/to.svg" alt="text" />', {
209
- nodeRule: [
210
- {
211
- selector: 'img[src$=.svg]',
212
- rule: 'role',
213
- },
214
- ],
215
- });
216
-
217
- expect(violations).toStrictEqual([
218
- {
219
- severity: 'error',
220
- line: 1,
221
- col: 1,
222
- message: 'The "img" element expects the "role" attribute',
223
- raw: '<img src="path/to.svg" alt="text" />',
224
- },
225
- ]);
226
- });
227
-
228
- test('Foreign element', async () => {
229
- expect(
230
- (
231
- await mlRuleTest(rule, '<svg></svg>', {
232
- nodeRule: [
233
- {
234
- selector: 'svg',
235
- rule: {
236
- severity: 'error',
237
- value: 'viewBox',
238
- },
239
- },
240
- ],
241
- })
242
- ).violations,
243
- ).toStrictEqual([
244
- {
245
- severity: 'error',
246
- line: 1,
247
- col: 1,
248
- message: 'The "svg" element expects the "viewBox" attribute',
249
- raw: '<svg>',
250
- },
251
- ]);
252
- });
253
-
254
- test('svg', async () => {
255
- expect(
256
- (
257
- await mlRuleTest(
258
- rule,
259
- `<svg>
260
- <circle cx="50" cy="50" r="40" />
261
- <circle cx="150" cy="50" r="4" />
262
- <circle cx="5" cy="5" r="4" />
263
- <circle />
264
- </svg>
265
- `,
266
- {
267
- nodeRule: [
268
- {
269
- selector: 'circle',
270
- rule: ['cx', 'cy', 'r'],
271
- },
272
- ],
273
- },
274
- )
275
- ).violations,
276
- ).toStrictEqual([
277
- {
278
- severity: 'error',
279
- line: 5,
280
- col: 6,
281
- message: 'The "circle" element expects the "cx" attribute',
282
- raw: '<circle />',
283
- },
284
- {
285
- severity: 'error',
286
- line: 5,
287
- col: 6,
288
- message: 'The "circle" element expects the "cy" attribute',
289
- raw: '<circle />',
290
- },
291
- {
292
- severity: 'error',
293
- line: 5,
294
- col: 6,
295
- message: 'The "circle" element expects the "r" attribute',
296
- raw: '<circle />',
297
- },
298
- ]);
299
- });
300
-
301
- test('Pug', async () => {
302
- expect(
303
- (
304
- await mlRuleTest(rule, 'img', {
305
- parser: {
306
- '.*': '@markuplint/pug-parser',
307
- },
308
- })
309
- ).violations,
310
- ).toStrictEqual([
311
- {
312
- severity: 'error',
313
- line: 1,
314
- col: 1,
315
- message: 'The "img" element expects the "src" attribute',
316
- raw: 'img',
317
- },
318
- ]);
319
- });
320
-
321
- test('Vue', async () => {
322
- expect(
323
- (
324
- await mlRuleTest(rule, '<template><img :src="src"></template>', {
325
- parser: {
326
- '.*': '@markuplint/vue-parser',
327
- },
328
- })
329
- ).violations.length,
330
- ).toBe(0);
331
- });
332
-
333
- test('React', async () => {
334
- expect(
335
- (
336
- await mlRuleTest(rule, '<img alt={alt} />', {
337
- parser: {
338
- '.*': '@markuplint/jsx-parser',
339
- },
340
- })
341
- ).violations,
342
- ).toStrictEqual([
343
- {
344
- severity: 'error',
345
- line: 1,
346
- col: 1,
347
- message: 'The "img" element expects the "src" attribute',
348
- raw: '<img alt={alt} />',
349
- },
350
- ]);
351
-
352
- expect(
353
- (
354
- await mlRuleTest(rule, '<img {...props} />', {
355
- parser: {
356
- '.*': '@markuplint/jsx-parser',
357
- },
358
- })
359
- ).violations,
360
- ).toStrictEqual([]);
361
- });
362
-
363
- test('custom element', async () => {
364
- expect(
365
- (
366
- await mlRuleTest(rule, '<Link href="path/to"></Link>', {
367
- parser: {
368
- '.*': '@markuplint/jsx-parser',
369
- },
370
- })
371
- ).violations.length,
372
- ).toBe(0);
373
-
374
- expect(
375
- (
376
- await mlRuleTest(rule, '<Link></Link>', {
377
- parser: {
378
- '.*': '@markuplint/jsx-parser',
379
- },
380
- nodeRule: [
381
- {
382
- selector: 'Link',
383
- rule: ['href'],
384
- },
385
- ],
386
- })
387
- ).violations,
388
- ).toStrictEqual([
389
- {
390
- severity: 'error',
391
- line: 1,
392
- col: 1,
393
- message: 'The "Link" element expects the "href" attribute',
394
- raw: '<Link>',
395
- },
396
- ]);
397
-
398
- expect((await mlRuleTest(rule, '<Link href="path/to"></Link>')).violations).toStrictEqual([
399
- {
400
- severity: 'error',
401
- line: 1,
402
- col: 1,
403
- message: 'The "link" element expects the "itemprop" attribute',
404
- raw: '<Link href="path/to">',
405
- },
406
- {
407
- severity: 'error',
408
- line: 1,
409
- col: 1,
410
- message: 'The "link" element expects the "rel" attribute',
411
- raw: '<Link href="path/to">',
412
- },
413
- ]);
414
- });
@@ -1,188 +0,0 @@
1
- const { mlRuleTest } = require('markuplint');
2
-
3
- const rule = require('../../lib/required-element').default;
4
-
5
- describe('static', () => {
6
- it('specifies to global rule', async () => {
7
- const { violations } = await mlRuleTest(rule, '<html><head></head></html>', {
8
- rule: ['meta[charset="UTF-8"]'],
9
- });
10
- expect(violations).toStrictEqual([
11
- {
12
- severity: 'error',
13
- line: 1,
14
- col: 1,
15
- raw: '<',
16
- message: 'Require the "meta[charset="UTF-8"]" element',
17
- },
18
- ]);
19
- });
20
-
21
- it('specifies to node rule', async () => {
22
- const { violations } = await mlRuleTest(rule, '<html><head></head></html>', {
23
- nodeRule: [
24
- {
25
- selector: 'head',
26
- rule: ['meta[charset="UTF-8"]'],
27
- },
28
- ],
29
- });
30
- expect(violations).toStrictEqual([
31
- {
32
- severity: 'error',
33
- line: 1,
34
- col: 7,
35
- raw: '<head>',
36
- message: 'Require the "meta[charset="UTF-8"]" element',
37
- },
38
- ]);
39
- });
40
- });
41
-
42
- describe('dynamic', () => {
43
- it('specifies to global rule', async () => {
44
- const { violations } = await mlRuleTest(rule, '<html><head>{variable}</head></html>', {
45
- rule: ['meta[charset="UTF-8"]'],
46
- parser: {
47
- '.*': '@markuplint/jsx-parser',
48
- },
49
- });
50
- expect(violations.length).toBe(0);
51
- });
52
-
53
- it('specifies to node rule', async () => {
54
- const { violations } = await mlRuleTest(rule, '<html><head>{variable}</head></html>', {
55
- rule: ['meta[charset="UTF-8"]'],
56
- parser: {
57
- '.*': '@markuplint/jsx-parser',
58
- },
59
- });
60
- expect(violations.length).toBe(0);
61
- });
62
- });
63
-
64
- describe('React', () => {
65
- it('native element', async () => {
66
- const { violations } = await mlRuleTest(rule, '<html><head><title>Title</title></head></html>', {
67
- nodeRule: [
68
- {
69
- selector: 'head',
70
- rule: ['meta[charset="UTF-8"]'],
71
- },
72
- ],
73
- parser: {
74
- '.*': '@markuplint/jsx-parser',
75
- },
76
- });
77
- expect(violations).toStrictEqual([
78
- {
79
- severity: 'error',
80
- line: 1,
81
- col: 7,
82
- raw: '<head>',
83
- message: 'Require the "meta[charset="UTF-8"]" element',
84
- },
85
- ]);
86
- });
87
-
88
- it('custom element (Component)', async () => {
89
- const { violations } = await mlRuleTest(rule, '<><Head><title>Title</title></Head></>', {
90
- nodeRule: [
91
- {
92
- selector: 'head',
93
- rule: ['meta[charset="UTF-8"]'],
94
- },
95
- ],
96
- parser: {
97
- '.*': '@markuplint/jsx-parser',
98
- },
99
- });
100
- expect(violations).toStrictEqual([]);
101
- });
102
- });
103
-
104
- describe('Pretenders Option', () => {
105
- it('Outer', async () => {
106
- const { violations } = await mlRuleTest(rule, '<html><Head><title>Title</title></Head></html>', {
107
- nodeRule: [
108
- {
109
- selector: 'head',
110
- rule: ['meta[charset="UTF-8"]'],
111
- },
112
- ],
113
- parser: {
114
- '.*': '@markuplint/jsx-parser',
115
- },
116
- pretenders: [
117
- {
118
- selector: 'Head',
119
- as: 'head',
120
- },
121
- ],
122
- });
123
- expect(violations).toStrictEqual([
124
- {
125
- severity: 'error',
126
- line: 1,
127
- col: 7,
128
- raw: '<Head>',
129
- message: 'Require the "meta[charset="UTF-8"]" element',
130
- },
131
- ]);
132
- });
133
-
134
- it('Outer', async () => {
135
- expect(
136
- (
137
- await mlRuleTest(rule, '<html><head><title>Title</title><Charset /></head></html>', {
138
- nodeRule: [
139
- {
140
- selector: 'head',
141
- rule: ['meta[charset="UTF-8"]'],
142
- },
143
- ],
144
- parser: {
145
- '.*': '@markuplint/jsx-parser',
146
- },
147
- })
148
- ).violations,
149
- ).toStrictEqual([
150
- {
151
- severity: 'error',
152
- line: 1,
153
- col: 7,
154
- message: 'Require the "meta[charset="UTF-8"]" element',
155
- raw: '<head>',
156
- },
157
- ]);
158
- expect(
159
- (
160
- await mlRuleTest(rule, '<html><head><title>Title</title><Charset /></head></html>', {
161
- nodeRule: [
162
- {
163
- selector: 'head',
164
- rule: ['meta[charset="UTF-8"]'],
165
- },
166
- ],
167
- parser: {
168
- '.*': '@markuplint/jsx-parser',
169
- },
170
- pretenders: [
171
- {
172
- selector: 'Charset',
173
- as: {
174
- element: 'meta',
175
- attrs: [
176
- {
177
- name: 'charset',
178
- value: 'UTF-8',
179
- },
180
- ],
181
- },
182
- },
183
- ],
184
- })
185
- ).violations,
186
- ).toStrictEqual([]);
187
- });
188
- });
@@ -1,69 +0,0 @@
1
- const { mlRuleTest } = require('markuplint');
2
-
3
- const rule = require('../../lib/required-h1').default;
4
-
5
- test('h1', async () => {
6
- const { violations } = await mlRuleTest(rule, '<html><body>text</body></html>');
7
- expect(violations).toStrictEqual([
8
- {
9
- severity: 'error',
10
- message: 'Require the "h1" element',
11
- line: 1,
12
- col: 1,
13
- raw: '<',
14
- },
15
- ]);
16
- });
17
-
18
- test('h1', async () => {
19
- const { violations } = await mlRuleTest(rule, '<html><body><h1>text</h1></body></html>');
20
- expect(violations.length).toBe(0);
21
- });
22
-
23
- test('h1', async () => {
24
- const { violations } = await mlRuleTest(rule, '<html><body><h1>text</h1><h1>text</h1></body></html>');
25
- expect(violations).toStrictEqual([
26
- {
27
- severity: 'error',
28
- message: 'The "h1" element is duplicated',
29
- line: 1,
30
- col: 26,
31
- raw: '<h1>',
32
- },
33
- ]);
34
- });
35
-
36
- test('h1', async () => {
37
- const { violations } = await mlRuleTest(rule, '<html><body><h1>text</h1><h1>text</h1></body></html>', {
38
- rule: {
39
- severity: 'error',
40
- value: true,
41
- options: {
42
- 'expected-once': false,
43
- },
44
- },
45
- });
46
- expect(violations.length).toBe(0);
47
- });
48
-
49
- test('h1', async () => {
50
- const { violations } = await mlRuleTest(rule, '<div><h2>text</h2></div>');
51
- expect(violations.length).toBe(0);
52
- });
53
-
54
- test('enable option "in-document-fragment"', async () => {
55
- const { violations } = await mlRuleTest(rule, '<div><h2>text</h2></div>', {
56
- rule: {
57
- severity: 'error',
58
- options: {
59
- 'in-document-fragment': true,
60
- },
61
- },
62
- });
63
- expect(violations.length).toBe(1);
64
- });
65
-
66
- test('Issue #57', async () => {
67
- const { violations } = await mlRuleTest(rule, '');
68
- expect(violations.length).toBe(0);
69
- });