tools: allow RegExp in required-modules eslint rule
PR-URL: https://github.com/nodejs/node/pull/27647 Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
parent
ef51cc8ac9
commit
1df3080af3
@ -21,7 +21,9 @@ rules:
|
|||||||
node-core/inspector-check: error
|
node-core/inspector-check: error
|
||||||
node-core/number-isnan: error
|
node-core/number-isnan: error
|
||||||
## common module is mandatory in tests
|
## common module is mandatory in tests
|
||||||
node-core/required-modules: [error, common]
|
node-core/required-modules:
|
||||||
|
- error
|
||||||
|
- common: 'common(/index\.(m)?js)?$'
|
||||||
node-core/require-common-first: error
|
node-core/require-common-first: error
|
||||||
node-core/no-duplicate-requires: off
|
node-core/no-duplicate-requires: off
|
||||||
|
|
||||||
|
@ -13,22 +13,38 @@ new RuleTester().run('required-modules', rule, {
|
|||||||
valid: [
|
valid: [
|
||||||
{
|
{
|
||||||
code: 'require("common")',
|
code: 'require("common")',
|
||||||
options: ['common']
|
options: [{ common: 'common' }]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
code: 'foo',
|
code: 'foo',
|
||||||
options: []
|
options: []
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
code: 'require("common")',
|
||||||
|
options: [{ common: 'common(/index\\.(m)?js)?$' }]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
code: 'require("common/index.js")',
|
||||||
|
options: [{ common: 'common(/index\\.(m)?js)?$' }]
|
||||||
|
},
|
||||||
],
|
],
|
||||||
invalid: [
|
invalid: [
|
||||||
{
|
{
|
||||||
code: 'foo',
|
code: 'foo',
|
||||||
options: ['common'],
|
options: [{ common: 'common' }],
|
||||||
errors: [{ message: 'Mandatory module "common" must be loaded.' }]
|
errors: [{ message: 'Mandatory module "common" must be loaded.' }]
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
code: 'require("common/fixtures.js")',
|
||||||
|
options: [{ common: 'common(/index\\.(m)?js)?$' }],
|
||||||
|
errors: [{
|
||||||
|
message:
|
||||||
|
'Mandatory module "common" must be loaded.'
|
||||||
|
}]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
code: 'require("somethingElse")',
|
code: 'require("somethingElse")',
|
||||||
options: ['common'],
|
options: [{ common: 'common' }],
|
||||||
errors: [{ message: 'Mandatory module "common" must be loaded.' }]
|
errors: [{ message: 'Mandatory module "common" must be loaded.' }]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -4,15 +4,16 @@
|
|||||||
*/
|
*/
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
const path = require('path');
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Rule Definition
|
// Rule Definition
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
module.exports = function(context) {
|
module.exports = function(context) {
|
||||||
// Trim required module names
|
// Trim required module names
|
||||||
const requiredModules = context.options;
|
const options = context.options[0];
|
||||||
|
const requiredModules = options ? Object.keys(options).map((x) => {
|
||||||
|
return [ x, new RegExp(options[x]) ];
|
||||||
|
}) : [];
|
||||||
const isESM = context.parserOptions.sourceType === 'module';
|
const isESM = context.parserOptions.sourceType === 'module';
|
||||||
|
|
||||||
const foundModules = [];
|
const foundModules = [];
|
||||||
@ -46,14 +47,10 @@ module.exports = function(context) {
|
|||||||
* @returns {undefined|String} required module name or undefined
|
* @returns {undefined|String} required module name or undefined
|
||||||
*/
|
*/
|
||||||
function getRequiredModuleName(str) {
|
function getRequiredModuleName(str) {
|
||||||
if (str === '../common/index.mjs') {
|
const match = requiredModules.find(([, test]) => {
|
||||||
return 'common';
|
return test.test(str);
|
||||||
}
|
});
|
||||||
|
return match ? match[0] : undefined;
|
||||||
const value = path.basename(str);
|
|
||||||
|
|
||||||
// Check if value is in required modules array
|
|
||||||
return requiredModules.indexOf(value) !== -1 ? value : undefined;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,9 +72,9 @@ module.exports = function(context) {
|
|||||||
'Program:exit'(node) {
|
'Program:exit'(node) {
|
||||||
if (foundModules.length < requiredModules.length) {
|
if (foundModules.length < requiredModules.length) {
|
||||||
const missingModules = requiredModules.filter(
|
const missingModules = requiredModules.filter(
|
||||||
(module) => foundModules.indexOf(module) === -1
|
([module]) => foundModules.indexOf(module) === -1
|
||||||
);
|
);
|
||||||
missingModules.forEach((moduleName) => {
|
missingModules.forEach(([moduleName]) => {
|
||||||
context.report(
|
context.report(
|
||||||
node,
|
node,
|
||||||
'Mandatory module "{{moduleName}}" must be loaded.',
|
'Mandatory module "{{moduleName}}" must be loaded.',
|
||||||
@ -110,10 +107,11 @@ module.exports = function(context) {
|
|||||||
return rules;
|
return rules;
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports.schema = {
|
module.exports.meta = {
|
||||||
'type': 'array',
|
schema: [{
|
||||||
'additionalItems': {
|
'type': 'object',
|
||||||
'type': 'string'
|
'additionalProperties': {
|
||||||
},
|
'type': 'string'
|
||||||
'uniqueItems': true
|
},
|
||||||
|
}],
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user