Skip to content

Instantly share code, notes, and snippets.

@Botffy
Created October 7, 2016 11:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Botffy/e88c174c5fd80bb1fc0493966b7ee795 to your computer and use it in GitHub Desktop.
Save Botffy/e88c174c5fd80bb1fc0493966b7ee795 to your computer and use it in GitHub Desktop.
var _ = require('lodash');
var through = require('through2');
var toposort = require('toposort');
var ngDeps = require('ng-dependencies');
var gutil = require('gulp-util');
var PluginError = gutil.PluginError;
module.exports = function() {
var files = {};
// module-file mapping
var modules = {};
// deps
var deps = {};
var transform = function(file, encoding, next) {
var dep
try {
dep = ngDeps(file.contents.toString());
} catch(err) {
this.emit('error', new PluginError("angular-module-sort", 'Error in parsing: "' + file.relative + '", ' + err.message));
return;
}
for(var k in dep.modules) {
modules[k] = file.relative;
}
files[file.relative] = file;
deps[file.relative] = dep.dependencies;
next();
};
var flush = function(next) {
for(var node in deps) {
var edges = deps[node];
edges = _.map(edges, function(x) { return modules[x]; });
edges = _.filter(edges, function(x) { return !!x; } );
deps[node] = edges;
}
var graph = [];
var linked = [];
for(var node in deps) {
if(!deps[node].length) continue;
linked.push(node);
for(var i=0; i<deps[node].length; ++i) {
graph.push( [ node, deps[node][i] ] );
linked.push(deps[node][i]);
}
}
var unused = _.difference(_.keys(files), linked);
var solution = _.concat(toposort(graph), unused).reverse();
for (var i=0; i<solution.length; ++i) {
this.push(files[solution[i]])
}
next();
};
return through.obj(transform, flush)
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment