liquidjs-rails 8.2.0.3 → 8.2.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2536 @@
1
+ /*
2
+ * liquidjs@8.2.0, https://github.com/harttle/liquidjs
3
+ * (c) 2016-2019 harttle
4
+ * Released under the MIT License.
5
+ */
6
+ (function (global, factory) {
7
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
8
+ typeof define === 'function' && define.amd ? define(factory) :
9
+ (global = global || self, global.Liquid = factory());
10
+ }(this, function () { 'use strict';
11
+
12
+ /*! *****************************************************************************
13
+ Copyright (c) Microsoft Corporation. All rights reserved.
14
+ Licensed under the Apache License, Version 2.0 (the "License"); you may not use
15
+ this file except in compliance with the License. You may obtain a copy of the
16
+ License at http://www.apache.org/licenses/LICENSE-2.0
17
+
18
+ THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
19
+ KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
20
+ WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
21
+ MERCHANTABLITY OR NON-INFRINGEMENT.
22
+
23
+ See the Apache Version 2.0 License for specific language governing permissions
24
+ and limitations under the License.
25
+ ***************************************************************************** */
26
+ /* global Reflect, Promise */
27
+
28
+ var extendStatics = function(d, b) {
29
+ extendStatics = Object.setPrototypeOf ||
30
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
31
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
32
+ return extendStatics(d, b);
33
+ };
34
+
35
+ function __extends(d, b) {
36
+ extendStatics(d, b);
37
+ function __() { this.constructor = d; }
38
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
39
+ }
40
+
41
+ var __assign = function() {
42
+ __assign = Object.assign || function __assign(t) {
43
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
44
+ s = arguments[i];
45
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
46
+ }
47
+ return t;
48
+ };
49
+ return __assign.apply(this, arguments);
50
+ };
51
+
52
+ function __awaiter(thisArg, _arguments, P, generator) {
53
+ return new (P || (P = Promise))(function (resolve, reject) {
54
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
55
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
56
+ function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
57
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
58
+ });
59
+ }
60
+
61
+ function __generator(thisArg, body) {
62
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
63
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
64
+ function verb(n) { return function (v) { return step([n, v]); }; }
65
+ function step(op) {
66
+ if (f) throw new TypeError("Generator is already executing.");
67
+ while (_) try {
68
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
69
+ if (y = 0, t) op = [op[0] & 2, t.value];
70
+ switch (op[0]) {
71
+ case 0: case 1: t = op; break;
72
+ case 4: _.label++; return { value: op[1], done: false };
73
+ case 5: _.label++; y = op[1]; op = [0]; continue;
74
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
75
+ default:
76
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
77
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
78
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
79
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
80
+ if (t[2]) _.ops.pop();
81
+ _.trys.pop(); continue;
82
+ }
83
+ op = body.call(thisArg, _);
84
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
85
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
86
+ }
87
+ }
88
+
89
+ var toStr = Object.prototype.toString;
90
+ /*
91
+ * Checks if value is classified as a String primitive or object.
92
+ * @param {any} value The value to check.
93
+ * @return {Boolean} Returns true if value is a string, else false.
94
+ */
95
+ function isString(value) {
96
+ return toStr.call(value) === '[object String]';
97
+ }
98
+ function isFunction(value) {
99
+ return typeof value === 'function';
100
+ }
101
+ function stringify(value) {
102
+ if (isNil(value))
103
+ return '';
104
+ value = toLiquid(value);
105
+ return String(value);
106
+ }
107
+ function toLiquid(value) {
108
+ if (isFunction(value.toLiquid))
109
+ return toLiquid(value.toLiquid());
110
+ return value;
111
+ }
112
+ function isNil(value) {
113
+ return value === null || value === undefined;
114
+ }
115
+ function isArray(value) {
116
+ // be compatible with IE 8
117
+ return toStr.call(value) === '[object Array]';
118
+ }
119
+ /*
120
+ * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property.
121
+ * The iteratee is invoked with three arguments: (value, key, object).
122
+ * Iteratee functions may exit iteration early by explicitly returning false.
123
+ * @param {Object} object The object to iterate over.
124
+ * @param {Function} iteratee The function invoked per iteration.
125
+ * @return {Object} Returns object.
126
+ */
127
+ function forOwn(object, iteratee) {
128
+ object = object || {};
129
+ for (var k in object) {
130
+ if (object.hasOwnProperty(k)) {
131
+ if (iteratee(object[k], k, object) === false)
132
+ break;
133
+ }
134
+ }
135
+ return object;
136
+ }
137
+ function last(arr) {
138
+ return arr[arr.length - 1];
139
+ }
140
+ /*
141
+ * Checks if value is the language type of Object.
142
+ * (e.g. arrays, functions, objects, regexes, new Number(0), and new String(''))
143
+ * @param {any} value The value to check.
144
+ * @return {Boolean} Returns true if value is an object, else false.
145
+ */
146
+ function isObject(value) {
147
+ var type = typeof value;
148
+ return value !== null && (type === 'object' || type === 'function');
149
+ }
150
+ function range(start, stop, step) {
151
+ if (step === void 0) { step = 1; }
152
+ var arr = [];
153
+ for (var i = start; i < stop; i += step) {
154
+ arr.push(i);
155
+ }
156
+ return arr;
157
+ }
158
+ function padStart(str, length, ch) {
159
+ if (ch === void 0) { ch = ' '; }
160
+ str = String(str);
161
+ var n = length - str.length;
162
+ while (n-- > 0)
163
+ str = ch + str;
164
+ return str;
165
+ }
166
+
167
+ var Drop = /** @class */ (function () {
168
+ function Drop() {
169
+ }
170
+ Drop.prototype.valueOf = function () {
171
+ return undefined;
172
+ };
173
+ Drop.prototype.liquidMethodMissing = function (key) {
174
+ return undefined;
175
+ };
176
+ return Drop;
177
+ }());
178
+
179
+ var LiquidError = /** @class */ (function (_super) {
180
+ __extends(LiquidError, _super);
181
+ function LiquidError(err, token) {
182
+ var _this = _super.call(this, err.message) || this;
183
+ _this.originalError = err;
184
+ _this.token = token;
185
+ return _this;
186
+ }
187
+ LiquidError.prototype.update = function () {
188
+ var err = this.originalError;
189
+ var context = mkContext(this.token);
190
+ this.message = mkMessage(err.message, this.token);
191
+ this.stack = this.message + '\n' + context +
192
+ '\n' + this.stack + '\nFrom ' + err.stack;
193
+ };
194
+ return LiquidError;
195
+ }(Error));
196
+ var TokenizationError = /** @class */ (function (_super) {
197
+ __extends(TokenizationError, _super);
198
+ function TokenizationError(message, token) {
199
+ var _this = _super.call(this, new Error(message), token) || this;
200
+ _this.name = 'TokenizationError';
201
+ _super.prototype.update.call(_this);
202
+ return _this;
203
+ }
204
+ return TokenizationError;
205
+ }(LiquidError));
206
+ var ParseError = /** @class */ (function (_super) {
207
+ __extends(ParseError, _super);
208
+ function ParseError(err, token) {
209
+ var _this = _super.call(this, err, token) || this;
210
+ _this.name = 'ParseError';
211
+ _this.message = err.message;
212
+ _super.prototype.update.call(_this);
213
+ return _this;
214
+ }
215
+ return ParseError;
216
+ }(LiquidError));
217
+ var RenderError = /** @class */ (function (_super) {
218
+ __extends(RenderError, _super);
219
+ function RenderError(err, tpl) {
220
+ var _this = _super.call(this, err, tpl.token) || this;
221
+ _this.name = 'RenderError';
222
+ _this.message = err.message;
223
+ _super.prototype.update.call(_this);
224
+ return _this;
225
+ }
226
+ return RenderError;
227
+ }(LiquidError));
228
+ var RenderBreakError = /** @class */ (function (_super) {
229
+ __extends(RenderBreakError, _super);
230
+ function RenderBreakError(message) {
231
+ var _this = _super.call(this, message) || this;
232
+ _this.resolvedHTML = '';
233
+ _this.name = 'RenderBreakError';
234
+ _this.message = message + '';
235
+ return _this;
236
+ }
237
+ return RenderBreakError;
238
+ }(Error));
239
+ var AssertionError = /** @class */ (function (_super) {
240
+ __extends(AssertionError, _super);
241
+ function AssertionError(message) {
242
+ var _this = _super.call(this, message) || this;
243
+ _this.name = 'AssertionError';
244
+ _this.message = message + '';
245
+ return _this;
246
+ }
247
+ return AssertionError;
248
+ }(Error));
249
+ function mkContext(token) {
250
+ var lines = token.input.split('\n');
251
+ var begin = Math.max(token.line - 2, 1);
252
+ var end = Math.min(token.line + 3, lines.length);
253
+ var context = range(begin, end + 1)
254
+ .map(function (lineNumber) {
255
+ var indicator = (lineNumber === token.line) ? '>> ' : ' ';
256
+ var num = padStart(String(lineNumber), String(end).length);
257
+ var text = lines[lineNumber - 1];
258
+ return "" + indicator + num + "| " + text;
259
+ })
260
+ .join('\n');
261
+ return context;
262
+ }
263
+ function mkMessage(msg, token) {
264
+ if (token.file)
265
+ msg += ", file:" + token.file;
266
+ msg += ", line:" + token.line + ", col:" + token.col;
267
+ return msg;
268
+ }
269
+
270
+ function assert (predicate, message) {
271
+ if (!predicate) {
272
+ message = message || "expect " + predicate + " to be true";
273
+ throw new AssertionError(message);
274
+ }
275
+ }
276
+
277
+ var defaultOptions = {
278
+ root: ['.'],
279
+ cache: false,
280
+ extname: '',
281
+ dynamicPartials: true,
282
+ trimTagRight: false,
283
+ trimTagLeft: false,
284
+ trimOutputRight: false,
285
+ trimOutputLeft: false,
286
+ greedy: true,
287
+ tagDelimiterLeft: '{%',
288
+ tagDelimiterRight: '%}',
289
+ outputDelimiterLeft: '{{',
290
+ outputDelimiterRight: '}}',
291
+ strictFilters: false,
292
+ strictVariables: false
293
+ };
294
+ function normalize(options) {
295
+ options = options || {};
296
+ if (options.hasOwnProperty('root')) {
297
+ options.root = normalizeStringArray(options.root);
298
+ }
299
+ return options;
300
+ }
301
+ function applyDefault(options) {
302
+ return __assign({}, defaultOptions, options);
303
+ }
304
+ function normalizeStringArray(value) {
305
+ if (isArray(value))
306
+ return value;
307
+ if (isString(value))
308
+ return [value];
309
+ return [];
310
+ }
311
+
312
+ var Context = /** @class */ (function () {
313
+ function Context(ctx, opts) {
314
+ if (ctx === void 0) { ctx = {}; }
315
+ this.scopes = [{}];
316
+ this.registers = {};
317
+ this.opts = applyDefault(opts);
318
+ this.environments = ctx;
319
+ }
320
+ Context.prototype.getRegister = function (key, defaultValue) {
321
+ if (defaultValue === void 0) { defaultValue = {}; }
322
+ return (this.registers[key] = this.registers[key] || defaultValue);
323
+ };
324
+ Context.prototype.setRegister = function (key, value) {
325
+ return (this.registers[key] = value);
326
+ };
327
+ Context.prototype.getAll = function () {
328
+ return [this.environments].concat(this.scopes).reduce(function (ctx, val) { return __assign(ctx, val); }, {});
329
+ };
330
+ Context.prototype.get = function (path) {
331
+ return __awaiter(this, void 0, void 0, function () {
332
+ var paths, ctx, _i, paths_1, path_1;
333
+ return __generator(this, function (_a) {
334
+ switch (_a.label) {
335
+ case 0: return [4 /*yield*/, this.parseProp(path)];
336
+ case 1:
337
+ paths = _a.sent();
338
+ ctx = this.findScope(paths[0]) || this.environments;
339
+ for (_i = 0, paths_1 = paths; _i < paths_1.length; _i++) {
340
+ path_1 = paths_1[_i];
341
+ ctx = readProperty(ctx, path_1);
342
+ if (isNil(ctx) && this.opts.strictVariables) {
343
+ throw new TypeError("undefined variable: " + path_1);
344
+ }
345
+ }
346
+ return [2 /*return*/, ctx];
347
+ }
348
+ });
349
+ });
350
+ };
351
+ Context.prototype.push = function (ctx) {
352
+ return this.scopes.push(ctx);
353
+ };
354
+ Context.prototype.pop = function () {
355
+ return this.scopes.pop();
356
+ };
357
+ Context.prototype.front = function () {
358
+ return this.scopes[0];
359
+ };
360
+ Context.prototype.findScope = function (key) {
361
+ for (var i = this.scopes.length - 1; i >= 0; i--) {
362
+ var candidate = this.scopes[i];
363
+ if (key in candidate) {
364
+ return candidate;
365
+ }
366
+ }
367
+ return null;
368
+ };
369
+ /*
370
+ * Parse property access sequence from access string
371
+ * @example
372
+ * accessSeq("foo.bar") // ['foo', 'bar']
373
+ * accessSeq("foo['bar']") // ['foo', 'bar']
374
+ * accessSeq("foo['b]r']") // ['foo', 'b]r']
375
+ * accessSeq("foo[bar.coo]") // ['foo', 'bar'], for bar.coo == 'bar'
376
+ */
377
+ Context.prototype.parseProp = function (str) {
378
+ return __awaiter(this, void 0, void 0, function () {
379
+ function push() {
380
+ if (name.length)
381
+ seq.push(name);
382
+ name = '';
383
+ }
384
+ var seq, name, j, i, _a, delemiter, _b;
385
+ return __generator(this, function (_c) {
386
+ switch (_c.label) {
387
+ case 0:
388
+ str = String(str);
389
+ seq = [];
390
+ name = '';
391
+ i = 0;
392
+ _c.label = 1;
393
+ case 1:
394
+ if (!(i < str.length)) return [3 /*break*/, 10];
395
+ _a = str[i];
396
+ switch (_a) {
397
+ case '[': return [3 /*break*/, 2];
398
+ case '.': return [3 /*break*/, 7];
399
+ }
400
+ return [3 /*break*/, 8];
401
+ case 2:
402
+ push();
403
+ delemiter = str[i + 1];
404
+ if (!/['"]/.test(delemiter)) return [3 /*break*/, 3];
405
+ j = str.indexOf(delemiter, i + 2);
406
+ assert(j !== -1, "unbalanced " + delemiter + ": " + str);
407
+ name = str.slice(i + 2, j);
408
+ push();
409
+ i = j + 2;
410
+ return [3 /*break*/, 6];
411
+ case 3:
412
+ j = matchRightBracket(str, i + 1);
413
+ assert(j !== -1, "unbalanced []: " + str);
414
+ name = str.slice(i + 1, j);
415
+ if (!!/^[+-]?\d+$/.test(name)) return [3 /*break*/, 5];
416
+ _b = String;
417
+ return [4 /*yield*/, this.get(name)];
418
+ case 4:
419
+ name = _b.apply(void 0, [_c.sent()]);
420
+ _c.label = 5;
421
+ case 5:
422
+ push();
423
+ i = j + 1;
424
+ _c.label = 6;
425
+ case 6: return [3 /*break*/, 9];
426
+ case 7:
427
+ push();
428
+ i++;
429
+ return [3 /*break*/, 9];
430
+ case 8:
431
+ name += str[i++];
432
+ _c.label = 9;
433
+ case 9: return [3 /*break*/, 1];
434
+ case 10:
435
+ push();
436
+ if (!seq.length) {
437
+ throw new TypeError("invalid path:\"" + str + "\"");
438
+ }
439
+ return [2 /*return*/, seq];
440
+ }
441
+ });
442
+ });
443
+ };
444
+ return Context;
445
+ }());
446
+ function readProperty(obj, key) {
447
+ if (isNil(obj))
448
+ return obj;
449
+ obj = toLiquid(obj);
450
+ if (obj instanceof Drop) {
451
+ if (isFunction(obj[key]))
452
+ return obj[key]();
453
+ if (obj.hasOwnProperty(key))
454
+ return obj[key];
455
+ return obj.liquidMethodMissing(key);
456
+ }
457
+ return key === 'size' ? readSize(obj) : obj[key];
458
+ }
459
+ function readSize(obj) {
460
+ if (!isNil(obj['size']))
461
+ return obj['size'];
462
+ if (isArray(obj) || isString(obj))
463
+ return obj.length;
464
+ return obj['size'];
465
+ }
466
+ function matchRightBracket(str, begin) {
467
+ var stack = 1; // count of '[' - count of ']'
468
+ for (var i = begin; i < str.length; i++) {
469
+ if (str[i] === '[') {
470
+ stack++;
471
+ }
472
+ if (str[i] === ']') {
473
+ stack--;
474
+ if (stack === 0) {
475
+ return i;
476
+ }
477
+ }
478
+ }
479
+ return -1;
480
+ }
481
+
482
+
483
+
484
+ var Types = /*#__PURE__*/Object.freeze({
485
+ ParseError: ParseError,
486
+ TokenizationError: TokenizationError,
487
+ RenderBreakError: RenderBreakError,
488
+ AssertionError: AssertionError,
489
+ Drop: Drop
490
+ });
491
+
492
+ function domResolve(root, path) {
493
+ var base = document.createElement('base');
494
+ base.href = root;
495
+ var head = document.getElementsByTagName('head')[0];
496
+ head.insertBefore(base, head.firstChild);
497
+ var a = document.createElement('a');
498
+ a.href = path;
499
+ var resolved = a.href;
500
+ head.removeChild(base);
501
+ return resolved;
502
+ }
503
+ function resolve(root, filepath, ext) {
504
+ if (root.length && last(root) !== '/')
505
+ root += '/';
506
+ var url = domResolve(root, filepath);
507
+ return url.replace(/^(\w+:\/\/[^/]+)(\/[^?]+)/, function (str, origin, path) {
508
+ var last$$1 = path.split('/').pop();
509
+ if (/\.\w+$/.test(last$$1))
510
+ return str;
511
+ return origin + path + ext;
512
+ });
513
+ }
514
+ function readFile(url) {
515
+ return __awaiter(this, void 0, void 0, function () {
516
+ return __generator(this, function (_a) {
517
+ return [2 /*return*/, new Promise(function (resolve, reject) {
518
+ var xhr = new XMLHttpRequest();
519
+ xhr.onload = function () {
520
+ if (xhr.status >= 200 && xhr.status < 300) {
521
+ resolve(xhr.responseText);
522
+ }
523
+ else {
524
+ reject(new Error(xhr.statusText));
525
+ }
526
+ };
527
+ xhr.onerror = function () {
528
+ reject(new Error('An error occurred whilst receiving the response.'));
529
+ };
530
+ xhr.open('GET', url);
531
+ xhr.send();
532
+ })];
533
+ });
534
+ });
535
+ }
536
+ function exists() {
537
+ return __awaiter(this, void 0, void 0, function () {
538
+ return __generator(this, function (_a) {
539
+ return [2 /*return*/, true];
540
+ });
541
+ });
542
+ }
543
+ var fs = { readFile: readFile, resolve: resolve, exists: exists };
544
+
545
+ var Token = /** @class */ (function () {
546
+ function Token(raw, input, line, col, file) {
547
+ this.trimLeft = false;
548
+ this.trimRight = false;
549
+ this.type = 'notset';
550
+ this.col = col;
551
+ this.line = line;
552
+ this.raw = raw;
553
+ this.value = raw;
554
+ this.input = input;
555
+ this.file = file;
556
+ }
557
+ return Token;
558
+ }());
559
+
560
+ var DelimitedToken = /** @class */ (function (_super) {
561
+ __extends(DelimitedToken, _super);
562
+ function DelimitedToken(raw, value, input, line, pos, trimLeft, trimRight, file) {
563
+ var _this = _super.call(this, raw, input, line, pos, file) || this;
564
+ var tl = value[0] === '-';
565
+ var tr = last(value) === '-';
566
+ _this.value = value
567
+ .slice(tl ? 1 : 0, tr ? -1 : value.length)
568
+ .trim();
569
+ _this.trimLeft = tl || trimLeft;
570
+ _this.trimRight = tr || trimRight;
571
+ return _this;
572
+ }
573
+ return DelimitedToken;
574
+ }(Token));
575
+
576
+ // quote related
577
+ var singleQuoted = /'[^']*'/;
578
+ var doubleQuoted = /"[^"]*"/;
579
+ var quoted = new RegExp(singleQuoted.source + "|" + doubleQuoted.source);
580
+ var quoteBalanced = new RegExp("(?:" + quoted.source + "|[^'\"])*");
581
+ // basic types
582
+ var number = /[+-]?(?:\d+\.?\d*|\.?\d+)/;
583
+ var bool = /true|false/;
584
+ // property access
585
+ var identifier = /[\w-]+[?]?/;
586
+ var subscript = new RegExp("\\[(?:" + quoted.source + "|[\\w-\\.]+)\\]");
587
+ var literal = new RegExp("(?:" + quoted.source + "|" + bool.source + "|" + number.source + ")");
588
+ var variable = new RegExp(identifier.source + "(?:\\." + identifier.source + "|" + subscript.source + ")*");
589
+ // range related
590
+ var rangeLimit = new RegExp("(?:" + variable.source + "|" + number.source + ")");
591
+ var range$1 = new RegExp("\\(" + rangeLimit.source + "\\.\\." + rangeLimit.source + "\\)");
592
+ var rangeCapture = new RegExp("\\((" + rangeLimit.source + ")\\.\\.(" + rangeLimit.source + ")\\)");
593
+ var value = new RegExp("(?:" + variable.source + "|" + literal.source + "|" + range$1.source + ")");
594
+ // hash related
595
+ var hash = new RegExp("(?:" + identifier.source + ")\\s*:\\s*(?:" + value.source + ")");
596
+ var hashCapture = new RegExp("(" + identifier.source + ")\\s*:\\s*(" + value.source + ")", 'g');
597
+ // full match
598
+ var tagLine = new RegExp("^\\s*(" + identifier.source + ")\\s*([\\s\\S]*?)\\s*$");
599
+ var quotedLine = new RegExp("^" + quoted.source + "$");
600
+ var rangeLine = new RegExp("^" + rangeCapture.source + "$");
601
+ var operators = [
602
+ /\s+or\s+/,
603
+ /\s+and\s+/,
604
+ /==|!=|<=|>=|<|>|\s+contains\s+/
605
+ ];
606
+
607
+ var TagToken = /** @class */ (function (_super) {
608
+ __extends(TagToken, _super);
609
+ function TagToken(raw, value$$1, input, line, pos, options, file) {
610
+ var _this = _super.call(this, raw, value$$1, input, line, pos, options.trimTagLeft, options.trimTagRight, file) || this;
611
+ _this.type = 'tag';
612
+ var match = _this.value.match(tagLine);
613
+ if (!match) {
614
+ throw new TokenizationError("illegal tag syntax", _this);
615
+ }
616
+ _this.name = match[1];
617
+ _this.args = match[2];
618
+ return _this;
619
+ }
620
+ TagToken.is = function (token) {
621
+ return token.type === 'tag';
622
+ };
623
+ return TagToken;
624
+ }(DelimitedToken));
625
+
626
+ var HTMLToken = /** @class */ (function (_super) {
627
+ __extends(HTMLToken, _super);
628
+ function HTMLToken(str, input, line, col, file) {
629
+ var _this = _super.call(this, str, input, line, col, file) || this;
630
+ _this.type = 'html';
631
+ _this.value = str;
632
+ return _this;
633
+ }
634
+ HTMLToken.is = function (token) {
635
+ return token.type === 'html';
636
+ };
637
+ return HTMLToken;
638
+ }(Token));
639
+
640
+ function whiteSpaceCtrl(tokens, options) {
641
+ options = __assign({ greedy: true }, options);
642
+ var inRaw = false;
643
+ for (var i = 0; i < tokens.length; i++) {
644
+ var token = tokens[i];
645
+ if (!inRaw && token.trimLeft) {
646
+ trimLeft(tokens[i - 1], options.greedy);
647
+ }
648
+ if (TagToken.is(token)) {
649
+ if (token.name === 'raw')
650
+ inRaw = true;
651
+ else if (token.name === 'endraw')
652
+ inRaw = false;
653
+ }
654
+ if (!inRaw && token.trimRight) {
655
+ trimRight(tokens[i + 1], options.greedy);
656
+ }
657
+ }
658
+ }
659
+ function trimLeft(token, greedy) {
660
+ if (!token || !HTMLToken.is(token))
661
+ return;
662
+ var rLeft = greedy ? /\s+$/g : /[\t\r ]*$/g;
663
+ token.value = token.value.replace(rLeft, '');
664
+ }
665
+ function trimRight(token, greedy) {
666
+ if (!token || !HTMLToken.is(token))
667
+ return;
668
+ var rRight = greedy ? /^\s+/g : /^[\t\r ]*\n?/g;
669
+ token.value = token.value.replace(rRight, '');
670
+ }
671
+
672
+ var OutputToken = /** @class */ (function (_super) {
673
+ __extends(OutputToken, _super);
674
+ function OutputToken(raw, value, input, line, pos, options, file) {
675
+ var _this = _super.call(this, raw, value, input, line, pos, options.trimOutputLeft, options.trimOutputRight, file) || this;
676
+ _this.type = 'output';
677
+ return _this;
678
+ }
679
+ OutputToken.is = function (token) {
680
+ return token.type === 'output';
681
+ };
682
+ return OutputToken;
683
+ }(DelimitedToken));
684
+
685
+ var ParseState;
686
+ (function (ParseState) {
687
+ ParseState[ParseState["HTML"] = 0] = "HTML";
688
+ ParseState[ParseState["OUTPUT"] = 1] = "OUTPUT";
689
+ ParseState[ParseState["TAG"] = 2] = "TAG";
690
+ })(ParseState || (ParseState = {}));
691
+ var Tokenizer = /** @class */ (function () {
692
+ function Tokenizer(options) {
693
+ this.options = applyDefault(options);
694
+ }
695
+ Tokenizer.prototype.tokenize = function (input, file) {
696
+ var tokens = [];
697
+ var _a = this.options, tagDelimiterLeft = _a.tagDelimiterLeft, tagDelimiterRight = _a.tagDelimiterRight, outputDelimiterLeft = _a.outputDelimiterLeft, outputDelimiterRight = _a.outputDelimiterRight;
698
+ var p = 0;
699
+ var curLine = 1;
700
+ var state = ParseState.HTML;
701
+ var buffer = '';
702
+ var lineBegin = 0;
703
+ var line = 1;
704
+ var col = 1;
705
+ while (p < input.length) {
706
+ if (input[p] === '\n') {
707
+ curLine++;
708
+ lineBegin = p + 1;
709
+ }
710
+ if (state === ParseState.HTML) {
711
+ if (input.substr(p, outputDelimiterLeft.length) === outputDelimiterLeft) {
712
+ if (buffer)
713
+ tokens.push(new HTMLToken(buffer, input, line, col, file));
714
+ buffer = outputDelimiterLeft;
715
+ line = curLine;
716
+ col = p - lineBegin + 1;
717
+ p += outputDelimiterLeft.length;
718
+ state = ParseState.OUTPUT;
719
+ continue;
720
+ }
721
+ else if (input.substr(p, tagDelimiterLeft.length) === tagDelimiterLeft) {
722
+ if (buffer)
723
+ tokens.push(new HTMLToken(buffer, input, line, col, file));
724
+ buffer = tagDelimiterLeft;
725
+ line = curLine;
726
+ col = p - lineBegin + 1;
727
+ p += tagDelimiterLeft.length;
728
+ state = ParseState.TAG;
729
+ continue;
730
+ }
731
+ }
732
+ else if (state === ParseState.OUTPUT &&
733
+ input.substr(p, outputDelimiterRight.length) === outputDelimiterRight) {
734
+ buffer += outputDelimiterRight;
735
+ tokens.push(new OutputToken(buffer, buffer.slice(outputDelimiterLeft.length, -outputDelimiterRight.length), input, line, col, this.options, file));
736
+ p += outputDelimiterRight.length;
737
+ buffer = '';
738
+ line = curLine;
739
+ col = p - lineBegin + 1;
740
+ state = ParseState.HTML;
741
+ continue;
742
+ }
743
+ else if (input.substr(p, tagDelimiterRight.length) === tagDelimiterRight) {
744
+ buffer += tagDelimiterRight;
745
+ tokens.push(new TagToken(buffer, buffer.slice(tagDelimiterLeft.length, -tagDelimiterRight.length), input, line, col, this.options, file));
746
+ p += tagDelimiterRight.length;
747
+ buffer = '';
748
+ line = curLine;
749
+ col = p - lineBegin + 1;
750
+ state = ParseState.HTML;
751
+ continue;
752
+ }
753
+ buffer += input[p++];
754
+ }
755
+ if (state !== ParseState.HTML) {
756
+ var t = state === ParseState.OUTPUT ? 'output' : 'tag';
757
+ var str = buffer.length > 16 ? buffer.slice(0, 13) + '...' : buffer;
758
+ throw new TokenizationError(t + " \"" + str + "\" not closed", new Token(buffer, input, line, col, file));
759
+ }
760
+ if (buffer)
761
+ tokens.push(new HTMLToken(buffer, input, line, col, file));
762
+ whiteSpaceCtrl(tokens, this.options);
763
+ return tokens;
764
+ };
765
+ return Tokenizer;
766
+ }());
767
+
768
+ var Render = /** @class */ (function () {
769
+ function Render() {
770
+ }
771
+ Render.prototype.renderTemplates = function (templates, ctx) {
772
+ return __awaiter(this, void 0, void 0, function () {
773
+ var html, _i, templates_1, tpl, _a, e_1;
774
+ return __generator(this, function (_b) {
775
+ switch (_b.label) {
776
+ case 0:
777
+ assert(ctx, 'unable to evalTemplates: context undefined');
778
+ html = '';
779
+ _i = 0, templates_1 = templates;
780
+ _b.label = 1;
781
+ case 1:
782
+ if (!(_i < templates_1.length)) return [3 /*break*/, 6];
783
+ tpl = templates_1[_i];
784
+ _b.label = 2;
785
+ case 2:
786
+ _b.trys.push([2, 4, , 5]);
787
+ _a = html;
788
+ return [4 /*yield*/, tpl.render(ctx)];
789
+ case 3:
790
+ html = _a + _b.sent();
791
+ return [3 /*break*/, 5];
792
+ case 4:
793
+ e_1 = _b.sent();
794
+ if (e_1.name === 'RenderBreakError') {
795
+ e_1.resolvedHTML = html;
796
+ throw e_1;
797
+ }
798
+ throw e_1.name === 'RenderError' ? e_1 : new RenderError(e_1, tpl);
799
+ case 5:
800
+ _i++;
801
+ return [3 /*break*/, 1];
802
+ case 6: return [2 /*return*/, html];
803
+ }
804
+ });
805
+ });
806
+ };
807
+ return Render;
808
+ }());
809
+
810
+ function isComparable(arg) {
811
+ return arg && isFunction(arg.equals);
812
+ }
813
+
814
+ var EmptyDrop = /** @class */ (function (_super) {
815
+ __extends(EmptyDrop, _super);
816
+ function EmptyDrop() {
817
+ return _super !== null && _super.apply(this, arguments) || this;
818
+ }
819
+ EmptyDrop.prototype.equals = function (value) {
820
+ if (isString(value) || isArray(value))
821
+ return value.length === 0;
822
+ if (isObject(value))
823
+ return Object.keys(value).length === 0;
824
+ return false;
825
+ };
826
+ EmptyDrop.prototype.gt = function () {
827
+ return false;
828
+ };
829
+ EmptyDrop.prototype.geq = function () {
830
+ return false;
831
+ };
832
+ EmptyDrop.prototype.lt = function () {
833
+ return false;
834
+ };
835
+ EmptyDrop.prototype.leq = function () {
836
+ return false;
837
+ };
838
+ EmptyDrop.prototype.valueOf = function () {
839
+ return '';
840
+ };
841
+ return EmptyDrop;
842
+ }(Drop));
843
+
844
+ var BlankDrop = /** @class */ (function (_super) {
845
+ __extends(BlankDrop, _super);
846
+ function BlankDrop() {
847
+ return _super !== null && _super.apply(this, arguments) || this;
848
+ }
849
+ BlankDrop.prototype.equals = function (value) {
850
+ if (value === false)
851
+ return true;
852
+ if (isNil(value instanceof Drop ? value.valueOf() : value))
853
+ return true;
854
+ if (isString(value))
855
+ return /^\s*$/.test(value);
856
+ return _super.prototype.equals.call(this, value);
857
+ };
858
+ return BlankDrop;
859
+ }(EmptyDrop));
860
+
861
+ var NullDrop = /** @class */ (function (_super) {
862
+ __extends(NullDrop, _super);
863
+ function NullDrop() {
864
+ return _super !== null && _super.apply(this, arguments) || this;
865
+ }
866
+ NullDrop.prototype.equals = function (value) {
867
+ return isNil(value instanceof Drop ? value.valueOf() : value) || value instanceof BlankDrop;
868
+ };
869
+ NullDrop.prototype.gt = function () {
870
+ return false;
871
+ };
872
+ NullDrop.prototype.geq = function () {
873
+ return false;
874
+ };
875
+ NullDrop.prototype.lt = function () {
876
+ return false;
877
+ };
878
+ NullDrop.prototype.leq = function () {
879
+ return false;
880
+ };
881
+ NullDrop.prototype.valueOf = function () {
882
+ return null;
883
+ };
884
+ return NullDrop;
885
+ }(Drop));
886
+
887
+ var binaryOperators = {
888
+ '==': function (l, r) {
889
+ if (isComparable(l))
890
+ return l.equals(r);
891
+ if (isComparable(r))
892
+ return r.equals(l);
893
+ return l === r;
894
+ },
895
+ '!=': function (l, r) {
896
+ if (isComparable(l))
897
+ return !l.equals(r);
898
+ if (isComparable(r))
899
+ return !r.equals(l);
900
+ return l !== r;
901
+ },
902
+ '>': function (l, r) {
903
+ if (isComparable(l))
904
+ return l.gt(r);
905
+ if (isComparable(r))
906
+ return r.lt(l);
907
+ return l > r;
908
+ },
909
+ '<': function (l, r) {
910
+ if (isComparable(l))
911
+ return l.lt(r);
912
+ if (isComparable(r))
913
+ return r.gt(l);
914
+ return l < r;
915
+ },
916
+ '>=': function (l, r) {
917
+ if (isComparable(l))
918
+ return l.geq(r);
919
+ if (isComparable(r))
920
+ return r.leq(l);
921
+ return l >= r;
922
+ },
923
+ '<=': function (l, r) {
924
+ if (isComparable(l))
925
+ return l.leq(r);
926
+ if (isComparable(r))
927
+ return r.geq(l);
928
+ return l <= r;
929
+ },
930
+ 'contains': function (l, r) {
931
+ return l && isFunction(l.indexOf) ? l.indexOf(r) > -1 : false;
932
+ },
933
+ 'and': function (l, r) { return isTruthy(l) && isTruthy(r); },
934
+ 'or': function (l, r) { return isTruthy(l) || isTruthy(r); }
935
+ };
936
+ function parseExp(exp, ctx) {
937
+ return __awaiter(this, void 0, void 0, function () {
938
+ var operatorREs, match, i, operatorRE, expRE, l, op, r, low, high;
939
+ return __generator(this, function (_a) {
940
+ switch (_a.label) {
941
+ case 0:
942
+ assert(ctx, 'unable to parseExp: scope undefined');
943
+ operatorREs = operators;
944
+ i = 0;
945
+ _a.label = 1;
946
+ case 1:
947
+ if (!(i < operatorREs.length)) return [3 /*break*/, 5];
948
+ operatorRE = operatorREs[i];
949
+ expRE = new RegExp("^(" + quoteBalanced.source + ")(" + operatorRE.source + ")(" + quoteBalanced.source + ")$");
950
+ if (!(match = exp.match(expRE))) return [3 /*break*/, 4];
951
+ return [4 /*yield*/, parseExp(match[1], ctx)];
952
+ case 2:
953
+ l = _a.sent();
954
+ op = binaryOperators[match[2].trim()];
955
+ return [4 /*yield*/, parseExp(match[3], ctx)];
956
+ case 3:
957
+ r = _a.sent();
958
+ return [2 /*return*/, op(l, r)];
959
+ case 4:
960
+ i++;
961
+ return [3 /*break*/, 1];
962
+ case 5:
963
+ if (!(match = exp.match(rangeLine))) return [3 /*break*/, 8];
964
+ return [4 /*yield*/, evalValue(match[1], ctx)];
965
+ case 6:
966
+ low = _a.sent();
967
+ return [4 /*yield*/, evalValue(match[2], ctx)];
968
+ case 7:
969
+ high = _a.sent();
970
+ return [2 /*return*/, range(+low, +high + 1)];
971
+ case 8: return [2 /*return*/, parseValue(exp, ctx)];
972
+ }
973
+ });
974
+ });
975
+ }
976
+ function evalExp(str, ctx) {
977
+ return __awaiter(this, void 0, void 0, function () {
978
+ var value$$1;
979
+ return __generator(this, function (_a) {
980
+ switch (_a.label) {
981
+ case 0: return [4 /*yield*/, parseExp(str, ctx)];
982
+ case 1:
983
+ value$$1 = _a.sent();
984
+ return [2 /*return*/, value$$1 instanceof Drop ? value$$1.valueOf() : value$$1];
985
+ }
986
+ });
987
+ });
988
+ }
989
+ function parseValue(str, ctx) {
990
+ return __awaiter(this, void 0, void 0, function () {
991
+ return __generator(this, function (_a) {
992
+ if (!str)
993
+ return [2 /*return*/, null];
994
+ str = str.trim();
995
+ if (str === 'true')
996
+ return [2 /*return*/, true];
997
+ if (str === 'false')
998
+ return [2 /*return*/, false];
999
+ if (str === 'nil' || str === 'null')
1000
+ return [2 /*return*/, new NullDrop()];
1001
+ if (str === 'empty')
1002
+ return [2 /*return*/, new EmptyDrop()];
1003
+ if (str === 'blank')
1004
+ return [2 /*return*/, new BlankDrop()];
1005
+ if (!isNaN(Number(str)))
1006
+ return [2 /*return*/, Number(str)];
1007
+ if ((str[0] === '"' || str[0] === "'") && str[0] === last(str))
1008
+ return [2 /*return*/, str.slice(1, -1)];
1009
+ return [2 /*return*/, ctx.get(str)];
1010
+ });
1011
+ });
1012
+ }
1013
+ function evalValue(str, ctx) {
1014
+ return __awaiter(this, void 0, void 0, function () {
1015
+ var value$$1;
1016
+ return __generator(this, function (_a) {
1017
+ switch (_a.label) {
1018
+ case 0: return [4 /*yield*/, parseValue(str, ctx)];
1019
+ case 1:
1020
+ value$$1 = _a.sent();
1021
+ return [2 /*return*/, value$$1 instanceof Drop ? value$$1.valueOf() : value$$1];
1022
+ }
1023
+ });
1024
+ });
1025
+ }
1026
+ function isTruthy(val) {
1027
+ return !isFalsy(val);
1028
+ }
1029
+ function isFalsy(val) {
1030
+ return val === false || undefined === val || val === null;
1031
+ }
1032
+
1033
+ /**
1034
+ * Key-Value Pairs Representing Tag Arguments
1035
+ * Example:
1036
+ * For the markup `{% include 'head.html' foo='bar' %}`,
1037
+ * hash['foo'] === 'bar'
1038
+ */
1039
+ var Hash = /** @class */ (function () {
1040
+ function Hash() {
1041
+ }
1042
+ Hash.create = function (markup, ctx) {
1043
+ return __awaiter(this, void 0, void 0, function () {
1044
+ var instance, match, k, v, _a, _b;
1045
+ return __generator(this, function (_c) {
1046
+ switch (_c.label) {
1047
+ case 0:
1048
+ instance = new Hash();
1049
+ hashCapture.lastIndex = 0;
1050
+ _c.label = 1;
1051
+ case 1:
1052
+ if (!(match = hashCapture.exec(markup))) return [3 /*break*/, 3];
1053
+ k = match[1];
1054
+ v = match[2];
1055
+ _a = instance;
1056
+ _b = k;
1057
+ return [4 /*yield*/, evalValue(v, ctx)];
1058
+ case 2:
1059
+ _a[_b] = _c.sent();
1060
+ return [3 /*break*/, 1];
1061
+ case 3: return [2 /*return*/, instance];
1062
+ }
1063
+ });
1064
+ });
1065
+ };
1066
+ return Hash;
1067
+ }());
1068
+
1069
+ var Template = /** @class */ (function () {
1070
+ function Template(token) {
1071
+ this.token = token;
1072
+ }
1073
+ return Template;
1074
+ }());
1075
+
1076
+ var Tag = /** @class */ (function (_super) {
1077
+ __extends(Tag, _super);
1078
+ function Tag(token, tokens, liquid) {
1079
+ var _this = _super.call(this, token) || this;
1080
+ _this.name = token.name;
1081
+ var impl = Tag.impls[token.name];
1082
+ assert(impl, "tag " + token.name + " not found");
1083
+ _this.impl = Object.create(impl);
1084
+ _this.impl.liquid = liquid;
1085
+ if (_this.impl.parse) {
1086
+ _this.impl.parse(token, tokens);
1087
+ }
1088
+ return _this;
1089
+ }
1090
+ Tag.prototype.render = function (ctx) {
1091
+ return __awaiter(this, void 0, void 0, function () {
1092
+ var hash, impl, _a, _b;
1093
+ return __generator(this, function (_c) {
1094
+ switch (_c.label) {
1095
+ case 0: return [4 /*yield*/, Hash.create(this.token.args, ctx)];
1096
+ case 1:
1097
+ hash = _c.sent();
1098
+ impl = this.impl;
1099
+ if (!isFunction(impl.render)) return [3 /*break*/, 3];
1100
+ _b = stringify;
1101
+ return [4 /*yield*/, impl.render(ctx, hash)];
1102
+ case 2:
1103
+ _a = _b.apply(void 0, [_c.sent()]);
1104
+ return [3 /*break*/, 4];
1105
+ case 3:
1106
+ _a = '';
1107
+ _c.label = 4;
1108
+ case 4: return [2 /*return*/, _a];
1109
+ }
1110
+ });
1111
+ });
1112
+ };
1113
+ Tag.register = function (name, tag) {
1114
+ Tag.impls[name] = tag;
1115
+ };
1116
+ Tag.clear = function () {
1117
+ Tag.impls = {};
1118
+ };
1119
+ Tag.impls = {};
1120
+ return Tag;
1121
+ }(Template));
1122
+
1123
+ var Filter = /** @class */ (function () {
1124
+ function Filter(name, args, strictFilters) {
1125
+ var impl = Filter.impls[name];
1126
+ if (!impl && strictFilters)
1127
+ throw new TypeError("undefined filter: " + name);
1128
+ this.name = name;
1129
+ this.impl = impl || (function (x) { return x; });
1130
+ this.args = args;
1131
+ }
1132
+ Filter.prototype.render = function (value, context) {
1133
+ return __awaiter(this, void 0, void 0, function () {
1134
+ var argv, _i, _a, arg, _b, _c, _d, _e, _f;
1135
+ return __generator(this, function (_g) {
1136
+ switch (_g.label) {
1137
+ case 0:
1138
+ argv = [];
1139
+ _i = 0, _a = this.args;
1140
+ _g.label = 1;
1141
+ case 1:
1142
+ if (!(_i < _a.length)) return [3 /*break*/, 6];
1143
+ arg = _a[_i];
1144
+ if (!isArray(arg)) return [3 /*break*/, 3];
1145
+ _c = (_b = argv).push;
1146
+ _d = [arg[0]];
1147
+ return [4 /*yield*/, evalValue(arg[1], context)];
1148
+ case 2:
1149
+ _c.apply(_b, [_d.concat([_g.sent()])]);
1150
+ return [3 /*break*/, 5];
1151
+ case 3:
1152
+ _f = (_e = argv).push;
1153
+ return [4 /*yield*/, evalValue(arg, context)];
1154
+ case 4:
1155
+ _f.apply(_e, [_g.sent()]);
1156
+ _g.label = 5;
1157
+ case 5:
1158
+ _i++;
1159
+ return [3 /*break*/, 1];
1160
+ case 6: return [2 /*return*/, this.impl.apply({ context: context }, [value].concat(argv))];
1161
+ }
1162
+ });
1163
+ });
1164
+ };
1165
+ Filter.register = function (name, filter) {
1166
+ Filter.impls[name] = filter;
1167
+ };
1168
+ Filter.clear = function () {
1169
+ Filter.impls = {};
1170
+ };
1171
+ Filter.impls = {};
1172
+ return Filter;
1173
+ }());
1174
+
1175
+ var ParseStream = /** @class */ (function () {
1176
+ function ParseStream(tokens, parseToken) {
1177
+ this.handlers = {};
1178
+ this.stopRequested = false;
1179
+ this.tokens = tokens;
1180
+ this.parseToken = parseToken;
1181
+ }
1182
+ ParseStream.prototype.on = function (name, cb) {
1183
+ this.handlers[name] = cb;
1184
+ return this;
1185
+ };
1186
+ ParseStream.prototype.trigger = function (event, arg) {
1187
+ var h = this.handlers[event];
1188
+ return h ? (h(arg), true) : false;
1189
+ };
1190
+ ParseStream.prototype.start = function () {
1191
+ this.trigger('start');
1192
+ var token;
1193
+ while (!this.stopRequested && (token = this.tokens.shift())) {
1194
+ if (this.trigger('token', token))
1195
+ continue;
1196
+ if (TagToken.is(token) && this.trigger("tag:" + token.name, token)) {
1197
+ continue;
1198
+ }
1199
+ var template = this.parseToken(token, this.tokens);
1200
+ this.trigger('template', template);
1201
+ }
1202
+ if (!this.stopRequested)
1203
+ this.trigger('end');
1204
+ return this;
1205
+ };
1206
+ ParseStream.prototype.stop = function () {
1207
+ this.stopRequested = true;
1208
+ return this;
1209
+ };
1210
+ return ParseStream;
1211
+ }());
1212
+
1213
+ var Value = /** @class */ (function () {
1214
+ /**
1215
+ * @param str value string, like: "i have a dream | truncate: 3
1216
+ */
1217
+ function Value(str, strictFilters) {
1218
+ this.filters = [];
1219
+ var tokens = Value.tokenize(str);
1220
+ this.strictFilters = strictFilters;
1221
+ this.initial = tokens[0];
1222
+ this.parseFilters(tokens, 1);
1223
+ }
1224
+ Value.prototype.parseFilters = function (tokens, begin) {
1225
+ var i = begin;
1226
+ while (i < tokens.length) {
1227
+ if (tokens[i] !== '|') {
1228
+ i++;
1229
+ continue;
1230
+ }
1231
+ var j = ++i;
1232
+ while (i < tokens.length && tokens[i] !== '|')
1233
+ i++;
1234
+ this.parseFilter(tokens, j, i);
1235
+ }
1236
+ };
1237
+ Value.prototype.parseFilter = function (tokens, begin, end) {
1238
+ var name = tokens[begin];
1239
+ var args = [];
1240
+ var argName, argValue;
1241
+ for (var i = begin + 1; i < end + 1; i++) {
1242
+ if (i === end || tokens[i] === ',') {
1243
+ if (argName || argValue) {
1244
+ args.push(argName ? [argName, argValue] : argValue);
1245
+ }
1246
+ argValue = argName = undefined;
1247
+ }
1248
+ else if (tokens[i] === ':') {
1249
+ argName = argValue;
1250
+ argValue = undefined;
1251
+ }
1252
+ else if (argValue === undefined) {
1253
+ argValue = tokens[i];
1254
+ }
1255
+ }
1256
+ this.filters.push(new Filter(name, args, this.strictFilters));
1257
+ };
1258
+ Value.prototype.value = function (ctx) {
1259
+ return __awaiter(this, void 0, void 0, function () {
1260
+ var val, _i, _a, filter;
1261
+ return __generator(this, function (_b) {
1262
+ switch (_b.label) {
1263
+ case 0: return [4 /*yield*/, evalExp(this.initial, ctx)];
1264
+ case 1:
1265
+ val = _b.sent();
1266
+ _i = 0, _a = this.filters;
1267
+ _b.label = 2;
1268
+ case 2:
1269
+ if (!(_i < _a.length)) return [3 /*break*/, 5];
1270
+ filter = _a[_i];
1271
+ return [4 /*yield*/, filter.render(val, ctx)];
1272
+ case 3:
1273
+ val = _b.sent();
1274
+ _b.label = 4;
1275
+ case 4:
1276
+ _i++;
1277
+ return [3 /*break*/, 2];
1278
+ case 5: return [2 /*return*/, val];
1279
+ }
1280
+ });
1281
+ });
1282
+ };
1283
+ Value.tokenize = function (str) {
1284
+ var tokens = [];
1285
+ var i = 0;
1286
+ while (i < str.length) {
1287
+ var ch = str[i];
1288
+ if (ch === '"' || ch === "'") {
1289
+ var j = i;
1290
+ for (i += 2; i < str.length && str[i - 1] !== ch; ++i)
1291
+ ;
1292
+ tokens.push(str.slice(j, i));
1293
+ }
1294
+ else if (/\s/.test(ch)) {
1295
+ i++;
1296
+ }
1297
+ else if (/[|,:]/.test(ch)) {
1298
+ tokens.push(str[i++]);
1299
+ }
1300
+ else {
1301
+ var j = i++;
1302
+ for (; i < str.length && !/[|,:\s]/.test(str[i]); ++i)
1303
+ ;
1304
+ tokens.push(str.slice(j, i));
1305
+ }
1306
+ }
1307
+ return tokens;
1308
+ };
1309
+ return Value;
1310
+ }());
1311
+
1312
+ var Output = /** @class */ (function (_super) {
1313
+ __extends(Output, _super);
1314
+ function Output(token, strictFilters) {
1315
+ var _this = _super.call(this, token) || this;
1316
+ _this.value = new Value(token.value, strictFilters);
1317
+ return _this;
1318
+ }
1319
+ Output.prototype.render = function (ctx) {
1320
+ return __awaiter(this, void 0, void 0, function () {
1321
+ var html;
1322
+ return __generator(this, function (_a) {
1323
+ switch (_a.label) {
1324
+ case 0: return [4 /*yield*/, this.value.value(ctx)];
1325
+ case 1:
1326
+ html = _a.sent();
1327
+ return [2 /*return*/, stringify(html)];
1328
+ }
1329
+ });
1330
+ });
1331
+ };
1332
+ return Output;
1333
+ }(Template));
1334
+
1335
+ var default_1 = /** @class */ (function (_super) {
1336
+ __extends(default_1, _super);
1337
+ function default_1(token) {
1338
+ var _this = _super.call(this, token) || this;
1339
+ _this.str = token.value;
1340
+ return _this;
1341
+ }
1342
+ default_1.prototype.render = function () {
1343
+ return __awaiter(this, void 0, void 0, function () {
1344
+ return __generator(this, function (_a) {
1345
+ return [2 /*return*/, this.str];
1346
+ });
1347
+ });
1348
+ };
1349
+ return default_1;
1350
+ }(Template));
1351
+
1352
+ var Parser = /** @class */ (function () {
1353
+ function Parser(liquid) {
1354
+ this.liquid = liquid;
1355
+ }
1356
+ Parser.prototype.parse = function (tokens) {
1357
+ var token;
1358
+ var templates = [];
1359
+ while ((token = tokens.shift())) {
1360
+ templates.push(this.parseToken(token, tokens));
1361
+ }
1362
+ return templates;
1363
+ };
1364
+ Parser.prototype.parseToken = function (token, remainTokens) {
1365
+ try {
1366
+ if (TagToken.is(token)) {
1367
+ return new Tag(token, remainTokens, this.liquid);
1368
+ }
1369
+ if (OutputToken.is(token)) {
1370
+ return new Output(token, this.liquid.options.strictFilters);
1371
+ }
1372
+ return new default_1(token);
1373
+ }
1374
+ catch (e) {
1375
+ throw new ParseError(e, token);
1376
+ }
1377
+ };
1378
+ Parser.prototype.parseStream = function (tokens) {
1379
+ var _this = this;
1380
+ return new ParseStream(tokens, function (token, tokens) { return _this.parseToken(token, tokens); });
1381
+ };
1382
+ return Parser;
1383
+ }());
1384
+
1385
+ var re = new RegExp("(" + identifier.source + ")\\s*=([^]*)");
1386
+ var assign = {
1387
+ parse: function (token) {
1388
+ var match = token.args.match(re);
1389
+ assert(match, "illegal token " + token.raw);
1390
+ this.key = match[1];
1391
+ this.value = match[2];
1392
+ },
1393
+ render: function (ctx) {
1394
+ return __awaiter(this, void 0, void 0, function () {
1395
+ var _a, _b;
1396
+ return __generator(this, function (_c) {
1397
+ switch (_c.label) {
1398
+ case 0:
1399
+ _a = ctx.front();
1400
+ _b = this.key;
1401
+ return [4 /*yield*/, this.liquid.evalValue(this.value, ctx)];
1402
+ case 1:
1403
+ _a[_b] = _c.sent();
1404
+ return [2 /*return*/];
1405
+ }
1406
+ });
1407
+ });
1408
+ }
1409
+ };
1410
+
1411
+ var ForloopDrop = /** @class */ (function (_super) {
1412
+ __extends(ForloopDrop, _super);
1413
+ function ForloopDrop(length) {
1414
+ var _this = _super.call(this) || this;
1415
+ _this.i = 0;
1416
+ _this.length = length;
1417
+ return _this;
1418
+ }
1419
+ ForloopDrop.prototype.next = function () {
1420
+ this.i++;
1421
+ };
1422
+ ForloopDrop.prototype.index0 = function () {
1423
+ return this.i;
1424
+ };
1425
+ ForloopDrop.prototype.index = function () {
1426
+ return this.i + 1;
1427
+ };
1428
+ ForloopDrop.prototype.first = function () {
1429
+ return this.i === 0;
1430
+ };
1431
+ ForloopDrop.prototype.last = function () {
1432
+ return this.i === this.length - 1;
1433
+ };
1434
+ ForloopDrop.prototype.rindex = function () {
1435
+ return this.length - this.i;
1436
+ };
1437
+ ForloopDrop.prototype.rindex0 = function () {
1438
+ return this.length - this.i - 1;
1439
+ };
1440
+ ForloopDrop.prototype.valueOf = function () {
1441
+ return JSON.stringify(this);
1442
+ };
1443
+ return ForloopDrop;
1444
+ }(Drop));
1445
+
1446
+ var re$1 = new RegExp("^(" + identifier.source + ")\\s+in\\s+" +
1447
+ ("(" + value.source + ")") +
1448
+ ("(?:\\s+" + hash.source + ")*") +
1449
+ "(?:\\s+(reversed))?" +
1450
+ ("(?:\\s+" + hash.source + ")*$"));
1451
+ var For = {
1452
+ type: 'block',
1453
+ parse: function (tagToken, remainTokens) {
1454
+ var _this = this;
1455
+ var match = re$1.exec(tagToken.args);
1456
+ assert(match, "illegal tag: " + tagToken.raw);
1457
+ this.variable = match[1];
1458
+ this.collection = match[2];
1459
+ this.reversed = !!match[3];
1460
+ this.templates = [];
1461
+ this.elseTemplates = [];
1462
+ var p;
1463
+ var stream = this.liquid.parser.parseStream(remainTokens)
1464
+ .on('start', function () { return (p = _this.templates); })
1465
+ .on('tag:else', function () { return (p = _this.elseTemplates); })
1466
+ .on('tag:endfor', function () { return stream.stop(); })
1467
+ .on('template', function (tpl) { return p.push(tpl); })
1468
+ .on('end', function () {
1469
+ throw new Error("tag " + tagToken.raw + " not closed");
1470
+ });
1471
+ stream.start();
1472
+ },
1473
+ render: function (ctx, hash$$1) {
1474
+ return __awaiter(this, void 0, void 0, function () {
1475
+ var collection, offset, limit, context, html, _i, collection_1, item, _a, e_1;
1476
+ return __generator(this, function (_b) {
1477
+ switch (_b.label) {
1478
+ case 0: return [4 /*yield*/, evalExp(this.collection, ctx)];
1479
+ case 1:
1480
+ collection = _b.sent();
1481
+ if (!isArray(collection)) {
1482
+ if (isString(collection) && collection.length > 0) {
1483
+ collection = [collection];
1484
+ }
1485
+ else if (isObject(collection)) {
1486
+ collection = Object.keys(collection).map(function (key) { return [key, collection[key]]; });
1487
+ }
1488
+ }
1489
+ if (!isArray(collection) || !collection.length) {
1490
+ return [2 /*return*/, this.liquid.renderer.renderTemplates(this.elseTemplates, ctx)];
1491
+ }
1492
+ offset = hash$$1.offset || 0;
1493
+ limit = (hash$$1.limit === undefined) ? collection.length : hash$$1.limit;
1494
+ collection = collection.slice(offset, offset + limit);
1495
+ if (this.reversed)
1496
+ collection.reverse();
1497
+ context = { forloop: new ForloopDrop(collection.length) };
1498
+ ctx.push(context);
1499
+ html = '';
1500
+ _i = 0, collection_1 = collection;
1501
+ _b.label = 2;
1502
+ case 2:
1503
+ if (!(_i < collection_1.length)) return [3 /*break*/, 8];
1504
+ item = collection_1[_i];
1505
+ context[this.variable] = item;
1506
+ _b.label = 3;
1507
+ case 3:
1508
+ _b.trys.push([3, 5, , 6]);
1509
+ _a = html;
1510
+ return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, ctx)];
1511
+ case 4:
1512
+ html = _a + _b.sent();
1513
+ return [3 /*break*/, 6];
1514
+ case 5:
1515
+ e_1 = _b.sent();
1516
+ if (e_1.name === 'RenderBreakError') {
1517
+ html += e_1.resolvedHTML;
1518
+ if (e_1.message === 'break')
1519
+ return [3 /*break*/, 8];
1520
+ }
1521
+ else
1522
+ throw e_1;
1523
+ return [3 /*break*/, 6];
1524
+ case 6:
1525
+ context.forloop.next();
1526
+ _b.label = 7;
1527
+ case 7:
1528
+ _i++;
1529
+ return [3 /*break*/, 2];
1530
+ case 8:
1531
+ ctx.pop();
1532
+ return [2 /*return*/, html];
1533
+ }
1534
+ });
1535
+ });
1536
+ }
1537
+ };
1538
+
1539
+ var re$2 = new RegExp("(" + identifier.source + ")");
1540
+ var capture = {
1541
+ parse: function (tagToken, remainTokens) {
1542
+ var _this = this;
1543
+ var match = tagToken.args.match(re$2);
1544
+ assert(match, tagToken.args + " not valid identifier");
1545
+ this.variable = match[1];
1546
+ this.templates = [];
1547
+ var stream = this.liquid.parser.parseStream(remainTokens);
1548
+ stream.on('tag:endcapture', function () { return stream.stop(); })
1549
+ .on('template', function (tpl) { return _this.templates.push(tpl); })
1550
+ .on('end', function () {
1551
+ throw new Error("tag " + tagToken.raw + " not closed");
1552
+ });
1553
+ stream.start();
1554
+ },
1555
+ render: function (ctx) {
1556
+ return __awaiter(this, void 0, void 0, function () {
1557
+ var html;
1558
+ return __generator(this, function (_a) {
1559
+ switch (_a.label) {
1560
+ case 0: return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, ctx)];
1561
+ case 1:
1562
+ html = _a.sent();
1563
+ ctx.front()[this.variable] = html;
1564
+ return [2 /*return*/];
1565
+ }
1566
+ });
1567
+ });
1568
+ }
1569
+ };
1570
+
1571
+ var Case = {
1572
+ parse: function (tagToken, remainTokens) {
1573
+ var _this = this;
1574
+ this.cond = tagToken.args;
1575
+ this.cases = [];
1576
+ this.elseTemplates = [];
1577
+ var p = [];
1578
+ var stream = this.liquid.parser.parseStream(remainTokens)
1579
+ .on('tag:when', function (token) {
1580
+ _this.cases.push({
1581
+ val: token.args,
1582
+ templates: p = []
1583
+ });
1584
+ })
1585
+ .on('tag:else', function () { return (p = _this.elseTemplates); })
1586
+ .on('tag:endcase', function () { return stream.stop(); })
1587
+ .on('template', function (tpl) { return p.push(tpl); })
1588
+ .on('end', function () {
1589
+ throw new Error("tag " + tagToken.raw + " not closed");
1590
+ });
1591
+ stream.start();
1592
+ },
1593
+ render: function (ctx) {
1594
+ return __awaiter(this, void 0, void 0, function () {
1595
+ var i, branch, val, cond;
1596
+ return __generator(this, function (_a) {
1597
+ switch (_a.label) {
1598
+ case 0:
1599
+ i = 0;
1600
+ _a.label = 1;
1601
+ case 1:
1602
+ if (!(i < this.cases.length)) return [3 /*break*/, 5];
1603
+ branch = this.cases[i];
1604
+ return [4 /*yield*/, evalExp(branch.val, ctx)];
1605
+ case 2:
1606
+ val = _a.sent();
1607
+ return [4 /*yield*/, evalExp(this.cond, ctx)];
1608
+ case 3:
1609
+ cond = _a.sent();
1610
+ if (val === cond) {
1611
+ return [2 /*return*/, this.liquid.renderer.renderTemplates(branch.templates, ctx)];
1612
+ }
1613
+ _a.label = 4;
1614
+ case 4:
1615
+ i++;
1616
+ return [3 /*break*/, 1];
1617
+ case 5: return [2 /*return*/, this.liquid.renderer.renderTemplates(this.elseTemplates, ctx)];
1618
+ }
1619
+ });
1620
+ });
1621
+ }
1622
+ };
1623
+
1624
+ var comment = {
1625
+ parse: function (tagToken, remainTokens) {
1626
+ var stream = this.liquid.parser.parseStream(remainTokens);
1627
+ stream
1628
+ .on('token', function (token) {
1629
+ if (token.name === 'endcomment')
1630
+ stream.stop();
1631
+ })
1632
+ .on('end', function () {
1633
+ throw new Error("tag " + tagToken.raw + " not closed");
1634
+ });
1635
+ stream.start();
1636
+ }
1637
+ };
1638
+
1639
+ var BlockMode;
1640
+ (function (BlockMode) {
1641
+ /* store rendered html into blocks */
1642
+ BlockMode[BlockMode["OUTPUT"] = 0] = "OUTPUT";
1643
+ /* output rendered html directly */
1644
+ BlockMode[BlockMode["STORE"] = 1] = "STORE";
1645
+ })(BlockMode || (BlockMode = {}));
1646
+ var BlockMode$1 = BlockMode;
1647
+
1648
+ var staticFileRE = /[^\s,]+/;
1649
+ var withRE = new RegExp("with\\s+(" + value.source + ")");
1650
+ var include = {
1651
+ parse: function (token) {
1652
+ var match = staticFileRE.exec(token.args);
1653
+ if (match) {
1654
+ this.staticValue = match[0];
1655
+ }
1656
+ match = value.exec(token.args);
1657
+ if (match) {
1658
+ this.value = match[0];
1659
+ }
1660
+ match = withRE.exec(token.args);
1661
+ if (match) {
1662
+ this.with = match[1];
1663
+ }
1664
+ },
1665
+ render: function (ctx, hash$$1) {
1666
+ return __awaiter(this, void 0, void 0, function () {
1667
+ var filepath, template, originBlocks, originBlockMode, _a, _b, templates, html;
1668
+ return __generator(this, function (_c) {
1669
+ switch (_c.label) {
1670
+ case 0:
1671
+ if (!ctx.opts.dynamicPartials) return [3 /*break*/, 5];
1672
+ if (!quotedLine.exec(this.value)) return [3 /*break*/, 2];
1673
+ template = this.value.slice(1, -1);
1674
+ return [4 /*yield*/, this.liquid.parseAndRender(template, ctx.getAll(), ctx.opts)];
1675
+ case 1:
1676
+ filepath = _c.sent();
1677
+ return [3 /*break*/, 4];
1678
+ case 2: return [4 /*yield*/, evalValue(this.value, ctx)];
1679
+ case 3:
1680
+ filepath = _c.sent();
1681
+ _c.label = 4;
1682
+ case 4: return [3 /*break*/, 6];
1683
+ case 5:
1684
+ filepath = this.staticValue;
1685
+ _c.label = 6;
1686
+ case 6:
1687
+ assert(filepath, "cannot include with empty filename");
1688
+ originBlocks = ctx.getRegister('blocks');
1689
+ originBlockMode = ctx.getRegister('blockMode');
1690
+ ctx.setRegister('blocks', {});
1691
+ ctx.setRegister('blockMode', BlockMode$1.OUTPUT);
1692
+ if (!this.with) return [3 /*break*/, 8];
1693
+ _a = hash$$1;
1694
+ _b = filepath;
1695
+ return [4 /*yield*/, evalValue(this.with, ctx)];
1696
+ case 7:
1697
+ _a[_b] = _c.sent();
1698
+ _c.label = 8;
1699
+ case 8: return [4 /*yield*/, this.liquid.getTemplate(filepath, ctx.opts)];
1700
+ case 9:
1701
+ templates = _c.sent();
1702
+ ctx.push(hash$$1);
1703
+ return [4 /*yield*/, this.liquid.renderer.renderTemplates(templates, ctx)];
1704
+ case 10:
1705
+ html = _c.sent();
1706
+ ctx.pop();
1707
+ ctx.setRegister('blocks', originBlocks);
1708
+ ctx.setRegister('blockMode', originBlockMode);
1709
+ return [2 /*return*/, html];
1710
+ }
1711
+ });
1712
+ });
1713
+ }
1714
+ };
1715
+
1716
+ var decrement = {
1717
+ parse: function (token) {
1718
+ var match = token.args.match(identifier);
1719
+ assert(match, "illegal identifier " + token.args);
1720
+ this.variable = match[0];
1721
+ },
1722
+ render: function (context) {
1723
+ var scope = context.environments;
1724
+ if (typeof scope[this.variable] !== 'number') {
1725
+ scope[this.variable] = 0;
1726
+ }
1727
+ return --scope[this.variable];
1728
+ }
1729
+ };
1730
+
1731
+ var groupRE = new RegExp("^(?:(" + value.source + ")\\s*:\\s*)?(.*)$");
1732
+ var candidatesRE = new RegExp(value.source, 'g');
1733
+ var cycle = {
1734
+ parse: function (tagToken) {
1735
+ var match = groupRE.exec(tagToken.args);
1736
+ assert(match, "illegal tag: " + tagToken.raw);
1737
+ this.group = match[1] || '';
1738
+ var candidates = match[2];
1739
+ this.candidates = [];
1740
+ while ((match = candidatesRE.exec(candidates))) {
1741
+ this.candidates.push(match[0]);
1742
+ }
1743
+ assert(this.candidates.length, "empty candidates: " + tagToken.raw);
1744
+ },
1745
+ render: function (ctx) {
1746
+ return __awaiter(this, void 0, void 0, function () {
1747
+ var group, fingerprint, groups, idx, candidate;
1748
+ return __generator(this, function (_a) {
1749
+ switch (_a.label) {
1750
+ case 0: return [4 /*yield*/, evalValue(this.group, ctx)];
1751
+ case 1:
1752
+ group = _a.sent();
1753
+ fingerprint = "cycle:" + group + ":" + this.candidates.join(',');
1754
+ groups = ctx.getRegister('cycle');
1755
+ idx = groups[fingerprint];
1756
+ if (idx === undefined) {
1757
+ idx = groups[fingerprint] = 0;
1758
+ }
1759
+ candidate = this.candidates[idx];
1760
+ idx = (idx + 1) % this.candidates.length;
1761
+ groups[fingerprint] = idx;
1762
+ return [2 /*return*/, evalValue(candidate, ctx)];
1763
+ }
1764
+ });
1765
+ });
1766
+ }
1767
+ };
1768
+
1769
+ var If = {
1770
+ parse: function (tagToken, remainTokens) {
1771
+ var _this = this;
1772
+ this.branches = [];
1773
+ this.elseTemplates = [];
1774
+ var p;
1775
+ var stream = this.liquid.parser.parseStream(remainTokens)
1776
+ .on('start', function () { return _this.branches.push({
1777
+ cond: tagToken.args,
1778
+ templates: (p = [])
1779
+ }); })
1780
+ .on('tag:elsif', function (token) {
1781
+ _this.branches.push({
1782
+ cond: token.args,
1783
+ templates: p = []
1784
+ });
1785
+ })
1786
+ .on('tag:else', function () { return (p = _this.elseTemplates); })
1787
+ .on('tag:endif', function () { return stream.stop(); })
1788
+ .on('template', function (tpl) { return p.push(tpl); })
1789
+ .on('end', function () {
1790
+ throw new Error("tag " + tagToken.raw + " not closed");
1791
+ });
1792
+ stream.start();
1793
+ },
1794
+ render: function (ctx) {
1795
+ return __awaiter(this, void 0, void 0, function () {
1796
+ var _i, _a, branch, cond;
1797
+ return __generator(this, function (_b) {
1798
+ switch (_b.label) {
1799
+ case 0:
1800
+ _i = 0, _a = this.branches;
1801
+ _b.label = 1;
1802
+ case 1:
1803
+ if (!(_i < _a.length)) return [3 /*break*/, 4];
1804
+ branch = _a[_i];
1805
+ return [4 /*yield*/, evalExp(branch.cond, ctx)];
1806
+ case 2:
1807
+ cond = _b.sent();
1808
+ if (isTruthy(cond)) {
1809
+ return [2 /*return*/, this.liquid.renderer.renderTemplates(branch.templates, ctx)];
1810
+ }
1811
+ _b.label = 3;
1812
+ case 3:
1813
+ _i++;
1814
+ return [3 /*break*/, 1];
1815
+ case 4: return [2 /*return*/, this.liquid.renderer.renderTemplates(this.elseTemplates, ctx)];
1816
+ }
1817
+ });
1818
+ });
1819
+ }
1820
+ };
1821
+
1822
+ var increment = {
1823
+ parse: function (token) {
1824
+ var match = token.args.match(identifier);
1825
+ assert(match, "illegal identifier " + token.args);
1826
+ this.variable = match[0];
1827
+ },
1828
+ render: function (context) {
1829
+ var scope = context.environments;
1830
+ if (typeof scope[this.variable] !== 'number') {
1831
+ scope[this.variable] = 0;
1832
+ }
1833
+ var val = scope[this.variable];
1834
+ scope[this.variable]++;
1835
+ return val;
1836
+ }
1837
+ };
1838
+
1839
+ var staticFileRE$1 = /\S+/;
1840
+ var layout = {
1841
+ parse: function (token, remainTokens) {
1842
+ var match = staticFileRE$1.exec(token.args);
1843
+ if (match) {
1844
+ this.staticLayout = match[0];
1845
+ }
1846
+ match = value.exec(token.args);
1847
+ if (match) {
1848
+ this.layout = match[0];
1849
+ }
1850
+ this.tpls = this.liquid.parser.parse(remainTokens);
1851
+ },
1852
+ render: function (ctx, hash$$1) {
1853
+ return __awaiter(this, void 0, void 0, function () {
1854
+ var layout, _a, blocks, html, templates, partial;
1855
+ return __generator(this, function (_b) {
1856
+ switch (_b.label) {
1857
+ case 0:
1858
+ if (!ctx.opts.dynamicPartials) return [3 /*break*/, 2];
1859
+ return [4 /*yield*/, evalValue(this.layout, ctx)];
1860
+ case 1:
1861
+ _a = _b.sent();
1862
+ return [3 /*break*/, 3];
1863
+ case 2:
1864
+ _a = this.staticLayout;
1865
+ _b.label = 3;
1866
+ case 3:
1867
+ layout = _a;
1868
+ assert(layout, "cannot apply layout with empty filename");
1869
+ // render the remaining tokens immediately
1870
+ ctx.setRegister('blockMode', BlockMode$1.STORE);
1871
+ blocks = ctx.getRegister('blocks');
1872
+ return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.tpls, ctx)];
1873
+ case 4:
1874
+ html = _b.sent();
1875
+ if (blocks[''] === undefined) {
1876
+ blocks[''] = html;
1877
+ }
1878
+ return [4 /*yield*/, this.liquid.getTemplate(layout, ctx.opts)];
1879
+ case 5:
1880
+ templates = _b.sent();
1881
+ ctx.push(hash$$1);
1882
+ ctx.setRegister('blockMode', BlockMode$1.OUTPUT);
1883
+ return [4 /*yield*/, this.liquid.renderer.renderTemplates(templates, ctx)];
1884
+ case 6:
1885
+ partial = _b.sent();
1886
+ ctx.pop();
1887
+ return [2 /*return*/, partial];
1888
+ }
1889
+ });
1890
+ });
1891
+ }
1892
+ };
1893
+
1894
+ var block = {
1895
+ parse: function (token, remainTokens) {
1896
+ var _this = this;
1897
+ var match = /\w+/.exec(token.args);
1898
+ this.block = match ? match[0] : '';
1899
+ this.tpls = [];
1900
+ var stream = this.liquid.parser.parseStream(remainTokens)
1901
+ .on('tag:endblock', function () { return stream.stop(); })
1902
+ .on('template', function (tpl) { return _this.tpls.push(tpl); })
1903
+ .on('end', function () {
1904
+ throw new Error("tag " + token.raw + " not closed");
1905
+ });
1906
+ stream.start();
1907
+ },
1908
+ render: function (ctx) {
1909
+ return __awaiter(this, void 0, void 0, function () {
1910
+ var blocks, childDefined, html, _a;
1911
+ return __generator(this, function (_b) {
1912
+ switch (_b.label) {
1913
+ case 0:
1914
+ blocks = ctx.getRegister('blocks');
1915
+ childDefined = blocks[this.block];
1916
+ if (!(childDefined !== undefined)) return [3 /*break*/, 1];
1917
+ _a = childDefined;
1918
+ return [3 /*break*/, 3];
1919
+ case 1: return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.tpls, ctx)];
1920
+ case 2:
1921
+ _a = _b.sent();
1922
+ _b.label = 3;
1923
+ case 3:
1924
+ html = _a;
1925
+ if (ctx.getRegister('blockMode', BlockMode$1.OUTPUT) === BlockMode$1.STORE) {
1926
+ blocks[this.block] = html;
1927
+ return [2 /*return*/, ''];
1928
+ }
1929
+ return [2 /*return*/, html];
1930
+ }
1931
+ });
1932
+ });
1933
+ }
1934
+ };
1935
+
1936
+ var raw = {
1937
+ parse: function (tagToken, remainTokens) {
1938
+ var _this = this;
1939
+ this.tokens = [];
1940
+ var stream = this.liquid.parser.parseStream(remainTokens);
1941
+ stream
1942
+ .on('token', function (token) {
1943
+ if (token.name === 'endraw')
1944
+ stream.stop();
1945
+ else
1946
+ _this.tokens.push(token);
1947
+ })
1948
+ .on('end', function () {
1949
+ throw new Error("tag " + tagToken.raw + " not closed");
1950
+ });
1951
+ stream.start();
1952
+ },
1953
+ render: function () {
1954
+ return this.tokens.map(function (token) { return token.raw; }).join('');
1955
+ }
1956
+ };
1957
+
1958
+ var TablerowloopDrop = /** @class */ (function (_super) {
1959
+ __extends(TablerowloopDrop, _super);
1960
+ function TablerowloopDrop(length, cols) {
1961
+ var _this = _super.call(this, length) || this;
1962
+ _this.length = length;
1963
+ _this.cols = cols;
1964
+ return _this;
1965
+ }
1966
+ TablerowloopDrop.prototype.row = function () {
1967
+ return Math.floor(this.i / this.cols) + 1;
1968
+ };
1969
+ TablerowloopDrop.prototype.col0 = function () {
1970
+ return (this.i % this.cols);
1971
+ };
1972
+ TablerowloopDrop.prototype.col = function () {
1973
+ return this.col0() + 1;
1974
+ };
1975
+ TablerowloopDrop.prototype.col_first = function () {
1976
+ return this.col0() === 0;
1977
+ };
1978
+ TablerowloopDrop.prototype.col_last = function () {
1979
+ return this.col() === this.cols;
1980
+ };
1981
+ return TablerowloopDrop;
1982
+ }(ForloopDrop));
1983
+
1984
+ var re$3 = new RegExp("^(" + identifier.source + ")\\s+in\\s+" +
1985
+ ("(" + value.source + ")") +
1986
+ ("(?:\\s+" + hash.source + ")*$"));
1987
+ var tablerow = {
1988
+ parse: function (tagToken, remainTokens) {
1989
+ var _this = this;
1990
+ var match = re$3.exec(tagToken.args);
1991
+ assert(match, "illegal tag: " + tagToken.raw);
1992
+ this.variable = match[1];
1993
+ this.collection = match[2];
1994
+ this.templates = [];
1995
+ var p;
1996
+ var stream = this.liquid.parser.parseStream(remainTokens)
1997
+ .on('start', function () { return (p = _this.templates); })
1998
+ .on('tag:endtablerow', function () { return stream.stop(); })
1999
+ .on('template', function (tpl) { return p.push(tpl); })
2000
+ .on('end', function () {
2001
+ throw new Error("tag " + tagToken.raw + " not closed");
2002
+ });
2003
+ stream.start();
2004
+ },
2005
+ render: function (ctx, hash$$1) {
2006
+ return __awaiter(this, void 0, void 0, function () {
2007
+ var collection, offset, limit, cols, tablerowloop, scope, html, idx, _a;
2008
+ return __generator(this, function (_b) {
2009
+ switch (_b.label) {
2010
+ case 0: return [4 /*yield*/, evalExp(this.collection, ctx)];
2011
+ case 1:
2012
+ collection = (_b.sent()) || [];
2013
+ offset = hash$$1.offset || 0;
2014
+ limit = (hash$$1.limit === undefined) ? collection.length : hash$$1.limit;
2015
+ collection = collection.slice(offset, offset + limit);
2016
+ cols = hash$$1.cols || collection.length;
2017
+ tablerowloop = new TablerowloopDrop(collection.length, cols);
2018
+ scope = { tablerowloop: tablerowloop };
2019
+ ctx.push(scope);
2020
+ html = '';
2021
+ idx = 0;
2022
+ _b.label = 2;
2023
+ case 2:
2024
+ if (!(idx < collection.length)) return [3 /*break*/, 5];
2025
+ scope[this.variable] = collection[idx];
2026
+ if (tablerowloop.col0() === 0) {
2027
+ if (tablerowloop.row() !== 1)
2028
+ html += '</tr>';
2029
+ html += "<tr class=\"row" + tablerowloop.row() + "\">";
2030
+ }
2031
+ html += "<td class=\"col" + tablerowloop.col() + "\">";
2032
+ _a = html;
2033
+ return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, ctx)];
2034
+ case 3:
2035
+ html = _a + _b.sent();
2036
+ html += '</td>';
2037
+ _b.label = 4;
2038
+ case 4:
2039
+ idx++, tablerowloop.next();
2040
+ return [3 /*break*/, 2];
2041
+ case 5:
2042
+ if (collection.length)
2043
+ html += '</tr>';
2044
+ ctx.pop();
2045
+ return [2 /*return*/, html];
2046
+ }
2047
+ });
2048
+ });
2049
+ }
2050
+ };
2051
+
2052
+ var unless = {
2053
+ parse: function (tagToken, remainTokens) {
2054
+ var _this = this;
2055
+ this.templates = [];
2056
+ this.elseTemplates = [];
2057
+ var p;
2058
+ var stream = this.liquid.parser.parseStream(remainTokens)
2059
+ .on('start', function () {
2060
+ p = _this.templates;
2061
+ _this.cond = tagToken.args;
2062
+ })
2063
+ .on('tag:else', function () { return (p = _this.elseTemplates); })
2064
+ .on('tag:endunless', function () { return stream.stop(); })
2065
+ .on('template', function (tpl) { return p.push(tpl); })
2066
+ .on('end', function () {
2067
+ throw new Error("tag " + tagToken.raw + " not closed");
2068
+ });
2069
+ stream.start();
2070
+ },
2071
+ render: function (ctx) {
2072
+ return __awaiter(this, void 0, void 0, function () {
2073
+ var cond;
2074
+ return __generator(this, function (_a) {
2075
+ switch (_a.label) {
2076
+ case 0: return [4 /*yield*/, evalExp(this.cond, ctx)];
2077
+ case 1:
2078
+ cond = _a.sent();
2079
+ return [2 /*return*/, isFalsy(cond)
2080
+ ? this.liquid.renderer.renderTemplates(this.templates, ctx)
2081
+ : this.liquid.renderer.renderTemplates(this.elseTemplates, ctx)];
2082
+ }
2083
+ });
2084
+ });
2085
+ }
2086
+ };
2087
+
2088
+ var Break = {
2089
+ render: function () {
2090
+ return __awaiter(this, void 0, void 0, function () {
2091
+ return __generator(this, function (_a) {
2092
+ throw new RenderBreakError('break');
2093
+ });
2094
+ });
2095
+ }
2096
+ };
2097
+
2098
+ var Continue = {
2099
+ render: function () {
2100
+ return __awaiter(this, void 0, void 0, function () {
2101
+ return __generator(this, function (_a) {
2102
+ throw new RenderBreakError('continue');
2103
+ });
2104
+ });
2105
+ }
2106
+ };
2107
+
2108
+ var tags = {
2109
+ assign: assign, 'for': For, capture: capture, 'case': Case, comment: comment, include: include, decrement: decrement, increment: increment, cycle: cycle, 'if': If, layout: layout, block: block, raw: raw, tablerow: tablerow, unless: unless, 'break': Break, 'continue': Continue
2110
+ };
2111
+
2112
+ var escapeMap = {
2113
+ '&': '&amp;',
2114
+ '<': '&lt;',
2115
+ '>': '&gt;',
2116
+ '"': '&#34;',
2117
+ "'": '&#39;'
2118
+ };
2119
+ var unescapeMap = {
2120
+ '&amp;': '&',
2121
+ '&lt;': '<',
2122
+ '&gt;': '>',
2123
+ '&#34;': '"',
2124
+ '&#39;': "'"
2125
+ };
2126
+ function escape(str) {
2127
+ return String(str).replace(/&|<|>|"|'/g, function (m) { return escapeMap[m]; });
2128
+ }
2129
+ function unescape(str) {
2130
+ return String(str).replace(/&(amp|lt|gt|#34|#39);/g, function (m) { return unescapeMap[m]; });
2131
+ }
2132
+ var html = {
2133
+ 'escape': escape,
2134
+ 'escape_once': function (str) { return escape(unescape(str)); },
2135
+ 'newline_to_br': function (v) { return v.replace(/\n/g, '<br />'); },
2136
+ 'strip_html': function (v) { return v.replace(/<script.*?<\/script>|<!--.*?-->|<style.*?<\/style>|<.*?>/g, ''); }
2137
+ };
2138
+
2139
+ var str = {
2140
+ 'append': function (v, arg) { return v + arg; },
2141
+ 'prepend': function (v, arg) { return arg + v; },
2142
+ 'capitalize': function (str) { return String(str).charAt(0).toUpperCase() + str.slice(1); },
2143
+ 'lstrip': function (v) { return String(v).replace(/^\s+/, ''); },
2144
+ 'downcase': function (v) { return v.toLowerCase(); },
2145
+ 'upcase': function (str) { return String(str).toUpperCase(); },
2146
+ 'remove': function (v, arg) { return v.split(arg).join(''); },
2147
+ 'remove_first': function (v, l) { return v.replace(l, ''); },
2148
+ 'replace': function (v, pattern, replacement) {
2149
+ return String(v).split(pattern).join(replacement);
2150
+ },
2151
+ 'replace_first': function (v, arg1, arg2) { return String(v).replace(arg1, arg2); },
2152
+ 'rstrip': function (str) { return String(str).replace(/\s+$/, ''); },
2153
+ 'split': function (v, arg) { return String(v).split(arg); },
2154
+ 'strip': function (v) { return String(v).trim(); },
2155
+ 'strip_newlines': function (v) { return String(v).replace(/\n/g, ''); },
2156
+ 'truncate': function (v, l, o) {
2157
+ if (l === void 0) { l = 50; }
2158
+ if (o === void 0) { o = '...'; }
2159
+ v = String(v);
2160
+ if (v.length <= l)
2161
+ return v;
2162
+ return v.substr(0, l - o.length) + o;
2163
+ },
2164
+ 'truncatewords': function (v, l, o) {
2165
+ if (l === void 0) { l = 15; }
2166
+ if (o === void 0) { o = '...'; }
2167
+ var arr = v.split(/\s+/);
2168
+ var ret = arr.slice(0, l).join(' ');
2169
+ if (arr.length >= l)
2170
+ ret += o;
2171
+ return ret;
2172
+ }
2173
+ };
2174
+
2175
+ var math = {
2176
+ 'abs': function (v) { return Math.abs(v); },
2177
+ 'ceil': function (v) { return Math.ceil(v); },
2178
+ 'divided_by': function (v, arg) { return v / arg; },
2179
+ 'floor': function (v) { return Math.floor(v); },
2180
+ 'minus': function (v, arg) { return v - arg; },
2181
+ 'modulo': function (v, arg) { return v % arg; },
2182
+ 'round': function (v, arg) {
2183
+ if (arg === void 0) { arg = 0; }
2184
+ var amp = Math.pow(10, arg);
2185
+ return Math.round(v * amp) / amp;
2186
+ },
2187
+ 'plus': function (v, arg) { return Number(v) + Number(arg); },
2188
+ 'times': function (v, arg) { return v * arg; }
2189
+ };
2190
+
2191
+ var url = {
2192
+ 'url_decode': function (x) { return x.split('+').map(decodeURIComponent).join(' '); },
2193
+ 'url_encode': function (x) { return x.split(' ').map(encodeURIComponent).join('+'); }
2194
+ };
2195
+
2196
+ var array = {
2197
+ 'join': function (v, arg) { return v.join(arg === undefined ? ' ' : arg); },
2198
+ 'last': function (v) { return last(v); },
2199
+ 'first': function (v) { return v[0]; },
2200
+ 'map': function (arr, arg) { return arr.map(function (v) { return v[arg]; }); },
2201
+ 'reverse': function (v) { return v.reverse(); },
2202
+ 'sort': function (v, arg) { return v.sort(arg); },
2203
+ 'size': function (v) { return v.length; },
2204
+ 'concat': function (v, arg) { return Array.prototype.concat.call(v, arg); },
2205
+ 'slice': function (v, begin, length) {
2206
+ if (length === void 0) { length = 1; }
2207
+ begin = begin < 0 ? v.length + begin : begin;
2208
+ return v.slice(begin, begin + length);
2209
+ },
2210
+ 'uniq': function (arr) {
2211
+ var u = {};
2212
+ return (arr || []).filter(function (val) {
2213
+ if (u.hasOwnProperty(String(val)))
2214
+ return false;
2215
+ u[String(val)] = true;
2216
+ return true;
2217
+ });
2218
+ },
2219
+ 'where': function (arr, property, value) {
2220
+ return arr.filter(function (obj) { return value === undefined ? isTruthy(obj[property]) : obj[property] === value; });
2221
+ }
2222
+ };
2223
+
2224
+ var monthNames = [
2225
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
2226
+ 'September', 'October', 'November', 'December'
2227
+ ];
2228
+ var dayNames = [
2229
+ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
2230
+ ];
2231
+ var monthNamesShort = monthNames.map(abbr);
2232
+ var dayNamesShort = dayNames.map(abbr);
2233
+ var suffixes = {
2234
+ 1: 'st',
2235
+ 2: 'nd',
2236
+ 3: 'rd',
2237
+ 'default': 'th'
2238
+ };
2239
+ function abbr(str) {
2240
+ return str.slice(0, 3);
2241
+ }
2242
+ // prototype extensions
2243
+ var _date = {
2244
+ daysInMonth: function (d) {
2245
+ var feb = _date.isLeapYear(d) ? 29 : 28;
2246
+ return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
2247
+ },
2248
+ getDayOfYear: function (d) {
2249
+ var num = 0;
2250
+ for (var i = 0; i < d.getMonth(); ++i) {
2251
+ num += _date.daysInMonth(d)[i];
2252
+ }
2253
+ return num + d.getDate();
2254
+ },
2255
+ getWeekOfYear: function (d, startDay) {
2256
+ // Skip to startDay of this week
2257
+ var now = this.getDayOfYear(d) + (startDay - d.getDay());
2258
+ // Find the first startDay of the year
2259
+ var jan1 = new Date(d.getFullYear(), 0, 1);
2260
+ var then = (7 - jan1.getDay() + startDay);
2261
+ return padStart(String(Math.floor((now - then) / 7) + 1), 2, '0');
2262
+ },
2263
+ isLeapYear: function (d) {
2264
+ var year = d.getFullYear();
2265
+ return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)));
2266
+ },
2267
+ getSuffix: function (d) {
2268
+ var str = d.getDate().toString();
2269
+ var index = parseInt(str.slice(-1));
2270
+ return suffixes[index] || suffixes['default'];
2271
+ },
2272
+ century: function (d) {
2273
+ return parseInt(d.getFullYear().toString().substring(0, 2), 10);
2274
+ }
2275
+ };
2276
+ var formatCodes = {
2277
+ a: function (d) {
2278
+ return dayNamesShort[d.getDay()];
2279
+ },
2280
+ A: function (d) {
2281
+ return dayNames[d.getDay()];
2282
+ },
2283
+ b: function (d) {
2284
+ return monthNamesShort[d.getMonth()];
2285
+ },
2286
+ B: function (d) {
2287
+ return monthNames[d.getMonth()];
2288
+ },
2289
+ c: function (d) {
2290
+ return d.toLocaleString();
2291
+ },
2292
+ C: function (d) {
2293
+ return _date.century(d);
2294
+ },
2295
+ d: function (d) {
2296
+ return padStart(d.getDate(), 2, '0');
2297
+ },
2298
+ e: function (d) {
2299
+ return padStart(d.getDate(), 2);
2300
+ },
2301
+ H: function (d) {
2302
+ return padStart(d.getHours(), 2, '0');
2303
+ },
2304
+ I: function (d) {
2305
+ return padStart(String(d.getHours() % 12 || 12), 2, '0');
2306
+ },
2307
+ j: function (d) {
2308
+ return padStart(_date.getDayOfYear(d), 3, '0');
2309
+ },
2310
+ k: function (d) {
2311
+ return padStart(d.getHours(), 2);
2312
+ },
2313
+ l: function (d) {
2314
+ return padStart(String(d.getHours() % 12 || 12), 2);
2315
+ },
2316
+ L: function (d) {
2317
+ return padStart(d.getMilliseconds(), 3, '0');
2318
+ },
2319
+ m: function (d) {
2320
+ return padStart(d.getMonth() + 1, 2, '0');
2321
+ },
2322
+ M: function (d) {
2323
+ return padStart(d.getMinutes(), 2, '0');
2324
+ },
2325
+ p: function (d) {
2326
+ return (d.getHours() < 12 ? 'AM' : 'PM');
2327
+ },
2328
+ P: function (d) {
2329
+ return (d.getHours() < 12 ? 'am' : 'pm');
2330
+ },
2331
+ q: function (d) {
2332
+ return _date.getSuffix(d);
2333
+ },
2334
+ s: function (d) {
2335
+ return Math.round(d.valueOf() / 1000);
2336
+ },
2337
+ S: function (d) {
2338
+ return padStart(d.getSeconds(), 2, '0');
2339
+ },
2340
+ u: function (d) {
2341
+ return d.getDay() || 7;
2342
+ },
2343
+ U: function (d) {
2344
+ return _date.getWeekOfYear(d, 0);
2345
+ },
2346
+ w: function (d) {
2347
+ return d.getDay();
2348
+ },
2349
+ W: function (d) {
2350
+ return _date.getWeekOfYear(d, 1);
2351
+ },
2352
+ x: function (d) {
2353
+ return d.toLocaleDateString();
2354
+ },
2355
+ X: function (d) {
2356
+ return d.toLocaleTimeString();
2357
+ },
2358
+ y: function (d) {
2359
+ return d.getFullYear().toString().substring(2, 4);
2360
+ },
2361
+ Y: function (d) {
2362
+ return d.getFullYear();
2363
+ },
2364
+ z: function (d) {
2365
+ var tz = d.getTimezoneOffset() / 60 * 100;
2366
+ return (tz > 0 ? '-' : '+') + padStart(String(Math.abs(tz)), 4, '0');
2367
+ },
2368
+ '%': function () {
2369
+ return '%';
2370
+ }
2371
+ };
2372
+ formatCodes.h = formatCodes.b;
2373
+ formatCodes.N = formatCodes.L;
2374
+ function strftime (d, format) {
2375
+ var output = '';
2376
+ var remaining = format;
2377
+ while (true) {
2378
+ var r = /%./g;
2379
+ var results = r.exec(remaining);
2380
+ // No more format codes. Add the remaining text and return
2381
+ if (!results) {
2382
+ return output + remaining;
2383
+ }
2384
+ // Add the preceding text
2385
+ output += remaining.slice(0, r.lastIndex - 2);
2386
+ remaining = remaining.slice(r.lastIndex);
2387
+ // Add the format code
2388
+ var ch = results[0].charAt(1);
2389
+ var func = formatCodes[ch];
2390
+ output += func ? func(d) : '%' + ch;
2391
+ }
2392
+ }
2393
+
2394
+ var date = {
2395
+ 'date': function (v, arg) {
2396
+ var date = v;
2397
+ if (v === 'now') {
2398
+ date = new Date();
2399
+ }
2400
+ else if (isString(v)) {
2401
+ date = new Date(v);
2402
+ }
2403
+ return isValidDate(date) ? strftime(date, arg) : v;
2404
+ }
2405
+ };
2406
+ function isValidDate(date) {
2407
+ return date instanceof Date && !isNaN(date.getTime());
2408
+ }
2409
+
2410
+ var obj = {
2411
+ 'default': function (v, arg) { return isTruthy(v) ? v : arg; }
2412
+ };
2413
+
2414
+ var builtinFilters = __assign({}, html, str, math, url, date, obj, array);
2415
+
2416
+ var Liquid = /** @class */ (function () {
2417
+ function Liquid(opts) {
2418
+ if (opts === void 0) { opts = {}; }
2419
+ var _this = this;
2420
+ this.cache = {};
2421
+ this.options = applyDefault(normalize(opts));
2422
+ this.parser = new Parser(this);
2423
+ this.renderer = new Render();
2424
+ this.tokenizer = new Tokenizer(this.options);
2425
+ forOwn(tags, function (conf, name) { return _this.registerTag(name, conf); });
2426
+ forOwn(builtinFilters, function (handler, name) { return _this.registerFilter(name, handler); });
2427
+ }
2428
+ Liquid.prototype.parse = function (html, filepath) {
2429
+ var tokens = this.tokenizer.tokenize(html, filepath);
2430
+ return this.parser.parse(tokens);
2431
+ };
2432
+ Liquid.prototype.render = function (tpl, ctx, opts) {
2433
+ var options = __assign({}, this.options, normalize(opts));
2434
+ var scope = new Context(ctx, options);
2435
+ return this.renderer.renderTemplates(tpl, scope);
2436
+ };
2437
+ Liquid.prototype.parseAndRender = function (html, ctx, opts) {
2438
+ return __awaiter(this, void 0, void 0, function () {
2439
+ var tpl;
2440
+ return __generator(this, function (_a) {
2441
+ switch (_a.label) {
2442
+ case 0: return [4 /*yield*/, this.parse(html)];
2443
+ case 1:
2444
+ tpl = _a.sent();
2445
+ return [2 /*return*/, this.render(tpl, ctx, opts)];
2446
+ }
2447
+ });
2448
+ });
2449
+ };
2450
+ Liquid.prototype.getTemplate = function (file, opts) {
2451
+ return __awaiter(this, void 0, void 0, function () {
2452
+ var options, roots, paths, _i, paths_1, filepath, value, _a, err;
2453
+ var _this = this;
2454
+ return __generator(this, function (_b) {
2455
+ switch (_b.label) {
2456
+ case 0:
2457
+ options = normalize(opts);
2458
+ roots = options.root ? options.root.concat(this.options.root) : this.options.root;
2459
+ paths = roots.map(function (root) { return fs.resolve(root, file, _this.options.extname); });
2460
+ _i = 0, paths_1 = paths;
2461
+ _b.label = 1;
2462
+ case 1:
2463
+ if (!(_i < paths_1.length)) return [3 /*break*/, 5];
2464
+ filepath = paths_1[_i];
2465
+ return [4 /*yield*/, fs.exists(filepath)];
2466
+ case 2:
2467
+ if (!(_b.sent()))
2468
+ return [3 /*break*/, 4];
2469
+ if (this.options.cache && this.cache[filepath])
2470
+ return [2 /*return*/, this.cache[filepath]];
2471
+ _a = this.parse;
2472
+ return [4 /*yield*/, fs.readFile(filepath)];
2473
+ case 3:
2474
+ value = _a.apply(this, [_b.sent(), filepath]);
2475
+ if (this.options.cache)
2476
+ this.cache[filepath] = value;
2477
+ return [2 /*return*/, value];
2478
+ case 4:
2479
+ _i++;
2480
+ return [3 /*break*/, 1];
2481
+ case 5:
2482
+ err = new Error('ENOENT');
2483
+ err.message = "ENOENT: Failed to lookup \"" + file + "\" in \"" + roots + "\"";
2484
+ err.code = 'ENOENT';
2485
+ throw err;
2486
+ }
2487
+ });
2488
+ });
2489
+ };
2490
+ Liquid.prototype.renderFile = function (file, ctx, opts) {
2491
+ return __awaiter(this, void 0, void 0, function () {
2492
+ var options, templates;
2493
+ return __generator(this, function (_a) {
2494
+ switch (_a.label) {
2495
+ case 0:
2496
+ options = normalize(opts);
2497
+ return [4 /*yield*/, this.getTemplate(file, options)];
2498
+ case 1:
2499
+ templates = _a.sent();
2500
+ return [2 /*return*/, this.render(templates, ctx, opts)];
2501
+ }
2502
+ });
2503
+ });
2504
+ };
2505
+ Liquid.prototype.evalValue = function (str, ctx) {
2506
+ return new Value(str, this.options.strictFilters).value(ctx);
2507
+ };
2508
+ Liquid.prototype.registerFilter = function (name, filter) {
2509
+ return Filter.register(name, filter);
2510
+ };
2511
+ Liquid.prototype.registerTag = function (name, tag) {
2512
+ return Tag.register(name, tag);
2513
+ };
2514
+ Liquid.prototype.plugin = function (plugin) {
2515
+ return plugin.call(this, Liquid);
2516
+ };
2517
+ Liquid.prototype.express = function () {
2518
+ var self = this;
2519
+ return function (filePath, ctx, cb) {
2520
+ var opts = { root: this.root };
2521
+ self.renderFile(filePath, ctx, opts).then(function (html) { return cb(null, html); }, cb);
2522
+ };
2523
+ };
2524
+ Liquid.default = Liquid;
2525
+ Liquid.isTruthy = isTruthy;
2526
+ Liquid.isFalsy = isFalsy;
2527
+ Liquid.evalExp = evalExp;
2528
+ Liquid.evalValue = evalValue;
2529
+ Liquid.Types = Types;
2530
+ return Liquid;
2531
+ }());
2532
+
2533
+ return Liquid;
2534
+
2535
+ }));
2536
+ //# sourceMappingURL=liquid.js.map