module Utils from "./utils"; import Exception from "./exception"; import { COMPILER_REVISION, REVISION_CHANGES } from "./base"; export function checkRevision(compilerInfo) { var compilerRevision = compilerInfo && compilerInfo[0] || 1, currentRevision = COMPILER_REVISION; if (compilerRevision !== currentRevision) { if (compilerRevision < currentRevision) { var runtimeVersions = REVISION_CHANGES[currentRevision], compilerVersions = REVISION_CHANGES[compilerRevision]; throw new Exception("Template was precompiled with an older version of Handlebars than the current runtime. "+ "Please update your precompiler to a newer version ("+runtimeVersions+") or downgrade your runtime to an older version ("+compilerVersions+")."); } else { // Use the embedded version info since the runtime doesn't know about this revision yet throw new Exception("Template was precompiled with a newer version of Handlebars than the current runtime. "+ "Please update your runtime to a newer version ("+compilerInfo[1]+")."); } } } // TODO: Remove this line and break up compilePartial export function template(templateSpec, env) { if (!env) { throw new Exception("No environment passed to template"); } // Note: Using env.VM references rather than local var references throughout this section to allow // for external users to override these as psuedo-supported APIs. var invokePartialWrapper = function(partial, name, context, helpers, partials, data) { var result = env.VM.invokePartial.apply(this, arguments); if (result != null) { return result; } if (env.compile) { var options = { helpers: helpers, partials: partials, data: data }; partials[name] = env.compile(partial, { data: data !== undefined }, env); return partials[name](context, options); } else { throw new Exception("The partial " + name + " could not be compiled when running in runtime-only mode"); } }; // Just add water var container = { escapeExpression: Utils.escapeExpression, invokePartial: invokePartialWrapper, programs: [], program: function(i, fn, data) { var programWrapper = this.programs[i]; if(data) { programWrapper = program(i, fn, data); } else if (!programWrapper) { programWrapper = this.programs[i] = program(i, fn); } return programWrapper; }, merge: function(param, common) { var ret = param || common; if (param && common && (param !== common)) { ret = {}; Utils.extend(ret, common); Utils.extend(ret, param); } return ret; }, programWithDepth: env.VM.programWithDepth, noop: env.VM.noop, compilerInfo: null }; return function(context, options) { options = options || {}; var namespace = options.partial ? options : env, helpers, partials; if (!options.partial) { helpers = options.helpers; partials = options.partials; } var result = templateSpec.call( container, namespace, context, helpers, partials, options.data); if (!options.partial) { env.VM.checkRevision(container.compilerInfo); } return result; }; } export function programWithDepth(i, fn, data /*, $depth */) { var args = Array.prototype.slice.call(arguments, 3); var prog = function(context, options) { options = options || {}; return fn.apply(this, [context, options.data || data].concat(args)); }; prog.program = i; prog.depth = args.length; return prog; } export function program(i, fn, data) { var prog = function(context, options) { options = options || {}; return fn(context, options.data || data); }; prog.program = i; prog.depth = 0; return prog; } export function invokePartial(partial, name, context, helpers, partials, data) { var options = { partial: true, helpers: helpers, partials: partials, data: data }; if(partial === undefined) { throw new Exception("The partial " + name + " could not be found"); } else if(partial instanceof Function) { return partial(context, options); } } export function noop() { return ""; }