@markuplint/rules 3.8.0 → 3.10.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 (103) hide show
  1. package/lib/attr-duplication/index.d.ts +1 -3
  2. package/lib/attr-value-quotes/index.d.ts +2 -2
  3. package/lib/case-sensitive-attr-name/index.d.ts +1 -1
  4. package/lib/case-sensitive-tag-name/index.d.ts +1 -1
  5. package/lib/character-reference/index.d.ts +1 -1
  6. package/lib/class-naming/index.d.ts +1 -1
  7. package/lib/create-message.d.ts +2 -12
  8. package/lib/deprecated-attr/index.d.ts +1 -3
  9. package/lib/deprecated-element/index.d.ts +1 -3
  10. package/lib/disallowed-element/index.d.ts +1 -1
  11. package/lib/doctype/index.d.ts +2 -2
  12. package/lib/end-tag/index.d.ts +1 -1
  13. package/lib/helpers.d.ts +18 -39
  14. package/lib/id-duplication/index.d.ts +1 -3
  15. package/lib/index.d.ts +7 -7
  16. package/lib/ineffective-attr/index.d.ts +1 -3
  17. package/lib/invalid-attr/index.d.ts +31 -38
  18. package/lib/label-has-control/index.d.ts +1 -3
  19. package/lib/landmark-roles/index.d.ts +3 -3
  20. package/lib/no-boolean-attr-value/index.d.ts +1 -3
  21. package/lib/no-default-value/index.d.ts +1 -3
  22. package/lib/no-empty-palpable-content/index.d.ts +3 -3
  23. package/lib/no-hard-code-id/index.d.ts +1 -3
  24. package/lib/no-refer-to-non-existent-id/index.d.ts +4 -9
  25. package/lib/no-use-event-handler-attr/index.d.ts +2 -2
  26. package/lib/permitted-contents/choice.d.ts +1 -7
  27. package/lib/permitted-contents/complex-branch.d.ts +1 -7
  28. package/lib/permitted-contents/count-pattern.d.ts +2 -17
  29. package/lib/permitted-contents/debug.browser.d.ts +15 -15
  30. package/lib/permitted-contents/debug.d.ts +1 -1
  31. package/lib/permitted-contents/index.d.ts +1 -1
  32. package/lib/permitted-contents/matches-selector.d.ts +1 -6
  33. package/lib/permitted-contents/order.d.ts +1 -7
  34. package/lib/permitted-contents/recursive-branch.d.ts +1 -7
  35. package/lib/permitted-contents/represent-transparent-nodes.d.ts +3 -7
  36. package/lib/permitted-contents/start.d.ts +1 -6
  37. package/lib/permitted-contents/types.d.ts +29 -29
  38. package/lib/permitted-contents/utils.d.ts +1 -1
  39. package/lib/placeholder-label-option/index.d.ts +1 -1
  40. package/lib/require-accessible-name/index.d.ts +2 -2
  41. package/lib/require-datetime/index.d.ts +2 -2
  42. package/lib/require-datetime/types.d.ts +2 -2
  43. package/lib/required-attr/index.d.ts +3 -3
  44. package/lib/required-element/index.d.ts +2 -2
  45. package/lib/required-h1/index.d.ts +3 -3
  46. package/lib/use-list/index.d.ts +2 -2
  47. package/lib/wai-aria/checkings/_.d.ts +12 -6
  48. package/lib/wai-aria/checkings/default-value.d.ts +3 -7
  49. package/lib/wai-aria/checkings/deprecated-props.d.ts +4 -8
  50. package/lib/wai-aria/checkings/implicit-props.d.ts +4 -8
  51. package/lib/wai-aria/checkings/no-global-prop.d.ts +3 -7
  52. package/lib/wai-aria/checkings/required-owned-elements.d.ts +3 -7
  53. package/lib/wai-aria/checkings/required-prop copy.d.ts +12 -6
  54. package/lib/wai-aria/checkings/required-prop.d.ts +6 -12
  55. package/lib/wai-aria/checkings/unadopted-explicit-roles.d.ts +12 -6
  56. package/lib/wai-aria/checkings/value.d.ts +6 -15
  57. package/lib/wai-aria/index.d.ts +1 -1
  58. package/lib/wai-aria/types.d.ts +10 -10
  59. package/lib/xxx/index.d.ts +2 -0
  60. package/lib/xxx/index.js +32 -0
  61. package/package.json +13 -15
  62. package/test/attr-check.spec.js +77 -0
  63. package/test/attr-duplication/index.spec.js +159 -0
  64. package/test/attr-value-quotes/index.spec.js +133 -0
  65. package/test/case-sensitive-attr-name/index.spec.js +65 -0
  66. package/test/case-sensitive-tag-name/index.spec.js +80 -0
  67. package/test/character-reference/index.spec.js +57 -0
  68. package/test/class-naming/index.spec.js +470 -0
  69. package/test/create-message.spec.js +497 -0
  70. package/test/deprecated-attr/index.spec.js +48 -0
  71. package/test/deprecated-element/index.spec.js +48 -0
  72. package/test/disallowed-element/index.spec.js +90 -0
  73. package/test/doctype/index.spec.js +50 -0
  74. package/test/end-tag/index.spec.js +162 -0
  75. package/test/id-duplication/index.spec.js +47 -0
  76. package/test/ineffective-attr/index.spec.js +31 -0
  77. package/test/invalid-attr/index.spec.js +1632 -0
  78. package/test/label-has-control/index.spec.js +29 -0
  79. package/test/landmark-roles/index.spec.js +187 -0
  80. package/test/no-boolean-attr-value/index.spec.js +41 -0
  81. package/test/no-default-value/index.spec.js +74 -0
  82. package/test/no-empty-palpable-content/index.spec.js +115 -0
  83. package/test/no-hard-code-id/index.spec.js +100 -0
  84. package/test/no-refer-to-non-existent-id/index.spec.js +254 -0
  85. package/test/no-use-event-handler-attr/index.spec.js +57 -0
  86. package/test/permitted-contents/choice.spec.js +174 -0
  87. package/test/permitted-contents/count-pattern.spec.js +308 -0
  88. package/test/permitted-contents/index.spec.js +1371 -0
  89. package/test/permitted-contents/matches-selector.spec.js +59 -0
  90. package/test/permitted-contents/order.spec.js +351 -0
  91. package/test/permitted-contents/recursive-branch.spec.js +41 -0
  92. package/test/permitted-contents/represent-transparent-nodes.spec.js +24 -0
  93. package/test/permitted-contents/start.spec.js +67 -0
  94. package/test/placeholder-label-option/index.spec.js +113 -0
  95. package/test/require-accessible-name/index.spec.js +446 -0
  96. package/test/require-datetime/index.spec.js +54 -0
  97. package/test/require-datetime/utils.spec.js +52 -0
  98. package/test/required-attr/index.spec.js +414 -0
  99. package/test/required-element/index.spec.js +188 -0
  100. package/test/required-h1/index.spec.js +69 -0
  101. package/test/use-list/index.spec.js +109 -0
  102. package/test/wai-aria/checkings/value.spec.js +33 -0
  103. package/test/wai-aria/index.spec.js +1173 -0
