Skip to content

Commit 1365683

Browse files
richardlautargos
authored andcommitted
tools: allow RegExp in required-modules eslint rule
PR-URL: #27647 Reviewed-By: Rich Trott <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Ruben Bridgewater <[email protected]>
1 parent 140b44f commit 1365683

File tree

3 files changed

+39
-23
lines changed

3 files changed

+39
-23
lines changed

test/.eslintrc.yaml

+3-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ rules:
2121
node-core/inspector-check: error
2222
node-core/number-isnan: error
2323
## common module is mandatory in tests
24-
node-core/required-modules: [error, common]
24+
node-core/required-modules:
25+
- error
26+
- common: 'common(/index\.(m)?js)?$'
2527
node-core/require-common-first: error
2628
node-core/no-duplicate-requires: off
2729

test/parallel/test-eslint-required-modules.js

+19-3
Original file line numberDiff line numberDiff line change
@@ -13,22 +13,38 @@ new RuleTester().run('required-modules', rule, {
1313
valid: [
1414
{
1515
code: 'require("common")',
16-
options: ['common']
16+
options: [{ common: 'common' }]
1717
},
1818
{
1919
code: 'foo',
2020
options: []
2121
},
22+
{
23+
code: 'require("common")',
24+
options: [{ common: 'common(/index\\.(m)?js)?$' }]
25+
},
26+
{
27+
code: 'require("common/index.js")',
28+
options: [{ common: 'common(/index\\.(m)?js)?$' }]
29+
},
2230
],
2331
invalid: [
2432
{
2533
code: 'foo',
26-
options: ['common'],
34+
options: [{ common: 'common' }],
2735
errors: [{ message: 'Mandatory module "common" must be loaded.' }]
2836
},
37+
{
38+
code: 'require("common/fixtures.js")',
39+
options: [{ common: 'common(/index\\.(m)?js)?$' }],
40+
errors: [{
41+
message:
42+
'Mandatory module "common" must be loaded.'
43+
}]
44+
},
2945
{
3046
code: 'require("somethingElse")',
31-
options: ['common'],
47+
options: [{ common: 'common' }],
3248
errors: [{ message: 'Mandatory module "common" must be loaded.' }]
3349
}
3450
]

tools/eslint-rules/required-modules.js

+17-19
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,16 @@
44
*/
55
'use strict';
66

7-
const path = require('path');
8-
97
//------------------------------------------------------------------------------
108
// Rule Definition
119
//------------------------------------------------------------------------------
1210

1311
module.exports = function(context) {
1412
// Trim required module names
15-
const requiredModules = context.options;
13+
const options = context.options[0];
14+
const requiredModules = options ? Object.keys(options).map((x) => {
15+
return [ x, new RegExp(options[x]) ];
16+
}) : [];
1617
const isESM = context.parserOptions.sourceType === 'module';
1718

1819
const foundModules = [];
@@ -46,14 +47,10 @@ module.exports = function(context) {
4647
* @returns {undefined|String} required module name or undefined
4748
*/
4849
function getRequiredModuleName(str) {
49-
if (str === '../common/index.mjs') {
50-
return 'common';
51-
}
52-
53-
const value = path.basename(str);
54-
55-
// Check if value is in required modules array
56-
return requiredModules.indexOf(value) !== -1 ? value : undefined;
50+
const match = requiredModules.find(([, test]) => {
51+
return test.test(str);
52+
});
53+
return match ? match[0] : undefined;
5754
}
5855

5956
/**
@@ -75,9 +72,9 @@ module.exports = function(context) {
7572
'Program:exit'(node) {
7673
if (foundModules.length < requiredModules.length) {
7774
const missingModules = requiredModules.filter(
78-
(module) => foundModules.indexOf(module) === -1
75+
([module]) => foundModules.indexOf(module) === -1
7976
);
80-
missingModules.forEach((moduleName) => {
77+
missingModules.forEach(([moduleName]) => {
8178
context.report(
8279
node,
8380
'Mandatory module "{{moduleName}}" must be loaded.',
@@ -110,10 +107,11 @@ module.exports = function(context) {
110107
return rules;
111108
};
112109

113-
module.exports.schema = {
114-
'type': 'array',
115-
'additionalItems': {
116-
'type': 'string'
117-
},
118-
'uniqueItems': true
110+
module.exports.meta = {
111+
schema: [{
112+
'type': 'object',
113+
'additionalProperties': {
114+
'type': 'string'
115+
},
116+
}],
119117
};

0 commit comments

Comments
 (0)