Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/gustavohenke/toposort
Topologically sort directed acyclic graphs (such as dependency lists) in node.js
https://github.com/gustavohenke/toposort
javascript toposort
Last synced: 5 days ago
JSON representation
Topologically sort directed acyclic graphs (such as dependency lists) in node.js
- Host: GitHub
- URL: https://github.com/gustavohenke/toposort
- Owner: gustavohenke
- License: mit
- Created: 2013-01-03T00:03:25.000Z (almost 12 years ago)
- Default Branch: master
- Last Pushed: 2024-06-16T22:17:34.000Z (6 months ago)
- Last Synced: 2024-12-11T12:08:33.759Z (12 days ago)
- Topics: javascript, toposort
- Language: JavaScript
- Homepage: https://npmjs.org/package/toposort-class
- Size: 353 KB
- Stars: 23
- Watchers: 3
- Forks: 5
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Toposort
[![CI](https://github.com/gustavohenke/toposort/actions/workflows/ci.yml/badge.svg)](https://github.com/gustavohenke/toposort/actions/workflows/ci.yml)__Sorting directed acyclic graphs, for Node.js, io.js and the browser__
_This was originally done by Marcel Klehr. [Why not checkout his original repo?](https://github.com/marcelklehr/toposort)_## Installation
There are a few ways for installing Toposort. Here are them:* Via NPM: `npm install toposort-class`
* Via Bower: `bower install toposort`
* Via Git: `git clone git://github.com/gustavohenke/toposort.git`
* [Direct download](https://raw.githubusercontent.com/gustavohenke/toposort/master/build/toposort.js) ([Minified](https://raw.githubusercontent.com/gustavohenke/toposort/master/build/toposort.min.js)) for use in the browser## Example
Let's say you have the following dependency graph:* Plugin depends on Backbone and jQuery UI Button;
* Backbone depends on jQuery and Underscore;
* jQuery UI Button depends on jQuery UI Core and jQuery UI Widget;
* jQuery UI Widget and jQuery UI Core depend on jQuery;
* jQuery and Underscore don't depend on anyone.Now, how would you sort this in a way that each asset will be correctly placed? You'll probably need the following sorting:
* `jQuery`, `jQuery UI Core`, `jQuery UI Widget`, `jQuery UI Button`, `Underscore`, `Backbone`, `Plugin`
You can achieve it with the following code, using `toposort-class`:
```javascript
var Toposort = require('toposort-class'),
t = new Toposort();t.add("jquery-ui-core", "jquery")
.add("jquery-ui-widget", "jquery")
.add("jquery-ui-button", ["jquery-ui-core", "jquery-ui-widget"])
.add("plugin", ["backbone", "jquery-ui-button"])
.add("backbone", ["underscore", "jquery"]);console.log(t.sort().reverse());
/* Will output:
* ['jquery', 'jquery-ui-core', 'jquery-ui-widget', 'jquery-ui-button', 'underscore', 'backbone', 'plugin']
*
* And you're done.
*/
```## Usage
CommonJS (Node.js and io.js):
```javascript
var Toposort = require('toposort-class'),
t = new Toposort();
```Browser with AMD:
```javascript
define("myModule", ["Toposort"], function(Toposort) {
var t = new Toposort();
});
```Browser without AMD:
```javascript
var t = new window.Toposort();
```or whatever global object there is instead of `window`.
## API
#### `.add(item, deps)`
* _{String}_ `item` - The name of the dependent item that is being added
* _{Array|String}_ `deps` - A dependency or list of dependencies of `item`__Returns:__ _{Toposort}_ The Toposort instance, for chaining.
#### `.sort()`
__Returns:__ _{Array}_ The list of dependencies topologically sorted.This method will check for cyclic dependencies, like "A is dependent of A".
#### `.clear()`
__Returns:__ _{Toposort}_ The Toposort instance, for chaining.Clears all edges, effectively resetting the instance.
#### `.Toposort`
Reference to the Toposort constructor.
## Legal
MIT License