Skip to content

Commit 014ee05

Browse files
mdjermanovicljharb
authored andcommitted
[Fix] no-invalid-html-attribute: ensure error messages are correct
1 parent 23b0a49 commit 014ee05

File tree

3 files changed

+193
-45
lines changed

3 files changed

+193
-45
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ This change log adheres to standards from [Keep a CHANGELOG](https://keepachange
99
* [`boolean-prop-naming`]: avoid a crash with a non-TSTypeReference type ([#3718][] @developer-bandi)
1010
* [`jsx-no-leaked-render`]: invalid report if left side is boolean ([#3746][] @akulsr0)
1111
* [`jsx-closing-bracket-location`]: message shows `{{details}}` when there are no details ([#3759][] @mdjermanovic)
12+
* [`no-invalid-html-attribute`]: ensure error messages are correct ([#3759][] @mdjermanovic, @ljharb)
1213

1314
[#3759]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3759
1415
[#3746]: https://github.com/jsx-eslint/eslint-plugin-react/pull/3746

lib/rules/no-invalid-html-attribute.js

+82-38
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,8 @@ const messages = {
238238
suggestRemoveDefault: '"remove {{attributeName}}"',
239239
suggestRemoveEmpty: '"remove empty attribute {{attributeName}}"',
240240
suggestRemoveInvalid: '“remove invalid attribute {{reportingValue}}”',
241-
suggestRemoveWhitespaces: 'remove whitespaces in “{{reportingValue}}”',
242-
suggestRemoveNonString: 'remove non-string value in “{{reportingValue}}”',
241+
suggestRemoveWhitespaces: 'remove whitespaces in “{{attributeName}}”',
242+
suggestRemoveNonString: 'remove non-string value in “{{attributeName}}”',
243243
};
244244

245245
function splitIntoRangedParts(node, regex) {
@@ -259,27 +259,37 @@ function splitIntoRangedParts(node, regex) {
259259

260260
function checkLiteralValueNode(context, attributeName, node, parentNode, parentNodeName) {
261261
if (typeof node.value !== 'string') {
262+
const data = { attributeName, reportingValue: node.value };
263+
262264
report(context, messages.onlyStrings, 'onlyStrings', {
263265
node,
264-
data: { attributeName },
266+
data,
265267
suggest: [
266268
Object.assign(
267269
getMessageData('suggestRemoveNonString', messages.suggestRemoveNonString),
268-
{ fix(fixer) { return fixer.remove(parentNode); } }
270+
{
271+
data,
272+
fix(fixer) { return fixer.remove(parentNode); },
273+
}
269274
),
270275
],
271276
});
272277
return;
273278
}
274279

275280
if (!node.value.trim()) {
281+
const data = { attributeName, reportingValue: node.value };
282+
276283
report(context, messages.noEmpty, 'noEmpty', {
277284
node,
278-
data: { attributeName },
285+
data,
279286
suggest: [
280287
Object.assign(
281288
getMessageData('suggestRemoveEmpty', messages.suggestRemoveEmpty),
282-
{ fix(fixer) { return fixer.remove(node.parent); } }
289+
{
290+
data,
291+
fix(fixer) { return fixer.remove(node.parent); },
292+
}
283293
),
284294
],
285295
});
@@ -291,32 +301,44 @@ function checkLiteralValueNode(context, attributeName, node, parentNode, parentN
291301
const allowedTags = VALID_VALUES.get(attributeName).get(singlePart.value);
292302
const reportingValue = singlePart.reportingValue;
293303

294-
const suggest = [
295-
Object.assign(
296-
getMessageData('suggestRemoveInvalid', messages.suggestRemoveInvalid),
297-
{ fix(fixer) { return fixer.removeRange(singlePart.range); } }
298-
),
299-
];
300-
301304
if (!allowedTags) {
302305
const data = {
303306
attributeName,
304307
reportingValue,
305308
};
309+
306310
report(context, messages.neverValid, 'neverValid', {
307311
node,
308312
data,
309-
suggest,
313+
suggest: [
314+
Object.assign(
315+
getMessageData('suggestRemoveInvalid', messages.suggestRemoveInvalid),
316+
{
317+
data,
318+
fix(fixer) { return fixer.removeRange(singlePart.range); },
319+
}
320+
),
321+
],
310322
});
311323
} else if (!allowedTags.has(parentNodeName)) {
324+
const data = {
325+
attributeName,
326+
reportingValue,
327+
elementName: parentNodeName,
328+
};
329+
312330
report(context, messages.notValidFor, 'notValidFor', {
313331
node,
314-
data: {
315-
attributeName,
316-
reportingValue,
317-
elementName: parentNodeName,
318-
},
319-
suggest,
332+
data,
333+
suggest: [
334+
Object.assign(
335+
getMessageData('suggestRemoveInvalid', messages.suggestRemoveInvalid),
336+
{
337+
data,
338+
fix(fixer) { return fixer.removeRange(singlePart.range); },
339+
}
340+
),
341+
],
320342
});
321343
}
322344
}
@@ -360,7 +382,10 @@ function checkLiteralValueNode(context, attributeName, node, parentNode, parentN
360382
suggest: [
361383
Object.assign(
362384
getMessageData('suggestRemoveWhitespaces', messages.suggestRemoveWhitespaces),
363-
{ fix(fixer) { return fixer.removeRange(whitespacePart.range); } }
385+
{
386+
data: { attributeName },
387+
fix(fixer) { return fixer.removeRange(whitespacePart.range); },
388+
}
364389
),
365390
],
366391
});
@@ -371,7 +396,10 @@ function checkLiteralValueNode(context, attributeName, node, parentNode, parentN
371396
suggest: [
372397
Object.assign(
373398
getMessageData('suggestRemoveWhitespaces', messages.suggestRemoveWhitespaces),
374-
{ fix(fixer) { return fixer.replaceTextRange(whitespacePart.range, '\u0020'); } }
399+
{
400+
data: { attributeName },
401+
fix(fixer) { return fixer.replaceTextRange(whitespacePart.range, '\u0020'); },
402+
}
375403
),
376404
],
377405
});
@@ -390,16 +418,21 @@ function checkAttribute(context, node) {
390418
COMPONENT_ATTRIBUTE_MAP.get(attribute).values(),
391419
(tagName) => `"<${tagName}>"`
392420
).join(', ');
421+
const data = {
422+
attributeName: attribute,
423+
tagNames,
424+
};
425+
393426
report(context, messages.onlyMeaningfulFor, 'onlyMeaningfulFor', {
394427
node: node.name,
395-
data: {
396-
attributeName: attribute,
397-
tagNames,
398-
},
428+
data,
399429
suggest: [
400430
Object.assign(
401431
getMessageData('suggestRemoveDefault', messages.suggestRemoveDefault),
402-
{ fix(fixer) { return fixer.remove(node); } }
432+
{
433+
data,
434+
fix(fixer) { return fixer.remove(node); },
435+
}
403436
),
404437
],
405438
});
@@ -409,13 +442,15 @@ function checkAttribute(context, node) {
409442
function fix(fixer) { return fixer.remove(node); }
410443

411444
if (!node.value) {
445+
const data = { attributeName: attribute };
446+
412447
report(context, messages.emptyIsMeaningless, 'emptyIsMeaningless', {
413448
node: node.name,
414-
data: { attributeName: attribute },
449+
data,
415450
suggest: [
416451
Object.assign(
417452
getMessageData('suggestRemoveEmpty', messages.suggestRemoveEmpty),
418-
{ fix }
453+
{ data, fix }
419454
),
420455
],
421456
});
@@ -435,24 +470,28 @@ function checkAttribute(context, node) {
435470
}
436471

437472
if (node.value.expression.type === 'ObjectExpression') {
473+
const data = { attributeName: attribute };
474+
438475
report(context, messages.onlyStrings, 'onlyStrings', {
439476
node: node.value,
440-
data: { attributeName: attribute },
477+
data,
441478
suggest: [
442479
Object.assign(
443480
getMessageData('suggestRemoveDefault', messages.suggestRemoveDefault),
444-
{ fix }
481+
{ data, fix }
445482
),
446483
],
447484
});
448485
} else if (node.value.expression.type === 'Identifier' && node.value.expression.name === 'undefined') {
486+
const data = { attributeName: attribute };
487+
449488
report(context, messages.onlyStrings, 'onlyStrings', {
450489
node: node.value,
451-
data: { attributeName: attribute },
490+
data,
452491
suggest: [
453492
Object.assign(
454493
getMessageData('suggestRemoveDefault', messages.suggestRemoveDefault),
455-
{ fix }
494+
{ data, fix }
456495
),
457496
],
458497
});
@@ -476,16 +515,21 @@ function checkPropValidValue(context, node, value, attribute) {
476515

477516
const validTagSet = validTags.get(value.value);
478517
if (!validTagSet) {
518+
const data = {
519+
attributeName: attribute,
520+
reportingValue: value.value,
521+
};
522+
479523
report(context, messages.neverValid, 'neverValid', {
480524
node: value,
481-
data: {
482-
attributeName: attribute,
483-
reportingValue: value.value,
484-
},
525+
data,
485526
suggest: [
486527
Object.assign(
487528
getMessageData('suggestRemoveInvalid', messages.suggestRemoveInvalid),
488-
{ fix(fixer) { return fixer.replaceText(value, value.raw.replace(value.value, '')); } }
529+
{
530+
data,
531+
fix(fixer) { return fixer.replaceText(value, value.raw.replace(value.value, '')); },
532+
}
489533
),
490534
],
491535
});

0 commit comments

Comments
 (0)