mason
Version:
simple, fun, static-file builder for jade, stylus, and javascript
79 lines (65 loc) • 1.79 kB
JavaScript
var path = require('path');
var fs = require('fs');
var util = require('./lib/util');
var renderer = require('./lib/renderer');
module.exports = function createMason(options) {
return new Mason(options);
};
function Mason(options) {
this.options = (typeof options === 'object') ? options : {
file: options
};
var data = fs.readFileSync(this.options.file, 'utf-8');
this.assets = JSON.parse(data);
this.renderer = renderer(this.assets, this.options);
}
Mason.prototype.build = function() {
var self = this;
util.log('building', this.options.file);
var targets = this.options.only || Object.keys(this.assets);
return targets.forEach(function(target) {
self.buildTarget(target);
});
};
Mason.prototype.buildTarget = function(target) {
var bundle = this.bundleTarget(target);
var builder, asset = bundle.asset;
// Check requirements
if (!asset) {
return util.log('no such target:', target);
}
try {
builder = asset && require('./lib/builders/' + asset.type);
}
catch (e) {
return util.log('no builder for target type:', asset.type);
}
// Run build
return builder(bundle);
};
Mason.prototype.bundleTarget = function(target) {
return {
dir: path.dirname(this.options.file),
file: this.options.file,
asset: this.assets[target],
assets: this.assets,
target: target,
locals: this.locals()
};
};
// Writes script tags / css includes into jade files,
// pointing at build targets
Mason.prototype.render = function(asset) {
return this.renderer.render(asset);
};
// Returns a locals object to used in express
Mason.prototype.locals = function() {
var self = this;
return {
mason: function(asset) {
return self.render(asset);
}
};
};
Mason.prototype.watch = function() {
};