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.
		
		
		
		
		
			
		
			
				
					70 lines
				
				2.4 KiB
			
		
		
			
		
	
	
					70 lines
				
				2.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								"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;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								//# sourceMappingURL=builder.js.map
							 |