Skip to content

Commit 936c42a

Browse files
committed
Deprecate require-extension rule
1 parent 21f684a commit 936c42a

File tree

6 files changed

+73
-111
lines changed

6 files changed

+73
-111
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ Finally, enable all of the rules that you would like to use. Use [our preset](#
9797
* [react/prefer-stateless-function](docs/rules/prefer-stateless-function.md): Enforce stateless React Components to be written as a pure function
9898
* [react/prop-types](docs/rules/prop-types.md): Prevent missing props validation in a React component definition
9999
* [react/react-in-jsx-scope](docs/rules/react-in-jsx-scope.md): Prevent missing `React` when using JSX
100+
* [react/require-extension](docs/rules/require-extension.md): Restrict file extensions that may be required
100101
* [react/require-optimization](docs/rules/require-optimization.md): Enforce React components to have a shouldComponentUpdate method
101102
* [react/require-render-return](docs/rules/require-render-return.md): Enforce ES5 or ES6 class for returning value in render function
102103
* [react/self-closing-comp](docs/rules/self-closing-comp.md): Prevent extra closing tags for components without children
@@ -123,7 +124,6 @@ Finally, enable all of the rules that you would like to use. Use [our preset](#
123124
* [react/jsx-no-target-blank](docs/rules/jsx-no-target-blank.md): Prevent usage of unsafe `target='_blank'`
124125
* [react/jsx-no-undef](docs/rules/jsx-no-undef.md): Disallow undeclared variables in JSX
125126
* [react/jsx-pascal-case](docs/rules/jsx-pascal-case.md): Enforce PascalCase for user-defined JSX components
126-
* [react/jsx-require-extension](docs/rules/jsx-require-extension.md): Restrict file extensions that may be required
127127
* [react/jsx-sort-props](docs/rules/jsx-sort-props.md): Enforce props alphabetical sorting
128128
* [react/jsx-space-before-closing](docs/rules/jsx-space-before-closing.md): Validate spacing before closing bracket in JSX (fixable)
129129
* [react/jsx-uses-react](docs/rules/jsx-uses-react.md): Prevent React to be incorrectly marked as unused

docs/rules/jsx-require-extension.md renamed to docs/rules/require-extension.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
# Restrict file extensions that may be required (jsx-require-extension)
1+
# Restrict file extensions that may be required (require-extension)
2+
3+
**Deprecation notice**: This rule is deprecated. Please use the eslint-plugin-import [extensions](https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md) rule instead.
24

35
`require()` statements should generally not include a file extension as there is a well defined mechanism for resolving a module ID to a specific file. This rule inspects the module ID being required and creates a warning if the ID contains a '.jsx' file extension.
46

@@ -29,7 +31,7 @@ The set of forbidden extensions is configurable. By default '.jsx' is blocked. I
2931

3032
```js
3133
"rules": {
32-
"react/jsx-require-extension": [1, { "extensions": [".js", ".jsx"] }],
34+
"react/require-extension": [1, { "extensions": [".js", ".jsx"] }],
3335
}
3436
```
3537

index.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ var rules = {
3434
'sort-prop-types': require('./lib/rules/sort-prop-types'),
3535
'jsx-boolean-value': require('./lib/rules/jsx-boolean-value'),
3636
'sort-comp': require('./lib/rules/sort-comp'),
37-
'jsx-require-extension': require('./lib/rules/jsx-require-extension'),
3837
'jsx-no-duplicate-props': require('./lib/rules/jsx-no-duplicate-props'),
3938
'jsx-max-props-per-line': require('./lib/rules/jsx-max-props-per-line'),
4039
'jsx-no-literals': require('./lib/rules/jsx-no-literals'),

lib/rules/jsx-require-extension.js

Lines changed: 0 additions & 98 deletions
This file was deleted.

lib/rules/require-extension.js

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

8+
var path = require('path');
9+
var isWarnedForDeprecation = false;
10+
811
// ------------------------------------------------------------------------------
9-
// Rule Definition
12+
// Constants
1013
// ------------------------------------------------------------------------------
1114

12-
var util = require('util');
13-
var jsxRequireExtension = require('./jsx-require-extension');
14-
var isWarnedForDeprecation = false;
15+
var DEFAULTS = {
16+
extensions: ['.jsx']
17+
};
18+
19+
var PKG_REGEX = /^[^\.]((?!\/).)*$/;
20+
21+
// ------------------------------------------------------------------------------
22+
// Rule Definition
23+
// ------------------------------------------------------------------------------
1524

1625
module.exports = {
1726
meta: {
@@ -36,18 +45,68 @@ module.exports = {
3645
},
3746

3847
create: function(context) {
39-
return util._extend(jsxRequireExtension(context), {
48+
49+
function isPackage(id) {
50+
return PKG_REGEX.test(id);
51+
}
52+
53+
function isRequire(expression) {
54+
return expression.callee.name === 'require';
55+
}
56+
57+
function getId(expression) {
58+
return expression.arguments[0] && expression.arguments[0].value;
59+
}
60+
61+
function getExtension(id) {
62+
return path.extname(id || '');
63+
}
64+
65+
function getExtensionsConfig() {
66+
return context.options[0] && context.options[0].extensions || DEFAULTS.extensions;
67+
}
68+
69+
var forbiddenExtensions = getExtensionsConfig().reduce(function (extensions, extension) {
70+
extensions[extension] = true;
71+
return extensions;
72+
}, Object.create(null));
73+
74+
function isForbiddenExtension(ext) {
75+
return ext in forbiddenExtensions;
76+
}
77+
78+
// --------------------------------------------------------------------------
79+
// Public
80+
// --------------------------------------------------------------------------
81+
82+
return {
83+
84+
CallExpression: function(node) {
85+
if (isRequire(node)) {
86+
var id = getId(node);
87+
var ext = getExtension(id);
88+
if (!isPackage(id) && isForbiddenExtension(ext)) {
89+
context.report({
90+
node: node,
91+
message: 'Unable to require module with extension \'' + ext + '\''
92+
});
93+
}
94+
}
95+
},
96+
4097
Program: function() {
4198
if (isWarnedForDeprecation || /\=-(f|-format)=/.test(process.argv.join('='))) {
4299
return;
43100
}
44101

45102
/* eslint-disable no-console */
46103
console.log('The react/require-extension rule is deprecated. Please ' +
47-
'use the react/jsx-require-extension rule instead.');
104+
'use the import/extensions rule from eslint-plugin-import instead.');
48105
/* eslint-enable no-console */
49106
isWarnedForDeprecation = true;
50107
}
51-
});
108+
109+
};
110+
52111
}
53112
};

tests/lib/rules/jsx-require-extension.js renamed to tests/lib/rules/require-extension.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// Requirements
99
// ------------------------------------------------------------------------------
1010

11-
var rule = require('../../../lib/rules/jsx-require-extension');
11+
var rule = require('../../../lib/rules/require-extension');
1212
var RuleTester = require('eslint').RuleTester;
1313

1414
// ------------------------------------------------------------------------------
@@ -34,7 +34,7 @@ var REQUIRE_OBJECT = 'require({})';
3434
// ------------------------------------------------------------------------------
3535

3636
var ruleTester = new RuleTester();
37-
ruleTester.run('jsx-require-extension', rule, {
37+
ruleTester.run('require-extension', rule, {
3838

3939
valid: [
4040
{

0 commit comments

Comments
 (0)