Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 46 additions & 26 deletions crates/oxc_linter/src/rules/typescript/no_require_imports.rs
Original file line number Diff line number Diff line change
Expand Up @@ -131,49 +131,36 @@ impl Rule for NoRequireImports {
fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {
match node.kind() {
AstKind::CallExpression(call_expr) => {
if node.scope_id() != ctx.scoping().root_scope_id()
&& let Some(id) = call_expr.callee.get_identifier_reference()
&& !id.is_global_reference_name(REQUIRE, ctx.scoping())
{
let Some(id) = call_expr.callee.get_identifier_reference() else {
return;
}
};

if !call_expr.is_require_call() {
if id.name != REQUIRE || !id.is_global_reference_name(REQUIRE, ctx.scoping()) {
return;
}

if !self.allow.is_empty() {
let Some(argument) = call_expr.arguments.first() else {
return;
};

// Check `allow` patterns against static string/template literal arguments
if !self.allow.is_empty()
&& let Some(argument) = call_expr.arguments.first()
{
match argument {
Argument::TemplateLiteral(template_literal) => {
let Some(quasi) = template_literal.quasis.first() else {
return;
};

if match_argument_value_with_regex(&self.allow, &quasi.value.raw) {
return;
}

ctx.diagnostic(no_require_imports_diagnostic(quasi.span));
}
Argument::StringLiteral(string_literal) => {
if match_argument_value_with_regex(&self.allow, &string_literal.value) {
return;
}

ctx.diagnostic(no_require_imports_diagnostic(string_literal.span));
}
_ => {}
}
}

if ctx.scoping().find_binding(ctx.scoping().root_scope_id(), REQUIRE).is_some() {
return;
}

ctx.diagnostic(no_require_imports_diagnostic(call_expr.span));
}
AstKind::TSImportEqualsDeclaration(decl) => match &decl.module_reference {
Expand All @@ -182,12 +169,10 @@ impl Rule for NoRequireImports {
return;
}

if !self.allow.is_empty() {
if match_argument_value_with_regex(&self.allow, &mod_ref.expression.value) {
return;
}

ctx.diagnostic(no_require_imports_diagnostic(mod_ref.span));
if !self.allow.is_empty()
&& match_argument_value_with_regex(&self.allow, &mod_ref.expression.value)
{
return;
}

ctx.diagnostic(no_require_imports_diagnostic(decl.span));
Expand All @@ -212,6 +197,23 @@ fn test() {
("import lib9 = lib2.anotherSubImport;", None),
("import lib10 from 'lib10';", None),
("var lib3 = load?.('not_an_import');", None),
(
"
import { createRequire } from 'module';
const require = createRequire();
require(someModule);
",
None,
),
(
"
function foo() {
let require = bazz;
require(someModule);
}
",
None,
),
(
"
import { createRequire } from 'module';
Expand Down Expand Up @@ -381,6 +383,24 @@ fn test() {
}",
None,
),
("const m = require(someVariable);", None),
("const m = require(path.join(dir, file));", None),
(
r"class Foo {
require(module: string) {
return require(module);
}
}",
None,
),
(
r"class Foo {
require(module: string) {
return require('foo');
}
}",
None,
),
];

Tester::new(NoRequireImports::NAME, NoRequireImports::PLUGIN, pass, fail)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,27 +80,13 @@ source: crates/oxc_linter/src/tester.rs
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:21]
1 │ const pkg = require('./package.jsonc');
· ─────────────────
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:13]
1 │ const pkg = require('./package.jsonc');
· ──────────────────────────
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:22]
1 │ const pkg = require(`./package.jsonc`);
· ───────────────
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:13]
1 │ const pkg = require(`./package.jsonc`);
Expand All @@ -115,27 +101,13 @@ source: crates/oxc_linter/src/tester.rs
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:14]
1 │ import pkg = require('./package.jsonc');
· ──────────────────────────
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:1]
1 │ import pkg = require('./package.jsonc');
· ────────────────────────────────────────
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:14]
1 │ import pkg = require('./package.json');
· ─────────────────────────
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:1]
1 │ import pkg = require('./package.json');
Expand Down Expand Up @@ -225,3 +197,35 @@ source: crates/oxc_linter/src/tester.rs
3 │ }
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:11]
1 │ const m = require(someVariable);
· ─────────────────────
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:1:11]
1 │ const m = require(path.join(dir, file));
· ─────────────────────────────
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:3:24]
2 │ require(module: string) {
3 │ return require(module);
· ───────────────
4 │ }
╰────
help: Do not use CommonJS `require` calls

⚠ typescript-eslint(no-require-imports): Expected "import" statement instead of "require" call
╭─[no_require_imports.ts:3:24]
2 │ require(module: string) {
3 │ return require('foo');
· ──────────────
4 │ }
╰────
help: Do not use CommonJS `require` calls
Loading