dependency
Version:
Resolve and List node module dependencies for given files.
222 lines (205 loc) • 6.66 kB
JavaScript
// Generated by CoffeeScript 1.3.3
(function() {
var Dependency, async, coffee, fs, js2coffee, path, util, v, _, _ref;
_ref = (function() {
var _i, _len, _ref, _results;
_ref = ['fs', 'path', 'coffee-script', 'js2coffee', 'util', 'async', 'underscore'];
_results = [];
for (_i = 0, _len = _ref.length; _i < _len; _i++) {
v = _ref[_i];
_results.push(require(v));
}
return _results;
})(), fs = _ref[0], path = _ref[1], coffee = _ref[2], js2coffee = _ref[3], util = _ref[4], async = _ref[5], _ = _ref[6];
module.exports = Dependency = (function() {
function Dependency(localOnly) {
this.localOnly = localOnly != null ? localOnly : false;
this.dependencies = {};
}
Dependency.prototype.read = function(file, cb) {
var files, _i, _len,
_this = this;
files = [];
if (!util.isArray(file)) {
file = [file];
}
for (_i = 0, _len = file.length; _i < _len; _i++) {
v = file[_i];
files.push(path.resolve(v));
}
return this.asyncRead(files, function() {
return cb(_this.dependencies);
});
};
Dependency.prototype.readFile = function(file, cb) {
var extname, rfile,
_this = this;
extname = path.extname(file);
rfile = file;
if (extname === '') {
rfile = file + '.coffee';
}
return fs.readFile(rfile, 'utf8', function(err, body) {
if (!err) {
return cb(err, '.coffee', body);
} else {
rfile = file + '.js';
return fs.readFile(rfile, 'utf8', function(err, body) {
return cb(err, '.js', body);
});
}
});
};
Dependency.prototype._read = function(file, cb) {
var _this = this;
return this.readFile(file, function(err, extname, body) {
var files, jserror, nodes;
if (err) {
console.log(err);
return cb();
} else {
_this.dependencies[file] = {
children: [],
extname: extname
};
jserror = false;
files = [];
if (extname === '.js') {
try {
body = js2coffee.build(body);
} catch (e) {
jserror = true;
console.log(e);
}
}
if (jserror) {
return cb();
} else {
nodes = coffee.nodes(body);
_this._parseNode(nodes, file, false, false, files);
files = _(files).uniq();
if (files.length !== 0) {
return _this.asyncRead(files, cb);
} else {
return cb();
}
}
}
});
};
Dependency.prototype.asyncRead = function(files, cb) {
var _this = this;
return async.forEach(files, function(v, callback) {
return _this._read(v, function() {
return callback();
});
}, function() {
return cb();
});
};
Dependency.prototype.trim = function(str) {
return str.replace(/^\'/, '').replace(/\'$/, '').replace(/^\"/, '').replace(/\"$/, '');
};
Dependency.prototype.isRequire = function(node, file, parent, gparent, files) {
var fname, moduleName, _i, _len, _ref1, _ref2, _results;
if (node.value === 'require') {
_ref1 = gparent.args;
_results = [];
for (_i = 0, _len = _ref1.length; _i < _len; _i++) {
v = _ref1[_i];
if ((((_ref2 = v.base) != null ? _ref2.value : void 0) != null) && (v.base.value.match(/^'.*'$/) !== null || v.base.value.match(/^'.*'$/) !== null)) {
moduleName = this.trim(v.base.value);
if (moduleName.match(/\.{1,2}/) !== null) {
fname = path.join(path.dirname(file), moduleName);
if (!(this.dependencies[fname] != null)) {
files.push(fname);
}
} else if (!this.localOnly) {
fname = moduleName;
} else {
fname = false;
}
if (fname !== false) {
this.dependencies[file].children.push(fname);
_results.push(this.dependencies[file].children = _(this.dependencies[file].children).uniq());
} else {
_results.push(void 0);
}
} else {
_results.push(void 0);
}
}
return _results;
}
};
Dependency.prototype._parseNode = function(node, file, parent, gparent, files) {
var i, k, _i, _len, _results, _results1;
this.isRequire(node, file, parent, gparent, files);
if (util.isArray(node)) {
_results = [];
for (i = _i = 0, _len = node.length; _i < _len; i = ++_i) {
v = node[i];
_results.push(this._parseNode(v, file, node, parent, files));
}
return _results;
} else if (typeof node === 'object') {
_results1 = [];
for (k in node) {
v = node[k];
if (v != null) {
_results1.push(this._parseNode(v, file, node, parent, files));
} else {
_results1.push(void 0);
}
}
return _results1;
}
};
Dependency.prototype.addExtname = function(file, extname) {
if (path.extname(file) === '') {
return file + extname;
} else {
return file;
}
};
Dependency.prototype.listLocalFiles = function() {
var k, locals, v2, _i, _len, _ref1, _ref2;
locals = [];
_ref1 = this.dependencies;
for (k in _ref1) {
v = _ref1[k];
if (k.match(/^\//) !== null) {
locals.push(this.addExtname(k, v.extname));
}
_ref2 = v.children;
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
v2 = _ref2[_i];
if (v2.match(/^\//) !== null && (this.dependencies[v2] != null)) {
locals.push(this.addExtname(v2, this.dependencies[v2].extname));
}
}
}
return _(locals).uniq();
};
Dependency.prototype.listNodeModules = function() {
var k, modules, v2, _i, _len, _ref1, _ref2;
modules = [];
_ref1 = this.dependencies;
for (k in _ref1) {
v = _ref1[k];
if (k.match(/^\//) === null) {
modules.push(k);
}
_ref2 = v.children;
for (_i = 0, _len = _ref2.length; _i < _len; _i++) {
v2 = _ref2[_i];
if (v2.match(/^\//) === null) {
modules.push(v2);
}
}
}
return _(modules).uniq();
};
return Dependency;
})();
}).call(this);