Skip to content

Commit 683e5bc

Browse files
lukythJamesHenry
authored andcommitted
feat(eslint-plugin): add new rule no-require-imports (typescript-eslint#199)
1 parent 5f3aec9 commit 683e5bc

File tree

5 files changed

+168
-1
lines changed

5 files changed

+168
-1
lines changed

packages/eslint-plugin/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ Then you should add `airbnb` (or `airbnb-base`) to your `extends` section of `.e
135135
| [`@typescript-eslint/no-non-null-assertion`](./docs/rules/no-non-null-assertion.md) | Disallows non-null assertions using the `!` postfix operator (`no-non-null-assertion` from TSLint) | :heavy_check_mark: | |
136136
| [`@typescript-eslint/no-object-literal-type-assertion`](./docs/rules/no-object-literal-type-assertion.md) | Forbids an object literal to appear in a type assertion expression (`no-object-literal-type-assertion` from TSLint) | :heavy_check_mark: | |
137137
| [`@typescript-eslint/no-parameter-properties`](./docs/rules/no-parameter-properties.md) | Disallow the use of parameter properties in class constructors. (`no-parameter-properties` from TSLint) | :heavy_check_mark: | |
138+
| [`@typescript-eslint/no-require-imports`](./docs/rules/no-require-imports.md) | Disallows invocation of `require()` (`no-require-imports` from TSLint) | :heavy_check_mark: | |
138139
| [`@typescript-eslint/no-this-alias`](./docs/rules/no-this-alias.md) | Disallow aliasing `this` (`no-this-assignment` from TSLint) | | |
139140
| [`@typescript-eslint/no-triple-slash-reference`](./docs/rules/no-triple-slash-reference.md) | Disallow `/// <reference path="" />` comments (`no-reference` from TSLint) | :heavy_check_mark: | |
140141
| [`@typescript-eslint/no-type-alias`](./docs/rules/no-type-alias.md) | Disallow the use of type aliases (`interface-over-type-literal` from TSLint) | | |

packages/eslint-plugin/ROADMAP.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@
114114
| [`no-default-export`] | 🔌 | [`import/no-default-export`] |
115115
| [`no-duplicate-imports`] | 🔌 | [`import/no-duplicates`] |
116116
| [`no-mergeable-namespace`] | 🛑 | N/A |
117-
| [`no-require-imports`] | 🛑 | N/A |
117+
| [`no-require-imports`] | | [`@typescript-eslint/no-require-imports`] |
118118
| [`object-literal-sort-keys`] | 🌓 | [`sort-keys`][sort-keys] <sup>[2]</sup> |
119119
| [`prefer-const`] | 🌟 | [`prefer-const`][prefer-const] |
120120
| [`prefer-readonly`] | 🛑 | N/A |
@@ -578,6 +578,7 @@ Relevant plugins: [`chai-expect-keywords`](https://github.com/gavinaiken/eslint-
578578
[`@typescript-eslint/no-use-before-define`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-use-before-define.md
579579
[`@typescript-eslint/restrict-plus-operands`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/restrict-plus-operands.md
580580
[`@typescript-eslint/indent`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/indent.md
581+
[`@typescript-eslint/no-require-imports`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/no-require-imports.md
581582
[`@typescript-eslint/array-type`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/array-type.md
582583
[`@typescript-eslint/class-name-casing`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/class-name-casing.md
583584
[`@typescript-eslint/interface-name-prefix`]: https://github.com/typescript-eslint/typescript-eslint/blob/master/packages/eslint-plugin/docs/rules/interface-name-prefix.md
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Disallows invocation of `require()` (no-require-imports)
2+
3+
Prefer the newer ES6-style imports over `require()`.
4+
5+
## Rule Details
6+
7+
Examples of **incorrect** code for this rule:
8+
9+
```ts
10+
var lib = require('lib');
11+
let lib2 = require('lib2');
12+
var lib5 = require('lib5'),
13+
lib6 = require('lib6');
14+
import lib8 = require('lib8');
15+
```
16+
17+
Examples of **correct** code for this rule:
18+
19+
```ts
20+
import { l } from 'lib';
21+
var lib3 = load('not_an_import');
22+
var lib4 = lib2.subImport;
23+
var lib7 = 700;
24+
import lib9 = lib2.anotherSubImport;
25+
import lib10 from 'lib10';
26+
```
27+
28+
## When Not To Use It
29+
30+
If you don't care about TypeScript module syntax, then you will not need this rule.
31+
32+
## Compatibility
33+
34+
- TSLint: [no-require-imports](https://palantir.github.io/tslint/rules/no-require-imports/)
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/**
2+
* @fileoverview Disallows invocation of `require()`.
3+
* @author Kanitkorn Sujautra
4+
*/
5+
'use strict';
6+
7+
const util = require('../util');
8+
9+
//------------------------------------------------------------------------------
10+
// Rule Definition
11+
//------------------------------------------------------------------------------
12+
13+
module.exports = {
14+
meta: {
15+
type: 'problem',
16+
docs: {
17+
description: 'Disallows invocation of `require()`.',
18+
extraDescription: [util.tslintRule('no-require-imports')],
19+
category: 'TypeScript',
20+
url: util.metaDocsUrl('no-require-imports'),
21+
recommended: 'error'
22+
},
23+
schema: [],
24+
messages: {
25+
noRequireImports: 'A `require()` style import is forbidden.'
26+
}
27+
},
28+
create(context) {
29+
//----------------------------------------------------------------------
30+
// Public
31+
//----------------------------------------------------------------------
32+
33+
return {
34+
CallExpression(node) {
35+
if (node.callee.name === 'require') {
36+
context.report({
37+
node,
38+
messageId: 'noRequireImports'
39+
});
40+
}
41+
},
42+
TSExternalModuleReference(node) {
43+
context.report({
44+
node,
45+
messageId: 'noRequireImports'
46+
});
47+
}
48+
};
49+
}
50+
};
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
/**
2+
* @fileoverview Disallows invocation of `require()`.
3+
* @author Kanitkorn Sujautra
4+
*/
5+
'use strict';
6+
7+
//------------------------------------------------------------------------------
8+
// Requirements
9+
//------------------------------------------------------------------------------
10+
11+
const rule = require('../../../lib/rules/no-require-imports'),
12+
RuleTester = require('eslint').RuleTester;
13+
14+
//------------------------------------------------------------------------------
15+
// Tests
16+
//------------------------------------------------------------------------------
17+
18+
const ruleTester = new RuleTester({
19+
parserOptions: {
20+
sourceType: 'module'
21+
},
22+
parser: '@typescript-eslint/parser'
23+
});
24+
25+
ruleTester.run('no-require-imports', rule, {
26+
valid: [
27+
"import {l} from 'lib'",
28+
"var lib3 = load('not_an_import')",
29+
'var lib4 = lib2.subImport',
30+
'var lib7 = 700',
31+
'import lib9 = lib2.anotherSubImport',
32+
"import lib10 from 'lib10'"
33+
],
34+
invalid: [
35+
{
36+
code: "var lib = require('lib')",
37+
errors: [
38+
{
39+
message: 'A `require()` style import is forbidden.',
40+
line: 1,
41+
column: 11
42+
}
43+
]
44+
},
45+
{
46+
code: "let lib2 = require('lib2')",
47+
errors: [
48+
{
49+
message: 'A `require()` style import is forbidden.',
50+
line: 1,
51+
column: 12
52+
}
53+
]
54+
},
55+
{
56+
code: "var lib5 = require('lib5'), lib6 = require('lib6')",
57+
errors: [
58+
{
59+
message: 'A `require()` style import is forbidden.',
60+
line: 1,
61+
column: 12
62+
},
63+
{
64+
message: 'A `require()` style import is forbidden.',
65+
line: 1,
66+
column: 36
67+
}
68+
]
69+
},
70+
{
71+
code: "import lib8 = require('lib8')",
72+
errors: [
73+
{
74+
message: 'A `require()` style import is forbidden.',
75+
line: 1,
76+
column: 15
77+
}
78+
]
79+
}
80+
]
81+
});

0 commit comments

Comments
 (0)