Skip to content

Commit 2eed7fb

Browse files
committed
[Breaking] drop node < 4 support.
Also, require template literals instead of concatenation, and auto fix.
1 parent e332b08 commit 2eed7fb

39 files changed

+108
-143
lines changed

.eslintrc

+11-6
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
"env": {
33
"node": true
44
},
5+
parserOptions: {
6+
ecmaVersion: 2015
7+
},
58
ecmaFeatures: {
69
jsx: true
710
},
8-
"globals": {
9-
},
10-
"plugins": [
11-
],
1211
"rules": {
1312
// Possible Errors
1413
"comma-dangle": [2, "never"],
@@ -149,10 +148,16 @@
149148
"wrap-regex": 0,
150149
// Legacy
151150
"max-depth": 0,
152-
"max-len": [2, 120],
151+
"max-len": [2, 120, {
152+
"ignoreStrings": true,
153+
"ignoreTemplateLiterals": true,
154+
"ignoreComments": true,
155+
}],
153156
"max-params": 0,
154157
"max-statements": 0,
155158
"no-plusplus": 0,
156-
"no-prototype-builtins": 2
159+
"no-prototype-builtins": 2,
160+
"prefer-template": 2,
161+
"template-curly-spacing": [2, "never"]
157162
}
158163
}

.travis.yml

-4
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@ node_js:
44
- '6'
55
- '5'
66
- '4'
7-
- 'iojs'
8-
- '0.12'
9-
- '0.10'
107
before_script:
11-
- 'if [ "${TRAVIS_NODE_VERSION}" = "iojs" ] || [ "${TRAVIS_NODE_VERSION}" = "0.12" ] || [ "${TRAVIS_NODE_VERSION}" = "0.10" ]; then npm install eslint@2 babel-eslint@6; fi'
128
after_success:
139
- npm run coveralls
1410
matrix:

index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ function configureAsError(rules) {
7979
if (!has(rules, key)) {
8080
continue;
8181
}
82-
result['react/' + key] = 2;
82+
result[`react/${key}`] = 2;
8383
}
8484
return result;
8585
}

lib/rules/forbid-component-props.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ module.exports = {
6161

6262
context.report({
6363
node: node,
64-
message: 'Prop `' + prop + '` is forbidden on Components'
64+
message: `Prop \`${prop}\` is forbidden on Components`
6565
});
6666
}
6767
};

lib/rules/forbid-prop-types.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ module.exports = {
102102
if (isForbidden(target)) {
103103
context.report({
104104
node: declaration,
105-
message: 'Prop type `' + target + '` is forbidden'
105+
message: `Prop type \`${target}\` is forbidden`
106106
});
107107
}
108108
});

