eslint-plugin-perfectionist
Version:
ESLint plugin for sorting various data such as objects, imports, types, enums, JSX props, etc.
43 lines (42 loc) • 1.37 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
let computeNodesInCircularDependencies = elements => {
let elementsInCycles = /* @__PURE__ */ new Set()
let visitingElements = /* @__PURE__ */ new Set()
let visitedElements = /* @__PURE__ */ new Set()
let depthFirstSearch = (element, path) => {
if (visitedElements.has(element)) {
return
}
if (visitingElements.has(element)) {
let cycleStartIndex = path.indexOf(element)
if (cycleStartIndex !== -1) {
for (let cycleElements of path.slice(cycleStartIndex)) {
elementsInCycles.add(cycleElements)
}
}
return
}
visitingElements.add(element)
path.push(element)
for (let dependency of element.dependencies) {
let dependencyElement = elements.find(
currentElement =>
currentElement.dependencyName === dependency ||
currentElement.name === dependency,
)
if (dependencyElement) {
depthFirstSearch(dependencyElement, [...path])
}
}
visitingElements.delete(element)
visitedElements.add(element)
}
for (let element of elements) {
if (!visitedElements.has(element)) {
depthFirstSearch(element, [])
}
}
return elementsInCycles
}
exports.computeNodesInCircularDependencies = computeNodesInCircularDependencies