grunt-dust
Version:
Grunt.js plugin to compile dustjs templates.
78 lines (64 loc) • 1.71 kB
text/coffeescript
beautify = require( "js-beautify" ).js_beautify
module.exports.init = (grunt) ->
# Wraps some content into AMD
# ---
(content, deps, name, returning) ->
args = []
paths = []
parts = []
for own key, dep of deps
args.push key.replace /^\d+|[^\w]+/g, "_"
paths.push JSON.stringify dep
# disable name part if packageName is null
unless name is null
# package name
if name?.length ? 0 > 0
parts.push JSON.stringify( name )
else if typeof returning is "string"
parts.push JSON.stringify returning
# package deps
parts.push "[#{ paths.join "," }]" if paths.length
renderFunction = """
function (locals, callback) {
var rendered;
dust.render(<%= template_name %>, locals, function(err, result) {
if(typeof callback === "function") {
try {
callback(err, result);
} catch(e) {}
}
if (err) {
throw err
} else {
rendered = result;
}
});
return rendered;
}
"""
# package callback
if typeof returning is "string"
# single template
amdCallback = """
function (#{ args.join "," }) {
#{ content }
return #{ renderFunction.replace "<%= template_name %>", JSON.stringify returning }
}
"""
else
# bunch of templates
defines = for item in returning
"""
define(#{ JSON.stringify item }, function() {
return #{ renderFunction.replace "<%= template_name %>", JSON.stringify item }
});
"""
amdCallback = """
function (#{ args.join "," }) {
#{ content }
#{ defines.join "" }
return #{ JSON.stringify returning };
}
"""
parts.push amdCallback
beautify "define(#{ parts.join( "," ) });", indent_size: 2