lib/rules/jsx-closing-bracket-location.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -248,8 +248,7 @@ module.exports = {
248248
if (correctColumn !== null) {
249249
expectedNextLine = tokens.lastProp &&
250250
(tokens.lastProp.lastLine === tokens.closing.line);
251-
data.details = ' (expected column ' + (correctColumn + 1) +
252-
(expectedNextLine ? ' on the next line)' : ')');
251+
data.details = ` (expected column ${correctColumn + 1}${expectedNextLine ? ' on the next line)' : ')'}`;
253252
}
254253

255254
context.report({
@@ -274,7 +273,7 @@ module.exports = {
274273
case 'tag-aligned':
275274
case 'line-aligned':
276275
return fixer.replaceTextRange([cachedLastAttributeEndPos, node.end],
277-
'\n' + getIndentation(tokens, expectedLocation, correctColumn) + closingTag);
276+
`\n${getIndentation(tokens, expectedLocation, correctColumn)}${closingTag}`);
278277
default:
279278
return true;
280279
}

lib/rules/jsx-curly-spacing.js

+6-6
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ module.exports = {
8383
context.report({
8484
node: node,
8585
loc: token.loc.start,
86-
message: 'There should be no newline after \'' + token.value + '\'',
86+
message: `There should be no newline after '${token.value}'`,
8787
fix: function(fixer) {
8888
var nextToken = sourceCode.getTokenAfter(token);
8989
return fixer.replaceTextRange([token.range[1], nextToken.range[0]], spaced ? ' ' : '');
@@ -101,7 +101,7 @@ module.exports = {
101101
context.report({
102102
node: node,
103103
loc: token.loc.start,
104-
message: 'There should be no newline before \'' + token.value + '\'',
104+
message: `There should be no newline before '${token.value}'`,
105105
fix: function(fixer) {
106106
var previousToken = sourceCode.getTokenBefore(token);
107107
return fixer.replaceTextRange([previousToken.range[1], token.range[0]], spaced ? ' ' : '');
@@ -119,7 +119,7 @@ module.exports = {
119119
context.report({
120120
node: node,
121121
loc: token.loc.start,
122-
message: 'There should be no space after \'' + token.value + '\'',
122+
message: `There should be no space after '${token.value}'`,
123123
fix: function(fixer) {
124124
var nextToken = sourceCode.getTokenAfter(token);
125125
var leadingComments = sourceCode.getNodeByRangeIndex(nextToken.range[0]).leadingComments;
@@ -139,7 +139,7 @@ module.exports = {
139139
context.report({
140140
node: node,
141141
loc: token.loc.start,
142-
message: 'There should be no space before \'' + token.value + '\'',
142+
message: `There should be no space before '${token.value}'`,
143143
fix: function(fixer) {
144144
var previousToken = sourceCode.getTokenBefore(token);
145145
var trailingComments = sourceCode.getNodeByRangeIndex(previousToken.range[0]).trailingComments;
@@ -159,7 +159,7 @@ module.exports = {
159159
context.report({
160160
node: node,
161161
loc: token.loc.start,
162-
message: 'A space is required after \'' + token.value + '\'',
162+
message: `A space is required after '${token.value}'`,
163163
fix: function(fixer) {
164164
return fixer.insertTextAfter(token, ' ');
165165
}
@@ -176,7 +176,7 @@ module.exports = {
176176
context.report({
177177
node: node,
178178
loc: token.loc.start,
179-
message: 'A space is required before \'' + token.value + '\'',
179+
message: `A space is required before '${token.value}'`,
180180
fix: function(fixer) {
181181
return fixer.insertTextBefore(token, ' ');
182182
}

lib/rules/jsx-filename-extension.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ module.exports = {
8585

8686
context.report({
8787
node: invalidNode,
88-
message: 'JSX not allowed in files with extension \'' + invalidExtension + '\''
88+
message: `JSX not allowed in files with extension '${invalidExtension}'`
8989
});
9090
}
9191
};

lib/rules/jsx-handler-names.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@ module.exports = {
3737
var eventHandlerPrefix = configuration.eventHandlerPrefix || 'handle';
3838
var eventHandlerPropPrefix = configuration.eventHandlerPropPrefix || 'on';
3939

40-
var EVENT_HANDLER_REGEX = new RegExp('^((props\\.' + eventHandlerPropPrefix + ')'
41-
+ '|((.*\\.)?' + eventHandlerPrefix + '))[A-Z].*$');
42-
var PROP_EVENT_HANDLER_REGEX = new RegExp('^(' + eventHandlerPropPrefix + '[A-Z].*|ref)$');
40+
var EVENT_HANDLER_REGEX = new RegExp(`^((props\\.${eventHandlerPropPrefix})|((.*\\.)?${eventHandlerPrefix}))[A-Z].*$`);
41+
var PROP_EVENT_HANDLER_REGEX = new RegExp(`^(${eventHandlerPropPrefix}[A-Z].*|ref)$`);
4342

4443
return {
4544
JSXAttribute: function(node) {
@@ -60,12 +59,12 @@ module.exports = {
6059
if (propIsEventHandler && !propFnIsNamedCorrectly) {
6160
context.report({
6261
node: node,
63-
message: 'Handler function for ' + propKey + ' prop key must begin with \'' + eventHandlerPrefix + '\''
62+
message: `Handler function for ${propKey} prop key must begin with '${eventHandlerPrefix}'`
6463
});
6564
} else if (propFnIsNamedCorrectly && !propIsEventHandler) {
6665
context.report({
6766
node: node,
68-
message: 'Prop key for ' + propValue + ' must begin with \'' + eventHandlerPropPrefix + '\''
67+
message: `Prop key for ${propValue} must begin with '${eventHandlerPropPrefix}'`
6968
});
7069
}
7170
}

lib/rules/jsx-indent-props.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -128,9 +128,9 @@ module.exports = {
128128

129129
var regExp;
130130
if (indentType === 'space') {
131-
regExp = new RegExp('^[ ' + skip + ']+');
131+
regExp = new RegExp(`^[ ${skip}]+`);
132132
} else {
133-
regExp = new RegExp('^[\t' + skip + ']+');
133+
regExp = new RegExp(`^[\t${skip}]+`);
134134
}
135135

136136
var indent = regExp.exec(src);

lib/rules/jsx-indent.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ module.exports = {
144144

145145
var regExp;
146146
if (indentType === 'space') {
147-
regExp = new RegExp('^[ ' + skip + ']+');
147+
regExp = new RegExp(`^[ ${skip}]+`);
148148
} else {
149-
regExp = new RegExp('^[\t' + skip + ']+');
149+
regExp = new RegExp(`^[\t${skip}]+`);
150150
}
151151

152152
var indent = regExp.exec(src);

lib/rules/jsx-max-props-per-line.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ module.exports = {
6464
var name = getPropName(props[line][maximum]);
6565
context.report({
6666
node: props[line][maximum],
67-
message: 'Prop `' + name + '` must be placed on a new line'
67+
message: `Prop \`${name}\` must be placed on a new line`
6868
});
6969
break;
7070
}

lib/rules/jsx-no-undef.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ module.exports = {
6767

6868
context.report({
6969
node: node,
70-
message: '\'' + node.name + '\' is not defined.'
70+
message: `'${node.name}' is not defined.`
7171
});
7272
}
7373

lib/rules/jsx-pascal-case.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ module.exports = {
6666
if (!isPascalCase && !isCompatTag && !isAllowedAllCaps && !isIgnored) {
6767
context.report({
6868
node: node,
69-
message: 'Imported JSX component ' + name + ' must be in PascalCase'
69+
message: `Imported JSX component ${name} must be in PascalCase`
7070
});
7171
}
7272
}

lib/rules/jsx-wrap-multilines.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ module.exports = {
7373
node: node,
7474
message: 'Missing parentheses around multilines JSX',
7575
fix: function(fixer) {
76-
return fixer.replaceText(node, '(' + sourceCode.getText(node) + ')');
76+
return fixer.replaceText(node, `(${sourceCode.getText(node)})`);
7777
}
7878
});
7979
}

lib/rules/no-children-prop.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
*/
55
'use strict';
66

7-
var find = require('array.prototype.find');
8-
97
// ------------------------------------------------------------------------------
108
// Helpers
119
// ------------------------------------------------------------------------------
@@ -55,7 +53,7 @@ module.exports = {
5553
}
5654

5755
var props = node.arguments[1].properties;
58-
var childrenProp = find(props, function(prop) {
56+
var childrenProp = props.find(function(prop) {
5957
return prop.key && prop.key.name === 'children';
6058
});
6159

lib/rules/no-danger-with-children.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
*/
55
'use strict';
66

7-
var find = require('array.prototype.find');
87
var variableUtil = require('../util/variable');
98

109
// ------------------------------------------------------------------------------
@@ -21,7 +20,7 @@ module.exports = {
2120
},
2221
create: function(context) {
2322
function findSpreadVariable(name) {
24-
return find(variableUtil.variablesInScope(context), function (item) {
23+
return variableUtil.variablesInScope(context).find(function (item) {
2524
return item.name === name;
2625
});
2726
}
@@ -34,7 +33,7 @@ module.exports = {
3433
if (!node.properties) {
3534
return false;
3635
}
37-
return find(node.properties, function(prop) {
36+
return node.properties.find(function(prop) {
3837
if (prop.type === 'Property') {
3938
return prop.key.name === propName;
4039
} else if (prop.type === 'ExperimentalSpreadProperty') {
@@ -54,7 +53,7 @@ module.exports = {
5453
*/
5554
function findJsxProp(node, propName) {
5655
var attributes = node.openingElement.attributes;
57-
return find(attributes, function (attribute) {
56+
return attributes.find(function (attribute) {
5857
if (attribute.type === 'JSXSpreadAttribute') {
5958
var variable = findSpreadVariable(attribute.argument.name);
6059
if (variable && variable.defs.length && variable.defs[0].node.init) {
@@ -95,7 +94,7 @@ module.exports = {
9594
var props = node.arguments[1];
9695

9796
if (props.type === 'Identifier') {
98-
var variable = find(variableUtil.variablesInScope(context), function (item) {
97+
var variable = variableUtil.variablesInScope(context).find(function (item) {
9998
return item.name === props.name;
10099
});
101100
if (variable && variable.defs[0].node.init) {

lib/rules/no-deprecated.js

+17-17
Original file line numberDiff line numberDiff line change
@@ -38,28 +38,28 @@ module.exports = {
3838
MemberExpression: {}
3939
};
4040
// 0.12.0
41-
deprecated.MemberExpression[pragma + '.renderComponent'] = ['0.12.0', pragma + '.render'];
42-
deprecated.MemberExpression[pragma + '.renderComponentToString'] = ['0.12.0', pragma + '.renderToString'];
43-
deprecated.MemberExpression[pragma + '.renderComponentToStaticMarkup'] = [
41+
deprecated.MemberExpression[`${pragma}.renderComponent`] = ['0.12.0', `${pragma}.render`];
42+
deprecated.MemberExpression[`${pragma}.renderComponentToString`] = ['0.12.0', `${pragma}.renderToString`];
43+
deprecated.MemberExpression[`${pragma}.renderComponentToStaticMarkup`] = [
4444
'0.12.0',
45-
pragma + '.renderToStaticMarkup'
45+
`${pragma}.renderToStaticMarkup`
4646
];
47-
deprecated.MemberExpression[pragma + '.isValidComponent'] = ['0.12.0', pragma + '.isValidElement'];
48-
deprecated.MemberExpression[pragma + '.PropTypes.component'] = ['0.12.0', pragma + '.PropTypes.element'];
49-
deprecated.MemberExpression[pragma + '.PropTypes.renderable'] = ['0.12.0', pragma + '.PropTypes.node'];
50-
deprecated.MemberExpression[pragma + '.isValidClass'] = ['0.12.0'];
47+
deprecated.MemberExpression[`${pragma}.isValidComponent`] = ['0.12.0', `${pragma}.isValidElement`];
48+
deprecated.MemberExpression[`${pragma}.PropTypes.component`] = ['0.12.0', `${pragma}.PropTypes.element`];
49+
deprecated.MemberExpression[`${pragma}.PropTypes.renderable`] = ['0.12.0', `${pragma}.PropTypes.node`];
50+
deprecated.MemberExpression[`${pragma}.isValidClass`] = ['0.12.0'];
5151
deprecated.MemberExpression['this.transferPropsTo'] = ['0.12.0', 'spread operator ({...})'];
5252
// 0.13.0
53-
deprecated.MemberExpression[pragma + '.addons.classSet'] = ['0.13.0', 'the npm module classnames'];
54-
deprecated.MemberExpression[pragma + '.addons.cloneWithProps'] = ['0.13.0', pragma + '.cloneElement'];
53+
deprecated.MemberExpression[`${pragma}.addons.classSet`] = ['0.13.0', 'the npm module classnames'];
54+
deprecated.MemberExpression[`${pragma}.addons.cloneWithProps`] = ['0.13.0', `${pragma}.cloneElement`];
5555
// 0.14.0
56-
deprecated.MemberExpression[pragma + '.render'] = ['0.14.0', 'ReactDOM.render'];
57-
deprecated.MemberExpression[pragma + '.unmountComponentAtNode'] = ['0.14.0', 'ReactDOM.unmountComponentAtNode'];
58-
deprecated.MemberExpression[pragma + '.findDOMNode'] = ['0.14.0', 'ReactDOM.findDOMNode'];
59-
deprecated.MemberExpression[pragma + '.renderToString'] = ['0.14.0', 'ReactDOMServer.renderToString'];
60-
deprecated.MemberExpression[pragma + '.renderToStaticMarkup'] = ['0.14.0', 'ReactDOMServer.renderToStaticMarkup'];
56+
deprecated.MemberExpression[`${pragma}.render`] = ['0.14.0', 'ReactDOM.render'];
57+
deprecated.MemberExpression[`${pragma}.unmountComponentAtNode`] = ['0.14.0', 'ReactDOM.unmountComponentAtNode'];
58+
deprecated.MemberExpression[`${pragma}.findDOMNode`] = ['0.14.0', 'ReactDOM.findDOMNode'];
59+
deprecated.MemberExpression[`${pragma}.renderToString`] = ['0.14.0', 'ReactDOMServer.renderToString'];
60+
deprecated.MemberExpression[`${pragma}.renderToStaticMarkup`] = ['0.14.0', 'ReactDOMServer.renderToStaticMarkup'];
6161
// 15.0.0
62-
deprecated.MemberExpression[pragma + '.addons.LinkedStateMixin'] = ['15.0.0'];
62+
deprecated.MemberExpression[`${pragma}.addons.LinkedStateMixin`] = ['15.0.0'];
6363
deprecated.MemberExpression['ReactPerf.printDOM'] = ['15.0.0', 'ReactPerf.printOperations'];
6464
deprecated.MemberExpression['Perf.printDOM'] = ['15.0.0', 'Perf.printOperations'];
6565
deprecated.MemberExpression['ReactPerf.getMeasurementsSummaryMap'] = ['15.0.0', 'ReactPerf.getWasted'];
@@ -96,7 +96,7 @@ module.exports = {
9696
data: {
9797
oldMethod: method,
9898
version: deprecated[node.type][method][0],
99-
newMethod: deprecated[node.type][method][1] ? ', use ' + deprecated[node.type][method][1] + ' instead' : ''
99+
newMethod: deprecated[node.type][method][1] ? `, use ${deprecated[node.type][method][1]} instead` : ''
100100
}
101101
});
102102
},

lib/rules/no-render-return-value.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ module.exports = {
6060
) {
6161
context.report({
6262
node: callee,
63-
message: 'Do not depend on the return value from ' + callee.object.name + '.render'
63+
message: `Do not depend on the return value from ${callee.object.name}.render`
6464
});
6565
}
6666
}

lib/rules/no-unused-prop-types.js

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// https://github.com/yannickcr/eslint-plugin-react/issues/7
99

1010
var has = require('has');
11-
var assign = require('object.assign');
1211
var Components = require('../util/Components');
1312
var variable = require('../util/variable');
1413
var annotations = require('../util/annotations');
@@ -52,7 +51,7 @@ module.exports = {
5251

5352
var defaults = {skipShapeProps: true};
5453
var sourceCode = context.getSourceCode();
55-
var configuration = assign({}, defaults, context.options[0] || {});
54+
var configuration = Object.assign({}, defaults, context.options[0] || {});
5655
var skipShapeProps = configuration.skipShapeProps;
5756
var customValidators = configuration.customValidators || [];
5857
// Used to track the type annotations in scope.
@@ -588,7 +587,7 @@ module.exports = {
588587
}
589588
break;
590589
default:
591-
throw new Error(node.type + ' ASTNodes are not handled by markPropTypesAsUsed');
590+
throw new Error(`${node.type} ASTNodes are not handled by markPropTypesAsUsed`);
592591
}
593592

594593
var component = components.get(utils.getParentComponent());

0 commit comments

Comments
 (0)