| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,6 +1,7 @@ | |||
| 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.parserOptions.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 | }; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments