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:
Richard Lau 2019-05-10 21:47:01 -04:00
parent ef51cc8ac9
commit 1df3080af3
3 changed files with 39 additions and 23 deletions

View File

@ -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

View File

@ -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.' }]
} }
] ]

View File

@ -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 },
}],
}; };