@skeptools/skep-organization-project 0.0.15 → 0.0.16

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.
Files changed (57) hide show
  1. package/.jsii +113 -3
  2. package/API.md +74 -43
  3. package/lib/skep-organization-project.js +1 -1
  4. package/node_modules/liquidjs/README.md +17 -10
  5. package/node_modules/liquidjs/dist/context/context.d.ts +7 -1
  6. package/node_modules/liquidjs/dist/drop/drop.d.ts +1 -1
  7. package/node_modules/liquidjs/dist/filters/array.d.ts +14 -14
  8. package/node_modules/liquidjs/dist/filters/html.d.ts +6 -5
  9. package/node_modules/liquidjs/dist/filters/math.d.ts +9 -9
  10. package/node_modules/liquidjs/dist/filters/string.d.ts +22 -21
  11. package/node_modules/liquidjs/dist/fs/map-fs.d.ts +13 -0
  12. package/node_modules/liquidjs/dist/fs/node-require.d.ts +1 -2
  13. package/node_modules/liquidjs/dist/index.d.ts +1 -1
  14. package/node_modules/liquidjs/dist/liquid-options.d.ts +28 -2
  15. package/node_modules/liquidjs/dist/liquid.browser.min.js +1 -1
  16. package/node_modules/liquidjs/dist/liquid.browser.min.js.map +1 -1
  17. package/node_modules/liquidjs/dist/{liquid.browser.esm.js → liquid.browser.mjs} +443 -227
  18. package/node_modules/liquidjs/dist/liquid.browser.umd.js +604 -368
  19. package/node_modules/liquidjs/dist/liquid.browser.umd.js.map +1 -1
  20. package/node_modules/liquidjs/dist/liquid.d.ts +3 -0
  21. package/node_modules/liquidjs/dist/{liquid.node.cjs.js → liquid.node.js} +432 -227
  22. package/node_modules/liquidjs/dist/{liquid.node.esm.js → liquid.node.mjs} +448 -228
  23. package/node_modules/liquidjs/dist/parser/parser.d.ts +1 -0
  24. package/node_modules/liquidjs/dist/parser/parser.spec.d.ts +1 -0
  25. package/node_modules/liquidjs/dist/parser/tokenizer.d.ts +4 -3
  26. package/node_modules/liquidjs/dist/tags/block.d.ts +2 -1
  27. package/node_modules/liquidjs/dist/tags/capture.d.ts +2 -1
  28. package/node_modules/liquidjs/dist/tags/case.d.ts +2 -1
  29. package/node_modules/liquidjs/dist/tags/for.d.ts +2 -1
  30. package/node_modules/liquidjs/dist/tags/if.d.ts +3 -2
  31. package/node_modules/liquidjs/dist/tags/include.d.ts +2 -1
  32. package/node_modules/liquidjs/dist/tags/layout.d.ts +2 -1
  33. package/node_modules/liquidjs/dist/tags/liquid.d.ts +2 -1
  34. package/node_modules/liquidjs/dist/tags/render.d.ts +3 -2
  35. package/node_modules/liquidjs/dist/tags/tablerow.d.ts +2 -1
  36. package/node_modules/liquidjs/dist/tags/unless.d.ts +2 -1
  37. package/node_modules/liquidjs/dist/template/filter-impl-options.d.ts +2 -0
  38. package/node_modules/liquidjs/dist/template/filter.d.ts +3 -1
  39. package/node_modules/liquidjs/dist/template/hash.d.ts +1 -1
  40. package/node_modules/liquidjs/dist/template/tag.d.ts +2 -2
  41. package/node_modules/liquidjs/dist/tokens/identifier-token.d.ts +0 -1
  42. package/node_modules/liquidjs/dist/util/assert.d.ts +1 -0
  43. package/node_modules/liquidjs/dist/util/error.d.ts +7 -2
  44. package/node_modules/liquidjs/dist/util/error.spec.d.ts +1 -0
  45. package/node_modules/liquidjs/dist/util/index.d.ts +2 -1
  46. package/node_modules/liquidjs/dist/util/intl.d.ts +6 -0
  47. package/node_modules/liquidjs/dist/util/limiter.d.ts +8 -0
  48. package/node_modules/liquidjs/dist/util/liquid-date.d.ts +39 -7
  49. package/node_modules/liquidjs/dist/util/liquid-date.spec.d.ts +1 -0
  50. package/node_modules/liquidjs/dist/util/performance.d.ts +5 -0
  51. package/node_modules/liquidjs/dist/util/performance.spec.d.ts +1 -0
  52. package/node_modules/liquidjs/dist/util/type-guards.spec.d.ts +1 -0
  53. package/node_modules/liquidjs/dist/util/underscore.d.ts +2 -1
  54. package/node_modules/liquidjs/package.json +10 -7
  55. package/package.json +16 -12
  56. package/node_modules/liquidjs/dist/util/timezone-date.d.ts +0 -44
  57. /package/node_modules/liquidjs/dist/{util/timezone-date.spec.d.ts → fs/map-fs.spec.d.ts} +0 -0
@@ -1,5 +1,5 @@
1
1
  /*
2
- * liquidjs@10.13.0, https://github.com/harttle/liquidjs
2
+ * liquidjs@10.18.0, https://github.com/harttle/liquidjs
3
3
  * (c) 2016-2024 harttle
4
4
  * Released under the MIT License.
5
5
  */
@@ -218,6 +218,10 @@
218
218
  function toValue(value) {
219
219
  return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value;
220
220
  }
221
+ function toNumber(value) {
222
+ value = Number(value);
223
+ return isNaN(value) ? 0 : value;
224
+ }
221
225
  function isNumber(value) {
222
226
  return typeof value === 'number';
223
227
  }
@@ -325,7 +329,7 @@
325
329
  for (var _i = 0; _i < arguments.length; _i++) {
326
330
  args[_i] = arguments[_i];
327
331
  }
328
- return fn.apply(void 0, __spreadArray([], __read(args.map(toValue)), false));
332
+ return fn.call.apply(fn, __spreadArray([this], __read(args.map(toValue)), false));
329
333
  };
330
334
  }
331
335
  function escapeRegExp(text) {
@@ -333,7 +337,7 @@
333
337
  }
334
338
 
335
339
  /**
336
- * targeting ES5, extends Error won't create a proper prototype chain, need a trait to kee track of classes
340
+ * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes
337
341
  */
338
342
  var TRAIT = '__liquidClass__';
339
343
  var LiquidError = /** @class */ (function (_super) {
@@ -400,6 +404,22 @@
400
404
  };
401
405
  return RenderError;
402
406
  }(LiquidError));
407
+ var LiquidErrors = /** @class */ (function (_super) {
408
+ __extends(LiquidErrors, _super);
409
+ function LiquidErrors(errors) {
410
+ var _this = _super.call(this, errors[0], errors[0].token) || this;
411
+ _this.errors = errors;
412
+ _this.name = 'LiquidErrors';
413
+ var s = errors.length > 1 ? 's' : '';
414
+ _this.message = "".concat(errors.length, " error").concat(s, " found");
415
+ _super.prototype.update.call(_this);
416
+ return _this;
417
+ }
418
+ LiquidErrors.is = function (obj) {
419
+ return obj.name === 'LiquidErrors';
420
+ };
421
+ return LiquidErrors;
422
+ }(LiquidError));
403
423
  var UndefinedVariableError = /** @class */ (function (_super) {
404
424
  __extends(UndefinedVariableError, _super);
405
425
  function UndefinedVariableError(err, token) {
@@ -487,6 +507,10 @@
487
507
  : (message || "expect ".concat(predicate, " to be true"));
488
508
  throw new AssertionError(msg);
489
509
  }
510
+ }
511
+ function assertEmpty(predicate, message) {
512
+ if (message === void 0) { message = "unexpected ".concat(JSON.stringify(predicate)); }
513
+ assert(!predicate, message);
490
514
  }
491
515
 
492
516
  var NullDrop = /** @class */ (function (_super) {
@@ -622,7 +646,12 @@
622
646
  }(Drop));
623
647
 
624
648
  function isComparable(arg) {
625
- return arg && isFunction(arg.equals);
649
+ return (arg &&
650
+ isFunction(arg.equals) &&
651
+ isFunction(arg.gt) &&
652
+ isFunction(arg.geq) &&
653
+ isFunction(arg.lt) &&
654
+ isFunction(arg.leq));
626
655
  }
627
656
 
628
657
  var nil = new NullDrop();
@@ -731,18 +760,6 @@
731
760
  }
732
761
 
733
762
  var rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/;
734
- var monthNames = [
735
- 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
736
- 'September', 'October', 'November', 'December'
737
- ];
738
- var dayNames = [
739
- 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
740
- ];
741
- var monthNamesShort = monthNames.map(abbr);
742
- var dayNamesShort = dayNames.map(abbr);
743
- function abbr(str) {
744
- return str.slice(0, 3);
745
- }
746
763
  // prototype extensions
747
764
  function daysInMonth(d) {
748
765
  var feb = isLeapYear(d) ? 29 : 28;
@@ -797,19 +814,7 @@
797
814
  U: 2,
798
815
  W: 2
799
816
  };
800
- // default to '0'
801
- var padChars = {
802
- a: ' ',
803
- A: ' ',
804
- b: ' ',
805
- B: ' ',
806
- c: ' ',
807
- e: ' ',
808
- k: ' ',
809
- l: ' ',
810
- p: ' ',
811
- P: ' '
812
- };
817
+ var padSpaceChars = new Set('aAbBceklpP');
813
818
  function getTimezoneOffset(d, opts) {
814
819
  var nOffset = Math.abs(d.getTimezoneOffset());
815
820
  var h = Math.floor(nOffset / 60);
@@ -820,10 +825,10 @@
820
825
  padStart(m, 2, '0');
821
826
  }
822
827
  var formatCodes = {
823
- a: function (d) { return dayNamesShort[d.getDay()]; },
824
- A: function (d) { return dayNames[d.getDay()]; },
825
- b: function (d) { return monthNamesShort[d.getMonth()]; },
826
- B: function (d) { return monthNames[d.getMonth()]; },
828
+ a: function (d) { return d.getShortWeekdayName(); },
829
+ A: function (d) { return d.getLongWeekdayName(); },
830
+ b: function (d) { return d.getShortMonthName(); },
831
+ B: function (d) { return d.getLongMonthName(); },
827
832
  c: function (d) { return d.toLocaleString(); },
828
833
  C: function (d) { return century(d); },
829
834
  d: function (d) { return d.getDate(); },
@@ -855,12 +860,7 @@
855
860
  y: function (d) { return d.getFullYear().toString().slice(2, 4); },
856
861
  Y: function (d) { return d.getFullYear(); },
857
862
  z: getTimezoneOffset,
858
- Z: function (d, opts) {
859
- if (d.getTimezoneName) {
860
- return d.getTimezoneName() || getTimezoneOffset(d, opts);
861
- }
862
- return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat().resolvedOptions().timeZone : '');
863
- },
863
+ Z: function (d, opts) { return d.getTimeZoneName() || getTimezoneOffset(d, opts); },
864
864
  't': function () { return '\t'; },
865
865
  'n': function () { return '\n'; },
866
866
  '%': function () { return '%'; }
@@ -898,7 +898,7 @@
898
898
  finally { if (e_1) throw e_1.error; }
899
899
  }
900
900
  var ret = String(convert(d, { flags: flags, width: width, modifier: modifier }));
901
- var padChar = padChars[conversion] || '0';
901
+ var padChar = padSpaceChars.has(conversion) ? ' ' : '0';
902
902
  var padWidth = width || padWidths[conversion] || 0;
903
903
  if (flags['^'])
904
904
  ret = ret.toUpperCase();
@@ -913,9 +913,22 @@
913
913
  return padStart(ret, padWidth, padChar);
914
914
  }
915
915
 
916
+ function getDateTimeFormat() {
917
+ return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined);
918
+ }
919
+
916
920
  // one minute in milliseconds
917
921
  var OneMinute = 60000;
918
922
  var ISO8601_TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):(\d{2}))$/;
923
+ var monthNames = [
924
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
925
+ 'September', 'October', 'November', 'December'
926
+ ];
927
+ var monthNamesShort = monthNames.map(function (name) { return name.slice(0, 3); });
928
+ var dayNames = [
929
+ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
930
+ ];
931
+ var dayNamesShort = dayNames.map(function (name) { return name.slice(0, 3); });
919
932
  /**
920
933
  * A date implementation with timezone info, just like Ruby date
921
934
  *
@@ -923,61 +936,91 @@
923
936
  * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods
924
937
  * - rewrite getTimezoneOffset() to trick strftime
925
938
  */
