@@ -29,62 +29,176 @@ const ruleTester = new RuleTester({parserOptions});
29
29
ruleTester . run ( 'no-invalid-html-attribute' , rule , {
30
30
valid : [
31
31
{ code : '<a rel="alternate"></a>' } ,
32
+ { code : 'React.createElement("a", { rel: "alternate" })' } ,
33
+ { code : 'React.createElement("a", { rel: ["alternate"] })' } ,
32
34
{ code : '<a rel="author"></a>' } ,
35
+ { code : 'React.createElement("a", { rel: "author" })' } ,
36
+ { code : 'React.createElement("a", { rel: ["author"] })' } ,
33
37
{ code : '<a rel="bookmark"></a>' } ,
38
+ { code : 'React.createElement("a", { rel: "bookmark" })' } ,
39
+ { code : 'React.createElement("a", { rel: ["bookmark"] })' } ,
34
40
{ code : '<a rel="external"></a>' } ,
41
+ { code : 'React.createElement("a", { rel: "external" })' } ,
42
+ { code : 'React.createElement("a", { rel: ["external"] })' } ,
35
43
{ code : '<a rel="help"></a>' } ,
44
+ { code : 'React.createElement("a", { rel: "help" })' } ,
45
+ { code : 'React.createElement("a", { rel: ["help"] })' } ,
36
46
{ code : '<a rel="license"></a>' } ,
47
+ { code : 'React.createElement("a", { rel: "license" })' } ,
48
+ { code : 'React.createElement("a", { rel: ["license"] })' } ,
37
49
{ code : '<a rel="next"></a>' } ,
50
+ { code : 'React.createElement("a", { rel: "next" })' } ,
51
+ { code : 'React.createElement("a", { rel: ["next"] })' } ,
38
52
{ code : '<a rel="nofollow"></a>' } ,
53
+ { code : 'React.createElement("a", { rel: "nofollow" })' } ,
54
+ { code : 'React.createElement("a", { rel: ["nofollow"] })' } ,
39
55
{ code : '<a rel="noopener"></a>' } ,
56
+ { code : 'React.createElement("a", { rel: "noopener" })' } ,
57
+ { code : 'React.createElement("a", { rel: ["noopener"] })' } ,
40
58
{ code : '<a rel="noreferrer"></a>' } ,
59
+ { code : 'React.createElement("a", { rel: "noreferrer" })' } ,
60
+ { code : 'React.createElement("a", { rel: ["noreferrer"] })' } ,
41
61
{ code : '<a rel="opener"></a>' } ,
62
+ { code : 'React.createElement("a", { rel: "opener" })' } ,
63
+ { code : 'React.createElement("a", { rel: ["opener"] })' } ,
42
64
{ code : '<a rel="prev"></a>' } ,
65
+ { code : 'React.createElement("a", { rel: "prev" })' } ,
66
+ { code : 'React.createElement("a", { rel: ["prev"] })' } ,
43
67
{ code : '<a rel="search"></a>' } ,
68
+ { code : 'React.createElement("a", { rel: "search" })' } ,
69
+ { code : 'React.createElement("a", { rel: ["search"] })' } ,
44
70
{ code : '<a rel="tag"></a>' } ,
71
+ { code : 'React.createElement("a", { rel: "tag" })' } ,
72
+ { code : 'React.createElement("a", { rel: ["tag"] })' } ,
45
73
{ code : '<area rel="alternate"></area>' } ,
74
+ { code : 'React.createElement("area", { rel: "alternate" })' } ,
75
+ { code : 'React.createElement("area", { rel: ["alternate"] })' } ,
46
76
{ code : '<area rel="author"></area>' } ,
77
+ { code : 'React.createElement("area", { rel: "author" })' } ,
78
+ { code : 'React.createElement("area", { rel: ["author"] })' } ,
47
79
{ code : '<area rel="bookmark"></area>' } ,
80
+ { code : 'React.createElement("area", { rel: "bookmark" })' } ,
81
+ { code : 'React.createElement("area", { rel: ["bookmark"] })' } ,
48
82
{ code : '<area rel="external"></area>' } ,
83
+ { code : 'React.createElement("area", { rel: "external" })' } ,
84
+ { code : 'React.createElement("area", { rel: ["external"] })' } ,
49
85
{ code : '<area rel="help"></area>' } ,
86
+ { code : 'React.createElement("area", { rel: "help" })' } ,
87
+ { code : 'React.createElement("area", { rel: ["help"] })' } ,
50
88
{ code : '<area rel="license"></area>' } ,
89
+ { code : 'React.createElement("area", { rel: "license" })' } ,
90
+ { code : 'React.createElement("area", { rel: ["license"] })' } ,
51
91
{ code : '<area rel="next"></area>' } ,
92
+ { code : 'React.createElement("area", { rel: "next" })' } ,
93
+ { code : 'React.createElement("area", { rel: ["next"] })' } ,
52
94
{ code : '<area rel="nofollow"></area>' } ,
95
+ { code : 'React.createElement("area", { rel: "nofollow" })' } ,
96
+ { code : 'React.createElement("area", { rel: ["nofollow"] })' } ,
53
97
{ code : '<area rel="noopener"></area>' } ,
98
+ { code : 'React.createElement("area", { rel: "noopener" })' } ,
99
+ { code : 'React.createElement("area", { rel: ["noopener"] })' } ,
54
100
{ code : '<area rel="noreferrer"></area>' } ,
101
+ { code : 'React.createElement("area", { rel: "noreferrer" })' } ,
102
+ { code : 'React.createElement("area", { rel: ["noreferrer"] })' } ,
55
103
{ code : '<area rel="opener"></area>' } ,
104
+ { code : 'React.createElement("area", { rel: "opener" })' } ,
105
+ { code : 'React.createElement("area", { rel: ["opener"] })' } ,
56
106
{ code : '<area rel="prev"></area>' } ,
107
+ { code : 'React.createElement("area", { rel: "prev" })' } ,
108
+ { code : 'React.createElement("area", { rel: ["prev"] })' } ,
57
109
{ code : '<area rel="search"></area>' } ,
110
+ { code : 'React.createElement("area", { rel: "search" })' } ,
111
+ { code : 'React.createElement("area", { rel: ["search"] })' } ,
58
112
{ code : '<area rel="tag"></area>' } ,
113
+ { code : 'React.createElement("area", { rel: "tag" })' } ,
114
+ { code : 'React.createElement("area", { rel: ["tag"] })' } ,
59
115
{ code : '<link rel="alternate"></link>' } ,
116
+ { code : 'React.createElement("link", { rel: "alternate" })' } ,
117
+ { code : 'React.createElement("link", { rel: ["alternate"] })' } ,
60
118
{ code : '<link rel="author"></link>' } ,
119
+ { code : 'React.createElement("link", { rel: "author" })' } ,
120
+ { code : 'React.createElement("link", { rel: ["author"] })' } ,
61
121
{ code : '<link rel="canonical"></link>' } ,
122
+ { code : 'React.createElement("link", { rel: "canonical" })' } ,
123
+ { code : 'React.createElement("link", { rel: ["canonical"] })' } ,
62
124
{ code : '<link rel="dns-prefetch"></link>' } ,
125
+ { code : 'React.createElement("link", { rel: "dns-prefetch" })' } ,
126
+ { code : 'React.createElement("link", { rel: ["dns-prefetch"] })' } ,
63
127
{ code : '<link rel="help"></link>' } ,
128
+ { code : 'React.createElement("link", { rel: "help" })' } ,
129
+ { code : 'React.createElement("link", { rel: ["help"] })' } ,
64
130
{ code : '<link rel="icon"></link>' } ,
131
+ { code : 'React.createElement("link", { rel: "icon" })' } ,
132
+ { code : 'React.createElement("link", { rel: ["icon"] })' } ,
65
133
{ code : '<link rel="license"></link>' } ,
134
+ { code : 'React.createElement("link", { rel: "license" })' } ,
135
+ { code : 'React.createElement("link", { rel: ["license"] })' } ,
66
136
{ code : '<link rel="manifest"></link>' } ,
137
+ { code : 'React.createElement("link", { rel: "manifest" })' } ,
138
+ { code : 'React.createElement("link", { rel: ["manifest"] })' } ,
67
139
{ code : '<link rel="modulepreload"></link>' } ,
140
+ { code : 'React.createElement("link", { rel: "modulepreload" })' } ,
141
+ { code : 'React.createElement("link", { rel: ["modulepreload"] })' } ,
68
142
{ code : '<link rel="next"></link>' } ,
143
+ { code : 'React.createElement("link", { rel: "next" })' } ,
144
+ { code : 'React.createElement("link", { rel: ["next"] })' } ,
69
145
{ code : '<link rel="pingback"></link>' } ,
146
+ { code : 'React.createElement("link", { rel: "pingback" })' } ,
147
+ { code : 'React.createElement("link", { rel: ["pingback"] })' } ,
70
148
{ code : '<link rel="preconnect"></link>' } ,
149
+ { code : 'React.createElement("link", { rel: "preconnect" })' } ,
150
+ { code : 'React.createElement("link", { rel: ["preconnect"] })' } ,
71
151
{ code : '<link rel="prefetch"></link>' } ,
152
+ { code : 'React.createElement("link", { rel: "prefetch" })' } ,
153
+ { code : 'React.createElement("link", { rel: ["prefetch"] })' } ,
72
154
{ code : '<link rel="preload"></link>' } ,
155
+ { code : 'React.createElement("link", { rel: "preload" })' } ,
156
+ { code : 'React.createElement("link", { rel: ["preload"] })' } ,
73
157
{ code : '<link rel="prerender"></link>' } ,
158
+ { code : 'React.createElement("link", { rel: "prerender" })' } ,
159
+ { code : 'React.createElement("link", { rel: ["prerender"] })' } ,
74
160
{ code : '<link rel="prev"></link>' } ,
161
+ { code : 'React.createElement("link", { rel: "prev" })' } ,
162
+ { code : 'React.createElement("link", { rel: ["prev"] })' } ,
75
163
{ code : '<link rel="search"></link>' } ,
164
+ { code : 'React.createElement("link", { rel: "search" })' } ,
165
+ { code : 'React.createElement("link", { rel: ["search"] })' } ,
76
166
{ code : '<link rel="stylesheet"></link>' } ,
167
+ { code : 'React.createElement("link", { rel: "stylesheet" })' } ,
168
+ { code : 'React.createElement("link", { rel: ["stylesheet"] })' } ,
77
169
{ code : '<form rel="external"></form>' } ,
170
+ { code : 'React.createElement("form", { rel: "external" })' } ,
171
+ { code : 'React.createElement("form", { rel: ["external"] })' } ,
78
172
{ code : '<form rel="help"></form>' } ,
173
+ { code : 'React.createElement("form", { rel: "help" })' } ,
174
+ { code : 'React.createElement("form", { rel: ["help"] })' } ,
79
175
{ code : '<form rel="license"></form>' } ,
176
+ { code : 'React.createElement("form", { rel: "license" })' } ,
177
+ { code : 'React.createElement("form", { rel: ["license"] })' } ,
80
178
{ code : '<form rel="next"></form>' } ,
179
+ { code : 'React.createElement("form", { rel: "next" })' } ,
180
+ { code : 'React.createElement("form", { rel: ["next"] })' } ,
81
181
{ code : '<form rel="nofollow"></form>' } ,
182
+ { code : 'React.createElement("form", { rel: "nofollow" })' } ,
183
+ { code : 'React.createElement("form", { rel: ["nofollow"] })' } ,
82
184
{ code : '<form rel="noopener"></form>' } ,
185
+ { code : 'React.createElement("form", { rel: "noopener" })' } ,
186
+ { code : 'React.createElement("form", { rel: ["noopener"] })' } ,
83
187
{ code : '<form rel="noreferrer"></form>' } ,
188
+ { code : 'React.createElement("form", { rel: "noreferrer" })' } ,
189
+ { code : 'React.createElement("form", { rel: ["noreferrer"] })' } ,
84
190
{ code : '<form rel="opener"></form>' } ,
191
+ { code : 'React.createElement("form", { rel: "opener" })' } ,
192
+ { code : 'React.createElement("form", { rel: ["opener"] })' } ,
85
193
{ code : '<form rel="prev"></form>' } ,
194
+ { code : 'React.createElement("form", { rel: "prev" })' } ,
195
+ { code : 'React.createElement("form", { rel: ["prev"] })' } ,
86
196
{ code : '<form rel="search"></form>' } ,
197
+ { code : 'React.createElement("form", { rel: "search" })' } ,
198
+ { code : 'React.createElement("form", { rel: ["search"] })' } ,
87
199
{ code : '<form rel={callFoo()}></form>' } ,
200
+ { code : 'React.createElement("form", { rel: callFoo() })' } ,
201
+ { code : 'React.createElement("form", { rel: [callFoo()] })' } ,
88
202
{ code : '<a rel={{a: "noreferrer"}["a"]}></a>' } ,
89
203
{ code : '<a rel={{a: "noreferrer"}["b"]}></a>' }
90
204
] ,
@@ -96,20 +210,44 @@ ruleTester.run('no-invalid-html-attribute', rule, {
96
210
message : 'The "rel" attribute only has meaning on the tags: "<link>", "<a>", "<area>", "<form>"'
97
211
} ]
98
212
} ,
213
+ {
214
+ code : 'React.createElement("html", { rel: 1 })' ,
215
+ errors : [ {
216
+ message : 'The "rel" attribute only has meaning on the tags: "<link>", "<a>", "<area>", "<form>"'
217
+ } ]
218
+ } ,
99
219
{
100
220
code : '<Foo rel></Foo>' ,
101
221
output : '<Foo ></Foo>' ,
102
222
errors : [ {
103
223
message : 'The "rel" attribute only has meaning on the tags: "<link>", "<a>", "<area>", "<form>"'
104
224
} ]
105
225
} ,
226
+ {
227
+ code : 'React.createElement("Foo", { rel: true })' ,
228
+ errors : [ {
229
+ message : 'The "rel" attribute only has meaning on the tags: "<link>", "<a>", "<area>", "<form>"'
230
+ } ]
231
+ } ,
106
232
{
107
233
code : '<a rel></a>' ,
108
234
output : '<a ></a>' ,
109
235
errors : [ {
110
236
message : 'An empty "rel" attribute is meaningless.'
111
237
} ]
112
238
} ,
239
+ {
240
+ code : 'React.createElement("a", { rel: 1 })' ,
241
+ errors : [ {
242
+ message : '1 is never a valid "rel" attribute value.'
243
+ } ]
244
+ } ,
245
+ {
246
+ code : 'React.createElement("a", { rel() { return 1; } })' ,
247
+ errors : [ {
248
+ message : 'The "rel" attribute cannot be a method.'
249
+ } ]
250
+ } ,
113
251
{
114
252
code : '<any rel></any>' ,
115
253
output : '<any ></any>' ,
@@ -173,6 +311,12 @@ ruleTester.run('no-invalid-html-attribute', rule, {
173
311
message : '"foobar" is never a valid "rel" attribute value.'
174
312
} ]
175
313
} ,
314
+ {
315
+ code : 'React.createElement("a", { rel: ["noreferrer", "noopener", "foobar" ] })' ,
316
+ errors : [ {
317
+ message : '"foobar" is never a valid "rel" attribute value.'
318
+ } ]
319
+ } ,
176
320
{
177
321
code : '<a rel={"foobar noreferrer noopener"}></a>' ,
178
322
output : '<a rel={" noreferrer noopener"}></a>' ,
0 commit comments