UNPKG

eslint-plugin-perfectionist

Version:

ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.

78 lines (77 loc) 2.13 kB
import { AST_NODE_TYPES } from '@typescript-eslint/utils' function computeDependencies(node) { if (node.value.type !== AST_NODE_TYPES.AssignmentPattern) { return [] } let dependencies = [] traverseNode(node.value.right) return dependencies function checkNode(nodeValue) { /** * No need to check the body of functions and arrow functions. */ if ( nodeValue.type === AST_NODE_TYPES.ArrowFunctionExpression || nodeValue.type === AST_NODE_TYPES.FunctionExpression ) { return } if (nodeValue.type === AST_NODE_TYPES.Identifier) { dependencies.push(nodeValue.name) } if (nodeValue.type === AST_NODE_TYPES.Property) { traverseNode(nodeValue.key) traverseNode(nodeValue.value) } if (nodeValue.type === AST_NODE_TYPES.ConditionalExpression) { traverseNode(nodeValue.test) traverseNode(nodeValue.consequent) traverseNode(nodeValue.alternate) } if ( 'expression' in nodeValue && typeof nodeValue.expression !== 'boolean' ) { traverseNode(nodeValue.expression) } if ('object' in nodeValue) { traverseNode(nodeValue.object) } if ('callee' in nodeValue) { traverseNode(nodeValue.callee) } if ('left' in nodeValue) { traverseNode(nodeValue.left) } if ('right' in nodeValue) { traverseNode(nodeValue.right) } if ('elements' in nodeValue) { traverseNode( nodeValue.elements.filter(currentNode => currentNode !== null), ) } if ('argument' in nodeValue && nodeValue.argument) { traverseNode(nodeValue.argument) } if ('arguments' in nodeValue) { traverseNode(nodeValue.arguments) } if ('properties' in nodeValue) { traverseNode(nodeValue.properties) } if ('expressions' in nodeValue) { traverseNode(nodeValue.expressions) } } function traverseNode(nodeValue) { if (Array.isArray(nodeValue)) { for (let nodeItem of nodeValue) { traverseNode(nodeItem) } } else { checkNode(nodeValue) } } } export { computeDependencies }