Skip to content

Commit 10d852d

Browse files
committed
tools: support ESM in ESLint required-modules rule
1 parent a0219af commit 10d852d

2 files changed

Lines changed: 41 additions & 21 deletions

File tree

Makefile

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -879,6 +879,8 @@ jslint:
879879
@echo "Running JS linter..."
880880
$(NODE) tools/eslint/bin/eslint.js --cache --rulesdir=tools/eslint-rules --ext=.js,.md \
881881
benchmark doc lib test tools
882+
$(NODE) tools/eslint/bin/eslint.js --cache --rulesdir=tools/eslint-rules --parser-options=sourceType:module --ext=.mjs \
883+
benchmark doc lib test tools
882884

883885
jslint-ci:
884886
@echo "Running JS linter..."

tools/eslint-rules/required-modules.js

Lines changed: 39 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const path = require('path');
1313
module.exports = function(context) {
1414
// trim required module names
1515
var requiredModules = context.options;
16+
const isESM = context.parserOptions.sourceType === 'module';
1617

1718
const foundModules = [];
1819

@@ -39,39 +40,35 @@ module.exports = function(context) {
3940
return node.callee.type === 'Identifier' && node.callee.name === 'require';
4041
}
4142

43+
/**
44+
* Function to check if the path is a required module and return its name.
45+
* @param {String} str The path to check
46+
* @returns {undefined|String} required module name or undefined
47+
*/
48+
function getRequiredModuleName(str) {
49+
var value = path.basename(str);
50+
51+
// check if value is in required modules array
52+
return requiredModules.indexOf(value) !== -1 ? value : undefined;
53+
}
54+
4255
/**
4356
* Function to check if a node has an argument that is a required module and
4457
* return its name.
4558
* @param {ASTNode} node The node to check
4659
* @returns {undefined|String} required module name or undefined
4760
*/
48-
function getRequiredModuleName(node) {
49-
var moduleName;
50-
61+
function getRequiredModuleNameFromCall(node) {
5162
// node has arguments and first argument is string
5263
if (node.arguments.length && isString(node.arguments[0])) {
53-
var argValue = path.basename(node.arguments[0].value.trim());
54-
55-
// check if value is in required modules array
56-
if (requiredModules.indexOf(argValue) !== -1) {
57-
moduleName = argValue;
58-
}
64+
return getRequiredModuleName(node.arguments[0].value.trim());
5965
}
6066

61-
return moduleName;
67+
return undefined;
6268
}
6369

64-
return {
65-
'CallExpression': function(node) {
66-
if (isRequireCall(node)) {
67-
var requiredModuleName = getRequiredModuleName(node);
68-
69-
if (requiredModuleName) {
70-
foundModules.push(requiredModuleName);
71-
}
72-
}
73-
},
74-
'Program:exit': function(node) {
70+
const rules = {
71+
'Program:exit'(node) {
7572
if (foundModules.length < requiredModules.length) {
7673
var missingModules = requiredModules.filter(
7774
function(module) {
@@ -88,6 +85,27 @@ module.exports = function(context) {
8885
}
8986
}
9087
};
88+
89+
if (isESM) {
90+
rules.ImportDeclaration = (node) => {
91+
var requiredModuleName = getRequiredModuleName(node.source.value);
92+
if (requiredModuleName) {
93+
foundModules.push(requiredModuleName);
94+
}
95+
};
96+
} else {
97+
rules.CallExpression = (node) => {
98+
if (isRequireCall(node)) {
99+
var requiredModuleName = getRequiredModuleNameFromCall(node);
100+
101+
if (requiredModuleName) {
102+
foundModules.push(requiredModuleName);
103+
}
104+
}
105+
};
106+
}
107+
108+
return rules;
91109
};
92110

93111
module.exports.schema = {

0 commit comments

Comments
 (0)