Skip to content
This repository has been archived by the owner on Oct 19, 2023. It is now read-only.

Auto-require and register partials (+tests) #47

Merged
merged 3 commits into from
Sep 9, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
language: node_js
node_js:
- "0.10"
- "node"
49 changes: 48 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,36 @@ var xtend = require("xtend");

var defaultPrecompiler = require("handlebars");
var defaultCompiler = "require('hbsfy/runtime')";
var defaultTraverse = false;
var defaultExtensions = {
hbs: true,
handlebar: true,
handlebars: true
};

function findPartials(tree) {
var partials = [];
hbTraverse(tree, function(node) {
if (node.type === 'partial') {
partials.push(node.partialName);
}
});
return partials;
}

function hbTraverse(node, action) {
if (Array.isArray(node)) {
return node.forEach(function(v) {
hbTraverse(v, action);
});
}
if (typeof node === 'object') {
action(node);
return Object.keys(node).forEach(function(k) {
hbTraverse(node[k], action);
})
}
}

// Convert string or array of extensions to an object
function toExtensionsOb(arr) {
Expand All @@ -36,6 +60,7 @@ function hbsfy(file, opts) {
var extensions = defaultExtensions;
var compiler = defaultCompiler;
var precompiler = defaultPrecompiler;
var traverse = defaultTraverse;

if (opts) {
if (opts.e || opts.extensions) {
Expand All @@ -49,6 +74,10 @@ function hbsfy(file, opts) {
if (opts.c || opts.compiler) {
compiler = opts.c || opts.compiler;
}

if (opts.t || opts.traverse) {
traverse = opts.t || opts.traverse;
}
}

if (!extensions[file.split(".").pop()]) return through();
Expand All @@ -60,15 +89,33 @@ function hbsfy(file, opts) {
},
function() {
var js;
var compiled = "// hbsfy compiled Handlebars template\n";
var parsed = null;
var partials = null;

try {
if (traverse) {
parsed = precompiler.parse(buffer);
partials = findPartials(parsed);
}

js = precompiler.precompile(buffer, opts && opts.precompilerOptions);
} catch (e) {
this.emit('error', e);
return this.queue(null);
}

// Compile only with the runtime dependency.
var compiled = "// hbsfy compiled Handlebars template\n";
compiled += "var HandlebarsCompiler = " + compiler + ";\n";

if (partials && partials.length) {
partials.forEach(function(p, i) {
var ident = "partial$" + i;
compiled += "var " + ident + " = require('" + p.name + "');\n";
compiled += "HandlebarsCompiler.registerPartial('" + p.name + "', " + ident + ");\n";
});
}

compiled += "module.exports = HandlebarsCompiler.template(" + js.toString() + ");\n";
this.queue(compiled);
this.queue(null);
Expand Down
1 change: 1 addition & 0 deletions test/partial_require.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<p>{{> ./partial_required.hbs}}</p>
16 changes: 16 additions & 0 deletions test/partial_require_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@

var concat = require("concat-stream");
var browserify = require("browserify");
var assert = require("assert");
var vm = require("vm");

var b = browserify(__dirname + "/partial_require.hbs");
b.transform(require("hbsfy"), { traverse: true });

b.bundle().pipe(concat(function(data) {
var bundle = data.toString();
assert(/require\('.\/partial_required\.hbs'\)/.test(bundle), 'looking for require');
assert(/partial_required.hbs['"]\:/.test(bundle), 'looking for included partial');
assert(/var partial\$0/.test(bundle), 'looking for partial temp var');
assert(/, partial\$0/.test(bundle), 'looking for partial registration');
}));
1 change: 1 addition & 0 deletions test/partial_required.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Required