UNPKG

2.22 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.default = literalTemplate;
7
8var _options = require("./options");
9
10var _parse = _interopRequireDefault(require("./parse"));
11
12var _populate = _interopRequireDefault(require("./populate"));
13
14function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
15
16function literalTemplate(formatter, tpl, opts) {
17 const {
18 metadata,
19 names
20 } = buildLiteralData(formatter, tpl, opts);
21 return arg => {
22 const defaultReplacements = arg.reduce((acc, replacement, i) => {
23 acc[names[i]] = replacement;
24 return acc;
25 }, {});
26 return arg => {
27 const replacements = (0, _options.normalizeReplacements)(arg);
28
29 if (replacements) {
30 Object.keys(replacements).forEach(key => {
31 if (Object.prototype.hasOwnProperty.call(defaultReplacements, key)) {
32 throw new Error("Unexpected replacement overlap.");
33 }
34 });
35 }
36
37 return formatter.unwrap((0, _populate.default)(metadata, replacements ? Object.assign(replacements, defaultReplacements) : defaultReplacements));
38 };
39 };
40}
41
42function buildLiteralData(formatter, tpl, opts) {
43 let names;
44 let nameSet;
45 let metadata;
46 let prefix = "";
47
48 do {
49 prefix += "$";
50 const result = buildTemplateCode(tpl, prefix);
51 names = result.names;
52 nameSet = new Set(names);
53 metadata = (0, _parse.default)(formatter, formatter.code(result.code), {
54 parser: opts.parser,
55 placeholderWhitelist: new Set(result.names.concat(opts.placeholderWhitelist ? Array.from(opts.placeholderWhitelist) : [])),
56 placeholderPattern: opts.placeholderPattern,
57 preserveComments: opts.preserveComments,
58 syntacticPlaceholders: opts.syntacticPlaceholders
59 });
60 } while (metadata.placeholders.some(placeholder => placeholder.isDuplicate && nameSet.has(placeholder.name)));
61
62 return {
63 metadata,
64 names
65 };
66}
67
68function buildTemplateCode(tpl, prefix) {
69 const names = [];
70 let code = tpl[0];
71
72 for (let i = 1; i < tpl.length; i++) {
73 const value = `${prefix}${i - 1}`;
74 names.push(value);
75 code += value + tpl[i];
76 }
77
78 return {
79 names,
80 code
81 };
82}
\No newline at end of file