Skip to content

Commit 7b27c53

Browse files
committed
Remove SVG attributes warning for React 15 (fixes #490)
1 parent c2dfef5 commit 7b27c53

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

lib/rules/no-unknown-property.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,22 @@
44
*/
55
'use strict';
66

7+
var versionUtil = require('../util/version');
8+
79
// ------------------------------------------------------------------------------
810
// Constants
911
// ------------------------------------------------------------------------------
1012

1113
var UNKNOWN_MESSAGE = 'Unknown property \'{{name}}\' found, use \'{{standardName}}\' instead';
1214

1315
var DOM_ATTRIBUTE_NAMES = {
14-
// Standard
1516
'accept-charset': 'acceptCharset',
1617
class: 'className',
1718
for: 'htmlFor',
18-
'http-equiv': 'httpEquiv',
19-
// SVG
19+
'http-equiv': 'httpEquiv'
20+
};
21+
22+
var SVGDOM_ATTRIBUTE_NAMES = {
2023
'clip-path': 'clipPath',
2124
'fill-opacity': 'fillOpacity',
2225
'font-family': 'fontFamily',
@@ -87,13 +90,18 @@ function isTagName(node) {
8790

8891
/**
8992
* Get the standard name of the attribute.
93+
* @param {Object} context The current rule context.
9094
* @param {String} name - Name of the attribute.
9195
* @returns {String} The standard name of the attribute.
9296
*/
93-
function getStandardName(name) {
97+
function getStandardName(context, name) {
9498
if (DOM_ATTRIBUTE_NAMES[name]) {
9599
return DOM_ATTRIBUTE_NAMES[name];
96100
}
101+
// Also check for SVG attribute for React <15
102+
if (!versionUtil.test(context, '15.0.0') && SVGDOM_ATTRIBUTE_NAMES[name]) {
103+
return SVGDOM_ATTRIBUTE_NAMES[name];
104+
}
97105
var i;
98106
var found = DOM_PROPERTY_NAMES.some(function(element, index) {
99107
i = index;
@@ -114,7 +122,7 @@ module.exports = function(context) {
114122

115123
JSXAttribute: function(node) {
116124
var name = sourceCode.getText(node.name);
117-
var standardName = getStandardName(name);
125+
var standardName = getStandardName(context, name);
118126
if (!isTagName(node) || !standardName) {
119127
return;
120128
}

tests/lib/rules/no-unknown-property.js

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@ ruleTester.run('no-unknown-property', rule, {
3636
{code: '<div data-foo="bar"></div>;', parserOptions: parserOptions},
3737
{code: '<div class="foo" is="my-elem"></div>;', parserOptions: parserOptions},
3838
{code: '<div {...this.props} class="foo" is="my-elem"></div>;', parserOptions: parserOptions},
39-
{code: '<atom-panel class="foo"></atom-panel>;', parserOptions: parserOptions}
39+
{code: '<atom-panel class="foo"></atom-panel>;', parserOptions: parserOptions},
40+
{code: '<use xlink:href="bar" />;', parserOptions: parserOptions},
41+
{code: '<rect clip-path="bar" />;', parserOptions: parserOptions}
4042
],
4143
invalid: [{
4244
code: '<div class="bar"></div>;',
@@ -77,11 +79,21 @@ ruleTester.run('no-unknown-property', rule, {
7779
code: '<use xlink:href="bar" />;',
7880
output: '<use xlinkHref="bar" />;',
7981
errors: [{message: 'Unknown property \'xlink:href\' found, use \'xlinkHref\' instead'}],
80-
parserOptions: parserOptions
82+
parserOptions: parserOptions,
83+
settings: {
84+
react: {
85+
version: '0.14.0'
86+
}
87+
}
8188
}, {
8289
code: '<rect clip-path="bar" />;',
8390
output: '<rect clipPath="bar" />;',
8491
errors: [{message: 'Unknown property \'clip-path\' found, use \'clipPath\' instead'}],
85-
parserOptions: parserOptions
92+
parserOptions: parserOptions,
93+
settings: {
94+
react: {
95+
version: '0.14.0'
96+
}
97+
}
8698
}]
8799
});

0 commit comments

Comments
 (0)