11/**
22 * @fileoverview Ensure modules are not required twice at top level of a module
33 * @author devsnek
4+ * @author RedYetiDev
45 */
56'use strict' ;
67
@@ -10,58 +11,44 @@ const { isRequireCall, isString } = require('./rules-utils.js');
1011// Rule Definition
1112//------------------------------------------------------------------------------
1213
13- const secondLevelTypes = [
14+ const topLevelTypes = new Set ( [
1415 'FunctionDeclaration' , 'FunctionExpression' , 'ArrowFunctionExpression' ,
1516 'ClassBody' , 'MethodDefinition' ,
16- ] ;
17+ ] ) ;
1718
18- function isTopLevel ( node ) {
19- while ( ! secondLevelTypes . includes ( node . type ) ) {
19+ const isTopLevel = ( node ) => {
20+ while ( node ) {
21+ if ( topLevelTypes . has ( node . type ) ) return false ;
2022 node = node . parent ;
21- if ( ! node ) {
22- return true ;
23- }
2423 }
25- return false ;
26- }
24+ return true ;
25+ } ;
2726
2827module . exports = {
2928 create ( context ) {
3029 if ( context . parserOptions . sourceType === 'module' ) {
3130 return { } ;
3231 }
3332
34- function getRequiredModuleNameFromCall ( node ) {
35- // Node has arguments and first argument is string
36- if ( node . arguments . length && isString ( node . arguments [ 0 ] ) ) {
37- return node . arguments [ 0 ] . value . trim ( ) ;
38- }
39-
40- return undefined ;
41- }
33+ const requiredModules = new Set ( ) ;
4234
43- const required = new Set ( ) ;
44-
45- const rules = {
46- CallExpression : ( node ) => {
35+ return {
36+ CallExpression ( node ) {
4737 if ( isRequireCall ( node ) && isTopLevel ( node ) ) {
48- const moduleName = getRequiredModuleNameFromCall ( node ) ;
49- if ( moduleName === undefined ) {
50- return ;
51- }
52- if ( required . has ( moduleName ) ) {
53- context . report (
54- node ,
55- '\'{{moduleName}}\' require is duplicated.' ,
56- { moduleName } ,
57- ) ;
58- } else {
59- required . add ( moduleName ) ;
38+ const [ firstArg ] = node . arguments ;
39+ if ( isString ( firstArg ) ) {
40+ const moduleName = firstArg . value . trim ( ) ;
41+ if ( requiredModules . has ( moduleName ) ) {
42+ context . report ( {
43+ node,
44+ message : `'${ moduleName } ' require is duplicated.` ,
45+ } ) ;
46+ } else {
47+ requiredModules . add ( moduleName ) ;
48+ }
6049 }
6150 }
6251 } ,
6352 } ;
64-
65- return rules ;
6653 } ,
6754} ;
0 commit comments