| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = createTemplateBuilder; |
| |
| var _options = require("./options"); |
| |
| var _string = _interopRequireDefault(require("./string")); |
| |
| var _literal = _interopRequireDefault(require("./literal")); |
| |
| function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } |
| |
| 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; |
| } |
| }; |
| } |