You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.4 KiB
81 lines
2.4 KiB
"use strict"; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
exports.default = createTemplateBuilder; |
|
|
|
var _options = require("./options"); |
|
|
|
var _string = require("./string"); |
|
|
|
var _literal = require("./literal"); |
|
|
|
const NO_PLACEHOLDER = (0, _options.validate)({ |
|
placeholderPattern: false |
|
}); |
|
|
|
function createTemplateBuilder(formatter, defaultOpts) { |
|
const templateFnCache = new WeakMap(); |
|
const templateAstCache = new WeakMap(); |
|
const cachedOpts = defaultOpts || (0, _options.validate)(null); |
|
return Object.assign((tpl, ...args) => { |
|
if (typeof tpl === "string") { |
|
if (args.length > 1) throw new Error("Unexpected extra params."); |
|
return extendedTrace((0, _string.default)(formatter, tpl, (0, _options.merge)(cachedOpts, (0, _options.validate)(args[0])))); |
|
} else if (Array.isArray(tpl)) { |
|
let builder = templateFnCache.get(tpl); |
|
|
|
if (!builder) { |
|
builder = (0, _literal.default)(formatter, tpl, cachedOpts); |
|
templateFnCache.set(tpl, builder); |
|
} |
|
|
|
return extendedTrace(builder(args)); |
|
} else if (typeof tpl === "object" && tpl) { |
|
if (args.length > 0) throw new Error("Unexpected extra params."); |
|
return createTemplateBuilder(formatter, (0, _options.merge)(cachedOpts, (0, _options.validate)(tpl))); |
|
} |
|
|
|
throw new Error(`Unexpected template param ${typeof tpl}`); |
|
}, { |
|
ast: (tpl, ...args) => { |
|
if (typeof tpl === "string") { |
|
if (args.length > 1) throw new Error("Unexpected extra params."); |
|
return (0, _string.default)(formatter, tpl, (0, _options.merge)((0, _options.merge)(cachedOpts, (0, _options.validate)(args[0])), NO_PLACEHOLDER))(); |
|
} else if (Array.isArray(tpl)) { |
|
let builder = templateAstCache.get(tpl); |
|
|
|
if (!builder) { |
|
builder = (0, _literal.default)(formatter, tpl, (0, _options.merge)(cachedOpts, NO_PLACEHOLDER)); |
|
templateAstCache.set(tpl, builder); |
|
} |
|
|
|
return builder(args)(); |
|
} |
|
|
|
throw new Error(`Unexpected template param ${typeof tpl}`); |
|
} |
|
}); |
|
} |
|
|
|
function extendedTrace(fn) { |
|
let rootStack = ""; |
|
|
|
try { |
|
throw new Error(); |
|
} catch (error) { |
|
if (error.stack) { |
|
rootStack = error.stack.split("\n").slice(3).join("\n"); |
|
} |
|
} |
|
|
|
return arg => { |
|
try { |
|
return fn(arg); |
|
} catch (err) { |
|
err.stack += `\n =============\n${rootStack}`; |
|
throw err; |
|
} |
|
}; |
|
} |