Skip to content

Instantly share code, notes, and snippets.

@thickey
Forked from zilkey/ember-precompile.js
Created June 25, 2012 19:55
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thickey/2990863 to your computer and use it in GitHub Desktop.
Save thickey/2990863 to your computer and use it in GitHub Desktop.
Precompile .handlebars templates with node js
var fs = require('fs');
var vm = require('vm');
var emberjs = fs.readFileSync('public/javascripts/vendor/ember-0.9.5.min.js', 'utf8');
var templatesDir = 'templates';
var destinationDir = 'public/javascripts/templates';
function compileHandlebarsTemplate(templatesDir, fileName) {
var file = templatesDir + '/' + fileName;
//dummy jQuery
var jQuery = function() { return jQuery; };
jQuery.ready = function() { return jQuery; };
jQuery.inArray = function() { return jQuery; };
jQuery.jquery = "1.7.1";
//dummy DOM element
var element = {
firstChild: function () { return element; },
innerHTML: function () { return element; }
};
var sandbox = {
// DOM
document: {
createRange: false,
createElement: function() { return element; }
},
// Console
console: console,
// jQuery
jQuery: jQuery,
$: jQuery,
// handlebars template to compile
template: fs.readFileSync(file, 'utf8'),
// compiled handlebars template
templatejs: null
};
// window
sandbox.window = sandbox;
// create a context for the vm using the sandbox data
var context = vm.createContext(sandbox);
// load Ember into the sandbox
vm.runInContext(emberjs, context, 'ember.js');
//compile the handlebars template inside the vm context
vm.runInContext('templatejs = Ember.Handlebars.precompile(template).toString();', context);
var namedTemplateJs = 'Ember.TEMPLATES["' + fileName.replace(/.handlebars/, '') + '"] = Handlebars.template(' + context.templatejs + ');';
//extract the compiled template from the vm context and save to .js file
fs.writeFileSync(file.replace(/\.handlebars$/, '.js').replace(templatesDir, destinationDir), namedTemplateJs, 'utf8');
}
console.log('Compiling .handlebars templates');
var files = fs.readdirSync(templatesDir);
var i;
for (i = 0; i < files.length; i++) {
if (/\.handlebars$/.test(files[i])) {
compileHandlebarsTemplate(templatesDir, files[i]);
process.stdout.write('.');
}
}
console.log('done');
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment