@qiwi/toposort
Fork of toposort with updated dependencies and some new features
Why?
Toposort is wonderful, but we also need to know which parts of graph can be handled in parallel mode.
You can simultaneously handle unconnected parts (components in graph theory) of a graph.
Also, you can analyze dependencies and dependants of graph nodes to find independent nodes to parallelize their processing.
So, toposortExtra returns maps of dependencies and dependants and a list of graph components.
Installation
yarn add @qiwi/toposort
npm i @qiwi/toposort
Usage
Returns an array of the graph components

The graph above is used in the code below.
import { toposortExtra } from '@qiwi/toposort'
const res = toposortExtra({ edges: [[1, 3], [1, 2], [2, 4], [2, 5], [6, 7], [6, 8], [9, 8]] })
console.log(res)
The same result, but also checks edge nodes to be in the nodes list
const res = toposortExtra({
nodes: [1, 2, 3, 4, 5, 6, 7, 8, 9],
edges: [[1, 3], [1, 2], [2, 4], [2, 5], [6, 7], [6, 8], [9, 8]]
})
console.log(res)
const res = toposortExtra({
nodes: [1, 2, 3, 4, 6, 7, 8, 9],
edges: [[1, 3], [1, 2], [2, 4], [2, 5], [6, 7], [6, 8], [9, 8]]
})
You can also check the graph to be acyclic
toposortExtra({
edges: [[1, 2], [2, 3], [3, 1]],
throwOnCycle: true
})
toposort(edges)
Marcelklehr's original toposort
import toposort from '@qiwi/toposort'
console.log(toposort([
[ '3', '2' ],
[ '2', '1' ],
[ '6', '5' ],
[ '5', '2' ],
[ '5', '4' ]
]
))
array(nodes, edges)
Marcelklehr's original toposort.array.
Checks edge nodes for presence in the nodes array
import { array } from '@qiwi/toposort'
console.log(array(
['1', '2', '3', '4', '5', '6'],
[
[ '3', '2' ],
[ '2', '1' ],
[ '6', '5' ],
[ '5', '2' ],
[ '5', '4' ]
]
))