Skip to content

Instantly share code, notes, and snippets.

@abrkn
Created June 13, 2012 12:47
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 abrkn/2923861 to your computer and use it in GitHub Desktop.
Save abrkn/2923861 to your computer and use it in GitHub Desktop.
asset embedding for node.js
var _ = require('underscore');
var fs = require('fs');
var path = require('path');
var debug = require('debug')('asset-embed');
module.exports = function() {
var self = {
loaders: {
less: function(a, callback) {
self.loaders.plain(a, function(err, res) {
if (err) return callback(err);
var less = require('less');
var parser = new less.Parser(self.loaders.less.options);
parser.parse(res, function(err, tree) {
if (err) return callback(err);
callback(null, '<style>' + tree.toCSS(self.loaders.less.options) + '</style>');
});
});
},
css: function(a, callback) {
self.loaders.plain(a, function(err, res) {
if (err) return callback(err);
callback(null, '<style>' + res + '</style>');
});
},
js: function(a, callback) {
self.loaders.plain(a, function(err, res) {
if (err) return callback(err);
var uglify = require('uglify-js');
res = uglify.parser.parse(res);
res = uglify.uglify.ast_squeeze(res);
res = uglify.uglify.gen_code(res);
res = '<script>' + res + '</script>';
callback(null, res);
});
},
plain: function(a, callback) {
debug('loading asset file', a);
fs.readFile(a, 'utf8', callback);
}
},
assets: {},
load: function(names, callback) {
if (!_.isArray(names)) names = [names];
var left = names.length, panic = false;
_.each(names, function(names) {
var loader = path.extname(names);
if (loader) loader = loader.substr(1);
if (!loader || !_.has(self.loaders, loader)) {
loader = 'plain';
}
self.loaders[loader](names, function(err, res) {
if (panic) return;
if (err) {
panic = true;
if (_.isFunction(callback)) {
return callback(err);
}
throw err;
}
self.assets[names] = res;
if (!--left && _.isFunction(callback)) {
return callback();
}
});
});
},
embed: function(name) {
if (!_.has(self.assets, name)) {
throw new Error(name + ' not loaded');
}
return self.assets[name];
}
};
self.loaders.less.options = { compress: true };
return _.extend(self.embed, self);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment