1
1
/**
2
2
* @fileoverview Ensure modules are not required twice at top level of a module
3
3
* @author devsnek
4
+ * @author RedYetiDev
4
5
*/
5
6
'use strict' ;
6
7
@@ -10,58 +11,44 @@ const { isRequireCall, isString } = require('./rules-utils.js');
10
11
// Rule Definition
11
12
//------------------------------------------------------------------------------
12
13
13
- const secondLevelTypes = [
14
+ const topLevelTypes = new Set ( [
14
15
'FunctionDeclaration' , 'FunctionExpression' , 'ArrowFunctionExpression' ,
15
16
'ClassBody' , 'MethodDefinition' ,
16
- ] ;
17
+ ] ) ;
17
18
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 ;
20
22
node = node . parent ;
21
- if ( ! node ) {
22
- return true ;
23
- }
24
23
}
25
- return false ;
26
- }
24
+ return true ;
25
+ } ;
27
26
28
27
module . exports = {
29
28
create ( context ) {
30
29
if ( context . languageOptions . sourceType === 'module' ) {
31
30
return { } ;
32
31
}
33
32
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 ( ) ;
42
34
43
- const required = new Set ( ) ;
44
-
45
- const rules = {
46
- CallExpression : ( node ) => {
35
+ return {
36
+ CallExpression ( node ) {
47
37
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
+ }
60
49
}
61
50
}
62
51
} ,
63
52
} ;
64
-
65
- return rules ;
66
53
} ,
67
54
} ;
0 commit comments