Skip to content

Commit

Permalink
Merge pull request #189 from grupopikul/master
Browse files Browse the repository at this point in the history
Update to support ESM
  • Loading branch information
rustedgrail authored Mar 12, 2024
2 parents 2a68d35 + acfc6ce commit ddf797f
Show file tree
Hide file tree
Showing 62 changed files with 9,536 additions and 3,774 deletions.
3 changes: 3 additions & 0 deletions .babelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"plugins": ["@babel/plugin-transform-export-namespace-from", "@babel/plugin-transform-modules-commonjs", "add-module-exports"]
}
4 changes: 3 additions & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,9 @@
"mocha": true
},
"parserOptions": {
"ecmaVersion": "latest"
"ecmaVersion": "latest",
"sourceType": "module",
"allowImportExportEverywhere": true
},
"env": {
"es6": true,
Expand Down
37 changes: 25 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,50 +16,55 @@ BUILD_DIR = build
COVERAGE_DIR = ./.nyc_output
DIST_DIR = dist

SRC_FILES = index.js lib/version.js $(shell find lib -type f -name '*.js')

MJS_FILES = $(shell find mjs-lib -type f -name '*.js')
# CJS_FILES are based off mjs files.
CJS_FILES = $(shell find mjs-lib -type f -name '*.js' -printf lib/%P\\n)
TEST_FILES = $(shell find test -type f -name '*.js' | grep -v 'bundle-test.js' | grep -v 'test-main.js')
BUILD_FILES = $(addprefix $(BUILD_DIR)/, \
$(MOD).js $(MOD).min.js \
$(MOD).core.js $(MOD).core.min.js)

DIRS = $(BUILD_DIR)

.PHONY: all bench clean browser-test unit-test test dist
.PHONY: all bench clean convert-clean browser-test unit-test test dist

all: unit-test lint

bench: unit-test lint
@src/bench.js

lib/version.js: package.json
mjs-lib/version.js: package.json
@src/release/make-version.js > $@

$(DIRS):
@mkdir -p $@

test: unit-test browser-test

unit-test: $(SRC_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR)
$(NYC) $(MOCHA) --dir $(COVERAGE_DIR) -- $(MOCHA_OPTS) $(TEST_FILES) || $(MOCHA) $(MOCHA_OPTS) $(TEST_FILES)
unit-test: convert index.js $(CJS_FILES) $(TEST_FILES) node_modules | $(BUILD_DIR)
-$(NYC) $(MOCHA) --dir $(COVERAGE_DIR) -- $(MOCHA_OPTS) $(TEST_FILES) || $(MOCHA) $(MOCHA_OPTS) $(TEST_FILES)

browser-test: $(BUILD_DIR)/$(MOD).js $(BUILD_DIR)/$(MOD).core.js
$(KARMA) start --single-run $(KARMA_OPTS)
$(KARMA) start karma.core.conf.js --single-run $(KARMA_OPTS)
-$(KARMA) start --single-run $(KARMA_OPTS)
-$(KARMA) start karma.core.conf.js --single-run $(KARMA_OPTS)

bower.json: package.json src/release/make-bower.json.js
@src/release/make-bower.json.js > $@

# index.js still uses require!
index.js: convert

lint:
@$(JSHINT) $(JSHINT_OPTS) $(filter-out node_modules, $?)
@$(ESLINT) $(SRC_FILES) $(TEST_FILES)
@$(ESLINT) $(MJS_FILES) $(TEST_FILES)

$(BUILD_DIR)/$(MOD).js: index.js $(SRC_FILES) | unit-test
$(BUILD_DIR)/$(MOD).js: index.js $(CJS_FILES) | unit-test
@$(BROWSERIFY) $< > $@ -s graphlib

$(BUILD_DIR)/$(MOD).min.js: $(BUILD_DIR)/$(MOD).js
@$(UGLIFY) $< --comments '@license' > $@

$(BUILD_DIR)/$(MOD).core.js: index.js $(SRC_FILES) | unit-test
$(BUILD_DIR)/$(MOD).core.js: index.js $(CJS_FILES) | unit-test
@$(BROWSERIFY) $< > $@ --no-bundle-external -s graphlib

$(BUILD_DIR)/$(MOD).core.min.js: $(BUILD_DIR)/$(MOD).core.js
Expand All @@ -74,11 +79,19 @@ release: dist
@echo
@echo Starting release...
@echo
@src/release/release.sh $(MOD) dist
@src/release/release.sh $(MOD) dist # TODO LOOK

clean:
rm -rf $(BUILD_DIR)

node_modules: package.json
@$(NPM) install
@touch $@

lib/%.js: mjs-lib/%.js
npx babel "$<" -o "$@"

convert-clean:
rsync --existing --ignore-existing --delete -r mjs-lib/ lib/

convert: convert-clean $(CJS_FILES)
12 changes: 7 additions & 5 deletions lib/alg/components.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,27 @@
module.exports = components;
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = components;
function components(g) {
var visited = {};
var cmpts = [];
var cmpt;

function dfs(v) {
if (visited.hasOwnProperty(v)) return;
visited[v] = true;
cmpt.push(v);
g.successors(v).forEach(dfs);
g.predecessors(v).forEach(dfs);
}

g.nodes().forEach(function(v) {
g.nodes().forEach(function (v) {
cmpt = [];
dfs(v);
if (cmpt.length) {
cmpts.push(cmpt);
}
});

return cmpts;
}
module.exports = exports.default;
15 changes: 6 additions & 9 deletions lib/alg/dfs.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
module.exports = dfs;
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = dfs;
/*
* A helper that preforms a pre- or post-order traversal on the input graph
* and returns the nodes in the order they were visited. If the graph is
Expand All @@ -12,23 +16,18 @@ function dfs(g, vs, order) {
if (!Array.isArray(vs)) {
vs = [vs];
}

var navigation = g.isDirected() ? v => g.successors(v) : v => g.neighbors(v);
var orderFunc = order === "post" ? postOrderDfs : preOrderDfs;

var acc = [];
var visited = {};
vs.forEach(v => {
if (!g.hasNode(v)) {
throw new Error("Graph does not have node: " + v);
}

orderFunc(v, navigation, visited, acc);
});

return acc;
}

function postOrderDfs(v, navigation, visited, acc) {
var stack = [[v, false]];
while (stack.length > 0) {
Expand All @@ -44,7 +43,6 @@ function postOrderDfs(v, navigation, visited, acc) {
}
}
}

function preOrderDfs(v, navigation, visited, acc) {
var stack = [v];
while (stack.length > 0) {
Expand All @@ -56,12 +54,11 @@ function preOrderDfs(v, navigation, visited, acc) {
}
}
}

function forEachRight(array, iteratee) {
var length = array.length;
while (length--) {
iteratee(array[length], length, array);
}

return array;
}
module.exports = exports.default;
15 changes: 10 additions & 5 deletions lib/alg/dijkstra-all.js
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
var dijkstra = require("./dijkstra");

module.exports = dijkstraAll;
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = dijkstraAll;
var _dijkstra = _interopRequireDefault(require("./dijkstra.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function dijkstraAll(g, weightFunc, edgeFunc) {
return g.nodes().reduce(function(acc, v) {
acc[v] = dijkstra(g, v, weightFunc, edgeFunc);
return g.nodes().reduce(function (acc, v) {
acc[v] = (0, _dijkstra.default)(g, v, weightFunc, edgeFunc);
return acc;
}, {});
}
module.exports = exports.default;
41 changes: 19 additions & 22 deletions lib/alg/dijkstra.js
Original file line number Diff line number Diff line change
@@ -1,53 +1,50 @@
var PriorityQueue = require("../data/priority-queue");

module.exports = dijkstra;

"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = dijkstra;
var _priorityQueue = _interopRequireDefault(require("../data/priority-queue.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var DEFAULT_WEIGHT_FUNC = () => 1;

function dijkstra(g, source, weightFn, edgeFn) {
return runDijkstra(g, String(source),
weightFn || DEFAULT_WEIGHT_FUNC,
edgeFn || function(v) { return g.outEdges(v); });
return runDijkstra(g, String(source), weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) {
return g.outEdges(v);
});
}

function runDijkstra(g, source, weightFn, edgeFn) {
var results = {};
var pq = new PriorityQueue();
var pq = new _priorityQueue.default();
var v, vEntry;

var updateNeighbors = function(edge) {
var updateNeighbors = function (edge) {
var w = edge.v !== v ? edge.v : edge.w;
var wEntry = results[w];
var weight = weightFn(edge);
var distance = vEntry.distance + weight;

if (weight < 0) {
throw new Error("dijkstra does not allow negative edge weights. " +
"Bad edge: " + edge + " Weight: " + weight);
throw new Error("dijkstra does not allow negative edge weights. " + "Bad edge: " + edge + " Weight: " + weight);
}

if (distance < wEntry.distance) {
wEntry.distance = distance;
wEntry.predecessor = v;
pq.decrease(w, distance);
}
};

g.nodes().forEach(function(v) {
g.nodes().forEach(function (v) {
var distance = v === source ? 0 : Number.POSITIVE_INFINITY;
results[v] = { distance: distance };
results[v] = {
distance: distance
};
pq.add(v, distance);
});

while (pq.size() > 0) {
v = pq.removeMin();
vEntry = results[v];
if (vEntry.distance === Number.POSITIVE_INFINITY) {
break;
}

edgeFn(v).forEach(updateNeighbors);
}

return results;
}
module.exports = exports.default;
15 changes: 10 additions & 5 deletions lib/alg/find-cycles.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
var tarjan = require("./tarjan");

module.exports = findCycles;
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = findCycles;
var _tarjan = _interopRequireDefault(require("./tarjan.js"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function findCycles(g) {
return tarjan(g).filter(function(cmpt) {
return cmpt.length > 1 || (cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]));
return (0, _tarjan.default)(g).filter(function (cmpt) {
return cmpt.length > 1 || cmpt.length === 1 && g.hasEdge(cmpt[0], cmpt[0]);
});
}
module.exports = exports.default;
43 changes: 25 additions & 18 deletions lib/alg/floyd-warshall.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,44 @@
module.exports = floydWarshall;
"use strict";

Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = floydWarshall;
var DEFAULT_WEIGHT_FUNC = () => 1;

function floydWarshall(g, weightFn, edgeFn) {
return runFloydWarshall(g,
weightFn || DEFAULT_WEIGHT_FUNC,
edgeFn || function(v) { return g.outEdges(v); });
return runFloydWarshall(g, weightFn || DEFAULT_WEIGHT_FUNC, edgeFn || function (v) {
return g.outEdges(v);
});
}

function runFloydWarshall(g, weightFn, edgeFn) {
var results = {};
var nodes = g.nodes();

nodes.forEach(function(v) {
nodes.forEach(function (v) {
results[v] = {};
results[v][v] = { distance: 0 };
nodes.forEach(function(w) {
results[v][v] = {
distance: 0
};
nodes.forEach(function (w) {
if (v !== w) {
results[v][w] = { distance: Number.POSITIVE_INFINITY };
results[v][w] = {
distance: Number.POSITIVE_INFINITY
};
}
});
edgeFn(v).forEach(function(edge) {
edgeFn(v).forEach(function (edge) {
var w = edge.v === v ? edge.w : edge.v;
var d = weightFn(edge);
results[v][w] = { distance: d, predecessor: v };
results[v][w] = {
distance: d,
predecessor: v
};
});
});

nodes.forEach(function(k) {
nodes.forEach(function (k) {
var rowK = results[k];
nodes.forEach(function(i) {
nodes.forEach(function (i) {
var rowI = results[i];
nodes.forEach(function(j) {
nodes.forEach(function (j) {
var ik = rowI[k];
var kj = rowK[j];
var ij = rowI[j];
Expand All @@ -43,6 +50,6 @@ function runFloydWarshall(g, weightFn, edgeFn) {
});
});
});

return results;
}
module.exports = exports.default;
Loading

0 comments on commit ddf797f

Please sign in to comment.