UNPKG

dependency

Version:

Resolve and List node module dependencies for given files.

222 lines (205 loc) 6.66 kB
// 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);