hem
Version:
stitches CommonJS, and ties up other lose ends of web-app development.
129 lines (105 loc) • 3.23 kB
JavaScript
// Generated by CoffeeScript 1.12.7
(function() {
var Dependency, Module, compilers, detective, extname, fs, mtime, resolve,
indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
extname = require('path').extname;
fs = require('fs');
detective = require('fast-detective');
resolve = require('./resolve');
compilers = require('./compilers');
mtime = function(path) {
return fs.statSync(path).mtime.valueOf();
};
Module = (function() {
Module.walk = ['js', 'coffee'];
function Module(request, parent) {
var ref;
ref = resolve(request, parent), this.id = ref[0], this.filename = ref[1];
this.ext = extname(this.filename).slice(1);
this.mtime = mtime(this.filename);
this.paths = resolve.paths(this.filename);
}
Module.prototype.compile = function() {
if (!this._compile || this.changed()) {
this.mtime = mtime(this.filename);
this._compile = compilers[this.ext](this.filename);
}
return this._compile;
};
Module.prototype.modules = function() {
if (!this._modules || this.changed()) {
this._modules = this.resolve();
}
return this._modules;
};
Module.prototype.changed = function() {
return this.mtime !== mtime(this.filename);
};
Module.prototype.resolve = function() {
var i, len, path, ref, results;
ref = this.calls();
results = [];
for (i = 0, len = ref.length; i < len; i++) {
path = ref[i];
results.push(new this.constructor(path, this));
}
return results;
};
Module.prototype.calls = function() {
var ref;
if (ref = this.ext, indexOf.call(this.constructor.walk, ref) >= 0) {
return detective(this.compile());
} else {
return [];
}
};
return Module;
})();
Dependency = (function() {
function Dependency(paths) {
if (paths == null) {
paths = [];
}
this.paths = paths;
}
Dependency.prototype.resolve = function() {
var path;
this.modules || (this.modules = (function() {
var i, len, ref, results;
ref = this.paths;
results = [];
for (i = 0, len = ref.length; i < len; i++) {
path = ref[i];
results.push(new Module(path));
}
return results;
}).call(this));
return this.deepResolve(this.modules);
};
Dependency.prototype.deepResolve = function(modules, result, search) {
var i, len, module;
if (modules == null) {
modules = [];
}
if (result == null) {
result = [];
}
if (search == null) {
search = {};
}
for (i = 0, len = modules.length; i < len; i++) {
module = modules[i];
if (!(!search[module.filename])) {
continue;
}
search[module.filename] = true;
result.push(module);
this.deepResolve(module.modules(), result, search);
}
return result;
};
return Dependency;
})();
module.exports = Dependency;
module.exports.Module = Module;
}).call(this);