926
- var TimezoneDate = /** @class */ (function () {
927
- function TimezoneDate(init, timezone) {
928
- this.date = init instanceof TimezoneDate
929
- ? init.date
930
- : new Date(init);
931
- this.timezoneOffset = isString(timezone) ? TimezoneDate.getTimezoneOffset(timezone, this.date) : timezone;
939
+ var LiquidDate = /** @class */ (function () {
940
+ function LiquidDate(init, locale, timezone) {
941
+ this.locale = locale;
942
+ this.DateTimeFormat = getDateTimeFormat();
943
+ this.date = new Date(init);
944
+ this.timezoneFixed = timezone !== undefined;
945
+ if (timezone === undefined) {
946
+ timezone = this.date.getTimezoneOffset();
947
+ }
948
+ this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone;
932
949
  this.timezoneName = isString(timezone) ? timezone : '';
933
950
  var diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute;
934
951
  var time = this.date.getTime() + diff;
935
952
  this.displayDate = new Date(time);
936
953
  }
937
- TimezoneDate.prototype.getTime = function () {
954
+ LiquidDate.prototype.getTime = function () {
938
955
  return this.displayDate.getTime();
939
956
  };
940
- TimezoneDate.prototype.getMilliseconds = function () {
957
+ LiquidDate.prototype.getMilliseconds = function () {
941
958
  return this.displayDate.getMilliseconds();
942
959
  };
943
- TimezoneDate.prototype.getSeconds = function () {
960
+ LiquidDate.prototype.getSeconds = function () {
944
961
  return this.displayDate.getSeconds();
945
962
  };
946
- TimezoneDate.prototype.getMinutes = function () {
963
+ LiquidDate.prototype.getMinutes = function () {
947
964
  return this.displayDate.getMinutes();
948
965
  };
949
- TimezoneDate.prototype.getHours = function () {
966
+ LiquidDate.prototype.getHours = function () {
950
967
  return this.displayDate.getHours();
951
968
  };
952
- TimezoneDate.prototype.getDay = function () {
969
+ LiquidDate.prototype.getDay = function () {
953
970
  return this.displayDate.getDay();
954
971
  };
955
- TimezoneDate.prototype.getDate = function () {
972
+ LiquidDate.prototype.getDate = function () {
956
973
  return this.displayDate.getDate();
957
974
  };
958
- TimezoneDate.prototype.getMonth = function () {
975
+ LiquidDate.prototype.getMonth = function () {
959
976
  return this.displayDate.getMonth();
960
977
  };
961
- TimezoneDate.prototype.getFullYear = function () {
978
+ LiquidDate.prototype.getFullYear = function () {
962
979
  return this.displayDate.getFullYear();
963
980
  };
964
- TimezoneDate.prototype.toLocaleString = function (locale, init) {
981
+ LiquidDate.prototype.toLocaleString = function (locale, init) {
965
982
  if (init === null || init === void 0 ? void 0 : init.timeZone) {
966
983
  return this.date.toLocaleString(locale, init);
967
984
  }
968
985
  return this.displayDate.toLocaleString(locale, init);
969
986
  };
970
- TimezoneDate.prototype.toLocaleTimeString = function (locale) {
987
+ LiquidDate.prototype.toLocaleTimeString = function (locale) {
971
988
  return this.displayDate.toLocaleTimeString(locale);
972
989
  };
973
- TimezoneDate.prototype.toLocaleDateString = function (locale) {
990
+ LiquidDate.prototype.toLocaleDateString = function (locale) {
974
991
  return this.displayDate.toLocaleDateString(locale);
975
992
  };
976
- TimezoneDate.prototype.getTimezoneOffset = function () {
993
+ LiquidDate.prototype.getTimezoneOffset = function () {
977
994
  return this.timezoneOffset;
978
995
  };
979
- TimezoneDate.prototype.getTimezoneName = function () {
980
- return this.timezoneName;
996
+ LiquidDate.prototype.getTimeZoneName = function () {
997
+ if (this.timezoneFixed)
998
+ return this.timezoneName;
999
+ if (!this.DateTimeFormat)
1000
+ return;
1001
+ return this.DateTimeFormat().resolvedOptions().timeZone;
1002
+ };
1003
+ LiquidDate.prototype.getLongMonthName = function () {
1004
+ var _a;
1005
+ return (_a = this.format({ month: 'long' })) !== null && _a !== void 0 ? _a : monthNames[this.getMonth()];
1006
+ };
1007
+ LiquidDate.prototype.getShortMonthName = function () {
1008
+ var _a;
1009
+ return (_a = this.format({ month: 'short' })) !== null && _a !== void 0 ? _a : monthNamesShort[this.getMonth()];
1010
+ };
1011
+ LiquidDate.prototype.getLongWeekdayName = function () {
1012
+ var _a;
1013
+ return (_a = this.format({ weekday: 'long' })) !== null && _a !== void 0 ? _a : dayNames[this.displayDate.getDay()];
1014
+ };
1015
+ LiquidDate.prototype.getShortWeekdayName = function () {
1016
+ var _a;
1017
+ return (_a = this.format({ weekday: 'short' })) !== null && _a !== void 0 ? _a : dayNamesShort[this.displayDate.getDay()];
1018
+ };
1019
+ LiquidDate.prototype.valid = function () {
1020
+ return !isNaN(this.getTime());
1021
+ };
1022
+ LiquidDate.prototype.format = function (options) {
1023
+ return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate);
981
1024
  };
982
1025
  /**
983
1026
  * Create a Date object fixed to it's declared Timezone. Both
@@ -992,29 +1035,46 @@
992
1035
  * we create a different Date to trick strftime, it's both simpler and more performant.
993
1036
  * Given that a template is expected to be parsed fewer times than rendered.
994
1037
  */
995
- TimezoneDate.createDateFixedToTimezone = function (dateString) {
1038
+ LiquidDate.createDateFixedToTimezone = function (dateString, locale) {
996
1039
  var m = dateString.match(ISO8601_TIMEZONE_PATTERN);
997
1040
  // representing a UTC timestamp
998
1041
  if (m && m[1] === 'Z') {
999
- return new TimezoneDate(+new Date(dateString), 0);
1042
+ return new LiquidDate(+new Date(dateString), locale, 0);
1000
1043
  }
1001
1044
  // has a timezone specified
1002
1045
  if (m && m[2] && m[3] && m[4]) {
1003
1046
  var _a = __read(m, 5), sign = _a[2], hours = _a[3], minutes = _a[4];
1004
1047
  var offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10));
1005
- return new TimezoneDate(+new Date(dateString), offset);
1048
+ return new LiquidDate(+new Date(dateString), locale, offset);
1006
1049
  }
1007
- return new Date(dateString);
1050
+ return new LiquidDate(dateString, locale);
1008
1051
  };
1009
- TimezoneDate.getTimezoneOffset = function (timezoneName, date) {
1010
- if (date === void 0) { date = new Date(); }
1052
+ LiquidDate.getTimezoneOffset = function (timezoneName, date) {
1011
1053
  var localDateString = date.toLocaleString('en-US', { timeZone: timezoneName });
1012
1054
  var utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' });
1013
1055
  var localDate = new Date(localDateString);
1014
1056
  var utcDate = new Date(utcDateString);
1015
1057
  return (+utcDate - +localDate) / (60 * 1000);
1016
1058
  };
1017
- return TimezoneDate;
1059
+ return LiquidDate;
1060
+ }());
1061
+
1062
+ var Limiter = /** @class */ (function () {
1063
+ function Limiter(resource, limit) {
1064
+ this.base = 0;
1065
+ this.message = "".concat(resource, " limit exceeded");
1066
+ this.limit = limit;
1067
+ }
1068
+ Limiter.prototype.use = function (count) {
1069
+ count = toNumber(count);
1070
+ assert(this.base + count <= this.limit, this.message);
1071
+ this.base += count;
1072
+ };
1073
+ Limiter.prototype.check = function (count) {
1074
+ count = toNumber(count);
1075
+ assert(count <= this.limit, this.message);
1076
+ };
1077
+ return Limiter;
1018
1078
  }());
1019
1079
 
1020
1080
  var DelimitedToken = /** @class */ (function (_super) {
@@ -1123,17 +1183,6 @@
1123
1183
  _this.content = _this.getText();
1124
1184
  return _this;
1125
1185
  }
1126
- IdentifierToken.prototype.isNumber = function (allowSign) {
1127
- if (allowSign === void 0) { allowSign = false; }
1128
- var begin = allowSign && TYPES[this.input.charCodeAt(this.begin)] & SIGN
1129
- ? this.begin + 1
1130
- : this.begin;
1131
- for (var i = begin; i < this.end; i++) {
1132
- if (!(TYPES[this.input.charCodeAt(i)] & NUMBER))
1133
- return false;
1134
- }
1135
- return true;
1136
- };
1137
1186
  return IdentifierToken;
1138
1187
  }(Token));
1139
1188
 
@@ -1350,6 +1399,15 @@
1350
1399
  return FilteredValueToken;
1351
1400
  }(Token));
1352
1401
 
1402
+ var polyfill = {
1403
+ now: function () { return Date.now(); }
1404
+ };
1405
+ function getPerformance() {
1406
+ return (typeof global === 'object' && global.performance) ||
1407
+ (typeof window === 'object' && window.performance) ||
1408
+ polyfill;
1409
+ }
1410
+
1353
1411
  var SimpleEmitter = /** @class */ (function () {
1354
1412
  function SimpleEmitter() {
1355
1413
  this.buffer = '';
@@ -1400,7 +1458,7 @@
1400
1458
  return emitter.stream;
1401
1459
  };
1402
1460
  Render.prototype.renderTemplates = function (templates, ctx, emitter) {
1403
- var templates_1, templates_1_1, tpl, html, e_1, err, e_2_1;
1461
+ var errors, templates_1, templates_1_1, tpl, html, e_1, err, e_2_1;
1404
1462
  var e_2, _a;
1405
1463
  return __generator(this, function (_b) {
1406
1464
  switch (_b.label) {
@@ -1408,6 +1466,7 @@
1408
1466
  if (!emitter) {
1409
1467
  emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter();
1410
1468
  }
1469
+ errors = [];
1411
1470
  _b.label = 1;
1412
1471
  case 1:
1413
1472
  _b.trys.push([1, 8, 9, 10]);
@@ -1416,6 +1475,7 @@
1416
1475
  case 2:
1417
1476
  if (!!templates_1_1.done) return [3 /*break*/, 7];
1418
1477
  tpl = templates_1_1.value;
1478
+ ctx.renderLimit.check(getPerformance().now());
1419
1479
  _b.label = 3;
1420
1480
  case 3:
1421
1481
  _b.trys.push([3, 5, , 6]);
@@ -1431,8 +1491,12 @@
1431
1491
  return [3 /*break*/, 6];
1432
1492
  case 5:
1433
1493
  e_1 = _b.sent();
1434
- err = RenderError.is(e_1) ? e_1 : new RenderError(e_1, tpl);
1435
- throw err;
1494
+ err = LiquidError.is(e_1) ? e_1 : new RenderError(e_1, tpl);
1495
+ if (ctx.opts.catchAllErrors)
1496
+ errors.push(err);
1497
+ else
1498
+ throw err;
1499
+ return [3 /*break*/, 6];
1436
1500
  case 6:
1437
1501
  templates_1_1 = templates_1.next();
1438
1502
  return [3 /*break*/, 2];
@@ -1447,7 +1511,11 @@
1447
1511
  }
1448
1512
  finally { if (e_2) throw e_2.error; }
1449
1513
  return [7 /*endfinally*/];
1450
- case 10: return [2 /*return*/, emitter.buffer];
1514
+ case 10:
1515
+ if (errors.length) {
1516
+ throw new LiquidErrors(errors);
1517
+ }
1518
+ return [2 /*return*/, emitter.buffer];
1451
1519
  }
1452
1520
  });
1453
1521
  };
@@ -1670,6 +1738,7 @@
1670
1738
  return !isFalsy(val, ctx);
1671
1739
  }
1672
1740
  function isFalsy(val, ctx) {
1741
+ val = toValue(val);
1673
1742
  if (ctx.opts.jsTruthy) {
1674
1743
  return !val;
1675
1744
  }
@@ -1941,22 +2010,30 @@
1941
2010
  '&#39;': "'"
1942
2011
  };
1943
2012
  function escape(str) {
1944
- return stringify(str).replace(/&|<|>|"|'/g, function (m) { return escapeMap[m]; });
2013
+ str = stringify(str);
2014
+ this.context.memoryLimit.use(str.length);
2015
+ return str.replace(/&|<|>|"|'/g, function (m) { return escapeMap[m]; });
1945
2016
  }
1946
2017
  function xml_escape(str) {
1947
- return escape(str);
2018
+ return escape.call(this, str);
1948
2019
  }
1949
2020
  function unescape(str) {
1950
- return stringify(str).replace(/&(amp|lt|gt|#34|#39);/g, function (m) { return unescapeMap[m]; });
2021
+ str = stringify(str);
2022
+ this.context.memoryLimit.use(str.length);
2023
+ return str.replace(/&(amp|lt|gt|#34|#39);/g, function (m) { return unescapeMap[m]; });
1951
2024
  }
1952
2025
  function escape_once(str) {
1953
- return escape(unescape(stringify(str)));
2026
+ return escape.call(this, unescape.call(this, str));
1954
2027
  }
1955
2028
  function newline_to_br(v) {
1956
- return stringify(v).replace(/\r?\n/gm, '<br />\n');
2029
+ var str = stringify(v);
2030
+ this.context.memoryLimit.use(str.length);
2031
+ return str.replace(/\r?\n/gm, '<br />\n');
1957
2032
  }
1958
2033
  function strip_html(v) {
1959
- return stringify(v).replace(/<script[\s\S]*?<\/script>|<style[\s\S]*?<\/style>|<.*?>|<!--[\s\S]*?-->/g, '');
2034
+ var str = stringify(v);
2035
+ this.context.memoryLimit.use(str.length);
2036
+ return str.replace(/<script[\s\S]*?<\/script>|<style[\s\S]*?<\/style>|<.*?>|<!--[\s\S]*?-->/g, '');
1960
2037
  }
1961
2038
 
1962
2039
  var htmlFilters = /*#__PURE__*/Object.freeze({
@@ -1968,18 +2045,84 @@
1968
2045
  strip_html: strip_html
1969
2046
  });
1970
2047
 
2048
+ var MapFS = /** @class */ (function () {
2049
+ function MapFS(mapping) {
2050
+ this.mapping = mapping;
2051
+ this.sep = '/';
2052
+ }
2053
+ MapFS.prototype.exists = function (filepath) {
2054
+ return __awaiter(this, void 0, void 0, function () {
2055
+ return __generator(this, function (_a) {
2056
+ return [2 /*return*/, this.existsSync(filepath)];
2057
+ });
2058
+ });
2059
+ };
2060
+ MapFS.prototype.existsSync = function (filepath) {
2061
+ return !isNil(this.mapping[filepath]);
2062
+ };
2063
+ MapFS.prototype.readFile = function (filepath) {
2064
+ return __awaiter(this, void 0, void 0, function () {
2065
+ return __generator(this, function (_a) {
2066
+ return [2 /*return*/, this.readFileSync(filepath)];
2067
+ });
2068
+ });
2069
+ };
2070
+ MapFS.prototype.readFileSync = function (filepath) {
2071
+ var content = this.mapping[filepath];
2072
+ if (isNil(content))
2073
+ throw new Error("ENOENT: ".concat(filepath));
2074
+ return content;
2075
+ };
2076
+ MapFS.prototype.dirname = function (filepath) {
2077
+ var segments = filepath.split(this.sep);
2078
+ segments.pop();
2079
+ return segments.join(this.sep);
2080
+ };
2081
+ MapFS.prototype.resolve = function (dir, file, ext) {
2082
+ var e_1, _a;
2083
+ file += ext;
2084
+ if (dir === '.')
2085
+ return file;
2086
+ var segments = dir.split(/\/+/);
2087
+ try {
2088
+ for (var _b = __values(file.split(this.sep)), _c = _b.next(); !_c.done; _c = _b.next()) {
2089
+ var segment = _c.value;
2090
+ if (segment === '.' || segment === '')
2091
+ continue;
2092
+ else if (segment === '..') {
2093
+ if (segments.length > 1 || segments[0] !== '')
2094
+ segments.pop();
2095
+ }
2096
+ else
2097
+ segments.push(segment);
2098
+ }
2099
+ }
2100
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
2101
+ finally {
2102
+ try {
2103
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
2104
+ }
2105
+ finally { if (e_1) throw e_1.error; }
2106
+ }
2107
+ return segments.join(this.sep);
2108
+ };
2109
+ return MapFS;
2110
+ }());
2111
+
1971
2112
  var defaultOptions = {
1972
2113
  root: ['.'],
1973
2114
  layouts: ['.'],
1974
2115
  partials: ['.'],
1975
2116
  relativeReference: true,
1976
2117
  jekyllInclude: false,
2118
+ keyValueSeparator: ':',
1977
2119
  cache: undefined,
1978
2120
  extname: '',
1979
2121
  fs: fs,
1980
2122
  dynamicPartials: true,
1981
2123
  jsTruthy: false,
1982
2124
  dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',
2125
+ locale: '',
1983
2126
  trimTagRight: false,
1984
2127
  trimTagLeft: false,
1985
2128
  trimOutputRight: false,
@@ -1996,9 +2139,13 @@
1996
2139
  lenientIf: false,
1997
2140
  globals: {},
1998
2141
  keepOutputType: false,
1999
- operators: defaultOperators
2142
+ operators: defaultOperators,
2143
+ memoryLimit: Infinity,
2144
+ parseLimit: Infinity,
2145
+ renderLimit: Infinity
2000
2146
  };
2001
2147
  function normalize(options) {
2148
+ var _a, _b;
2002
2149
  if (options.hasOwnProperty('root')) {
2003
2150
  if (!options.hasOwnProperty('partials'))
2004
2151
  options.partials = options.root;
@@ -2024,6 +2171,14 @@
2024
2171
  options.partials = normalizeDirectoryList(options.partials);
2025
2172
  options.layouts = normalizeDirectoryList(options.layouts);
2026
2173
  options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape);
2174
+ if (!options.locale) {
2175
+ options.locale = (_b = (_a = getDateTimeFormat()) === null || _a === void 0 ? void 0 : _a().resolvedOptions().locale) !== null && _b !== void 0 ? _b : 'en-US';
2176
+ }
2177
+ if (options.templates) {
2178
+ options.fs = new MapFS(options.templates);
2179
+ options.relativeReference = true;
2180
+ options.root = options.partials = options.layouts = '.';
2181
+ }
2027
2182
  return options;
2028
2183
  }
2029
2184
  function getOutputEscapeFunction(nameOrFunction) {
@@ -2161,9 +2316,7 @@
2161
2316
  this.skipBlank();
2162
2317
  if (this.end())
2163
2318
  return null;
2164
- this.assert(this.peek() === '|', "expected \"|\" before filter");
2165
- this.p++;
2166
- var begin = this.p;
2319
+ this.assert(this.read() === '|', "expected \"|\" before filter");
2167
2320
  var name = this.readIdentifier();
2168
2321
  if (!name.size()) {
2169
2322
  this.assert(this.end(), "expected filter name");
@@ -2184,7 +2337,7 @@
2184
2337
  else {
2185
2338
  throw this.error('expected ":" after filter name');
2186
2339
  }
2187
- return new FilterToken(name.getText(), args, this.input, begin, this.p, this.file);
2340
+ return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file);
2188
2341
  };
2189
2342
  Tokenizer.prototype.readFilterArg = function () {
2190
2343
  var key = this.readValue();
@@ -2228,7 +2381,6 @@
2228
2381
  return new HTMLToken(this.input, begin, this.p, this.file);
2229
2382
  };
2230
2383
  Tokenizer.prototype.readTagToken = function (options) {
2231
- if (options === void 0) { options = defaultOptions; }
2232
2384
  var _a = this, file = _a.file, input = _a.input;
2233
2385
  var begin = this.p;
2234
2386
  if (this.readToDelimiter(options.tagDelimiterRight) === -1) {
@@ -2364,7 +2516,7 @@
2364
2516
  return;
2365
2517
  var value;
2366
2518
  this.skipBlank();
2367
- var sep = jekyllStyle ? '=' : ':';
2519
+ var sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':');
2368
2520
  if (this.peek() === sep) {
2369
2521
  ++this.p;
2370
2522
  value = this.readValue();
@@ -2381,6 +2533,9 @@
2381
2533
  Tokenizer.prototype.end = function () {
2382
2534
  return this.p >= this.N;
2383
2535
  };
2536
+ Tokenizer.prototype.read = function () {
2537
+ return this.input[this.p++];
2538
+ };
2384
2539
  Tokenizer.prototype.readTo = function (end) {
2385
2540
  while (this.p < this.N) {
2386
2541
  ++this.p;
@@ -2704,7 +2859,7 @@
2704
2859
  var hash;
2705
2860
  return __generator(this, function (_a) {
2706
2861
  switch (_a.label) {
2707
- case 0: return [4 /*yield*/, new Hash(this.token.args).render(ctx)];
2862
+ case 0: return [4 /*yield*/, new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)];
2708
2863
  case 1:
2709
2864
  hash = (_a.sent());
2710
2865
  return [4 /*yield*/, options.render.call(this, ctx, emitter, hash)];
@@ -2721,13 +2876,14 @@
2721
2876
  }
2722
2877
 
2723
2878
  var Filter = /** @class */ (function () {
2724
- function Filter(name, options, args, liquid) {
2725
- this.name = name;
2879
+ function Filter(token, options, liquid) {
2880
+ this.token = token;
2881
+ this.name = token.name;
2726
2882
  this.handler = isFunction(options)
2727
2883
  ? options
2728
2884
  : (isFunction(options === null || options === void 0 ? void 0 : options.handler) ? options.handler : identify);
2729
2885
  this.raw = !isFunction(options) && !!(options === null || options === void 0 ? void 0 : options.raw);
2730
- this.args = args;
2886
+ this.args = token.args;
2731
2887
  this.liquid = liquid;
2732
2888
  }
2733
2889
  Filter.prototype.render = function (value, context) {
@@ -2772,7 +2928,7 @@
2772
2928
  }
2773
2929
  finally { if (e_1) throw e_1.error; }
2774
2930
  return [7 /*endfinally*/];
2775
- case 10: return [4 /*yield*/, this.handler.apply({ context: context, liquid: this.liquid }, __spreadArray([value], __read(argv), false))];
2931
+ case 10: return [4 /*yield*/, this.handler.apply({ context: context, token: this.token, liquid: this.liquid }, __spreadArray([value], __read(argv), false))];
2776
2932
  case 11: return [2 /*return*/, _j.sent()];
2777
2933
  }
2778
2934
  });
@@ -2791,10 +2947,7 @@
2791
2947
  ? new Tokenizer(input, liquid.options.operators).readFilteredValue()
2792
2948
  : input;
2793
2949
  this.initial = token.initial;
2794
- this.filters = token.filters.map(function (_a) {
2795
- var name = _a.name, args = _a.args;
2796
- return new Filter(name, _this.getFilter(liquid, name), args, liquid);
2797
- });
2950
+ this.filters = token.filters.map(function (token) { return new Filter(token, _this.getFilter(liquid, token.name), liquid); });
2798
2951
  }
2799
2952
  Value.prototype.value = function (ctx, lenient) {
2800
2953
  var val, _a, _b, filter, e_1_1;
@@ -2855,7 +3008,8 @@
2855
3008
  var filters = _this.value.filters;
2856
3009
  var outputEscape = liquid.options.outputEscape;
2857
3010
  if (!((_a = filters[filters.length - 1]) === null || _a === void 0 ? void 0 : _a.raw) && outputEscape) {
2858
- filters.push(new Filter(toString.call(outputEscape), outputEscape, [], liquid));
3011
+ var token_1 = new FilterToken(toString.call(outputEscape), [], '', 0, 0);
3012
+ filters.push(new Filter(token_1, outputEscape, liquid));
2859
3013
  }
2860
3014
  return _this;
2861
3015
  }
@@ -2906,7 +3060,7 @@
2906
3060
  this.shouldLoadRelative = function (referencedFile) { return rRelativePath_1.test(referencedFile); };
2907
3061
  }
2908
3062
  else {
2909
- this.shouldLoadRelative = function (referencedFile) { return false; };
3063
+ this.shouldLoadRelative = function (_referencedFile) { return false; };
2910
3064
  }
2911
3065
  this.contains = this.options.fs.contains || (function () { return true; });
2912
3066
  }
@@ -3053,8 +3207,11 @@
3053
3207
  this.fs = this.liquid.options.fs;
3054
3208
  this.parseFile = this.cache ? this._parseFileCached : this._parseFile;
3055
3209
  this.loader = new Loader(this.liquid.options);
3210
+ this.parseLimit = new Limiter('parse length', liquid.options.parseLimit);
3056
3211
  }
3057
3212
  Parser.prototype.parse = function (html, filepath) {
3213
+ html = String(html);
3214
+ this.parseLimit.use(html.length);
3058
3215
  var tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath);
3059
3216
  var tokens = tokenizer.readTopLevelTokens(this.liquid.options);
3060
3217
  return this.parseTokens(tokens);
@@ -3062,9 +3219,20 @@
3062
3219
  Parser.prototype.parseTokens = function (tokens) {
3063
3220
  var token;
3064
3221
  var templates = [];
3222
+ var errors = [];
3065
3223
  while ((token = tokens.shift())) {
3066
- templates.push(this.parseToken(token, tokens));
3224
+ try {
3225
+ templates.push(this.parseToken(token, tokens));
3226
+ }
3227
+ catch (err) {
3228
+ if (this.liquid.options.catchAllErrors)
3229
+ errors.push(err);
3230
+ else
3231
+ throw err;
3232
+ }
3067
3233
  }
3234
+ if (errors.length)
3235
+ throw new LiquidErrors(errors);
3068
3236
  return templates;
3069
3237
  };
3070
3238
  Parser.prototype.parseToken = function (token, remainTokens) {
@@ -3072,7 +3240,7 @@
3072
3240
  if (isTagToken(token)) {
3073
3241
  var TagClass = this.liquid.tags[token.name];
3074
3242
  assert(TagClass, "tag \"".concat(token.name, "\" not found"));
3075
- return new TagClass(token, remainTokens, this.liquid);
3243
+ return new TagClass(token, remainTokens, this.liquid, this);
3076
3244
  }
3077
3245
  if (isOutputToken(token)) {
3078
3246
  return new Output(token, this.liquid);
@@ -3128,22 +3296,22 @@
3128
3296
  });
3129
3297
  };
3130
3298
  Parser.prototype._parseFile = function (file, sync, type, currentFile) {
3131
- var filepath, _a, _b, _c;
3299
+ var filepath, _a, _b;
3132
3300
  if (type === void 0) { type = LookupType.Root; }
3133
- return __generator(this, function (_d) {
3134
- switch (_d.label) {
3301
+ return __generator(this, function (_c) {
3302
+ switch (_c.label) {
3135
3303
  case 0: return [4 /*yield*/, this.loader.lookup(file, type, sync, currentFile)];
3136
3304
  case 1:
3137
- filepath = _d.sent();
3138
- _b = (_a = this.liquid).parse;
3305
+ filepath = _c.sent();
3306
+ _a = this.parse;
3139
3307
  if (!sync) return [3 /*break*/, 2];
3140
- _c = this.fs.readFileSync(filepath);
3308
+ _b = this.fs.readFileSync(filepath);
3141
3309
  return [3 /*break*/, 4];
3142
3310
  case 2: return [4 /*yield*/, this.fs.readFile(filepath)];
3143
3311
  case 3:
3144
- _c = _d.sent();
3145
- _d.label = 4;
3146
- case 4: return [2 /*return*/, _b.apply(_a, [_c, filepath])];
3312
+ _b = _c.sent();
3313
+ _c.label = 4;
3314
+ case 4: return [2 /*return*/, _a.apply(this, [_b, filepath])];
3147
3315
  }
3148
3316
  });
3149
3317
  };
@@ -3220,11 +3388,12 @@
3220
3388
  });
3221
3389
 
3222
3390
  var Context = /** @class */ (function () {
3223
- function Context(env, opts, renderOptions) {
3391
+ function Context(env, opts, renderOptions, _a) {
3224
3392
  if (env === void 0) { env = {}; }
3225
3393
  if (opts === void 0) { opts = defaultOptions; }
3226
3394
  if (renderOptions === void 0) { renderOptions = {}; }
3227
- var _a, _b, _c;
3395
+ var _b = _a === void 0 ? {} : _a, memoryLimit = _b.memoryLimit, renderLimit = _b.renderLimit;
3396
+ var _c, _d, _e, _f, _g;
3228
3397
  /**
3229
3398
  * insert a Context-level empty scope,
3230
3399
  * for tags like `{% capture %}` `{% assign %}` to operate
@@ -3233,10 +3402,12 @@
3233
3402
  this.registers = {};
3234
3403
  this.sync = !!renderOptions.sync;
3235
3404
  this.opts = opts;
3236
- this.globals = (_a = renderOptions.globals) !== null && _a !== void 0 ? _a : opts.globals;
3405
+ this.globals = (_c = renderOptions.globals) !== null && _c !== void 0 ? _c : opts.globals;
3237
3406
  this.environments = isObject(env) ? env : Object(env);
3238
- this.strictVariables = (_b = renderOptions.strictVariables) !== null && _b !== void 0 ? _b : this.opts.strictVariables;
3239
- this.ownPropertyOnly = (_c = renderOptions.ownPropertyOnly) !== null && _c !== void 0 ? _c : opts.ownPropertyOnly;
3407
+ this.strictVariables = (_d = renderOptions.strictVariables) !== null && _d !== void 0 ? _d : this.opts.strictVariables;
3408
+ this.ownPropertyOnly = (_e = renderOptions.ownPropertyOnly) !== null && _e !== void 0 ? _e : opts.ownPropertyOnly;
3409
+ this.memoryLimit = memoryLimit !== null && memoryLimit !== void 0 ? memoryLimit : new Limiter('memory alloc', (_f = renderOptions.memoryLimit) !== null && _f !== void 0 ? _f : opts.memoryLimit);
3410
+ this.renderLimit = renderLimit !== null && renderLimit !== void 0 ? renderLimit : new Limiter('template render', getPerformance().now() + ((_g = renderOptions.renderLimit) !== null && _g !== void 0 ? _g : opts.renderLimit));
3240
3411
  }
3241
3412
  Context.prototype.getRegister = function (key) {
3242
3413
  return (this.registers[key] = this.registers[key] || {});
@@ -3323,6 +3494,17 @@
3323
3494
  Context.prototype.bottom = function () {
3324
3495
  return this.scopes[0];
3325
3496
  };
3497
+ Context.prototype.spawn = function (scope) {
3498
+ if (scope === void 0) { scope = {}; }
3499
+ return new Context(scope, this.opts, {
3500
+ sync: this.sync,
3501
+ globals: this.globals,
3502
+ strictVariables: this.strictVariables
3503
+ }, {
3504
+ renderLimit: this.renderLimit,
3505
+ memoryLimit: this.memoryLimit
3506
+ });
3507
+ };
3326
3508
  Context.prototype.findScope = function (key) {
3327
3509
  for (var i = this.scopes.length - 1; i >= 0; i--) {
3328
3510
  var candidate = this.scopes[i];
@@ -3355,7 +3537,7 @@
3355
3537
  return value;
3356
3538
  }
3357
3539
  function readJSProperty(obj, key, ownPropertyOnly) {
3358
- if (ownPropertyOnly && !Object.hasOwnProperty.call(obj, key) && !(obj instanceof Drop))
3540
+ if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop))
3359
3541
  return undefined;
3360
3542
  return obj[key];
3361
3543
  }
@@ -3370,7 +3552,7 @@
3370
3552
  return obj['last'];
3371
3553
  }
3372
3554
  function readSize(obj) {
3373
- if (obj.hasOwnProperty('size') || obj['size'] !== undefined)
3555
+ if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined)
3374
3556
  return obj['size'];
3375
3557
  if (isArray(obj) || isString(obj))
3376
3558
  return obj.length;
@@ -3483,51 +3665,63 @@
3483
3665
  slugify: slugify
3484
3666
  });
3485
3667
 
3486
- var join = argumentsToValue(function (v, arg) { return toArray(v).join(arg === undefined ? ' ' : arg); });
3668
+ var join = argumentsToValue(function (v, arg) {
3669
+ var array = toArray(v);
3670
+ var sep = isNil(arg) ? ' ' : stringify(arg);
3671
+ var complexity = array.length * (1 + sep.length);
3672
+ this.context.memoryLimit.use(complexity);
3673
+ return array.join(sep);
3674
+ });
3487
3675
  var last$1 = argumentsToValue(function (v) { return isArray(v) ? last(v) : ''; });
3488
3676
  var first = argumentsToValue(function (v) { return isArray(v) ? v[0] : ''; });
3489
- var reverse = argumentsToValue(function (v) { return __spreadArray([], __read(toArray(v)), false).reverse(); });
3677
+ var reverse = argumentsToValue(function (v) {
3678
+ var array = toArray(v);
3679
+ this.context.memoryLimit.use(array.length);
3680
+ return __spreadArray([], __read(array), false).reverse();
3681
+ });
3490
3682
  function sort(arr, property) {
3491
- var values, _a, _b, item, _c, _d, _e, _f, e_1_1;
3492
- var e_1, _g;
3493
- return __generator(this, function (_h) {
3494
- switch (_h.label) {
3683
+ var values, array, array_1, array_1_1, item, _a, _b, _c, _d, e_1_1;
3684
+ var e_1, _e;
3685
+ return __generator(this, function (_f) {
3686
+ switch (_f.label) {
3495
3687
  case 0:
3496
3688
  values = [];
3497
- _h.label = 1;
3689
+ array = toArray(arr);
3690
+ this.context.memoryLimit.use(array.length);
3691
+ _f.label = 1;
3498
3692
  case 1:
3499
- _h.trys.push([1, 8, 9, 10]);
3500
- _a = __values(toArray(arr)), _b = _a.next();
3501
- _h.label = 2;
3693
+ _f.trys.push([1, 8, 9, 10]);
3694
+ array_1 = __values(array), array_1_1 = array_1.next();
3695
+ _f.label = 2;
3502
3696
  case 2:
3503
- if (!!_b.done) return [3 /*break*/, 7];
3504
- item = _b.value;
3505
- _d = (_c = values).push;
3506
- _e = [item];
3697
+ if (!!array_1_1.done) return [3 /*break*/, 7];
3698
+ item = array_1_1.value;
3699
+ _b = (_a = values).push;
3700
+ _c = [item];
3507
3701
  if (!property) return [3 /*break*/, 4];
3508
3702
  return [4 /*yield*/, this.context._getFromScope(item, stringify(property).split('.'), false)];
3509
3703
  case 3:
3510
- _f = _h.sent();
3704
+ _d = _f.sent();
3511
3705
  return [3 /*break*/, 5];
3512
3706
  case 4:
3513
- _f = item;
3514
- _h.label = 5;
3707
+ _d = item;
3708
+ _f.label = 5;
3515
3709
  case 5:
3516
- _d.apply(_c, [_e.concat([
3517
- _f
3710
+ _b.apply(_a, [_c.concat([
3711
+ _d
3518
3712
  ])]);
3519
- _h.label = 6;
3713
+ _f.label = 6;
3520
3714
  case 6:
3521
- _b = _a.next();
3715
+ array_1_1 = array_1.next();
3522
3716
  return [3 /*break*/, 2];
3523
3717
  case 7: return [3 /*break*/, 10];
3524
3718
  case 8:
3525
- e_1_1 = _h.sent();
3719
+ e_1_1 = _f.sent();
3526
3720
  e_1 = { error: e_1_1 };
3527
3721
  return [3 /*break*/, 10];
3528
3722
  case 9:
3529
3723
  try {
3530
- if (_b && !_b.done && (_g = _a.return)) _g.call(_a);
3724
+ if (array_1_1 && !array_1_1.done && (_e = array_1.return)) _e.call(array_1);
3531
3725
  }
3532
3726
  finally { if (e_1) throw e_1.error; }
3533
3727
  return [7 /*endfinally*/];
@@ -3544,40 +3738,44 @@
3544
3738
  var compare = property === undefined
3545
3739
  ? caseInsensitiveCompare
3546
3740
  : function (lhs, rhs) { return caseInsensitiveCompare(lhs[propertyString], rhs[propertyString]); };
3547
- return __spreadArray([], __read(toArray(input)), false).sort(compare);
3741
+ var array = toArray(input);
3742
+ this.context.memoryLimit.use(array.length);
3743
+ return __spreadArray([], __read(array), false).sort(compare);
3548
3744
  }
3549
3745
  var size = function (v) { return (v && v.length) || 0; };
3550
3746
  function map(arr, property) {
3551
- var results, _a, _b, item, _c, _d, e_2_1;
3552
- var e_2, _e;
3553
- return __generator(this, function (_f) {
3554
- switch (_f.label) {
3747
+ var results, array, array_2, array_2_1, item, _a, _b, e_2_1;
3748
+ var e_2, _c;
3749
+ return __generator(this, function (_d) {
3750
+ switch (_d.label) {
3555
3751
  case 0:
3556
3752
  results = [];
3557
- _f.label = 1;
3753
+ array = toArray(arr);
3754
+ this.context.memoryLimit.use(array.length);
3755
+ _d.label = 1;
3558
3756
  case 1:
3559
- _f.trys.push([1, 6, 7, 8]);
3560
- _a = __values(toArray(arr)), _b = _a.next();
3561
- _f.label = 2;
3757
+ _d.trys.push([1, 6, 7, 8]);
3758
+ array_2 = __values(array), array_2_1 = array_2.next();
3759
+ _d.label = 2;
3562
3760
  case 2:
3563
- if (!!_b.done) return [3 /*break*/, 5];
3564
- item = _b.value;
3565
- _d = (_c = results).push;
3761
+ if (!!array_2_1.done) return [3 /*break*/, 5];
3762
+ item = array_2_1.value;
3763
+ _b = (_a = results).push;
3566
3764
  return [4 /*yield*/, this.context._getFromScope(item, stringify(property), false)];
3567
3765
  case 3:
3568
- _d.apply(_c, [_f.sent()]);
3569
- _f.label = 4;
3766
+ _b.apply(_a, [_d.sent()]);
3767
+ _d.label = 4;
3570
3768
  case 4:
3571
- _b = _a.next();
3769
+ array_2_1 = array_2.next();
3572
3770
  return [3 /*break*/, 2];
3573
3771
  case 5: return [3 /*break*/, 8];
3574
3772
  case 6:
3575
- e_2_1 = _f.sent();
3773
+ e_2_1 = _d.sent();
3576
3774
  e_2 = { error: e_2_1 };
3577
3775
  return [3 /*break*/, 8];
3578
3776
  case 7:
3579
3777
  try {
3580
- if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
3778
+ if (array_2_1 && !array_2_1.done && (_c = array_2.return)) _c.call(array_2);
3581
3779
  }
3582
3780
  finally { if (e_2) throw e_2.error; }
3583
3781
  return [7 /*endfinally*/];
@@ -3586,44 +3784,45 @@
3586
3784
  });
3587
3785
  }
3588
3786
  function sum(arr, property) {
3589
- var sum, _a, _b, item, data, _c, _d, e_3_1;
3590
- var e_3, _e;
3591
- return __generator(this, function (_f) {
3592
- switch (_f.label) {
3787
+ var sum, array, array_3, array_3_1, item, data, _a, _b, e_3_1;
3788
+ var e_3, _c;
3789
+ return __generator(this, function (_d) {
3790
+ switch (_d.label) {
3593
3791
  case 0:
3594
3792
  sum = 0;
3595
- _f.label = 1;
3793
+ array = toArray(arr);
3794
+ _d.label = 1;
3596
3795
  case 1:
3597
- _f.trys.push([1, 8, 9, 10]);
3598
- _a = __values(toArray(arr)), _b = _a.next();
3599
- _f.label = 2;
3796
+ _d.trys.push([1, 8, 9, 10]);
3797
+ array_3 = __values(array), array_3_1 = array_3.next();
3798
+ _d.label = 2;
3600
3799
  case 2:
3601
- if (!!_b.done) return [3 /*break*/, 7];
3602
- item = _b.value;
3603
- _c = Number;
3800
+ if (!!array_3_1.done) return [3 /*break*/, 7];
3801
+ item = array_3_1.value;
3802
+ _a = Number;
3604
3803
  if (!property) return [3 /*break*/, 4];
3605
3804
  return [4 /*yield*/, this.context._getFromScope(item, stringify(property), false)];
3606
3805
  case 3:
3607
- _d = _f.sent();
3806
+ _b = _d.sent();
3608
3807
  return [3 /*break*/, 5];
3609
3808
  case 4:
3610
- _d = item;
3611
- _f.label = 5;
3809
+ _b = item;
3810
+ _d.label = 5;
3612
3811
  case 5:
3613
- data = _c.apply(void 0, [_d]);
3812
+ data = _a.apply(void 0, [_b]);
3614
3813
  sum += Number.isNaN(data) ? 0 : data;
3615
- _f.label = 6;
3814
+ _d.label = 6;
3616
3815
  case 6:
3617
- _b = _a.next();
3816
+ array_3_1 = array_3.next();
3618
3817
  return [3 /*break*/, 2];
3619
3818
  case 7: return [3 /*break*/, 10];
3620
3819
  case 8:
3621
- e_3_1 = _f.sent();
3820
+ e_3_1 = _d.sent();
3622
3821
  e_3 = { error: e_3_1 };
3623
3822
  return [3 /*break*/, 10];
3624
3823
  case 9:
3625
3824
  try {
3626
- if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
3825
+ if (array_3_1 && !array_3_1.done && (_c = array_3.return)) _c.call(array_3);
3627
3826
  }
3628
3827
  finally { if (e_3) throw e_3.error; }
3629
3828
  return [7 /*endfinally*/];
@@ -3632,17 +3831,24 @@
3632
3831
  });
3633
3832
  }
3634
3833
  function compact(arr) {
3635
- return toArray(arr).filter(function (x) { return !isNil(toValue(x)); });
3834
+ var array = toArray(arr);
3835
+ this.context.memoryLimit.use(array.length);
3836
+ return array.filter(function (x) { return !isNil(toValue(x)); });
3636
3837
  }
3637
3838
  function concat(v, arg) {
3638
3839
  if (arg === void 0) { arg = []; }
3639
- return toArray(v).concat(toArray(arg));
3840
+ var lhs = toArray(v);
3841
+ var rhs = toArray(arg);
3842
+ this.context.memoryLimit.use(lhs.length + rhs.length);
3843
+ return lhs.concat(rhs);
3640
3844
  }
3641
3845
  function push(v, arg) {
3642
- return concat(v, [arg]);
3846
+ return concat.call(this, v, [arg]);
3643
3847
  }
3644
3848
  function unshift(v, arg) {
3645
- var clone = __spreadArray([], __read(toArray(v)), false);
3849
+ var array = toArray(v);
3850
+ this.context.memoryLimit.use(array.length);
3851
+ var clone = __spreadArray([], __read(array), false);
3646
3852
  clone.unshift(arg);
3647
3853
  return clone;
3648
3854
  }
@@ -3652,7 +3858,9 @@
3652
3858
  return clone;
3653
3859
  }
3654
3860
  function shift(v) {
3655
- var clone = __spreadArray([], __read(toArray(v)), false);
3861
+ var array = toArray(v);
3862
+ this.context.memoryLimit.use(array.length);
3863
+ var clone = __spreadArray([], __read(array), false);
3656
3864
  clone.shift();
3657
3865
  return clone;
3658
3866
  }
@@ -3664,6 +3872,7 @@
3664
3872
  if (!isArray(v))
3665
3873
  v = stringify(v);
3666
3874
  begin = begin < 0 ? v.length + begin : begin;
3875
+ this.context.memoryLimit.use(length);
3667
3876
  return v.slice(begin, begin + length);
3668
3877
  }
3669
3878
  function where(arr, property, expected) {
@@ -3675,6 +3884,7 @@
3675
3884
  case 0:
3676
3885
  values = [];
3677
3886
  arr = toArray(arr);
3887
+ this.context.memoryLimit.use(arr.length);
3678
3888
  token = new Tokenizer(stringify(property)).readScopeValue();
3679
3889
  _d.label = 1;
3680
3890
  case 1:
@@ -3685,7 +3895,7 @@
3685
3895
  if (!!arr_1_1.done) return [3 /*break*/, 5];
3686
3896
  item = arr_1_1.value;
3687
3897
  _b = (_a = values).push;
3688
- return [4 /*yield*/, evalToken(token, new Context(item))];
3898
+ return [4 /*yield*/, evalToken(token, this.context.spawn(item))];
3689
3899
  case 3:
3690
3900
  _b.apply(_a, [_d.sent()]);
3691
3901
  _d.label = 4;
@@ -3712,38 +3922,40 @@
3712
3922
  });
3713
3923
  }
3714
3924
  function where_exp(arr, itemName, exp) {
3715
- var filtered, keyTemplate, _a, _b, item, value, e_5_1;
3716
- var e_5, _c, _d;
3717
- return __generator(this, function (_e) {
3718
- switch (_e.label) {
3925
+ var filtered, keyTemplate, array, array_4, array_4_1, item, value, e_5_1;
3926
+ var e_5, _a, _b;
3927
+ return __generator(this, function (_c) {
3928
+ switch (_c.label) {
3719
3929
  case 0:
3720
3930
  filtered = [];
3721
3931
  keyTemplate = new Value(stringify(exp), this.liquid);
3722
- _e.label = 1;
3932
+ array = toArray(arr);
3933
+ this.context.memoryLimit.use(array.length);
3934
+ _c.label = 1;
3723
3935
  case 1:
3724
- _e.trys.push([1, 6, 7, 8]);
3725
- _a = __values(toArray(arr)), _b = _a.next();
3726
- _e.label = 2;
3936
+ _c.trys.push([1, 6, 7, 8]);
3937
+ array_4 = __values(array), array_4_1 = array_4.next();
3938
+ _c.label = 2;
3727
3939
  case 2:
3728
- if (!!_b.done) return [3 /*break*/, 5];
3729
- item = _b.value;
3730
- return [4 /*yield*/, keyTemplate.value(new Context((_d = {}, _d[itemName] = item, _d)))];
3940
+ if (!!array_4_1.done) return [3 /*break*/, 5];
3941
+ item = array_4_1.value;
3942
+ return [4 /*yield*/, keyTemplate.value(this.context.spawn((_b = {}, _b[itemName] = item, _b)))];
3731
3943
  case 3:
3732
- value = _e.sent();
3944
+ value = _c.sent();
3733
3945
  if (value)
3734
3946
  filtered.push(item);
3735
- _e.label = 4;
3947
+ _c.label = 4;
3736
3948
  case 4:
3737
- _b = _a.next();
3949
+ array_4_1 = array_4.next();
3738
3950
  return [3 /*break*/, 2];
3739
3951
  case 5: return [3 /*break*/, 8];
3740
3952
  case 6:
3741
- e_5_1 = _e.sent();
3953
+ e_5_1 = _c.sent();
3742
3954
  e_5 = { error: e_5_1 };
3743
3955
  return [3 /*break*/, 8];
3744
3956
  case 7:
3745
3957
  try {
3746
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
3958
+ if (array_4_1 && !array_4_1.done && (_a = array_4.return)) _a.call(array_4);
3747
3959
  }
3748
3960
  finally { if (e_5) throw e_5.error; }
3749
3961
  return [7 /*endfinally*/];
@@ -3760,6 +3972,7 @@
3760
3972
  map = new Map();
3761
3973
  arr = toArray(arr);
3762
3974
  token = new Tokenizer(stringify(property)).readScopeValue();
3975
+ this.context.memoryLimit.use(arr.length);
3763
3976
  _b.label = 1;
3764
3977
  case 1:
3765
3978
  _b.trys.push([1, 6, 7, 8]);
@@ -3768,7 +3981,7 @@
3768
3981
  case 2:
3769
3982
  if (!!arr_2_1.done) return [3 /*break*/, 5];
3770
3983
  item = arr_2_1.value;
3771
- return [4 /*yield*/, evalToken(token, new Context(item))];
3984
+ return [4 /*yield*/, evalToken(token, this.context.spawn(item))];
3772
3985
  case 3:
3773
3986
  key = _b.sent();
3774
3987
  if (!map.has(key))
@@ -3797,39 +4010,41 @@
3797
4010
  });
3798
4011
  }
3799
4012
  function group_by_exp(arr, itemName, exp) {
3800
- var map, keyTemplate, _a, _b, item, key, e_7_1;
3801
- var e_7, _c, _d;
3802
- return __generator(this, function (_e) {
3803
- switch (_e.label) {
4013
+ var map, keyTemplate, arr_3, arr_3_1, item, key, e_7_1;
4014
+ var e_7, _a, _b;
4015
+ return __generator(this, function (_c) {
4016
+ switch (_c.label) {
3804
4017
  case 0:
3805
4018
  map = new Map();
3806
4019
  keyTemplate = new Value(stringify(exp), this.liquid);
3807
- _e.label = 1;
4020
+ arr = toArray(arr);
4021
+ this.context.memoryLimit.use(arr.length);
4022
+ _c.label = 1;
3808
4023
  case 1:
3809
- _e.trys.push([1, 6, 7, 8]);
3810
- _a = __values(toArray(arr)), _b = _a.next();
3811
- _e.label = 2;
4024
+ _c.trys.push([1, 6, 7, 8]);
4025
+ arr_3 = __values(arr), arr_3_1 = arr_3.next();
4026
+ _c.label = 2;
3812
4027
  case 2:
3813
- if (!!_b.done) return [3 /*break*/, 5];
3814
- item = _b.value;
3815
- return [4 /*yield*/, keyTemplate.value(new Context((_d = {}, _d[itemName] = item, _d)))];
4028
+ if (!!arr_3_1.done) return [3 /*break*/, 5];
4029
+ item = arr_3_1.value;
4030
+ return [4 /*yield*/, keyTemplate.value(this.context.spawn((_b = {}, _b[itemName] = item, _b)))];
3816
4031
  case 3:
3817
- key = _e.sent();
4032
+ key = _c.sent();
3818
4033
  if (!map.has(key))
3819
4034
  map.set(key, []);
3820
4035
  map.get(key).push(item);
3821
- _e.label = 4;
4036
+ _c.label = 4;
3822
4037
  case 4:
3823
- _b = _a.next();
4038
+ arr_3_1 = arr_3.next();
3824
4039
  return [3 /*break*/, 2];
3825
4040
  case 5: return [3 /*break*/, 8];
3826
4041
  case 6:
3827
- e_7_1 = _e.sent();
4042
+ e_7_1 = _c.sent();
3828
4043
  e_7 = { error: e_7_1 };
3829
4044
  return [3 /*break*/, 8];
3830
4045
  case 7:
3831
4046
  try {
3832
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
4047
+ if (arr_3_1 && !arr_3_1.done && (_a = arr_3.return)) _a.call(arr_3);
3833
4048
  }
3834
4049
  finally { if (e_7) throw e_7.error; }
3835
4050
  return [7 /*endfinally*/];
@@ -3841,92 +4056,89 @@
3841
4056
  });
3842
4057
  }
3843
4058
  function find(arr, property, expected) {
3844
- var token, _a, _b, item, value, e_8_1;
3845
- var e_8, _c;
3846
- return __generator(this, function (_d) {
3847
- switch (_d.label) {
4059
+ var token, array, array_5, array_5_1, item, value, e_8_1;
4060
+ var e_8, _a;
4061
+ return __generator(this, function (_b) {
4062
+ switch (_b.label) {
3848
4063
  case 0:
3849
4064
  token = new Tokenizer(stringify(property)).readScopeValue();
3850
- _d.label = 1;
4065
+ array = toArray(arr);
4066
+ _b.label = 1;
3851
4067
  case 1:
3852
- _d.trys.push([1, 6, 7, 8]);
3853
- _a = __values(toArray(arr)), _b = _a.next();
3854
- _d.label = 2;
4068
+ _b.trys.push([1, 6, 7, 8]);
4069
+ array_5 = __values(array), array_5_1 = array_5.next();
4070
+ _b.label = 2;
3855
4071
  case 2:
3856
- if (!!_b.done) return [3 /*break*/, 5];
3857
- item = _b.value;
3858
- return [4 /*yield*/, evalToken(token, new Context(item))];
4072
+ if (!!array_5_1.done) return [3 /*break*/, 5];
4073
+ item = array_5_1.value;
4074
+ return [4 /*yield*/, evalToken(token, this.context.spawn(item))];
3859
4075
  case 3:
3860
- value = _d.sent();
4076
+ value = _b.sent();
3861
4077
  if (equals(value, expected))
3862
4078
  return [2 /*return*/, item];
3863
- _d.label = 4;
4079
+ _b.label = 4;
3864
4080
  case 4:
3865
- _b = _a.next();
4081
+ array_5_1 = array_5.next();
3866
4082
  return [3 /*break*/, 2];
3867
4083
  case 5: return [3 /*break*/, 8];
3868
4084
  case 6:
3869
- e_8_1 = _d.sent();
4085
+ e_8_1 = _b.sent();
3870
4086
  e_8 = { error: e_8_1 };
3871
4087
  return [3 /*break*/, 8];
3872
4088
  case 7:
3873
4089
  try {
3874
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
4090
+ if (array_5_1 && !array_5_1.done && (_a = array_5.return)) _a.call(array_5);
3875
4091
  }
3876
4092
  finally { if (e_8) throw e_8.error; }
3877
4093
  return [7 /*endfinally*/];
3878
- case 8: return [2 /*return*/, null];
4094
+ case 8: return [2 /*return*/];
3879
4095
  }
3880
4096
  });
3881
4097
  }
3882
4098
  function find_exp(arr, itemName, exp) {
3883
- var predicate, _a, _b, item, value, e_9_1;
3884
- var e_9, _c, _d;
3885
- return __generator(this, function (_e) {
3886
- switch (_e.label) {
4099
+ var predicate, array, array_6, array_6_1, item, value, e_9_1;
4100
+ var e_9, _a, _b;
4101
+ return __generator(this, function (_c) {
4102
+ switch (_c.label) {
3887
4103
  case 0:
3888
4104
  predicate = new Value(stringify(exp), this.liquid);
3889
- _e.label = 1;
4105
+ array = toArray(arr);
4106
+ _c.label = 1;
3890
4107
  case 1:
3891
- _e.trys.push([1, 6, 7, 8]);
3892
- _a = __values(toArray(arr)), _b = _a.next();
3893
- _e.label = 2;
4108
+ _c.trys.push([1, 6, 7, 8]);
4109
+ array_6 = __values(array), array_6_1 = array_6.next();
4110
+ _c.label = 2;
3894
4111
  case 2:
3895
- if (!!_b.done) return [3 /*break*/, 5];
3896
- item = _b.value;
3897
- return [4 /*yield*/, predicate.value(new Context((_d = {}, _d[itemName] = item, _d)))];
4112
+ if (!!array_6_1.done) return [3 /*break*/, 5];
4113
+ item = array_6_1.value;
4114
+ return [4 /*yield*/, predicate.value(this.context.spawn((_b = {}, _b[itemName] = item, _b)))];
3898
4115
  case 3:
3899
- value = _e.sent();
4116
+ value = _c.sent();
3900
4117
  if (value)
3901
4118
  return [2 /*return*/, item];
3902
- _e.label = 4;
4119
+ _c.label = 4;
3903
4120
  case 4:
3904
- _b = _a.next();
4121
+ array_6_1 = array_6.next();
3905
4122
  return [3 /*break*/, 2];
3906
4123
  case 5: return [3 /*break*/, 8];
3907
4124
  case 6:
3908
- e_9_1 = _e.sent();
4125
+ e_9_1 = _c.sent();
3909
4126
  e_9 = { error: e_9_1 };
3910
4127
  return [3 /*break*/, 8];
3911
4128
  case 7:
3912
4129
  try {
3913
- if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
4130
+ if (array_6_1 && !array_6_1.done && (_a = array_6.return)) _a.call(array_6);
3914
4131
  }
3915
4132
  finally { if (e_9) throw e_9.error; }
3916
4133
  return [7 /*endfinally*/];
3917
- case 8: return [2 /*return*/, null];
4134
+ case 8: return [2 /*return*/];
3918
4135
  }
3919
4136
  });
3920
4137
  }
3921
4138
  function uniq(arr) {
3922
- arr = toValue(arr);
3923
- var u = {};
3924
- return (arr || []).filter(function (val) {
3925
- if (hasOwnProperty.call(u, String(val)))
3926
- return false;
3927
- u[String(val)] = true;
3928
- return true;
3929
- });
4139
+ arr = toArray(arr);
4140
+ this.context.memoryLimit.use(arr.length);
4141
+ return __spreadArray([], __read(new Set(arr)), false);
3930
4142
  }
3931
4143
  function sample(v, count) {
3932
4144
  if (count === void 0) { count = 1; }
@@ -3935,6 +4147,7 @@
3935
4147
  return [];
3936
4148
  if (!isArray(v))
3937
4149
  v = stringify(v);
4150
+ this.context.memoryLimit.use(count);
3938
4151
  var shuffled = __spreadArray([], __read(v), false).sort(function () { return Math.random() - 0.5; });
3939
4152
  if (count === 1)
3940
4153
  return shuffled[0];
@@ -3970,6 +4183,9 @@
3970
4183
  });
3971
4184
 
3972
4185
  function date(v, format, timezoneOffset) {
4186
+ var _a, _b, _c;
4187
+ var size = ((_a = v === null || v === void 0 ? void 0 : v.length) !== null && _a !== void 0 ? _a : 0) + ((_b = format === null || format === void 0 ? void 0 : format.length) !== null && _b !== void 0 ? _b : 0) + ((_c = timezoneOffset === null || timezoneOffset === void 0 ? void 0 : timezoneOffset.length) !== null && _c !== void 0 ? _c : 0);
4188
+ this.context.memoryLimit.use(size);
3973
4189
  var date = parseDate(v, this.context.opts, timezoneOffset);
3974
4190
  if (!date)
3975
4191
  return v;
@@ -4003,39 +4219,30 @@
4003
4219
  }
4004
4220
  function parseDate(v, opts, timezoneOffset) {
4005
4221
  var date;
4222
+ var defaultTimezoneOffset = timezoneOffset !== null && timezoneOffset !== void 0 ? timezoneOffset : opts.timezoneOffset;
4223
+ var locale = opts.locale;
4006
4224
  v = toValue(v);
4007
4225
  if (v === 'now' || v === 'today') {
4008
- date = new Date();
4226
+ date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset);
4009
4227
  }
4010
4228
  else if (isNumber(v)) {
4011
- date = new Date(v * 1000);
4229
+ date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset);
4012
4230
  }
4013
4231
  else if (isString(v)) {
4014
4232
  if (/^\d+$/.test(v)) {
4015
- date = new Date(+v * 1000);
4233
+ date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset);
4016
4234
  }
4017
- else if (opts.preserveTimezones) {
4018
- date = TimezoneDate.createDateFixedToTimezone(v);
4235
+ else if (opts.preserveTimezones && timezoneOffset === undefined) {
4236
+ date = LiquidDate.createDateFixedToTimezone(v, locale);
4019
4237
  }
4020
4238
  else {
4021
- date = new Date(v);
4239
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
4022
4240
  }
4023
4241
  }
4024
4242
  else {
4025
- date = v;
4026
- }
4027
- if (!isValidDate(date))
4028
- return;
4029
- if (timezoneOffset !== undefined) {
4030
- date = new TimezoneDate(date, timezoneOffset);
4243
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
4031
4244
  }
4032
- else if (!(date instanceof TimezoneDate) && opts.timezoneOffset !== undefined) {
4033
- date = new TimezoneDate(date, opts.timezoneOffset);
4034
- }
4035
- return date;
4036
- }
4037
- function isValidDate(date) {
4038
- return (date instanceof Date || date instanceof TimezoneDate) && !isNaN(date.getTime());
4245
+ return date.valid() ? date : undefined;
4039
4246
  }
4040
4247
 
4041
4248
  var dateFilters = /*#__PURE__*/Object.freeze({
@@ -4057,33 +4264,50 @@
4057
4264
  var rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu;
4058
4265
  function append(v, arg) {
4059
4266
  assert(arguments.length === 2, 'append expect 2 arguments');
4060
- return stringify(v) + stringify(arg);
4267
+ var lhs = stringify(v);
4268
+ var rhs = stringify(arg);
4269
+ this.context.memoryLimit.use(lhs.length + rhs.length);
4270
+ return lhs + rhs;
4061
4271
  }
4062
4272
  function prepend(v, arg) {
4063
4273
  assert(arguments.length === 2, 'prepend expect 2 arguments');
4064
- return stringify(arg) + stringify(v);
4274
+ var lhs = stringify(v);
4275
+ var rhs = stringify(arg);
4276
+ this.context.memoryLimit.use(lhs.length + rhs.length);
4277
+ return rhs + lhs;
4065
4278
  }
4066
4279
  function lstrip(v, chars) {
4280
+ var str = stringify(v);
4281
+ this.context.memoryLimit.use(str.length);
4067
4282
  if (chars) {
4068
4283
  chars = escapeRegExp(stringify(chars));
4069
- return stringify(v).replace(new RegExp("^[".concat(chars, "]+"), 'g'), '');
4284
+ return str.replace(new RegExp("^[".concat(chars, "]+"), 'g'), '');
4070
4285
  }
4071
- return stringify(v).replace(/^\s+/, '');
4286
+ return str.replace(/^\s+/, '');
4072
4287
  }
4073
4288
  function downcase(v) {
4074
- return stringify(v).toLowerCase();
4289
+ var str = stringify(v);
4290
+ this.context.memoryLimit.use(str.length);
4291
+ return str.toLowerCase();
4075
4292
  }
4076
- function upcase(str) {
4293
+ function upcase(v) {
4294
+ var str = stringify(v);
4295
+ this.context.memoryLimit.use(str.length);
4077
4296
  return stringify(str).toUpperCase();
4078
4297
  }
4079
4298
  function remove(v, arg) {
4080
- return stringify(v).split(stringify(arg)).join('');
4299
+ var str = stringify(v);
4300
+ this.context.memoryLimit.use(str.length);
4301
+ return str.split(stringify(arg)).join('');
4081
4302
  }
4082
4303
  function remove_first(v, l) {
4083
- return stringify(v).replace(stringify(l), '');
4304
+ var str = stringify(v);
4305
+ this.context.memoryLimit.use(str.length);
4306
+ return str.replace(stringify(l), '');
4084
4307
  }
4085
4308
  function remove_last(v, l) {
4086
4309
  var str = stringify(v);
4310
+ this.context.memoryLimit.use(str.length);
4087
4311
  var pattern = stringify(l);
4088
4312
  var index = str.lastIndexOf(pattern);
4089
4313
  if (index === -1)
@@ -4091,14 +4315,18 @@
4091
4315
  return str.substring(0, index) + str.substring(index + pattern.length);
4092
4316
  }
4093
4317
  function rstrip(str, chars) {
4318
+ str = stringify(str);
4319
+ this.context.memoryLimit.use(str.length);
4094
4320
  if (chars) {
4095
4321
  chars = escapeRegExp(stringify(chars));
4096
- return stringify(str).replace(new RegExp("[".concat(chars, "]+$"), 'g'), '');
4322
+ return str.replace(new RegExp("[".concat(chars, "]+$"), 'g'), '');
4097
4323
  }
4098
- return stringify(str).replace(/\s+$/, '');
4324
+ return str.replace(/\s+$/, '');
4099
4325
  }
4100
4326
  function split(v, arg) {
4101
- var arr = stringify(v).split(stringify(arg));
4327
+ var str = stringify(v);
4328
+ this.context.memoryLimit.use(str.length);
4329
+ var arr = str.split(stringify(arg));
4102
4330
  // align to ruby split, which is the behavior of shopify/liquid
4103
4331
  // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split
4104
4332
  while (arr.length && arr[arr.length - 1] === '')
@@ -4106,29 +4334,39 @@
4106
4334
  return arr;
4107
4335
  }
4108
4336
  function strip(v, chars) {
4337
+ var str = stringify(v);
4338
+ this.context.memoryLimit.use(str.length);
4109
4339
  if (chars) {
4110
4340
  chars = escapeRegExp(stringify(chars));
4111
- return stringify(v)
4341
+ return str
4112
4342
  .replace(new RegExp("^[".concat(chars, "]+"), 'g'), '')
4113
4343
  .replace(new RegExp("[".concat(chars, "]+$"), 'g'), '');
4114
4344
  }
4115
- return stringify(v).trim();
4345
+ return str.trim();
4116
4346
  }
4117
4347
  function strip_newlines(v) {
4118
- return stringify(v).replace(/\r?\n/gm, '');
4348
+ var str = stringify(v);
4349
+ this.context.memoryLimit.use(str.length);
4350
+ return str.replace(/\r?\n/gm, '');
4119
4351
  }
4120
4352
  function capitalize(str) {
4121
4353
  str = stringify(str);
4354
+ this.context.memoryLimit.use(str.length);
4122
4355
  return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
4123
4356
  }
4124
4357
  function replace(v, pattern, replacement) {
4125
- return stringify(v).split(stringify(pattern)).join(replacement);
4358
+ var str = stringify(v);
4359
+ this.context.memoryLimit.use(str.length);
4360
+ return str.split(stringify(pattern)).join(replacement);
4126
4361
  }
4127
4362
  function replace_first(v, arg1, arg2) {
4128
- return stringify(v).replace(stringify(arg1), arg2);
4363
+ var str = stringify(v);
4364
+ this.context.memoryLimit.use(str.length);
4365
+ return str.replace(stringify(arg1), arg2);
4129
4366
  }
4130
4367
  function replace_last(v, arg1, arg2) {
4131
4368
  var str = stringify(v);
4369
+ this.context.memoryLimit.use(str.length);
4132
4370
  var pattern = stringify(arg1);
4133
4371
  var index = str.lastIndexOf(pattern);
4134
4372
  if (index === -1)
@@ -4139,15 +4377,18 @@
4139
4377
  function truncate(v, l, o) {
4140
4378
  if (l === void 0) { l = 50; }
4141
4379
  if (o === void 0) { o = '...'; }
4142
- v = stringify(v);
4143
- if (v.length <= l)
4380
+ var str = stringify(v);
4381
+ this.context.memoryLimit.use(str.length);
4382
+ if (str.length <= l)
4144
4383
  return v;
4145
- return v.substring(0, l - o.length) + o;
4384
+ return str.substring(0, l - o.length) + o;
4146
4385
  }
4147
4386
  function truncatewords(v, words, o) {
4148
4387
  if (words === void 0) { words = 15; }
4149
4388
  if (o === void 0) { o = '...'; }
4150
- var arr = stringify(v).split(/\s+/);
4389
+ var str = stringify(v);
4390
+ this.context.memoryLimit.use(str.length);
4391
+ var arr = str.split(/\s+/);
4151
4392
  if (words <= 0)
4152
4393
  words = 1;
4153
4394
  var ret = arr.slice(0, words).join(' ');
@@ -4156,11 +4397,14 @@
4156
4397
  return ret;
4157
4398
  }
4158
4399
  function normalize_whitespace(v) {
4159
- v = stringify(v);
4160
- return v.replace(/\s+/g, ' ');
4400
+ var str = stringify(v);
4401
+ this.context.memoryLimit.use(str.length);
4402
+ return str.replace(/\s+/g, ' ');
4161
4403
  }
4162
4404
  function number_of_words(input, mode) {
4163
- input = stringify(input).trim();
4405
+ var str = stringify(input);
4406
+ this.context.memoryLimit.use(str.length);
4407
+ input = str.trim();
4164
4408
  if (!input)
4165
4409
  return 0;
4166
4410
  switch (mode) {
@@ -4179,6 +4423,7 @@
4179
4423
  }
4180
4424
  function array_to_sentence_string(array, connector) {
4181
4425
  if (connector === void 0) { connector = 'and'; }
4426
+ this.context.memoryLimit.use(array.length);
4182
4427
  switch (array.length) {
4183
4428
  case 0:
4184
4429
  return '';
@@ -4250,7 +4495,7 @@
4250
4495
  var MODIFIERS = ['offset', 'limit', 'reversed'];
4251
4496
  var default_1$1 = /** @class */ (function (_super) {
4252
4497
  __extends(default_1, _super);
4253
- function default_1(token, remainTokens, liquid) {
4498
+ function default_1(token, remainTokens, liquid, parser) {
4254
4499
  var _this = _super.call(this, token, remainTokens, liquid) || this;
4255
4500
  var variable = _this.tokenizer.readIdentifier();
4256
4501
  var inStr = _this.tokenizer.readIdentifier();
@@ -4260,18 +4505,16 @@
4260
4505
  }
4261
4506
  _this.variable = variable.content;
4262
4507
  _this.collection = collection;
4263
- _this.hash = new Hash(_this.tokenizer.remaining());
4508
+ _this.hash = new Hash(_this.tokenizer.remaining(), liquid.options.keyValueSeparator);
4264
4509
  _this.templates = [];
4265
4510
  _this.elseTemplates = [];
4266
4511
  var p;
4267
- var stream = _this.liquid.parser.parseStream(remainTokens)
4512
+ var stream = parser.parseStream(remainTokens)
4268
4513
  .on('start', function () { return (p = _this.templates); })
4269
- .on('tag:else', function () { return (p = _this.elseTemplates); })
4270
- .on('tag:endfor', function () { return stream.stop(); })
4514
+ .on('tag:else', function (tag) { assertEmpty(tag.args); p = _this.elseTemplates; })
4515
+ .on('tag:endfor', function (tag) { assertEmpty(tag.args); stream.stop(); })
4271
4516
  .on('template', function (tpl) { return p.push(tpl); })
4272
- .on('end', function () {
4273
- throw new Error("tag ".concat(token.getText(), " not closed"));
4274
- });
4517
+ .on('end', function () { throw new Error("tag ".concat(token.getText(), " not closed")); });
4275
4518
  stream.start();
4276
4519
  return _this;
4277
4520
  }
@@ -4364,7 +4607,7 @@
4364
4607
 
4365
4608
  var default_1$2 = /** @class */ (function (_super) {
4366
4609
  __extends(default_1, _super);
4367
- function default_1(tagToken, remainTokens, liquid) {
4610
+ function default_1(tagToken, remainTokens, liquid, parser) {
4368
4611
  var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
4369
4612
  _this.templates = [];
4370
4613
  _this.variable = _this.readVariableName();
@@ -4372,7 +4615,7 @@
4372
4615
  var token = remainTokens.shift();
4373
4616
  if (isTagToken(token) && token.name === 'endcapture')
4374
4617
  return _this;
4375
- _this.templates.push(liquid.parser.parseToken(token, remainTokens));
4618
+ _this.templates.push(parser.parseToken(token, remainTokens));
4376
4619
  }
4377
4620
  throw new Error("tag ".concat(tagToken.getText(), " not closed"));
4378
4621
  }
@@ -4404,7 +4647,7 @@
4404
4647
 
4405
4648
  var default_1$3 = /** @class */ (function (_super) {
4406
4649
  __extends(default_1, _super);
4407
- function default_1(tagToken, remainTokens, liquid) {
4650
+ function default_1(tagToken, remainTokens, liquid, parser) {
4408
4651
  var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
4409
4652
  _this.branches = [];
4410
4653
  _this.elseTemplates = [];
@@ -4412,7 +4655,7 @@
4412
4655
  _this.elseTemplates = [];
4413
4656
  var p = [];
4414
4657
  var elseCount = 0;
4415
- var stream = _this.liquid.parser.parseStream(remainTokens)
4658
+ var stream = parser.parseStream(remainTokens)
4416
4659
  .on('tag:when', function (token) {
4417
4660
  if (elseCount > 0) {
4418
4661
  return;
@@ -4545,10 +4788,10 @@
4545
4788
 
4546
4789
  var default_1$5 = /** @class */ (function (_super) {
4547
4790
  __extends(default_1, _super);
4548
- function default_1(token, remainTokens, liquid) {
4791
+ function default_1(token, remainTokens, liquid, parser) {
4549
4792
  var _this = _super.call(this, token, remainTokens, liquid) || this;
4550
4793
  var tokenizer = _this.tokenizer;
4551
- _this.file = parseFilePath(tokenizer, _this.liquid);
4794
+ _this.file = parseFilePath(tokenizer, _this.liquid, parser);
4552
4795
  _this.currentFile = token.file;
4553
4796
  while (!tokenizer.end()) {
4554
4797
  tokenizer.skipBlank();
@@ -4582,7 +4825,7 @@
4582
4825
  tokenizer.p = begin;
4583
4826
  break;
4584
4827
  }
4585
- _this.hash = new Hash(tokenizer.remaining());
4828
+ _this.hash = new Hash(tokenizer.remaining(), liquid.options.keyValueSeparator);
4586
4829
  return _this;
4587
4830
  }
4588
4831
  default_1.prototype.render = function (ctx, emitter) {
@@ -4596,7 +4839,7 @@
4596
4839
  case 1:
4597
4840
  filepath = (_k.sent());
4598
4841
  assert(filepath, function () { return "illegal file path \"".concat(filepath, "\""); });
4599
- childCtx = new Context({}, ctx.opts, { sync: ctx.sync, globals: ctx.globals, strictVariables: ctx.strictVariables });
4842
+ childCtx = ctx.spawn();
4600
4843
  scope = childCtx.bottom();
4601
4844
  _b = __assign;
4602
4845
  _c = [scope];
@@ -4670,7 +4913,7 @@
4670
4913
  * @return Token for expression (not quoted)
4671
4914
  * @throws TypeError if cannot read next token
4672
4915
  */
4673
- function parseFilePath(tokenizer, liquid) {
4916
+ function parseFilePath(tokenizer, liquid, parser) {
4674
4917
  if (liquid.options.dynamicPartials) {
4675
4918
  var file = tokenizer.readValue();
4676
4919
  tokenizer.assert(file, 'illegal file path');
@@ -4678,13 +4921,13 @@
4678
4921
  return;
4679
4922
  if (isQuotedToken(file)) {
4680
4923
  // for filenames like "files/{{file}}", eval as liquid template
4681
- var templates_1 = liquid.parse(evalQuotedToken(file));
4924
+ var templates_1 = parser.parse(evalQuotedToken(file));
4682
4925
  return optimize(templates_1);
4683
4926
  }
4684
4927
  return file;
4685
4928
  }
4686
4929
  var tokens = __spreadArray([], __read(tokenizer.readFileNameTemplate(liquid.options)), false);
4687
- var templates = optimize(liquid.parser.parseTokens(tokens));
4930
+ var templates = optimize(parser.parseTokens(tokens));
4688
4931
  return templates === 'none' ? undefined : templates;
4689
4932
  }
4690
4933
  function optimize(templates) {
@@ -4709,10 +4952,10 @@
4709
4952
 
4710
4953
  var default_1$6 = /** @class */ (function (_super) {
4711
4954
  __extends(default_1, _super);
4712
- function default_1(token, remainTokens, liquid) {
4955
+ function default_1(token, remainTokens, liquid, parser) {
4713
4956
  var _this = _super.call(this, token, remainTokens, liquid) || this;
4714
4957
  var tokenizer = token.tokenizer;
4715
- _this['file'] = parseFilePath(tokenizer, _this.liquid);
4958
+ _this['file'] = parseFilePath(tokenizer, _this.liquid, parser);
4716
4959
  _this['currentFile'] = token.file;
4717
4960
  var begin = tokenizer.p;
4718
4961
  var withStr = tokenizer.readIdentifier();
@@ -4726,7 +4969,7 @@
4726
4969
  }
4727
4970
  else
4728
4971
  tokenizer.p = begin;
4729
- _this.hash = new Hash(tokenizer.remaining(), _this.liquid.options.jekyllInclude);
4972
+ _this.hash = new Hash(tokenizer.remaining(), liquid.options.jekyllInclude || liquid.options.keyValueSeparator);
4730
4973
  return _this;
4731
4974
  }
4732
4975
  default_1.prototype.render = function (ctx, emitter) {
@@ -4836,37 +5079,29 @@
4836
5079
 
4837
5080
  var default_1$9 = /** @class */ (function (_super) {
4838
5081
  __extends(default_1, _super);
4839
- function default_1(tagToken, remainTokens, liquid) {
5082
+ function default_1(tagToken, remainTokens, liquid, parser) {
4840
5083
  var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
4841
5084
  _this.branches = [];
4842
- _this.elseTemplates = [];
4843
5085
  var p = [];
4844
- var elseCount = 0;
4845
- liquid.parser.parseStream(remainTokens)
5086
+ parser.parseStream(remainTokens)
4846
5087
  .on('start', function () { return _this.branches.push({
4847
5088
  value: new Value(tagToken.args, _this.liquid),
4848
5089
  templates: (p = [])
4849
5090
  }); })
4850
5091
  .on('tag:elsif', function (token) {
4851
- if (elseCount > 0) {
4852
- p = [];
4853
- return;
4854
- }
5092
+ assert(!_this.elseTemplates, 'unexpected elsif after else');
4855
5093
  _this.branches.push({
4856
5094
  value: new Value(token.args, _this.liquid),
4857
5095
  templates: (p = [])
4858
5096
  });
4859
5097
  })
4860
- .on('tag:else', function () {
4861
- elseCount++;
4862
- p = _this.elseTemplates;
4863
- })
4864
- .on('tag:endif', function () { this.stop(); })
4865
- .on('template', function (tpl) {
4866
- if (p !== _this.elseTemplates || elseCount === 1) {
4867
- p.push(tpl);
4868
- }
5098
+ .on('tag:else', function (tag) {
5099
+ assertEmpty(tag.args);
5100
+ assert(!_this.elseTemplates, 'duplicated else');
5101
+ p = _this.elseTemplates = [];
4869
5102
  })
5103
+ .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); })
5104
+ .on('template', function (tpl) { return p.push(tpl); })
4870
5105
  .on('end', function () { throw new Error("tag ".concat(tagToken.getText(), " not closed")); })
4871
5106
  .start();
4872
5107
  return _this;
@@ -4908,7 +5143,7 @@
4908
5143
  }
4909
5144
  finally { if (e_1) throw e_1.error; }
4910
5145
  return [7 /*endfinally*/];
4911
- case 9: return [4 /*yield*/, r.renderTemplates(this.elseTemplates, ctx, emitter)];
5146
+ case 9: return [4 /*yield*/, r.renderTemplates(this.elseTemplates || [], ctx, emitter)];
4912
5147
  case 10:
4913
5148
  _e.sent();
4914
5149
  return [2 /*return*/];
@@ -4939,12 +5174,12 @@
4939
5174
 
4940
5175
  var default_1$b = /** @class */ (function (_super) {
4941
5176
  __extends(default_1, _super);
4942
- function default_1(token, remainTokens, liquid) {
5177
+ function default_1(token, remainTokens, liquid, parser) {
4943
5178
  var _this = _super.call(this, token, remainTokens, liquid) || this;
4944
- _this.file = parseFilePath(_this.tokenizer, _this.liquid);
5179
+ _this.file = parseFilePath(_this.tokenizer, _this.liquid, parser);
4945
5180
  _this['currentFile'] = token.file;
4946
- _this.args = new Hash(_this.tokenizer.remaining());
4947
- _this.templates = _this.liquid.parser.parseTokens(remainTokens);
5181
+ _this.args = new Hash(_this.tokenizer.remaining(), liquid.options.keyValueSeparator);
5182
+ _this.templates = parser.parseTokens(remainTokens);
4948
5183
  return _this;
4949
5184
  }
4950
5185
  default_1.prototype.render = function (ctx, emitter) {
@@ -4996,7 +5231,7 @@
4996
5231
 
4997
5232
  var default_1$c = /** @class */ (function (_super) {
4998
5233
  __extends(default_1, _super);
4999
- function default_1(token, remainTokens, liquid) {
5234
+ function default_1(token, remainTokens, liquid, parser) {
5000
5235
  var _this = _super.call(this, token, remainTokens, liquid) || this;
5001
5236
  _this.templates = [];
5002
5237
  var match = /\w+/.exec(token.args);
@@ -5005,7 +5240,7 @@
5005
5240
  var token_1 = remainTokens.shift();
5006
5241
  if (isTagToken(token_1) && token_1.name === 'endblock')
5007
5242
  return _this;
5008
- var template = liquid.parser.parseToken(token_1, remainTokens);
5243
+ var template = parser.parseToken(token_1, remainTokens);
5009
5244
  _this.templates.push(template);
5010
5245
  }
5011
5246
  throw new Error("tag ".concat(token.getText(), " not closed"));
@@ -5098,7 +5333,7 @@
5098
5333
 
5099
5334
  var default_1$e = /** @class */ (function (_super) {
5100
5335
  __extends(default_1, _super);
5101
- function default_1(tagToken, remainTokens, liquid) {
5336
+ function default_1(tagToken, remainTokens, liquid, parser) {
5102
5337
  var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
5103
5338
  var variable = _this.tokenizer.readIdentifier();
5104
5339
  _this.tokenizer.skipBlank();
@@ -5109,10 +5344,10 @@
5109
5344
  }
5110
5345
  _this.variable = variable.content;
5111
5346
  _this.collection = collectionToken;
5112
- _this.args = new Hash(_this.tokenizer.remaining());
5347
+ _this.args = new Hash(_this.tokenizer.remaining(), liquid.options.keyValueSeparator);
5113
5348
  _this.templates = [];
5114
5349
  var p;
5115
- var stream = _this.liquid.parser.parseStream(remainTokens)
5350
+ var stream = parser.parseStream(remainTokens)
5116
5351
  .on('start', function () { return (p = _this.templates); })
5117
5352
  .on('tag:endtablerow', function () { return stream.stop(); })
5118
5353
  .on('template', function (tpl) { return p.push(tpl); })
@@ -5174,13 +5409,13 @@
5174
5409
 
5175
5410
  var default_1$f = /** @class */ (function (_super) {
5176
5411
  __extends(default_1, _super);
5177
- function default_1(tagToken, remainTokens, liquid) {
5412
+ function default_1(tagToken, remainTokens, liquid, parser) {
5178
5413
  var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
5179
5414
  _this.branches = [];
5180
5415
  _this.elseTemplates = [];
5181
5416
  var p = [];
5182
5417
  var elseCount = 0;
5183
- _this.liquid.parser.parseStream(remainTokens)
5418
+ parser.parseStream(remainTokens)
5184
5419
  .on('start', function () { return _this.branches.push({
5185
5420
  value: new Value(tagToken.args, _this.liquid),
5186
5421
  test: isFalsy,
@@ -5310,10 +5545,10 @@
5310
5545
 
5311
5546
  var default_1$j = /** @class */ (function (_super) {
5312
5547
  __extends(default_1, _super);
5313
- function default_1(token, remainTokens, liquid) {
5548
+ function default_1(token, remainTokens, liquid, parser) {
5314
5549
  var _this = _super.call(this, token, remainTokens, liquid) || this;
5315
5550
  var tokens = _this.tokenizer.readLiquidTagTokens(_this.liquid.options);
5316
- _this.templates = _this.liquid.parser.parseTokens(tokens);
5551
+ _this.templates = parser.parseTokens(tokens);
5317
5552
  return _this;
5318
5553
  }
5319
5554
  default_1.prototype.render = function (ctx, emitter) {
@@ -5374,12 +5609,14 @@
5374
5609
  this.filters = {};
5375
5610
  this.tags = {};
5376
5611
  this.options = normalize(opts);
5612
+ // eslint-disable-next-line deprecation/deprecation
5377
5613
  this.parser = new Parser(this);
5378
5614
  forOwn(tags, function (conf, name) { return _this.registerTag(name, conf); });
5379
5615
  forOwn(filters, function (handler, name) { return _this.registerFilter(name, handler); });
5380
5616
  }
5381
5617
  Liquid.prototype.parse = function (html, filepath) {
5382
- return this.parser.parse(html, filepath);
5618
+ var parser = new Parser(this);
5619
+ return parser.parse(html, filepath);
5383
5620
  };
5384
5621
  Liquid.prototype._render = function (tpl, scope, renderOptions) {
5385
5622
  var ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions);
@@ -5415,23 +5652,23 @@
5415
5652
  return toValueSync(this._parseAndRender(html, scope, __assign(__assign({}, renderOptions), { sync: true })));
5416
5653
  };
5417
5654
  Liquid.prototype._parsePartialFile = function (file, sync, currentFile) {
5418
- return this.parser.parseFile(file, sync, LookupType.Partials, currentFile);
5655
+ return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile);
5419
5656
  };
5420
5657
  Liquid.prototype._parseLayoutFile = function (file, sync, currentFile) {
5421
- return this.parser.parseFile(file, sync, LookupType.Layouts, currentFile);
5658
+ return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile);
5422
5659
  };
5423
5660
  Liquid.prototype._parseFile = function (file, sync, lookupType, currentFile) {
5424
- return this.parser.parseFile(file, sync, lookupType, currentFile);
5661
+ return new Parser(this).parseFile(file, sync, lookupType, currentFile);
5425
5662
  };
5426
5663
  Liquid.prototype.parseFile = function (file, lookupType) {
5427
5664
  return __awaiter(this, void 0, void 0, function () {
5428
5665
  return __generator(this, function (_a) {
5429
- return [2 /*return*/, toPromise(this.parser.parseFile(file, false, lookupType))];
5666
+ return [2 /*return*/, toPromise(new Parser(this).parseFile(file, false, lookupType))];
5430
5667
  });
5431
5668
  });
5432
5669
  };
5433
5670
  Liquid.prototype.parseFileSync = function (file, lookupType) {
5434
- return toValueSync(this.parser.parseFile(file, true, lookupType));
5671
+ return toValueSync(new Parser(this).parseFile(file, true, lookupType));
5435
5672
  };
5436
5673
  Liquid.prototype._renderFile = function (file, ctx, renderFileOptions) {
5437
5674
  var templates;
@@ -5511,7 +5748,7 @@
5511
5748
  }());
5512
5749
 
5513
5750
  /* istanbul ignore file */
5514
- var version = '10.13.0';
5751
+ var version = '10.18.0';
5515
5752
 
5516
5753
  exports.AssertionError = AssertionError;
5517
5754
  exports.AssignTag = default_1;
@@ -5547,7 +5784,6 @@
5547
5784
  exports.TablerowTag = default_1$e;
5548
5785
  exports.Tag = Tag;
5549
5786
  exports.TagToken = TagToken;
5550
- exports.TimezoneDate = TimezoneDate;
5551
5787
  exports.Token = Token;
5552
5788
  exports.TokenizationError = TokenizationError;
5553
5789
  exports.Tokenizer = Tokenizer;