@@ -0,0 +1,159 @@
1
+ const { mlRuleTest } = require('markuplint');
2
+
3
+ const rule = require('../../lib/attr-duplication').default;
4
+
5
+ test('is test 1', async () => {
6
+ const { violations } = await mlRuleTest(
7
+ rule,
8
+ `
9
+ <div data-attr="value" data-Attr='db' data-attR=tr>
10
+ lorem
11
+ <p>ipsam</p>
12
+ </div>
13
+ `,
14
+ );
15
+
16
+ expect(violations).toStrictEqual([
17
+ {
18
+ severity: 'error',
19
+ message: 'The attribute name is duplicated',
20
+ line: 2,
21
+ col: 26,
22
+ raw: 'data-Attr',
23
+ },
24
+ {
25
+ severity: 'error',
26
+ message: 'The attribute name is duplicated',
27
+ line: 2,
28
+ col: 41,
29
+ raw: 'data-attR',
30
+ },
31
+ ]);
32
+ });
33
+
34
+ test('is test 2', async () => {
35
+ const { violations } = await mlRuleTest(
36
+ rule,
37
+ `
38
+ <div
39
+ data-attr="value"
40
+ data-Attr='db'
41
+ data-attR=tr>
42
+ lorem
43
+ <p>ipsam</p>
44
+ </div>
45
+ `,
46
+ );
47
+
48
+ expect(violations).toStrictEqual([
49
+ {
50
+ severity: 'error',
51
+ message: 'The attribute name is duplicated',
52
+ line: 4,
53
+ col: 4,
54
+ raw: 'data-Attr',
55
+ },
56
+ {
57
+ severity: 'error',
58
+ message: 'The attribute name is duplicated',
59
+ line: 5,
60
+ col: 4,
61
+ raw: 'data-attR',
62
+ },
63
+ ]);
64
+ });
65
+
66
+ test('is test 3', async () => {
67
+ const { violations } = await mlRuleTest(rule, '<img src="/" SRC="/" >', undefined, false, 'ja');
68
+
69
+ expect(violations.map(_ => _.message)).toStrictEqual(['属性名が重複しています']);
70
+ });
71
+
72
+ test('nodeRules disable', async () => {
73
+ const { violations } = await mlRuleTest(rule, '<div><span attr attr></span></div>', {
74
+ nodeRule: [
75
+ {
76
+ selector: 'span',
77
+ rule: false,
78
+ },
79
+ ],
80
+ });
81
+
82
+ expect(violations.length).toStrictEqual(0);
83
+ });
84
+
85
+ test('Vue', async () => {
86
+ const { violations } = await mlRuleTest(rule, '<template><div attr v-bind:attr /></template>', {
87
+ parser: {
88
+ '.*': '@markuplint/vue-parser',
89
+ },
90
+ });
91
+
92
+ expect(violations).toStrictEqual([
93
+ {
94
+ severity: 'error',
95
+ line: 1,
96
+ col: 21,
97
+ message: 'The attribute name is duplicated',
98
+ raw: 'v-bind:attr',
99
+ },
100
+ ]);
101
+ });
102
+
103
+ test('Vue (exception)', async () => {
104
+ const { violations } = await mlRuleTest(
105
+ rule,
106
+ '<template><div class="foo" v-bind:class="bar" style="a: b;" :style="{c: d}" /></template>',
107
+ {
108
+ parser: {
109
+ '.*': '@markuplint/vue-parser',
110
+ },
111
+ },
112
+ );
113
+
114
+ expect(violations.length).toBe(0);
115
+ });
116
+
117
+ test('React', async () => {
118
+ const { violations } = await mlRuleTest(rule, '<div tabindex tabIndex />', {
119
+ parser: {
120
+ '.*': '@markuplint/vue-parser',
121
+ },
122
+ });
123
+
124
+ expect(violations).toStrictEqual([]);
125
+ });
126
+
127
+ test('Pug', async () => {
128
+ const { violations } = await mlRuleTest(rule, '.hoge(class="hoge2")&attributes({class: "hoge3"})', {
129
+ parser: {
130
+ '.*': '@markuplint/pug-parser',
131
+ },
132
+ });
133
+
134
+ expect(violations.length).toBe(0);
135
+ });
136
+
137
+ test('Svelte', async () => {
138
+ const { violations } = await mlRuleTest(
139
+ rule,
140
+ '<div class:selected="{isSelected}" class:focused="{isFocused}"></div>',
141
+ {
142
+ parser: {
143
+ '.*': '@markuplint/svelte-parser',
144
+ },
145
+ },
146
+ );
147
+
148
+ expect(violations.length).toBe(0);
149
+ });
150
+
151
+ test('Astro', async () => {
152
+ const { violations } = await mlRuleTest(rule, '<div class:list="a" class="b"></div>', {
153
+ parser: {
154
+ '.*': '@markuplint/astro-parser',
155
+ },
156
+ });
157
+
158
+ expect(violations.length).toBe(1);
159
+ });
@@ -0,0 +1,133 @@
1
+ const { mlRuleTest } = require('markuplint');
2
+
3
+ const rule = require('../../lib/attr-value-quotes').default;
4
+
5
+ describe('verify', () => {
6
+ test('default', async () => {
7
+ const { violations } = await mlRuleTest(
8
+ rule,
9
+ `
10
+ <div data-attr="value" data-Attr='db' data-attR=tr>
11
+ lorem
12
+ <p>ipsam</p>
13
+ </div>
14
+ `,
15
+ );
16
+ expect(violations).toStrictEqual([
17
+ {
18
+ severity: 'warning',
19
+ message: 'Attribute value is must quote on double quotation mark',
20
+ line: 2,
21
+ col: 26,
22
+ raw: "data-Attr='db'",
23
+ },
24
+ {
25
+ severity: 'warning',
26
+ message: 'Attribute value is must quote on double quotation mark',
27
+ line: 2,
28
+ col: 41,
29
+ raw: 'data-attR=tr',
30
+ },
31
+ ]);
32
+ });
33
+
34
+ test('double', async () => {
35
+ const { violations } = await mlRuleTest(
36
+ rule,
37
+ `
38
+ <div data-attr="value" data-Attr='db' data-attR=tr>
39
+ lorem
40
+ <p>ipsam</p>
41
+ </div>
42
+ `,
43
+ {
44
+ rule: {
45
+ severity: 'error',
46
+ value: 'double',
47
+ options: null,
48
+ },
49
+ },
50
+ );
51
+ expect(violations).toStrictEqual([
52
+ {
53
+ severity: 'error',
54
+ message: 'Attribute value is must quote on double quotation mark',
55
+ line: 2,
56
+ col: 26,
57
+ raw: "data-Attr='db'",
58
+ },
59
+ {
60
+ severity: 'error',
61
+ message: 'Attribute value is must quote on double quotation mark',
62
+ line: 2,
63
+ col: 41,
64
+ raw: 'data-attR=tr',
65
+ },
66
+ ]);
67
+ });
68
+
69
+ test('single', async () => {
70
+ const { violations } = await mlRuleTest(
71
+ rule,
72
+ `
73
+ <div data-attr="value" data-Attr='db' data-attR=tr>
74
+ lorem
75
+ <p>ipsam</p>
76
+ </div>
77
+ `,
78
+ {
79
+ rule: {
80
+ severity: 'error',
81
+ value: 'single',
82
+ options: null,
83
+ },
84
+ },
85
+ );
86
+ expect(violations).toStrictEqual([
87
+ {
88
+ severity: 'error',
89
+ message: 'Attribute value is must quote on single quotation mark',
90
+ line: 2,
91
+ col: 8,
92
+ raw: 'data-attr="value"',
93
+ },
94
+ {
95
+ severity: 'error',
96
+ message: 'Attribute value is must quote on single quotation mark',
97
+ line: 2,
98
+ col: 41,
99
+ raw: 'data-attR=tr',
100
+ },
101
+ ]);
102
+ });
103
+
104
+ test('empty', async () => {
105
+ const { violations } = await mlRuleTest(
106
+ rule,
107
+ `
108
+ <div data-attr>
109
+ lorem
110
+ <p>ipsam</p>
111
+ </div>
112
+ `,
113
+ );
114
+ expect(violations.length).toBe(0);
115
+ });
116
+ });
117
+
118
+ // describe('fix', () => {
119
+ // test('empty', async () => {
120
+ // const { fixedCode } = await mlRuleTest(rule, '<div attr noop=noop foo="bar" hoge=\'fuga\'>', undefined, true);
121
+ // expect(fixedCode).toEqual('<div attr noop="noop" foo="bar" hoge="fuga">');
122
+ // });
123
+
124
+ // test('empty', async () => {
125
+ // const { fixedCode } = await mlRuleTest(
126
+ // rule,
127
+ // '<div attr noop=noop foo="bar" hoge=\'fuga\'>',
128
+ // { rule: 'single' },
129
+ // true,
130
+ // );
131
+ // expect(fixedCode).toEqual("<div attr noop='noop' foo='bar' hoge='fuga'>");
132
+ // });
133
+ // });
@@ -0,0 +1,65 @@
1
+ const { mlRuleTest } = require('markuplint');
2
+
3
+ const rule = require('../../lib/case-sensitive-attr-name').default;
4
+
5
+ describe('verify', () => {
6
+ test('lower case', async () => {
7
+ const { violations } = await mlRuleTest(rule, '<div data-lowercase></div>');
8
+ expect(violations).toStrictEqual([]);
9
+ });
10
+
11
+ test('upper case', async () => {
12
+ const { violations } = await mlRuleTest(rule, '<div data-UPPERCASE="value"></div>');
13
+ expect(violations[0].severity).toBe('warning');
14
+ expect(violations[0].message).toBe('Attribute names of HTML elements should be lowercase');
15
+ expect(violations[0].raw).toBe('data-UPPERCASE');
16
+ });
17
+
18
+ test('upper case', async () => {
19
+ const { violations } = await mlRuleTest(rule, '<div data-UPPERCASE="value"></div>', {
20
+ rule: {
21
+ severity: 'error',
22
+ value: 'upper',
23
+ options: null,
24
+ },
25
+ });
26
+ expect(violations[0].severity).toBe('error');
27
+ expect(violations[0].message).toBe('Attribute names of HTML elements must be uppercase');
28
+ });
29
+
30
+ test('upper case', async () => {
31
+ const { violations } = await mlRuleTest(rule, '<div data-uppercase="value"></div>', {
32
+ rule: {
33
+ severity: 'error',
34
+ value: 'upper',
35
+ options: null,
36
+ },
37
+ });
38
+ expect(violations[0].severity).toBe('error');
39
+ expect(violations[0].message).toBe('Attribute names of HTML elements must be uppercase');
40
+ });
41
+
42
+ test('upper case', async () => {
43
+ const { violations } = await mlRuleTest(rule, '<div DATA-UPPERCASE="value"></div>', {
44
+ rule: { severity: 'error', value: 'upper' },
45
+ });
46
+ expect(violations.length).toBe(0);
47
+ });
48
+
49
+ test('svg', async () => {
50
+ const { violations } = await mlRuleTest(rule, '<svg viewBox="0 0 100 100"></svg>');
51
+ expect(violations.length).toBe(0);
52
+ });
53
+ });
54
+
55
+ // describe('fix', () => {
56
+ // test('upper case', async () => {
57
+ // const { fixedCode } = await mlRuleTest(rule, '<DIV DATA-LOWERCASE></DIV>', undefined, true);
58
+ // expect(fixedCode).toBe('<DIV data-lowercase></DIV>');
59
+ // });
60
+
61
+ // test('upper case', async () => {
62
+ // const { fixedCode } = await mlRuleTest(rule, '<DIV data-lowercase></DIV>', { rule: 'upper' }, true);
63
+ // expect(fixedCode).toBe('<DIV DATA-LOWERCASE></DIV>');
64
+ // });
65
+ // });
@@ -0,0 +1,80 @@
1
+ const { mlRuleTest } = require('markuplint');
2
+
3
+ const rule = require('../../lib/case-sensitive-tag-name').default;
4
+
5
+ describe('verify', () => {
6
+ test('lower case', async () => {
7
+ const { violations } = await mlRuleTest(rule, '<div data-lowercase></div>');
8
+ expect(violations).toStrictEqual([]);
9
+ });
10
+
11
+ test('upper case', async () => {
12
+ const { violations } = await mlRuleTest(rule, '<DIV data-lowercase></DIV>');
13
+ expect(violations[0].severity).toBe('warning');
14
+ expect(violations[0].message).toBe('Tag names of HTML elements should be lowercase');
15
+ expect(violations[0].raw).toBe('DIV');
16
+ });
17
+
18
+ test('upper case', async () => {
19
+ const { violations } = await mlRuleTest(rule, '<div data-UPPERCASE="value"></div>', {
20
+ rule: {
21
+ severity: 'error',
22
+ value: 'upper',
23
+ },
24
+ });
25
+ expect(violations[0].severity).toBe('error');
26
+ expect(violations[0].message).toBe('Tag names of HTML elements must be uppercase');
27
+ });
28
+
29
+ test('upper case', async () => {
30
+ const { violations } = await mlRuleTest(rule, '<DIV data-uppercase="value"></DIV>', {
31
+ rule: {
32
+ severity: 'error',
33
+ value: 'upper',
34
+ },
35
+ });
36
+ expect(violations.length).toBe(0);
37
+ });
38
+
39
+ test('upper case', async () => {
40
+ const { violations } = await mlRuleTest(rule, '<DIV DATA-UPPERCASE="value"></div>', {
41
+ rule: {
42
+ severity: 'error',
43
+ value: 'upper',
44
+ },
45
+ });
46
+ expect(violations.length).toBe(1);
47
+ });
48
+
49
+ test('upper case', async () => {
50
+ const { violations } = await mlRuleTest(rule, '<div DATA-UPPERCASE="value"></DIV>', {
51
+ rule: {
52
+ severity: 'error',
53
+ value: 'upper',
54
+ },
55
+ });
56
+ expect(violations.length).toBe(1);
57
+ });
58
+
59
+ test('svg', async () => {
60
+ const { violations } = await mlRuleTest(rule, '<svg viewBox="0 0 100 100"><textPath></textPath></svg>');
61
+ expect(violations.length).toBe(0);
62
+ });
63
+
64
+ test('custom elements', async () => {
65
+ const { violations } = await mlRuleTest(rule, '<xxx-hoge>lorem</xxx-hoge>');
66
+ expect(violations.length).toBe(0);
67
+ });
68
+
69
+ test('custom elements', async () => {
70
+ const { violations } = await mlRuleTest(rule, '<XXX-hoge>lorem</XXX-hoge>');
71
+ expect(violations.length).toBe(0);
72
+ });
73
+ });
74
+
75
+ // describe('fix', () => {
76
+ // test('upper case', async () => {
77
+ // const { fixedCode } = await mlRuleTest(rule, '<DIV data-lowercase></DIV>', undefined, true);
78
+ // expect(fixedCode).toBe('<div data-lowercase></div>');
79
+ // });
80
+ // });
@@ -0,0 +1,57 @@
1
+ const { mlRuleTest } = require('markuplint');
2
+
3
+ const rule = require('../../lib/character-reference').default;
4
+
5
+ test('character-reference', async () => {
6
+ const { violations } = await mlRuleTest(rule, '<div id="a"> > < & " \' &amp;</div>');
7
+ expect(violations.length).toBe(4);
8
+ expect(violations[0]).toStrictEqual({
9
+ severity: 'error',
10
+ message: 'Illegal characters must escape in character reference',
11
+ line: 1,
12
+ col: 14,
13
+ raw: '>',
14
+ });
15
+ expect(violations[1].col).toBe(16);
16
+ expect(violations[1].raw).toBe('<');
17
+ expect(violations[2].col).toBe(18);
18
+ expect(violations[2].raw).toBe('&');
19
+ expect(violations[3].col).toBe(20);
20
+ expect(violations[3].raw).toBe('"');
21
+ });
22
+
23
+ test('character-reference', async () => {
24
+ const { violations } = await mlRuleTest(rule, '<img src="path/to?a=b&c=d">');
25
+ expect(violations).toStrictEqual([
26
+ {
27
+ severity: 'error',
28
+ message: 'Illegal characters must escape in character reference',
29
+ line: 1,
30
+ col: 22,
31
+ raw: '&',
32
+ },
33
+ ]);
34
+ });
35
+
36
+ test('character-reference', async () => {
37
+ const { violations } = await mlRuleTest(rule, '<script>if (i < 0) console.log("<markuplint>");</script>');
38
+ expect(violations.length).toBe(0);
39
+ });
40
+
41
+ test('in Vue', async () => {
42
+ const { violations } = await mlRuleTest(rule, '<template><div v-if="a < b"></div></template>', {
43
+ parser: {
44
+ '.*': '@markuplint/vue-parser',
45
+ },
46
+ });
47
+ expect(violations.length).toBe(0);
48
+ });
49
+
50
+ test('in EJS', async () => {
51
+ const { violations } = await mlRuleTest(rule, '<title><%- "title" _%></title>', {
52
+ parser: {
53
+ '.*': '@markuplint/ejs-parser',
54
+ },
55
+ });
56
+ expect(violations.length).toBe(0);
57
+ });