diff --git a/.gitignore b/.gitignore index eee1c658b..c1d579d53 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ coverage/ # modules node_modules/ -build/ +dist/ # editors .*.swp diff --git a/demo/typescript/index.ts b/demo/typescript/index.ts index 2249c643f..4744892ac 100644 --- a/demo/typescript/index.ts +++ b/demo/typescript/index.ts @@ -1,4 +1,4 @@ -import Liquid from 'liquidjs' +import Liquid from '../../dist/liquid.js' const engine = new Liquid({ root: __dirname, diff --git a/dist/.gitignore b/dist/.gitignore deleted file mode 100644 index e69de29bb..000000000 diff --git a/dist/benchmark/demo.d.ts b/dist/benchmark/demo.d.ts deleted file mode 100644 index e4a4b0b20..000000000 --- a/dist/benchmark/demo.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (): Promise<{}>; diff --git a/dist/benchmark/index.d.ts b/dist/benchmark/index.d.ts deleted file mode 100644 index 509db1866..000000000 --- a/dist/benchmark/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/dist/benchmark/output.d.ts b/dist/benchmark/output.d.ts deleted file mode 100644 index e4a4b0b20..000000000 --- a/dist/benchmark/output.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (): Promise<{}>; diff --git a/dist/benchmark/tag.d.ts b/dist/benchmark/tag.d.ts deleted file mode 100644 index e4a4b0b20..000000000 --- a/dist/benchmark/tag.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (): Promise<{}>; diff --git a/dist/builtin/filters/array.d.ts b/dist/builtin/filters/array.d.ts deleted file mode 100644 index 0d48ffe8f..000000000 --- a/dist/builtin/filters/array.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare const _default: { - 'join': (v: any[], arg: string) => string; - 'last': (v: T[]) => T; - 'first': (v: T[]) => T; - 'map': (arr: { - [key: string]: T1; - }[], arg: string) => T1[]; - 'reverse': (v: any[]) => any[]; - 'sort': (v: T[], arg: (lhs: T, rhs: T) => number) => T[]; - 'size': (v: string | any[]) => number; - 'concat': (v: T1[], arg: T2 | T2[]) => (T1 | T2)[]; - 'slice': (v: T[], begin: number, length: number) => T[]; - 'uniq': (arr: T[]) => T[]; -}; -export default _default; diff --git a/dist/builtin/filters/date.d.ts b/dist/builtin/filters/date.d.ts deleted file mode 100644 index 8b2e69ab0..000000000 --- a/dist/builtin/filters/date.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const _default: { - 'date': (v: string | Date, arg: string) => string | Date; -}; -export default _default; diff --git a/dist/builtin/filters/html.d.ts b/dist/builtin/filters/html.d.ts deleted file mode 100644 index 23600e019..000000000 --- a/dist/builtin/filters/html.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare function escape(str: string): string; -declare const _default: { - 'escape': typeof escape; - 'escape_once': (str: string) => string; - 'newline_to_br': (v: string) => string; - 'strip_html': (v: string) => string; -}; -export default _default; diff --git a/dist/builtin/filters/index.d.ts b/dist/builtin/filters/index.d.ts deleted file mode 100644 index da2b76608..000000000 --- a/dist/builtin/filters/index.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -declare const _default: { - 'join': (v: any[], arg: string) => string; - 'last': (v: T[]) => T; - 'first': (v: T[]) => T; - 'map': (arr: { - [key: string]: T1; - }[], arg: string) => T1[]; - 'reverse': (v: any[]) => any[]; - 'sort': (v: T[], arg: (lhs: T, rhs: T) => number) => T[]; - 'size': (v: string | any[]) => number; - 'concat': (v: T1[], arg: T2 | T2[]) => (T1 | T2)[]; - 'slice': (v: T[], begin: number, length: number) => T[]; - 'uniq': (arr: T[]) => T[]; - 'default': (v: T1, arg: T2) => T1 | T2; - 'date': (v: string | Date, arg: string) => string | Date; - 'url_decode': (x: string) => string; - 'url_encode': (x: string) => string; - 'abs': (v: number) => number; - 'ceil': (v: number) => number; - 'divided_by': (v: number, arg: number) => number; - 'floor': (v: number) => number; - 'minus': (l: number, r: number) => string; - 'modulo': (l: number, r: number) => string; - 'round': (v: number, arg?: number) => number; - 'plus': (l: number, r: number) => string; - 'times': (v: number, arg: number) => number; - 'escape': (str: string) => string; - 'escape_once': (str: string) => string; - 'newline_to_br': (v: string) => string; - 'strip_html': (v: string) => string; -}; -export default _default; diff --git a/dist/builtin/filters/math.d.ts b/dist/builtin/filters/math.d.ts deleted file mode 100644 index e5f8330d2..000000000 --- a/dist/builtin/filters/math.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -declare const _default: { - 'abs': (v: number) => number; - 'ceil': (v: number) => number; - 'divided_by': (v: number, arg: number) => number; - 'floor': (v: number) => number; - 'minus': (l: number, r: number) => string; - 'modulo': (l: number, r: number) => string; - 'round': (v: number, arg?: number) => number; - 'plus': (l: number, r: number) => string; - 'times': (v: number, arg: number) => number; -}; -export default _default; diff --git a/dist/builtin/filters/object.d.ts b/dist/builtin/filters/object.d.ts deleted file mode 100644 index d5ec20a60..000000000 --- a/dist/builtin/filters/object.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const _default: { - 'default': (v: T1, arg: T2) => T1 | T2; -}; -export default _default; diff --git a/dist/builtin/filters/string.d.ts b/dist/builtin/filters/string.d.ts deleted file mode 100644 index c46d278d8..000000000 --- a/dist/builtin/filters/string.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { FilterImpl } from 'src/template/filter/filter-impl'; -declare const _default: { - [key: string]: FilterImpl; -}; -export default _default; diff --git a/dist/builtin/filters/url.d.ts b/dist/builtin/filters/url.d.ts deleted file mode 100644 index 1c595dcb6..000000000 --- a/dist/builtin/filters/url.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare const _default: { - 'url_decode': (x: string) => string; - 'url_encode': (x: string) => string; -}; -export default _default; diff --git a/dist/builtin/tags/assign.d.ts b/dist/builtin/tags/assign.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/assign.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/block.d.ts b/dist/builtin/tags/block.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/block.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/break.d.ts b/dist/builtin/tags/break.d.ts deleted file mode 100644 index 6fd7eb732..000000000 --- a/dist/builtin/tags/break.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const _default: { - render: () => Promise; -}; -export default _default; diff --git a/dist/builtin/tags/capture.d.ts b/dist/builtin/tags/capture.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/capture.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/case.d.ts b/dist/builtin/tags/case.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/case.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/comment.d.ts b/dist/builtin/tags/comment.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/comment.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/continue.d.ts b/dist/builtin/tags/continue.d.ts deleted file mode 100644 index 6fd7eb732..000000000 --- a/dist/builtin/tags/continue.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const _default: { - render: () => Promise; -}; -export default _default; diff --git a/dist/builtin/tags/cycle.d.ts b/dist/builtin/tags/cycle.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/cycle.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/decrement.d.ts b/dist/builtin/tags/decrement.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/decrement.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/for.d.ts b/dist/builtin/tags/for.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/for.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/if.d.ts b/dist/builtin/tags/if.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/if.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/include.d.ts b/dist/builtin/tags/include.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/include.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/increment.d.ts b/dist/builtin/tags/increment.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/increment.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/index.d.ts b/dist/builtin/tags/index.d.ts deleted file mode 100644 index c763955b6..000000000 --- a/dist/builtin/tags/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const tags: { - [key: string]: ITagImplOptions; -}; -export default tags; diff --git a/dist/builtin/tags/layout.d.ts b/dist/builtin/tags/layout.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/layout.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/raw.d.ts b/dist/builtin/tags/raw.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/raw.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/tablerow.d.ts b/dist/builtin/tags/tablerow.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/tablerow.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/builtin/tags/unless.d.ts b/dist/builtin/tags/unless.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/builtin/tags/unless.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/demo/typescript/index.d.ts b/dist/demo/typescript/index.d.ts deleted file mode 100644 index 509db1866..000000000 --- a/dist/demo/typescript/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export {}; diff --git a/dist/fs/browser.d.ts b/dist/fs/browser.d.ts deleted file mode 100644 index f242e1186..000000000 --- a/dist/fs/browser.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import IFS from './ifs'; -declare const _default: IFS; -export default _default; diff --git a/dist/fs/ifs.d.ts b/dist/fs/ifs.d.ts deleted file mode 100644 index 213c8533a..000000000 --- a/dist/fs/ifs.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default interface IFS { - exists: (filepath: string) => Promise; - readFile: (filepath: string) => Promise; - resolve: (root: string, file: string, ext: string) => string; -} diff --git a/dist/fs/node.d.ts b/dist/fs/node.d.ts deleted file mode 100644 index aeeb97c10..000000000 --- a/dist/fs/node.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import IFS from './ifs'; -declare const fs: IFS; -export default fs; diff --git a/dist/liquid-options.d.ts b/dist/liquid-options.d.ts deleted file mode 100644 index 29fa1736e..000000000 --- a/dist/liquid-options.d.ts +++ /dev/null @@ -1,52 +0,0 @@ -export interface LiquidOptions { - /** `root` is a directory or an array of directories to resolve layouts and includes, as well as the filename passed in when calling `.renderFile()`. If an array, the files are looked up in the order they occur in the array. Defaults to `["."]` */ - root?: string | string[]; - /** `extname` is used to lookup the template file when filepath doesn't include an extension name. Eg: setting to `".html"` will allow including file by basename. Defaults to `""`. */ - extname?: string; - /** `cache` indicates whether or not to cache resolved templates. Defaults to `false`. */ - cache?: boolean; - /** `dynamicPartials`: if set, treat `` parameter in `{%include filepath %}`, `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */ - dynamicPartials?: boolean; - /** `strict_filters` is used to enable strict filter existence. If set to `false`, undefined filters will be rendered as empty string. Otherwise, undefined filters will cause an exception. Defaults to `false`. */ - strict_filters?: boolean; - /** `strict_variables` is used to enable strict variable derivation. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */ - strict_variables?: boolean; - /** `trim_tag_right` is used to strip blank characters (including ` `, `\t`, and `\r`) from the right of tags (`{% %}`) until `\n` (inclusive). Defaults to `false`. */ - trim_tag_right?: boolean; - /** `trim_tag_left` is similar to `trim_tag_right`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */ - trim_tag_left?: boolean; - /** ``trim_output_right` is used to strip blank characters (including ` `, `\t`, and `\r`) from the right of values (`{{ }}`) until `\n` (inclusive). Defaults to `false`. */ - trim_output_right?: boolean; - /** `trim_output_left` is similar to `trim_output_right`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */ - trim_output_left?: boolean; - /** `tag_delimiter_left` and `tag_delimiter_right` are used to override the delimiter for liquid tags **/ - tag_delimiter_left?: string; - tag_delimiter_right?: string; - /** `output_delimiter_left` and `output_delimiter_right` are used to override the delimiter for liquid outputs **/ - output_delimiter_left?: string; - output_delimiter_right?: string; - /** `greedy` is used to specify whether `trim_left`/`trim_right` is greedy. When set to `true`, all consecutive blank characters including `\n` will be trimed regardless of line breaks. Defaults to `true`. */ - greedy?: boolean; -} -export interface NormalizedOptions extends LiquidOptions { - root?: string[]; -} -export interface NormalizedFullOptions extends NormalizedOptions { - root: string[]; - extname: string; - cache: boolean; - dynamicPartials: boolean; - strict_filters: boolean; - strict_variables: boolean; - trim_tag_right: boolean; - trim_tag_left: boolean; - trim_output_right: boolean; - trim_output_left: boolean; - tag_delimiter_left: string; - tag_delimiter_right: string; - output_delimiter_left: string; - output_delimiter_right: string; - greedy: boolean; -} -export declare function normalize(options?: LiquidOptions): NormalizedOptions; -export declare function applyDefault(options?: NormalizedOptions): NormalizedFullOptions; diff --git a/dist/liquid.common.js b/dist/liquid.common.js deleted file mode 100644 index af96df9ff..000000000 --- a/dist/liquid.common.js +++ /dev/null @@ -1,2397 +0,0 @@ -/* - * liquidjs@7.3.0, https://github.com/harttle/liquidjs - * (c) 2016-2019 harttle - * Released under the MIT License. - */ -'use strict'; - -var path = require('path'); -var fs = require('fs'); - -/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ -/* global Reflect, Promise */ - -var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); -}; - -function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); -} - -var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; - -function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -} - -function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - 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; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -} - -var toStr = Object.prototype.toString; -var arrToStr = Array.prototype.toString; -/* - * Checks if value is classified as a String primitive or object. - * @param {any} value The value to check. - * @return {Boolean} Returns true if value is a string, else false. - */ -function isString(value) { - return toStr.call(value) === '[object String]'; -} -function isFunction(value) { - return typeof value === 'function'; -} -function promisify(fn) { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return new Promise(function (resolve, reject) { - fn.apply(void 0, args.concat([function (err, result) { - err ? reject(err) : resolve(result); - }])); - }); - }; -} -function stringify(value) { - if (isNil(value)) - return ''; - if (isFunction(value.to_liquid)) - return stringify(value.to_liquid()); - if (isFunction(value.toLiquid)) - return stringify(value.toLiquid()); - if (isFunction(value.to_s)) - return value.to_s(); - if ([toStr, arrToStr].indexOf(value.toString) > -1) - return defaultToString(value); - if (isFunction(value.toString)) - return value.toString(); - return toStr.call(value); -} -function defaultToString(value) { - var cache = []; - return JSON.stringify(value, function (key, value) { - if (isObject(value)) { - if (cache.indexOf(value) !== -1) { - return; - } - cache.push(value); - } - return value; - }); -} -function create(proto) { - return Object.create(proto); -} -function isNil(value) { - return value === null || value === undefined; -} -function isArray(value) { - // be compatible with IE 8 - return toStr.call(value) === '[object Array]'; -} -/* - * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property. - * The iteratee is invoked with three arguments: (value, key, object). - * Iteratee functions may exit iteration early by explicitly returning false. - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @return {Object} Returns object. - */ -function forOwn(object, iteratee) { - object = object || {}; - for (var k in object) { - if (object.hasOwnProperty(k)) { - if (iteratee(object[k], k, object) === false) - break; - } - } - return object; -} -function last(arr) { - return arr[arr.length - 1]; -} -/* - * Checks if value is the language type of Object. - * (e.g. arrays, functions, objects, regexes, new Number(0), and new String('')) - * @param {any} value The value to check. - * @return {Boolean} Returns true if value is an object, else false. - */ -function isObject(value) { - var type = typeof value; - return value !== null && (type === 'object' || type === 'function'); -} -/* - * A function to create flexibly-numbered lists of integers, - * handy for each and map loops. start, if omitted, defaults to 0; step defaults to 1. - * Returns a list of integers from start (inclusive) to stop (exclusive), - * incremented (or decremented) by step, exclusive. - * Note that ranges that stop before they start are considered to be zero-length instead of - * negative — if you'd like a negative range, use a negative step. - */ -function range(start, stop, step) { - if (stop === undefined) { - stop = start; - start = 0; - } - step = step || 1; - var arr = []; - for (var i = start; i < stop; i += step) { - arr.push(i); - } - return arr; -} -function padStart(str, length, ch) { - if (ch === void 0) { ch = ' '; } - str = String(str); - var n = length - str.length; - while (n-- > 0) - str = ch + str; - return str; -} - -var LiquidError = /** @class */ (function (_super) { - __extends(LiquidError, _super); - function LiquidError(err, token) { - var _this = _super.call(this, err.message) || this; - _this.originalError = err; - _this.token = token; - return _this; - } - LiquidError.prototype.update = function () { - var err = this.originalError; - var context = mkContext(this.token); - this.message = mkMessage(err.message, this.token); - this.stack = this.message + '\n' + context + - '\n' + this.stack + '\nFrom ' + err.stack; - }; - return LiquidError; -}(Error)); -var TokenizationError = /** @class */ (function (_super) { - __extends(TokenizationError, _super); - function TokenizationError(message, token) { - var _this = _super.call(this, new Error(message), token) || this; - _this.name = 'TokenizationError'; - _super.prototype.update.call(_this); - return _this; - } - return TokenizationError; -}(LiquidError)); -var ParseError = /** @class */ (function (_super) { - __extends(ParseError, _super); - function ParseError(err, token) { - var _this = _super.call(this, err, token) || this; - _this.name = 'ParseError'; - _this.message = err.message; - _super.prototype.update.call(_this); - return _this; - } - return ParseError; -}(LiquidError)); -var RenderError = /** @class */ (function (_super) { - __extends(RenderError, _super); - function RenderError(err, tpl) { - var _this = _super.call(this, err, tpl.token) || this; - _this.name = 'RenderError'; - _this.message = err.message; - _super.prototype.update.call(_this); - return _this; - } - return RenderError; -}(LiquidError)); -var RenderBreakError = /** @class */ (function (_super) { - __extends(RenderBreakError, _super); - function RenderBreakError(message) { - var _this = _super.call(this, message) || this; - _this.resolvedHTML = ''; - _this.name = 'RenderBreakError'; - _this.message = message + ''; - return _this; - } - return RenderBreakError; -}(Error)); -var AssertionError = /** @class */ (function (_super) { - __extends(AssertionError, _super); - function AssertionError(message) { - var _this = _super.call(this, message) || this; - _this.name = 'AssertionError'; - _this.message = message + ''; - return _this; - } - return AssertionError; -}(Error)); -function mkContext(token) { - var lines = token.input.split('\n'); - var begin = Math.max(token.line - 2, 1); - var end = Math.min(token.line + 3, lines.length); - var context = range(begin, end + 1) - .map(function (lineNumber) { - var indicator = (lineNumber === token.line) ? '>> ' : ' '; - var num = padStart(String(lineNumber), String(end).length); - var text = lines[lineNumber - 1]; - return "" + indicator + num + "| " + text; - }) - .join('\n'); - return context; -} -function mkMessage(msg, token) { - if (token.file) - msg += ", file:" + token.file; - msg += ", line:" + token.line + ", col:" + token.col; - return msg; -} - -function assert (predicate, message) { - if (!predicate) { - message = message || "expect " + predicate + " to be true"; - throw new AssertionError(message); - } -} - -/* eslint-disable camelcase */ -var defaultOptions = { - root: ['.'], - cache: false, - extname: '', - dynamicPartials: true, - trim_tag_right: false, - trim_tag_left: false, - trim_output_right: false, - trim_output_left: false, - greedy: true, - tag_delimiter_left: '{%', - tag_delimiter_right: '%}', - output_delimiter_left: '{{', - output_delimiter_right: '}}', - strict_filters: false, - strict_variables: false -}; -function normalize(options) { - options = options || {}; - if (options.hasOwnProperty('root')) { - options.root = normalizeStringArray(options.root); - } - return options; -} -function applyDefault(options) { - return __assign({}, defaultOptions, options); -} -function normalizeStringArray(value) { - if (isArray(value)) - return value; - if (isString(value)) - return [value]; - return []; -} - -var BlockMode; -(function (BlockMode) { - /* store rendered html into blocks */ - BlockMode[BlockMode["OUTPUT"] = 0] = "OUTPUT"; - /* output rendered html directly */ - BlockMode[BlockMode["STORE"] = 1] = "STORE"; -})(BlockMode || (BlockMode = {})); -var BlockMode$1 = BlockMode; - -var Scope = /** @class */ (function () { - function Scope(ctx, opts) { - if (ctx === void 0) { ctx = {}; } - this.blocks = {}; - this.groups = {}; - this.blockMode = BlockMode$1.OUTPUT; - this.opts = applyDefault(opts); - this.contexts = [ctx || {}]; - } - Scope.prototype.getAll = function () { - return this.contexts.reduce(function (ctx, val) { return __assign(ctx, val); }, {}); - }; - Scope.prototype.get = function (path$$1) { - var _this = this; - var paths = this.propertyAccessSeq(path$$1); - var scope = this.findContextFor(paths[0]) || last(this.contexts); - return paths.reduce(function (value, key) { return _this.readProperty(value, key); }, scope); - }; - Scope.prototype.set = function (path$$1, v) { - var paths = this.propertyAccessSeq(path$$1); - var scope = this.findContextFor(paths[0]) || last(this.contexts); - paths.some(function (key, i) { - if (!isObject(scope)) { - return true; - } - if (i === paths.length - 1) { - scope[key] = v; - return true; - } - if (undefined === scope[key]) { - scope[key] = {}; - } - scope = scope[key]; - return false; - }); - }; - Scope.prototype.unshift = function (ctx) { - return this.contexts.unshift(ctx); - }; - Scope.prototype.push = function (ctx) { - return this.contexts.push(ctx); - }; - Scope.prototype.pop = function (ctx) { - if (!arguments.length) { - return this.contexts.pop(); - } - var i = this.contexts.findIndex(function (scope) { return scope === ctx; }); - if (i === -1) { - throw new TypeError('scope not found, cannot pop'); - } - return this.contexts.splice(i, 1)[0]; - }; - Scope.prototype.findContextFor = function (key, filter) { - if (filter === void 0) { filter = function () { return true; }; } - for (var i = this.contexts.length - 1; i >= 0; i--) { - var candidate = this.contexts[i]; - if (!filter(candidate)) - continue; - if (key in candidate) { - return candidate; - } - } - return null; - }; - Scope.prototype.readProperty = function (obj, key) { - var val; - if (isNil(obj)) { - val = obj; - } - else { - obj = toLiquid(obj); - val = key === 'size' ? readSize(obj) : obj[key]; - if (isFunction(obj.liquid_method_missing)) { - val = obj.liquid_method_missing(key); - } - } - if (isNil(val) && this.opts.strict_variables) { - throw new TypeError("undefined variable: " + key); - } - return val; - }; - /* - * Parse property access sequence from access string - * @example - * accessSeq("foo.bar") // ['foo', 'bar'] - * accessSeq("foo['bar']") // ['foo', 'bar'] - * accessSeq("foo['b]r']") // ['foo', 'b]r'] - * accessSeq("foo[bar.coo]") // ['foo', 'bar'], for bar.coo == 'bar' - */ - Scope.prototype.propertyAccessSeq = function (str) { - str = String(str); - var seq = []; - var name = ''; - var j; - var i = 0; - while (i < str.length) { - switch (str[i]) { - case '[': - push(); - var delemiter = str[i + 1]; - if (/['"]/.test(delemiter)) { // foo["bar"] - j = str.indexOf(delemiter, i + 2); - assert(j !== -1, "unbalanced " + delemiter + ": " + str); - name = str.slice(i + 2, j); - push(); - i = j + 2; - } - else { // foo[bar.coo] - j = matchRightBracket(str, i + 1); - assert(j !== -1, "unbalanced []: " + str); - name = str.slice(i + 1, j); - if (!/^[+-]?\d+$/.test(name)) { // foo[bar] vs. foo[1] - name = String(this.get(name)); - } - push(); - i = j + 1; - } - break; - case '.': // foo.bar, foo[0].bar - push(); - i++; - break; - default: // foo.bar - name += str[i]; - i++; - } - } - push(); - if (!seq.length) { - throw new TypeError("invalid path:\"" + str + "\""); - } - return seq; - function push() { - if (name.length) - seq.push(name); - name = ''; - } - }; - return Scope; -}()); -function toLiquid(obj) { - if (isFunction(obj.to_liquid)) { - return obj.to_liquid(); - } - if (isFunction(obj.toLiquid)) { - return obj.toLiquid(); - } - return obj; -} -function readSize(obj) { - if (!isNil(obj.size)) - return obj.size; - if (isArray(obj) || isString(obj)) - return obj.length; - return obj.size; -} -function matchRightBracket(str, begin) { - var stack = 1; // count of '[' - count of ']' - for (var i = begin; i < str.length; i++) { - if (str[i] === '[') { - stack++; - } - if (str[i] === ']') { - stack--; - if (stack === 0) { - return i; - } - } - } - return -1; -} - -var CaptureScope = /** @class */ (function () { - function CaptureScope() { - } - return CaptureScope; -}()); -var AssignScope = /** @class */ (function () { - function AssignScope() { - } - return AssignScope; -}()); -var IncrementScope = /** @class */ (function () { - function IncrementScope() { - } - return IncrementScope; -}()); -var DecrementScope = /** @class */ (function () { - function DecrementScope() { - } - return DecrementScope; -}()); - - - -var Types = /*#__PURE__*/Object.freeze({ - AssignScope: AssignScope, - CaptureScope: CaptureScope, - IncrementScope: IncrementScope, - DecrementScope: DecrementScope, - ParseError: ParseError, - TokenizationError: TokenizationError, - RenderBreakError: RenderBreakError, - AssertionError: AssertionError -}); - -var statAsync = promisify(fs.stat); -var readFileAsync = promisify(fs.readFile); -var fs$1 = { - exists: function (filepath) { - return statAsync(filepath).then(function () { return true; }).catch(function () { return false; }); - }, - readFile: function (filepath) { - return readFileAsync(filepath, 'utf8'); - }, - resolve: function (root, file, ext) { - if (!path.extname(file)) - file += ext; - return path.resolve(root, file); - } -}; - -function whiteSpaceCtrl(tokens, options) { - options = __assign({ greedy: true }, options); - var inRaw = false; - tokens.forEach(function (token, i) { - if (shouldTrimLeft(token, inRaw, options)) { - trimLeft(tokens[i - 1], options.greedy); - } - if (token.type === 'tag' && token.name === 'raw') - inRaw = true; - if (token.type === 'tag' && token.name === 'endraw') - inRaw = false; - if (shouldTrimRight(token, inRaw, options)) { - trimRight(tokens[i + 1], options.greedy); - } - }); -} -function shouldTrimLeft(token, inRaw, options) { - if (inRaw) - return false; - if (token.type === 'tag') - return token.trimLeft || options.trim_tag_left; - if (token.type === 'output') - return token.trimLeft || options.trim_output_left; -} -function shouldTrimRight(token, inRaw, options) { - if (inRaw) - return false; - if (token.type === 'tag') - return token.trimRight || options.trim_tag_right; - if (token.type === 'output') - return token.trimRight || options.trim_output_right; -} -function trimLeft(token, greedy) { - if (!token || token.type !== 'html') - return; - var rLeft = greedy ? /\s+$/g : /[\t\r ]*$/g; - token.value = token.value.replace(rLeft, ''); -} -function trimRight(token, greedy) { - if (!token || token.type !== 'html') - return; - var rRight = greedy ? /^\s+/g : /^[\t\r ]*\n?/g; - token.value = token.value.replace(rRight, ''); -} - -var Token = /** @class */ (function () { - function Token(raw, input, line, col, file) { - this.type = 'notset'; - this.col = col; - this.line = line; - this.raw = raw; - this.value = raw; - this.input = input; - this.file = file; - } - return Token; -}()); - -var HTMLToken = /** @class */ (function (_super) { - __extends(HTMLToken, _super); - function HTMLToken(str, input, line, col, file) { - var _this = _super.call(this, str, input, line, col, file) || this; - _this.type = 'html'; - _this.value = str; - return _this; - } - return HTMLToken; -}(Token)); - -var DelimitedToken = /** @class */ (function (_super) { - __extends(DelimitedToken, _super); - function DelimitedToken(raw, value, input, line, pos, file) { - var _this = _super.call(this, raw, input, line, pos, file) || this; - _this.trimLeft = value[0] === '-'; - _this.trimRight = last(value) === '-'; - _this.value = value - .slice(_this.trimLeft ? 1 : 0, _this.trimRight ? -1 : value.length) - .trim(); - return _this; - } - return DelimitedToken; -}(Token)); - -// quote related -var singleQuoted = /'[^']*'/; -var doubleQuoted = /"[^"]*"/; -var quoted = new RegExp(singleQuoted.source + "|" + doubleQuoted.source); -var quoteBalanced = new RegExp("(?:" + quoted.source + "|[^'\"])*"); -// basic types -var number = /[+-]?(?:\d+\.?\d*|\.?\d+)/; -var bool = /true|false/; -// property access -var identifier = /[\w-]+[?]?/; -var subscript = new RegExp("\\[(?:" + quoted.source + "|[\\w-\\.]+)\\]"); -var literal = new RegExp("(?:" + quoted.source + "|" + bool.source + "|" + number.source + ")"); -var variable = new RegExp(identifier.source + "(?:\\." + identifier.source + "|" + subscript.source + ")*"); -// range related -var rangeLimit = new RegExp("(?:" + variable.source + "|" + number.source + ")"); -var range$1 = new RegExp("\\(" + rangeLimit.source + "\\.\\." + rangeLimit.source + "\\)"); -var rangeCapture = new RegExp("\\((" + rangeLimit.source + ")\\.\\.(" + rangeLimit.source + ")\\)"); -var value = new RegExp("(?:" + variable.source + "|" + literal.source + "|" + range$1.source + ")"); -// hash related -var hash = new RegExp("(?:" + identifier.source + ")\\s*:\\s*(?:" + value.source + ")"); -var hashCapture = new RegExp("(" + identifier.source + ")\\s*:\\s*(" + value.source + ")", 'g'); -// full match -var tagLine = new RegExp("^\\s*(" + identifier.source + ")\\s*([\\s\\S]*?)\\s*$"); -var quotedLine = new RegExp("^" + quoted.source + "$"); -var rangeLine = new RegExp("^" + rangeCapture.source + "$"); -var operators = [ - /\s+or\s+/, - /\s+and\s+/, - /==|!=|<=|>=|<|>|\s+contains\s+/ -]; - -var TagToken = /** @class */ (function (_super) { - __extends(TagToken, _super); - function TagToken(raw, value$$1, input, line, pos, file) { - var _this = _super.call(this, raw, value$$1, input, line, pos, file) || this; - _this.type = 'tag'; - var match = _this.value.match(tagLine); - if (!match) { - throw new TokenizationError("illegal tag syntax", _this); - } - _this.name = match[1]; - _this.args = match[2]; - return _this; - } - return TagToken; -}(DelimitedToken)); - -var OutputToken = /** @class */ (function (_super) { - __extends(OutputToken, _super); - function OutputToken(raw, value, input, line, pos, file) { - var _this = _super.call(this, raw, value, input, line, pos, file) || this; - _this.type = 'output'; - return _this; - } - return OutputToken; -}(DelimitedToken)); - -var ParseState; -(function (ParseState) { - ParseState[ParseState["HTML"] = 0] = "HTML"; - ParseState[ParseState["OUTPUT"] = 1] = "OUTPUT"; - ParseState[ParseState["TAG"] = 2] = "TAG"; -})(ParseState || (ParseState = {})); -var Tokenizer = /** @class */ (function () { - function Tokenizer(options) { - this.options = applyDefault(options); - } - Tokenizer.prototype.tokenize = function (input, file) { - var tokens = []; - var tagL = this.options.tag_delimiter_left; - var tagR = this.options.tag_delimiter_right; - var outputL = this.options.output_delimiter_left; - var outputR = this.options.output_delimiter_right; - var p = 0; - var curLine = 1; - var state = ParseState.HTML; - var buffer = ''; - var lineBegin = 0; - var line = 1; - var col = 1; - while (p < input.length) { - if (input[p] === '\n') { - curLine++; - lineBegin = p + 1; - } - if (state === ParseState.HTML) { - if (input.substr(p, outputL.length) === outputL) { - if (buffer) - tokens.push(new HTMLToken(buffer, input, line, col, file)); - buffer = outputL; - line = curLine; - col = p - lineBegin + 1; - p += outputL.length; - state = ParseState.OUTPUT; - continue; - } - else if (input.substr(p, tagL.length) === tagL) { - if (buffer) - tokens.push(new HTMLToken(buffer, input, line, col, file)); - buffer = tagL; - line = curLine; - col = p - lineBegin + 1; - p += tagL.length; - state = ParseState.TAG; - continue; - } - } - else if (state === ParseState.OUTPUT && input.substr(p, outputR.length) === outputR) { - buffer += outputR; - tokens.push(new OutputToken(buffer, buffer.slice(outputL.length, -outputR.length), input, line, col, file)); - p += outputR.length; - buffer = ''; - line = curLine; - col = p - lineBegin + 1; - state = ParseState.HTML; - continue; - } - else if (input.substr(p, tagR.length) === tagR) { - buffer += tagR; - tokens.push(new TagToken(buffer, buffer.slice(tagL.length, -tagR.length), input, line, col, file)); - p += tagR.length; - buffer = ''; - line = curLine; - col = p - lineBegin + 1; - state = ParseState.HTML; - continue; - } - buffer += input[p++]; - } - if (state !== ParseState.HTML) { - var t = state === ParseState.OUTPUT ? 'output' : 'tag'; - var str = buffer.length > 16 ? buffer.slice(0, 13) + '...' : buffer; - throw new TokenizationError(t + " \"" + str + "\" not closed", new Token(buffer, input, line, col, file)); - } - if (buffer) - tokens.push(new HTMLToken(buffer, input, line, col, file)); - whiteSpaceCtrl(tokens, this.options); - return tokens; - }; - return Tokenizer; -}()); - -var Render = /** @class */ (function () { - function Render() { - } - Render.prototype.renderTemplates = function (templates, scope) { - return __awaiter(this, void 0, void 0, function () { - var html, _i, templates_1, tpl, _a, e_1; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - assert(scope, 'unable to evalTemplates: scope undefined'); - html = ''; - _i = 0, templates_1 = templates; - _b.label = 1; - case 1: - if (!(_i < templates_1.length)) return [3 /*break*/, 6]; - tpl = templates_1[_i]; - _b.label = 2; - case 2: - _b.trys.push([2, 4, , 5]); - _a = html; - return [4 /*yield*/, tpl.render(scope)]; - case 3: - html = _a + _b.sent(); - return [3 /*break*/, 5]; - case 4: - e_1 = _b.sent(); - if (e_1.name === 'RenderBreakError') { - e_1.resolvedHTML = html; - throw e_1; - } - throw e_1.name === 'RenderError' ? e_1 : new RenderError(e_1, tpl); - case 5: - _i++; - return [3 /*break*/, 1]; - case 6: return [2 /*return*/, html]; - } - }); - }); - }; - return Render; -}()); - -function isComparable(arg) { - return arg && isFunction(arg.equals); -} - -var Drop = /** @class */ (function () { - function Drop() { - } - return Drop; -}()); - -function isDrop(value) { - return value instanceof Drop && isFunction(value.value); -} - -var EmptyDrop = /** @class */ (function (_super) { - __extends(EmptyDrop, _super); - function EmptyDrop() { - return _super !== null && _super.apply(this, arguments) || this; - } - EmptyDrop.prototype.equals = function (value) { - if (isString(value) || isArray(value)) - return value.length === 0; - if (isObject(value)) - return Object.keys(value).length === 0; - return false; - }; - EmptyDrop.prototype.gt = function () { - return false; - }; - EmptyDrop.prototype.geq = function () { - return false; - }; - EmptyDrop.prototype.lt = function () { - return false; - }; - EmptyDrop.prototype.leq = function () { - return false; - }; - EmptyDrop.prototype.value = function () { - return ''; - }; - return EmptyDrop; -}(Drop)); - -var BlankDrop = /** @class */ (function (_super) { - __extends(BlankDrop, _super); - function BlankDrop() { - return _super !== null && _super.apply(this, arguments) || this; - } - BlankDrop.prototype.equals = function (value) { - if (value === false) - return true; - if (isNil(isDrop(value) ? value.value() : value)) - return true; - if (isString(value)) - return /^\s*$/.test(value); - return _super.prototype.equals.call(this, value); - }; - return BlankDrop; -}(EmptyDrop)); - -var NullDrop = /** @class */ (function (_super) { - __extends(NullDrop, _super); - function NullDrop() { - return _super !== null && _super.apply(this, arguments) || this; - } - NullDrop.prototype.equals = function (value) { - return isNil(isDrop(value) ? value.value() : value) || value instanceof BlankDrop; - }; - NullDrop.prototype.gt = function () { - return false; - }; - NullDrop.prototype.geq = function () { - return false; - }; - NullDrop.prototype.lt = function () { - return false; - }; - NullDrop.prototype.leq = function () { - return false; - }; - NullDrop.prototype.value = function () { - return null; - }; - return NullDrop; -}(Drop)); - -var binaryOperators = { - '==': function (l, r) { - if (isComparable(l)) - return l.equals(r); - if (isComparable(r)) - return r.equals(l); - return l === r; - }, - '!=': function (l, r) { - if (isComparable(l)) - return !l.equals(r); - if (isComparable(r)) - return !r.equals(l); - return l !== r; - }, - '>': function (l, r) { - if (isComparable(l)) - return l.gt(r); - if (isComparable(r)) - return r.lt(l); - return l > r; - }, - '<': function (l, r) { - if (isComparable(l)) - return l.lt(r); - if (isComparable(r)) - return r.gt(l); - return l < r; - }, - '>=': function (l, r) { - if (isComparable(l)) - return l.geq(r); - if (isComparable(r)) - return r.leq(l); - return l >= r; - }, - '<=': function (l, r) { - if (isComparable(l)) - return l.leq(r); - if (isComparable(r)) - return r.geq(l); - return l <= r; - }, - 'contains': function (l, r) { - if (!l) - return false; - if (typeof l.indexOf !== 'function') - return false; - return l.indexOf(r) > -1; - }, - 'and': function (l, r) { return isTruthy(l) && isTruthy(r); }, - 'or': function (l, r) { return isTruthy(l) || isTruthy(r); } -}; -function parseExp(exp, scope) { - assert(scope, 'unable to parseExp: scope undefined'); - var operatorREs = operators; - var match; - for (var i = 0; i < operatorREs.length; i++) { - var operatorRE = operatorREs[i]; - var expRE = new RegExp("^(" + quoteBalanced.source + ")(" + operatorRE.source + ")(" + quoteBalanced.source + ")$"); - if ((match = exp.match(expRE))) { - var l = parseExp(match[1], scope); - var op = binaryOperators[match[2].trim()]; - var r = parseExp(match[3], scope); - return op(l, r); - } - } - if ((match = exp.match(rangeLine))) { - var low = parseValue(match[1], scope); - var high = parseValue(match[2], scope); - return range(low, high + 1); - } - return parseValue(exp, scope); -} -function evalExp(str, scope) { - var value$$1 = parseExp(str, scope); - return isDrop(value$$1) ? value$$1.value() : value$$1; -} -function parseValue(str, scope) { - if (!str) - return null; - str = str.trim(); - if (str === 'true') - return true; - if (str === 'false') - return false; - if (str === 'nil' || str === 'null') - return new NullDrop(); - if (str === 'empty') - return new EmptyDrop(); - if (str === 'blank') - return new BlankDrop(); - if (!isNaN(Number(str))) - return Number(str); - if ((str[0] === '"' || str[0] === "'") && str[0] === last(str)) - return str.slice(1, -1); - return scope.get(str); -} -function evalValue(str, scope) { - var value$$1 = parseValue(str, scope); - return isDrop(value$$1) ? value$$1.value() : value$$1; -} -function isTruthy(val) { - return !isFalsy(val); -} -function isFalsy(val) { - return val === false || undefined === val || val === null; -} - -/** - * Key-Value Pairs Representing Tag Arguments - * Example: - * For the markup `{% include 'head.html' foo='bar' %}`, - * hash['foo'] === 'bar' - */ -var Hash = /** @class */ (function () { - function Hash(markup, scope) { - var match; - hashCapture.lastIndex = 0; - while ((match = hashCapture.exec(markup))) { - var k = match[1]; - var v = match[2]; - this[k] = evalValue(v, scope); - } - } - return Hash; -}()); - -var Template = /** @class */ (function () { - function Template(token) { - this.token = token; - } - return Template; -}()); - -var Tag = /** @class */ (function (_super) { - __extends(Tag, _super); - function Tag(token, tokens, liquid) { - var _this = _super.call(this, token) || this; - _this.name = token.name; - var impl = Tag.impls[token.name]; - assert(impl, "tag " + token.name + " not found"); - _this.impl = create(impl); - _this.impl.liquid = liquid; - if (_this.impl.parse) { - _this.impl.parse(token, tokens); - } - return _this; - } - Tag.prototype.render = function (scope) { - return __awaiter(this, void 0, void 0, function () { - var hash, impl, html; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - hash = new Hash(this.token.args, scope); - impl = this.impl; - if (typeof impl.render !== 'function') { - return [2 /*return*/, '']; - } - return [4 /*yield*/, impl.render(scope, hash)]; - case 1: - html = _a.sent(); - return [2 /*return*/, stringify(html)]; - } - }); - }); - }; - Tag.register = function (name, tag) { - Tag.impls[name] = tag; - }; - Tag.clear = function () { - Tag.impls = {}; - }; - Tag.impls = {}; - return Tag; -}(Template)); - -var Filter = /** @class */ (function () { - function Filter(name, args, strictFilters) { - var impl = Filter.impls[name]; - if (!impl && strictFilters) - throw new TypeError("undefined filter: " + name); - this.name = name; - this.impl = impl || (function (x) { return x; }); - this.args = args; - } - Filter.prototype.render = function (value, scope) { - var args = this.args.map(function (arg) { return evalValue(arg, scope); }); - return this.impl.apply(null, [value].concat(args)); - }; - Filter.register = function (name, filter) { - Filter.impls[name] = filter; - }; - Filter.clear = function () { - Filter.impls = {}; - }; - Filter.impls = {}; - return Filter; -}()); - -var ParseStream = /** @class */ (function () { - function ParseStream(tokens, parseToken) { - this.handlers = {}; - this.stopRequested = false; - this.tokens = tokens; - this.parseToken = parseToken; - } - ParseStream.prototype.on = function (name, cb) { - this.handlers[name] = cb; - return this; - }; - ParseStream.prototype.trigger = function (event, arg) { - var h = this.handlers[event]; - if (typeof h === 'function') { - h(arg); - return true; - } - return false; - }; - ParseStream.prototype.start = function () { - this.trigger('start'); - var token; - while (!this.stopRequested && (token = this.tokens.shift())) { - if (this.trigger('token', token)) - continue; - if (token.type === 'tag' && this.trigger("tag:" + token.name, token)) { - continue; - } - var template = this.parseToken(token, this.tokens); - this.trigger('template', template); - } - if (!this.stopRequested) - this.trigger('end'); - return this; - }; - ParseStream.prototype.stop = function () { - this.stopRequested = true; - return this; - }; - return ParseStream; -}()); - -var ParseState$1; -(function (ParseState) { - ParseState[ParseState["INIT"] = 0] = "INIT"; - ParseState[ParseState["FILTER_NAME"] = 1] = "FILTER_NAME"; - ParseState[ParseState["FILTER_ARG"] = 2] = "FILTER_ARG"; -})(ParseState$1 || (ParseState$1 = {})); -var default_1 = /** @class */ (function () { - /** - * @param str value string, like: "i have a dream | truncate: 3 - */ - function default_1(str, strictFilters) { - this.filters = []; - var buffer = ''; - var quoted = ''; - var state = ParseState$1.INIT; - var sealed = false; - var filterName = ''; - var filterArgs = []; - for (var i = 0; i < str.length; i++) { - if (quoted) { - if (str[i] === quoted) { - quoted = ''; - sealed = true; - } - buffer += str[i]; - } - else if (/\s/.test(str[i])) { - if (!buffer) - continue; - else - sealed = true; - } - else if (str[i] === '|') { - if (state === ParseState$1.INIT) { - this.initial = buffer; - } - else { - if (state === ParseState$1.FILTER_NAME) - filterName = buffer; - else - filterArgs.push(buffer); - this.filters.push(new Filter(filterName, filterArgs, strictFilters)); - filterName = ''; - filterArgs = []; - } - state = ParseState$1.FILTER_NAME; - buffer = ''; - sealed = false; - } - else if (state === ParseState$1.FILTER_NAME && str[i] === ':') { - filterName = buffer; - state = ParseState$1.FILTER_ARG; - buffer = ''; - sealed = false; - } - else if (state === ParseState$1.FILTER_ARG && str[i] === ',') { - filterArgs.push(buffer); - buffer = ''; - sealed = false; - } - else if (sealed) - continue; - else { - if ((str[i] === '"' || str[i] === "'") && !quoted) - quoted = str[i]; - buffer += str[i]; - } - } - if (buffer) { - if (state === ParseState$1.INIT) - this.initial = buffer; - else if (state === ParseState$1.FILTER_NAME) - this.filters.push(new Filter(buffer, [], strictFilters)); - else { - filterArgs.push(buffer); - this.filters.push(new Filter(filterName, filterArgs, strictFilters)); - } - } - } - default_1.prototype.value = function (scope) { - return this.filters.reduce(function (prev, filter) { return filter.render(prev, scope); }, evalExp(this.initial, scope)); - }; - return default_1; -}()); - -var Output = /** @class */ (function (_super) { - __extends(Output, _super); - function Output(token, strictFilters) { - var _this = _super.call(this, token) || this; - _this.value = new default_1(token.value, strictFilters); - return _this; - } - Output.prototype.render = function (scope) { - return __awaiter(this, void 0, void 0, function () { - var html; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.value.value(scope)]; - case 1: - html = _a.sent(); - return [2 /*return*/, stringify(html)]; - } - }); - }); - }; - return Output; -}(Template)); - -var default_1$1 = /** @class */ (function (_super) { - __extends(default_1, _super); - function default_1(token) { - var _this = _super.call(this, token) || this; - _this.str = token.value; - return _this; - } - default_1.prototype.render = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, this.str]; - }); - }); - }; - return default_1; -}(Template)); - -var Parser = /** @class */ (function () { - function Parser(liquid) { - this.liquid = liquid; - } - Parser.prototype.parse = function (tokens) { - var token; - var templates = []; - while ((token = tokens.shift())) { - templates.push(this.parseToken(token, tokens)); - } - return templates; - }; - Parser.prototype.parseToken = function (token, remainTokens) { - try { - if (token.type === 'tag') { - return new Tag(token, remainTokens, this.liquid); - } - if (token.type === 'output') { - return new Output(token, this.liquid.options.strict_filters); - } - return new default_1$1(token); - } - catch (e) { - throw new ParseError(e, token); - } - }; - Parser.prototype.parseStream = function (tokens) { - var _this = this; - return new ParseStream(tokens, function (token, tokens) { return _this.parseToken(token, tokens); }); - }; - return Parser; -}()); - -var re = new RegExp("(" + identifier.source + ")\\s*=([^]*)"); -var assign = { - parse: function (token) { - var match = token.args.match(re); - assert(match, "illegal token " + token.raw); - this.key = match[1]; - this.value = match[2]; - }, - render: function (scope) { - var ctx = new AssignScope(); - ctx[this.key] = this.liquid.evalValue(this.value, scope); - scope.push(ctx); - return Promise.resolve(''); - } -}; - -/* - * Call functions in serial until someone rejected. - * @param {Array} iterable the array to iterate with. - * @param {Array} iteratee returns a new promise. - * The iteratee is invoked with three arguments: (value, index, iterable). - */ -function mapSeries(iterable, iteratee) { - var ret = Promise.resolve(0); - var result = []; - iterable.forEach(function (item, idx) { - ret = ret - .then(function () { return iteratee(item, idx, iterable); }) - .then(function (x) { return result.push(x); }); - }); - return ret.then(function () { return result; }); -} - -var re$1 = new RegExp("^(" + identifier.source + ")\\s+in\\s+" + - ("(" + value.source + ")") + - ("(?:\\s+" + hash.source + ")*") + - "(?:\\s+(reversed))?" + - ("(?:\\s+" + hash.source + ")*$")); -var For = { - type: 'block', - parse: function (tagToken, remainTokens) { - var _this = this; - var match = re$1.exec(tagToken.args); - assert(match, "illegal tag: " + tagToken.raw); - this.variable = match[1]; - this.collection = match[2]; - this.reversed = !!match[3]; - this.templates = []; - this.elseTemplates = []; - var p; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('start', function () { return (p = _this.templates); }) - .on('tag:else', function () { return (p = _this.elseTemplates); }) - .on('tag:endfor', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope, hash$$1) { - return __awaiter(this, void 0, void 0, function () { - var collection, offset, limit, contexts, html, finished; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - collection = evalExp(this.collection, scope); - if (!isArray(collection)) { - if (isString(collection) && collection.length > 0) { - collection = [collection]; - } - else if (isObject(collection)) { - collection = Object.keys(collection).map(function (key) { return [key, collection[key]]; }); - } - } - if (!isArray(collection) || !collection.length) { - return [2 /*return*/, this.liquid.renderer.renderTemplates(this.elseTemplates, scope)]; - } - offset = hash$$1.offset || 0; - limit = (hash$$1.limit === undefined) ? collection.length : hash$$1.limit; - collection = collection.slice(offset, offset + limit); - if (this.reversed) - collection.reverse(); - contexts = collection.map(function (item, i) { - var ctx = {}; - ctx[_this.variable] = item; - ctx['forloop'] = { - first: i === 0, - index: i + 1, - index0: i, - last: i === collection.length - 1, - length: collection.length, - rindex: collection.length - i, - rindex0: collection.length - i - 1 - }; - return ctx; - }); - html = ''; - finished = false; - return [4 /*yield*/, mapSeries(contexts, function (context) { return __awaiter(_this, void 0, void 0, function () { - var _a, e_1; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - if (finished) - return [2 /*return*/]; - scope.push(context); - _b.label = 1; - case 1: - _b.trys.push([1, 3, , 4]); - _a = html; - return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, scope)]; - case 2: - html = _a + _b.sent(); - return [3 /*break*/, 4]; - case 3: - e_1 = _b.sent(); - if (e_1.name === 'RenderBreakError') { - html += e_1.resolvedHTML; - if (e_1.message === 'break') { - finished = true; - } - } - else - throw e_1; - return [3 /*break*/, 4]; - case 4: - scope.pop(context); - return [2 /*return*/]; - } - }); - }); })]; - case 1: - _a.sent(); - return [2 /*return*/, html]; - } - }); - }); - } -}; - -var re$2 = new RegExp("(" + identifier.source + ")"); -var capture = { - parse: function (tagToken, remainTokens) { - var _this = this; - var match = tagToken.args.match(re$2); - assert(match, tagToken.args + " not valid identifier"); - this.variable = match[1]; - this.templates = []; - var stream = this.liquid.parser.parseStream(remainTokens); - stream.on('tag:endcapture', function () { return stream.stop(); }) - .on('template', function (tpl) { return _this.templates.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - return __awaiter(this, void 0, void 0, function () { - var html, ctx; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, scope)]; - case 1: - html = _a.sent(); - ctx = new CaptureScope(); - ctx[this.variable] = html; - scope.push(ctx); - return [2 /*return*/]; - } - }); - }); - } -}; - -var Case = { - parse: function (tagToken, remainTokens) { - var _this = this; - this.cond = tagToken.args; - this.cases = []; - this.elseTemplates = []; - var p = []; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('tag:when', function (token) { - _this.cases.push({ - val: token.args, - templates: p = [] - }); - }) - .on('tag:else', function () { return (p = _this.elseTemplates); }) - .on('tag:endcase', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - for (var i = 0; i < this.cases.length; i++) { - var branch = this.cases[i]; - var val = evalExp(branch.val, scope); - var cond = evalExp(this.cond, scope); - if (val === cond) { - return this.liquid.renderer.renderTemplates(branch.templates, scope); - } - } - return this.liquid.renderer.renderTemplates(this.elseTemplates, scope); - } -}; - -var comment = { - parse: function (tagToken, remainTokens) { - var stream = this.liquid.parser.parseStream(remainTokens); - stream - .on('token', function (token) { - if (token.name === 'endcomment') - stream.stop(); - }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - } -}; - -var staticFileRE = /[^\s,]+/; -var withRE = new RegExp("with\\s+(" + value.source + ")"); -var include = { - parse: function (token) { - var match = staticFileRE.exec(token.args); - if (match) { - this.staticValue = match[0]; - } - match = value.exec(token.args); - if (match) { - this.value = match[0]; - } - match = withRE.exec(token.args); - if (match) { - this.with = match[1]; - } - }, - render: function (scope, hash$$1) { - return __awaiter(this, void 0, void 0, function () { - var filepath, template, originBlocks, originBlockMode, templates, html; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!scope.opts.dynamicPartials) return [3 /*break*/, 4]; - if (!quotedLine.exec(this.value)) return [3 /*break*/, 2]; - template = this.value.slice(1, -1); - return [4 /*yield*/, this.liquid.parseAndRender(template, scope.getAll(), scope.opts)]; - case 1: - filepath = _a.sent(); - return [3 /*break*/, 3]; - case 2: - filepath = evalValue(this.value, scope); - _a.label = 3; - case 3: return [3 /*break*/, 5]; - case 4: - filepath = this.staticValue; - _a.label = 5; - case 5: - assert(filepath, "cannot include with empty filename"); - originBlocks = scope.blocks; - originBlockMode = scope.blockMode; - scope.blocks = {}; - scope.blockMode = BlockMode$1.OUTPUT; - if (this.with) { - hash$$1[filepath] = evalValue(this.with, scope); - } - return [4 /*yield*/, this.liquid.getTemplate(filepath, scope.opts)]; - case 6: - templates = _a.sent(); - scope.push(hash$$1); - return [4 /*yield*/, this.liquid.renderer.renderTemplates(templates, scope)]; - case 7: - html = _a.sent(); - scope.pop(hash$$1); - scope.blocks = originBlocks; - scope.blockMode = originBlockMode; - return [2 /*return*/, html]; - } - }); - }); - } -}; - -var decrement = { - parse: function (token) { - var match = token.args.match(identifier); - assert(match, "illegal identifier " + token.args); - this.variable = match[0]; - }, - render: function (scope) { - var context = scope.findContextFor(this.variable, function (ctx) { - return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope); - }); - if (!context) { - context = new DecrementScope(); - scope.unshift(context); - } - if (typeof context[this.variable] !== 'number') { - context[this.variable] = 0; - } - return --context[this.variable]; - } -}; - -var groupRE = new RegExp("^(?:(" + value.source + ")\\s*:\\s*)?(.*)$"); -var candidatesRE = new RegExp(value.source, 'g'); -var cycle = { - parse: function (tagToken) { - var match = groupRE.exec(tagToken.args); - assert(match, "illegal tag: " + tagToken.raw); - this.group = match[1] || ''; - var candidates = match[2]; - this.candidates = []; - while ((match = candidatesRE.exec(candidates))) { - this.candidates.push(match[0]); - } - assert(this.candidates.length, "empty candidates: " + tagToken.raw); - }, - render: function (scope) { - var group = evalValue(this.group, scope); - var fingerprint = "cycle:" + group + ":" + this.candidates.join(','); - var groups = scope.groups; - var idx = groups[fingerprint]; - if (idx === undefined) { - idx = groups[fingerprint] = 0; - } - var candidate = this.candidates[idx]; - idx = (idx + 1) % this.candidates.length; - groups[fingerprint] = idx; - return evalValue(candidate, scope); - } -}; - -var If = { - parse: function (tagToken, remainTokens) { - var _this = this; - this.branches = []; - this.elseTemplates = []; - var p; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('start', function () { return _this.branches.push({ - cond: tagToken.args, - templates: (p = []) - }); }) - .on('tag:elsif', function (token) { - _this.branches.push({ - cond: token.args, - templates: p = [] - }); - }) - .on('tag:else', function () { return (p = _this.elseTemplates); }) - .on('tag:endif', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - for (var _i = 0, _a = this.branches; _i < _a.length; _i++) { - var branch = _a[_i]; - var cond = evalExp(branch.cond, scope); - if (isTruthy(cond)) { - return this.liquid.renderer.renderTemplates(branch.templates, scope); - } - } - return this.liquid.renderer.renderTemplates(this.elseTemplates, scope); - } -}; - -var increment = { - parse: function (token) { - var match = token.args.match(identifier); - assert(match, "illegal identifier " + token.args); - this.variable = match[0]; - }, - render: function (scope) { - var context = scope.findContextFor(this.variable, function (ctx) { - return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope); - }); - if (!context) { - context = new IncrementScope(); - scope.unshift(context); - } - if (typeof context[this.variable] !== 'number') { - context[this.variable] = 0; - } - var val = context[this.variable]; - context[this.variable]++; - return val; - } -}; - -var staticFileRE$1 = /\S+/; -var layout = { - parse: function (token, remainTokens) { - var match = staticFileRE$1.exec(token.args); - if (match) { - this.staticLayout = match[0]; - } - match = value.exec(token.args); - if (match) { - this.layout = match[0]; - } - this.tpls = this.liquid.parser.parse(remainTokens); - }, - render: function (scope, hash$$1) { - return __awaiter(this, void 0, void 0, function () { - var layout, html, templates, partial; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - layout = scope.opts.dynamicPartials - ? evalValue(this.layout, scope) - : this.staticLayout; - assert(layout, "cannot apply layout with empty filename"); - // render the remaining tokens immediately - scope.blockMode = BlockMode$1.STORE; - return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.tpls, scope)]; - case 1: - html = _a.sent(); - if (scope.blocks[''] === undefined) { - scope.blocks[''] = html; - } - return [4 /*yield*/, this.liquid.getTemplate(layout, scope.opts)]; - case 2: - templates = _a.sent(); - scope.push(hash$$1); - scope.blockMode = BlockMode$1.OUTPUT; - return [4 /*yield*/, this.liquid.renderer.renderTemplates(templates, scope)]; - case 3: - partial = _a.sent(); - scope.pop(hash$$1); - return [2 /*return*/, partial]; - } - }); - }); - } -}; - -var block = { - parse: function (token, remainTokens) { - var _this = this; - var match = /\w+/.exec(token.args); - this.block = match ? match[0] : ''; - this.tpls = []; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('tag:endblock', function () { return stream.stop(); }) - .on('template', function (tpl) { return _this.tpls.push(tpl); }) - .on('end', function () { - throw new Error("tag " + token.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - return __awaiter(this, void 0, void 0, function () { - var childDefined, html, _a; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - childDefined = scope.blocks[this.block]; - if (!(childDefined !== undefined)) return [3 /*break*/, 1]; - _a = childDefined; - return [3 /*break*/, 3]; - case 1: return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.tpls, scope)]; - case 2: - _a = _b.sent(); - _b.label = 3; - case 3: - html = _a; - if (scope.blockMode === BlockMode$1.STORE) { - scope.blocks[this.block] = html; - return [2 /*return*/, '']; - } - return [2 /*return*/, html]; - } - }); - }); - } -}; - -var raw = { - parse: function (tagToken, remainTokens) { - var _this = this; - this.tokens = []; - var stream = this.liquid.parser.parseStream(remainTokens); - stream - .on('token', function (token) { - if (token.name === 'endraw') - stream.stop(); - else - _this.tokens.push(token); - }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function () { - return this.tokens.map(function (token) { return token.raw; }).join(''); - } -}; - -var re$3 = new RegExp("^(" + identifier.source + ")\\s+in\\s+" + - ("(" + value.source + ")") + - ("(?:\\s+" + hash.source + ")*$")); -var tablerow = { - parse: function (tagToken, remainTokens) { - var _this = this; - var match = re$3.exec(tagToken.args); - assert(match, "illegal tag: " + tagToken.raw); - this.variable = match[1]; - this.collection = match[2]; - this.templates = []; - var p; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('start', function () { return (p = _this.templates); }) - .on('tag:endtablerow', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope, hash$$1) { - return __awaiter(this, void 0, void 0, function () { - var collection, offset, limit, cols, contexts, row, html; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - collection = evalExp(this.collection, scope) || []; - offset = hash$$1.offset || 0; - limit = (hash$$1.limit === undefined) ? collection.length : hash$$1.limit; - collection = collection.slice(offset, offset + limit); - cols = hash$$1.cols || collection.length; - contexts = collection.map(function (item) { - var ctx = {}; - ctx[_this.variable] = item; - return ctx; - }); - row = 0; - html = ''; - return [4 /*yield*/, mapSeries(contexts, function (context, idx) { return __awaiter(_this, void 0, void 0, function () { - var col, _a; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - row = Math.floor(idx / cols) + 1; - col = (idx % cols) + 1; - if (col === 1) { - if (row !== 1) { - html += ''; - } - html += ""; - } - html += ""; - scope.push(context); - _a = html; - return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, scope)]; - case 1: - html = _a + _b.sent(); - html += ''; - scope.pop(context); - return [2 /*return*/, html]; - } - }); - }); })]; - case 1: - _a.sent(); - if (row > 0) { - html += ''; - } - return [2 /*return*/, html]; - } - }); - }); - } -}; - -var unless = { - parse: function (tagToken, remainTokens) { - var _this = this; - this.templates = []; - this.elseTemplates = []; - var p; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('start', function () { - p = _this.templates; - _this.cond = tagToken.args; - }) - .on('tag:else', function () { return (p = _this.elseTemplates); }) - .on('tag:endunless', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - var cond = evalExp(this.cond, scope); - return isFalsy(cond) - ? this.liquid.renderer.renderTemplates(this.templates, scope) - : this.liquid.renderer.renderTemplates(this.elseTemplates, scope); - } -}; - -var Break = { - render: function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - throw new RenderBreakError('break'); - }); - }); - } -}; - -var Continue = { - render: function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - throw new RenderBreakError('continue'); - }); - }); - } -}; - -var tags = { - 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 -}; - -var escapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' -}; -var unescapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - ''': "'" -}; -function escape(str) { - return String(str).replace(/&|<|>|"|'/g, function (m) { return escapeMap[m]; }); -} -function unescape(str) { - return String(str).replace(/&(amp|lt|gt|#34|#39);/g, function (m) { return unescapeMap[m]; }); -} -var html = { - 'escape': escape, - 'escape_once': function (str) { return escape(unescape(str)); }, - 'newline_to_br': function (v) { return v.replace(/\n/g, '
'); }, - 'strip_html': function (v) { return v.replace(/|||<.*?>/g, ''); } -}; - -var str = { - 'append': function (v, arg) { return v + arg; }, - 'prepend': function (v, arg) { return arg + v; }, - 'capitalize': function (str) { return String(str).charAt(0).toUpperCase() + str.slice(1); }, - 'lstrip': function (v) { return String(v).replace(/^\s+/, ''); }, - 'downcase': function (v) { return v.toLowerCase(); }, - 'upcase': function (str) { return String(str).toUpperCase(); }, - 'remove': function (v, arg) { return v.split(arg).join(''); }, - 'remove_first': function (v, l) { return v.replace(l, ''); }, - 'replace': function (v, pattern, replacement) { - return String(v).split(pattern).join(replacement); - }, - 'replace_first': function (v, arg1, arg2) { return String(v).replace(arg1, arg2); }, - 'rstrip': function (str) { return String(str).replace(/\s+$/, ''); }, - 'split': function (v, arg) { return String(v).split(arg); }, - 'strip': function (v) { return String(v).trim(); }, - 'strip_newlines': function (v) { return String(v).replace(/\n/g, ''); }, - 'truncate': function (v, l, o) { - if (l === void 0) { l = 50; } - if (o === void 0) { o = '...'; } - v = String(v); - if (v.length <= l) - return v; - return v.substr(0, l - o.length) + o; - }, - 'truncatewords': function (v, l, o) { - if (l === void 0) { l = 15; } - if (o === void 0) { o = '...'; } - var arr = v.split(/\s+/); - var ret = arr.slice(0, l).join(' '); - if (arr.length >= l) - ret += o; - return ret; - } -}; - -var math = { - 'abs': function (v) { return Math.abs(v); }, - 'ceil': function (v) { return Math.ceil(v); }, - 'divided_by': function (v, arg) { return v / arg; }, - 'floor': function (v) { return Math.floor(v); }, - 'minus': bindFixed(function (v, arg) { return v - arg; }), - 'modulo': bindFixed(function (v, arg) { return v % arg; }), - 'round': function (v, arg) { - if (arg === void 0) { arg = 0; } - var amp = Math.pow(10, arg); - return Math.round(v * amp) / amp; - }, - 'plus': bindFixed(function (v, arg) { return Number(v) + Number(arg); }), - 'times': function (v, arg) { return v * arg; } -}; -function getFixed(v) { - var p = String(v).split('.'); - return (p.length > 1) ? p[1].length : 0; -} -function bindFixed(cb) { - return function (l, r) { - var f = Math.max(getFixed(l), getFixed(r)); - return cb(l, r).toFixed(f); - }; -} - -var url = { - 'url_decode': function (x) { return x.split('+').map(decodeURIComponent).join(' '); }, - 'url_encode': function (x) { return x.split(' ').map(encodeURIComponent).join('+'); } -}; - -var array = { - 'join': function (v, arg) { return v.join(arg === undefined ? ' ' : arg); }, - 'last': function (v) { return last(v); }, - 'first': function (v) { return v[0]; }, - 'map': function (arr, arg) { return arr.map(function (v) { return v[arg]; }); }, - 'reverse': function (v) { return v.reverse(); }, - 'sort': function (v, arg) { return v.sort(arg); }, - 'size': function (v) { return v.length; }, - 'concat': function (v, arg) { return Array.prototype.concat.call(v, arg); }, - 'slice': function (v, begin, length) { - if (length === undefined) - length = 1; - return v.slice(begin, begin + length); - }, - 'uniq': function (arr) { - var u = {}; - return (arr || []).filter(function (val) { - if (u.hasOwnProperty(String(val))) - return false; - u[String(val)] = true; - return true; - }); - } -}; - -var monthNames = [ - 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', - 'September', 'October', 'November', 'December' -]; -var dayNames = [ - 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' -]; -var monthNamesShort = monthNames.map(abbr); -var dayNamesShort = dayNames.map(abbr); -var suffixes = { - 1: 'st', - 2: 'nd', - 3: 'rd', - 'default': 'th' -}; -function abbr(str) { - return str.slice(0, 3); -} -// prototype extensions -var _date = { - daysInMonth: function (d) { - var feb = _date.isLeapYear(d) ? 29 : 28; - return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - }, - getDayOfYear: function (d) { - var num = 0; - for (var i = 0; i < d.getMonth(); ++i) { - num += _date.daysInMonth(d)[i]; - } - return num + d.getDate(); - }, - getWeekOfYear: function (d, startDay) { - // Skip to startDay of this week - var now = this.getDayOfYear(d) + (startDay - d.getDay()); - // Find the first startDay of the year - var jan1 = new Date(d.getFullYear(), 0, 1); - var then = (7 - jan1.getDay() + startDay); - return padStart(String(Math.floor((now - then) / 7) + 1), 2, '0'); - }, - isLeapYear: function (d) { - var year = d.getFullYear(); - return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year))); - }, - getSuffix: function (d) { - var str = d.getDate().toString(); - var index = parseInt(str.slice(-1)); - return suffixes[index] || suffixes['default']; - }, - century: function (d) { - return parseInt(d.getFullYear().toString().substring(0, 2), 10); - } -}; -var formatCodes = { - a: function (d) { - return dayNamesShort[d.getDay()]; - }, - A: function (d) { - return dayNames[d.getDay()]; - }, - b: function (d) { - return monthNamesShort[d.getMonth()]; - }, - B: function (d) { - return monthNames[d.getMonth()]; - }, - c: function (d) { - return d.toLocaleString(); - }, - C: function (d) { - return _date.century(d); - }, - d: function (d) { - return padStart(d.getDate(), 2, '0'); - }, - e: function (d) { - return padStart(d.getDate(), 2); - }, - H: function (d) { - return padStart(d.getHours(), 2, '0'); - }, - I: function (d) { - return padStart(String(d.getHours() % 12 || 12), 2, '0'); - }, - j: function (d) { - return padStart(_date.getDayOfYear(d), 3, '0'); - }, - k: function (d) { - return padStart(d.getHours(), 2); - }, - l: function (d) { - return padStart(String(d.getHours() % 12 || 12), 2); - }, - L: function (d) { - return padStart(d.getMilliseconds(), 3, '0'); - }, - m: function (d) { - return padStart(d.getMonth() + 1, 2, '0'); - }, - M: function (d) { - return padStart(d.getMinutes(), 2, '0'); - }, - p: function (d) { - return (d.getHours() < 12 ? 'AM' : 'PM'); - }, - P: function (d) { - return (d.getHours() < 12 ? 'am' : 'pm'); - }, - q: function (d) { - return _date.getSuffix(d); - }, - s: function (d) { - return Math.round(d.valueOf() / 1000); - }, - S: function (d) { - return padStart(d.getSeconds(), 2, '0'); - }, - u: function (d) { - return d.getDay() || 7; - }, - U: function (d) { - return _date.getWeekOfYear(d, 0); - }, - w: function (d) { - return d.getDay(); - }, - W: function (d) { - return _date.getWeekOfYear(d, 1); - }, - x: function (d) { - return d.toLocaleDateString(); - }, - X: function (d) { - return d.toLocaleTimeString(); - }, - y: function (d) { - return d.getFullYear().toString().substring(2, 4); - }, - Y: function (d) { - return d.getFullYear(); - }, - z: function (d) { - var tz = d.getTimezoneOffset() / 60 * 100; - return (tz > 0 ? '-' : '+') + padStart(String(Math.abs(tz)), 4, '0'); - }, - '%': function () { - return '%'; - } -}; -formatCodes.h = formatCodes.b; -formatCodes.N = formatCodes.L; -function strftime (d, format) { - var output = ''; - var remaining = format; - while (true) { - var r = /%./g; - var results = r.exec(remaining); - // No more format codes. Add the remaining text and return - if (!results) { - return output + remaining; - } - // Add the preceding text - output += remaining.slice(0, r.lastIndex - 2); - remaining = remaining.slice(r.lastIndex); - // Add the format code - var ch = results[0].charAt(1); - var func = formatCodes[ch]; - output += func ? func(d) : '%' + ch; - } -} - -var date = { - 'date': function (v, arg) { - var date = v; - if (v === 'now') { - date = new Date(); - } - else if (isString(v)) { - date = new Date(v); - } - return isValidDate(date) ? strftime(date, arg) : v; - } -}; -function isValidDate(date) { - return date instanceof Date && !isNaN(date.getTime()); -} - -var obj = { - 'default': function (v, arg) { return isTruthy(v) ? v : arg; } -}; - -var builtinFilters = __assign({}, html, str, math, url, date, obj, array); - -var Liquid = /** @class */ (function () { - function Liquid(opts) { - if (opts === void 0) { opts = {}; } - var _this = this; - this.cache = {}; - this.options = applyDefault(normalize(opts)); - this.parser = new Parser(this); - this.renderer = new Render(); - this.tokenizer = new Tokenizer(this.options); - forOwn(tags, function (conf, name) { return _this.registerTag(name, conf); }); - forOwn(builtinFilters, function (handler, name) { return _this.registerFilter(name, handler); }); - } - Liquid.prototype.parse = function (html, filepath) { - var tokens = this.tokenizer.tokenize(html, filepath); - return this.parser.parse(tokens); - }; - Liquid.prototype.render = function (tpl, ctx, opts) { - var options = __assign({}, this.options, normalize(opts)); - var scope = new Scope(ctx, options); - return this.renderer.renderTemplates(tpl, scope); - }; - Liquid.prototype.parseAndRender = function (html, ctx, opts) { - return __awaiter(this, void 0, void 0, function () { - var tpl; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.parse(html)]; - case 1: - tpl = _a.sent(); - return [2 /*return*/, this.render(tpl, ctx, opts)]; - } - }); - }); - }; - Liquid.prototype.getTemplate = function (file, opts) { - return __awaiter(this, void 0, void 0, function () { - var options, roots, paths, _i, paths_1, filepath, value, _a, err; - var _this = this; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - options = normalize(opts); - roots = options.root ? options.root.concat(this.options.root) : this.options.root; - paths = roots.map(function (root) { return fs$1.resolve(root, file, _this.options.extname); }); - _i = 0, paths_1 = paths; - _b.label = 1; - case 1: - if (!(_i < paths_1.length)) return [3 /*break*/, 5]; - filepath = paths_1[_i]; - return [4 /*yield*/, fs$1.exists(filepath)]; - case 2: - if (!(_b.sent())) - return [3 /*break*/, 4]; - if (this.options.cache && this.cache[filepath]) - return [2 /*return*/, this.cache[filepath]]; - _a = this.parse; - return [4 /*yield*/, fs$1.readFile(filepath)]; - case 3: - value = _a.apply(this, [_b.sent(), filepath]); - if (this.options.cache) - this.cache[filepath] = value; - return [2 /*return*/, value]; - case 4: - _i++; - return [3 /*break*/, 1]; - case 5: - err = new Error('ENOENT'); - err.message = "ENOENT: Failed to lookup \"" + file + "\" in \"" + roots + "\""; - err.code = 'ENOENT'; - throw err; - } - }); - }); - }; - Liquid.prototype.renderFile = function (file, ctx, opts) { - return __awaiter(this, void 0, void 0, function () { - var options, templates; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - options = normalize(opts); - return [4 /*yield*/, this.getTemplate(file, options)]; - case 1: - templates = _a.sent(); - return [2 /*return*/, this.render(templates, ctx, opts)]; - } - }); - }); - }; - Liquid.prototype.evalValue = function (str, scope) { - return new default_1(str, this.options.strict_filters).value(scope); - }; - Liquid.prototype.registerFilter = function (name, filter) { - return Filter.register(name, filter); - }; - Liquid.prototype.registerTag = function (name, tag) { - return Tag.register(name, tag); - }; - Liquid.prototype.plugin = function (plugin) { - return plugin.call(this, Liquid); - }; - Liquid.prototype.express = function () { - var self = this; - return function (filePath, ctx, cb) { - var opts = { root: this.root }; - self.renderFile(filePath, ctx, opts).then(function (html) { return cb(null, html); }, cb); - }; - }; - Liquid.default = Liquid; - Liquid.isTruthy = isTruthy; - Liquid.isFalsy = isFalsy; - Liquid.evalExp = evalExp; - Liquid.evalValue = evalValue; - Liquid.Types = Types; - return Liquid; -}()); - -module.exports = Liquid; -//# sourceMappingURL=liquid.common.js.map diff --git a/dist/liquid.common.js.map b/dist/liquid.common.js.map deleted file mode 100644 index d0567af73..000000000 --- a/dist/liquid.common.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"liquid.common.js","sources":["../src/util/underscore.ts","../src/util/error.ts","../src/util/assert.ts","../src/liquid-options.ts","../src/scope/block-mode.ts","../src/scope/scope.ts","../src/scope/scopes.ts","../src/fs/node.ts","../src/parser/whitespace-ctrl.ts","../src/parser/token.ts","../src/parser/html-token.ts","../src/parser/delimited-token.ts","../src/parser/lexical.ts","../src/parser/tag-token.ts","../src/parser/output-token.ts","../src/parser/tokenizer.ts","../src/render/render.ts","../src/drop/icomparable.ts","../src/drop/drop.ts","../src/drop/idrop.ts","../src/drop/empty-drop.ts","../src/drop/blank-drop.ts","../src/drop/null-drop.ts","../src/render/syntax.ts","../src/template/tag/hash.ts","../src/template/template.ts","../src/template/tag/tag.ts","../src/template/filter/filter.ts","../src/parser/parse-stream.ts","../src/template/value.ts","../src/template/output.ts","../src/template/html.ts","../src/parser/parser.ts","../src/builtin/tags/assign.ts","../src/util/promise.ts","../src/builtin/tags/for.ts","../src/builtin/tags/capture.ts","../src/builtin/tags/case.ts","../src/builtin/tags/comment.ts","../src/builtin/tags/include.ts","../src/builtin/tags/decrement.ts","../src/builtin/tags/cycle.ts","../src/builtin/tags/if.ts","../src/builtin/tags/increment.ts","../src/builtin/tags/layout.ts","../src/builtin/tags/block.ts","../src/builtin/tags/raw.ts","../src/builtin/tags/tablerow.ts","../src/builtin/tags/unless.ts","../src/builtin/tags/break.ts","../src/builtin/tags/continue.ts","../src/builtin/tags/index.ts","../src/builtin/filters/html.ts","../src/builtin/filters/string.ts","../src/builtin/filters/math.ts","../src/builtin/filters/url.ts","../src/builtin/filters/array.ts","../src/util/strftime.ts","../src/builtin/filters/date.ts","../src/builtin/filters/object.ts","../src/builtin/filters/index.ts","../src/liquid.ts"],"sourcesContent":["const toStr = Object.prototype.toString\nconst arrToStr = Array.prototype.toString\n\n/*\n * Checks if value is classified as a String primitive or object.\n * @param {any} value The value to check.\n * @return {Boolean} Returns true if value is a string, else false.\n */\nexport function isString (value: any): value is string {\n return toStr.call(value) === '[object String]'\n}\n\nexport function isFunction (value: any): value is Function {\n return typeof value === 'function'\n}\n\nexport function promisify (fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise;\nexport function promisify (fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void):(arg1: T1, arg2: T2) => Promise;\nexport function promisify (fn: any) {\n return function (...args: any[]) {\n return new Promise((resolve, reject) => {\n fn(...args, (err: Error, result: any) => {\n err ? reject(err) : resolve(result)\n })\n })\n }\n}\n\nexport function stringify (value: any): string {\n if (isNil(value)) return ''\n if (isFunction(value.to_liquid)) return stringify(value.to_liquid())\n if (isFunction(value.toLiquid)) return stringify(value.toLiquid())\n if (isFunction(value.to_s)) return value.to_s()\n if ([toStr, arrToStr].indexOf(value.toString) > -1) return defaultToString(value)\n if (isFunction(value.toString)) return value.toString()\n return toStr.call(value)\n}\n\nfunction defaultToString (value: any): string {\n const cache: any[] = []\n return JSON.stringify(value, (key, value) => {\n if (isObject(value)) {\n if (cache.indexOf(value) !== -1) {\n return\n }\n cache.push(value)\n }\n return value\n })\n}\n\nexport function create (proto: T1): T2 {\n return Object.create(proto)\n}\n\nexport function isNil (value: any): boolean {\n return value === null || value === undefined\n}\n\nexport function isArray (value: any): value is any[] {\n // be compatible with IE 8\n return toStr.call(value) === '[object Array]'\n}\n\nexport function isError (value: any): value is Error {\n const signature = toStr.call(value)\n // [object XXXError]\n return signature.substr(-6, 5) === 'Error' ||\n (typeof value.message === 'string' && typeof value.name === 'string')\n}\n\n/*\n * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property.\n * The iteratee is invoked with three arguments: (value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning false.\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @return {Object} Returns object.\n */\nexport function forOwn (\n object: {[key: string]: T} | undefined,\n iteratee: ((val: T, key: string, obj: {[key: string]: T}) => boolean | void)\n) {\n object = object || {}\n for (const k in object) {\n if (object.hasOwnProperty(k)) {\n if (iteratee(object[k], k, object) === false) break\n }\n }\n return object\n}\n\nexport function last (arr: T[]): T;\nexport function last (arr: string): string;\nexport function last (arr: any[] | string): any | string {\n return arr[arr.length - 1]\n}\n\n/*\n * Checks if value is the language type of Object.\n * (e.g. arrays, functions, objects, regexes, new Number(0), and new String(''))\n * @param {any} value The value to check.\n * @return {Boolean} Returns true if value is an object, else false.\n */\nexport function isObject (value: any): value is object {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\n/*\n * A function to create flexibly-numbered lists of integers,\n * handy for each and map loops. start, if omitted, defaults to 0; step defaults to 1.\n * Returns a list of integers from start (inclusive) to stop (exclusive),\n * incremented (or decremented) by step, exclusive.\n * Note that ranges that stop before they start are considered to be zero-length instead of\n * negative — if you'd like a negative range, use a negative step.\n */\nexport function range (start: number, stop?: number, step?: number) {\n if (stop === undefined) {\n stop = start\n start = 0\n }\n step = step || 1\n\n const arr: number[] = []\n for (let i = start; i < stop; i += step) {\n arr.push(i)\n }\n return arr\n}\n\nexport function padStart (str: any, length: number, ch: string = ' ') {\n str = String(str)\n let n = length - str.length\n while (n-- > 0) str = ch + str\n return str\n}\n","import * as _ from './underscore'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\n\nabstract class LiquidError extends Error {\n private token: Token\n private originalError: Error\n constructor (err: Error, token: Token) {\n super(err.message)\n this.originalError = err\n this.token = token\n }\n protected update () {\n const err = this.originalError\n const context = mkContext(this.token)\n this.message = mkMessage(err.message, this.token)\n this.stack = this.message + '\\n' + context +\n '\\n' + this.stack + '\\nFrom ' + err.stack\n }\n}\n\nexport class TokenizationError extends LiquidError {\n constructor (message: string, token: Token) {\n super(new Error(message), token)\n this.name = 'TokenizationError'\n super.update()\n }\n}\n\nexport class ParseError extends LiquidError {\n constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'ParseError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderError extends LiquidError {\n constructor (err: Error, tpl: ITemplate) {\n super(err, tpl.token)\n this.name = 'RenderError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderBreakError extends Error {\n resolvedHTML: string = ''\n constructor (message: string) {\n super(message)\n this.name = 'RenderBreakError'\n this.message = message + ''\n }\n}\n\nexport class AssertionError extends Error {\n constructor (message: string) {\n super(message)\n this.name = 'AssertionError'\n this.message = message + ''\n }\n}\n\nfunction mkContext (token: Token) {\n const lines = token.input.split('\\n')\n const begin = Math.max(token.line - 2, 1)\n const end = Math.min(token.line + 3, lines.length)\n\n const context = _\n .range(begin, end + 1)\n .map(lineNumber => {\n const indicator = (lineNumber === token.line) ? '>> ' : ' '\n const num = _.padStart(String(lineNumber), String(end).length)\n const text = lines[lineNumber - 1]\n return `${indicator}${num}| ${text}`\n })\n .join('\\n')\n\n return context\n}\n\nfunction mkMessage (msg: string, token: Token) {\n if (token.file) msg += `, file:${token.file}`\n msg += `, line:${token.line}, col:${token.col}`\n return msg\n}\n","import { AssertionError } from './error'\n\nexport default function (predicate: any, message?: string) {\n if (!predicate) {\n message = message || `expect ${predicate} to be true`\n throw new AssertionError(message)\n }\n}\n","/* eslint-disable camelcase */\n\nimport * as _ from './util/underscore'\n\nexport interface LiquidOptions {\n /** `root` is a directory or an array of directories to resolve layouts and includes, as well as the filename passed in when calling `.renderFile()`. If an array, the files are looked up in the order they occur in the array. Defaults to `[\".\"]` */\n root?: string | string[]\n /** `extname` is used to lookup the template file when filepath doesn't include an extension name. Eg: setting to `\".html\"` will allow including file by basename. Defaults to `\"\"`. */\n extname?: string\n /** `cache` indicates whether or not to cache resolved templates. Defaults to `false`. */\n cache?: boolean\n /** `dynamicPartials`: if set, treat `` parameter in `{%include filepath %}`, `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */\n dynamicPartials?: boolean\n /** `strict_filters` is used to enable strict filter existence. If set to `false`, undefined filters will be rendered as empty string. Otherwise, undefined filters will cause an exception. Defaults to `false`. */\n strict_filters?: boolean\n /** `strict_variables` is used to enable strict variable derivation. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */\n strict_variables?: boolean\n /** `trim_tag_right` is used to strip blank characters (including ` `, `\\t`, and `\\r`) from the right of tags (`{% %}`) until `\\n` (inclusive). Defaults to `false`. */\n trim_tag_right?: boolean\n /** `trim_tag_left` is similar to `trim_tag_right`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trim_tag_left?: boolean\n /** ``trim_output_right` is used to strip blank characters (including ` `, `\\t`, and `\\r`) from the right of values (`{{ }}`) until `\\n` (inclusive). Defaults to `false`. */\n trim_output_right?: boolean\n /** `trim_output_left` is similar to `trim_output_right`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trim_output_left?: boolean\n /** `tag_delimiter_left` and `tag_delimiter_right` are used to override the delimiter for liquid tags **/\n tag_delimiter_left?: string,\n tag_delimiter_right?: string,\n /** `output_delimiter_left` and `output_delimiter_right` are used to override the delimiter for liquid outputs **/\n output_delimiter_left?: string,\n output_delimiter_right?: string,\n /** `greedy` is used to specify whether `trim_left`/`trim_right` is greedy. When set to `true`, all consecutive blank characters including `\\n` will be trimed regardless of line breaks. Defaults to `true`. */\n greedy?: boolean\n}\n\ninterface NormalizedOptions extends LiquidOptions {\n root?: string[]\n}\n\nexport interface NormalizedFullOptions extends NormalizedOptions {\n root: string[]\n extname: string\n cache: boolean\n dynamicPartials: boolean\n strict_filters: boolean\n strict_variables: boolean\n trim_tag_right: boolean\n trim_tag_left: boolean\n trim_output_right: boolean\n trim_output_left: boolean\n tag_delimiter_left: string,\n tag_delimiter_right: string,\n output_delimiter_left: string,\n output_delimiter_right: string,\n greedy: boolean\n}\n\nconst defaultOptions: NormalizedFullOptions = {\n root: ['.'],\n cache: false,\n extname: '',\n dynamicPartials: true,\n trim_tag_right: false,\n trim_tag_left: false,\n trim_output_right: false,\n trim_output_left: false,\n greedy: true,\n tag_delimiter_left: '{%',\n tag_delimiter_right: '%}',\n output_delimiter_left: '{{',\n output_delimiter_right: '}}',\n strict_filters: false,\n strict_variables: false\n}\n\nexport function normalize (options?: LiquidOptions): NormalizedOptions {\n options = options || {}\n if (options.hasOwnProperty('root')) {\n options.root = normalizeStringArray(options.root)\n }\n return options as NormalizedOptions\n}\n\nexport function applyDefault (options?: NormalizedOptions): NormalizedFullOptions {\n return { ...defaultOptions, ...options }\n}\n\nfunction normalizeStringArray (value: any): string[] {\n if (_.isArray(value)) return value as string[]\n if (_.isString(value)) return [value as string]\n return []\n}\n","enum BlockMode {\n /* store rendered html into blocks */\n OUTPUT,\n /* output rendered html directly */\n STORE\n}\n\nexport default BlockMode\n","import * as _ from '../util/underscore'\nimport { __assign } from 'tslib'\nimport assert from '../util/assert'\nimport { NormalizedFullOptions, applyDefault } from '../liquid-options'\nimport BlockMode from './block-mode'\n\nexport type Context = {\n [key: string]: any\n liquid_method_missing?: (key: string) => any // eslint-disable-line\n to_liquid?: () => any // eslint-disable-line\n toLiquid?: () => any // eslint-disable-line\n}\n\nexport default class Scope {\n opts: NormalizedFullOptions\n contexts: Array\n blocks: object = {}\n groups: {[key: string]: number} = {}\n blockMode: BlockMode = BlockMode.OUTPUT\n constructor (ctx: object = {}, opts?: NormalizedFullOptions) {\n this.opts = applyDefault(opts)\n this.contexts = [ctx || {}]\n }\n getAll () {\n return this.contexts.reduce((ctx, val) => __assign(ctx, val), {})\n }\n get (path: string): any {\n const paths = this.propertyAccessSeq(path)\n const scope = this.findContextFor(paths[0]) || _.last(this.contexts)\n return paths.reduce((value, key) => this.readProperty(value, key), scope)\n }\n set (path: string, v: any): void {\n const paths = this.propertyAccessSeq(path)\n let scope = this.findContextFor(paths[0]) || _.last(this.contexts)\n paths.some((key, i) => {\n if (!_.isObject(scope)) {\n return true\n }\n if (i === paths.length - 1) {\n scope[key] = v\n return true\n }\n if (undefined === scope[key]) {\n scope[key] = {}\n }\n scope = scope[key]\n return false\n })\n }\n unshift (ctx: object) {\n return this.contexts.unshift(ctx)\n }\n push (ctx: object) {\n return this.contexts.push(ctx)\n }\n pop (ctx?: object): object | undefined {\n if (!arguments.length) {\n return this.contexts.pop()\n }\n const i = this.contexts.findIndex(scope => scope === ctx)\n if (i === -1) {\n throw new TypeError('scope not found, cannot pop')\n }\n return this.contexts.splice(i, 1)[0]\n }\n findContextFor (key: string, filter: ((conttext: object) => boolean) = () => true) {\n for (let i = this.contexts.length - 1; i >= 0; i--) {\n const candidate = this.contexts[i]\n if (!filter(candidate)) continue\n if (key in candidate) {\n return candidate\n }\n }\n return null\n }\n private readProperty (obj: Context, key: string) {\n let val\n if (_.isNil(obj)) {\n val = obj\n } else {\n obj = toLiquid(obj)\n val = key === 'size' ? readSize(obj) : obj[key]\n if (_.isFunction(obj.liquid_method_missing)) {\n val = obj.liquid_method_missing!(key)\n }\n }\n if (_.isNil(val) && this.opts.strict_variables) {\n throw new TypeError(`undefined variable: ${key}`)\n }\n return val\n }\n\n /*\n * Parse property access sequence from access string\n * @example\n * accessSeq(\"foo.bar\") // ['foo', 'bar']\n * accessSeq(\"foo['bar']\") // ['foo', 'bar']\n * accessSeq(\"foo['b]r']\") // ['foo', 'b]r']\n * accessSeq(\"foo[bar.coo]\") // ['foo', 'bar'], for bar.coo == 'bar'\n */\n propertyAccessSeq (str: string) {\n str = String(str)\n const seq: string[] = []\n let name = ''\n let j\n let i = 0\n while (i < str.length) {\n switch (str[i]) {\n case '[':\n push()\n\n const delemiter = str[i + 1]\n if (/['\"]/.test(delemiter)) { // foo[\"bar\"]\n j = str.indexOf(delemiter, i + 2)\n assert(j !== -1, `unbalanced ${delemiter}: ${str}`)\n name = str.slice(i + 2, j)\n push()\n i = j + 2\n } else { // foo[bar.coo]\n j = matchRightBracket(str, i + 1)\n assert(j !== -1, `unbalanced []: ${str}`)\n name = str.slice(i + 1, j)\n if (!/^[+-]?\\d+$/.test(name)) { // foo[bar] vs. foo[1]\n name = String(this.get(name))\n }\n push()\n i = j + 1\n }\n break\n case '.':// foo.bar, foo[0].bar\n push()\n i++\n break\n default:// foo.bar\n name += str[i]\n i++\n }\n }\n push()\n\n if (!seq.length) {\n throw new TypeError(`invalid path:\"${str}\"`)\n }\n return seq\n\n function push () {\n if (name.length) seq.push(name)\n name = ''\n }\n }\n}\n\nfunction toLiquid (obj: Context) {\n if (_.isFunction(obj.to_liquid)) {\n return obj.to_liquid()\n }\n if (_.isFunction(obj.toLiquid)) {\n return obj.toLiquid()\n }\n return obj\n}\n\nfunction readSize (obj: Context) {\n if (!_.isNil(obj.size)) return obj.size\n if (_.isArray(obj) || _.isString(obj)) return obj.length\n return obj.size\n}\n\nfunction matchRightBracket (str: string, begin: number) {\n let stack = 1 // count of '[' - count of ']'\n for (let i = begin; i < str.length; i++) {\n if (str[i] === '[') {\n stack++\n }\n if (str[i] === ']') {\n stack--\n if (stack === 0) {\n return i\n }\n }\n }\n return -1\n}\n","export class CaptureScope {}\nexport class AssignScope {}\nexport class IncrementScope {}\nexport class DecrementScope {}\n","import * as _ from '../util/underscore'\nimport { resolve, extname } from 'path'\nimport { stat, readFile } from 'fs'\nimport IFS from './ifs'\n\nconst statAsync = _.promisify(stat)\nconst readFileAsync = _.promisify(readFile)\n\nconst fs: IFS = {\n exists: (filepath: string) => {\n return statAsync(filepath).then(() => true).catch(() => false)\n },\n readFile: filepath => {\n return readFileAsync(filepath, 'utf8')\n },\n resolve: (root: string, file: string, ext: string) => {\n if (!extname(file)) file += ext\n return resolve(root, file)\n }\n}\n\nexport default fs\n","import DelimitedToken from 'src/parser/delimited-token'\nimport Token from 'src/parser/token'\nimport TagToken from 'src/parser/tag-token'\nimport { NormalizedFullOptions } from 'src/liquid-options'\n\nexport default function whiteSpaceCtrl (tokens: Token[], options: NormalizedFullOptions) {\n options = { greedy: true, ...options }\n let inRaw = false\n\n tokens.forEach((token: Token, i: number) => {\n if (shouldTrimLeft(token as DelimitedToken, inRaw, options)) {\n trimLeft(tokens[i - 1], options.greedy)\n }\n\n if (token.type === 'tag' && (token as TagToken).name === 'raw') inRaw = true\n if (token.type === 'tag' && (token as TagToken).name === 'endraw') inRaw = false\n\n if (shouldTrimRight(token as DelimitedToken, inRaw, options)) {\n trimRight(tokens[i + 1], options.greedy)\n }\n })\n}\n\nfunction shouldTrimLeft (token: DelimitedToken, inRaw: boolean, options: NormalizedFullOptions) {\n if (inRaw) return false\n if (token.type === 'tag') return token.trimLeft || options.trim_tag_left\n if (token.type === 'output') return token.trimLeft || options.trim_output_left\n}\n\nfunction shouldTrimRight (token: DelimitedToken, inRaw: boolean, options: NormalizedFullOptions) {\n if (inRaw) return false\n if (token.type === 'tag') return token.trimRight || options.trim_tag_right\n if (token.type === 'output') return token.trimRight || options.trim_output_right\n}\n\nfunction trimLeft (token: Token, greedy: boolean) {\n if (!token || token.type !== 'html') return\n\n const rLeft = greedy ? /\\s+$/g : /[\\t\\r ]*$/g\n token.value = token.value.replace(rLeft, '')\n}\n\nfunction trimRight (token: Token, greedy: boolean) {\n if (!token || token.type !== 'html') return\n\n const rRight = greedy ? /^\\s+/g : /^[\\t\\r ]*\\n?/g\n token.value = token.value.replace(rRight, '')\n}\n","export default class Token {\n type: string = 'notset'\n line: number\n col: number\n raw: string\n input: string\n file?: string\n value: string\n constructor (raw: string, input: string, line: number, col: number, file?: string) {\n this.col = col\n this.line = line\n this.raw = raw\n this.value = raw\n this.input = input\n this.file = file\n }\n}\n","import Token from './token'\n\nexport default class HTMLToken extends Token {\n constructor (str: string, input: string, line: number, col: number, file?: string) {\n super(str, input, line, col, file)\n this.type = 'html'\n this.value = str\n }\n}\n","import Token from './token'\nimport { last } from 'src/util/underscore'\n\nexport default class DelimitedToken extends Token {\n trimLeft: boolean\n trimRight: boolean\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, input, line, pos, file)\n this.trimLeft = value[0] === '-'\n this.trimRight = last(value) === '-'\n this.value = value\n .slice(\n this.trimLeft ? 1 : 0,\n this.trimRight ? -1 : value.length\n )\n .trim()\n }\n}\n","// quote related\nconst singleQuoted = /'[^']*'/\nconst doubleQuoted = /\"[^\"]*\"/\nexport const quoted = new RegExp(`${singleQuoted.source}|${doubleQuoted.source}`)\nexport const quoteBalanced = new RegExp(`(?:${quoted.source}|[^'\"])*`)\n\n// basic types\nexport const number = /[+-]?(?:\\d+\\.?\\d*|\\.?\\d+)/\nexport const bool = /true|false/\n\n// property access\nexport const identifier = /[\\w-]+[?]?/\nexport const subscript = new RegExp(`\\\\[(?:${quoted.source}|[\\\\w-\\\\.]+)\\\\]`)\nexport const literal = new RegExp(`(?:${quoted.source}|${bool.source}|${number.source})`)\nexport const variable = new RegExp(`${identifier.source}(?:\\\\.${identifier.source}|${subscript.source})*`)\n\n// range related\nexport const rangeLimit = new RegExp(`(?:${variable.source}|${number.source})`)\nexport const range = new RegExp(`\\\\(${rangeLimit.source}\\\\.\\\\.${rangeLimit.source}\\\\)`)\nexport const rangeCapture = new RegExp(`\\\\((${rangeLimit.source})\\\\.\\\\.(${rangeLimit.source})\\\\)`)\n\nexport const value = new RegExp(`(?:${variable.source}|${literal.source}|${range.source})`)\n\n// hash related\nexport const hash = new RegExp(`(?:${identifier.source})\\\\s*:\\\\s*(?:${value.source})`)\nexport const hashCapture = new RegExp(`(${identifier.source})\\\\s*:\\\\s*(${value.source})`, 'g')\n\n// full match\nexport const tagLine = new RegExp(`^\\\\s*(${identifier.source})\\\\s*([\\\\s\\\\S]*?)\\\\s*$`)\nexport const numberLine = new RegExp(`^${number.source}$`)\nexport const boolLine = new RegExp(`^${bool.source}$`, 'i')\nexport const quotedLine = new RegExp(`^${quoted.source}$`)\nexport const rangeLine = new RegExp(`^${rangeCapture.source}$`)\n\nexport const operators = [\n /\\s+or\\s+/,\n /\\s+and\\s+/,\n /==|!=|<=|>=|<|>|\\s+contains\\s+/\n]\n\nexport function isRange (str: string) {\n return rangeLine.test(str)\n}\n","import DelimitedToken from './delimited-token'\nimport { TokenizationError } from 'src/util/error'\nimport * as lexical from './lexical'\n\nexport default class TagToken extends DelimitedToken {\n name: string\n args: string\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, value, input, line, pos, file)\n this.type = 'tag'\n const match = this.value.match(lexical.tagLine)\n if (!match) {\n throw new TokenizationError(`illegal tag syntax`, this)\n }\n this.name = match[1]\n this.args = match[2]\n }\n}\n","import DelimitedToken from './delimited-token'\n\nexport default class OutputToken extends DelimitedToken {\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, value, input, line, pos, file)\n this.type = 'output'\n }\n}\n","import whiteSpaceCtrl from './whitespace-ctrl'\nimport HTMLToken from './html-token'\nimport TagToken from './tag-token'\nimport Token from './token'\nimport OutputToken from './output-token'\nimport { TokenizationError } from 'src/util/error'\nimport { NormalizedFullOptions, applyDefault } from '../liquid-options'\n\nenum ParseState { HTML, OUTPUT, TAG }\n\nexport default class Tokenizer {\n options: NormalizedFullOptions\n constructor (options?: NormalizedFullOptions) {\n this.options = applyDefault(options)\n }\n tokenize (input: string, file?: string) {\n const tokens: Token[] = []\n const tagL = this.options.tag_delimiter_left\n const tagR = this.options.tag_delimiter_right\n const outputL = this.options.output_delimiter_left\n const outputR = this.options.output_delimiter_right\n let p = 0\n let curLine = 1\n let state = ParseState.HTML\n let buffer = ''\n let lineBegin = 0\n let line = 1\n let col = 1\n\n while (p < input.length) {\n if (input[p] === '\\n') {\n curLine++\n lineBegin = p + 1\n }\n if (state === ParseState.HTML) {\n if (input.substr(p, outputL.length) === outputL) {\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n buffer = outputL\n line = curLine\n col = p - lineBegin + 1\n p += outputL.length\n state = ParseState.OUTPUT\n continue\n } else if (input.substr(p, tagL.length) === tagL) {\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n buffer = tagL\n line = curLine\n col = p - lineBegin + 1\n p += tagL.length\n state = ParseState.TAG\n continue\n }\n } else if (state === ParseState.OUTPUT && input.substr(p, outputR.length) === outputR) {\n buffer += outputR\n tokens.push(new OutputToken(buffer, buffer.slice(outputL.length, -outputR.length), input, line, col, file))\n p += outputR.length\n buffer = ''\n line = curLine\n col = p - lineBegin + 1\n state = ParseState.HTML\n continue\n } else if (input.substr(p, tagR.length) === tagR) {\n buffer += tagR\n tokens.push(new TagToken(buffer, buffer.slice(tagL.length, -tagR.length), input, line, col, file))\n p += tagR.length\n buffer = ''\n line = curLine\n col = p - lineBegin + 1\n state = ParseState.HTML\n continue\n }\n buffer += input[p++]\n }\n if (state !== ParseState.HTML) {\n const t = state === ParseState.OUTPUT ? 'output' : 'tag'\n const str = buffer.length > 16 ? buffer.slice(0, 13) + '...' : buffer\n throw new TokenizationError(\n `${t} \"${str}\" not closed`,\n new Token(buffer, input, line, col, file)\n )\n }\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n\n whiteSpaceCtrl(tokens, this.options)\n return tokens\n }\n}\n","import { RenderError } from 'src/util/error'\nimport assert from 'src/util/assert'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\n\nexport default class Render {\n async renderTemplates (templates: ITemplate[], scope: Scope) {\n assert(scope, 'unable to evalTemplates: scope undefined')\n\n let html = ''\n for (const tpl of templates) {\n try {\n html += await tpl.render(scope)\n } catch (e) {\n if (e.name === 'RenderBreakError') {\n e.resolvedHTML = html\n throw e\n }\n throw e.name === 'RenderError' ? e : new RenderError(e, tpl)\n }\n }\n return html\n }\n}\n","import { isFunction } from 'src/util/underscore'\n\nexport interface IComparable {\n equals: (rhs: any) => boolean\n gt: (rhs: any) => boolean\n geq: (rhs: any) => boolean\n lt: (rhs: any) => boolean\n leq: (rhs: any) => boolean\n}\n\nexport function isComparable (arg: any): arg is IComparable {\n return arg && isFunction(arg.equals)\n}\n","export abstract class Drop {\n}\n","import { Drop } from './drop'\nimport { isFunction } from 'src/util/underscore'\n\nexport interface IDrop {\n value(): any\n}\n\nexport function isDrop (value: any): value is IDrop {\n return value instanceof Drop && isFunction((value as any).value)\n}\n","import { Drop } from './drop'\nimport { IComparable } from './icomparable'\nimport { isObject, isString, isArray } from 'src/util/underscore'\nimport { IDrop } from 'src/drop/idrop'\n\nexport class EmptyDrop extends Drop implements IDrop, IComparable {\n equals (value: any) {\n if (isString(value) || isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n }\n gt () {\n return false\n }\n geq () {\n return false\n }\n lt () {\n return false\n }\n leq () {\n return false\n }\n value () {\n return ''\n }\n}\n","import { isNil, isString } from 'src/util/underscore'\nimport { isDrop } from 'src/drop/idrop'\nimport { EmptyDrop } from 'src/drop/empty-drop'\n\nexport class BlankDrop extends EmptyDrop {\n equals (value: any) {\n if (value === false) return true\n if (isNil(isDrop(value) ? value.value() : value)) return true\n if (isString(value)) return /^\\s*$/.test(value)\n return super.equals(value)\n }\n}\n","import { Drop } from './drop'\nimport { IComparable } from './icomparable'\nimport { isNil } from 'src/util/underscore'\nimport { IDrop, isDrop } from 'src/drop/idrop'\nimport { BlankDrop } from 'src/drop/blank-drop'\n\nexport class NullDrop extends Drop implements IDrop, IComparable {\n equals (value: any) {\n return isNil(isDrop(value) ? value.value() : value) || value instanceof BlankDrop\n }\n gt () {\n return false\n }\n geq () {\n return false\n }\n lt () {\n return false\n }\n leq () {\n return false\n }\n value () {\n return null\n }\n}\n","import * as lexical from '../parser/lexical'\nimport assert from '../util/assert'\nimport Scope from 'src/scope/scope'\nimport { range, last } from 'src/util/underscore'\nimport { isComparable } from 'src/drop/icomparable'\nimport { NullDrop } from 'src/drop/null-drop'\nimport { EmptyDrop } from 'src/drop/empty-drop'\nimport { BlankDrop } from 'src/drop/blank-drop'\nimport { isDrop } from 'src/drop/idrop'\n\nconst binaryOperators: {[key: string]: (lhs: any, rhs: any) => boolean} = {\n '==': (l: any, r: any) => {\n if (isComparable(l)) return l.equals(r)\n if (isComparable(r)) return r.equals(l)\n return l === r\n },\n '!=': (l: any, r: any) => {\n if (isComparable(l)) return !l.equals(r)\n if (isComparable(r)) return !r.equals(l)\n return l !== r\n },\n '>': (l: any, r: any) => {\n if (isComparable(l)) return l.gt(r)\n if (isComparable(r)) return r.lt(l)\n return l > r\n },\n '<': (l: any, r: any) => {\n if (isComparable(l)) return l.lt(r)\n if (isComparable(r)) return r.gt(l)\n return l < r\n },\n '>=': (l: any, r: any) => {\n if (isComparable(l)) return l.geq(r)\n if (isComparable(r)) return r.leq(l)\n return l >= r\n },\n '<=': (l: any, r: any) => {\n if (isComparable(l)) return l.leq(r)\n if (isComparable(r)) return r.geq(l)\n return l <= r\n },\n 'contains': (l: any, r: any) => {\n if (!l) return false\n if (typeof l.indexOf !== 'function') return false\n return l.indexOf(r) > -1\n },\n 'and': (l: any, r: any) => isTruthy(l) && isTruthy(r),\n 'or': (l: any, r: any) => isTruthy(l) || isTruthy(r)\n}\n\nexport function parseExp (exp: string, scope: Scope): any {\n assert(scope, 'unable to parseExp: scope undefined')\n const operatorREs = lexical.operators\n let match\n for (let i = 0; i < operatorREs.length; i++) {\n const operatorRE = operatorREs[i]\n const expRE = new RegExp(`^(${lexical.quoteBalanced.source})(${operatorRE.source})(${lexical.quoteBalanced.source})$`)\n if ((match = exp.match(expRE))) {\n const l = parseExp(match[1], scope)\n const op = binaryOperators[match[2].trim()]\n const r = parseExp(match[3], scope)\n return op(l, r)\n }\n }\n\n if ((match = exp.match(lexical.rangeLine))) {\n const low = parseValue(match[1], scope)\n const high = parseValue(match[2], scope)\n return range(low, high + 1)\n }\n\n return parseValue(exp, scope)\n}\n\nexport function evalExp (str: string, scope: Scope): any {\n const value = parseExp(str, scope)\n return isDrop(value) ? value.value() : value\n}\n\nfunction parseValue (str: string, scope: Scope): any {\n if (!str) return null\n str = str.trim()\n\n if (str === 'true') return true\n if (str === 'false') return false\n if (str === 'nil' || str === 'null') return new NullDrop()\n if (str === 'empty') return new EmptyDrop()\n if (str === 'blank') return new BlankDrop()\n if (!isNaN(Number(str))) return Number(str)\n if ((str[0] === '\"' || str[0] === \"'\") && str[0] === last(str)) return str.slice(1, -1)\n return scope.get(str)\n}\n\nexport function evalValue (str: string, scope: Scope): any {\n const value = parseValue(str, scope)\n return isDrop(value) ? value.value() : value\n}\n\nexport function isTruthy (val: any): boolean {\n return !isFalsy(val)\n}\n\nexport function isFalsy (val: any): boolean {\n return val === false || undefined === val || val === null\n}\n","import { hashCapture } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport Scope from 'src/scope/scope'\n\n/**\n * Key-Value Pairs Representing Tag Arguments\n * Example:\n * For the markup `{% include 'head.html' foo='bar' %}`,\n * hash['foo'] === 'bar'\n */\nexport default class Hash {\n [key: string]: any\n constructor (markup: string, scope: Scope) {\n let match\n hashCapture.lastIndex = 0\n while ((match = hashCapture.exec(markup))) {\n const k = match[1]\n const v = match[2]\n this[k] = evalValue(v, scope)\n }\n }\n}\n","export default abstract class Template {\n token: T;\n constructor (token: T) {\n this.token = token\n }\n}\n","import { create, stringify } from 'src/util/underscore'\nimport assert from 'src/util/assert'\nimport Scope from 'src/scope/scope'\nimport ITagImpl from './itag-impl'\nimport ITagImplOptions from './itag-impl-options'\nimport Liquid from 'src/liquid'\nimport Hash from './hash'\nimport Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\n\nexport default class Tag extends Template implements ITemplate {\n name: string\n private impl: ITagImpl\n static impls: { [key: string]: ITagImplOptions } = {}\n\n constructor (token: TagToken, tokens: Token[], liquid: Liquid) {\n super(token)\n this.name = token.name\n\n const impl = Tag.impls[token.name]\n assert(impl, `tag ${token.name} not found`)\n this.impl = create(impl)\n this.impl.liquid = liquid\n if (this.impl.parse) {\n this.impl.parse(token, tokens)\n }\n }\n async render (scope: Scope) {\n const hash = new Hash(this.token.args, scope)\n const impl = this.impl\n if (typeof impl.render !== 'function') {\n return ''\n }\n const html = await impl.render(scope, hash)\n return stringify(html)\n }\n static register (name: string, tag: ITagImplOptions) {\n Tag.impls[name] = tag\n }\n static clear () {\n Tag.impls = {}\n }\n}\n","import { evalValue } from 'src/render/syntax'\nimport Scope from 'src/scope/scope'\nimport { FilterImpl } from './filter-impl'\n\nexport default class Filter {\n name: string\n impl: FilterImpl\n args: string[]\n private static impls: {[key: string]: FilterImpl} = {}\n\n constructor (name: string, args: string[], strictFilters: boolean) {\n const impl = Filter.impls[name]\n if (!impl && strictFilters) throw new TypeError(`undefined filter: ${name}`)\n\n this.name = name\n this.impl = impl || (x => x)\n this.args = args\n }\n render (value: any, scope: Scope): any {\n const args = this.args.map(arg => evalValue(arg, scope))\n return this.impl.apply(null, [value, ...args])\n }\n static register (name: string, filter: FilterImpl) {\n Filter.impls[name] = filter\n }\n static clear () {\n Filter.impls = {}\n }\n}\n","import Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport TagToken from './tag-token'\n\ntype ParseToken = ((token: Token, remainTokens: Array) => ITemplate)\n\nexport default class ParseStream {\n private tokens: Array\n private handlers: {[key: string]: (arg: any) => void} = {}\n private stopRequested: boolean = false\n private parseToken: ParseToken\n\n constructor (tokens: Array, parseToken: ParseToken) {\n this.tokens = tokens\n this.parseToken = parseToken\n }\n on (name: string, cb: (arg: T) => void): ParseStream {\n this.handlers[name] = cb\n return this\n }\n trigger (event: string, arg?: T) {\n const h = this.handlers[event]\n if (typeof h === 'function') {\n h(arg)\n return true\n }\n return false\n }\n start () {\n this.trigger('start')\n let token: Token | undefined\n while (!this.stopRequested && (token = this.tokens.shift())) {\n if (this.trigger('token', token)) continue\n if (token.type === 'tag' && this.trigger(`tag:${(token).name}`, token)) {\n continue\n }\n const template = this.parseToken(token, this.tokens)\n this.trigger('template', template)\n }\n if (!this.stopRequested) this.trigger('end')\n return this\n }\n stop () {\n this.stopRequested = true\n return this\n }\n}\n","import { evalExp } from 'src/render/syntax'\nimport Filter from './filter/filter'\nimport Scope from 'src/scope/scope'\n\nenum ParseState {\n INIT = 0,\n FILTER_NAME = 1,\n FILTER_ARG = 2\n}\n\nexport default class {\n initial: any\n filters: Array = []\n\n /**\n * @param str value string, like: \"i have a dream | truncate: 3\n */\n constructor (str: string, strictFilters: boolean) {\n let buffer = ''\n let quoted = ''\n let state = ParseState.INIT\n let sealed = false\n\n let filterName = ''\n let filterArgs: string[] = []\n\n for (let i = 0; i < str.length; i++) {\n if (quoted) {\n if (str[i] === quoted) {\n quoted = ''\n sealed = true\n }\n buffer += str[i]\n } else if (/\\s/.test(str[i])) {\n if (!buffer) continue\n else sealed = true\n } else if (str[i] === '|') {\n if (state === ParseState.INIT) {\n this.initial = buffer\n } else {\n if (state === ParseState.FILTER_NAME) filterName = buffer\n else filterArgs.push(buffer)\n this.filters.push(new Filter(filterName, filterArgs, strictFilters))\n filterName = ''\n filterArgs = []\n }\n state = ParseState.FILTER_NAME\n buffer = ''\n sealed = false\n } else if (state === ParseState.FILTER_NAME && str[i] === ':') {\n filterName = buffer\n state = ParseState.FILTER_ARG\n buffer = ''\n sealed = false\n } else if (state === ParseState.FILTER_ARG && str[i] === ',') {\n filterArgs.push(buffer)\n buffer = ''\n sealed = false\n } else if (sealed) continue\n else {\n if ((str[i] === '\"' || str[i] === \"'\") && !quoted) quoted = str[i]\n buffer += str[i]\n }\n }\n\n if (buffer) {\n if (state === ParseState.INIT) this.initial = buffer\n else if (state === ParseState.FILTER_NAME) this.filters.push(new Filter(buffer, [], strictFilters))\n else {\n filterArgs.push(buffer)\n this.filters.push(new Filter(filterName, filterArgs, strictFilters))\n }\n }\n }\n value (scope: Scope) {\n return this.filters.reduce(\n (prev, filter) => filter.render(prev, scope),\n evalExp(this.initial, scope))\n }\n}\n","import Value from './value'\nimport { stringify } from 'src/util/underscore'\nimport Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport OutputToken from 'src/parser/output-token'\n\nexport default class Output extends Template implements ITemplate {\n value: Value\n constructor (token: OutputToken, strictFilters: boolean) {\n super(token)\n this.value = new Value(token.value, strictFilters)\n }\n async render (scope: Scope): Promise {\n const html = await this.value.value(scope)\n return stringify(html)\n }\n}\n","import Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport HTMLToken from 'src/parser/html-token'\n\nexport default class extends Template implements ITemplate {\n str: string\n constructor (token: HTMLToken) {\n super(token)\n this.str = token.value\n }\n async render (): Promise {\n return this.str\n }\n}\n","import { ParseError } from '../util/error'\nimport Liquid from 'src/liquid'\nimport ParseStream from './parse-stream'\nimport Token from './token'\nimport TagToken from './tag-token'\nimport OutputToken from './output-token'\nimport Tag from 'src/template/tag/tag'\nimport Output from 'src/template/output'\nimport HTML from 'src/template/html'\nimport ITemplate from 'src/template/itemplate'\n\nexport default class Parser {\n liquid: Liquid\n\n constructor (liquid: Liquid) {\n this.liquid = liquid\n }\n parse (tokens: Array) {\n let token\n const templates: ITemplate[] = []\n while ((token = tokens.shift())) {\n templates.push(this.parseToken(token, tokens))\n }\n return templates\n }\n parseToken (token: Token, remainTokens: Array) {\n try {\n if (token.type === 'tag') {\n return new Tag(token as TagToken, remainTokens, this.liquid)\n }\n if (token.type === 'output') {\n return new Output(token as OutputToken, this.liquid.options.strict_filters)\n }\n return new HTML(token)\n } catch (e) {\n throw new ParseError(e, token)\n }\n }\n parseStream (tokens: Array) {\n return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens))\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { AssignScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst re = new RegExp(`(${identifier.source})\\\\s*=([^]*)`)\n\nexport default {\n parse: function (token: TagToken) {\n const match = token.args.match(re) as RegExpMatchArray\n assert(match, `illegal token ${token.raw}`)\n this.key = match[1]\n this.value = match[2]\n },\n render: function (scope: Scope) {\n const ctx = new AssignScope()\n ctx[this.key] = this.liquid.evalValue(this.value, scope)\n scope.push(ctx)\n return Promise.resolve('')\n }\n} as ITagImplOptions\n","/*\n * Call functions in serial until someone rejected.\n * @param {Array} iterable the array to iterate with.\n * @param {Array} iteratee returns a new promise.\n * The iteratee is invoked with three arguments: (value, index, iterable).\n */\nexport function mapSeries (\n iterable: T1[],\n iteratee: (item: T1, idx: number, iterable: T1[]) => Promise | T2\n): Promise {\n let ret = Promise.resolve(0)\n const result: T2[] = []\n iterable.forEach(function (item, idx) {\n ret = ret\n .then(() => iteratee(item, idx, iterable))\n .then(x => result.push(x))\n })\n return ret.then(() => result)\n}\n","import { mapSeries } from 'src/util/promise'\nimport { isString, isObject, isArray } from 'src/util/underscore'\nimport { evalExp } from 'src/render/syntax'\nimport assert from 'src/util/assert'\nimport { identifier, value, hash } from 'src/parser/lexical'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nconst re = new RegExp(`^(${identifier.source})\\\\s+in\\\\s+` +\n `(${value.source})` +\n `(?:\\\\s+${hash.source})*` +\n `(?:\\\\s+(reversed))?` +\n `(?:\\\\s+${hash.source})*$`)\n\nexport default {\n type: 'block',\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = re.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n this.variable = match[1]\n this.collection = match[2]\n this.reversed = !!match[3]\n\n this.templates = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endfor', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n render: async function (scope: Scope, hash: Hash) {\n let collection = evalExp(this.collection, scope)\n\n if (!isArray(collection)) {\n if (isString(collection) && collection.length > 0) {\n collection = [collection] as string[]\n } else if (isObject(collection)) {\n collection = Object.keys(collection).map((key) => [key, collection[key]]) as Array<[string, any]>\n }\n }\n if (!isArray(collection) || !collection.length) {\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n\n const offset = hash.offset || 0\n const limit = (hash.limit === undefined) ? collection.length : hash.limit\n\n collection = collection.slice(offset, offset + limit)\n if (this.reversed) collection.reverse()\n\n const contexts = collection.map((item: string, i: number) => {\n const ctx = {}\n ctx[this.variable] = item\n ctx['forloop'] = {\n first: i === 0,\n index: i + 1,\n index0: i,\n last: i === collection.length - 1,\n length: collection.length,\n rindex: collection.length - i,\n rindex0: collection.length - i - 1\n }\n return ctx\n })\n\n let html = ''\n let finished = false\n await mapSeries(contexts, async context => {\n if (finished) return\n\n scope.push(context)\n try {\n html += await this.liquid.renderer.renderTemplates(this.templates, scope)\n } catch (e) {\n if (e.name === 'RenderBreakError') {\n html += e.resolvedHTML\n if (e.message === 'break') {\n finished = true\n }\n } else throw e\n }\n scope.pop(context)\n })\n return html\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst re = new RegExp(`(${identifier.source})`)\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = tagToken.args.match(re) as RegExpMatchArray\n assert(match, `${tagToken.args} not valid identifier`)\n\n this.variable = match[1]\n this.templates = []\n\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream.on('tag:endcapture', () => stream.stop())\n .on('template', (tpl) => this.templates.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n },\n render: async function (scope: Scope) {\n const html = await this.liquid.renderer.renderTemplates(this.templates, scope)\n const ctx = new CaptureScope()\n ctx[this.variable] = html\n scope.push(ctx)\n }\n} as ITagImplOptions\n","import { evalExp } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.cond = tagToken.args\n this.cases = []\n this.elseTemplates = []\n\n let p: ITemplate[] = []\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('tag:when', (token: TagToken) => {\n this.cases.push({\n val: token.args,\n templates: p = []\n })\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endcase', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n for (let i = 0; i < this.cases.length; i++) {\n const branch = this.cases[i]\n const val = evalExp(branch.val, scope)\n const cond = evalExp(this.cond, scope)\n if (val === cond) {\n return this.liquid.renderer.renderTemplates(branch.templates, scope)\n }\n }\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream\n .on('token', (token: TagToken) => {\n if (token.name === 'endcomment') stream.stop()\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value, quotedLine } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst staticFileRE = /[^\\s,]+/\nconst withRE = new RegExp(`with\\\\s+(${value.source})`)\n\nexport default {\n parse: function (token: TagToken) {\n let match = staticFileRE.exec(token.args)\n if (match) {\n this.staticValue = match[0]\n }\n\n match = value.exec(token.args)\n if (match) {\n this.value = match[0]\n }\n\n match = withRE.exec(token.args)\n if (match) {\n this.with = match[1]\n }\n },\n render: async function (scope: Scope, hash: Hash) {\n let filepath\n if (scope.opts.dynamicPartials) {\n if (quotedLine.exec(this.value)) {\n const template = this.value.slice(1, -1)\n filepath = await this.liquid.parseAndRender(template, scope.getAll(), scope.opts)\n } else {\n filepath = evalValue(this.value, scope)\n }\n } else {\n filepath = this.staticValue\n }\n assert(filepath, `cannot include with empty filename`)\n\n const originBlocks = scope.blocks\n const originBlockMode = scope.blockMode\n\n scope.blocks = {}\n scope.blockMode = BlockMode.OUTPUT\n if (this.with) {\n hash[filepath] = evalValue(this.with, scope)\n }\n const templates = await this.liquid.getTemplate(filepath, scope.opts)\n scope.push(hash)\n const html = await this.liquid.renderer.renderTemplates(templates, scope)\n scope.pop(hash)\n scope.blocks = originBlocks\n scope.blockMode = originBlockMode\n return html\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope, AssignScope, DecrementScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (token: TagToken) {\n const match = token.args.match(identifier) as RegExpMatchArray\n assert(match, `illegal identifier ${token.args}`)\n this.variable = match[0]\n },\n render: function (scope: Scope) {\n let context = scope.findContextFor(\n this.variable,\n ctx => {\n return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope)\n }\n )\n if (!context) {\n context = new DecrementScope()\n scope.unshift(context)\n }\n if (typeof context[this.variable] !== 'number') {\n context[this.variable] = 0\n }\n return --context[this.variable]\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value as rValue } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst groupRE = new RegExp(`^(?:(${rValue.source})\\\\s*:\\\\s*)?(.*)$`)\nconst candidatesRE = new RegExp(rValue.source, 'g')\n\nexport default {\n parse: function (tagToken: TagToken) {\n let match: RegExpExecArray | null = groupRE.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n\n this.group = match[1] || ''\n const candidates = match[2]\n\n this.candidates = []\n\n while ((match = candidatesRE.exec(candidates))) {\n this.candidates.push(match[0])\n }\n assert(this.candidates.length, `empty candidates: ${tagToken.raw}`)\n },\n\n render: function (scope: Scope) {\n const group = evalValue(this.group, scope)\n const fingerprint = `cycle:${group}:` + this.candidates.join(',')\n const groups = scope.groups\n let idx = groups[fingerprint]\n\n if (idx === undefined) {\n idx = groups[fingerprint] = 0\n }\n\n const candidate = this.candidates[idx]\n idx = (idx + 1) % this.candidates.length\n groups[fingerprint] = idx\n\n return evalValue(candidate, scope)\n }\n}\n","import { evalExp, isTruthy } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.branches = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n cond: tagToken.args,\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n this.branches.push({\n cond: token.args,\n templates: p = []\n })\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endif', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n for (const branch of this.branches) {\n const cond = evalExp(branch.cond, scope)\n if (isTruthy(cond)) {\n return this.liquid.renderer.renderTemplates(branch.templates, scope)\n }\n }\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope, AssignScope, IncrementScope } from 'src/scope/scopes'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (token) {\n const match = token.args.match(identifier)\n assert(match, `illegal identifier ${token.args}`)\n this.variable = match![0]\n },\n render: function (scope) {\n let context = scope.findContextFor(\n this.variable,\n ctx => {\n return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope)\n }\n )\n if (!context) {\n context = new IncrementScope()\n scope.unshift(context)\n }\n if (typeof context[this.variable] !== 'number') {\n context[this.variable] = 0\n }\n const val = context[this.variable]\n context[this.variable]++\n return val\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value as rValue } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst staticFileRE = /\\S+/\n\nexport default {\n parse: function (token: TagToken, remainTokens: Token[]) {\n let match = staticFileRE.exec(token.args)\n if (match) {\n this.staticLayout = match[0]\n }\n\n match = rValue.exec(token.args)\n if (match) {\n this.layout = match[0]\n }\n\n this.tpls = this.liquid.parser.parse(remainTokens)\n },\n render: async function (scope: Scope, hash: Hash) {\n const layout = scope.opts.dynamicPartials\n ? evalValue(this.layout, scope)\n : this.staticLayout\n assert(layout, `cannot apply layout with empty filename`)\n\n // render the remaining tokens immediately\n scope.blockMode = BlockMode.STORE\n const html = await this.liquid.renderer.renderTemplates(this.tpls, scope)\n if (scope.blocks[''] === undefined) {\n scope.blocks[''] = html\n }\n const templates = await this.liquid.getTemplate(layout, scope.opts)\n scope.push(hash)\n scope.blockMode = BlockMode.OUTPUT\n const partial = await this.liquid.renderer.renderTemplates(templates, scope)\n scope.pop(hash)\n return partial\n }\n} as ITagImplOptions\n","import BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (token: TagToken, remainTokens: Token[]) {\n const match = /\\w+/.exec(token.args)\n this.block = match ? match[0] : ''\n this.tpls = [] as ITemplate[]\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('tag:endblock', () => stream.stop())\n .on('template', (tpl: ITemplate) => this.tpls.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${token.raw} not closed`)\n })\n stream.start()\n },\n render: async function (scope: Scope) {\n const childDefined = scope.blocks[this.block]\n const html = childDefined !== undefined\n ? childDefined\n : await this.liquid.renderer.renderTemplates(this.tpls, scope)\n\n if (scope.blockMode === BlockMode.STORE) {\n scope.blocks[this.block] = html\n return ''\n }\n return html\n }\n} as ITagImplOptions\n","import TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.tokens = []\n\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream\n .on('token', (token: TagToken) => {\n if (token.name === 'endraw') stream.stop()\n else this.tokens.push(token)\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n },\n render: function () {\n return this.tokens.map((token: Token) => token.raw).join('')\n }\n}\n","import { mapSeries } from 'src/util/promise'\nimport assert from 'src/util/assert'\nimport { evalExp } from 'src/render/syntax'\nimport { identifier, value, hash } from 'src/parser/lexical'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nconst re = new RegExp(`^(${identifier.source})\\\\s+in\\\\s+` +\n `(${value.source})` +\n `(?:\\\\s+${hash.source})*$`)\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = re.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n\n this.variable = match[1]\n this.collection = match[2]\n this.templates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:endtablerow', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: async function (scope: Scope, hash: Hash) {\n let collection = evalExp(this.collection, scope) || []\n const offset = hash.offset || 0\n const limit = (hash.limit === undefined) ? collection.length : hash.limit\n\n collection = collection.slice(offset, offset + limit)\n const cols = hash.cols || collection.length\n const contexts = collection.map((item: any) => {\n const ctx = {}\n ctx[this.variable] = item\n return ctx\n })\n\n let row: number = 0\n let html = ''\n await mapSeries(contexts, async (context, idx) => {\n row = Math.floor(idx / cols) + 1\n const col = (idx % cols) + 1\n if (col === 1) {\n if (row !== 1) {\n html += ''\n }\n html += ``\n }\n\n html += ``\n scope.push(context)\n html += await this.liquid.renderer.renderTemplates(this.templates, scope)\n html += ''\n scope.pop(context)\n return html\n })\n if (row > 0) {\n html += ''\n }\n return html\n }\n} as ITagImplOptions\n","import { evalExp, isFalsy } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.templates = []\n this.elseTemplates = []\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => {\n p = this.templates\n this.cond = tagToken.args\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endunless', () => stream.stop())\n .on('template', tpl => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n const cond = evalExp(this.cond, scope)\n return isFalsy(cond)\n ? this.liquid.renderer.renderTemplates(this.templates, scope)\n : this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import { RenderBreakError } from 'src/util/error'\n\nexport default {\n render: async function () {\n throw new RenderBreakError('break')\n }\n}\n","import { RenderBreakError } from 'src/util/error'\n\nexport default {\n render: async function () {\n throw new RenderBreakError('continue')\n }\n}\n","import assign from './assign'\nimport For from './for'\nimport capture from './capture'\nimport Case from './case'\nimport comment from './comment'\nimport include from './include'\nimport decrement from './decrement'\nimport cycle from './cycle'\nimport If from './if'\nimport increment from './increment'\nimport layout from './layout'\nimport block from './block'\nimport raw from './raw'\nimport tablerow from './tablerow'\nimport unless from './unless'\nimport Break from './break'\nimport Continue from './continue'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst tags: { [key: string]: ITagImplOptions } = {\n assign, 'for': For, capture, 'case': Case, comment, include, decrement, increment, cycle, 'if': If, layout, block, raw, tablerow, unless, 'break': Break, 'continue': Continue\n}\n\nexport default tags\n","const escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\nconst unescapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n}\n\nfunction escape (str: string) {\n return String(str).replace(/&|<|>|\"|'/g, m => escapeMap[m])\n}\n\nfunction unescape (str: string) {\n return String(str).replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m])\n}\n\nexport default {\n 'escape': escape,\n 'escape_once': (str: string) => escape(unescape(str)),\n 'newline_to_br': (v: string) => v.replace(/\\n/g, '
'),\n 'strip_html': (v: string) => v.replace(/|||<.*?>/g, '')\n}\n","import { FilterImpl } from 'src/template/filter/filter-impl'\n\nexport default {\n 'append': (v: string, arg: string) => v + arg,\n 'prepend': (v: string, arg: string) => arg + v,\n 'capitalize': (str: string) => String(str).charAt(0).toUpperCase() + str.slice(1),\n 'lstrip': (v: string) => String(v).replace(/^\\s+/, ''),\n 'downcase': (v: string) => v.toLowerCase(),\n 'upcase': (str: string) => String(str).toUpperCase(),\n 'remove': (v: string, arg: string) => v.split(arg).join(''),\n 'remove_first': (v: string, l: string) => v.replace(l, ''),\n 'replace': (v: string, pattern: string, replacement: string) =>\n String(v).split(pattern).join(replacement),\n 'replace_first': (v: string, arg1: string, arg2: string) => String(v).replace(arg1, arg2),\n 'rstrip': (str: string) => String(str).replace(/\\s+$/, ''),\n 'split': (v: string, arg: string) => String(v).split(arg),\n 'strip': (v: string) => String(v).trim(),\n 'strip_newlines': (v: string) => String(v).replace(/\\n/g, ''),\n 'truncate': (v: string, l: number = 50, o: string = '...') => {\n v = String(v)\n if (v.length <= l) return v\n return v.substr(0, l - o.length) + o\n },\n 'truncatewords': (v: string, l: number = 15, o: string = '...') => {\n const arr = v.split(/\\s+/)\n let ret = arr.slice(0, l).join(' ')\n if (arr.length >= l) ret += o\n return ret\n }\n} as {[key: string]: FilterImpl}\n","export default {\n 'abs': (v: number) => Math.abs(v),\n 'ceil': (v: number) => Math.ceil(v),\n 'divided_by': (v: number, arg: number) => v / arg,\n 'floor': (v: number) => Math.floor(v),\n 'minus': bindFixed((v: number, arg: number) => v - arg),\n 'modulo': bindFixed((v: number, arg: number) => v % arg),\n 'round': (v: number, arg: number = 0) => {\n const amp = Math.pow(10, arg)\n return Math.round(v * amp) / amp\n },\n 'plus': bindFixed((v: number, arg: number) => Number(v) + Number(arg)),\n 'times': (v: number, arg: number) => v * arg\n}\n\nfunction getFixed (v: number) {\n const p = String(v).split('.')\n return (p.length > 1) ? p[1].length : 0\n}\n\nfunction bindFixed (cb: (v: number, arg: number) => number) {\n return (l: number, r: number) => {\n const f = Math.max(getFixed(l), getFixed(r))\n return cb(l, r).toFixed(f)\n }\n}\n","export default {\n 'url_decode': (x: string) => x.split('+').map(decodeURIComponent).join(' '),\n 'url_encode': (x: string) => x.split(' ').map(encodeURIComponent).join('+')\n}\n","import { last } from 'src/util/underscore'\n\nexport default {\n 'join': (v: any[], arg: string) => v.join(arg === undefined ? ' ' : arg),\n 'last': (v: T[]): T => last(v),\n 'first': (v: T[]): T => v[0],\n 'map': (arr: {[key: string]: T1}[], arg: string): T1[] => arr.map(v => v[arg]),\n 'reverse': (v: any[]) => v.reverse(),\n 'sort': (v: T[], arg: (lhs: T, rhs: T) => number) => v.sort(arg),\n 'size': (v: string | any[]) => v.length,\n 'concat': (v: T1[], arg: T2[] | T2): Array => Array.prototype.concat.call(v, arg),\n 'slice': (v: T[], begin: number, length: number): T[] => {\n if (length === undefined) length = 1\n return v.slice(begin, begin + length)\n },\n 'uniq': function (arr: T[]): T[] {\n const u = {}\n return (arr || []).filter(val => {\n if (u.hasOwnProperty(String(val))) return false\n u[String(val)] = true\n return true\n })\n }\n}\n","import { padStart } from './underscore'\n\nconst monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\nconst dayNames = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n]\nconst monthNamesShort = monthNames.map(abbr)\nconst dayNamesShort = dayNames.map(abbr)\nconst suffixes = {\n 1: 'st',\n 2: 'nd',\n 3: 'rd',\n 'default': 'th'\n}\n\nfunction abbr (str: string) {\n return str.slice(0, 3)\n}\n\n// prototype extensions\nconst _date = {\n daysInMonth: function (d: Date) {\n const feb = _date.isLeapYear(d) ? 29 : 28\n return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n },\n\n getDayOfYear: function (d: Date) {\n let num = 0\n for (let i = 0; i < d.getMonth(); ++i) {\n num += _date.daysInMonth(d)[i]\n }\n return num + d.getDate()\n },\n\n getWeekOfYear: function (d: Date, startDay: number) {\n // Skip to startDay of this week\n const now = this.getDayOfYear(d) + (startDay - d.getDay())\n // Find the first startDay of the year\n const jan1 = new Date(d.getFullYear(), 0, 1)\n const then = (7 - jan1.getDay() + startDay)\n return padStart(String(Math.floor((now - then) / 7) + 1), 2, '0')\n },\n\n isLeapYear: function (d: Date) {\n const year = d.getFullYear()\n return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)))\n },\n\n getSuffix: function (d: Date) {\n const str = d.getDate().toString()\n const index = parseInt(str.slice(-1))\n return suffixes[index] || suffixes['default']\n },\n\n century: function (d: Date) {\n return parseInt(d.getFullYear().toString().substring(0, 2), 10)\n }\n}\n\nconst formatCodes = {\n a: function (d: Date) {\n return dayNamesShort[d.getDay()]\n },\n A: function (d: Date) {\n return dayNames[d.getDay()]\n },\n b: function (d: Date) {\n return monthNamesShort[d.getMonth()]\n },\n B: function (d: Date) {\n return monthNames[d.getMonth()]\n },\n c: function (d: Date) {\n return d.toLocaleString()\n },\n C: function (d: Date) {\n return _date.century(d)\n },\n d: function (d: Date) {\n return padStart(d.getDate(), 2, '0')\n },\n e: function (d: Date) {\n return padStart(d.getDate(), 2)\n },\n H: function (d: Date) {\n return padStart(d.getHours(), 2, '0')\n },\n I: function (d: Date) {\n return padStart(String(d.getHours() % 12 || 12), 2, '0')\n },\n j: function (d: Date) {\n return padStart(_date.getDayOfYear(d), 3, '0')\n },\n k: function (d: Date) {\n return padStart(d.getHours(), 2)\n },\n l: function (d: Date) {\n return padStart(String(d.getHours() % 12 || 12), 2)\n },\n L: function (d: Date) {\n return padStart(d.getMilliseconds(), 3, '0')\n },\n m: function (d: Date) {\n return padStart(d.getMonth() + 1, 2, '0')\n },\n M: function (d: Date) {\n return padStart(d.getMinutes(), 2, '0')\n },\n p: function (d: Date) {\n return (d.getHours() < 12 ? 'AM' : 'PM')\n },\n P: function (d: Date) {\n return (d.getHours() < 12 ? 'am' : 'pm')\n },\n q: function (d: Date) {\n return _date.getSuffix(d)\n },\n s: function (d: Date) {\n return Math.round(d.valueOf() / 1000)\n },\n S: function (d: Date) {\n return padStart(d.getSeconds(), 2, '0')\n },\n u: function (d: Date) {\n return d.getDay() || 7\n },\n U: function (d: Date) {\n return _date.getWeekOfYear(d, 0)\n },\n w: function (d: Date) {\n return d.getDay()\n },\n W: function (d: Date) {\n return _date.getWeekOfYear(d, 1)\n },\n x: function (d: Date) {\n return d.toLocaleDateString()\n },\n X: function (d: Date) {\n return d.toLocaleTimeString()\n },\n y: function (d: Date) {\n return d.getFullYear().toString().substring(2, 4)\n },\n Y: function (d: Date) {\n return d.getFullYear()\n },\n z: function (d: Date) {\n const tz = d.getTimezoneOffset() / 60 * 100\n return (tz > 0 ? '-' : '+') + padStart(String(Math.abs(tz)), 4, '0')\n },\n '%': function () {\n return '%'\n }\n};\n(formatCodes as any).h = formatCodes.b;\n(formatCodes as any).N = formatCodes.L\n\nexport default function (d: Date, format: string) {\n let output = ''\n let remaining = format\n\n while (true) {\n const r = /%./g\n const results = r.exec(remaining)\n\n // No more format codes. Add the remaining text and return\n if (!results) {\n return output + remaining\n }\n\n // Add the preceding text\n output += remaining.slice(0, r.lastIndex - 2)\n remaining = remaining.slice(r.lastIndex)\n\n // Add the format code\n const ch = results[0].charAt(1)\n const func = formatCodes[ch]\n output += func ? func(d) : '%' + ch\n }\n}\n","import strftime from 'src/util/strftime'\nimport { isString } from 'src/util/underscore'\n\nexport default {\n 'date': (v: string | Date, arg: string) => {\n let date = v\n if (v === 'now') {\n date = new Date()\n } else if (isString(v)) {\n date = new Date(v)\n }\n return isValidDate(date) ? strftime(date, arg) : v\n }\n}\n\nfunction isValidDate (date: any): date is Date {\n return date instanceof Date && !isNaN(date.getTime())\n}\n","import { isTruthy } from 'src/render/syntax'\n\nexport default {\n 'default': (v: T1, arg: T2): T1 | T2 => isTruthy(v) ? v : arg\n}\n","import html from './html'\nimport str from './string'\nimport math from './math'\nimport url from './url'\nimport array from './array'\nimport date from './date'\nimport obj from './object'\n\nexport default { ...html, ...str, ...math, ...url, ...date, ...obj, ...array }\n","import Scope from './scope/scope'\nimport * as Types from './types'\nimport fs from 'src/fs'\nimport * as _ from './util/underscore'\nimport ITemplate from './template/itemplate'\nimport Tokenizer from './parser/tokenizer'\nimport Render from './render/render'\nimport Tag from './template/tag/tag'\nimport Filter from './template/filter/filter'\nimport Parser from './parser/parser'\nimport ITagImplOptions from './template/tag/itag-impl-options'\nimport Value from './template/value'\nimport { isTruthy, isFalsy, evalExp, evalValue } from './render/syntax'\nimport builtinTags from './builtin/tags'\nimport builtinFilters from './builtin/filters'\nimport { LiquidOptions, NormalizedFullOptions, applyDefault, normalize } from './liquid-options'\nimport { FilterImpl } from './template/filter/filter-impl'\n\nexport default class Liquid {\n public options: NormalizedFullOptions\n public renderer: Render\n public parser: Parser\n private cache: object = {}\n private tokenizer: Tokenizer\n\n constructor (opts: LiquidOptions = {}) {\n this.options = applyDefault(normalize(opts))\n this.parser = new Parser(this)\n this.renderer = new Render()\n this.tokenizer = new Tokenizer(this.options)\n\n _.forOwn(builtinTags, (conf, name) => this.registerTag(name, conf))\n _.forOwn(builtinFilters, (handler, name) => this.registerFilter(name, handler))\n }\n parse (html: string, filepath?: string) {\n const tokens = this.tokenizer.tokenize(html, filepath)\n return this.parser.parse(tokens)\n }\n render (tpl: Array, ctx?: object, opts?: LiquidOptions) {\n const options = { ...this.options, ...normalize(opts) }\n const scope = new Scope(ctx, options)\n return this.renderer.renderTemplates(tpl, scope)\n }\n async parseAndRender (html: string, ctx?: object, opts?: LiquidOptions) {\n const tpl = await this.parse(html)\n return this.render(tpl, ctx, opts)\n }\n async getTemplate (file: string, opts?: LiquidOptions) {\n const options = normalize(opts)\n const roots = options.root ? [...options.root, ...this.options.root] : this.options.root\n const paths = roots.map(root => fs.resolve(root, file, this.options.extname))\n\n for (const filepath of paths) {\n if (!(await fs.exists(filepath))) continue\n\n if (this.options.cache && this.cache[filepath]) return this.cache[filepath]\n const value = this.parse(await fs.readFile(filepath), filepath)\n if (this.options.cache) this.cache[filepath] = value\n return value\n }\n\n const err = new Error('ENOENT') as any\n err.message = `ENOENT: Failed to lookup \"${file}\" in \"${roots}\"`\n err.code = 'ENOENT'\n throw err\n }\n async renderFile (file: string, ctx?: object, opts?: LiquidOptions) {\n const options = normalize(opts)\n const templates = await this.getTemplate(file, options)\n return this.render(templates, ctx, opts)\n }\n evalValue (str: string, scope: Scope) {\n return new Value(str, this.options.strict_filters).value(scope)\n }\n registerFilter (name: string, filter: FilterImpl) {\n return Filter.register(name, filter)\n }\n registerTag (name: string, tag: ITagImplOptions) {\n return Tag.register(name, tag)\n }\n plugin (plugin: (this: Liquid, L: typeof Liquid) => void) {\n return plugin.call(this, Liquid)\n }\n express () {\n const self = this\n return function (this: any, filePath: string, ctx: object, cb: (err: Error | null, html?: string) => void) {\n const opts = { root: this.root }\n self.renderFile(filePath, ctx, opts).then(html => cb(null, html), cb)\n }\n }\n static default = Liquid\n static isTruthy = isTruthy\n static isFalsy = isFalsy\n static evalExp = evalExp\n static evalValue = evalValue\n static Types = Types\n}\n"],"names":["tslib_1.__extends","_\r\n .range","_.padStart","_.isArray","_.isString","BlockMode","path","_.last","_.isObject","_.isNil","_.isFunction","_.promisify","stat","readFile","fs","extname","resolve","range","value","lexical.tagLine","lexical.operators","lexical.quoteBalanced","lexical.rangeLine","ParseState","Value","HTML","re","hash","rValue","staticFileRE","_.forOwn","builtinTags"],"mappings":"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"} \ No newline at end of file diff --git a/dist/liquid.d.ts b/dist/liquid.d.ts deleted file mode 100644 index 87e38ea56..000000000 --- a/dist/liquid.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import Scope from './scope/scope'; -import * as Types from './types'; -import ITemplate from './template/itemplate'; -import Render from './render/render'; -import Parser from './parser/parser'; -import ITagImplOptions from './template/tag/itag-impl-options'; -import { isTruthy, isFalsy, evalExp, evalValue } from './render/syntax'; -import { LiquidOptions, NormalizedFullOptions } from './liquid-options'; -import { FilterImpl } from './template/filter/filter-impl'; -export default class Liquid { - options: NormalizedFullOptions; - renderer: Render; - parser: Parser; - private cache; - private tokenizer; - constructor(opts?: LiquidOptions); - parse(html: string, filepath?: string): ITemplate[]; - render(tpl: Array, ctx?: object, opts?: LiquidOptions): Promise; - parseAndRender(html: string, ctx?: object, opts?: LiquidOptions): Promise; - getTemplate(file: string, opts?: LiquidOptions): Promise; - renderFile(file: string, ctx?: object, opts?: LiquidOptions): Promise; - evalValue(str: string, scope: Scope): any; - registerFilter(name: string, filter: FilterImpl): void; - registerTag(name: string, tag: ITagImplOptions): void; - plugin(plugin: (this: Liquid, L: typeof Liquid) => void): void; - express(): (this: any, filePath: string, ctx: object, cb: (err: Error | null, html?: string | undefined) => void) => void; - static default: typeof Liquid; - static isTruthy: typeof isTruthy; - static isFalsy: typeof isFalsy; - static evalExp: typeof evalExp; - static evalValue: typeof evalValue; - static Types: typeof Types; -} diff --git a/dist/liquid.js b/dist/liquid.js deleted file mode 100644 index 9a76694e6..000000000 --- a/dist/liquid.js +++ /dev/null @@ -1,2424 +0,0 @@ -/* - * liquidjs@7.3.0, https://github.com/harttle/liquidjs - * (c) 2016-2019 harttle - * Released under the MIT License. - */ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = global || self, global.Liquid = factory()); -}(this, function () { 'use strict'; - - /*! ***************************************************************************** - Copyright (c) Microsoft Corporation. All rights reserved. - Licensed under the Apache License, Version 2.0 (the "License"); you may not use - this file except in compliance with the License. You may obtain a copy of the - License at http://www.apache.org/licenses/LICENSE-2.0 - - THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED - WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, - MERCHANTABLITY OR NON-INFRINGEMENT. - - See the Apache Version 2.0 License for specific language governing permissions - and limitations under the License. - ***************************************************************************** */ - /* global Reflect, Promise */ - - var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; - return extendStatics(d, b); - }; - - function __extends(d, b) { - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); - } - - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); - }; - - function __awaiter(thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); - } - - function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - 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; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } - } - - var toStr = Object.prototype.toString; - var arrToStr = Array.prototype.toString; - /* - * Checks if value is classified as a String primitive or object. - * @param {any} value The value to check. - * @return {Boolean} Returns true if value is a string, else false. - */ - function isString(value) { - return toStr.call(value) === '[object String]'; - } - function isFunction(value) { - return typeof value === 'function'; - } - function stringify(value) { - if (isNil(value)) - return ''; - if (isFunction(value.to_liquid)) - return stringify(value.to_liquid()); - if (isFunction(value.toLiquid)) - return stringify(value.toLiquid()); - if (isFunction(value.to_s)) - return value.to_s(); - if ([toStr, arrToStr].indexOf(value.toString) > -1) - return defaultToString(value); - if (isFunction(value.toString)) - return value.toString(); - return toStr.call(value); - } - function defaultToString(value) { - var cache = []; - return JSON.stringify(value, function (key, value) { - if (isObject(value)) { - if (cache.indexOf(value) !== -1) { - return; - } - cache.push(value); - } - return value; - }); - } - function create(proto) { - return Object.create(proto); - } - function isNil(value) { - return value === null || value === undefined; - } - function isArray(value) { - // be compatible with IE 8 - return toStr.call(value) === '[object Array]'; - } - /* - * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property. - * The iteratee is invoked with three arguments: (value, key, object). - * Iteratee functions may exit iteration early by explicitly returning false. - * @param {Object} object The object to iterate over. - * @param {Function} iteratee The function invoked per iteration. - * @return {Object} Returns object. - */ - function forOwn(object, iteratee) { - object = object || {}; - for (var k in object) { - if (object.hasOwnProperty(k)) { - if (iteratee(object[k], k, object) === false) - break; - } - } - return object; - } - function last(arr) { - return arr[arr.length - 1]; - } - /* - * Checks if value is the language type of Object. - * (e.g. arrays, functions, objects, regexes, new Number(0), and new String('')) - * @param {any} value The value to check. - * @return {Boolean} Returns true if value is an object, else false. - */ - function isObject(value) { - var type = typeof value; - return value !== null && (type === 'object' || type === 'function'); - } - /* - * A function to create flexibly-numbered lists of integers, - * handy for each and map loops. start, if omitted, defaults to 0; step defaults to 1. - * Returns a list of integers from start (inclusive) to stop (exclusive), - * incremented (or decremented) by step, exclusive. - * Note that ranges that stop before they start are considered to be zero-length instead of - * negative — if you'd like a negative range, use a negative step. - */ - function range(start, stop, step) { - if (stop === undefined) { - stop = start; - start = 0; - } - step = step || 1; - var arr = []; - for (var i = start; i < stop; i += step) { - arr.push(i); - } - return arr; - } - function padStart(str, length, ch) { - if (ch === void 0) { ch = ' '; } - str = String(str); - var n = length - str.length; - while (n-- > 0) - str = ch + str; - return str; - } - - var LiquidError = /** @class */ (function (_super) { - __extends(LiquidError, _super); - function LiquidError(err, token) { - var _this = _super.call(this, err.message) || this; - _this.originalError = err; - _this.token = token; - return _this; - } - LiquidError.prototype.update = function () { - var err = this.originalError; - var context = mkContext(this.token); - this.message = mkMessage(err.message, this.token); - this.stack = this.message + '\n' + context + - '\n' + this.stack + '\nFrom ' + err.stack; - }; - return LiquidError; - }(Error)); - var TokenizationError = /** @class */ (function (_super) { - __extends(TokenizationError, _super); - function TokenizationError(message, token) { - var _this = _super.call(this, new Error(message), token) || this; - _this.name = 'TokenizationError'; - _super.prototype.update.call(_this); - return _this; - } - return TokenizationError; - }(LiquidError)); - var ParseError = /** @class */ (function (_super) { - __extends(ParseError, _super); - function ParseError(err, token) { - var _this = _super.call(this, err, token) || this; - _this.name = 'ParseError'; - _this.message = err.message; - _super.prototype.update.call(_this); - return _this; - } - return ParseError; - }(LiquidError)); - var RenderError = /** @class */ (function (_super) { - __extends(RenderError, _super); - function RenderError(err, tpl) { - var _this = _super.call(this, err, tpl.token) || this; - _this.name = 'RenderError'; - _this.message = err.message; - _super.prototype.update.call(_this); - return _this; - } - return RenderError; - }(LiquidError)); - var RenderBreakError = /** @class */ (function (_super) { - __extends(RenderBreakError, _super); - function RenderBreakError(message) { - var _this = _super.call(this, message) || this; - _this.resolvedHTML = ''; - _this.name = 'RenderBreakError'; - _this.message = message + ''; - return _this; - } - return RenderBreakError; - }(Error)); - var AssertionError = /** @class */ (function (_super) { - __extends(AssertionError, _super); - function AssertionError(message) { - var _this = _super.call(this, message) || this; - _this.name = 'AssertionError'; - _this.message = message + ''; - return _this; - } - return AssertionError; - }(Error)); - function mkContext(token) { - var lines = token.input.split('\n'); - var begin = Math.max(token.line - 2, 1); - var end = Math.min(token.line + 3, lines.length); - var context = range(begin, end + 1) - .map(function (lineNumber) { - var indicator = (lineNumber === token.line) ? '>> ' : ' '; - var num = padStart(String(lineNumber), String(end).length); - var text = lines[lineNumber - 1]; - return "" + indicator + num + "| " + text; - }) - .join('\n'); - return context; - } - function mkMessage(msg, token) { - if (token.file) - msg += ", file:" + token.file; - msg += ", line:" + token.line + ", col:" + token.col; - return msg; - } - - function assert (predicate, message) { - if (!predicate) { - message = message || "expect " + predicate + " to be true"; - throw new AssertionError(message); - } - } - - /* eslint-disable camelcase */ - var defaultOptions = { - root: ['.'], - cache: false, - extname: '', - dynamicPartials: true, - trim_tag_right: false, - trim_tag_left: false, - trim_output_right: false, - trim_output_left: false, - greedy: true, - tag_delimiter_left: '{%', - tag_delimiter_right: '%}', - output_delimiter_left: '{{', - output_delimiter_right: '}}', - strict_filters: false, - strict_variables: false - }; - function normalize(options) { - options = options || {}; - if (options.hasOwnProperty('root')) { - options.root = normalizeStringArray(options.root); - } - return options; - } - function applyDefault(options) { - return __assign({}, defaultOptions, options); - } - function normalizeStringArray(value) { - if (isArray(value)) - return value; - if (isString(value)) - return [value]; - return []; - } - - var BlockMode; - (function (BlockMode) { - /* store rendered html into blocks */ - BlockMode[BlockMode["OUTPUT"] = 0] = "OUTPUT"; - /* output rendered html directly */ - BlockMode[BlockMode["STORE"] = 1] = "STORE"; - })(BlockMode || (BlockMode = {})); - var BlockMode$1 = BlockMode; - - var Scope = /** @class */ (function () { - function Scope(ctx, opts) { - if (ctx === void 0) { ctx = {}; } - this.blocks = {}; - this.groups = {}; - this.blockMode = BlockMode$1.OUTPUT; - this.opts = applyDefault(opts); - this.contexts = [ctx || {}]; - } - Scope.prototype.getAll = function () { - return this.contexts.reduce(function (ctx, val) { return __assign(ctx, val); }, {}); - }; - Scope.prototype.get = function (path) { - var _this = this; - var paths = this.propertyAccessSeq(path); - var scope = this.findContextFor(paths[0]) || last(this.contexts); - return paths.reduce(function (value, key) { return _this.readProperty(value, key); }, scope); - }; - Scope.prototype.set = function (path, v) { - var paths = this.propertyAccessSeq(path); - var scope = this.findContextFor(paths[0]) || last(this.contexts); - paths.some(function (key, i) { - if (!isObject(scope)) { - return true; - } - if (i === paths.length - 1) { - scope[key] = v; - return true; - } - if (undefined === scope[key]) { - scope[key] = {}; - } - scope = scope[key]; - return false; - }); - }; - Scope.prototype.unshift = function (ctx) { - return this.contexts.unshift(ctx); - }; - Scope.prototype.push = function (ctx) { - return this.contexts.push(ctx); - }; - Scope.prototype.pop = function (ctx) { - if (!arguments.length) { - return this.contexts.pop(); - } - var i = this.contexts.findIndex(function (scope) { return scope === ctx; }); - if (i === -1) { - throw new TypeError('scope not found, cannot pop'); - } - return this.contexts.splice(i, 1)[0]; - }; - Scope.prototype.findContextFor = function (key, filter) { - if (filter === void 0) { filter = function () { return true; }; } - for (var i = this.contexts.length - 1; i >= 0; i--) { - var candidate = this.contexts[i]; - if (!filter(candidate)) - continue; - if (key in candidate) { - return candidate; - } - } - return null; - }; - Scope.prototype.readProperty = function (obj, key) { - var val; - if (isNil(obj)) { - val = obj; - } - else { - obj = toLiquid(obj); - val = key === 'size' ? readSize(obj) : obj[key]; - if (isFunction(obj.liquid_method_missing)) { - val = obj.liquid_method_missing(key); - } - } - if (isNil(val) && this.opts.strict_variables) { - throw new TypeError("undefined variable: " + key); - } - return val; - }; - /* - * Parse property access sequence from access string - * @example - * accessSeq("foo.bar") // ['foo', 'bar'] - * accessSeq("foo['bar']") // ['foo', 'bar'] - * accessSeq("foo['b]r']") // ['foo', 'b]r'] - * accessSeq("foo[bar.coo]") // ['foo', 'bar'], for bar.coo == 'bar' - */ - Scope.prototype.propertyAccessSeq = function (str) { - str = String(str); - var seq = []; - var name = ''; - var j; - var i = 0; - while (i < str.length) { - switch (str[i]) { - case '[': - push(); - var delemiter = str[i + 1]; - if (/['"]/.test(delemiter)) { // foo["bar"] - j = str.indexOf(delemiter, i + 2); - assert(j !== -1, "unbalanced " + delemiter + ": " + str); - name = str.slice(i + 2, j); - push(); - i = j + 2; - } - else { // foo[bar.coo] - j = matchRightBracket(str, i + 1); - assert(j !== -1, "unbalanced []: " + str); - name = str.slice(i + 1, j); - if (!/^[+-]?\d+$/.test(name)) { // foo[bar] vs. foo[1] - name = String(this.get(name)); - } - push(); - i = j + 1; - } - break; - case '.': // foo.bar, foo[0].bar - push(); - i++; - break; - default: // foo.bar - name += str[i]; - i++; - } - } - push(); - if (!seq.length) { - throw new TypeError("invalid path:\"" + str + "\""); - } - return seq; - function push() { - if (name.length) - seq.push(name); - name = ''; - } - }; - return Scope; - }()); - function toLiquid(obj) { - if (isFunction(obj.to_liquid)) { - return obj.to_liquid(); - } - if (isFunction(obj.toLiquid)) { - return obj.toLiquid(); - } - return obj; - } - function readSize(obj) { - if (!isNil(obj.size)) - return obj.size; - if (isArray(obj) || isString(obj)) - return obj.length; - return obj.size; - } - function matchRightBracket(str, begin) { - var stack = 1; // count of '[' - count of ']' - for (var i = begin; i < str.length; i++) { - if (str[i] === '[') { - stack++; - } - if (str[i] === ']') { - stack--; - if (stack === 0) { - return i; - } - } - } - return -1; - } - - var CaptureScope = /** @class */ (function () { - function CaptureScope() { - } - return CaptureScope; - }()); - var AssignScope = /** @class */ (function () { - function AssignScope() { - } - return AssignScope; - }()); - var IncrementScope = /** @class */ (function () { - function IncrementScope() { - } - return IncrementScope; - }()); - var DecrementScope = /** @class */ (function () { - function DecrementScope() { - } - return DecrementScope; - }()); - - - - var Types = /*#__PURE__*/Object.freeze({ - AssignScope: AssignScope, - CaptureScope: CaptureScope, - IncrementScope: IncrementScope, - DecrementScope: DecrementScope, - ParseError: ParseError, - TokenizationError: TokenizationError, - RenderBreakError: RenderBreakError, - AssertionError: AssertionError - }); - - function domResolve(root, path) { - var base = document.createElement('base'); - base.href = root; - var head = document.getElementsByTagName('head')[0]; - head.insertBefore(base, head.firstChild); - var a = document.createElement('a'); - a.href = path; - var resolved = a.href; - head.removeChild(base); - return resolved; - } - function resolve(root, filepath, ext) { - if (root.length && last(root) !== '/') - root += '/'; - var url = domResolve(root, filepath); - return url.replace(/^(\w+:\/\/[^/]+)(\/[^?]+)/, function (str, origin, path) { - var last$$1 = path.split('/').pop(); - if (/\.\w+$/.test(last$$1)) - return str; - return origin + path + ext; - }); - } - function readFile(url) { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, new Promise(function (resolve, reject) { - var xhr = new XMLHttpRequest(); - xhr.onload = function () { - if (xhr.status >= 200 && xhr.status < 300) { - resolve(xhr.responseText); - } - else { - reject(new Error(xhr.statusText)); - } - }; - xhr.onerror = function () { - reject(new Error('An error occurred whilst receiving the response.')); - }; - xhr.open('GET', url); - xhr.send(); - })]; - }); - }); - } - function exists() { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, true]; - }); - }); - } - var fs = { readFile: readFile, resolve: resolve, exists: exists }; - - function whiteSpaceCtrl(tokens, options) { - options = __assign({ greedy: true }, options); - var inRaw = false; - tokens.forEach(function (token, i) { - if (shouldTrimLeft(token, inRaw, options)) { - trimLeft(tokens[i - 1], options.greedy); - } - if (token.type === 'tag' && token.name === 'raw') - inRaw = true; - if (token.type === 'tag' && token.name === 'endraw') - inRaw = false; - if (shouldTrimRight(token, inRaw, options)) { - trimRight(tokens[i + 1], options.greedy); - } - }); - } - function shouldTrimLeft(token, inRaw, options) { - if (inRaw) - return false; - if (token.type === 'tag') - return token.trimLeft || options.trim_tag_left; - if (token.type === 'output') - return token.trimLeft || options.trim_output_left; - } - function shouldTrimRight(token, inRaw, options) { - if (inRaw) - return false; - if (token.type === 'tag') - return token.trimRight || options.trim_tag_right; - if (token.type === 'output') - return token.trimRight || options.trim_output_right; - } - function trimLeft(token, greedy) { - if (!token || token.type !== 'html') - return; - var rLeft = greedy ? /\s+$/g : /[\t\r ]*$/g; - token.value = token.value.replace(rLeft, ''); - } - function trimRight(token, greedy) { - if (!token || token.type !== 'html') - return; - var rRight = greedy ? /^\s+/g : /^[\t\r ]*\n?/g; - token.value = token.value.replace(rRight, ''); - } - - var Token = /** @class */ (function () { - function Token(raw, input, line, col, file) { - this.type = 'notset'; - this.col = col; - this.line = line; - this.raw = raw; - this.value = raw; - this.input = input; - this.file = file; - } - return Token; - }()); - - var HTMLToken = /** @class */ (function (_super) { - __extends(HTMLToken, _super); - function HTMLToken(str, input, line, col, file) { - var _this = _super.call(this, str, input, line, col, file) || this; - _this.type = 'html'; - _this.value = str; - return _this; - } - return HTMLToken; - }(Token)); - - var DelimitedToken = /** @class */ (function (_super) { - __extends(DelimitedToken, _super); - function DelimitedToken(raw, value, input, line, pos, file) { - var _this = _super.call(this, raw, input, line, pos, file) || this; - _this.trimLeft = value[0] === '-'; - _this.trimRight = last(value) === '-'; - _this.value = value - .slice(_this.trimLeft ? 1 : 0, _this.trimRight ? -1 : value.length) - .trim(); - return _this; - } - return DelimitedToken; - }(Token)); - - // quote related - var singleQuoted = /'[^']*'/; - var doubleQuoted = /"[^"]*"/; - var quoted = new RegExp(singleQuoted.source + "|" + doubleQuoted.source); - var quoteBalanced = new RegExp("(?:" + quoted.source + "|[^'\"])*"); - // basic types - var number = /[+-]?(?:\d+\.?\d*|\.?\d+)/; - var bool = /true|false/; - // property access - var identifier = /[\w-]+[?]?/; - var subscript = new RegExp("\\[(?:" + quoted.source + "|[\\w-\\.]+)\\]"); - var literal = new RegExp("(?:" + quoted.source + "|" + bool.source + "|" + number.source + ")"); - var variable = new RegExp(identifier.source + "(?:\\." + identifier.source + "|" + subscript.source + ")*"); - // range related - var rangeLimit = new RegExp("(?:" + variable.source + "|" + number.source + ")"); - var range$1 = new RegExp("\\(" + rangeLimit.source + "\\.\\." + rangeLimit.source + "\\)"); - var rangeCapture = new RegExp("\\((" + rangeLimit.source + ")\\.\\.(" + rangeLimit.source + ")\\)"); - var value = new RegExp("(?:" + variable.source + "|" + literal.source + "|" + range$1.source + ")"); - // hash related - var hash = new RegExp("(?:" + identifier.source + ")\\s*:\\s*(?:" + value.source + ")"); - var hashCapture = new RegExp("(" + identifier.source + ")\\s*:\\s*(" + value.source + ")", 'g'); - // full match - var tagLine = new RegExp("^\\s*(" + identifier.source + ")\\s*([\\s\\S]*?)\\s*$"); - var quotedLine = new RegExp("^" + quoted.source + "$"); - var rangeLine = new RegExp("^" + rangeCapture.source + "$"); - var operators = [ - /\s+or\s+/, - /\s+and\s+/, - /==|!=|<=|>=|<|>|\s+contains\s+/ - ]; - - var TagToken = /** @class */ (function (_super) { - __extends(TagToken, _super); - function TagToken(raw, value$$1, input, line, pos, file) { - var _this = _super.call(this, raw, value$$1, input, line, pos, file) || this; - _this.type = 'tag'; - var match = _this.value.match(tagLine); - if (!match) { - throw new TokenizationError("illegal tag syntax", _this); - } - _this.name = match[1]; - _this.args = match[2]; - return _this; - } - return TagToken; - }(DelimitedToken)); - - var OutputToken = /** @class */ (function (_super) { - __extends(OutputToken, _super); - function OutputToken(raw, value, input, line, pos, file) { - var _this = _super.call(this, raw, value, input, line, pos, file) || this; - _this.type = 'output'; - return _this; - } - return OutputToken; - }(DelimitedToken)); - - var ParseState; - (function (ParseState) { - ParseState[ParseState["HTML"] = 0] = "HTML"; - ParseState[ParseState["OUTPUT"] = 1] = "OUTPUT"; - ParseState[ParseState["TAG"] = 2] = "TAG"; - })(ParseState || (ParseState = {})); - var Tokenizer = /** @class */ (function () { - function Tokenizer(options) { - this.options = applyDefault(options); - } - Tokenizer.prototype.tokenize = function (input, file) { - var tokens = []; - var tagL = this.options.tag_delimiter_left; - var tagR = this.options.tag_delimiter_right; - var outputL = this.options.output_delimiter_left; - var outputR = this.options.output_delimiter_right; - var p = 0; - var curLine = 1; - var state = ParseState.HTML; - var buffer = ''; - var lineBegin = 0; - var line = 1; - var col = 1; - while (p < input.length) { - if (input[p] === '\n') { - curLine++; - lineBegin = p + 1; - } - if (state === ParseState.HTML) { - if (input.substr(p, outputL.length) === outputL) { - if (buffer) - tokens.push(new HTMLToken(buffer, input, line, col, file)); - buffer = outputL; - line = curLine; - col = p - lineBegin + 1; - p += outputL.length; - state = ParseState.OUTPUT; - continue; - } - else if (input.substr(p, tagL.length) === tagL) { - if (buffer) - tokens.push(new HTMLToken(buffer, input, line, col, file)); - buffer = tagL; - line = curLine; - col = p - lineBegin + 1; - p += tagL.length; - state = ParseState.TAG; - continue; - } - } - else if (state === ParseState.OUTPUT && input.substr(p, outputR.length) === outputR) { - buffer += outputR; - tokens.push(new OutputToken(buffer, buffer.slice(outputL.length, -outputR.length), input, line, col, file)); - p += outputR.length; - buffer = ''; - line = curLine; - col = p - lineBegin + 1; - state = ParseState.HTML; - continue; - } - else if (input.substr(p, tagR.length) === tagR) { - buffer += tagR; - tokens.push(new TagToken(buffer, buffer.slice(tagL.length, -tagR.length), input, line, col, file)); - p += tagR.length; - buffer = ''; - line = curLine; - col = p - lineBegin + 1; - state = ParseState.HTML; - continue; - } - buffer += input[p++]; - } - if (state !== ParseState.HTML) { - var t = state === ParseState.OUTPUT ? 'output' : 'tag'; - var str = buffer.length > 16 ? buffer.slice(0, 13) + '...' : buffer; - throw new TokenizationError(t + " \"" + str + "\" not closed", new Token(buffer, input, line, col, file)); - } - if (buffer) - tokens.push(new HTMLToken(buffer, input, line, col, file)); - whiteSpaceCtrl(tokens, this.options); - return tokens; - }; - return Tokenizer; - }()); - - var Render = /** @class */ (function () { - function Render() { - } - Render.prototype.renderTemplates = function (templates, scope) { - return __awaiter(this, void 0, void 0, function () { - var html, _i, templates_1, tpl, _a, e_1; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - assert(scope, 'unable to evalTemplates: scope undefined'); - html = ''; - _i = 0, templates_1 = templates; - _b.label = 1; - case 1: - if (!(_i < templates_1.length)) return [3 /*break*/, 6]; - tpl = templates_1[_i]; - _b.label = 2; - case 2: - _b.trys.push([2, 4, , 5]); - _a = html; - return [4 /*yield*/, tpl.render(scope)]; - case 3: - html = _a + _b.sent(); - return [3 /*break*/, 5]; - case 4: - e_1 = _b.sent(); - if (e_1.name === 'RenderBreakError') { - e_1.resolvedHTML = html; - throw e_1; - } - throw e_1.name === 'RenderError' ? e_1 : new RenderError(e_1, tpl); - case 5: - _i++; - return [3 /*break*/, 1]; - case 6: return [2 /*return*/, html]; - } - }); - }); - }; - return Render; - }()); - - function isComparable(arg) { - return arg && isFunction(arg.equals); - } - - var Drop = /** @class */ (function () { - function Drop() { - } - return Drop; - }()); - - function isDrop(value) { - return value instanceof Drop && isFunction(value.value); - } - - var EmptyDrop = /** @class */ (function (_super) { - __extends(EmptyDrop, _super); - function EmptyDrop() { - return _super !== null && _super.apply(this, arguments) || this; - } - EmptyDrop.prototype.equals = function (value) { - if (isString(value) || isArray(value)) - return value.length === 0; - if (isObject(value)) - return Object.keys(value).length === 0; - return false; - }; - EmptyDrop.prototype.gt = function () { - return false; - }; - EmptyDrop.prototype.geq = function () { - return false; - }; - EmptyDrop.prototype.lt = function () { - return false; - }; - EmptyDrop.prototype.leq = function () { - return false; - }; - EmptyDrop.prototype.value = function () { - return ''; - }; - return EmptyDrop; - }(Drop)); - - var BlankDrop = /** @class */ (function (_super) { - __extends(BlankDrop, _super); - function BlankDrop() { - return _super !== null && _super.apply(this, arguments) || this; - } - BlankDrop.prototype.equals = function (value) { - if (value === false) - return true; - if (isNil(isDrop(value) ? value.value() : value)) - return true; - if (isString(value)) - return /^\s*$/.test(value); - return _super.prototype.equals.call(this, value); - }; - return BlankDrop; - }(EmptyDrop)); - - var NullDrop = /** @class */ (function (_super) { - __extends(NullDrop, _super); - function NullDrop() { - return _super !== null && _super.apply(this, arguments) || this; - } - NullDrop.prototype.equals = function (value) { - return isNil(isDrop(value) ? value.value() : value) || value instanceof BlankDrop; - }; - NullDrop.prototype.gt = function () { - return false; - }; - NullDrop.prototype.geq = function () { - return false; - }; - NullDrop.prototype.lt = function () { - return false; - }; - NullDrop.prototype.leq = function () { - return false; - }; - NullDrop.prototype.value = function () { - return null; - }; - return NullDrop; - }(Drop)); - - var binaryOperators = { - '==': function (l, r) { - if (isComparable(l)) - return l.equals(r); - if (isComparable(r)) - return r.equals(l); - return l === r; - }, - '!=': function (l, r) { - if (isComparable(l)) - return !l.equals(r); - if (isComparable(r)) - return !r.equals(l); - return l !== r; - }, - '>': function (l, r) { - if (isComparable(l)) - return l.gt(r); - if (isComparable(r)) - return r.lt(l); - return l > r; - }, - '<': function (l, r) { - if (isComparable(l)) - return l.lt(r); - if (isComparable(r)) - return r.gt(l); - return l < r; - }, - '>=': function (l, r) { - if (isComparable(l)) - return l.geq(r); - if (isComparable(r)) - return r.leq(l); - return l >= r; - }, - '<=': function (l, r) { - if (isComparable(l)) - return l.leq(r); - if (isComparable(r)) - return r.geq(l); - return l <= r; - }, - 'contains': function (l, r) { - if (!l) - return false; - if (typeof l.indexOf !== 'function') - return false; - return l.indexOf(r) > -1; - }, - 'and': function (l, r) { return isTruthy(l) && isTruthy(r); }, - 'or': function (l, r) { return isTruthy(l) || isTruthy(r); } - }; - function parseExp(exp, scope) { - assert(scope, 'unable to parseExp: scope undefined'); - var operatorREs = operators; - var match; - for (var i = 0; i < operatorREs.length; i++) { - var operatorRE = operatorREs[i]; - var expRE = new RegExp("^(" + quoteBalanced.source + ")(" + operatorRE.source + ")(" + quoteBalanced.source + ")$"); - if ((match = exp.match(expRE))) { - var l = parseExp(match[1], scope); - var op = binaryOperators[match[2].trim()]; - var r = parseExp(match[3], scope); - return op(l, r); - } - } - if ((match = exp.match(rangeLine))) { - var low = parseValue(match[1], scope); - var high = parseValue(match[2], scope); - return range(low, high + 1); - } - return parseValue(exp, scope); - } - function evalExp(str, scope) { - var value$$1 = parseExp(str, scope); - return isDrop(value$$1) ? value$$1.value() : value$$1; - } - function parseValue(str, scope) { - if (!str) - return null; - str = str.trim(); - if (str === 'true') - return true; - if (str === 'false') - return false; - if (str === 'nil' || str === 'null') - return new NullDrop(); - if (str === 'empty') - return new EmptyDrop(); - if (str === 'blank') - return new BlankDrop(); - if (!isNaN(Number(str))) - return Number(str); - if ((str[0] === '"' || str[0] === "'") && str[0] === last(str)) - return str.slice(1, -1); - return scope.get(str); - } - function evalValue(str, scope) { - var value$$1 = parseValue(str, scope); - return isDrop(value$$1) ? value$$1.value() : value$$1; - } - function isTruthy(val) { - return !isFalsy(val); - } - function isFalsy(val) { - return val === false || undefined === val || val === null; - } - - /** - * Key-Value Pairs Representing Tag Arguments - * Example: - * For the markup `{% include 'head.html' foo='bar' %}`, - * hash['foo'] === 'bar' - */ - var Hash = /** @class */ (function () { - function Hash(markup, scope) { - var match; - hashCapture.lastIndex = 0; - while ((match = hashCapture.exec(markup))) { - var k = match[1]; - var v = match[2]; - this[k] = evalValue(v, scope); - } - } - return Hash; - }()); - - var Template = /** @class */ (function () { - function Template(token) { - this.token = token; - } - return Template; - }()); - - var Tag = /** @class */ (function (_super) { - __extends(Tag, _super); - function Tag(token, tokens, liquid) { - var _this = _super.call(this, token) || this; - _this.name = token.name; - var impl = Tag.impls[token.name]; - assert(impl, "tag " + token.name + " not found"); - _this.impl = create(impl); - _this.impl.liquid = liquid; - if (_this.impl.parse) { - _this.impl.parse(token, tokens); - } - return _this; - } - Tag.prototype.render = function (scope) { - return __awaiter(this, void 0, void 0, function () { - var hash, impl, html; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - hash = new Hash(this.token.args, scope); - impl = this.impl; - if (typeof impl.render !== 'function') { - return [2 /*return*/, '']; - } - return [4 /*yield*/, impl.render(scope, hash)]; - case 1: - html = _a.sent(); - return [2 /*return*/, stringify(html)]; - } - }); - }); - }; - Tag.register = function (name, tag) { - Tag.impls[name] = tag; - }; - Tag.clear = function () { - Tag.impls = {}; - }; - Tag.impls = {}; - return Tag; - }(Template)); - - var Filter = /** @class */ (function () { - function Filter(name, args, strictFilters) { - var impl = Filter.impls[name]; - if (!impl && strictFilters) - throw new TypeError("undefined filter: " + name); - this.name = name; - this.impl = impl || (function (x) { return x; }); - this.args = args; - } - Filter.prototype.render = function (value, scope) { - var args = this.args.map(function (arg) { return evalValue(arg, scope); }); - return this.impl.apply(null, [value].concat(args)); - }; - Filter.register = function (name, filter) { - Filter.impls[name] = filter; - }; - Filter.clear = function () { - Filter.impls = {}; - }; - Filter.impls = {}; - return Filter; - }()); - - var ParseStream = /** @class */ (function () { - function ParseStream(tokens, parseToken) { - this.handlers = {}; - this.stopRequested = false; - this.tokens = tokens; - this.parseToken = parseToken; - } - ParseStream.prototype.on = function (name, cb) { - this.handlers[name] = cb; - return this; - }; - ParseStream.prototype.trigger = function (event, arg) { - var h = this.handlers[event]; - if (typeof h === 'function') { - h(arg); - return true; - } - return false; - }; - ParseStream.prototype.start = function () { - this.trigger('start'); - var token; - while (!this.stopRequested && (token = this.tokens.shift())) { - if (this.trigger('token', token)) - continue; - if (token.type === 'tag' && this.trigger("tag:" + token.name, token)) { - continue; - } - var template = this.parseToken(token, this.tokens); - this.trigger('template', template); - } - if (!this.stopRequested) - this.trigger('end'); - return this; - }; - ParseStream.prototype.stop = function () { - this.stopRequested = true; - return this; - }; - return ParseStream; - }()); - - var ParseState$1; - (function (ParseState) { - ParseState[ParseState["INIT"] = 0] = "INIT"; - ParseState[ParseState["FILTER_NAME"] = 1] = "FILTER_NAME"; - ParseState[ParseState["FILTER_ARG"] = 2] = "FILTER_ARG"; - })(ParseState$1 || (ParseState$1 = {})); - var default_1 = /** @class */ (function () { - /** - * @param str value string, like: "i have a dream | truncate: 3 - */ - function default_1(str, strictFilters) { - this.filters = []; - var buffer = ''; - var quoted = ''; - var state = ParseState$1.INIT; - var sealed = false; - var filterName = ''; - var filterArgs = []; - for (var i = 0; i < str.length; i++) { - if (quoted) { - if (str[i] === quoted) { - quoted = ''; - sealed = true; - } - buffer += str[i]; - } - else if (/\s/.test(str[i])) { - if (!buffer) - continue; - else - sealed = true; - } - else if (str[i] === '|') { - if (state === ParseState$1.INIT) { - this.initial = buffer; - } - else { - if (state === ParseState$1.FILTER_NAME) - filterName = buffer; - else - filterArgs.push(buffer); - this.filters.push(new Filter(filterName, filterArgs, strictFilters)); - filterName = ''; - filterArgs = []; - } - state = ParseState$1.FILTER_NAME; - buffer = ''; - sealed = false; - } - else if (state === ParseState$1.FILTER_NAME && str[i] === ':') { - filterName = buffer; - state = ParseState$1.FILTER_ARG; - buffer = ''; - sealed = false; - } - else if (state === ParseState$1.FILTER_ARG && str[i] === ',') { - filterArgs.push(buffer); - buffer = ''; - sealed = false; - } - else if (sealed) - continue; - else { - if ((str[i] === '"' || str[i] === "'") && !quoted) - quoted = str[i]; - buffer += str[i]; - } - } - if (buffer) { - if (state === ParseState$1.INIT) - this.initial = buffer; - else if (state === ParseState$1.FILTER_NAME) - this.filters.push(new Filter(buffer, [], strictFilters)); - else { - filterArgs.push(buffer); - this.filters.push(new Filter(filterName, filterArgs, strictFilters)); - } - } - } - default_1.prototype.value = function (scope) { - return this.filters.reduce(function (prev, filter) { return filter.render(prev, scope); }, evalExp(this.initial, scope)); - }; - return default_1; - }()); - - var Output = /** @class */ (function (_super) { - __extends(Output, _super); - function Output(token, strictFilters) { - var _this = _super.call(this, token) || this; - _this.value = new default_1(token.value, strictFilters); - return _this; - } - Output.prototype.render = function (scope) { - return __awaiter(this, void 0, void 0, function () { - var html; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.value.value(scope)]; - case 1: - html = _a.sent(); - return [2 /*return*/, stringify(html)]; - } - }); - }); - }; - return Output; - }(Template)); - - var default_1$1 = /** @class */ (function (_super) { - __extends(default_1, _super); - function default_1(token) { - var _this = _super.call(this, token) || this; - _this.str = token.value; - return _this; - } - default_1.prototype.render = function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - return [2 /*return*/, this.str]; - }); - }); - }; - return default_1; - }(Template)); - - var Parser = /** @class */ (function () { - function Parser(liquid) { - this.liquid = liquid; - } - Parser.prototype.parse = function (tokens) { - var token; - var templates = []; - while ((token = tokens.shift())) { - templates.push(this.parseToken(token, tokens)); - } - return templates; - }; - Parser.prototype.parseToken = function (token, remainTokens) { - try { - if (token.type === 'tag') { - return new Tag(token, remainTokens, this.liquid); - } - if (token.type === 'output') { - return new Output(token, this.liquid.options.strict_filters); - } - return new default_1$1(token); - } - catch (e) { - throw new ParseError(e, token); - } - }; - Parser.prototype.parseStream = function (tokens) { - var _this = this; - return new ParseStream(tokens, function (token, tokens) { return _this.parseToken(token, tokens); }); - }; - return Parser; - }()); - - var re = new RegExp("(" + identifier.source + ")\\s*=([^]*)"); - var assign = { - parse: function (token) { - var match = token.args.match(re); - assert(match, "illegal token " + token.raw); - this.key = match[1]; - this.value = match[2]; - }, - render: function (scope) { - var ctx = new AssignScope(); - ctx[this.key] = this.liquid.evalValue(this.value, scope); - scope.push(ctx); - return Promise.resolve(''); - } - }; - - /* - * Call functions in serial until someone rejected. - * @param {Array} iterable the array to iterate with. - * @param {Array} iteratee returns a new promise. - * The iteratee is invoked with three arguments: (value, index, iterable). - */ - function mapSeries(iterable, iteratee) { - var ret = Promise.resolve(0); - var result = []; - iterable.forEach(function (item, idx) { - ret = ret - .then(function () { return iteratee(item, idx, iterable); }) - .then(function (x) { return result.push(x); }); - }); - return ret.then(function () { return result; }); - } - - var re$1 = new RegExp("^(" + identifier.source + ")\\s+in\\s+" + - ("(" + value.source + ")") + - ("(?:\\s+" + hash.source + ")*") + - "(?:\\s+(reversed))?" + - ("(?:\\s+" + hash.source + ")*$")); - var For = { - type: 'block', - parse: function (tagToken, remainTokens) { - var _this = this; - var match = re$1.exec(tagToken.args); - assert(match, "illegal tag: " + tagToken.raw); - this.variable = match[1]; - this.collection = match[2]; - this.reversed = !!match[3]; - this.templates = []; - this.elseTemplates = []; - var p; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('start', function () { return (p = _this.templates); }) - .on('tag:else', function () { return (p = _this.elseTemplates); }) - .on('tag:endfor', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope, hash$$1) { - return __awaiter(this, void 0, void 0, function () { - var collection, offset, limit, contexts, html, finished; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - collection = evalExp(this.collection, scope); - if (!isArray(collection)) { - if (isString(collection) && collection.length > 0) { - collection = [collection]; - } - else if (isObject(collection)) { - collection = Object.keys(collection).map(function (key) { return [key, collection[key]]; }); - } - } - if (!isArray(collection) || !collection.length) { - return [2 /*return*/, this.liquid.renderer.renderTemplates(this.elseTemplates, scope)]; - } - offset = hash$$1.offset || 0; - limit = (hash$$1.limit === undefined) ? collection.length : hash$$1.limit; - collection = collection.slice(offset, offset + limit); - if (this.reversed) - collection.reverse(); - contexts = collection.map(function (item, i) { - var ctx = {}; - ctx[_this.variable] = item; - ctx['forloop'] = { - first: i === 0, - index: i + 1, - index0: i, - last: i === collection.length - 1, - length: collection.length, - rindex: collection.length - i, - rindex0: collection.length - i - 1 - }; - return ctx; - }); - html = ''; - finished = false; - return [4 /*yield*/, mapSeries(contexts, function (context) { return __awaiter(_this, void 0, void 0, function () { - var _a, e_1; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - if (finished) - return [2 /*return*/]; - scope.push(context); - _b.label = 1; - case 1: - _b.trys.push([1, 3, , 4]); - _a = html; - return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, scope)]; - case 2: - html = _a + _b.sent(); - return [3 /*break*/, 4]; - case 3: - e_1 = _b.sent(); - if (e_1.name === 'RenderBreakError') { - html += e_1.resolvedHTML; - if (e_1.message === 'break') { - finished = true; - } - } - else - throw e_1; - return [3 /*break*/, 4]; - case 4: - scope.pop(context); - return [2 /*return*/]; - } - }); - }); })]; - case 1: - _a.sent(); - return [2 /*return*/, html]; - } - }); - }); - } - }; - - var re$2 = new RegExp("(" + identifier.source + ")"); - var capture = { - parse: function (tagToken, remainTokens) { - var _this = this; - var match = tagToken.args.match(re$2); - assert(match, tagToken.args + " not valid identifier"); - this.variable = match[1]; - this.templates = []; - var stream = this.liquid.parser.parseStream(remainTokens); - stream.on('tag:endcapture', function () { return stream.stop(); }) - .on('template', function (tpl) { return _this.templates.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - return __awaiter(this, void 0, void 0, function () { - var html, ctx; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, scope)]; - case 1: - html = _a.sent(); - ctx = new CaptureScope(); - ctx[this.variable] = html; - scope.push(ctx); - return [2 /*return*/]; - } - }); - }); - } - }; - - var Case = { - parse: function (tagToken, remainTokens) { - var _this = this; - this.cond = tagToken.args; - this.cases = []; - this.elseTemplates = []; - var p = []; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('tag:when', function (token) { - _this.cases.push({ - val: token.args, - templates: p = [] - }); - }) - .on('tag:else', function () { return (p = _this.elseTemplates); }) - .on('tag:endcase', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - for (var i = 0; i < this.cases.length; i++) { - var branch = this.cases[i]; - var val = evalExp(branch.val, scope); - var cond = evalExp(this.cond, scope); - if (val === cond) { - return this.liquid.renderer.renderTemplates(branch.templates, scope); - } - } - return this.liquid.renderer.renderTemplates(this.elseTemplates, scope); - } - }; - - var comment = { - parse: function (tagToken, remainTokens) { - var stream = this.liquid.parser.parseStream(remainTokens); - stream - .on('token', function (token) { - if (token.name === 'endcomment') - stream.stop(); - }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - } - }; - - var staticFileRE = /[^\s,]+/; - var withRE = new RegExp("with\\s+(" + value.source + ")"); - var include = { - parse: function (token) { - var match = staticFileRE.exec(token.args); - if (match) { - this.staticValue = match[0]; - } - match = value.exec(token.args); - if (match) { - this.value = match[0]; - } - match = withRE.exec(token.args); - if (match) { - this.with = match[1]; - } - }, - render: function (scope, hash$$1) { - return __awaiter(this, void 0, void 0, function () { - var filepath, template, originBlocks, originBlockMode, templates, html; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - if (!scope.opts.dynamicPartials) return [3 /*break*/, 4]; - if (!quotedLine.exec(this.value)) return [3 /*break*/, 2]; - template = this.value.slice(1, -1); - return [4 /*yield*/, this.liquid.parseAndRender(template, scope.getAll(), scope.opts)]; - case 1: - filepath = _a.sent(); - return [3 /*break*/, 3]; - case 2: - filepath = evalValue(this.value, scope); - _a.label = 3; - case 3: return [3 /*break*/, 5]; - case 4: - filepath = this.staticValue; - _a.label = 5; - case 5: - assert(filepath, "cannot include with empty filename"); - originBlocks = scope.blocks; - originBlockMode = scope.blockMode; - scope.blocks = {}; - scope.blockMode = BlockMode$1.OUTPUT; - if (this.with) { - hash$$1[filepath] = evalValue(this.with, scope); - } - return [4 /*yield*/, this.liquid.getTemplate(filepath, scope.opts)]; - case 6: - templates = _a.sent(); - scope.push(hash$$1); - return [4 /*yield*/, this.liquid.renderer.renderTemplates(templates, scope)]; - case 7: - html = _a.sent(); - scope.pop(hash$$1); - scope.blocks = originBlocks; - scope.blockMode = originBlockMode; - return [2 /*return*/, html]; - } - }); - }); - } - }; - - var decrement = { - parse: function (token) { - var match = token.args.match(identifier); - assert(match, "illegal identifier " + token.args); - this.variable = match[0]; - }, - render: function (scope) { - var context = scope.findContextFor(this.variable, function (ctx) { - return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope); - }); - if (!context) { - context = new DecrementScope(); - scope.unshift(context); - } - if (typeof context[this.variable] !== 'number') { - context[this.variable] = 0; - } - return --context[this.variable]; - } - }; - - var groupRE = new RegExp("^(?:(" + value.source + ")\\s*:\\s*)?(.*)$"); - var candidatesRE = new RegExp(value.source, 'g'); - var cycle = { - parse: function (tagToken) { - var match = groupRE.exec(tagToken.args); - assert(match, "illegal tag: " + tagToken.raw); - this.group = match[1] || ''; - var candidates = match[2]; - this.candidates = []; - while ((match = candidatesRE.exec(candidates))) { - this.candidates.push(match[0]); - } - assert(this.candidates.length, "empty candidates: " + tagToken.raw); - }, - render: function (scope) { - var group = evalValue(this.group, scope); - var fingerprint = "cycle:" + group + ":" + this.candidates.join(','); - var groups = scope.groups; - var idx = groups[fingerprint]; - if (idx === undefined) { - idx = groups[fingerprint] = 0; - } - var candidate = this.candidates[idx]; - idx = (idx + 1) % this.candidates.length; - groups[fingerprint] = idx; - return evalValue(candidate, scope); - } - }; - - var If = { - parse: function (tagToken, remainTokens) { - var _this = this; - this.branches = []; - this.elseTemplates = []; - var p; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('start', function () { return _this.branches.push({ - cond: tagToken.args, - templates: (p = []) - }); }) - .on('tag:elsif', function (token) { - _this.branches.push({ - cond: token.args, - templates: p = [] - }); - }) - .on('tag:else', function () { return (p = _this.elseTemplates); }) - .on('tag:endif', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - for (var _i = 0, _a = this.branches; _i < _a.length; _i++) { - var branch = _a[_i]; - var cond = evalExp(branch.cond, scope); - if (isTruthy(cond)) { - return this.liquid.renderer.renderTemplates(branch.templates, scope); - } - } - return this.liquid.renderer.renderTemplates(this.elseTemplates, scope); - } - }; - - var increment = { - parse: function (token) { - var match = token.args.match(identifier); - assert(match, "illegal identifier " + token.args); - this.variable = match[0]; - }, - render: function (scope) { - var context = scope.findContextFor(this.variable, function (ctx) { - return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope); - }); - if (!context) { - context = new IncrementScope(); - scope.unshift(context); - } - if (typeof context[this.variable] !== 'number') { - context[this.variable] = 0; - } - var val = context[this.variable]; - context[this.variable]++; - return val; - } - }; - - var staticFileRE$1 = /\S+/; - var layout = { - parse: function (token, remainTokens) { - var match = staticFileRE$1.exec(token.args); - if (match) { - this.staticLayout = match[0]; - } - match = value.exec(token.args); - if (match) { - this.layout = match[0]; - } - this.tpls = this.liquid.parser.parse(remainTokens); - }, - render: function (scope, hash$$1) { - return __awaiter(this, void 0, void 0, function () { - var layout, html, templates, partial; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - layout = scope.opts.dynamicPartials - ? evalValue(this.layout, scope) - : this.staticLayout; - assert(layout, "cannot apply layout with empty filename"); - // render the remaining tokens immediately - scope.blockMode = BlockMode$1.STORE; - return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.tpls, scope)]; - case 1: - html = _a.sent(); - if (scope.blocks[''] === undefined) { - scope.blocks[''] = html; - } - return [4 /*yield*/, this.liquid.getTemplate(layout, scope.opts)]; - case 2: - templates = _a.sent(); - scope.push(hash$$1); - scope.blockMode = BlockMode$1.OUTPUT; - return [4 /*yield*/, this.liquid.renderer.renderTemplates(templates, scope)]; - case 3: - partial = _a.sent(); - scope.pop(hash$$1); - return [2 /*return*/, partial]; - } - }); - }); - } - }; - - var block = { - parse: function (token, remainTokens) { - var _this = this; - var match = /\w+/.exec(token.args); - this.block = match ? match[0] : ''; - this.tpls = []; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('tag:endblock', function () { return stream.stop(); }) - .on('template', function (tpl) { return _this.tpls.push(tpl); }) - .on('end', function () { - throw new Error("tag " + token.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - return __awaiter(this, void 0, void 0, function () { - var childDefined, html, _a; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - childDefined = scope.blocks[this.block]; - if (!(childDefined !== undefined)) return [3 /*break*/, 1]; - _a = childDefined; - return [3 /*break*/, 3]; - case 1: return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.tpls, scope)]; - case 2: - _a = _b.sent(); - _b.label = 3; - case 3: - html = _a; - if (scope.blockMode === BlockMode$1.STORE) { - scope.blocks[this.block] = html; - return [2 /*return*/, '']; - } - return [2 /*return*/, html]; - } - }); - }); - } - }; - - var raw = { - parse: function (tagToken, remainTokens) { - var _this = this; - this.tokens = []; - var stream = this.liquid.parser.parseStream(remainTokens); - stream - .on('token', function (token) { - if (token.name === 'endraw') - stream.stop(); - else - _this.tokens.push(token); - }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function () { - return this.tokens.map(function (token) { return token.raw; }).join(''); - } - }; - - var re$3 = new RegExp("^(" + identifier.source + ")\\s+in\\s+" + - ("(" + value.source + ")") + - ("(?:\\s+" + hash.source + ")*$")); - var tablerow = { - parse: function (tagToken, remainTokens) { - var _this = this; - var match = re$3.exec(tagToken.args); - assert(match, "illegal tag: " + tagToken.raw); - this.variable = match[1]; - this.collection = match[2]; - this.templates = []; - var p; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('start', function () { return (p = _this.templates); }) - .on('tag:endtablerow', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope, hash$$1) { - return __awaiter(this, void 0, void 0, function () { - var collection, offset, limit, cols, contexts, row, html; - var _this = this; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - collection = evalExp(this.collection, scope) || []; - offset = hash$$1.offset || 0; - limit = (hash$$1.limit === undefined) ? collection.length : hash$$1.limit; - collection = collection.slice(offset, offset + limit); - cols = hash$$1.cols || collection.length; - contexts = collection.map(function (item) { - var ctx = {}; - ctx[_this.variable] = item; - return ctx; - }); - row = 0; - html = ''; - return [4 /*yield*/, mapSeries(contexts, function (context, idx) { return __awaiter(_this, void 0, void 0, function () { - var col, _a; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - row = Math.floor(idx / cols) + 1; - col = (idx % cols) + 1; - if (col === 1) { - if (row !== 1) { - html += ''; - } - html += ""; - } - html += ""; - scope.push(context); - _a = html; - return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, scope)]; - case 1: - html = _a + _b.sent(); - html += ''; - scope.pop(context); - return [2 /*return*/, html]; - } - }); - }); })]; - case 1: - _a.sent(); - if (row > 0) { - html += ''; - } - return [2 /*return*/, html]; - } - }); - }); - } - }; - - var unless = { - parse: function (tagToken, remainTokens) { - var _this = this; - this.templates = []; - this.elseTemplates = []; - var p; - var stream = this.liquid.parser.parseStream(remainTokens) - .on('start', function () { - p = _this.templates; - _this.cond = tagToken.args; - }) - .on('tag:else', function () { return (p = _this.elseTemplates); }) - .on('tag:endunless', function () { return stream.stop(); }) - .on('template', function (tpl) { return p.push(tpl); }) - .on('end', function () { - throw new Error("tag " + tagToken.raw + " not closed"); - }); - stream.start(); - }, - render: function (scope) { - var cond = evalExp(this.cond, scope); - return isFalsy(cond) - ? this.liquid.renderer.renderTemplates(this.templates, scope) - : this.liquid.renderer.renderTemplates(this.elseTemplates, scope); - } - }; - - var Break = { - render: function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - throw new RenderBreakError('break'); - }); - }); - } - }; - - var Continue = { - render: function () { - return __awaiter(this, void 0, void 0, function () { - return __generator(this, function (_a) { - throw new RenderBreakError('continue'); - }); - }); - } - }; - - var tags = { - 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 - }; - - var escapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; - var unescapeMap = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - ''': "'" - }; - function escape(str) { - return String(str).replace(/&|<|>|"|'/g, function (m) { return escapeMap[m]; }); - } - function unescape(str) { - return String(str).replace(/&(amp|lt|gt|#34|#39);/g, function (m) { return unescapeMap[m]; }); - } - var html = { - 'escape': escape, - 'escape_once': function (str) { return escape(unescape(str)); }, - 'newline_to_br': function (v) { return v.replace(/\n/g, '
'); }, - 'strip_html': function (v) { return v.replace(/|||<.*?>/g, ''); } - }; - - var str = { - 'append': function (v, arg) { return v + arg; }, - 'prepend': function (v, arg) { return arg + v; }, - 'capitalize': function (str) { return String(str).charAt(0).toUpperCase() + str.slice(1); }, - 'lstrip': function (v) { return String(v).replace(/^\s+/, ''); }, - 'downcase': function (v) { return v.toLowerCase(); }, - 'upcase': function (str) { return String(str).toUpperCase(); }, - 'remove': function (v, arg) { return v.split(arg).join(''); }, - 'remove_first': function (v, l) { return v.replace(l, ''); }, - 'replace': function (v, pattern, replacement) { - return String(v).split(pattern).join(replacement); - }, - 'replace_first': function (v, arg1, arg2) { return String(v).replace(arg1, arg2); }, - 'rstrip': function (str) { return String(str).replace(/\s+$/, ''); }, - 'split': function (v, arg) { return String(v).split(arg); }, - 'strip': function (v) { return String(v).trim(); }, - 'strip_newlines': function (v) { return String(v).replace(/\n/g, ''); }, - 'truncate': function (v, l, o) { - if (l === void 0) { l = 50; } - if (o === void 0) { o = '...'; } - v = String(v); - if (v.length <= l) - return v; - return v.substr(0, l - o.length) + o; - }, - 'truncatewords': function (v, l, o) { - if (l === void 0) { l = 15; } - if (o === void 0) { o = '...'; } - var arr = v.split(/\s+/); - var ret = arr.slice(0, l).join(' '); - if (arr.length >= l) - ret += o; - return ret; - } - }; - - var math = { - 'abs': function (v) { return Math.abs(v); }, - 'ceil': function (v) { return Math.ceil(v); }, - 'divided_by': function (v, arg) { return v / arg; }, - 'floor': function (v) { return Math.floor(v); }, - 'minus': bindFixed(function (v, arg) { return v - arg; }), - 'modulo': bindFixed(function (v, arg) { return v % arg; }), - 'round': function (v, arg) { - if (arg === void 0) { arg = 0; } - var amp = Math.pow(10, arg); - return Math.round(v * amp) / amp; - }, - 'plus': bindFixed(function (v, arg) { return Number(v) + Number(arg); }), - 'times': function (v, arg) { return v * arg; } - }; - function getFixed(v) { - var p = String(v).split('.'); - return (p.length > 1) ? p[1].length : 0; - } - function bindFixed(cb) { - return function (l, r) { - var f = Math.max(getFixed(l), getFixed(r)); - return cb(l, r).toFixed(f); - }; - } - - var url = { - 'url_decode': function (x) { return x.split('+').map(decodeURIComponent).join(' '); }, - 'url_encode': function (x) { return x.split(' ').map(encodeURIComponent).join('+'); } - }; - - var array = { - 'join': function (v, arg) { return v.join(arg === undefined ? ' ' : arg); }, - 'last': function (v) { return last(v); }, - 'first': function (v) { return v[0]; }, - 'map': function (arr, arg) { return arr.map(function (v) { return v[arg]; }); }, - 'reverse': function (v) { return v.reverse(); }, - 'sort': function (v, arg) { return v.sort(arg); }, - 'size': function (v) { return v.length; }, - 'concat': function (v, arg) { return Array.prototype.concat.call(v, arg); }, - 'slice': function (v, begin, length) { - if (length === undefined) - length = 1; - return v.slice(begin, begin + length); - }, - 'uniq': function (arr) { - var u = {}; - return (arr || []).filter(function (val) { - if (u.hasOwnProperty(String(val))) - return false; - u[String(val)] = true; - return true; - }); - } - }; - - var monthNames = [ - 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', - 'September', 'October', 'November', 'December' - ]; - var dayNames = [ - 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' - ]; - var monthNamesShort = monthNames.map(abbr); - var dayNamesShort = dayNames.map(abbr); - var suffixes = { - 1: 'st', - 2: 'nd', - 3: 'rd', - 'default': 'th' - }; - function abbr(str) { - return str.slice(0, 3); - } - // prototype extensions - var _date = { - daysInMonth: function (d) { - var feb = _date.isLeapYear(d) ? 29 : 28; - return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; - }, - getDayOfYear: function (d) { - var num = 0; - for (var i = 0; i < d.getMonth(); ++i) { - num += _date.daysInMonth(d)[i]; - } - return num + d.getDate(); - }, - getWeekOfYear: function (d, startDay) { - // Skip to startDay of this week - var now = this.getDayOfYear(d) + (startDay - d.getDay()); - // Find the first startDay of the year - var jan1 = new Date(d.getFullYear(), 0, 1); - var then = (7 - jan1.getDay() + startDay); - return padStart(String(Math.floor((now - then) / 7) + 1), 2, '0'); - }, - isLeapYear: function (d) { - var year = d.getFullYear(); - return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year))); - }, - getSuffix: function (d) { - var str = d.getDate().toString(); - var index = parseInt(str.slice(-1)); - return suffixes[index] || suffixes['default']; - }, - century: function (d) { - return parseInt(d.getFullYear().toString().substring(0, 2), 10); - } - }; - var formatCodes = { - a: function (d) { - return dayNamesShort[d.getDay()]; - }, - A: function (d) { - return dayNames[d.getDay()]; - }, - b: function (d) { - return monthNamesShort[d.getMonth()]; - }, - B: function (d) { - return monthNames[d.getMonth()]; - }, - c: function (d) { - return d.toLocaleString(); - }, - C: function (d) { - return _date.century(d); - }, - d: function (d) { - return padStart(d.getDate(), 2, '0'); - }, - e: function (d) { - return padStart(d.getDate(), 2); - }, - H: function (d) { - return padStart(d.getHours(), 2, '0'); - }, - I: function (d) { - return padStart(String(d.getHours() % 12 || 12), 2, '0'); - }, - j: function (d) { - return padStart(_date.getDayOfYear(d), 3, '0'); - }, - k: function (d) { - return padStart(d.getHours(), 2); - }, - l: function (d) { - return padStart(String(d.getHours() % 12 || 12), 2); - }, - L: function (d) { - return padStart(d.getMilliseconds(), 3, '0'); - }, - m: function (d) { - return padStart(d.getMonth() + 1, 2, '0'); - }, - M: function (d) { - return padStart(d.getMinutes(), 2, '0'); - }, - p: function (d) { - return (d.getHours() < 12 ? 'AM' : 'PM'); - }, - P: function (d) { - return (d.getHours() < 12 ? 'am' : 'pm'); - }, - q: function (d) { - return _date.getSuffix(d); - }, - s: function (d) { - return Math.round(d.valueOf() / 1000); - }, - S: function (d) { - return padStart(d.getSeconds(), 2, '0'); - }, - u: function (d) { - return d.getDay() || 7; - }, - U: function (d) { - return _date.getWeekOfYear(d, 0); - }, - w: function (d) { - return d.getDay(); - }, - W: function (d) { - return _date.getWeekOfYear(d, 1); - }, - x: function (d) { - return d.toLocaleDateString(); - }, - X: function (d) { - return d.toLocaleTimeString(); - }, - y: function (d) { - return d.getFullYear().toString().substring(2, 4); - }, - Y: function (d) { - return d.getFullYear(); - }, - z: function (d) { - var tz = d.getTimezoneOffset() / 60 * 100; - return (tz > 0 ? '-' : '+') + padStart(String(Math.abs(tz)), 4, '0'); - }, - '%': function () { - return '%'; - } - }; - formatCodes.h = formatCodes.b; - formatCodes.N = formatCodes.L; - function strftime (d, format) { - var output = ''; - var remaining = format; - while (true) { - var r = /%./g; - var results = r.exec(remaining); - // No more format codes. Add the remaining text and return - if (!results) { - return output + remaining; - } - // Add the preceding text - output += remaining.slice(0, r.lastIndex - 2); - remaining = remaining.slice(r.lastIndex); - // Add the format code - var ch = results[0].charAt(1); - var func = formatCodes[ch]; - output += func ? func(d) : '%' + ch; - } - } - - var date = { - 'date': function (v, arg) { - var date = v; - if (v === 'now') { - date = new Date(); - } - else if (isString(v)) { - date = new Date(v); - } - return isValidDate(date) ? strftime(date, arg) : v; - } - }; - function isValidDate(date) { - return date instanceof Date && !isNaN(date.getTime()); - } - - var obj = { - 'default': function (v, arg) { return isTruthy(v) ? v : arg; } - }; - - var builtinFilters = __assign({}, html, str, math, url, date, obj, array); - - var Liquid = /** @class */ (function () { - function Liquid(opts) { - if (opts === void 0) { opts = {}; } - var _this = this; - this.cache = {}; - this.options = applyDefault(normalize(opts)); - this.parser = new Parser(this); - this.renderer = new Render(); - this.tokenizer = new Tokenizer(this.options); - forOwn(tags, function (conf, name) { return _this.registerTag(name, conf); }); - forOwn(builtinFilters, function (handler, name) { return _this.registerFilter(name, handler); }); - } - Liquid.prototype.parse = function (html, filepath) { - var tokens = this.tokenizer.tokenize(html, filepath); - return this.parser.parse(tokens); - }; - Liquid.prototype.render = function (tpl, ctx, opts) { - var options = __assign({}, this.options, normalize(opts)); - var scope = new Scope(ctx, options); - return this.renderer.renderTemplates(tpl, scope); - }; - Liquid.prototype.parseAndRender = function (html, ctx, opts) { - return __awaiter(this, void 0, void 0, function () { - var tpl; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: return [4 /*yield*/, this.parse(html)]; - case 1: - tpl = _a.sent(); - return [2 /*return*/, this.render(tpl, ctx, opts)]; - } - }); - }); - }; - Liquid.prototype.getTemplate = function (file, opts) { - return __awaiter(this, void 0, void 0, function () { - var options, roots, paths, _i, paths_1, filepath, value, _a, err; - var _this = this; - return __generator(this, function (_b) { - switch (_b.label) { - case 0: - options = normalize(opts); - roots = options.root ? options.root.concat(this.options.root) : this.options.root; - paths = roots.map(function (root) { return fs.resolve(root, file, _this.options.extname); }); - _i = 0, paths_1 = paths; - _b.label = 1; - case 1: - if (!(_i < paths_1.length)) return [3 /*break*/, 5]; - filepath = paths_1[_i]; - return [4 /*yield*/, fs.exists(filepath)]; - case 2: - if (!(_b.sent())) - return [3 /*break*/, 4]; - if (this.options.cache && this.cache[filepath]) - return [2 /*return*/, this.cache[filepath]]; - _a = this.parse; - return [4 /*yield*/, fs.readFile(filepath)]; - case 3: - value = _a.apply(this, [_b.sent(), filepath]); - if (this.options.cache) - this.cache[filepath] = value; - return [2 /*return*/, value]; - case 4: - _i++; - return [3 /*break*/, 1]; - case 5: - err = new Error('ENOENT'); - err.message = "ENOENT: Failed to lookup \"" + file + "\" in \"" + roots + "\""; - err.code = 'ENOENT'; - throw err; - } - }); - }); - }; - Liquid.prototype.renderFile = function (file, ctx, opts) { - return __awaiter(this, void 0, void 0, function () { - var options, templates; - return __generator(this, function (_a) { - switch (_a.label) { - case 0: - options = normalize(opts); - return [4 /*yield*/, this.getTemplate(file, options)]; - case 1: - templates = _a.sent(); - return [2 /*return*/, this.render(templates, ctx, opts)]; - } - }); - }); - }; - Liquid.prototype.evalValue = function (str, scope) { - return new default_1(str, this.options.strict_filters).value(scope); - }; - Liquid.prototype.registerFilter = function (name, filter) { - return Filter.register(name, filter); - }; - Liquid.prototype.registerTag = function (name, tag) { - return Tag.register(name, tag); - }; - Liquid.prototype.plugin = function (plugin) { - return plugin.call(this, Liquid); - }; - Liquid.prototype.express = function () { - var self = this; - return function (filePath, ctx, cb) { - var opts = { root: this.root }; - self.renderFile(filePath, ctx, opts).then(function (html) { return cb(null, html); }, cb); - }; - }; - Liquid.default = Liquid; - Liquid.isTruthy = isTruthy; - Liquid.isFalsy = isFalsy; - Liquid.evalExp = evalExp; - Liquid.evalValue = evalValue; - Liquid.Types = Types; - return Liquid; - }()); - - return Liquid; - -})); -//# sourceMappingURL=liquid.js.map diff --git a/dist/liquid.js.map b/dist/liquid.js.map deleted file mode 100644 index 4d419b057..000000000 --- a/dist/liquid.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"liquid.js","sources":["../src/util/underscore.ts","../src/util/error.ts","../src/util/assert.ts","../src/liquid-options.ts","../src/scope/block-mode.ts","../src/scope/scope.ts","../src/scope/scopes.ts","../src/fs/browser.ts","../src/parser/whitespace-ctrl.ts","../src/parser/token.ts","../src/parser/html-token.ts","../src/parser/delimited-token.ts","../src/parser/lexical.ts","../src/parser/tag-token.ts","../src/parser/output-token.ts","../src/parser/tokenizer.ts","../src/render/render.ts","../src/drop/icomparable.ts","../src/drop/drop.ts","../src/drop/idrop.ts","../src/drop/empty-drop.ts","../src/drop/blank-drop.ts","../src/drop/null-drop.ts","../src/render/syntax.ts","../src/template/tag/hash.ts","../src/template/template.ts","../src/template/tag/tag.ts","../src/template/filter/filter.ts","../src/parser/parse-stream.ts","../src/template/value.ts","../src/template/output.ts","../src/template/html.ts","../src/parser/parser.ts","../src/builtin/tags/assign.ts","../src/util/promise.ts","../src/builtin/tags/for.ts","../src/builtin/tags/capture.ts","../src/builtin/tags/case.ts","../src/builtin/tags/comment.ts","../src/builtin/tags/include.ts","../src/builtin/tags/decrement.ts","../src/builtin/tags/cycle.ts","../src/builtin/tags/if.ts","../src/builtin/tags/increment.ts","../src/builtin/tags/layout.ts","../src/builtin/tags/block.ts","../src/builtin/tags/raw.ts","../src/builtin/tags/tablerow.ts","../src/builtin/tags/unless.ts","../src/builtin/tags/break.ts","../src/builtin/tags/continue.ts","../src/builtin/tags/index.ts","../src/builtin/filters/html.ts","../src/builtin/filters/string.ts","../src/builtin/filters/math.ts","../src/builtin/filters/url.ts","../src/builtin/filters/array.ts","../src/util/strftime.ts","../src/builtin/filters/date.ts","../src/builtin/filters/object.ts","../src/builtin/filters/index.ts","../src/liquid.ts"],"sourcesContent":["const toStr = Object.prototype.toString\nconst arrToStr = Array.prototype.toString\n\n/*\n * Checks if value is classified as a String primitive or object.\n * @param {any} value The value to check.\n * @return {Boolean} Returns true if value is a string, else false.\n */\nexport function isString (value: any): value is string {\n return toStr.call(value) === '[object String]'\n}\n\nexport function isFunction (value: any): value is Function {\n return typeof value === 'function'\n}\n\nexport function promisify (fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise;\nexport function promisify (fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void):(arg1: T1, arg2: T2) => Promise;\nexport function promisify (fn: any) {\n return function (...args: any[]) {\n return new Promise((resolve, reject) => {\n fn(...args, (err: Error, result: any) => {\n err ? reject(err) : resolve(result)\n })\n })\n }\n}\n\nexport function stringify (value: any): string {\n if (isNil(value)) return ''\n if (isFunction(value.to_liquid)) return stringify(value.to_liquid())\n if (isFunction(value.toLiquid)) return stringify(value.toLiquid())\n if (isFunction(value.to_s)) return value.to_s()\n if ([toStr, arrToStr].indexOf(value.toString) > -1) return defaultToString(value)\n if (isFunction(value.toString)) return value.toString()\n return toStr.call(value)\n}\n\nfunction defaultToString (value: any): string {\n const cache: any[] = []\n return JSON.stringify(value, (key, value) => {\n if (isObject(value)) {\n if (cache.indexOf(value) !== -1) {\n return\n }\n cache.push(value)\n }\n return value\n })\n}\n\nexport function create (proto: T1): T2 {\n return Object.create(proto)\n}\n\nexport function isNil (value: any): boolean {\n return value === null || value === undefined\n}\n\nexport function isArray (value: any): value is any[] {\n // be compatible with IE 8\n return toStr.call(value) === '[object Array]'\n}\n\nexport function isError (value: any): value is Error {\n const signature = toStr.call(value)\n // [object XXXError]\n return signature.substr(-6, 5) === 'Error' ||\n (typeof value.message === 'string' && typeof value.name === 'string')\n}\n\n/*\n * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property.\n * The iteratee is invoked with three arguments: (value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning false.\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @return {Object} Returns object.\n */\nexport function forOwn (\n object: {[key: string]: T} | undefined,\n iteratee: ((val: T, key: string, obj: {[key: string]: T}) => boolean | void)\n) {\n object = object || {}\n for (const k in object) {\n if (object.hasOwnProperty(k)) {\n if (iteratee(object[k], k, object) === false) break\n }\n }\n return object\n}\n\nexport function last (arr: T[]): T;\nexport function last (arr: string): string;\nexport function last (arr: any[] | string): any | string {\n return arr[arr.length - 1]\n}\n\n/*\n * Checks if value is the language type of Object.\n * (e.g. arrays, functions, objects, regexes, new Number(0), and new String(''))\n * @param {any} value The value to check.\n * @return {Boolean} Returns true if value is an object, else false.\n */\nexport function isObject (value: any): value is object {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\n/*\n * A function to create flexibly-numbered lists of integers,\n * handy for each and map loops. start, if omitted, defaults to 0; step defaults to 1.\n * Returns a list of integers from start (inclusive) to stop (exclusive),\n * incremented (or decremented) by step, exclusive.\n * Note that ranges that stop before they start are considered to be zero-length instead of\n * negative — if you'd like a negative range, use a negative step.\n */\nexport function range (start: number, stop?: number, step?: number) {\n if (stop === undefined) {\n stop = start\n start = 0\n }\n step = step || 1\n\n const arr: number[] = []\n for (let i = start; i < stop; i += step) {\n arr.push(i)\n }\n return arr\n}\n\nexport function padStart (str: any, length: number, ch: string = ' ') {\n str = String(str)\n let n = length - str.length\n while (n-- > 0) str = ch + str\n return str\n}\n","import * as _ from './underscore'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\n\nabstract class LiquidError extends Error {\n private token: Token\n private originalError: Error\n constructor (err: Error, token: Token) {\n super(err.message)\n this.originalError = err\n this.token = token\n }\n protected update () {\n const err = this.originalError\n const context = mkContext(this.token)\n this.message = mkMessage(err.message, this.token)\n this.stack = this.message + '\\n' + context +\n '\\n' + this.stack + '\\nFrom ' + err.stack\n }\n}\n\nexport class TokenizationError extends LiquidError {\n constructor (message: string, token: Token) {\n super(new Error(message), token)\n this.name = 'TokenizationError'\n super.update()\n }\n}\n\nexport class ParseError extends LiquidError {\n constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'ParseError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderError extends LiquidError {\n constructor (err: Error, tpl: ITemplate) {\n super(err, tpl.token)\n this.name = 'RenderError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderBreakError extends Error {\n resolvedHTML: string = ''\n constructor (message: string) {\n super(message)\n this.name = 'RenderBreakError'\n this.message = message + ''\n }\n}\n\nexport class AssertionError extends Error {\n constructor (message: string) {\n super(message)\n this.name = 'AssertionError'\n this.message = message + ''\n }\n}\n\nfunction mkContext (token: Token) {\n const lines = token.input.split('\\n')\n const begin = Math.max(token.line - 2, 1)\n const end = Math.min(token.line + 3, lines.length)\n\n const context = _\n .range(begin, end + 1)\n .map(lineNumber => {\n const indicator = (lineNumber === token.line) ? '>> ' : ' '\n const num = _.padStart(String(lineNumber), String(end).length)\n const text = lines[lineNumber - 1]\n return `${indicator}${num}| ${text}`\n })\n .join('\\n')\n\n return context\n}\n\nfunction mkMessage (msg: string, token: Token) {\n if (token.file) msg += `, file:${token.file}`\n msg += `, line:${token.line}, col:${token.col}`\n return msg\n}\n","import { AssertionError } from './error'\n\nexport default function (predicate: any, message?: string) {\n if (!predicate) {\n message = message || `expect ${predicate} to be true`\n throw new AssertionError(message)\n }\n}\n","/* eslint-disable camelcase */\n\nimport * as _ from './util/underscore'\n\nexport interface LiquidOptions {\n /** `root` is a directory or an array of directories to resolve layouts and includes, as well as the filename passed in when calling `.renderFile()`. If an array, the files are looked up in the order they occur in the array. Defaults to `[\".\"]` */\n root?: string | string[]\n /** `extname` is used to lookup the template file when filepath doesn't include an extension name. Eg: setting to `\".html\"` will allow including file by basename. Defaults to `\"\"`. */\n extname?: string\n /** `cache` indicates whether or not to cache resolved templates. Defaults to `false`. */\n cache?: boolean\n /** `dynamicPartials`: if set, treat `` parameter in `{%include filepath %}`, `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */\n dynamicPartials?: boolean\n /** `strict_filters` is used to enable strict filter existence. If set to `false`, undefined filters will be rendered as empty string. Otherwise, undefined filters will cause an exception. Defaults to `false`. */\n strict_filters?: boolean\n /** `strict_variables` is used to enable strict variable derivation. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */\n strict_variables?: boolean\n /** `trim_tag_right` is used to strip blank characters (including ` `, `\\t`, and `\\r`) from the right of tags (`{% %}`) until `\\n` (inclusive). Defaults to `false`. */\n trim_tag_right?: boolean\n /** `trim_tag_left` is similar to `trim_tag_right`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trim_tag_left?: boolean\n /** ``trim_output_right` is used to strip blank characters (including ` `, `\\t`, and `\\r`) from the right of values (`{{ }}`) until `\\n` (inclusive). Defaults to `false`. */\n trim_output_right?: boolean\n /** `trim_output_left` is similar to `trim_output_right`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trim_output_left?: boolean\n /** `tag_delimiter_left` and `tag_delimiter_right` are used to override the delimiter for liquid tags **/\n tag_delimiter_left?: string,\n tag_delimiter_right?: string,\n /** `output_delimiter_left` and `output_delimiter_right` are used to override the delimiter for liquid outputs **/\n output_delimiter_left?: string,\n output_delimiter_right?: string,\n /** `greedy` is used to specify whether `trim_left`/`trim_right` is greedy. When set to `true`, all consecutive blank characters including `\\n` will be trimed regardless of line breaks. Defaults to `true`. */\n greedy?: boolean\n}\n\ninterface NormalizedOptions extends LiquidOptions {\n root?: string[]\n}\n\nexport interface NormalizedFullOptions extends NormalizedOptions {\n root: string[]\n extname: string\n cache: boolean\n dynamicPartials: boolean\n strict_filters: boolean\n strict_variables: boolean\n trim_tag_right: boolean\n trim_tag_left: boolean\n trim_output_right: boolean\n trim_output_left: boolean\n tag_delimiter_left: string,\n tag_delimiter_right: string,\n output_delimiter_left: string,\n output_delimiter_right: string,\n greedy: boolean\n}\n\nconst defaultOptions: NormalizedFullOptions = {\n root: ['.'],\n cache: false,\n extname: '',\n dynamicPartials: true,\n trim_tag_right: false,\n trim_tag_left: false,\n trim_output_right: false,\n trim_output_left: false,\n greedy: true,\n tag_delimiter_left: '{%',\n tag_delimiter_right: '%}',\n output_delimiter_left: '{{',\n output_delimiter_right: '}}',\n strict_filters: false,\n strict_variables: false\n}\n\nexport function normalize (options?: LiquidOptions): NormalizedOptions {\n options = options || {}\n if (options.hasOwnProperty('root')) {\n options.root = normalizeStringArray(options.root)\n }\n return options as NormalizedOptions\n}\n\nexport function applyDefault (options?: NormalizedOptions): NormalizedFullOptions {\n return { ...defaultOptions, ...options }\n}\n\nfunction normalizeStringArray (value: any): string[] {\n if (_.isArray(value)) return value as string[]\n if (_.isString(value)) return [value as string]\n return []\n}\n","enum BlockMode {\n /* store rendered html into blocks */\n OUTPUT,\n /* output rendered html directly */\n STORE\n}\n\nexport default BlockMode\n","import * as _ from '../util/underscore'\nimport { __assign } from 'tslib'\nimport assert from '../util/assert'\nimport { NormalizedFullOptions, applyDefault } from '../liquid-options'\nimport BlockMode from './block-mode'\n\nexport type Context = {\n [key: string]: any\n liquid_method_missing?: (key: string) => any // eslint-disable-line\n to_liquid?: () => any // eslint-disable-line\n toLiquid?: () => any // eslint-disable-line\n}\n\nexport default class Scope {\n opts: NormalizedFullOptions\n contexts: Array\n blocks: object = {}\n groups: {[key: string]: number} = {}\n blockMode: BlockMode = BlockMode.OUTPUT\n constructor (ctx: object = {}, opts?: NormalizedFullOptions) {\n this.opts = applyDefault(opts)\n this.contexts = [ctx || {}]\n }\n getAll () {\n return this.contexts.reduce((ctx, val) => __assign(ctx, val), {})\n }\n get (path: string): any {\n const paths = this.propertyAccessSeq(path)\n const scope = this.findContextFor(paths[0]) || _.last(this.contexts)\n return paths.reduce((value, key) => this.readProperty(value, key), scope)\n }\n set (path: string, v: any): void {\n const paths = this.propertyAccessSeq(path)\n let scope = this.findContextFor(paths[0]) || _.last(this.contexts)\n paths.some((key, i) => {\n if (!_.isObject(scope)) {\n return true\n }\n if (i === paths.length - 1) {\n scope[key] = v\n return true\n }\n if (undefined === scope[key]) {\n scope[key] = {}\n }\n scope = scope[key]\n return false\n })\n }\n unshift (ctx: object) {\n return this.contexts.unshift(ctx)\n }\n push (ctx: object) {\n return this.contexts.push(ctx)\n }\n pop (ctx?: object): object | undefined {\n if (!arguments.length) {\n return this.contexts.pop()\n }\n const i = this.contexts.findIndex(scope => scope === ctx)\n if (i === -1) {\n throw new TypeError('scope not found, cannot pop')\n }\n return this.contexts.splice(i, 1)[0]\n }\n findContextFor (key: string, filter: ((conttext: object) => boolean) = () => true) {\n for (let i = this.contexts.length - 1; i >= 0; i--) {\n const candidate = this.contexts[i]\n if (!filter(candidate)) continue\n if (key in candidate) {\n return candidate\n }\n }\n return null\n }\n private readProperty (obj: Context, key: string) {\n let val\n if (_.isNil(obj)) {\n val = obj\n } else {\n obj = toLiquid(obj)\n val = key === 'size' ? readSize(obj) : obj[key]\n if (_.isFunction(obj.liquid_method_missing)) {\n val = obj.liquid_method_missing!(key)\n }\n }\n if (_.isNil(val) && this.opts.strict_variables) {\n throw new TypeError(`undefined variable: ${key}`)\n }\n return val\n }\n\n /*\n * Parse property access sequence from access string\n * @example\n * accessSeq(\"foo.bar\") // ['foo', 'bar']\n * accessSeq(\"foo['bar']\") // ['foo', 'bar']\n * accessSeq(\"foo['b]r']\") // ['foo', 'b]r']\n * accessSeq(\"foo[bar.coo]\") // ['foo', 'bar'], for bar.coo == 'bar'\n */\n propertyAccessSeq (str: string) {\n str = String(str)\n const seq: string[] = []\n let name = ''\n let j\n let i = 0\n while (i < str.length) {\n switch (str[i]) {\n case '[':\n push()\n\n const delemiter = str[i + 1]\n if (/['\"]/.test(delemiter)) { // foo[\"bar\"]\n j = str.indexOf(delemiter, i + 2)\n assert(j !== -1, `unbalanced ${delemiter}: ${str}`)\n name = str.slice(i + 2, j)\n push()\n i = j + 2\n } else { // foo[bar.coo]\n j = matchRightBracket(str, i + 1)\n assert(j !== -1, `unbalanced []: ${str}`)\n name = str.slice(i + 1, j)\n if (!/^[+-]?\\d+$/.test(name)) { // foo[bar] vs. foo[1]\n name = String(this.get(name))\n }\n push()\n i = j + 1\n }\n break\n case '.':// foo.bar, foo[0].bar\n push()\n i++\n break\n default:// foo.bar\n name += str[i]\n i++\n }\n }\n push()\n\n if (!seq.length) {\n throw new TypeError(`invalid path:\"${str}\"`)\n }\n return seq\n\n function push () {\n if (name.length) seq.push(name)\n name = ''\n }\n }\n}\n\nfunction toLiquid (obj: Context) {\n if (_.isFunction(obj.to_liquid)) {\n return obj.to_liquid()\n }\n if (_.isFunction(obj.toLiquid)) {\n return obj.toLiquid()\n }\n return obj\n}\n\nfunction readSize (obj: Context) {\n if (!_.isNil(obj.size)) return obj.size\n if (_.isArray(obj) || _.isString(obj)) return obj.length\n return obj.size\n}\n\nfunction matchRightBracket (str: string, begin: number) {\n let stack = 1 // count of '[' - count of ']'\n for (let i = begin; i < str.length; i++) {\n if (str[i] === '[') {\n stack++\n }\n if (str[i] === ']') {\n stack--\n if (stack === 0) {\n return i\n }\n }\n }\n return -1\n}\n","export class CaptureScope {}\nexport class AssignScope {}\nexport class IncrementScope {}\nexport class DecrementScope {}\n","import { last } from '../util/underscore'\nimport IFS from './ifs'\n\nfunction domResolve (root: string, path: string) {\n const base = document.createElement('base')\n base.href = root\n\n const head = document.getElementsByTagName('head')[0]\n head.insertBefore(base, head.firstChild)\n\n const a = document.createElement('a')\n a.href = path\n const resolved = a.href\n head.removeChild(base)\n\n return resolved\n}\n\nfunction resolve (root: string, filepath: string, ext: string) {\n if (root.length && last(root) !== '/') root += '/'\n const url = domResolve(root, filepath)\n return url.replace(/^(\\w+:\\/\\/[^/]+)(\\/[^?]+)/, (str, origin, path) => {\n const last = path.split('/').pop()\n if (/\\.\\w+$/.test(last)) return str\n return origin + path + ext\n })\n}\n\nasync function readFile (url: string): Promise {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText as string)\n } else {\n reject(new Error(xhr.statusText))\n }\n }\n xhr.onerror = () => {\n reject(new Error('An error occurred whilst receiving the response.'))\n }\n xhr.open('GET', url)\n xhr.send()\n })\n}\n\nasync function exists () {\n return true\n}\n\nexport default { readFile, resolve, exists } as IFS\n","import DelimitedToken from 'src/parser/delimited-token'\nimport Token from 'src/parser/token'\nimport TagToken from 'src/parser/tag-token'\nimport { NormalizedFullOptions } from 'src/liquid-options'\n\nexport default function whiteSpaceCtrl (tokens: Token[], options: NormalizedFullOptions) {\n options = { greedy: true, ...options }\n let inRaw = false\n\n tokens.forEach((token: Token, i: number) => {\n if (shouldTrimLeft(token as DelimitedToken, inRaw, options)) {\n trimLeft(tokens[i - 1], options.greedy)\n }\n\n if (token.type === 'tag' && (token as TagToken).name === 'raw') inRaw = true\n if (token.type === 'tag' && (token as TagToken).name === 'endraw') inRaw = false\n\n if (shouldTrimRight(token as DelimitedToken, inRaw, options)) {\n trimRight(tokens[i + 1], options.greedy)\n }\n })\n}\n\nfunction shouldTrimLeft (token: DelimitedToken, inRaw: boolean, options: NormalizedFullOptions) {\n if (inRaw) return false\n if (token.type === 'tag') return token.trimLeft || options.trim_tag_left\n if (token.type === 'output') return token.trimLeft || options.trim_output_left\n}\n\nfunction shouldTrimRight (token: DelimitedToken, inRaw: boolean, options: NormalizedFullOptions) {\n if (inRaw) return false\n if (token.type === 'tag') return token.trimRight || options.trim_tag_right\n if (token.type === 'output') return token.trimRight || options.trim_output_right\n}\n\nfunction trimLeft (token: Token, greedy: boolean) {\n if (!token || token.type !== 'html') return\n\n const rLeft = greedy ? /\\s+$/g : /[\\t\\r ]*$/g\n token.value = token.value.replace(rLeft, '')\n}\n\nfunction trimRight (token: Token, greedy: boolean) {\n if (!token || token.type !== 'html') return\n\n const rRight = greedy ? /^\\s+/g : /^[\\t\\r ]*\\n?/g\n token.value = token.value.replace(rRight, '')\n}\n","export default class Token {\n type: string = 'notset'\n line: number\n col: number\n raw: string\n input: string\n file?: string\n value: string\n constructor (raw: string, input: string, line: number, col: number, file?: string) {\n this.col = col\n this.line = line\n this.raw = raw\n this.value = raw\n this.input = input\n this.file = file\n }\n}\n","import Token from './token'\n\nexport default class HTMLToken extends Token {\n constructor (str: string, input: string, line: number, col: number, file?: string) {\n super(str, input, line, col, file)\n this.type = 'html'\n this.value = str\n }\n}\n","import Token from './token'\nimport { last } from 'src/util/underscore'\n\nexport default class DelimitedToken extends Token {\n trimLeft: boolean\n trimRight: boolean\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, input, line, pos, file)\n this.trimLeft = value[0] === '-'\n this.trimRight = last(value) === '-'\n this.value = value\n .slice(\n this.trimLeft ? 1 : 0,\n this.trimRight ? -1 : value.length\n )\n .trim()\n }\n}\n","// quote related\nconst singleQuoted = /'[^']*'/\nconst doubleQuoted = /\"[^\"]*\"/\nexport const quoted = new RegExp(`${singleQuoted.source}|${doubleQuoted.source}`)\nexport const quoteBalanced = new RegExp(`(?:${quoted.source}|[^'\"])*`)\n\n// basic types\nexport const number = /[+-]?(?:\\d+\\.?\\d*|\\.?\\d+)/\nexport const bool = /true|false/\n\n// property access\nexport const identifier = /[\\w-]+[?]?/\nexport const subscript = new RegExp(`\\\\[(?:${quoted.source}|[\\\\w-\\\\.]+)\\\\]`)\nexport const literal = new RegExp(`(?:${quoted.source}|${bool.source}|${number.source})`)\nexport const variable = new RegExp(`${identifier.source}(?:\\\\.${identifier.source}|${subscript.source})*`)\n\n// range related\nexport const rangeLimit = new RegExp(`(?:${variable.source}|${number.source})`)\nexport const range = new RegExp(`\\\\(${rangeLimit.source}\\\\.\\\\.${rangeLimit.source}\\\\)`)\nexport const rangeCapture = new RegExp(`\\\\((${rangeLimit.source})\\\\.\\\\.(${rangeLimit.source})\\\\)`)\n\nexport const value = new RegExp(`(?:${variable.source}|${literal.source}|${range.source})`)\n\n// hash related\nexport const hash = new RegExp(`(?:${identifier.source})\\\\s*:\\\\s*(?:${value.source})`)\nexport const hashCapture = new RegExp(`(${identifier.source})\\\\s*:\\\\s*(${value.source})`, 'g')\n\n// full match\nexport const tagLine = new RegExp(`^\\\\s*(${identifier.source})\\\\s*([\\\\s\\\\S]*?)\\\\s*$`)\nexport const numberLine = new RegExp(`^${number.source}$`)\nexport const boolLine = new RegExp(`^${bool.source}$`, 'i')\nexport const quotedLine = new RegExp(`^${quoted.source}$`)\nexport const rangeLine = new RegExp(`^${rangeCapture.source}$`)\n\nexport const operators = [\n /\\s+or\\s+/,\n /\\s+and\\s+/,\n /==|!=|<=|>=|<|>|\\s+contains\\s+/\n]\n\nexport function isRange (str: string) {\n return rangeLine.test(str)\n}\n","import DelimitedToken from './delimited-token'\nimport { TokenizationError } from 'src/util/error'\nimport * as lexical from './lexical'\n\nexport default class TagToken extends DelimitedToken {\n name: string\n args: string\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, value, input, line, pos, file)\n this.type = 'tag'\n const match = this.value.match(lexical.tagLine)\n if (!match) {\n throw new TokenizationError(`illegal tag syntax`, this)\n }\n this.name = match[1]\n this.args = match[2]\n }\n}\n","import DelimitedToken from './delimited-token'\n\nexport default class OutputToken extends DelimitedToken {\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, value, input, line, pos, file)\n this.type = 'output'\n }\n}\n","import whiteSpaceCtrl from './whitespace-ctrl'\nimport HTMLToken from './html-token'\nimport TagToken from './tag-token'\nimport Token from './token'\nimport OutputToken from './output-token'\nimport { TokenizationError } from 'src/util/error'\nimport { NormalizedFullOptions, applyDefault } from '../liquid-options'\n\nenum ParseState { HTML, OUTPUT, TAG }\n\nexport default class Tokenizer {\n options: NormalizedFullOptions\n constructor (options?: NormalizedFullOptions) {\n this.options = applyDefault(options)\n }\n tokenize (input: string, file?: string) {\n const tokens: Token[] = []\n const tagL = this.options.tag_delimiter_left\n const tagR = this.options.tag_delimiter_right\n const outputL = this.options.output_delimiter_left\n const outputR = this.options.output_delimiter_right\n let p = 0\n let curLine = 1\n let state = ParseState.HTML\n let buffer = ''\n let lineBegin = 0\n let line = 1\n let col = 1\n\n while (p < input.length) {\n if (input[p] === '\\n') {\n curLine++\n lineBegin = p + 1\n }\n if (state === ParseState.HTML) {\n if (input.substr(p, outputL.length) === outputL) {\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n buffer = outputL\n line = curLine\n col = p - lineBegin + 1\n p += outputL.length\n state = ParseState.OUTPUT\n continue\n } else if (input.substr(p, tagL.length) === tagL) {\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n buffer = tagL\n line = curLine\n col = p - lineBegin + 1\n p += tagL.length\n state = ParseState.TAG\n continue\n }\n } else if (state === ParseState.OUTPUT && input.substr(p, outputR.length) === outputR) {\n buffer += outputR\n tokens.push(new OutputToken(buffer, buffer.slice(outputL.length, -outputR.length), input, line, col, file))\n p += outputR.length\n buffer = ''\n line = curLine\n col = p - lineBegin + 1\n state = ParseState.HTML\n continue\n } else if (input.substr(p, tagR.length) === tagR) {\n buffer += tagR\n tokens.push(new TagToken(buffer, buffer.slice(tagL.length, -tagR.length), input, line, col, file))\n p += tagR.length\n buffer = ''\n line = curLine\n col = p - lineBegin + 1\n state = ParseState.HTML\n continue\n }\n buffer += input[p++]\n }\n if (state !== ParseState.HTML) {\n const t = state === ParseState.OUTPUT ? 'output' : 'tag'\n const str = buffer.length > 16 ? buffer.slice(0, 13) + '...' : buffer\n throw new TokenizationError(\n `${t} \"${str}\" not closed`,\n new Token(buffer, input, line, col, file)\n )\n }\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n\n whiteSpaceCtrl(tokens, this.options)\n return tokens\n }\n}\n","import { RenderError } from 'src/util/error'\nimport assert from 'src/util/assert'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\n\nexport default class Render {\n async renderTemplates (templates: ITemplate[], scope: Scope) {\n assert(scope, 'unable to evalTemplates: scope undefined')\n\n let html = ''\n for (const tpl of templates) {\n try {\n html += await tpl.render(scope)\n } catch (e) {\n if (e.name === 'RenderBreakError') {\n e.resolvedHTML = html\n throw e\n }\n throw e.name === 'RenderError' ? e : new RenderError(e, tpl)\n }\n }\n return html\n }\n}\n","import { isFunction } from 'src/util/underscore'\n\nexport interface IComparable {\n equals: (rhs: any) => boolean\n gt: (rhs: any) => boolean\n geq: (rhs: any) => boolean\n lt: (rhs: any) => boolean\n leq: (rhs: any) => boolean\n}\n\nexport function isComparable (arg: any): arg is IComparable {\n return arg && isFunction(arg.equals)\n}\n","export abstract class Drop {\n}\n","import { Drop } from './drop'\nimport { isFunction } from 'src/util/underscore'\n\nexport interface IDrop {\n value(): any\n}\n\nexport function isDrop (value: any): value is IDrop {\n return value instanceof Drop && isFunction((value as any).value)\n}\n","import { Drop } from './drop'\nimport { IComparable } from './icomparable'\nimport { isObject, isString, isArray } from 'src/util/underscore'\nimport { IDrop } from 'src/drop/idrop'\n\nexport class EmptyDrop extends Drop implements IDrop, IComparable {\n equals (value: any) {\n if (isString(value) || isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n }\n gt () {\n return false\n }\n geq () {\n return false\n }\n lt () {\n return false\n }\n leq () {\n return false\n }\n value () {\n return ''\n }\n}\n","import { isNil, isString } from 'src/util/underscore'\nimport { isDrop } from 'src/drop/idrop'\nimport { EmptyDrop } from 'src/drop/empty-drop'\n\nexport class BlankDrop extends EmptyDrop {\n equals (value: any) {\n if (value === false) return true\n if (isNil(isDrop(value) ? value.value() : value)) return true\n if (isString(value)) return /^\\s*$/.test(value)\n return super.equals(value)\n }\n}\n","import { Drop } from './drop'\nimport { IComparable } from './icomparable'\nimport { isNil } from 'src/util/underscore'\nimport { IDrop, isDrop } from 'src/drop/idrop'\nimport { BlankDrop } from 'src/drop/blank-drop'\n\nexport class NullDrop extends Drop implements IDrop, IComparable {\n equals (value: any) {\n return isNil(isDrop(value) ? value.value() : value) || value instanceof BlankDrop\n }\n gt () {\n return false\n }\n geq () {\n return false\n }\n lt () {\n return false\n }\n leq () {\n return false\n }\n value () {\n return null\n }\n}\n","import * as lexical from '../parser/lexical'\nimport assert from '../util/assert'\nimport Scope from 'src/scope/scope'\nimport { range, last } from 'src/util/underscore'\nimport { isComparable } from 'src/drop/icomparable'\nimport { NullDrop } from 'src/drop/null-drop'\nimport { EmptyDrop } from 'src/drop/empty-drop'\nimport { BlankDrop } from 'src/drop/blank-drop'\nimport { isDrop } from 'src/drop/idrop'\n\nconst binaryOperators: {[key: string]: (lhs: any, rhs: any) => boolean} = {\n '==': (l: any, r: any) => {\n if (isComparable(l)) return l.equals(r)\n if (isComparable(r)) return r.equals(l)\n return l === r\n },\n '!=': (l: any, r: any) => {\n if (isComparable(l)) return !l.equals(r)\n if (isComparable(r)) return !r.equals(l)\n return l !== r\n },\n '>': (l: any, r: any) => {\n if (isComparable(l)) return l.gt(r)\n if (isComparable(r)) return r.lt(l)\n return l > r\n },\n '<': (l: any, r: any) => {\n if (isComparable(l)) return l.lt(r)\n if (isComparable(r)) return r.gt(l)\n return l < r\n },\n '>=': (l: any, r: any) => {\n if (isComparable(l)) return l.geq(r)\n if (isComparable(r)) return r.leq(l)\n return l >= r\n },\n '<=': (l: any, r: any) => {\n if (isComparable(l)) return l.leq(r)\n if (isComparable(r)) return r.geq(l)\n return l <= r\n },\n 'contains': (l: any, r: any) => {\n if (!l) return false\n if (typeof l.indexOf !== 'function') return false\n return l.indexOf(r) > -1\n },\n 'and': (l: any, r: any) => isTruthy(l) && isTruthy(r),\n 'or': (l: any, r: any) => isTruthy(l) || isTruthy(r)\n}\n\nexport function parseExp (exp: string, scope: Scope): any {\n assert(scope, 'unable to parseExp: scope undefined')\n const operatorREs = lexical.operators\n let match\n for (let i = 0; i < operatorREs.length; i++) {\n const operatorRE = operatorREs[i]\n const expRE = new RegExp(`^(${lexical.quoteBalanced.source})(${operatorRE.source})(${lexical.quoteBalanced.source})$`)\n if ((match = exp.match(expRE))) {\n const l = parseExp(match[1], scope)\n const op = binaryOperators[match[2].trim()]\n const r = parseExp(match[3], scope)\n return op(l, r)\n }\n }\n\n if ((match = exp.match(lexical.rangeLine))) {\n const low = parseValue(match[1], scope)\n const high = parseValue(match[2], scope)\n return range(low, high + 1)\n }\n\n return parseValue(exp, scope)\n}\n\nexport function evalExp (str: string, scope: Scope): any {\n const value = parseExp(str, scope)\n return isDrop(value) ? value.value() : value\n}\n\nfunction parseValue (str: string, scope: Scope): any {\n if (!str) return null\n str = str.trim()\n\n if (str === 'true') return true\n if (str === 'false') return false\n if (str === 'nil' || str === 'null') return new NullDrop()\n if (str === 'empty') return new EmptyDrop()\n if (str === 'blank') return new BlankDrop()\n if (!isNaN(Number(str))) return Number(str)\n if ((str[0] === '\"' || str[0] === \"'\") && str[0] === last(str)) return str.slice(1, -1)\n return scope.get(str)\n}\n\nexport function evalValue (str: string, scope: Scope): any {\n const value = parseValue(str, scope)\n return isDrop(value) ? value.value() : value\n}\n\nexport function isTruthy (val: any): boolean {\n return !isFalsy(val)\n}\n\nexport function isFalsy (val: any): boolean {\n return val === false || undefined === val || val === null\n}\n","import { hashCapture } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport Scope from 'src/scope/scope'\n\n/**\n * Key-Value Pairs Representing Tag Arguments\n * Example:\n * For the markup `{% include 'head.html' foo='bar' %}`,\n * hash['foo'] === 'bar'\n */\nexport default class Hash {\n [key: string]: any\n constructor (markup: string, scope: Scope) {\n let match\n hashCapture.lastIndex = 0\n while ((match = hashCapture.exec(markup))) {\n const k = match[1]\n const v = match[2]\n this[k] = evalValue(v, scope)\n }\n }\n}\n","export default abstract class Template {\n token: T;\n constructor (token: T) {\n this.token = token\n }\n}\n","import { create, stringify } from 'src/util/underscore'\nimport assert from 'src/util/assert'\nimport Scope from 'src/scope/scope'\nimport ITagImpl from './itag-impl'\nimport ITagImplOptions from './itag-impl-options'\nimport Liquid from 'src/liquid'\nimport Hash from './hash'\nimport Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\n\nexport default class Tag extends Template implements ITemplate {\n name: string\n private impl: ITagImpl\n static impls: { [key: string]: ITagImplOptions } = {}\n\n constructor (token: TagToken, tokens: Token[], liquid: Liquid) {\n super(token)\n this.name = token.name\n\n const impl = Tag.impls[token.name]\n assert(impl, `tag ${token.name} not found`)\n this.impl = create(impl)\n this.impl.liquid = liquid\n if (this.impl.parse) {\n this.impl.parse(token, tokens)\n }\n }\n async render (scope: Scope) {\n const hash = new Hash(this.token.args, scope)\n const impl = this.impl\n if (typeof impl.render !== 'function') {\n return ''\n }\n const html = await impl.render(scope, hash)\n return stringify(html)\n }\n static register (name: string, tag: ITagImplOptions) {\n Tag.impls[name] = tag\n }\n static clear () {\n Tag.impls = {}\n }\n}\n","import { evalValue } from 'src/render/syntax'\nimport Scope from 'src/scope/scope'\nimport { FilterImpl } from './filter-impl'\n\nexport default class Filter {\n name: string\n impl: FilterImpl\n args: string[]\n private static impls: {[key: string]: FilterImpl} = {}\n\n constructor (name: string, args: string[], strictFilters: boolean) {\n const impl = Filter.impls[name]\n if (!impl && strictFilters) throw new TypeError(`undefined filter: ${name}`)\n\n this.name = name\n this.impl = impl || (x => x)\n this.args = args\n }\n render (value: any, scope: Scope): any {\n const args = this.args.map(arg => evalValue(arg, scope))\n return this.impl.apply(null, [value, ...args])\n }\n static register (name: string, filter: FilterImpl) {\n Filter.impls[name] = filter\n }\n static clear () {\n Filter.impls = {}\n }\n}\n","import Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport TagToken from './tag-token'\n\ntype ParseToken = ((token: Token, remainTokens: Array) => ITemplate)\n\nexport default class ParseStream {\n private tokens: Array\n private handlers: {[key: string]: (arg: any) => void} = {}\n private stopRequested: boolean = false\n private parseToken: ParseToken\n\n constructor (tokens: Array, parseToken: ParseToken) {\n this.tokens = tokens\n this.parseToken = parseToken\n }\n on (name: string, cb: (arg: T) => void): ParseStream {\n this.handlers[name] = cb\n return this\n }\n trigger (event: string, arg?: T) {\n const h = this.handlers[event]\n if (typeof h === 'function') {\n h(arg)\n return true\n }\n return false\n }\n start () {\n this.trigger('start')\n let token: Token | undefined\n while (!this.stopRequested && (token = this.tokens.shift())) {\n if (this.trigger('token', token)) continue\n if (token.type === 'tag' && this.trigger(`tag:${(token).name}`, token)) {\n continue\n }\n const template = this.parseToken(token, this.tokens)\n this.trigger('template', template)\n }\n if (!this.stopRequested) this.trigger('end')\n return this\n }\n stop () {\n this.stopRequested = true\n return this\n }\n}\n","import { evalExp } from 'src/render/syntax'\nimport Filter from './filter/filter'\nimport Scope from 'src/scope/scope'\n\nenum ParseState {\n INIT = 0,\n FILTER_NAME = 1,\n FILTER_ARG = 2\n}\n\nexport default class {\n initial: any\n filters: Array = []\n\n /**\n * @param str value string, like: \"i have a dream | truncate: 3\n */\n constructor (str: string, strictFilters: boolean) {\n let buffer = ''\n let quoted = ''\n let state = ParseState.INIT\n let sealed = false\n\n let filterName = ''\n let filterArgs: string[] = []\n\n for (let i = 0; i < str.length; i++) {\n if (quoted) {\n if (str[i] === quoted) {\n quoted = ''\n sealed = true\n }\n buffer += str[i]\n } else if (/\\s/.test(str[i])) {\n if (!buffer) continue\n else sealed = true\n } else if (str[i] === '|') {\n if (state === ParseState.INIT) {\n this.initial = buffer\n } else {\n if (state === ParseState.FILTER_NAME) filterName = buffer\n else filterArgs.push(buffer)\n this.filters.push(new Filter(filterName, filterArgs, strictFilters))\n filterName = ''\n filterArgs = []\n }\n state = ParseState.FILTER_NAME\n buffer = ''\n sealed = false\n } else if (state === ParseState.FILTER_NAME && str[i] === ':') {\n filterName = buffer\n state = ParseState.FILTER_ARG\n buffer = ''\n sealed = false\n } else if (state === ParseState.FILTER_ARG && str[i] === ',') {\n filterArgs.push(buffer)\n buffer = ''\n sealed = false\n } else if (sealed) continue\n else {\n if ((str[i] === '\"' || str[i] === \"'\") && !quoted) quoted = str[i]\n buffer += str[i]\n }\n }\n\n if (buffer) {\n if (state === ParseState.INIT) this.initial = buffer\n else if (state === ParseState.FILTER_NAME) this.filters.push(new Filter(buffer, [], strictFilters))\n else {\n filterArgs.push(buffer)\n this.filters.push(new Filter(filterName, filterArgs, strictFilters))\n }\n }\n }\n value (scope: Scope) {\n return this.filters.reduce(\n (prev, filter) => filter.render(prev, scope),\n evalExp(this.initial, scope))\n }\n}\n","import Value from './value'\nimport { stringify } from 'src/util/underscore'\nimport Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport OutputToken from 'src/parser/output-token'\n\nexport default class Output extends Template implements ITemplate {\n value: Value\n constructor (token: OutputToken, strictFilters: boolean) {\n super(token)\n this.value = new Value(token.value, strictFilters)\n }\n async render (scope: Scope): Promise {\n const html = await this.value.value(scope)\n return stringify(html)\n }\n}\n","import Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport HTMLToken from 'src/parser/html-token'\n\nexport default class extends Template implements ITemplate {\n str: string\n constructor (token: HTMLToken) {\n super(token)\n this.str = token.value\n }\n async render (): Promise {\n return this.str\n }\n}\n","import { ParseError } from '../util/error'\nimport Liquid from 'src/liquid'\nimport ParseStream from './parse-stream'\nimport Token from './token'\nimport TagToken from './tag-token'\nimport OutputToken from './output-token'\nimport Tag from 'src/template/tag/tag'\nimport Output from 'src/template/output'\nimport HTML from 'src/template/html'\nimport ITemplate from 'src/template/itemplate'\n\nexport default class Parser {\n liquid: Liquid\n\n constructor (liquid: Liquid) {\n this.liquid = liquid\n }\n parse (tokens: Array) {\n let token\n const templates: ITemplate[] = []\n while ((token = tokens.shift())) {\n templates.push(this.parseToken(token, tokens))\n }\n return templates\n }\n parseToken (token: Token, remainTokens: Array) {\n try {\n if (token.type === 'tag') {\n return new Tag(token as TagToken, remainTokens, this.liquid)\n }\n if (token.type === 'output') {\n return new Output(token as OutputToken, this.liquid.options.strict_filters)\n }\n return new HTML(token)\n } catch (e) {\n throw new ParseError(e, token)\n }\n }\n parseStream (tokens: Array) {\n return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens))\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { AssignScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst re = new RegExp(`(${identifier.source})\\\\s*=([^]*)`)\n\nexport default {\n parse: function (token: TagToken) {\n const match = token.args.match(re) as RegExpMatchArray\n assert(match, `illegal token ${token.raw}`)\n this.key = match[1]\n this.value = match[2]\n },\n render: function (scope: Scope) {\n const ctx = new AssignScope()\n ctx[this.key] = this.liquid.evalValue(this.value, scope)\n scope.push(ctx)\n return Promise.resolve('')\n }\n} as ITagImplOptions\n","/*\n * Call functions in serial until someone rejected.\n * @param {Array} iterable the array to iterate with.\n * @param {Array} iteratee returns a new promise.\n * The iteratee is invoked with three arguments: (value, index, iterable).\n */\nexport function mapSeries (\n iterable: T1[],\n iteratee: (item: T1, idx: number, iterable: T1[]) => Promise | T2\n): Promise {\n let ret = Promise.resolve(0)\n const result: T2[] = []\n iterable.forEach(function (item, idx) {\n ret = ret\n .then(() => iteratee(item, idx, iterable))\n .then(x => result.push(x))\n })\n return ret.then(() => result)\n}\n","import { mapSeries } from 'src/util/promise'\nimport { isString, isObject, isArray } from 'src/util/underscore'\nimport { evalExp } from 'src/render/syntax'\nimport assert from 'src/util/assert'\nimport { identifier, value, hash } from 'src/parser/lexical'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nconst re = new RegExp(`^(${identifier.source})\\\\s+in\\\\s+` +\n `(${value.source})` +\n `(?:\\\\s+${hash.source})*` +\n `(?:\\\\s+(reversed))?` +\n `(?:\\\\s+${hash.source})*$`)\n\nexport default {\n type: 'block',\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = re.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n this.variable = match[1]\n this.collection = match[2]\n this.reversed = !!match[3]\n\n this.templates = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endfor', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n render: async function (scope: Scope, hash: Hash) {\n let collection = evalExp(this.collection, scope)\n\n if (!isArray(collection)) {\n if (isString(collection) && collection.length > 0) {\n collection = [collection] as string[]\n } else if (isObject(collection)) {\n collection = Object.keys(collection).map((key) => [key, collection[key]]) as Array<[string, any]>\n }\n }\n if (!isArray(collection) || !collection.length) {\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n\n const offset = hash.offset || 0\n const limit = (hash.limit === undefined) ? collection.length : hash.limit\n\n collection = collection.slice(offset, offset + limit)\n if (this.reversed) collection.reverse()\n\n const contexts = collection.map((item: string, i: number) => {\n const ctx = {}\n ctx[this.variable] = item\n ctx['forloop'] = {\n first: i === 0,\n index: i + 1,\n index0: i,\n last: i === collection.length - 1,\n length: collection.length,\n rindex: collection.length - i,\n rindex0: collection.length - i - 1\n }\n return ctx\n })\n\n let html = ''\n let finished = false\n await mapSeries(contexts, async context => {\n if (finished) return\n\n scope.push(context)\n try {\n html += await this.liquid.renderer.renderTemplates(this.templates, scope)\n } catch (e) {\n if (e.name === 'RenderBreakError') {\n html += e.resolvedHTML\n if (e.message === 'break') {\n finished = true\n }\n } else throw e\n }\n scope.pop(context)\n })\n return html\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst re = new RegExp(`(${identifier.source})`)\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = tagToken.args.match(re) as RegExpMatchArray\n assert(match, `${tagToken.args} not valid identifier`)\n\n this.variable = match[1]\n this.templates = []\n\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream.on('tag:endcapture', () => stream.stop())\n .on('template', (tpl) => this.templates.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n },\n render: async function (scope: Scope) {\n const html = await this.liquid.renderer.renderTemplates(this.templates, scope)\n const ctx = new CaptureScope()\n ctx[this.variable] = html\n scope.push(ctx)\n }\n} as ITagImplOptions\n","import { evalExp } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.cond = tagToken.args\n this.cases = []\n this.elseTemplates = []\n\n let p: ITemplate[] = []\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('tag:when', (token: TagToken) => {\n this.cases.push({\n val: token.args,\n templates: p = []\n })\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endcase', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n for (let i = 0; i < this.cases.length; i++) {\n const branch = this.cases[i]\n const val = evalExp(branch.val, scope)\n const cond = evalExp(this.cond, scope)\n if (val === cond) {\n return this.liquid.renderer.renderTemplates(branch.templates, scope)\n }\n }\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream\n .on('token', (token: TagToken) => {\n if (token.name === 'endcomment') stream.stop()\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value, quotedLine } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst staticFileRE = /[^\\s,]+/\nconst withRE = new RegExp(`with\\\\s+(${value.source})`)\n\nexport default {\n parse: function (token: TagToken) {\n let match = staticFileRE.exec(token.args)\n if (match) {\n this.staticValue = match[0]\n }\n\n match = value.exec(token.args)\n if (match) {\n this.value = match[0]\n }\n\n match = withRE.exec(token.args)\n if (match) {\n this.with = match[1]\n }\n },\n render: async function (scope: Scope, hash: Hash) {\n let filepath\n if (scope.opts.dynamicPartials) {\n if (quotedLine.exec(this.value)) {\n const template = this.value.slice(1, -1)\n filepath = await this.liquid.parseAndRender(template, scope.getAll(), scope.opts)\n } else {\n filepath = evalValue(this.value, scope)\n }\n } else {\n filepath = this.staticValue\n }\n assert(filepath, `cannot include with empty filename`)\n\n const originBlocks = scope.blocks\n const originBlockMode = scope.blockMode\n\n scope.blocks = {}\n scope.blockMode = BlockMode.OUTPUT\n if (this.with) {\n hash[filepath] = evalValue(this.with, scope)\n }\n const templates = await this.liquid.getTemplate(filepath, scope.opts)\n scope.push(hash)\n const html = await this.liquid.renderer.renderTemplates(templates, scope)\n scope.pop(hash)\n scope.blocks = originBlocks\n scope.blockMode = originBlockMode\n return html\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope, AssignScope, DecrementScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (token: TagToken) {\n const match = token.args.match(identifier) as RegExpMatchArray\n assert(match, `illegal identifier ${token.args}`)\n this.variable = match[0]\n },\n render: function (scope: Scope) {\n let context = scope.findContextFor(\n this.variable,\n ctx => {\n return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope)\n }\n )\n if (!context) {\n context = new DecrementScope()\n scope.unshift(context)\n }\n if (typeof context[this.variable] !== 'number') {\n context[this.variable] = 0\n }\n return --context[this.variable]\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value as rValue } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst groupRE = new RegExp(`^(?:(${rValue.source})\\\\s*:\\\\s*)?(.*)$`)\nconst candidatesRE = new RegExp(rValue.source, 'g')\n\nexport default {\n parse: function (tagToken: TagToken) {\n let match: RegExpExecArray | null = groupRE.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n\n this.group = match[1] || ''\n const candidates = match[2]\n\n this.candidates = []\n\n while ((match = candidatesRE.exec(candidates))) {\n this.candidates.push(match[0])\n }\n assert(this.candidates.length, `empty candidates: ${tagToken.raw}`)\n },\n\n render: function (scope: Scope) {\n const group = evalValue(this.group, scope)\n const fingerprint = `cycle:${group}:` + this.candidates.join(',')\n const groups = scope.groups\n let idx = groups[fingerprint]\n\n if (idx === undefined) {\n idx = groups[fingerprint] = 0\n }\n\n const candidate = this.candidates[idx]\n idx = (idx + 1) % this.candidates.length\n groups[fingerprint] = idx\n\n return evalValue(candidate, scope)\n }\n}\n","import { evalExp, isTruthy } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.branches = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n cond: tagToken.args,\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n this.branches.push({\n cond: token.args,\n templates: p = []\n })\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endif', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n for (const branch of this.branches) {\n const cond = evalExp(branch.cond, scope)\n if (isTruthy(cond)) {\n return this.liquid.renderer.renderTemplates(branch.templates, scope)\n }\n }\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope, AssignScope, IncrementScope } from 'src/scope/scopes'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (token) {\n const match = token.args.match(identifier)\n assert(match, `illegal identifier ${token.args}`)\n this.variable = match![0]\n },\n render: function (scope) {\n let context = scope.findContextFor(\n this.variable,\n ctx => {\n return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope)\n }\n )\n if (!context) {\n context = new IncrementScope()\n scope.unshift(context)\n }\n if (typeof context[this.variable] !== 'number') {\n context[this.variable] = 0\n }\n const val = context[this.variable]\n context[this.variable]++\n return val\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value as rValue } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst staticFileRE = /\\S+/\n\nexport default {\n parse: function (token: TagToken, remainTokens: Token[]) {\n let match = staticFileRE.exec(token.args)\n if (match) {\n this.staticLayout = match[0]\n }\n\n match = rValue.exec(token.args)\n if (match) {\n this.layout = match[0]\n }\n\n this.tpls = this.liquid.parser.parse(remainTokens)\n },\n render: async function (scope: Scope, hash: Hash) {\n const layout = scope.opts.dynamicPartials\n ? evalValue(this.layout, scope)\n : this.staticLayout\n assert(layout, `cannot apply layout with empty filename`)\n\n // render the remaining tokens immediately\n scope.blockMode = BlockMode.STORE\n const html = await this.liquid.renderer.renderTemplates(this.tpls, scope)\n if (scope.blocks[''] === undefined) {\n scope.blocks[''] = html\n }\n const templates = await this.liquid.getTemplate(layout, scope.opts)\n scope.push(hash)\n scope.blockMode = BlockMode.OUTPUT\n const partial = await this.liquid.renderer.renderTemplates(templates, scope)\n scope.pop(hash)\n return partial\n }\n} as ITagImplOptions\n","import BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (token: TagToken, remainTokens: Token[]) {\n const match = /\\w+/.exec(token.args)\n this.block = match ? match[0] : ''\n this.tpls = [] as ITemplate[]\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('tag:endblock', () => stream.stop())\n .on('template', (tpl: ITemplate) => this.tpls.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${token.raw} not closed`)\n })\n stream.start()\n },\n render: async function (scope: Scope) {\n const childDefined = scope.blocks[this.block]\n const html = childDefined !== undefined\n ? childDefined\n : await this.liquid.renderer.renderTemplates(this.tpls, scope)\n\n if (scope.blockMode === BlockMode.STORE) {\n scope.blocks[this.block] = html\n return ''\n }\n return html\n }\n} as ITagImplOptions\n","import TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.tokens = []\n\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream\n .on('token', (token: TagToken) => {\n if (token.name === 'endraw') stream.stop()\n else this.tokens.push(token)\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n },\n render: function () {\n return this.tokens.map((token: Token) => token.raw).join('')\n }\n}\n","import { mapSeries } from 'src/util/promise'\nimport assert from 'src/util/assert'\nimport { evalExp } from 'src/render/syntax'\nimport { identifier, value, hash } from 'src/parser/lexical'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nconst re = new RegExp(`^(${identifier.source})\\\\s+in\\\\s+` +\n `(${value.source})` +\n `(?:\\\\s+${hash.source})*$`)\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = re.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n\n this.variable = match[1]\n this.collection = match[2]\n this.templates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:endtablerow', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: async function (scope: Scope, hash: Hash) {\n let collection = evalExp(this.collection, scope) || []\n const offset = hash.offset || 0\n const limit = (hash.limit === undefined) ? collection.length : hash.limit\n\n collection = collection.slice(offset, offset + limit)\n const cols = hash.cols || collection.length\n const contexts = collection.map((item: any) => {\n const ctx = {}\n ctx[this.variable] = item\n return ctx\n })\n\n let row: number = 0\n let html = ''\n await mapSeries(contexts, async (context, idx) => {\n row = Math.floor(idx / cols) + 1\n const col = (idx % cols) + 1\n if (col === 1) {\n if (row !== 1) {\n html += ''\n }\n html += ``\n }\n\n html += ``\n scope.push(context)\n html += await this.liquid.renderer.renderTemplates(this.templates, scope)\n html += ''\n scope.pop(context)\n return html\n })\n if (row > 0) {\n html += ''\n }\n return html\n }\n} as ITagImplOptions\n","import { evalExp, isFalsy } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.templates = []\n this.elseTemplates = []\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => {\n p = this.templates\n this.cond = tagToken.args\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endunless', () => stream.stop())\n .on('template', tpl => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n const cond = evalExp(this.cond, scope)\n return isFalsy(cond)\n ? this.liquid.renderer.renderTemplates(this.templates, scope)\n : this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import { RenderBreakError } from 'src/util/error'\n\nexport default {\n render: async function () {\n throw new RenderBreakError('break')\n }\n}\n","import { RenderBreakError } from 'src/util/error'\n\nexport default {\n render: async function () {\n throw new RenderBreakError('continue')\n }\n}\n","import assign from './assign'\nimport For from './for'\nimport capture from './capture'\nimport Case from './case'\nimport comment from './comment'\nimport include from './include'\nimport decrement from './decrement'\nimport cycle from './cycle'\nimport If from './if'\nimport increment from './increment'\nimport layout from './layout'\nimport block from './block'\nimport raw from './raw'\nimport tablerow from './tablerow'\nimport unless from './unless'\nimport Break from './break'\nimport Continue from './continue'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst tags: { [key: string]: ITagImplOptions } = {\n assign, 'for': For, capture, 'case': Case, comment, include, decrement, increment, cycle, 'if': If, layout, block, raw, tablerow, unless, 'break': Break, 'continue': Continue\n}\n\nexport default tags\n","const escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\nconst unescapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n}\n\nfunction escape (str: string) {\n return String(str).replace(/&|<|>|\"|'/g, m => escapeMap[m])\n}\n\nfunction unescape (str: string) {\n return String(str).replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m])\n}\n\nexport default {\n 'escape': escape,\n 'escape_once': (str: string) => escape(unescape(str)),\n 'newline_to_br': (v: string) => v.replace(/\\n/g, '
'),\n 'strip_html': (v: string) => v.replace(/|||<.*?>/g, '')\n}\n","import { FilterImpl } from 'src/template/filter/filter-impl'\n\nexport default {\n 'append': (v: string, arg: string) => v + arg,\n 'prepend': (v: string, arg: string) => arg + v,\n 'capitalize': (str: string) => String(str).charAt(0).toUpperCase() + str.slice(1),\n 'lstrip': (v: string) => String(v).replace(/^\\s+/, ''),\n 'downcase': (v: string) => v.toLowerCase(),\n 'upcase': (str: string) => String(str).toUpperCase(),\n 'remove': (v: string, arg: string) => v.split(arg).join(''),\n 'remove_first': (v: string, l: string) => v.replace(l, ''),\n 'replace': (v: string, pattern: string, replacement: string) =>\n String(v).split(pattern).join(replacement),\n 'replace_first': (v: string, arg1: string, arg2: string) => String(v).replace(arg1, arg2),\n 'rstrip': (str: string) => String(str).replace(/\\s+$/, ''),\n 'split': (v: string, arg: string) => String(v).split(arg),\n 'strip': (v: string) => String(v).trim(),\n 'strip_newlines': (v: string) => String(v).replace(/\\n/g, ''),\n 'truncate': (v: string, l: number = 50, o: string = '...') => {\n v = String(v)\n if (v.length <= l) return v\n return v.substr(0, l - o.length) + o\n },\n 'truncatewords': (v: string, l: number = 15, o: string = '...') => {\n const arr = v.split(/\\s+/)\n let ret = arr.slice(0, l).join(' ')\n if (arr.length >= l) ret += o\n return ret\n }\n} as {[key: string]: FilterImpl}\n","export default {\n 'abs': (v: number) => Math.abs(v),\n 'ceil': (v: number) => Math.ceil(v),\n 'divided_by': (v: number, arg: number) => v / arg,\n 'floor': (v: number) => Math.floor(v),\n 'minus': bindFixed((v: number, arg: number) => v - arg),\n 'modulo': bindFixed((v: number, arg: number) => v % arg),\n 'round': (v: number, arg: number = 0) => {\n const amp = Math.pow(10, arg)\n return Math.round(v * amp) / amp\n },\n 'plus': bindFixed((v: number, arg: number) => Number(v) + Number(arg)),\n 'times': (v: number, arg: number) => v * arg\n}\n\nfunction getFixed (v: number) {\n const p = String(v).split('.')\n return (p.length > 1) ? p[1].length : 0\n}\n\nfunction bindFixed (cb: (v: number, arg: number) => number) {\n return (l: number, r: number) => {\n const f = Math.max(getFixed(l), getFixed(r))\n return cb(l, r).toFixed(f)\n }\n}\n","export default {\n 'url_decode': (x: string) => x.split('+').map(decodeURIComponent).join(' '),\n 'url_encode': (x: string) => x.split(' ').map(encodeURIComponent).join('+')\n}\n","import { last } from 'src/util/underscore'\n\nexport default {\n 'join': (v: any[], arg: string) => v.join(arg === undefined ? ' ' : arg),\n 'last': (v: T[]): T => last(v),\n 'first': (v: T[]): T => v[0],\n 'map': (arr: {[key: string]: T1}[], arg: string): T1[] => arr.map(v => v[arg]),\n 'reverse': (v: any[]) => v.reverse(),\n 'sort': (v: T[], arg: (lhs: T, rhs: T) => number) => v.sort(arg),\n 'size': (v: string | any[]) => v.length,\n 'concat': (v: T1[], arg: T2[] | T2): Array => Array.prototype.concat.call(v, arg),\n 'slice': (v: T[], begin: number, length: number): T[] => {\n if (length === undefined) length = 1\n return v.slice(begin, begin + length)\n },\n 'uniq': function (arr: T[]): T[] {\n const u = {}\n return (arr || []).filter(val => {\n if (u.hasOwnProperty(String(val))) return false\n u[String(val)] = true\n return true\n })\n }\n}\n","import { padStart } from './underscore'\n\nconst monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\nconst dayNames = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n]\nconst monthNamesShort = monthNames.map(abbr)\nconst dayNamesShort = dayNames.map(abbr)\nconst suffixes = {\n 1: 'st',\n 2: 'nd',\n 3: 'rd',\n 'default': 'th'\n}\n\nfunction abbr (str: string) {\n return str.slice(0, 3)\n}\n\n// prototype extensions\nconst _date = {\n daysInMonth: function (d: Date) {\n const feb = _date.isLeapYear(d) ? 29 : 28\n return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n },\n\n getDayOfYear: function (d: Date) {\n let num = 0\n for (let i = 0; i < d.getMonth(); ++i) {\n num += _date.daysInMonth(d)[i]\n }\n return num + d.getDate()\n },\n\n getWeekOfYear: function (d: Date, startDay: number) {\n // Skip to startDay of this week\n const now = this.getDayOfYear(d) + (startDay - d.getDay())\n // Find the first startDay of the year\n const jan1 = new Date(d.getFullYear(), 0, 1)\n const then = (7 - jan1.getDay() + startDay)\n return padStart(String(Math.floor((now - then) / 7) + 1), 2, '0')\n },\n\n isLeapYear: function (d: Date) {\n const year = d.getFullYear()\n return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)))\n },\n\n getSuffix: function (d: Date) {\n const str = d.getDate().toString()\n const index = parseInt(str.slice(-1))\n return suffixes[index] || suffixes['default']\n },\n\n century: function (d: Date) {\n return parseInt(d.getFullYear().toString().substring(0, 2), 10)\n }\n}\n\nconst formatCodes = {\n a: function (d: Date) {\n return dayNamesShort[d.getDay()]\n },\n A: function (d: Date) {\n return dayNames[d.getDay()]\n },\n b: function (d: Date) {\n return monthNamesShort[d.getMonth()]\n },\n B: function (d: Date) {\n return monthNames[d.getMonth()]\n },\n c: function (d: Date) {\n return d.toLocaleString()\n },\n C: function (d: Date) {\n return _date.century(d)\n },\n d: function (d: Date) {\n return padStart(d.getDate(), 2, '0')\n },\n e: function (d: Date) {\n return padStart(d.getDate(), 2)\n },\n H: function (d: Date) {\n return padStart(d.getHours(), 2, '0')\n },\n I: function (d: Date) {\n return padStart(String(d.getHours() % 12 || 12), 2, '0')\n },\n j: function (d: Date) {\n return padStart(_date.getDayOfYear(d), 3, '0')\n },\n k: function (d: Date) {\n return padStart(d.getHours(), 2)\n },\n l: function (d: Date) {\n return padStart(String(d.getHours() % 12 || 12), 2)\n },\n L: function (d: Date) {\n return padStart(d.getMilliseconds(), 3, '0')\n },\n m: function (d: Date) {\n return padStart(d.getMonth() + 1, 2, '0')\n },\n M: function (d: Date) {\n return padStart(d.getMinutes(), 2, '0')\n },\n p: function (d: Date) {\n return (d.getHours() < 12 ? 'AM' : 'PM')\n },\n P: function (d: Date) {\n return (d.getHours() < 12 ? 'am' : 'pm')\n },\n q: function (d: Date) {\n return _date.getSuffix(d)\n },\n s: function (d: Date) {\n return Math.round(d.valueOf() / 1000)\n },\n S: function (d: Date) {\n return padStart(d.getSeconds(), 2, '0')\n },\n u: function (d: Date) {\n return d.getDay() || 7\n },\n U: function (d: Date) {\n return _date.getWeekOfYear(d, 0)\n },\n w: function (d: Date) {\n return d.getDay()\n },\n W: function (d: Date) {\n return _date.getWeekOfYear(d, 1)\n },\n x: function (d: Date) {\n return d.toLocaleDateString()\n },\n X: function (d: Date) {\n return d.toLocaleTimeString()\n },\n y: function (d: Date) {\n return d.getFullYear().toString().substring(2, 4)\n },\n Y: function (d: Date) {\n return d.getFullYear()\n },\n z: function (d: Date) {\n const tz = d.getTimezoneOffset() / 60 * 100\n return (tz > 0 ? '-' : '+') + padStart(String(Math.abs(tz)), 4, '0')\n },\n '%': function () {\n return '%'\n }\n};\n(formatCodes as any).h = formatCodes.b;\n(formatCodes as any).N = formatCodes.L\n\nexport default function (d: Date, format: string) {\n let output = ''\n let remaining = format\n\n while (true) {\n const r = /%./g\n const results = r.exec(remaining)\n\n // No more format codes. Add the remaining text and return\n if (!results) {\n return output + remaining\n }\n\n // Add the preceding text\n output += remaining.slice(0, r.lastIndex - 2)\n remaining = remaining.slice(r.lastIndex)\n\n // Add the format code\n const ch = results[0].charAt(1)\n const func = formatCodes[ch]\n output += func ? func(d) : '%' + ch\n }\n}\n","import strftime from 'src/util/strftime'\nimport { isString } from 'src/util/underscore'\n\nexport default {\n 'date': (v: string | Date, arg: string) => {\n let date = v\n if (v === 'now') {\n date = new Date()\n } else if (isString(v)) {\n date = new Date(v)\n }\n return isValidDate(date) ? strftime(date, arg) : v\n }\n}\n\nfunction isValidDate (date: any): date is Date {\n return date instanceof Date && !isNaN(date.getTime())\n}\n","import { isTruthy } from 'src/render/syntax'\n\nexport default {\n 'default': (v: T1, arg: T2): T1 | T2 => isTruthy(v) ? v : arg\n}\n","import html from './html'\nimport str from './string'\nimport math from './math'\nimport url from './url'\nimport array from './array'\nimport date from './date'\nimport obj from './object'\n\nexport default { ...html, ...str, ...math, ...url, ...date, ...obj, ...array }\n","import Scope from './scope/scope'\nimport * as Types from './types'\nimport fs from 'src/fs'\nimport * as _ from './util/underscore'\nimport ITemplate from './template/itemplate'\nimport Tokenizer from './parser/tokenizer'\nimport Render from './render/render'\nimport Tag from './template/tag/tag'\nimport Filter from './template/filter/filter'\nimport Parser from './parser/parser'\nimport ITagImplOptions from './template/tag/itag-impl-options'\nimport Value from './template/value'\nimport { isTruthy, isFalsy, evalExp, evalValue } from './render/syntax'\nimport builtinTags from './builtin/tags'\nimport builtinFilters from './builtin/filters'\nimport { LiquidOptions, NormalizedFullOptions, applyDefault, normalize } from './liquid-options'\nimport { FilterImpl } from './template/filter/filter-impl'\n\nexport default class Liquid {\n public options: NormalizedFullOptions\n public renderer: Render\n public parser: Parser\n private cache: object = {}\n private tokenizer: Tokenizer\n\n constructor (opts: LiquidOptions = {}) {\n this.options = applyDefault(normalize(opts))\n this.parser = new Parser(this)\n this.renderer = new Render()\n this.tokenizer = new Tokenizer(this.options)\n\n _.forOwn(builtinTags, (conf, name) => this.registerTag(name, conf))\n _.forOwn(builtinFilters, (handler, name) => this.registerFilter(name, handler))\n }\n parse (html: string, filepath?: string) {\n const tokens = this.tokenizer.tokenize(html, filepath)\n return this.parser.parse(tokens)\n }\n render (tpl: Array, ctx?: object, opts?: LiquidOptions) {\n const options = { ...this.options, ...normalize(opts) }\n const scope = new Scope(ctx, options)\n return this.renderer.renderTemplates(tpl, scope)\n }\n async parseAndRender (html: string, ctx?: object, opts?: LiquidOptions) {\n const tpl = await this.parse(html)\n return this.render(tpl, ctx, opts)\n }\n async getTemplate (file: string, opts?: LiquidOptions) {\n const options = normalize(opts)\n const roots = options.root ? [...options.root, ...this.options.root] : this.options.root\n const paths = roots.map(root => fs.resolve(root, file, this.options.extname))\n\n for (const filepath of paths) {\n if (!(await fs.exists(filepath))) continue\n\n if (this.options.cache && this.cache[filepath]) return this.cache[filepath]\n const value = this.parse(await fs.readFile(filepath), filepath)\n if (this.options.cache) this.cache[filepath] = value\n return value\n }\n\n const err = new Error('ENOENT') as any\n err.message = `ENOENT: Failed to lookup \"${file}\" in \"${roots}\"`\n err.code = 'ENOENT'\n throw err\n }\n async renderFile (file: string, ctx?: object, opts?: LiquidOptions) {\n const options = normalize(opts)\n const templates = await this.getTemplate(file, options)\n return this.render(templates, ctx, opts)\n }\n evalValue (str: string, scope: Scope) {\n return new Value(str, this.options.strict_filters).value(scope)\n }\n registerFilter (name: string, filter: FilterImpl) {\n return Filter.register(name, filter)\n }\n registerTag (name: string, tag: ITagImplOptions) {\n return Tag.register(name, tag)\n }\n plugin (plugin: (this: Liquid, L: typeof Liquid) => void) {\n return plugin.call(this, Liquid)\n }\n express () {\n const self = this\n return function (this: any, filePath: string, ctx: object, cb: (err: Error | null, html?: string) => void) {\n const opts = { root: this.root }\n self.renderFile(filePath, ctx, opts).then(html => cb(null, html), cb)\n }\n }\n static default = Liquid\n static isTruthy = isTruthy\n static isFalsy = isFalsy\n static evalExp = evalExp\n static evalValue = evalValue\n static Types = Types\n}\n"],"names":["tslib_1.__extends","_\r\n .range","_.padStart","_.isArray","_.isString","BlockMode","_.last","_.isObject","_.isNil","_.isFunction","last","range","value","lexical.tagLine","lexical.operators","lexical.quoteBalanced","lexical.rangeLine","ParseState","Value","HTML","re","hash","rValue","staticFileRE","_.forOwn","builtinTags"],"mappings":"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"} \ No newline at end of file diff --git a/dist/liquid.min.js b/dist/liquid.min.js deleted file mode 100644 index cd1fd6f14..000000000 --- a/dist/liquid.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t=t||self).Liquid=e()}(this,function(){"use strict";var r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n])})(t,e)};function i(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var v=function(){return(v=Object.assign||function(t){for(var e,n=1,r=arguments.length;nu[0]&&e[1]> ":" ",n=w(String(t),String(u).length),r=o[t-1];return""+e+n+"| "+r}).join("\n"));this.message=function(t,e){e.file&&(t+=", file:"+e.file);return t+=", line:"+e.line+", col:"+e.col}(e.message,this.token),this.stack=this.message+"\n"+n+"\n"+this.stack+"\nFrom "+e.stack},t}(Error),b=function(r){function t(t,e){var n=r.call(this,new Error(t),e)||this;return n.name="TokenizationError",r.prototype.update.call(n),n}return i(t,r),t}(t),n=function(r){function t(t,e){var n=r.call(this,t,e)||this;return n.name="ParseError",n.message=t.message,r.prototype.update.call(n),n}return i(t,r),t}(t),T=function(r){function t(t,e){var n=r.call(this,t,e.token)||this;return n.name="RenderError",n.message=t.message,r.prototype.update.call(n),n}return i(t,r),t}(t),e=function(n){function t(t){var e=n.call(this,t)||this;return e.resolvedHTML="",e.name="RenderBreakError",e.message=t+"",e}return i(t,n),t}(Error),E=function(n){function t(t){var e=n.call(this,t)||this;return e.name="AssertionError",e.message=t+"",e}return i(t,n),t}(Error);function x(t,e){if(!t)throw new E(e=e||"expect "+t+" to be true")}var k,_,q={root:["."],cache:!1,extname:"",dynamicPartials:!0,trim_tag_right:!1,trim_tag_left:!1,trim_output_right:!1,trim_output_left:!1,greedy:!0,tag_delimiter_left:"{%",tag_delimiter_right:"%}",output_delimiter_left:"{{",output_delimiter_right:"}}",strict_filters:!1,strict_variables:!1};function S(t){var e;return(t=t||{}).hasOwnProperty("root")&&(t.root=f(e=t.root)?e:l(e)?[e]:[]),t}function R(t){return v({},q,t)}(_=k||(k={}))[_.OUTPUT=0]="OUTPUT",_[_.STORE=1]="STORE";var M=k,O=function(){function t(t,e){void 0===t&&(t={}),this.blocks={},this.groups={},this.blockMode=M.OUTPUT,this.opts=R(e),this.contexts=[t||{}]}return t.prototype.getAll=function(){return this.contexts.reduce(function(t,e){return v(t,e)},{})},t.prototype.get=function(t){var n=this,e=this.propertyAccessSeq(t),r=this.findContextFor(e[0])||g(this.contexts);return e.reduce(function(t,e){return n.readProperty(t,e)},r)},t.prototype.set=function(t,n){var r=this.propertyAccessSeq(t),i=this.findContextFor(r[0])||g(this.contexts);r.some(function(t,e){return!m(i)||(e===r.length-1?(i[t]=n,!0):(void 0===i[t]&&(i[t]={}),i=i[t],!1))})},t.prototype.unshift=function(t){return this.contexts.unshift(t)},t.prototype.push=function(t){return this.contexts.push(t)},t.prototype.pop=function(e){if(!arguments.length)return this.contexts.pop();var t=this.contexts.findIndex(function(t){return t===e});if(-1===t)throw new TypeError("scope not found, cannot pop");return this.contexts.splice(t,1)[0]},t.prototype.findContextFor=function(t,e){void 0===e&&(e=function(){return!0});for(var n=this.contexts.length-1;0<=n;n--){var r=this.contexts[n];if(e(r)&&t in r)return r}return null},t.prototype.readProperty=function(t,e){var n,r;if(c(t)?n=t:(t=function(t){if(s(t.to_liquid))return t.to_liquid();if(s(t.toLiquid))return t.toLiquid();return t}(t),n="size"===e?c((r=t).size)&&(f(r)||l(r))?r.length:r.size:t[e],s(t.liquid_method_missing)&&(n=t.liquid_method_missing(e))),c(n)&&this.opts.strict_variables)throw new TypeError("undefined variable: "+e);return n},t.prototype.propertyAccessSeq=function(t){t=String(t);for(var e,n=[],r="",i=0;i=|<|>|\s+contains\s+/],ut=function(a){function t(t,e,n,r,i,o){var u=a.call(this,t,e,n,r,i,o)||this;u.type="tag";var s=u.value.match(nt);if(!s)throw new b("illegal tag syntax",u);return u.name=s[1],u.args=s[2],u}return i(t,a),t}(C),st=function(s){function t(t,e,n,r,i,o){var u=s.call(this,t,e,n,r,i,o)||this;return u.type="output",u}return i(t,s),t}(C);(D=j||(j={}))[D.HTML=0]="HTML",D[D.OUTPUT=1]="OUTPUT",D[D.TAG=2]="TAG";var at=function(){function t(t){this.options=R(t)}return t.prototype.tokenize=function(t,e){for(var n=[],r=this.options.tag_delimiter_left,i=this.options.tag_delimiter_right,o=this.options.output_delimiter_left,u=this.options.output_delimiter_right,s=0,a=1,c=j.HTML,l="",f=0,p=1,h=1;s":function(t,e){return lt(t)?t.gt(e):lt(e)?e.lt(t):e=":function(t,e){return lt(t)?t.geq(e):lt(e)?e.leq(t):e<=t},"<=":function(t,e){return lt(t)?t.leq(e):lt(e)?e.geq(t):t<=e},contains:function(t,e){return!!t&&("function"==typeof t.indexOf&&-1"),s+=''),s+='',c.push(r),n=s,[4,this.liquid.renderer.renderTemplates(this.templates,c)];case 1:return s=n+t.sent(),s+="",c.pop(r),[2,s]}})})})];case 1:return t.sent(),0"),[2,s]}})})}},unless:{parse:function(t,e){var n,r=this;this.templates=[],this.elseTemplates=[];var i=this.liquid.parser.parseStream(e).on("start",function(){n=r.templates,r.cond=t.args}).on("tag:else",function(){return n=r.elseTemplates}).on("tag:endunless",function(){return i.stop()}).on("template",function(t){return n.push(t)}).on("end",function(){throw new Error("tag "+t.raw+" not closed")});i.start()},render:function(t){return Tt(mt(this.cond,t))?this.liquid.renderer.renderTemplates(this.templates,t):this.liquid.renderer.renderTemplates(this.elseTemplates,t)}},break:{render:function(){return h(this,void 0,void 0,function(){return d(this,function(t){throw new e("break")})})}},continue:{render:function(){return h(this,void 0,void 0,function(){return d(this,function(t){throw new e("continue")})})}}},re={"&":"&","<":"<",">":">",'"':""","'":"'"},ie={"&":"&","<":"<",">":">",""":'"',"'":"'"};function oe(t){return String(t).replace(/&|<|>|"|'/g,function(t){return re[t]})}var ue={escape:oe,escape_once:function(t){return oe(String(t).replace(/&(amp|lt|gt|#34|#39);/g,function(t){return ie[t]}))},newline_to_br:function(t){return t.replace(/\n/g,"
")},strip_html:function(t){return t.replace(/|||<.*?>/g,"")}},se={append:function(t,e){return t+e},prepend:function(t,e){return e+t},capitalize:function(t){return String(t).charAt(0).toUpperCase()+t.slice(1)},lstrip:function(t){return String(t).replace(/^\s+/,"")},downcase:function(t){return t.toLowerCase()},upcase:function(t){return String(t).toUpperCase()},remove:function(t,e){return t.split(e).join("")},remove_first:function(t,e){return t.replace(e,"")},replace:function(t,e,n){return String(t).split(e).join(n)},replace_first:function(t,e,n){return String(t).replace(e,n)},rstrip:function(t){return String(t).replace(/\s+$/,"")},split:function(t,e){return String(t).split(e)},strip:function(t){return String(t).trim()},strip_newlines:function(t){return String(t).replace(/\n/g,"")},truncate:function(t,e,n){return void 0===e&&(e=50),void 0===n&&(n="..."),(t=String(t)).length<=e?t:t.substr(0,e-n.length)+n},truncatewords:function(t,e,n){void 0===e&&(e=15),void 0===n&&(n="...");var r=t.split(/\s+/),i=r.slice(0,e).join(" ");return r.length>=e&&(i+=n),i}},ae={abs:function(t){return Math.abs(t)},ceil:function(t){return Math.ceil(t)},divided_by:function(t,e){return t/e},floor:function(t){return Math.floor(t)},minus:le(function(t,e){return t-e}),modulo:le(function(t,e){return t%e}),round:function(t,e){void 0===e&&(e=0);var n=Math.pow(10,e);return Math.round(t*n)/n},plus:le(function(t,e){return Number(t)+Number(e)}),times:function(t,e){return t*e}};function ce(t){var e=String(t).split(".");return 1 (fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise;\nexport function promisify (fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void):(arg1: T1, arg2: T2) => Promise;\nexport function promisify (fn: any) {\n return function (...args: any[]) {\n return new Promise((resolve, reject) => {\n fn(...args, (err: Error, result: any) => {\n err ? reject(err) : resolve(result)\n })\n })\n }\n}\n\nexport function stringify (value: any): string {\n if (isNil(value)) return ''\n if (isFunction(value.to_liquid)) return stringify(value.to_liquid())\n if (isFunction(value.toLiquid)) return stringify(value.toLiquid())\n if (isFunction(value.to_s)) return value.to_s()\n if ([toStr, arrToStr].indexOf(value.toString) > -1) return defaultToString(value)\n if (isFunction(value.toString)) return value.toString()\n return toStr.call(value)\n}\n\nfunction defaultToString (value: any): string {\n const cache: any[] = []\n return JSON.stringify(value, (key, value) => {\n if (isObject(value)) {\n if (cache.indexOf(value) !== -1) {\n return\n }\n cache.push(value)\n }\n return value\n })\n}\n\nexport function create (proto: T1): T2 {\n return Object.create(proto)\n}\n\nexport function isNil (value: any): boolean {\n return value === null || value === undefined\n}\n\nexport function isArray (value: any): value is any[] {\n // be compatible with IE 8\n return toStr.call(value) === '[object Array]'\n}\n\nexport function isError (value: any): value is Error {\n const signature = toStr.call(value)\n // [object XXXError]\n return signature.substr(-6, 5) === 'Error' ||\n (typeof value.message === 'string' && typeof value.name === 'string')\n}\n\n/*\n * Iterates over own enumerable string keyed properties of an object and invokes iteratee for each property.\n * The iteratee is invoked with three arguments: (value, key, object).\n * Iteratee functions may exit iteration early by explicitly returning false.\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @return {Object} Returns object.\n */\nexport function forOwn (\n object: {[key: string]: T} | undefined,\n iteratee: ((val: T, key: string, obj: {[key: string]: T}) => boolean | void)\n) {\n object = object || {}\n for (const k in object) {\n if (object.hasOwnProperty(k)) {\n if (iteratee(object[k], k, object) === false) break\n }\n }\n return object\n}\n\nexport function last (arr: T[]): T;\nexport function last (arr: string): string;\nexport function last (arr: any[] | string): any | string {\n return arr[arr.length - 1]\n}\n\n/*\n * Checks if value is the language type of Object.\n * (e.g. arrays, functions, objects, regexes, new Number(0), and new String(''))\n * @param {any} value The value to check.\n * @return {Boolean} Returns true if value is an object, else false.\n */\nexport function isObject (value: any): value is object {\n const type = typeof value\n return value !== null && (type === 'object' || type === 'function')\n}\n\n/*\n * A function to create flexibly-numbered lists of integers,\n * handy for each and map loops. start, if omitted, defaults to 0; step defaults to 1.\n * Returns a list of integers from start (inclusive) to stop (exclusive),\n * incremented (or decremented) by step, exclusive.\n * Note that ranges that stop before they start are considered to be zero-length instead of\n * negative — if you'd like a negative range, use a negative step.\n */\nexport function range (start: number, stop?: number, step?: number) {\n if (stop === undefined) {\n stop = start\n start = 0\n }\n step = step || 1\n\n const arr: number[] = []\n for (let i = start; i < stop; i += step) {\n arr.push(i)\n }\n return arr\n}\n\nexport function padStart (str: any, length: number, ch: string = ' ') {\n str = String(str)\n let n = length - str.length\n while (n-- > 0) str = ch + str\n return str\n}\n","import * as _ from './underscore'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\n\nabstract class LiquidError extends Error {\n private token: Token\n private originalError: Error\n constructor (err: Error, token: Token) {\n super(err.message)\n this.originalError = err\n this.token = token\n }\n protected update () {\n const err = this.originalError\n const context = mkContext(this.token)\n this.message = mkMessage(err.message, this.token)\n this.stack = this.message + '\\n' + context +\n '\\n' + this.stack + '\\nFrom ' + err.stack\n }\n}\n\nexport class TokenizationError extends LiquidError {\n constructor (message: string, token: Token) {\n super(new Error(message), token)\n this.name = 'TokenizationError'\n super.update()\n }\n}\n\nexport class ParseError extends LiquidError {\n constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'ParseError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderError extends LiquidError {\n constructor (err: Error, tpl: ITemplate) {\n super(err, tpl.token)\n this.name = 'RenderError'\n this.message = err.message\n super.update()\n }\n}\n\nexport class RenderBreakError extends Error {\n resolvedHTML: string = ''\n constructor (message: string) {\n super(message)\n this.name = 'RenderBreakError'\n this.message = message + ''\n }\n}\n\nexport class AssertionError extends Error {\n constructor (message: string) {\n super(message)\n this.name = 'AssertionError'\n this.message = message + ''\n }\n}\n\nfunction mkContext (token: Token) {\n const lines = token.input.split('\\n')\n const begin = Math.max(token.line - 2, 1)\n const end = Math.min(token.line + 3, lines.length)\n\n const context = _\n .range(begin, end + 1)\n .map(lineNumber => {\n const indicator = (lineNumber === token.line) ? '>> ' : ' '\n const num = _.padStart(String(lineNumber), String(end).length)\n const text = lines[lineNumber - 1]\n return `${indicator}${num}| ${text}`\n })\n .join('\\n')\n\n return context\n}\n\nfunction mkMessage (msg: string, token: Token) {\n if (token.file) msg += `, file:${token.file}`\n msg += `, line:${token.line}, col:${token.col}`\n return msg\n}\n","import { AssertionError } from './error'\n\nexport default function (predicate: any, message?: string) {\n if (!predicate) {\n message = message || `expect ${predicate} to be true`\n throw new AssertionError(message)\n }\n}\n","/* eslint-disable camelcase */\n\nimport * as _ from './util/underscore'\n\nexport interface LiquidOptions {\n /** `root` is a directory or an array of directories to resolve layouts and includes, as well as the filename passed in when calling `.renderFile()`. If an array, the files are looked up in the order they occur in the array. Defaults to `[\".\"]` */\n root?: string | string[]\n /** `extname` is used to lookup the template file when filepath doesn't include an extension name. Eg: setting to `\".html\"` will allow including file by basename. Defaults to `\"\"`. */\n extname?: string\n /** `cache` indicates whether or not to cache resolved templates. Defaults to `false`. */\n cache?: boolean\n /** `dynamicPartials`: if set, treat `` parameter in `{%include filepath %}`, `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */\n dynamicPartials?: boolean\n /** `strict_filters` is used to enable strict filter existence. If set to `false`, undefined filters will be rendered as empty string. Otherwise, undefined filters will cause an exception. Defaults to `false`. */\n strict_filters?: boolean\n /** `strict_variables` is used to enable strict variable derivation. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */\n strict_variables?: boolean\n /** `trim_tag_right` is used to strip blank characters (including ` `, `\\t`, and `\\r`) from the right of tags (`{% %}`) until `\\n` (inclusive). Defaults to `false`. */\n trim_tag_right?: boolean\n /** `trim_tag_left` is similar to `trim_tag_right`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trim_tag_left?: boolean\n /** ``trim_output_right` is used to strip blank characters (including ` `, `\\t`, and `\\r`) from the right of values (`{{ }}`) until `\\n` (inclusive). Defaults to `false`. */\n trim_output_right?: boolean\n /** `trim_output_left` is similar to `trim_output_right`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trim_output_left?: boolean\n /** `tag_delimiter_left` and `tag_delimiter_right` are used to override the delimiter for liquid tags **/\n tag_delimiter_left?: string,\n tag_delimiter_right?: string,\n /** `output_delimiter_left` and `output_delimiter_right` are used to override the delimiter for liquid outputs **/\n output_delimiter_left?: string,\n output_delimiter_right?: string,\n /** `greedy` is used to specify whether `trim_left`/`trim_right` is greedy. When set to `true`, all consecutive blank characters including `\\n` will be trimed regardless of line breaks. Defaults to `true`. */\n greedy?: boolean\n}\n\ninterface NormalizedOptions extends LiquidOptions {\n root?: string[]\n}\n\nexport interface NormalizedFullOptions extends NormalizedOptions {\n root: string[]\n extname: string\n cache: boolean\n dynamicPartials: boolean\n strict_filters: boolean\n strict_variables: boolean\n trim_tag_right: boolean\n trim_tag_left: boolean\n trim_output_right: boolean\n trim_output_left: boolean\n tag_delimiter_left: string,\n tag_delimiter_right: string,\n output_delimiter_left: string,\n output_delimiter_right: string,\n greedy: boolean\n}\n\nconst defaultOptions: NormalizedFullOptions = {\n root: ['.'],\n cache: false,\n extname: '',\n dynamicPartials: true,\n trim_tag_right: false,\n trim_tag_left: false,\n trim_output_right: false,\n trim_output_left: false,\n greedy: true,\n tag_delimiter_left: '{%',\n tag_delimiter_right: '%}',\n output_delimiter_left: '{{',\n output_delimiter_right: '}}',\n strict_filters: false,\n strict_variables: false\n}\n\nexport function normalize (options?: LiquidOptions): NormalizedOptions {\n options = options || {}\n if (options.hasOwnProperty('root')) {\n options.root = normalizeStringArray(options.root)\n }\n return options as NormalizedOptions\n}\n\nexport function applyDefault (options?: NormalizedOptions): NormalizedFullOptions {\n return { ...defaultOptions, ...options }\n}\n\nfunction normalizeStringArray (value: any): string[] {\n if (_.isArray(value)) return value as string[]\n if (_.isString(value)) return [value as string]\n return []\n}\n","enum BlockMode {\n /* store rendered html into blocks */\n OUTPUT,\n /* output rendered html directly */\n STORE\n}\n\nexport default BlockMode\n","import * as _ from '../util/underscore'\nimport { __assign } from 'tslib'\nimport assert from '../util/assert'\nimport { NormalizedFullOptions, applyDefault } from '../liquid-options'\nimport BlockMode from './block-mode'\n\nexport type Context = {\n [key: string]: any\n liquid_method_missing?: (key: string) => any // eslint-disable-line\n to_liquid?: () => any // eslint-disable-line\n toLiquid?: () => any // eslint-disable-line\n}\n\nexport default class Scope {\n opts: NormalizedFullOptions\n contexts: Array\n blocks: object = {}\n groups: {[key: string]: number} = {}\n blockMode: BlockMode = BlockMode.OUTPUT\n constructor (ctx: object = {}, opts?: NormalizedFullOptions) {\n this.opts = applyDefault(opts)\n this.contexts = [ctx || {}]\n }\n getAll () {\n return this.contexts.reduce((ctx, val) => __assign(ctx, val), {})\n }\n get (path: string): any {\n const paths = this.propertyAccessSeq(path)\n const scope = this.findContextFor(paths[0]) || _.last(this.contexts)\n return paths.reduce((value, key) => this.readProperty(value, key), scope)\n }\n set (path: string, v: any): void {\n const paths = this.propertyAccessSeq(path)\n let scope = this.findContextFor(paths[0]) || _.last(this.contexts)\n paths.some((key, i) => {\n if (!_.isObject(scope)) {\n return true\n }\n if (i === paths.length - 1) {\n scope[key] = v\n return true\n }\n if (undefined === scope[key]) {\n scope[key] = {}\n }\n scope = scope[key]\n return false\n })\n }\n unshift (ctx: object) {\n return this.contexts.unshift(ctx)\n }\n push (ctx: object) {\n return this.contexts.push(ctx)\n }\n pop (ctx?: object): object | undefined {\n if (!arguments.length) {\n return this.contexts.pop()\n }\n const i = this.contexts.findIndex(scope => scope === ctx)\n if (i === -1) {\n throw new TypeError('scope not found, cannot pop')\n }\n return this.contexts.splice(i, 1)[0]\n }\n findContextFor (key: string, filter: ((conttext: object) => boolean) = () => true) {\n for (let i = this.contexts.length - 1; i >= 0; i--) {\n const candidate = this.contexts[i]\n if (!filter(candidate)) continue\n if (key in candidate) {\n return candidate\n }\n }\n return null\n }\n private readProperty (obj: Context, key: string) {\n let val\n if (_.isNil(obj)) {\n val = obj\n } else {\n obj = toLiquid(obj)\n val = key === 'size' ? readSize(obj) : obj[key]\n if (_.isFunction(obj.liquid_method_missing)) {\n val = obj.liquid_method_missing!(key)\n }\n }\n if (_.isNil(val) && this.opts.strict_variables) {\n throw new TypeError(`undefined variable: ${key}`)\n }\n return val\n }\n\n /*\n * Parse property access sequence from access string\n * @example\n * accessSeq(\"foo.bar\") // ['foo', 'bar']\n * accessSeq(\"foo['bar']\") // ['foo', 'bar']\n * accessSeq(\"foo['b]r']\") // ['foo', 'b]r']\n * accessSeq(\"foo[bar.coo]\") // ['foo', 'bar'], for bar.coo == 'bar'\n */\n propertyAccessSeq (str: string) {\n str = String(str)\n const seq: string[] = []\n let name = ''\n let j\n let i = 0\n while (i < str.length) {\n switch (str[i]) {\n case '[':\n push()\n\n const delemiter = str[i + 1]\n if (/['\"]/.test(delemiter)) { // foo[\"bar\"]\n j = str.indexOf(delemiter, i + 2)\n assert(j !== -1, `unbalanced ${delemiter}: ${str}`)\n name = str.slice(i + 2, j)\n push()\n i = j + 2\n } else { // foo[bar.coo]\n j = matchRightBracket(str, i + 1)\n assert(j !== -1, `unbalanced []: ${str}`)\n name = str.slice(i + 1, j)\n if (!/^[+-]?\\d+$/.test(name)) { // foo[bar] vs. foo[1]\n name = String(this.get(name))\n }\n push()\n i = j + 1\n }\n break\n case '.':// foo.bar, foo[0].bar\n push()\n i++\n break\n default:// foo.bar\n name += str[i]\n i++\n }\n }\n push()\n\n if (!seq.length) {\n throw new TypeError(`invalid path:\"${str}\"`)\n }\n return seq\n\n function push () {\n if (name.length) seq.push(name)\n name = ''\n }\n }\n}\n\nfunction toLiquid (obj: Context) {\n if (_.isFunction(obj.to_liquid)) {\n return obj.to_liquid()\n }\n if (_.isFunction(obj.toLiquid)) {\n return obj.toLiquid()\n }\n return obj\n}\n\nfunction readSize (obj: Context) {\n if (!_.isNil(obj.size)) return obj.size\n if (_.isArray(obj) || _.isString(obj)) return obj.length\n return obj.size\n}\n\nfunction matchRightBracket (str: string, begin: number) {\n let stack = 1 // count of '[' - count of ']'\n for (let i = begin; i < str.length; i++) {\n if (str[i] === '[') {\n stack++\n }\n if (str[i] === ']') {\n stack--\n if (stack === 0) {\n return i\n }\n }\n }\n return -1\n}\n","export class CaptureScope {}\nexport class AssignScope {}\nexport class IncrementScope {}\nexport class DecrementScope {}\n","import { last } from '../util/underscore'\nimport IFS from './ifs'\n\nfunction domResolve (root: string, path: string) {\n const base = document.createElement('base')\n base.href = root\n\n const head = document.getElementsByTagName('head')[0]\n head.insertBefore(base, head.firstChild)\n\n const a = document.createElement('a')\n a.href = path\n const resolved = a.href\n head.removeChild(base)\n\n return resolved\n}\n\nfunction resolve (root: string, filepath: string, ext: string) {\n if (root.length && last(root) !== '/') root += '/'\n const url = domResolve(root, filepath)\n return url.replace(/^(\\w+:\\/\\/[^/]+)(\\/[^?]+)/, (str, origin, path) => {\n const last = path.split('/').pop()\n if (/\\.\\w+$/.test(last)) return str\n return origin + path + ext\n })\n}\n\nasync function readFile (url: string): Promise {\n return new Promise((resolve, reject) => {\n const xhr = new XMLHttpRequest()\n xhr.onload = () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n resolve(xhr.responseText as string)\n } else {\n reject(new Error(xhr.statusText))\n }\n }\n xhr.onerror = () => {\n reject(new Error('An error occurred whilst receiving the response.'))\n }\n xhr.open('GET', url)\n xhr.send()\n })\n}\n\nasync function exists () {\n return true\n}\n\nexport default { readFile, resolve, exists } as IFS\n","export default class Token {\n type: string = 'notset'\n line: number\n col: number\n raw: string\n input: string\n file?: string\n value: string\n constructor (raw: string, input: string, line: number, col: number, file?: string) {\n this.col = col\n this.line = line\n this.raw = raw\n this.value = raw\n this.input = input\n this.file = file\n }\n}\n","import whiteSpaceCtrl from './whitespace-ctrl'\nimport HTMLToken from './html-token'\nimport TagToken from './tag-token'\nimport Token from './token'\nimport OutputToken from './output-token'\nimport { TokenizationError } from 'src/util/error'\nimport { NormalizedFullOptions, applyDefault } from '../liquid-options'\n\nenum ParseState { HTML, OUTPUT, TAG }\n\nexport default class Tokenizer {\n options: NormalizedFullOptions\n constructor (options?: NormalizedFullOptions) {\n this.options = applyDefault(options)\n }\n tokenize (input: string, file?: string) {\n const tokens: Token[] = []\n const tagL = this.options.tag_delimiter_left\n const tagR = this.options.tag_delimiter_right\n const outputL = this.options.output_delimiter_left\n const outputR = this.options.output_delimiter_right\n let p = 0\n let curLine = 1\n let state = ParseState.HTML\n let buffer = ''\n let lineBegin = 0\n let line = 1\n let col = 1\n\n while (p < input.length) {\n if (input[p] === '\\n') {\n curLine++\n lineBegin = p + 1\n }\n if (state === ParseState.HTML) {\n if (input.substr(p, outputL.length) === outputL) {\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n buffer = outputL\n line = curLine\n col = p - lineBegin + 1\n p += outputL.length\n state = ParseState.OUTPUT\n continue\n } else if (input.substr(p, tagL.length) === tagL) {\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n buffer = tagL\n line = curLine\n col = p - lineBegin + 1\n p += tagL.length\n state = ParseState.TAG\n continue\n }\n } else if (state === ParseState.OUTPUT && input.substr(p, outputR.length) === outputR) {\n buffer += outputR\n tokens.push(new OutputToken(buffer, buffer.slice(outputL.length, -outputR.length), input, line, col, file))\n p += outputR.length\n buffer = ''\n line = curLine\n col = p - lineBegin + 1\n state = ParseState.HTML\n continue\n } else if (input.substr(p, tagR.length) === tagR) {\n buffer += tagR\n tokens.push(new TagToken(buffer, buffer.slice(tagL.length, -tagR.length), input, line, col, file))\n p += tagR.length\n buffer = ''\n line = curLine\n col = p - lineBegin + 1\n state = ParseState.HTML\n continue\n }\n buffer += input[p++]\n }\n if (state !== ParseState.HTML) {\n const t = state === ParseState.OUTPUT ? 'output' : 'tag'\n const str = buffer.length > 16 ? buffer.slice(0, 13) + '...' : buffer\n throw new TokenizationError(\n `${t} \"${str}\" not closed`,\n new Token(buffer, input, line, col, file)\n )\n }\n if (buffer) tokens.push(new HTMLToken(buffer, input, line, col, file))\n\n whiteSpaceCtrl(tokens, this.options)\n return tokens\n }\n}\n","import Token from './token'\n\nexport default class HTMLToken extends Token {\n constructor (str: string, input: string, line: number, col: number, file?: string) {\n super(str, input, line, col, file)\n this.type = 'html'\n this.value = str\n }\n}\n","import Token from './token'\nimport { last } from 'src/util/underscore'\n\nexport default class DelimitedToken extends Token {\n trimLeft: boolean\n trimRight: boolean\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, input, line, pos, file)\n this.trimLeft = value[0] === '-'\n this.trimRight = last(value) === '-'\n this.value = value\n .slice(\n this.trimLeft ? 1 : 0,\n this.trimRight ? -1 : value.length\n )\n .trim()\n }\n}\n","// quote related\nconst singleQuoted = /'[^']*'/\nconst doubleQuoted = /\"[^\"]*\"/\nexport const quoted = new RegExp(`${singleQuoted.source}|${doubleQuoted.source}`)\nexport const quoteBalanced = new RegExp(`(?:${quoted.source}|[^'\"])*`)\n\n// basic types\nexport const number = /[+-]?(?:\\d+\\.?\\d*|\\.?\\d+)/\nexport const bool = /true|false/\n\n// property access\nexport const identifier = /[\\w-]+[?]?/\nexport const subscript = new RegExp(`\\\\[(?:${quoted.source}|[\\\\w-\\\\.]+)\\\\]`)\nexport const literal = new RegExp(`(?:${quoted.source}|${bool.source}|${number.source})`)\nexport const variable = new RegExp(`${identifier.source}(?:\\\\.${identifier.source}|${subscript.source})*`)\n\n// range related\nexport const rangeLimit = new RegExp(`(?:${variable.source}|${number.source})`)\nexport const range = new RegExp(`\\\\(${rangeLimit.source}\\\\.\\\\.${rangeLimit.source}\\\\)`)\nexport const rangeCapture = new RegExp(`\\\\((${rangeLimit.source})\\\\.\\\\.(${rangeLimit.source})\\\\)`)\n\nexport const value = new RegExp(`(?:${variable.source}|${literal.source}|${range.source})`)\n\n// hash related\nexport const hash = new RegExp(`(?:${identifier.source})\\\\s*:\\\\s*(?:${value.source})`)\nexport const hashCapture = new RegExp(`(${identifier.source})\\\\s*:\\\\s*(${value.source})`, 'g')\n\n// full match\nexport const tagLine = new RegExp(`^\\\\s*(${identifier.source})\\\\s*([\\\\s\\\\S]*?)\\\\s*$`)\nexport const numberLine = new RegExp(`^${number.source}$`)\nexport const boolLine = new RegExp(`^${bool.source}$`, 'i')\nexport const quotedLine = new RegExp(`^${quoted.source}$`)\nexport const rangeLine = new RegExp(`^${rangeCapture.source}$`)\n\nexport const operators = [\n /\\s+or\\s+/,\n /\\s+and\\s+/,\n /==|!=|<=|>=|<|>|\\s+contains\\s+/\n]\n\nexport function isRange (str: string) {\n return rangeLine.test(str)\n}\n","import DelimitedToken from './delimited-token'\nimport { TokenizationError } from 'src/util/error'\nimport * as lexical from './lexical'\n\nexport default class TagToken extends DelimitedToken {\n name: string\n args: string\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, value, input, line, pos, file)\n this.type = 'tag'\n const match = this.value.match(lexical.tagLine)\n if (!match) {\n throw new TokenizationError(`illegal tag syntax`, this)\n }\n this.name = match[1]\n this.args = match[2]\n }\n}\n","import DelimitedToken from './delimited-token'\n\nexport default class OutputToken extends DelimitedToken {\n constructor (raw: string, value: string, input: string, line: number, pos: number, file?: string) {\n super(raw, value, input, line, pos, file)\n this.type = 'output'\n }\n}\n","import DelimitedToken from 'src/parser/delimited-token'\nimport Token from 'src/parser/token'\nimport TagToken from 'src/parser/tag-token'\nimport { NormalizedFullOptions } from 'src/liquid-options'\n\nexport default function whiteSpaceCtrl (tokens: Token[], options: NormalizedFullOptions) {\n options = { greedy: true, ...options }\n let inRaw = false\n\n tokens.forEach((token: Token, i: number) => {\n if (shouldTrimLeft(token as DelimitedToken, inRaw, options)) {\n trimLeft(tokens[i - 1], options.greedy)\n }\n\n if (token.type === 'tag' && (token as TagToken).name === 'raw') inRaw = true\n if (token.type === 'tag' && (token as TagToken).name === 'endraw') inRaw = false\n\n if (shouldTrimRight(token as DelimitedToken, inRaw, options)) {\n trimRight(tokens[i + 1], options.greedy)\n }\n })\n}\n\nfunction shouldTrimLeft (token: DelimitedToken, inRaw: boolean, options: NormalizedFullOptions) {\n if (inRaw) return false\n if (token.type === 'tag') return token.trimLeft || options.trim_tag_left\n if (token.type === 'output') return token.trimLeft || options.trim_output_left\n}\n\nfunction shouldTrimRight (token: DelimitedToken, inRaw: boolean, options: NormalizedFullOptions) {\n if (inRaw) return false\n if (token.type === 'tag') return token.trimRight || options.trim_tag_right\n if (token.type === 'output') return token.trimRight || options.trim_output_right\n}\n\nfunction trimLeft (token: Token, greedy: boolean) {\n if (!token || token.type !== 'html') return\n\n const rLeft = greedy ? /\\s+$/g : /[\\t\\r ]*$/g\n token.value = token.value.replace(rLeft, '')\n}\n\nfunction trimRight (token: Token, greedy: boolean) {\n if (!token || token.type !== 'html') return\n\n const rRight = greedy ? /^\\s+/g : /^[\\t\\r ]*\\n?/g\n token.value = token.value.replace(rRight, '')\n}\n","import { RenderError } from 'src/util/error'\nimport assert from 'src/util/assert'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\n\nexport default class Render {\n async renderTemplates (templates: ITemplate[], scope: Scope) {\n assert(scope, 'unable to evalTemplates: scope undefined')\n\n let html = ''\n for (const tpl of templates) {\n try {\n html += await tpl.render(scope)\n } catch (e) {\n if (e.name === 'RenderBreakError') {\n e.resolvedHTML = html\n throw e\n }\n throw e.name === 'RenderError' ? e : new RenderError(e, tpl)\n }\n }\n return html\n }\n}\n","import { isFunction } from 'src/util/underscore'\n\nexport interface IComparable {\n equals: (rhs: any) => boolean\n gt: (rhs: any) => boolean\n geq: (rhs: any) => boolean\n lt: (rhs: any) => boolean\n leq: (rhs: any) => boolean\n}\n\nexport function isComparable (arg: any): arg is IComparable {\n return arg && isFunction(arg.equals)\n}\n","export abstract class Drop {\n}\n","import { Drop } from './drop'\nimport { isFunction } from 'src/util/underscore'\n\nexport interface IDrop {\n value(): any\n}\n\nexport function isDrop (value: any): value is IDrop {\n return value instanceof Drop && isFunction((value as any).value)\n}\n","import { Drop } from './drop'\nimport { IComparable } from './icomparable'\nimport { isObject, isString, isArray } from 'src/util/underscore'\nimport { IDrop } from 'src/drop/idrop'\n\nexport class EmptyDrop extends Drop implements IDrop, IComparable {\n equals (value: any) {\n if (isString(value) || isArray(value)) return value.length === 0\n if (isObject(value)) return Object.keys(value).length === 0\n return false\n }\n gt () {\n return false\n }\n geq () {\n return false\n }\n lt () {\n return false\n }\n leq () {\n return false\n }\n value () {\n return ''\n }\n}\n","import { isNil, isString } from 'src/util/underscore'\nimport { isDrop } from 'src/drop/idrop'\nimport { EmptyDrop } from 'src/drop/empty-drop'\n\nexport class BlankDrop extends EmptyDrop {\n equals (value: any) {\n if (value === false) return true\n if (isNil(isDrop(value) ? value.value() : value)) return true\n if (isString(value)) return /^\\s*$/.test(value)\n return super.equals(value)\n }\n}\n","import { Drop } from './drop'\nimport { IComparable } from './icomparable'\nimport { isNil } from 'src/util/underscore'\nimport { IDrop, isDrop } from 'src/drop/idrop'\nimport { BlankDrop } from 'src/drop/blank-drop'\n\nexport class NullDrop extends Drop implements IDrop, IComparable {\n equals (value: any) {\n return isNil(isDrop(value) ? value.value() : value) || value instanceof BlankDrop\n }\n gt () {\n return false\n }\n geq () {\n return false\n }\n lt () {\n return false\n }\n leq () {\n return false\n }\n value () {\n return null\n }\n}\n","import * as lexical from '../parser/lexical'\nimport assert from '../util/assert'\nimport Scope from 'src/scope/scope'\nimport { range, last } from 'src/util/underscore'\nimport { isComparable } from 'src/drop/icomparable'\nimport { NullDrop } from 'src/drop/null-drop'\nimport { EmptyDrop } from 'src/drop/empty-drop'\nimport { BlankDrop } from 'src/drop/blank-drop'\nimport { isDrop } from 'src/drop/idrop'\n\nconst binaryOperators: {[key: string]: (lhs: any, rhs: any) => boolean} = {\n '==': (l: any, r: any) => {\n if (isComparable(l)) return l.equals(r)\n if (isComparable(r)) return r.equals(l)\n return l === r\n },\n '!=': (l: any, r: any) => {\n if (isComparable(l)) return !l.equals(r)\n if (isComparable(r)) return !r.equals(l)\n return l !== r\n },\n '>': (l: any, r: any) => {\n if (isComparable(l)) return l.gt(r)\n if (isComparable(r)) return r.lt(l)\n return l > r\n },\n '<': (l: any, r: any) => {\n if (isComparable(l)) return l.lt(r)\n if (isComparable(r)) return r.gt(l)\n return l < r\n },\n '>=': (l: any, r: any) => {\n if (isComparable(l)) return l.geq(r)\n if (isComparable(r)) return r.leq(l)\n return l >= r\n },\n '<=': (l: any, r: any) => {\n if (isComparable(l)) return l.leq(r)\n if (isComparable(r)) return r.geq(l)\n return l <= r\n },\n 'contains': (l: any, r: any) => {\n if (!l) return false\n if (typeof l.indexOf !== 'function') return false\n return l.indexOf(r) > -1\n },\n 'and': (l: any, r: any) => isTruthy(l) && isTruthy(r),\n 'or': (l: any, r: any) => isTruthy(l) || isTruthy(r)\n}\n\nexport function parseExp (exp: string, scope: Scope): any {\n assert(scope, 'unable to parseExp: scope undefined')\n const operatorREs = lexical.operators\n let match\n for (let i = 0; i < operatorREs.length; i++) {\n const operatorRE = operatorREs[i]\n const expRE = new RegExp(`^(${lexical.quoteBalanced.source})(${operatorRE.source})(${lexical.quoteBalanced.source})$`)\n if ((match = exp.match(expRE))) {\n const l = parseExp(match[1], scope)\n const op = binaryOperators[match[2].trim()]\n const r = parseExp(match[3], scope)\n return op(l, r)\n }\n }\n\n if ((match = exp.match(lexical.rangeLine))) {\n const low = parseValue(match[1], scope)\n const high = parseValue(match[2], scope)\n return range(low, high + 1)\n }\n\n return parseValue(exp, scope)\n}\n\nexport function evalExp (str: string, scope: Scope): any {\n const value = parseExp(str, scope)\n return isDrop(value) ? value.value() : value\n}\n\nfunction parseValue (str: string, scope: Scope): any {\n if (!str) return null\n str = str.trim()\n\n if (str === 'true') return true\n if (str === 'false') return false\n if (str === 'nil' || str === 'null') return new NullDrop()\n if (str === 'empty') return new EmptyDrop()\n if (str === 'blank') return new BlankDrop()\n if (!isNaN(Number(str))) return Number(str)\n if ((str[0] === '\"' || str[0] === \"'\") && str[0] === last(str)) return str.slice(1, -1)\n return scope.get(str)\n}\n\nexport function evalValue (str: string, scope: Scope): any {\n const value = parseValue(str, scope)\n return isDrop(value) ? value.value() : value\n}\n\nexport function isTruthy (val: any): boolean {\n return !isFalsy(val)\n}\n\nexport function isFalsy (val: any): boolean {\n return val === false || undefined === val || val === null\n}\n","import { hashCapture } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport Scope from 'src/scope/scope'\n\n/**\n * Key-Value Pairs Representing Tag Arguments\n * Example:\n * For the markup `{% include 'head.html' foo='bar' %}`,\n * hash['foo'] === 'bar'\n */\nexport default class Hash {\n [key: string]: any\n constructor (markup: string, scope: Scope) {\n let match\n hashCapture.lastIndex = 0\n while ((match = hashCapture.exec(markup))) {\n const k = match[1]\n const v = match[2]\n this[k] = evalValue(v, scope)\n }\n }\n}\n","import { evalExp } from 'src/render/syntax'\nimport Filter from './filter/filter'\nimport Scope from 'src/scope/scope'\n\nenum ParseState {\n INIT = 0,\n FILTER_NAME = 1,\n FILTER_ARG = 2\n}\n\nexport default class {\n initial: any\n filters: Array = []\n\n /**\n * @param str value string, like: \"i have a dream | truncate: 3\n */\n constructor (str: string, strictFilters: boolean) {\n let buffer = ''\n let quoted = ''\n let state = ParseState.INIT\n let sealed = false\n\n let filterName = ''\n let filterArgs: string[] = []\n\n for (let i = 0; i < str.length; i++) {\n if (quoted) {\n if (str[i] === quoted) {\n quoted = ''\n sealed = true\n }\n buffer += str[i]\n } else if (/\\s/.test(str[i])) {\n if (!buffer) continue\n else sealed = true\n } else if (str[i] === '|') {\n if (state === ParseState.INIT) {\n this.initial = buffer\n } else {\n if (state === ParseState.FILTER_NAME) filterName = buffer\n else filterArgs.push(buffer)\n this.filters.push(new Filter(filterName, filterArgs, strictFilters))\n filterName = ''\n filterArgs = []\n }\n state = ParseState.FILTER_NAME\n buffer = ''\n sealed = false\n } else if (state === ParseState.FILTER_NAME && str[i] === ':') {\n filterName = buffer\n state = ParseState.FILTER_ARG\n buffer = ''\n sealed = false\n } else if (state === ParseState.FILTER_ARG && str[i] === ',') {\n filterArgs.push(buffer)\n buffer = ''\n sealed = false\n } else if (sealed) continue\n else {\n if ((str[i] === '\"' || str[i] === \"'\") && !quoted) quoted = str[i]\n buffer += str[i]\n }\n }\n\n if (buffer) {\n if (state === ParseState.INIT) this.initial = buffer\n else if (state === ParseState.FILTER_NAME) this.filters.push(new Filter(buffer, [], strictFilters))\n else {\n filterArgs.push(buffer)\n this.filters.push(new Filter(filterName, filterArgs, strictFilters))\n }\n }\n }\n value (scope: Scope) {\n return this.filters.reduce(\n (prev, filter) => filter.render(prev, scope),\n evalExp(this.initial, scope))\n }\n}\n","export default abstract class Template {\n token: T;\n constructor (token: T) {\n this.token = token\n }\n}\n","import { create, stringify } from 'src/util/underscore'\nimport assert from 'src/util/assert'\nimport Scope from 'src/scope/scope'\nimport ITagImpl from './itag-impl'\nimport ITagImplOptions from './itag-impl-options'\nimport Liquid from 'src/liquid'\nimport Hash from './hash'\nimport Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\n\nexport default class Tag extends Template implements ITemplate {\n name: string\n private impl: ITagImpl\n static impls: { [key: string]: ITagImplOptions } = {}\n\n constructor (token: TagToken, tokens: Token[], liquid: Liquid) {\n super(token)\n this.name = token.name\n\n const impl = Tag.impls[token.name]\n assert(impl, `tag ${token.name} not found`)\n this.impl = create(impl)\n this.impl.liquid = liquid\n if (this.impl.parse) {\n this.impl.parse(token, tokens)\n }\n }\n async render (scope: Scope) {\n const hash = new Hash(this.token.args, scope)\n const impl = this.impl\n if (typeof impl.render !== 'function') {\n return ''\n }\n const html = await impl.render(scope, hash)\n return stringify(html)\n }\n static register (name: string, tag: ITagImplOptions) {\n Tag.impls[name] = tag\n }\n static clear () {\n Tag.impls = {}\n }\n}\n","import { evalValue } from 'src/render/syntax'\nimport Scope from 'src/scope/scope'\nimport { FilterImpl } from './filter-impl'\n\nexport default class Filter {\n name: string\n impl: FilterImpl\n args: string[]\n private static impls: {[key: string]: FilterImpl} = {}\n\n constructor (name: string, args: string[], strictFilters: boolean) {\n const impl = Filter.impls[name]\n if (!impl && strictFilters) throw new TypeError(`undefined filter: ${name}`)\n\n this.name = name\n this.impl = impl || (x => x)\n this.args = args\n }\n render (value: any, scope: Scope): any {\n const args = this.args.map(arg => evalValue(arg, scope))\n return this.impl.apply(null, [value, ...args])\n }\n static register (name: string, filter: FilterImpl) {\n Filter.impls[name] = filter\n }\n static clear () {\n Filter.impls = {}\n }\n}\n","import Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport TagToken from './tag-token'\n\ntype ParseToken = ((token: Token, remainTokens: Array) => ITemplate)\n\nexport default class ParseStream {\n private tokens: Array\n private handlers: {[key: string]: (arg: any) => void} = {}\n private stopRequested: boolean = false\n private parseToken: ParseToken\n\n constructor (tokens: Array, parseToken: ParseToken) {\n this.tokens = tokens\n this.parseToken = parseToken\n }\n on (name: string, cb: (arg: T) => void): ParseStream {\n this.handlers[name] = cb\n return this\n }\n trigger (event: string, arg?: T) {\n const h = this.handlers[event]\n if (typeof h === 'function') {\n h(arg)\n return true\n }\n return false\n }\n start () {\n this.trigger('start')\n let token: Token | undefined\n while (!this.stopRequested && (token = this.tokens.shift())) {\n if (this.trigger('token', token)) continue\n if (token.type === 'tag' && this.trigger(`tag:${(token).name}`, token)) {\n continue\n }\n const template = this.parseToken(token, this.tokens)\n this.trigger('template', template)\n }\n if (!this.stopRequested) this.trigger('end')\n return this\n }\n stop () {\n this.stopRequested = true\n return this\n }\n}\n","import Value from './value'\nimport { stringify } from 'src/util/underscore'\nimport Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport OutputToken from 'src/parser/output-token'\n\nexport default class Output extends Template implements ITemplate {\n value: Value\n constructor (token: OutputToken, strictFilters: boolean) {\n super(token)\n this.value = new Value(token.value, strictFilters)\n }\n async render (scope: Scope): Promise {\n const html = await this.value.value(scope)\n return stringify(html)\n }\n}\n","import Template from 'src/template/template'\nimport ITemplate from 'src/template/itemplate'\nimport HTMLToken from 'src/parser/html-token'\n\nexport default class extends Template implements ITemplate {\n str: string\n constructor (token: HTMLToken) {\n super(token)\n this.str = token.value\n }\n async render (): Promise {\n return this.str\n }\n}\n","import { ParseError } from '../util/error'\nimport Liquid from 'src/liquid'\nimport ParseStream from './parse-stream'\nimport Token from './token'\nimport TagToken from './tag-token'\nimport OutputToken from './output-token'\nimport Tag from 'src/template/tag/tag'\nimport Output from 'src/template/output'\nimport HTML from 'src/template/html'\nimport ITemplate from 'src/template/itemplate'\n\nexport default class Parser {\n liquid: Liquid\n\n constructor (liquid: Liquid) {\n this.liquid = liquid\n }\n parse (tokens: Array) {\n let token\n const templates: ITemplate[] = []\n while ((token = tokens.shift())) {\n templates.push(this.parseToken(token, tokens))\n }\n return templates\n }\n parseToken (token: Token, remainTokens: Array) {\n try {\n if (token.type === 'tag') {\n return new Tag(token as TagToken, remainTokens, this.liquid)\n }\n if (token.type === 'output') {\n return new Output(token as OutputToken, this.liquid.options.strict_filters)\n }\n return new HTML(token)\n } catch (e) {\n throw new ParseError(e, token)\n }\n }\n parseStream (tokens: Array) {\n return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens))\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { AssignScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst re = new RegExp(`(${identifier.source})\\\\s*=([^]*)`)\n\nexport default {\n parse: function (token: TagToken) {\n const match = token.args.match(re) as RegExpMatchArray\n assert(match, `illegal token ${token.raw}`)\n this.key = match[1]\n this.value = match[2]\n },\n render: function (scope: Scope) {\n const ctx = new AssignScope()\n ctx[this.key] = this.liquid.evalValue(this.value, scope)\n scope.push(ctx)\n return Promise.resolve('')\n }\n} as ITagImplOptions\n","/*\n * Call functions in serial until someone rejected.\n * @param {Array} iterable the array to iterate with.\n * @param {Array} iteratee returns a new promise.\n * The iteratee is invoked with three arguments: (value, index, iterable).\n */\nexport function mapSeries (\n iterable: T1[],\n iteratee: (item: T1, idx: number, iterable: T1[]) => Promise | T2\n): Promise {\n let ret = Promise.resolve(0)\n const result: T2[] = []\n iterable.forEach(function (item, idx) {\n ret = ret\n .then(() => iteratee(item, idx, iterable))\n .then(x => result.push(x))\n })\n return ret.then(() => result)\n}\n","import { mapSeries } from 'src/util/promise'\nimport { isString, isObject, isArray } from 'src/util/underscore'\nimport { evalExp } from 'src/render/syntax'\nimport assert from 'src/util/assert'\nimport { identifier, value, hash } from 'src/parser/lexical'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nconst re = new RegExp(`^(${identifier.source})\\\\s+in\\\\s+` +\n `(${value.source})` +\n `(?:\\\\s+${hash.source})*` +\n `(?:\\\\s+(reversed))?` +\n `(?:\\\\s+${hash.source})*$`)\n\nexport default {\n type: 'block',\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = re.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n this.variable = match[1]\n this.collection = match[2]\n this.reversed = !!match[3]\n\n this.templates = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endfor', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n render: async function (scope: Scope, hash: Hash) {\n let collection = evalExp(this.collection, scope)\n\n if (!isArray(collection)) {\n if (isString(collection) && collection.length > 0) {\n collection = [collection] as string[]\n } else if (isObject(collection)) {\n collection = Object.keys(collection).map((key) => [key, collection[key]]) as Array<[string, any]>\n }\n }\n if (!isArray(collection) || !collection.length) {\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n\n const offset = hash.offset || 0\n const limit = (hash.limit === undefined) ? collection.length : hash.limit\n\n collection = collection.slice(offset, offset + limit)\n if (this.reversed) collection.reverse()\n\n const contexts = collection.map((item: string, i: number) => {\n const ctx = {}\n ctx[this.variable] = item\n ctx['forloop'] = {\n first: i === 0,\n index: i + 1,\n index0: i,\n last: i === collection.length - 1,\n length: collection.length,\n rindex: collection.length - i,\n rindex0: collection.length - i - 1\n }\n return ctx\n })\n\n let html = ''\n let finished = false\n await mapSeries(contexts, async context => {\n if (finished) return\n\n scope.push(context)\n try {\n html += await this.liquid.renderer.renderTemplates(this.templates, scope)\n } catch (e) {\n if (e.name === 'RenderBreakError') {\n html += e.resolvedHTML\n if (e.message === 'break') {\n finished = true\n }\n } else throw e\n }\n scope.pop(context)\n })\n return html\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst re = new RegExp(`(${identifier.source})`)\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = tagToken.args.match(re) as RegExpMatchArray\n assert(match, `${tagToken.args} not valid identifier`)\n\n this.variable = match[1]\n this.templates = []\n\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream.on('tag:endcapture', () => stream.stop())\n .on('template', (tpl) => this.templates.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n },\n render: async function (scope: Scope) {\n const html = await this.liquid.renderer.renderTemplates(this.templates, scope)\n const ctx = new CaptureScope()\n ctx[this.variable] = html\n scope.push(ctx)\n }\n} as ITagImplOptions\n","import { evalExp } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.cond = tagToken.args\n this.cases = []\n this.elseTemplates = []\n\n let p: ITemplate[] = []\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('tag:when', (token: TagToken) => {\n this.cases.push({\n val: token.args,\n templates: p = []\n })\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endcase', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n for (let i = 0; i < this.cases.length; i++) {\n const branch = this.cases[i]\n const val = evalExp(branch.val, scope)\n const cond = evalExp(this.cond, scope)\n if (val === cond) {\n return this.liquid.renderer.renderTemplates(branch.templates, scope)\n }\n }\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream\n .on('token', (token: TagToken) => {\n if (token.name === 'endcomment') stream.stop()\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value, quotedLine } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst staticFileRE = /[^\\s,]+/\nconst withRE = new RegExp(`with\\\\s+(${value.source})`)\n\nexport default {\n parse: function (token: TagToken) {\n let match = staticFileRE.exec(token.args)\n if (match) {\n this.staticValue = match[0]\n }\n\n match = value.exec(token.args)\n if (match) {\n this.value = match[0]\n }\n\n match = withRE.exec(token.args)\n if (match) {\n this.with = match[1]\n }\n },\n render: async function (scope: Scope, hash: Hash) {\n let filepath\n if (scope.opts.dynamicPartials) {\n if (quotedLine.exec(this.value)) {\n const template = this.value.slice(1, -1)\n filepath = await this.liquid.parseAndRender(template, scope.getAll(), scope.opts)\n } else {\n filepath = evalValue(this.value, scope)\n }\n } else {\n filepath = this.staticValue\n }\n assert(filepath, `cannot include with empty filename`)\n\n const originBlocks = scope.blocks\n const originBlockMode = scope.blockMode\n\n scope.blocks = {}\n scope.blockMode = BlockMode.OUTPUT\n if (this.with) {\n hash[filepath] = evalValue(this.with, scope)\n }\n const templates = await this.liquid.getTemplate(filepath, scope.opts)\n scope.push(hash)\n const html = await this.liquid.renderer.renderTemplates(templates, scope)\n scope.pop(hash)\n scope.blocks = originBlocks\n scope.blockMode = originBlockMode\n return html\n }\n}\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope, AssignScope, DecrementScope } from 'src/scope/scopes'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (token: TagToken) {\n const match = token.args.match(identifier) as RegExpMatchArray\n assert(match, `illegal identifier ${token.args}`)\n this.variable = match[0]\n },\n render: function (scope: Scope) {\n let context = scope.findContextFor(\n this.variable,\n ctx => {\n return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope)\n }\n )\n if (!context) {\n context = new DecrementScope()\n scope.unshift(context)\n }\n if (typeof context[this.variable] !== 'number') {\n context[this.variable] = 0\n }\n return --context[this.variable]\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value as rValue } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst groupRE = new RegExp(`^(?:(${rValue.source})\\\\s*:\\\\s*)?(.*)$`)\nconst candidatesRE = new RegExp(rValue.source, 'g')\n\nexport default {\n parse: function (tagToken: TagToken) {\n let match: RegExpExecArray | null = groupRE.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n\n this.group = match[1] || ''\n const candidates = match[2]\n\n this.candidates = []\n\n while ((match = candidatesRE.exec(candidates))) {\n this.candidates.push(match[0])\n }\n assert(this.candidates.length, `empty candidates: ${tagToken.raw}`)\n },\n\n render: function (scope: Scope) {\n const group = evalValue(this.group, scope)\n const fingerprint = `cycle:${group}:` + this.candidates.join(',')\n const groups = scope.groups\n let idx = groups[fingerprint]\n\n if (idx === undefined) {\n idx = groups[fingerprint] = 0\n }\n\n const candidate = this.candidates[idx]\n idx = (idx + 1) % this.candidates.length\n groups[fingerprint] = idx\n\n return evalValue(candidate, scope)\n }\n}\n","import { evalExp, isTruthy } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITemplate from 'src/template/itemplate'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.branches = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n cond: tagToken.args,\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n this.branches.push({\n cond: token.args,\n templates: p = []\n })\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endif', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n for (const branch of this.branches) {\n const cond = evalExp(branch.cond, scope)\n if (isTruthy(cond)) {\n return this.liquid.renderer.renderTemplates(branch.templates, scope)\n }\n }\n return this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { identifier } from 'src/parser/lexical'\nimport { CaptureScope, AssignScope, IncrementScope } from 'src/scope/scopes'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (token) {\n const match = token.args.match(identifier)\n assert(match, `illegal identifier ${token.args}`)\n this.variable = match![0]\n },\n render: function (scope) {\n let context = scope.findContextFor(\n this.variable,\n ctx => {\n return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope)\n }\n )\n if (!context) {\n context = new IncrementScope()\n scope.unshift(context)\n }\n if (typeof context[this.variable] !== 'number') {\n context[this.variable] = 0\n }\n const val = context[this.variable]\n context[this.variable]++\n return val\n }\n} as ITagImplOptions\n","import assert from 'src/util/assert'\nimport { value as rValue } from 'src/parser/lexical'\nimport { evalValue } from 'src/render/syntax'\nimport BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst staticFileRE = /\\S+/\n\nexport default {\n parse: function (token: TagToken, remainTokens: Token[]) {\n let match = staticFileRE.exec(token.args)\n if (match) {\n this.staticLayout = match[0]\n }\n\n match = rValue.exec(token.args)\n if (match) {\n this.layout = match[0]\n }\n\n this.tpls = this.liquid.parser.parse(remainTokens)\n },\n render: async function (scope: Scope, hash: Hash) {\n const layout = scope.opts.dynamicPartials\n ? evalValue(this.layout, scope)\n : this.staticLayout\n assert(layout, `cannot apply layout with empty filename`)\n\n // render the remaining tokens immediately\n scope.blockMode = BlockMode.STORE\n const html = await this.liquid.renderer.renderTemplates(this.tpls, scope)\n if (scope.blocks[''] === undefined) {\n scope.blocks[''] = html\n }\n const templates = await this.liquid.getTemplate(layout, scope.opts)\n scope.push(hash)\n scope.blockMode = BlockMode.OUTPUT\n const partial = await this.liquid.renderer.renderTemplates(templates, scope)\n scope.pop(hash)\n return partial\n }\n} as ITagImplOptions\n","import BlockMode from 'src/scope/block-mode'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (token: TagToken, remainTokens: Token[]) {\n const match = /\\w+/.exec(token.args)\n this.block = match ? match[0] : ''\n this.tpls = [] as ITemplate[]\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('tag:endblock', () => stream.stop())\n .on('template', (tpl: ITemplate) => this.tpls.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${token.raw} not closed`)\n })\n stream.start()\n },\n render: async function (scope: Scope) {\n const childDefined = scope.blocks[this.block]\n const html = childDefined !== undefined\n ? childDefined\n : await this.liquid.renderer.renderTemplates(this.tpls, scope)\n\n if (scope.blockMode === BlockMode.STORE) {\n scope.blocks[this.block] = html\n return ''\n }\n return html\n }\n} as ITagImplOptions\n","import TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.tokens = []\n\n const stream = this.liquid.parser.parseStream(remainTokens)\n stream\n .on('token', (token: TagToken) => {\n if (token.name === 'endraw') stream.stop()\n else this.tokens.push(token)\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n stream.start()\n },\n render: function () {\n return this.tokens.map((token: Token) => token.raw).join('')\n }\n}\n","import { mapSeries } from 'src/util/promise'\nimport assert from 'src/util/assert'\nimport { evalExp } from 'src/render/syntax'\nimport { identifier, value, hash } from 'src/parser/lexical'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport ITemplate from 'src/template/itemplate'\nimport Scope from 'src/scope/scope'\nimport Hash from 'src/template/tag/hash'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nconst re = new RegExp(`^(${identifier.source})\\\\s+in\\\\s+` +\n `(${value.source})` +\n `(?:\\\\s+${hash.source})*$`)\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n const match = re.exec(tagToken.args) as RegExpExecArray\n assert(match, `illegal tag: ${tagToken.raw}`)\n\n this.variable = match[1]\n this.collection = match[2]\n this.templates = []\n\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:endtablerow', () => stream.stop())\n .on('template', (tpl: ITemplate) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: async function (scope: Scope, hash: Hash) {\n let collection = evalExp(this.collection, scope) || []\n const offset = hash.offset || 0\n const limit = (hash.limit === undefined) ? collection.length : hash.limit\n\n collection = collection.slice(offset, offset + limit)\n const cols = hash.cols || collection.length\n const contexts = collection.map((item: any) => {\n const ctx = {}\n ctx[this.variable] = item\n return ctx\n })\n\n let row: number = 0\n let html = ''\n await mapSeries(contexts, async (context, idx) => {\n row = Math.floor(idx / cols) + 1\n const col = (idx % cols) + 1\n if (col === 1) {\n if (row !== 1) {\n html += ''\n }\n html += ``\n }\n\n html += ``\n scope.push(context)\n html += await this.liquid.renderer.renderTemplates(this.templates, scope)\n html += ''\n scope.pop(context)\n return html\n })\n if (row > 0) {\n html += ''\n }\n return html\n }\n} as ITagImplOptions\n","import assign from './assign'\nimport For from './for'\nimport capture from './capture'\nimport Case from './case'\nimport comment from './comment'\nimport include from './include'\nimport decrement from './decrement'\nimport cycle from './cycle'\nimport If from './if'\nimport increment from './increment'\nimport layout from './layout'\nimport block from './block'\nimport raw from './raw'\nimport tablerow from './tablerow'\nimport unless from './unless'\nimport Break from './break'\nimport Continue from './continue'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\n\nconst tags: { [key: string]: ITagImplOptions } = {\n assign, 'for': For, capture, 'case': Case, comment, include, decrement, increment, cycle, 'if': If, layout, block, raw, tablerow, unless, 'break': Break, 'continue': Continue\n}\n\nexport default tags\n","import { evalExp, isFalsy } from 'src/render/syntax'\nimport TagToken from 'src/parser/tag-token'\nimport Token from 'src/parser/token'\nimport Scope from 'src/scope/scope'\nimport ITagImplOptions from 'src/template/tag/itag-impl-options'\nimport ParseStream from 'src/parser/parse-stream'\n\nexport default {\n parse: function (tagToken: TagToken, remainTokens: Token[]) {\n this.templates = []\n this.elseTemplates = []\n let p\n const stream: ParseStream = this.liquid.parser.parseStream(remainTokens)\n .on('start', () => {\n p = this.templates\n this.cond = tagToken.args\n })\n .on('tag:else', () => (p = this.elseTemplates))\n .on('tag:endunless', () => stream.stop())\n .on('template', tpl => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.raw} not closed`)\n })\n\n stream.start()\n },\n\n render: function (scope: Scope) {\n const cond = evalExp(this.cond, scope)\n return isFalsy(cond)\n ? this.liquid.renderer.renderTemplates(this.templates, scope)\n : this.liquid.renderer.renderTemplates(this.elseTemplates, scope)\n }\n} as ITagImplOptions\n","import { RenderBreakError } from 'src/util/error'\n\nexport default {\n render: async function () {\n throw new RenderBreakError('break')\n }\n}\n","import { RenderBreakError } from 'src/util/error'\n\nexport default {\n render: async function () {\n throw new RenderBreakError('continue')\n }\n}\n","const escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\nconst unescapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n}\n\nfunction escape (str: string) {\n return String(str).replace(/&|<|>|\"|'/g, m => escapeMap[m])\n}\n\nfunction unescape (str: string) {\n return String(str).replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m])\n}\n\nexport default {\n 'escape': escape,\n 'escape_once': (str: string) => escape(unescape(str)),\n 'newline_to_br': (v: string) => v.replace(/\\n/g, '
'),\n 'strip_html': (v: string) => v.replace(/|||<.*?>/g, '')\n}\n","import { FilterImpl } from 'src/template/filter/filter-impl'\n\nexport default {\n 'append': (v: string, arg: string) => v + arg,\n 'prepend': (v: string, arg: string) => arg + v,\n 'capitalize': (str: string) => String(str).charAt(0).toUpperCase() + str.slice(1),\n 'lstrip': (v: string) => String(v).replace(/^\\s+/, ''),\n 'downcase': (v: string) => v.toLowerCase(),\n 'upcase': (str: string) => String(str).toUpperCase(),\n 'remove': (v: string, arg: string) => v.split(arg).join(''),\n 'remove_first': (v: string, l: string) => v.replace(l, ''),\n 'replace': (v: string, pattern: string, replacement: string) =>\n String(v).split(pattern).join(replacement),\n 'replace_first': (v: string, arg1: string, arg2: string) => String(v).replace(arg1, arg2),\n 'rstrip': (str: string) => String(str).replace(/\\s+$/, ''),\n 'split': (v: string, arg: string) => String(v).split(arg),\n 'strip': (v: string) => String(v).trim(),\n 'strip_newlines': (v: string) => String(v).replace(/\\n/g, ''),\n 'truncate': (v: string, l: number = 50, o: string = '...') => {\n v = String(v)\n if (v.length <= l) return v\n return v.substr(0, l - o.length) + o\n },\n 'truncatewords': (v: string, l: number = 15, o: string = '...') => {\n const arr = v.split(/\\s+/)\n let ret = arr.slice(0, l).join(' ')\n if (arr.length >= l) ret += o\n return ret\n }\n} as {[key: string]: FilterImpl}\n","export default {\n 'abs': (v: number) => Math.abs(v),\n 'ceil': (v: number) => Math.ceil(v),\n 'divided_by': (v: number, arg: number) => v / arg,\n 'floor': (v: number) => Math.floor(v),\n 'minus': bindFixed((v: number, arg: number) => v - arg),\n 'modulo': bindFixed((v: number, arg: number) => v % arg),\n 'round': (v: number, arg: number = 0) => {\n const amp = Math.pow(10, arg)\n return Math.round(v * amp) / amp\n },\n 'plus': bindFixed((v: number, arg: number) => Number(v) + Number(arg)),\n 'times': (v: number, arg: number) => v * arg\n}\n\nfunction getFixed (v: number) {\n const p = String(v).split('.')\n return (p.length > 1) ? p[1].length : 0\n}\n\nfunction bindFixed (cb: (v: number, arg: number) => number) {\n return (l: number, r: number) => {\n const f = Math.max(getFixed(l), getFixed(r))\n return cb(l, r).toFixed(f)\n }\n}\n","export default {\n 'url_decode': (x: string) => x.split('+').map(decodeURIComponent).join(' '),\n 'url_encode': (x: string) => x.split(' ').map(encodeURIComponent).join('+')\n}\n","import { last } from 'src/util/underscore'\n\nexport default {\n 'join': (v: any[], arg: string) => v.join(arg === undefined ? ' ' : arg),\n 'last': (v: T[]): T => last(v),\n 'first': (v: T[]): T => v[0],\n 'map': (arr: {[key: string]: T1}[], arg: string): T1[] => arr.map(v => v[arg]),\n 'reverse': (v: any[]) => v.reverse(),\n 'sort': (v: T[], arg: (lhs: T, rhs: T) => number) => v.sort(arg),\n 'size': (v: string | any[]) => v.length,\n 'concat': (v: T1[], arg: T2[] | T2): Array => Array.prototype.concat.call(v, arg),\n 'slice': (v: T[], begin: number, length: number): T[] => {\n if (length === undefined) length = 1\n return v.slice(begin, begin + length)\n },\n 'uniq': function (arr: T[]): T[] {\n const u = {}\n return (arr || []).filter(val => {\n if (u.hasOwnProperty(String(val))) return false\n u[String(val)] = true\n return true\n })\n }\n}\n","import { padStart } from './underscore'\n\nconst monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\nconst dayNames = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n]\nconst monthNamesShort = monthNames.map(abbr)\nconst dayNamesShort = dayNames.map(abbr)\nconst suffixes = {\n 1: 'st',\n 2: 'nd',\n 3: 'rd',\n 'default': 'th'\n}\n\nfunction abbr (str: string) {\n return str.slice(0, 3)\n}\n\n// prototype extensions\nconst _date = {\n daysInMonth: function (d: Date) {\n const feb = _date.isLeapYear(d) ? 29 : 28\n return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n },\n\n getDayOfYear: function (d: Date) {\n let num = 0\n for (let i = 0; i < d.getMonth(); ++i) {\n num += _date.daysInMonth(d)[i]\n }\n return num + d.getDate()\n },\n\n getWeekOfYear: function (d: Date, startDay: number) {\n // Skip to startDay of this week\n const now = this.getDayOfYear(d) + (startDay - d.getDay())\n // Find the first startDay of the year\n const jan1 = new Date(d.getFullYear(), 0, 1)\n const then = (7 - jan1.getDay() + startDay)\n return padStart(String(Math.floor((now - then) / 7) + 1), 2, '0')\n },\n\n isLeapYear: function (d: Date) {\n const year = d.getFullYear()\n return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)))\n },\n\n getSuffix: function (d: Date) {\n const str = d.getDate().toString()\n const index = parseInt(str.slice(-1))\n return suffixes[index] || suffixes['default']\n },\n\n century: function (d: Date) {\n return parseInt(d.getFullYear().toString().substring(0, 2), 10)\n }\n}\n\nconst formatCodes = {\n a: function (d: Date) {\n return dayNamesShort[d.getDay()]\n },\n A: function (d: Date) {\n return dayNames[d.getDay()]\n },\n b: function (d: Date) {\n return monthNamesShort[d.getMonth()]\n },\n B: function (d: Date) {\n return monthNames[d.getMonth()]\n },\n c: function (d: Date) {\n return d.toLocaleString()\n },\n C: function (d: Date) {\n return _date.century(d)\n },\n d: function (d: Date) {\n return padStart(d.getDate(), 2, '0')\n },\n e: function (d: Date) {\n return padStart(d.getDate(), 2)\n },\n H: function (d: Date) {\n return padStart(d.getHours(), 2, '0')\n },\n I: function (d: Date) {\n return padStart(String(d.getHours() % 12 || 12), 2, '0')\n },\n j: function (d: Date) {\n return padStart(_date.getDayOfYear(d), 3, '0')\n },\n k: function (d: Date) {\n return padStart(d.getHours(), 2)\n },\n l: function (d: Date) {\n return padStart(String(d.getHours() % 12 || 12), 2)\n },\n L: function (d: Date) {\n return padStart(d.getMilliseconds(), 3, '0')\n },\n m: function (d: Date) {\n return padStart(d.getMonth() + 1, 2, '0')\n },\n M: function (d: Date) {\n return padStart(d.getMinutes(), 2, '0')\n },\n p: function (d: Date) {\n return (d.getHours() < 12 ? 'AM' : 'PM')\n },\n P: function (d: Date) {\n return (d.getHours() < 12 ? 'am' : 'pm')\n },\n q: function (d: Date) {\n return _date.getSuffix(d)\n },\n s: function (d: Date) {\n return Math.round(d.valueOf() / 1000)\n },\n S: function (d: Date) {\n return padStart(d.getSeconds(), 2, '0')\n },\n u: function (d: Date) {\n return d.getDay() || 7\n },\n U: function (d: Date) {\n return _date.getWeekOfYear(d, 0)\n },\n w: function (d: Date) {\n return d.getDay()\n },\n W: function (d: Date) {\n return _date.getWeekOfYear(d, 1)\n },\n x: function (d: Date) {\n return d.toLocaleDateString()\n },\n X: function (d: Date) {\n return d.toLocaleTimeString()\n },\n y: function (d: Date) {\n return d.getFullYear().toString().substring(2, 4)\n },\n Y: function (d: Date) {\n return d.getFullYear()\n },\n z: function (d: Date) {\n const tz = d.getTimezoneOffset() / 60 * 100\n return (tz > 0 ? '-' : '+') + padStart(String(Math.abs(tz)), 4, '0')\n },\n '%': function () {\n return '%'\n }\n};\n(formatCodes as any).h = formatCodes.b;\n(formatCodes as any).N = formatCodes.L\n\nexport default function (d: Date, format: string) {\n let output = ''\n let remaining = format\n\n while (true) {\n const r = /%./g\n const results = r.exec(remaining)\n\n // No more format codes. Add the remaining text and return\n if (!results) {\n return output + remaining\n }\n\n // Add the preceding text\n output += remaining.slice(0, r.lastIndex - 2)\n remaining = remaining.slice(r.lastIndex)\n\n // Add the format code\n const ch = results[0].charAt(1)\n const func = formatCodes[ch]\n output += func ? func(d) : '%' + ch\n }\n}\n","import html from './html'\nimport str from './string'\nimport math from './math'\nimport url from './url'\nimport array from './array'\nimport date from './date'\nimport obj from './object'\n\nexport default { ...html, ...str, ...math, ...url, ...date, ...obj, ...array }\n","import strftime from 'src/util/strftime'\nimport { isString } from 'src/util/underscore'\n\nexport default {\n 'date': (v: string | Date, arg: string) => {\n let date = v\n if (v === 'now') {\n date = new Date()\n } else if (isString(v)) {\n date = new Date(v)\n }\n return isValidDate(date) ? strftime(date, arg) : v\n }\n}\n\nfunction isValidDate (date: any): date is Date {\n return date instanceof Date && !isNaN(date.getTime())\n}\n","import { isTruthy } from 'src/render/syntax'\n\nexport default {\n 'default': (v: T1, arg: T2): T1 | T2 => isTruthy(v) ? v : arg\n}\n","import Scope from './scope/scope'\nimport * as Types from './types'\nimport fs from 'src/fs'\nimport * as _ from './util/underscore'\nimport ITemplate from './template/itemplate'\nimport Tokenizer from './parser/tokenizer'\nimport Render from './render/render'\nimport Tag from './template/tag/tag'\nimport Filter from './template/filter/filter'\nimport Parser from './parser/parser'\nimport ITagImplOptions from './template/tag/itag-impl-options'\nimport Value from './template/value'\nimport { isTruthy, isFalsy, evalExp, evalValue } from './render/syntax'\nimport builtinTags from './builtin/tags'\nimport builtinFilters from './builtin/filters'\nimport { LiquidOptions, NormalizedFullOptions, applyDefault, normalize } from './liquid-options'\nimport { FilterImpl } from './template/filter/filter-impl'\n\nexport default class Liquid {\n public options: NormalizedFullOptions\n public renderer: Render\n public parser: Parser\n private cache: object = {}\n private tokenizer: Tokenizer\n\n constructor (opts: LiquidOptions = {}) {\n this.options = applyDefault(normalize(opts))\n this.parser = new Parser(this)\n this.renderer = new Render()\n this.tokenizer = new Tokenizer(this.options)\n\n _.forOwn(builtinTags, (conf, name) => this.registerTag(name, conf))\n _.forOwn(builtinFilters, (handler, name) => this.registerFilter(name, handler))\n }\n parse (html: string, filepath?: string) {\n const tokens = this.tokenizer.tokenize(html, filepath)\n return this.parser.parse(tokens)\n }\n render (tpl: Array, ctx?: object, opts?: LiquidOptions) {\n const options = { ...this.options, ...normalize(opts) }\n const scope = new Scope(ctx, options)\n return this.renderer.renderTemplates(tpl, scope)\n }\n async parseAndRender (html: string, ctx?: object, opts?: LiquidOptions) {\n const tpl = await this.parse(html)\n return this.render(tpl, ctx, opts)\n }\n async getTemplate (file: string, opts?: LiquidOptions) {\n const options = normalize(opts)\n const roots = options.root ? [...options.root, ...this.options.root] : this.options.root\n const paths = roots.map(root => fs.resolve(root, file, this.options.extname))\n\n for (const filepath of paths) {\n if (!(await fs.exists(filepath))) continue\n\n if (this.options.cache && this.cache[filepath]) return this.cache[filepath]\n const value = this.parse(await fs.readFile(filepath), filepath)\n if (this.options.cache) this.cache[filepath] = value\n return value\n }\n\n const err = new Error('ENOENT') as any\n err.message = `ENOENT: Failed to lookup \"${file}\" in \"${roots}\"`\n err.code = 'ENOENT'\n throw err\n }\n async renderFile (file: string, ctx?: object, opts?: LiquidOptions) {\n const options = normalize(opts)\n const templates = await this.getTemplate(file, options)\n return this.render(templates, ctx, opts)\n }\n evalValue (str: string, scope: Scope) {\n return new Value(str, this.options.strict_filters).value(scope)\n }\n registerFilter (name: string, filter: FilterImpl) {\n return Filter.register(name, filter)\n }\n registerTag (name: string, tag: ITagImplOptions) {\n return Tag.register(name, tag)\n }\n plugin (plugin: (this: Liquid, L: typeof Liquid) => void) {\n return plugin.call(this, Liquid)\n }\n express () {\n const self = this\n return function (this: any, filePath: string, ctx: object, cb: (err: Error | null, html?: string) => void) {\n const opts = { root: this.root }\n self.renderFile(filePath, ctx, opts).then(html => cb(null, html), cb)\n }\n }\n static default = Liquid\n static isTruthy = isTruthy\n static isFalsy = isFalsy\n static evalExp = evalExp\n static evalValue = evalValue\n static Types = Types\n}\n"],"names":["toStr","Object","prototype","toString","arrToStr","Array","isString","value","call","isFunction","stringify","isNil","to_liquid","toLiquid","to_s","indexOf","cache","JSON","key","isObject","push","isArray","forOwn","object","iteratee","k","hasOwnProperty","last","arr","length","type","range","start","stop","step","undefined","i","padStart","str","ch","n","String","err","token","_super","message","_this","originalError","tslib_1.__extends","LiquidError","lines","begin","end","this","context","input","split","Math","max","line","min","_\r\n .range","map","lineNumber","indicator","num","_.padStart","text","join","msg","file","col","mkMessage","stack","Error","name","update","tpl","predicate","AssertionError","BlockMode","defaultOptions","root","extname","dynamicPartials","trim_tag_right","trim_tag_left","trim_output_right","trim_output_left","greedy","tag_delimiter_left","tag_delimiter_right","output_delimiter_left","output_delimiter_right","strict_filters","strict_variables","normalize","options","_.isArray","_.isString","applyDefault","ctx","opts","OUTPUT","contexts","Scope","reduce","val","__assign","path","paths","propertyAccessSeq","scope","findContextFor","_.last","readProperty","v","some","_.isObject","unshift","arguments","pop","findIndex","TypeError","splice","filter","candidate","obj","_.isNil","_.isFunction","size","liquid_method_missing","j","seq","delemiter","test","assert","slice","matchRightBracket","get","readFile","url","Promise","resolve","reject","xhr","XMLHttpRequest","onload","status","responseText","statusText","onerror","open","send","filepath","ext","base","document","createElement","href","head","getElementsByTagName","insertBefore","firstChild","a","resolved","removeChild","domResolve","replace","origin","exists","ParseState","raw","Token","pos","trimLeft","trimRight","trim","quoted","RegExp","source","quoteBalanced","number","identifier","subscript","literal","variable","rangeLimit","rangeCapture","hash","hashCapture","tagLine","quotedLine","rangeLine","operators","match","lexical.tagLine","TokenizationError","args","DelimitedToken","Tokenizer","tokens","tagL","tagR","outputL","outputR","p","curLine","state","HTML","buffer","lineBegin","substr","HTMLToken","TAG","OutputToken","TagToken","inRaw","forEach","rLeft","rRight","whiteSpaceCtrl","t","Render","templates","html","templates_1","_i","_a","render","_b","e_1","resolvedHTML","RenderError","isComparable","arg","equals","isDrop","Drop","EmptyDrop","keys","BlankDrop","NullDrop","binaryOperators","==","l","r","!=",">","gt","lt","<",">=","geq","leq","<=","contains","and","isTruthy","or","evalExp","parseExp","exp","operatorREs","lexical.operators","operatorRE","expRE","lexical.quoteBalanced","op","lexical.rangeLine","parseValue","isNaN","Number","evalValue","isFalsy","markup","lastIndex","exec","liquid","proto","impl","Tag","impls","create","parse","Hash","tag","Template","strictFilters","Filter","x","apply","parseToken","ParseStream","cb","handlers","event","h","trigger","stopRequested","shift","template","INIT","sealed","filterName","filterArgs","initial","FILTER_NAME","filters","FILTER_ARG","default_1","prev","Value","Output","Parser","remainTokens","e","ParseError","re","AssignScope","mapSeries","iterable","ret","result","item","idx","then","tagToken","collection","reversed","elseTemplates","stream","parser","parseStream","on","offset","limit","reverse","first","index","index0","rindex","rindex0","finished","renderer","renderTemplates","CaptureScope","cond","cases","branch","staticFileRE","withRE","staticValue","with","parseAndRender","getAll","originBlocks","blocks","originBlockMode","blockMode","getTemplate","DecrementScope","groupRE","rValue","candidatesRE","group","candidates","fingerprint","groups","branches","IncrementScope","staticLayout","layout","tpls","STORE","partial","block","childDefined","tags","assign","for","For","capture","case","Case","comment","include","decrement","increment","cycle","if","If","tablerow","cols","row","floor","unless","break","RenderBreakError","continue","escapeMap","&","\"","'","unescapeMap","&","<",">",""","'","escape","m","escape_once","newline_to_br","strip_html","append","prepend","capitalize","charAt","toUpperCase","lstrip","downcase","toLowerCase","upcase","remove","remove_first","pattern","replacement","replace_first","arg1","arg2","rstrip","strip","strip_newlines","truncate","o","truncatewords","abs","ceil","divided_by","minus","bindFixed","modulo","round","amp","pow","plus","times","getFixed","f","toFixed","url_decode","decodeURIComponent","url_encode","encodeURIComponent","sort","concat","uniq","u","monthNames","dayNames","monthNamesShort","abbr","dayNamesShort","suffixes","1","2","3","default","_date","daysInMonth","d","isLeapYear","getDayOfYear","getMonth","getDate","getWeekOfYear","startDay","now","getDay","Date","getFullYear","year","getSuffix","parseInt","century","substring","formatCodes","A","b","B","c","toLocaleString","C","H","getHours","I","L","getMilliseconds","M","getMinutes","P","q","s","valueOf","S","getSeconds","U","w","W","toLocaleDateString","X","toLocaleTimeString","y","Y","z","tz","getTimezoneOffset","%","N","math","date","getTime","format","output","remaining","results","func","strftime","array","tokenizer","_.forOwn","builtinTags","conf","registerTag","builtinFilters","handler","registerFilter","Liquid","tokenize","roots","fs","paths_1","code","register","plugin","self","filePath","renderFile","Types"],"mappings":"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"} \ No newline at end of file diff --git a/dist/parser/delimited-token.d.ts b/dist/parser/delimited-token.d.ts deleted file mode 100644 index 418cf3ea0..000000000 --- a/dist/parser/delimited-token.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Token from './token'; -export default class DelimitedToken extends Token { - trimLeft: boolean; - trimRight: boolean; - constructor(raw: string, value: string, input: string, line: number, pos: number, file?: string); -} diff --git a/dist/parser/html-token.d.ts b/dist/parser/html-token.d.ts deleted file mode 100644 index 041e4a8fb..000000000 --- a/dist/parser/html-token.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Token from './token'; -export default class HTMLToken extends Token { - constructor(str: string, input: string, line: number, col: number, file?: string); -} diff --git a/dist/parser/lexical.d.ts b/dist/parser/lexical.d.ts deleted file mode 100644 index 334560d89..000000000 --- a/dist/parser/lexical.d.ts +++ /dev/null @@ -1,35 +0,0 @@ -export declare const quoted: RegExp; -export declare const quoteBalanced: RegExp; -export declare const integer: RegExp; -export declare const number: RegExp; -export declare const bool: RegExp; -export declare const identifier: RegExp; -export declare const subscript: RegExp; -export declare const literal: RegExp; -export declare const variable: RegExp; -export declare const rangeLimit: RegExp; -export declare const range: RegExp; -export declare const rangeCapture: RegExp; -export declare const value: RegExp; -export declare const hash: RegExp; -export declare const hashCapture: RegExp; -export declare const tagLine: RegExp; -export declare const literalLine: RegExp; -export declare const variableLine: RegExp; -export declare const numberLine: RegExp; -export declare const boolLine: RegExp; -export declare const quotedLine: RegExp; -export declare const rangeLine: RegExp; -export declare const integerLine: RegExp; -export declare const valueDeclaration: RegExp; -export declare const valueList: RegExp; -export declare const filter: RegExp; -export declare const filterCapture: RegExp; -export declare const filterLine: RegExp; -export declare const operators: RegExp[]; -export declare function isInteger(str: string): boolean; -export declare function isLiteral(str: string): boolean; -export declare function isRange(str: string): boolean; -export declare function isVariable(str: string): boolean; -export declare function matchValue(str: string): RegExpExecArray | null; -export declare function parseLiteral(str: string): string | number | boolean; diff --git a/dist/parser/output-token.d.ts b/dist/parser/output-token.d.ts deleted file mode 100644 index 1d9e43de5..000000000 --- a/dist/parser/output-token.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import DelimitedToken from './delimited-token'; -export default class OutputToken extends DelimitedToken { - constructor(raw: string, value: string, input: string, line: number, pos: number, file?: string); -} diff --git a/dist/parser/parse-stream.d.ts b/dist/parser/parse-stream.d.ts deleted file mode 100644 index a550002db..000000000 --- a/dist/parser/parse-stream.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Token from 'src/parser/token'; -import ITemplate from 'src/template/itemplate'; -declare type ParseToken = ((token: Token, remainTokens: Array) => ITemplate); -export default class ParseStream { - private tokens; - private handlers; - private stopRequested; - private parseToken; - constructor(tokens: Array, parseToken: ParseToken); - on(name: string, cb: (arg: T) => void): ParseStream; - trigger(event: string, arg?: T): boolean; - start(): this; - stop(): this; -} -export {}; diff --git a/dist/parser/parser.d.ts b/dist/parser/parser.d.ts deleted file mode 100644 index fa2b4e773..000000000 --- a/dist/parser/parser.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import Liquid from 'src/liquid'; -import ParseStream from './parse-stream'; -import Token from './token'; -import Tag from 'src/template/tag/tag'; -import Output from 'src/template/output'; -import HTML from 'src/template/html'; -import ITemplate from 'src/template/itemplate'; -export default class Parser { - liquid: Liquid; - constructor(liquid: Liquid); - parse(tokens: Array): ITemplate[]; - parseToken(token: Token, remainTokens: Array): Tag | Output | HTML; - parseStream(tokens: Array): ParseStream; -} diff --git a/dist/parser/tag-token.d.ts b/dist/parser/tag-token.d.ts deleted file mode 100644 index ac0d4b6d9..000000000 --- a/dist/parser/tag-token.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import DelimitedToken from './delimited-token'; -export default class TagToken extends DelimitedToken { - name: string; - args: string; - constructor(raw: string, value: string, input: string, line: number, pos: number, file?: string); -} diff --git a/dist/parser/token.d.ts b/dist/parser/token.d.ts deleted file mode 100644 index 22857d659..000000000 --- a/dist/parser/token.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default class Token { - type: string; - line: number; - col: number; - raw: string; - input: string; - file?: string; - value: string; - constructor(raw: string, input: string, line: number, col: number, file?: string); -} diff --git a/dist/parser/tokenizer.d.ts b/dist/parser/tokenizer.d.ts deleted file mode 100644 index d55268258..000000000 --- a/dist/parser/tokenizer.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Token from './token'; -import { NormalizedFullOptions } from '../liquid-options'; -export default class Tokenizer { - options: NormalizedFullOptions; - constructor(options?: NormalizedFullOptions); - tokenize(input: string, file?: string): Token[]; -} diff --git a/dist/parser/whitespace-ctrl.d.ts b/dist/parser/whitespace-ctrl.d.ts deleted file mode 100644 index 21cf629d4..000000000 --- a/dist/parser/whitespace-ctrl.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Token from 'src/parser/token'; -import { NormalizedFullOptions } from 'src/liquid-options'; -export default function whiteSpaceCtrl(tokens: Token[], options: NormalizedFullOptions): void; diff --git a/dist/render/render.d.ts b/dist/render/render.d.ts deleted file mode 100644 index b097cd8cc..000000000 --- a/dist/render/render.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Scope from 'src/scope/scope'; -import ITemplate from 'src/template/itemplate'; -export default class Render { - renderTemplates(templates: ITemplate[], scope: Scope): Promise; -} diff --git a/dist/render/syntax.d.ts b/dist/render/syntax.d.ts deleted file mode 100644 index d97cbc4e7..000000000 --- a/dist/render/syntax.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Scope from 'src/scope/scope'; -export declare function evalExp(exp: string, scope: Scope): any; -export declare function evalValue(str: string, scope: Scope): any; -export declare function isTruthy(val: any): boolean; -export declare function isFalsy(val: any): boolean; diff --git a/dist/rollup.config.d.ts b/dist/rollup.config.d.ts deleted file mode 100644 index 51c0afd80..000000000 --- a/dist/rollup.config.d.ts +++ /dev/null @@ -1,43 +0,0 @@ -declare const _default: ({ - output: { - file: string; - name: string; - format: string; - sourcemap: boolean; - banner: string; - }[]; - external: string[]; - plugins: import("rollup").Plugin[]; - treeshake: { - propertyReadSideEffects: boolean; - }; - input: string; -} | { - output: { - file: string; - name: string; - format: string; - sourcemap: boolean; - banner: string; - }[]; - plugins: any[]; - treeshake: { - propertyReadSideEffects: boolean; - }; - input: string; - external?: undefined; -} | { - output: { - file: string; - name: string; - format: string; - sourcemap: boolean; - }[]; - plugins: any[]; - treeshake: { - propertyReadSideEffects: boolean; - }; - input: string; - external?: undefined; -})[]; -export default _default; diff --git a/dist/scope/block-mode.d.ts b/dist/scope/block-mode.d.ts deleted file mode 100644 index 3f0bc6c83..000000000 --- a/dist/scope/block-mode.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare enum BlockMode { - OUTPUT = 0, - STORE = 1 -} -export default BlockMode; diff --git a/dist/scope/icontext.d.ts b/dist/scope/icontext.d.ts deleted file mode 100644 index 5b3df5e55..000000000 --- a/dist/scope/icontext.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default interface IContext { - [key: string]: any; - liquid_method_missing?: (key: string) => any; -} diff --git a/dist/scope/scope.d.ts b/dist/scope/scope.d.ts deleted file mode 100644 index fa97bd8fd..000000000 --- a/dist/scope/scope.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NormalizedFullOptions } from '../liquid-options'; -import BlockMode from './block-mode'; -import IContext from './icontext'; -export default class Scope { - opts: NormalizedFullOptions; - contexts: Array; - blocks: object; - groups: { - [key: string]: number; - }; - blockMode: BlockMode; - constructor(ctx?: object, opts?: NormalizedFullOptions); - getAll(): IContext; - get(path: string): any; - set(path: string, v: any): void; - unshift(ctx: object): number; - push(ctx: object): number; - pop(ctx?: object): object | undefined; - findContextFor(key: string, filter?: ((conttext: object) => boolean)): IContext | null; - private readProperty; - propertyAccessSeq(str: string): string[]; -} diff --git a/dist/scope/scopes.d.ts b/dist/scope/scopes.d.ts deleted file mode 100644 index e4ebea46d..000000000 --- a/dist/scope/scopes.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare class CaptureScope { -} -export declare class AssignScope { -} -export declare class IncrementScope { -} -export declare class DecrementScope { -} diff --git a/dist/src/builtin/filters/array.d.ts b/dist/src/builtin/filters/array.d.ts deleted file mode 100644 index 0d48ffe8f..000000000 --- a/dist/src/builtin/filters/array.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -declare const _default: { - 'join': (v: any[], arg: string) => string; - 'last': (v: T[]) => T; - 'first': (v: T[]) => T; - 'map': (arr: { - [key: string]: T1; - }[], arg: string) => T1[]; - 'reverse': (v: any[]) => any[]; - 'sort': (v: T[], arg: (lhs: T, rhs: T) => number) => T[]; - 'size': (v: string | any[]) => number; - 'concat': (v: T1[], arg: T2 | T2[]) => (T1 | T2)[]; - 'slice': (v: T[], begin: number, length: number) => T[]; - 'uniq': (arr: T[]) => T[]; -}; -export default _default; diff --git a/dist/src/builtin/filters/date.d.ts b/dist/src/builtin/filters/date.d.ts deleted file mode 100644 index 8b2e69ab0..000000000 --- a/dist/src/builtin/filters/date.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const _default: { - 'date': (v: string | Date, arg: string) => string | Date; -}; -export default _default; diff --git a/dist/src/builtin/filters/html.d.ts b/dist/src/builtin/filters/html.d.ts deleted file mode 100644 index 23600e019..000000000 --- a/dist/src/builtin/filters/html.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare function escape(str: string): string; -declare const _default: { - 'escape': typeof escape; - 'escape_once': (str: string) => string; - 'newline_to_br': (v: string) => string; - 'strip_html': (v: string) => string; -}; -export default _default; diff --git a/dist/src/builtin/filters/index.d.ts b/dist/src/builtin/filters/index.d.ts deleted file mode 100644 index da2b76608..000000000 --- a/dist/src/builtin/filters/index.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -declare const _default: { - 'join': (v: any[], arg: string) => string; - 'last': (v: T[]) => T; - 'first': (v: T[]) => T; - 'map': (arr: { - [key: string]: T1; - }[], arg: string) => T1[]; - 'reverse': (v: any[]) => any[]; - 'sort': (v: T[], arg: (lhs: T, rhs: T) => number) => T[]; - 'size': (v: string | any[]) => number; - 'concat': (v: T1[], arg: T2 | T2[]) => (T1 | T2)[]; - 'slice': (v: T[], begin: number, length: number) => T[]; - 'uniq': (arr: T[]) => T[]; - 'default': (v: T1, arg: T2) => T1 | T2; - 'date': (v: string | Date, arg: string) => string | Date; - 'url_decode': (x: string) => string; - 'url_encode': (x: string) => string; - 'abs': (v: number) => number; - 'ceil': (v: number) => number; - 'divided_by': (v: number, arg: number) => number; - 'floor': (v: number) => number; - 'minus': (l: number, r: number) => string; - 'modulo': (l: number, r: number) => string; - 'round': (v: number, arg?: number) => number; - 'plus': (l: number, r: number) => string; - 'times': (v: number, arg: number) => number; - 'escape': (str: string) => string; - 'escape_once': (str: string) => string; - 'newline_to_br': (v: string) => string; - 'strip_html': (v: string) => string; -}; -export default _default; diff --git a/dist/src/builtin/filters/math.d.ts b/dist/src/builtin/filters/math.d.ts deleted file mode 100644 index e5f8330d2..000000000 --- a/dist/src/builtin/filters/math.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -declare const _default: { - 'abs': (v: number) => number; - 'ceil': (v: number) => number; - 'divided_by': (v: number, arg: number) => number; - 'floor': (v: number) => number; - 'minus': (l: number, r: number) => string; - 'modulo': (l: number, r: number) => string; - 'round': (v: number, arg?: number) => number; - 'plus': (l: number, r: number) => string; - 'times': (v: number, arg: number) => number; -}; -export default _default; diff --git a/dist/src/builtin/filters/object.d.ts b/dist/src/builtin/filters/object.d.ts deleted file mode 100644 index d5ec20a60..000000000 --- a/dist/src/builtin/filters/object.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const _default: { - 'default': (v: T1, arg: T2) => T1 | T2; -}; -export default _default; diff --git a/dist/src/builtin/filters/string.d.ts b/dist/src/builtin/filters/string.d.ts deleted file mode 100644 index c46d278d8..000000000 --- a/dist/src/builtin/filters/string.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { FilterImpl } from 'src/template/filter/filter-impl'; -declare const _default: { - [key: string]: FilterImpl; -}; -export default _default; diff --git a/dist/src/builtin/filters/url.d.ts b/dist/src/builtin/filters/url.d.ts deleted file mode 100644 index 1c595dcb6..000000000 --- a/dist/src/builtin/filters/url.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare const _default: { - 'url_decode': (x: string) => string; - 'url_encode': (x: string) => string; -}; -export default _default; diff --git a/dist/src/builtin/tags/assign.d.ts b/dist/src/builtin/tags/assign.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/assign.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/block.d.ts b/dist/src/builtin/tags/block.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/block.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/break.d.ts b/dist/src/builtin/tags/break.d.ts deleted file mode 100644 index 6fd7eb732..000000000 --- a/dist/src/builtin/tags/break.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const _default: { - render: () => Promise; -}; -export default _default; diff --git a/dist/src/builtin/tags/capture.d.ts b/dist/src/builtin/tags/capture.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/capture.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/case.d.ts b/dist/src/builtin/tags/case.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/case.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/comment.d.ts b/dist/src/builtin/tags/comment.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/comment.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/continue.d.ts b/dist/src/builtin/tags/continue.d.ts deleted file mode 100644 index 6fd7eb732..000000000 --- a/dist/src/builtin/tags/continue.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -declare const _default: { - render: () => Promise; -}; -export default _default; diff --git a/dist/src/builtin/tags/cycle.d.ts b/dist/src/builtin/tags/cycle.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/cycle.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/decrement.d.ts b/dist/src/builtin/tags/decrement.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/decrement.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/for.d.ts b/dist/src/builtin/tags/for.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/for.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/if.d.ts b/dist/src/builtin/tags/if.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/if.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/include.d.ts b/dist/src/builtin/tags/include.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/include.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/increment.d.ts b/dist/src/builtin/tags/increment.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/increment.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/index.d.ts b/dist/src/builtin/tags/index.d.ts deleted file mode 100644 index c763955b6..000000000 --- a/dist/src/builtin/tags/index.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const tags: { - [key: string]: ITagImplOptions; -}; -export default tags; diff --git a/dist/src/builtin/tags/layout.d.ts b/dist/src/builtin/tags/layout.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/layout.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/raw.d.ts b/dist/src/builtin/tags/raw.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/raw.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/tablerow.d.ts b/dist/src/builtin/tags/tablerow.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/tablerow.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/builtin/tags/unless.d.ts b/dist/src/builtin/tags/unless.d.ts deleted file mode 100644 index b05d7ea10..000000000 --- a/dist/src/builtin/tags/unless.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import ITagImplOptions from 'src/template/tag/itag-impl-options'; -declare const _default: ITagImplOptions; -export default _default; diff --git a/dist/src/drop/blank-drop.d.ts b/dist/src/drop/blank-drop.d.ts deleted file mode 100644 index 84424417d..000000000 --- a/dist/src/drop/blank-drop.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { EmptyDrop } from 'src/drop/empty-drop'; -export declare class BlankDrop extends EmptyDrop { - equals(value: any): boolean; -} diff --git a/dist/src/drop/drop.d.ts b/dist/src/drop/drop.d.ts deleted file mode 100644 index 93a1d0470..000000000 --- a/dist/src/drop/drop.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export declare abstract class Drop { -} diff --git a/dist/src/drop/empty-drop.d.ts b/dist/src/drop/empty-drop.d.ts deleted file mode 100644 index fe178530e..000000000 --- a/dist/src/drop/empty-drop.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Drop } from './drop'; -import { IComparable } from './icomparable'; -import { IDrop } from 'src/drop/idrop'; -export declare class EmptyDrop extends Drop implements IDrop, IComparable { - equals(value: any): boolean; - gt(): boolean; - geq(): boolean; - lt(): boolean; - leq(): boolean; - value(): string; -} diff --git a/dist/src/drop/icomparable.d.ts b/dist/src/drop/icomparable.d.ts deleted file mode 100644 index f50316c59..000000000 --- a/dist/src/drop/icomparable.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface IComparable { - equals: (rhs: any) => boolean; - gt: (rhs: any) => boolean; - geq: (rhs: any) => boolean; - lt: (rhs: any) => boolean; - leq: (rhs: any) => boolean; -} -export declare function isComparable(arg: any): arg is IComparable; diff --git a/dist/src/drop/idrop.d.ts b/dist/src/drop/idrop.d.ts deleted file mode 100644 index 4f159537b..000000000 --- a/dist/src/drop/idrop.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface IDrop { - value(): any; -} -export declare function isDrop(value: any): value is IDrop; diff --git a/dist/src/drop/null-drop.d.ts b/dist/src/drop/null-drop.d.ts deleted file mode 100644 index 4c2e344ab..000000000 --- a/dist/src/drop/null-drop.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Drop } from './drop'; -import { IComparable } from './icomparable'; -import { IDrop } from 'src/drop/idrop'; -export declare class NullDrop extends Drop implements IDrop, IComparable { - equals(value: any): boolean; - gt(): boolean; - geq(): boolean; - lt(): boolean; - leq(): boolean; - value(): null; -} diff --git a/dist/src/fs/browser.d.ts b/dist/src/fs/browser.d.ts deleted file mode 100644 index f242e1186..000000000 --- a/dist/src/fs/browser.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import IFS from './ifs'; -declare const _default: IFS; -export default _default; diff --git a/dist/src/fs/ifs.d.ts b/dist/src/fs/ifs.d.ts deleted file mode 100644 index 213c8533a..000000000 --- a/dist/src/fs/ifs.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export default interface IFS { - exists: (filepath: string) => Promise; - readFile: (filepath: string) => Promise; - resolve: (root: string, file: string, ext: string) => string; -} diff --git a/dist/src/fs/node.d.ts b/dist/src/fs/node.d.ts deleted file mode 100644 index aeeb97c10..000000000 --- a/dist/src/fs/node.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import IFS from './ifs'; -declare const fs: IFS; -export default fs; diff --git a/dist/src/liquid-options.d.ts b/dist/src/liquid-options.d.ts deleted file mode 100644 index e016d23be..000000000 --- a/dist/src/liquid-options.d.ts +++ /dev/null @@ -1,53 +0,0 @@ -export interface LiquidOptions { - /** `root` is a directory or an array of directories to resolve layouts and includes, as well as the filename passed in when calling `.renderFile()`. If an array, the files are looked up in the order they occur in the array. Defaults to `["."]` */ - root?: string | string[]; - /** `extname` is used to lookup the template file when filepath doesn't include an extension name. Eg: setting to `".html"` will allow including file by basename. Defaults to `""`. */ - extname?: string; - /** `cache` indicates whether or not to cache resolved templates. Defaults to `false`. */ - cache?: boolean; - /** `dynamicPartials`: if set, treat `` parameter in `{%include filepath %}`, `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */ - dynamicPartials?: boolean; - /** `strict_filters` is used to enable strict filter existence. If set to `false`, undefined filters will be rendered as empty string. Otherwise, undefined filters will cause an exception. Defaults to `false`. */ - strict_filters?: boolean; - /** `strict_variables` is used to enable strict variable derivation. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */ - strict_variables?: boolean; - /** `trim_tag_right` is used to strip blank characters (including ` `, `\t`, and `\r`) from the right of tags (`{% %}`) until `\n` (inclusive). Defaults to `false`. */ - trim_tag_right?: boolean; - /** `trim_tag_left` is similar to `trim_tag_right`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */ - trim_tag_left?: boolean; - /** ``trim_output_right` is used to strip blank characters (including ` `, `\t`, and `\r`) from the right of values (`{{ }}`) until `\n` (inclusive). Defaults to `false`. */ - trim_output_right?: boolean; - /** `trim_output_left` is similar to `trim_output_right`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */ - trim_output_left?: boolean; - /** `tag_delimiter_left` and `tag_delimiter_right` are used to override the delimiter for liquid tags **/ - tag_delimiter_left?: string; - tag_delimiter_right?: string; - /** `output_delimiter_left` and `output_delimiter_right` are used to override the delimiter for liquid outputs **/ - output_delimiter_left?: string; - output_delimiter_right?: string; - /** `greedy` is used to specify whether `trim_left`/`trim_right` is greedy. When set to `true`, all consecutive blank characters including `\n` will be trimed regardless of line breaks. Defaults to `true`. */ - greedy?: boolean; -} -interface NormalizedOptions extends LiquidOptions { - root?: string[]; -} -export interface NormalizedFullOptions extends NormalizedOptions { - root: string[]; - extname: string; - cache: boolean; - dynamicPartials: boolean; - strict_filters: boolean; - strict_variables: boolean; - trim_tag_right: boolean; - trim_tag_left: boolean; - trim_output_right: boolean; - trim_output_left: boolean; - tag_delimiter_left: string; - tag_delimiter_right: string; - output_delimiter_left: string; - output_delimiter_right: string; - greedy: boolean; -} -export declare function normalize(options?: LiquidOptions): NormalizedOptions; -export declare function applyDefault(options?: NormalizedOptions): NormalizedFullOptions; -export {}; diff --git a/dist/src/liquid.d.ts b/dist/src/liquid.d.ts deleted file mode 100644 index 87e38ea56..000000000 --- a/dist/src/liquid.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import Scope from './scope/scope'; -import * as Types from './types'; -import ITemplate from './template/itemplate'; -import Render from './render/render'; -import Parser from './parser/parser'; -import ITagImplOptions from './template/tag/itag-impl-options'; -import { isTruthy, isFalsy, evalExp, evalValue } from './render/syntax'; -import { LiquidOptions, NormalizedFullOptions } from './liquid-options'; -import { FilterImpl } from './template/filter/filter-impl'; -export default class Liquid { - options: NormalizedFullOptions; - renderer: Render; - parser: Parser; - private cache; - private tokenizer; - constructor(opts?: LiquidOptions); - parse(html: string, filepath?: string): ITemplate[]; - render(tpl: Array, ctx?: object, opts?: LiquidOptions): Promise; - parseAndRender(html: string, ctx?: object, opts?: LiquidOptions): Promise; - getTemplate(file: string, opts?: LiquidOptions): Promise; - renderFile(file: string, ctx?: object, opts?: LiquidOptions): Promise; - evalValue(str: string, scope: Scope): any; - registerFilter(name: string, filter: FilterImpl): void; - registerTag(name: string, tag: ITagImplOptions): void; - plugin(plugin: (this: Liquid, L: typeof Liquid) => void): void; - express(): (this: any, filePath: string, ctx: object, cb: (err: Error | null, html?: string | undefined) => void) => void; - static default: typeof Liquid; - static isTruthy: typeof isTruthy; - static isFalsy: typeof isFalsy; - static evalExp: typeof evalExp; - static evalValue: typeof evalValue; - static Types: typeof Types; -} diff --git a/dist/src/parser/delimited-token.d.ts b/dist/src/parser/delimited-token.d.ts deleted file mode 100644 index 418cf3ea0..000000000 --- a/dist/src/parser/delimited-token.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Token from './token'; -export default class DelimitedToken extends Token { - trimLeft: boolean; - trimRight: boolean; - constructor(raw: string, value: string, input: string, line: number, pos: number, file?: string); -} diff --git a/dist/src/parser/html-token.d.ts b/dist/src/parser/html-token.d.ts deleted file mode 100644 index 041e4a8fb..000000000 --- a/dist/src/parser/html-token.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import Token from './token'; -export default class HTMLToken extends Token { - constructor(str: string, input: string, line: number, col: number, file?: string); -} diff --git a/dist/src/parser/lexical.d.ts b/dist/src/parser/lexical.d.ts deleted file mode 100644 index a2c7eee63..000000000 --- a/dist/src/parser/lexical.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -export declare const quoted: RegExp; -export declare const quoteBalanced: RegExp; -export declare const number: RegExp; -export declare const bool: RegExp; -export declare const identifier: RegExp; -export declare const subscript: RegExp; -export declare const literal: RegExp; -export declare const variable: RegExp; -export declare const rangeLimit: RegExp; -export declare const range: RegExp; -export declare const rangeCapture: RegExp; -export declare const value: RegExp; -export declare const hash: RegExp; -export declare const hashCapture: RegExp; -export declare const tagLine: RegExp; -export declare const numberLine: RegExp; -export declare const boolLine: RegExp; -export declare const quotedLine: RegExp; -export declare const rangeLine: RegExp; -export declare const operators: RegExp[]; -export declare function isRange(str: string): boolean; diff --git a/dist/src/parser/output-token.d.ts b/dist/src/parser/output-token.d.ts deleted file mode 100644 index 1d9e43de5..000000000 --- a/dist/src/parser/output-token.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -import DelimitedToken from './delimited-token'; -export default class OutputToken extends DelimitedToken { - constructor(raw: string, value: string, input: string, line: number, pos: number, file?: string); -} diff --git a/dist/src/parser/parse-stream.d.ts b/dist/src/parser/parse-stream.d.ts deleted file mode 100644 index a550002db..000000000 --- a/dist/src/parser/parse-stream.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import Token from 'src/parser/token'; -import ITemplate from 'src/template/itemplate'; -declare type ParseToken = ((token: Token, remainTokens: Array) => ITemplate); -export default class ParseStream { - private tokens; - private handlers; - private stopRequested; - private parseToken; - constructor(tokens: Array, parseToken: ParseToken); - on(name: string, cb: (arg: T) => void): ParseStream; - trigger(event: string, arg?: T): boolean; - start(): this; - stop(): this; -} -export {}; diff --git a/dist/src/parser/parser.d.ts b/dist/src/parser/parser.d.ts deleted file mode 100644 index fa2b4e773..000000000 --- a/dist/src/parser/parser.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import Liquid from 'src/liquid'; -import ParseStream from './parse-stream'; -import Token from './token'; -import Tag from 'src/template/tag/tag'; -import Output from 'src/template/output'; -import HTML from 'src/template/html'; -import ITemplate from 'src/template/itemplate'; -export default class Parser { - liquid: Liquid; - constructor(liquid: Liquid); - parse(tokens: Array): ITemplate[]; - parseToken(token: Token, remainTokens: Array): Tag | Output | HTML; - parseStream(tokens: Array): ParseStream; -} diff --git a/dist/src/parser/tag-token.d.ts b/dist/src/parser/tag-token.d.ts deleted file mode 100644 index ac0d4b6d9..000000000 --- a/dist/src/parser/tag-token.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import DelimitedToken from './delimited-token'; -export default class TagToken extends DelimitedToken { - name: string; - args: string; - constructor(raw: string, value: string, input: string, line: number, pos: number, file?: string); -} diff --git a/dist/src/parser/token.d.ts b/dist/src/parser/token.d.ts deleted file mode 100644 index 22857d659..000000000 --- a/dist/src/parser/token.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export default class Token { - type: string; - line: number; - col: number; - raw: string; - input: string; - file?: string; - value: string; - constructor(raw: string, input: string, line: number, col: number, file?: string); -} diff --git a/dist/src/parser/tokenizer.d.ts b/dist/src/parser/tokenizer.d.ts deleted file mode 100644 index d55268258..000000000 --- a/dist/src/parser/tokenizer.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import Token from './token'; -import { NormalizedFullOptions } from '../liquid-options'; -export default class Tokenizer { - options: NormalizedFullOptions; - constructor(options?: NormalizedFullOptions); - tokenize(input: string, file?: string): Token[]; -} diff --git a/dist/src/parser/whitespace-ctrl.d.ts b/dist/src/parser/whitespace-ctrl.d.ts deleted file mode 100644 index 21cf629d4..000000000 --- a/dist/src/parser/whitespace-ctrl.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -import Token from 'src/parser/token'; -import { NormalizedFullOptions } from 'src/liquid-options'; -export default function whiteSpaceCtrl(tokens: Token[], options: NormalizedFullOptions): void; diff --git a/dist/src/render/render.d.ts b/dist/src/render/render.d.ts deleted file mode 100644 index b097cd8cc..000000000 --- a/dist/src/render/render.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import Scope from 'src/scope/scope'; -import ITemplate from 'src/template/itemplate'; -export default class Render { - renderTemplates(templates: ITemplate[], scope: Scope): Promise; -} diff --git a/dist/src/render/syntax.d.ts b/dist/src/render/syntax.d.ts deleted file mode 100644 index ca4a7acbf..000000000 --- a/dist/src/render/syntax.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Scope from 'src/scope/scope'; -export declare function parseExp(exp: string, scope: Scope): any; -export declare function evalExp(str: string, scope: Scope): any; -export declare function evalValue(str: string, scope: Scope): any; -export declare function isTruthy(val: any): boolean; -export declare function isFalsy(val: any): boolean; diff --git a/dist/src/scope/block-mode.d.ts b/dist/src/scope/block-mode.d.ts deleted file mode 100644 index 3f0bc6c83..000000000 --- a/dist/src/scope/block-mode.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare enum BlockMode { - OUTPUT = 0, - STORE = 1 -} -export default BlockMode; diff --git a/dist/src/scope/icontext.d.ts b/dist/src/scope/icontext.d.ts deleted file mode 100644 index 5b3df5e55..000000000 --- a/dist/src/scope/icontext.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default interface IContext { - [key: string]: any; - liquid_method_missing?: (key: string) => any; -} diff --git a/dist/src/scope/scope.d.ts b/dist/src/scope/scope.d.ts deleted file mode 100644 index af01d1bbf..000000000 --- a/dist/src/scope/scope.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { NormalizedFullOptions } from '../liquid-options'; -import BlockMode from './block-mode'; -export declare type Context = { - [key: string]: any; - liquid_method_missing?: (key: string) => any; - to_liquid?: () => any; - toLiquid?: () => any; -}; -export default class Scope { - opts: NormalizedFullOptions; - contexts: Array; - blocks: object; - groups: { - [key: string]: number; - }; - blockMode: BlockMode; - constructor(ctx?: object, opts?: NormalizedFullOptions); - getAll(): Context; - get(path: string): any; - set(path: string, v: any): void; - unshift(ctx: object): number; - push(ctx: object): number; - pop(ctx?: object): object | undefined; - findContextFor(key: string, filter?: ((conttext: object) => boolean)): Context | null; - private readProperty; - propertyAccessSeq(str: string): string[]; -} diff --git a/dist/src/scope/scopes.d.ts b/dist/src/scope/scopes.d.ts deleted file mode 100644 index e4ebea46d..000000000 --- a/dist/src/scope/scopes.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export declare class CaptureScope { -} -export declare class AssignScope { -} -export declare class IncrementScope { -} -export declare class DecrementScope { -} diff --git a/dist/src/template/filter/filter-impl.d.ts b/dist/src/template/filter/filter-impl.d.ts deleted file mode 100644 index 16786256a..000000000 --- a/dist/src/template/filter/filter-impl.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare type FilterImpl = (value: any, ...args: any[]) => any; diff --git a/dist/src/template/filter/filter.d.ts b/dist/src/template/filter/filter.d.ts deleted file mode 100644 index 69c50c6ac..000000000 --- a/dist/src/template/filter/filter.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -import Scope from 'src/scope/scope'; -import { FilterImpl } from './filter-impl'; -export default class Filter { - name: string; - impl: FilterImpl; - args: string[]; - private static impls; - constructor(name: string, args: string[], strictFilters: boolean); - render(value: any, scope: Scope): any; - static register(name: string, filter: FilterImpl): void; - static clear(): void; -} diff --git a/dist/src/template/html.d.ts b/dist/src/template/html.d.ts deleted file mode 100644 index 50169ca39..000000000 --- a/dist/src/template/html.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Template from 'src/template/template'; -import ITemplate from 'src/template/itemplate'; -import HTMLToken from 'src/parser/html-token'; -export default class extends Template implements ITemplate { - str: string; - constructor(token: HTMLToken); - render(): Promise; -} diff --git a/dist/src/template/itemplate.d.ts b/dist/src/template/itemplate.d.ts deleted file mode 100644 index cdfdfa80c..000000000 --- a/dist/src/template/itemplate.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Scope from 'src/scope/scope'; -import Token from 'src/parser/token'; -export default interface ITemplate { - token: Token; - render(scope: Scope): Promise; -} diff --git a/dist/src/template/output.d.ts b/dist/src/template/output.d.ts deleted file mode 100644 index 812a0be2b..000000000 --- a/dist/src/template/output.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Value from './value'; -import Template from 'src/template/template'; -import ITemplate from 'src/template/itemplate'; -import Scope from 'src/scope/scope'; -import OutputToken from 'src/parser/output-token'; -export default class Output extends Template implements ITemplate { - value: Value; - constructor(token: OutputToken, strictFilters: boolean); - render(scope: Scope): Promise; -} diff --git a/dist/src/template/tag/hash.d.ts b/dist/src/template/tag/hash.d.ts deleted file mode 100644 index b2a325db1..000000000 --- a/dist/src/template/tag/hash.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Scope from 'src/scope/scope'; -/** - * Key-Value Pairs Representing Tag Arguments - * Example: - * For the markup `{% include 'head.html' foo='bar' %}`, - * hash['foo'] === 'bar' - */ -export default class Hash { - [key: string]: any; - constructor(markup: string, scope: Scope); -} diff --git a/dist/src/template/tag/itag-impl-options.d.ts b/dist/src/template/tag/itag-impl-options.d.ts deleted file mode 100644 index fc1b08a63..000000000 --- a/dist/src/template/tag/itag-impl-options.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Scope from 'src/scope/scope'; -import TagToken from 'src/parser/tag-token'; -import Token from 'src/parser/token'; -import Hash from 'src/template/tag/hash'; -import ITagImpl from './itag-impl'; -export default interface ITagImplOptions { - parse?: (this: ITagImpl, token: TagToken, remainingTokens: Array) => void; - render?: (this: ITagImpl, scope: Scope, hash: Hash) => any | Promise; -} diff --git a/dist/src/template/tag/itag-impl.d.ts b/dist/src/template/tag/itag-impl.d.ts deleted file mode 100644 index 674972aa5..000000000 --- a/dist/src/template/tag/itag-impl.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Liquid from 'src/liquid'; -import ITagImplOptions from './itag-impl-options'; -export default interface ITagImpl extends ITagImplOptions { - liquid: Liquid; - [key: string]: any; -} diff --git a/dist/src/template/tag/tag.d.ts b/dist/src/template/tag/tag.d.ts deleted file mode 100644 index 175d73882..000000000 --- a/dist/src/template/tag/tag.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Scope from 'src/scope/scope'; -import ITagImplOptions from './itag-impl-options'; -import Liquid from 'src/liquid'; -import Template from 'src/template/template'; -import ITemplate from 'src/template/itemplate'; -import TagToken from 'src/parser/tag-token'; -import Token from 'src/parser/token'; -export default class Tag extends Template implements ITemplate { - name: string; - private impl; - static impls: { - [key: string]: ITagImplOptions; - }; - constructor(token: TagToken, tokens: Token[], liquid: Liquid); - render(scope: Scope): Promise; - static register(name: string, tag: ITagImplOptions): void; - static clear(): void; -} diff --git a/dist/src/template/template.d.ts b/dist/src/template/template.d.ts deleted file mode 100644 index a6bda3b2d..000000000 --- a/dist/src/template/template.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default abstract class Template { - token: T; - constructor(token: T); -} diff --git a/dist/src/template/value.d.ts b/dist/src/template/value.d.ts deleted file mode 100644 index 1cc87e6d9..000000000 --- a/dist/src/template/value.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Filter from './filter/filter'; -import Scope from 'src/scope/scope'; -export default class { - initial: any; - filters: Array; - /** - * @param str value string, like: "i have a dream | truncate: 3 - */ - constructor(str: string, strictFilters: boolean); - value(scope: Scope): any; -} diff --git a/dist/src/types.d.ts b/dist/src/types.d.ts deleted file mode 100644 index ac78bd4e9..000000000 --- a/dist/src/types.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { AssignScope, CaptureScope, IncrementScope, DecrementScope } from './scope/scopes'; -export { ParseError, TokenizationError, RenderBreakError, AssertionError } from './util/error'; diff --git a/dist/src/util/assert.d.ts b/dist/src/util/assert.d.ts deleted file mode 100644 index a6177e3b0..000000000 --- a/dist/src/util/assert.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (predicate: any, message?: string): void; diff --git a/dist/src/util/error.d.ts b/dist/src/util/error.d.ts deleted file mode 100644 index 5d0fd82fe..000000000 --- a/dist/src/util/error.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import Token from 'src/parser/token'; -import ITemplate from 'src/template/itemplate'; -declare abstract class LiquidError extends Error { - private token; - private originalError; - constructor(err: Error, token: Token); - protected update(): void; -} -export declare class TokenizationError extends LiquidError { - constructor(message: string, token: Token); -} -export declare class ParseError extends LiquidError { - constructor(err: Error, token: Token); -} -export declare class RenderError extends LiquidError { - constructor(err: Error, tpl: ITemplate); -} -export declare class RenderBreakError extends Error { - resolvedHTML: string; - constructor(message: string); -} -export declare class AssertionError extends Error { - constructor(message: string); -} -export {}; diff --git a/dist/src/util/promise.d.ts b/dist/src/util/promise.d.ts deleted file mode 100644 index 6140ae2de..000000000 --- a/dist/src/util/promise.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function mapSeries(iterable: T1[], iteratee: (item: T1, idx: number, iterable: T1[]) => Promise | T2): Promise; diff --git a/dist/src/util/strftime.d.ts b/dist/src/util/strftime.d.ts deleted file mode 100644 index 8627363d5..000000000 --- a/dist/src/util/strftime.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (d: Date, format: string): string; diff --git a/dist/src/util/underscore.d.ts b/dist/src/util/underscore.d.ts deleted file mode 100644 index afb06d546..000000000 --- a/dist/src/util/underscore.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -export declare function isString(value: any): value is string; -export declare function isFunction(value: any): value is Function; -export declare function promisify(fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise; -export declare function promisify(fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise; -export declare function stringify(value: any): string; -export declare function create(proto: T1): T2; -export declare function isNil(value: any): boolean; -export declare function isArray(value: any): value is any[]; -export declare function isError(value: any): value is Error; -export declare function forOwn(object: { - [key: string]: T; -} | undefined, iteratee: ((val: T, key: string, obj: { - [key: string]: T; -}) => boolean | void)): { - [key: string]: T; -}; -export declare function last(arr: T[]): T; -export declare function last(arr: string): string; -export declare function isObject(value: any): value is object; -export declare function range(start: number, stop?: number, step?: number): number[]; -export declare function padStart(str: any, length: number, ch?: string): any; diff --git a/dist/template/filter.d.ts b/dist/template/filter.d.ts deleted file mode 100644 index 2087cb7ff..000000000 --- a/dist/template/filter.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import Scope from 'src/scope/scope'; -declare type impl = (value: any, ...args: any[]) => any; -export default class Filter { - name: string; - impl: impl; - args: string[]; - private static impls; - constructor(str: string, strictFilters?: boolean); - parseArgs(argList: string): string[]; - render(value: any, scope: Scope): any; - static register(name: any, filter: any): void; - static clear(): void; -} -export {}; diff --git a/dist/template/filter/filter-impl.d.ts b/dist/template/filter/filter-impl.d.ts deleted file mode 100644 index 16786256a..000000000 --- a/dist/template/filter/filter-impl.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare type FilterImpl = (value: any, ...args: any[]) => any; diff --git a/dist/template/filter/filter.d.ts b/dist/template/filter/filter.d.ts deleted file mode 100644 index 818d98713..000000000 --- a/dist/template/filter/filter.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import Scope from 'src/scope/scope'; -import { FilterImpl } from './filter-impl'; -export default class Filter { - name: string; - impl: FilterImpl; - args: string[]; - private static impls; - constructor(str: string, strictFilters?: boolean); - parseArgs(argList: string): string[]; - render(value: any, scope: Scope): any; - static register(name: string, filter: FilterImpl): void; - static clear(): void; -} diff --git a/dist/template/html.d.ts b/dist/template/html.d.ts deleted file mode 100644 index 50169ca39..000000000 --- a/dist/template/html.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Template from 'src/template/template'; -import ITemplate from 'src/template/itemplate'; -import HTMLToken from 'src/parser/html-token'; -export default class extends Template implements ITemplate { - str: string; - constructor(token: HTMLToken); - render(): Promise; -} diff --git a/dist/template/itemplate.d.ts b/dist/template/itemplate.d.ts deleted file mode 100644 index cdfdfa80c..000000000 --- a/dist/template/itemplate.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Scope from 'src/scope/scope'; -import Token from 'src/parser/token'; -export default interface ITemplate { - token: Token; - render(scope: Scope): Promise; -} diff --git a/dist/template/output.d.ts b/dist/template/output.d.ts deleted file mode 100644 index f1bff6b0d..000000000 --- a/dist/template/output.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Value from './value'; -import Template from 'src/template/template'; -import ITemplate from 'src/template/itemplate'; -import Scope from 'src/scope/scope'; -import OutputToken from 'src/parser/output-token'; -export default class Output extends Template implements ITemplate { - value: Value; - constructor(token: OutputToken, strictFilters?: boolean); - render(scope: Scope): Promise; -} diff --git a/dist/template/tag/block-tag.d.ts b/dist/template/tag/block-tag.d.ts deleted file mode 100644 index 175d73882..000000000 --- a/dist/template/tag/block-tag.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Scope from 'src/scope/scope'; -import ITagImplOptions from './itag-impl-options'; -import Liquid from 'src/liquid'; -import Template from 'src/template/template'; -import ITemplate from 'src/template/itemplate'; -import TagToken from 'src/parser/tag-token'; -import Token from 'src/parser/token'; -export default class Tag extends Template implements ITemplate { - name: string; - private impl; - static impls: { - [key: string]: ITagImplOptions; - }; - constructor(token: TagToken, tokens: Token[], liquid: Liquid); - render(scope: Scope): Promise; - static register(name: string, tag: ITagImplOptions): void; - static clear(): void; -} diff --git a/dist/template/tag/hash.d.ts b/dist/template/tag/hash.d.ts deleted file mode 100644 index b2a325db1..000000000 --- a/dist/template/tag/hash.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import Scope from 'src/scope/scope'; -/** - * Key-Value Pairs Representing Tag Arguments - * Example: - * For the markup `{% include 'head.html' foo='bar' %}`, - * hash['foo'] === 'bar' - */ -export default class Hash { - [key: string]: any; - constructor(markup: string, scope: Scope); -} diff --git a/dist/template/tag/itag-impl-options.d.ts b/dist/template/tag/itag-impl-options.d.ts deleted file mode 100644 index fc1b08a63..000000000 --- a/dist/template/tag/itag-impl-options.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import Scope from 'src/scope/scope'; -import TagToken from 'src/parser/tag-token'; -import Token from 'src/parser/token'; -import Hash from 'src/template/tag/hash'; -import ITagImpl from './itag-impl'; -export default interface ITagImplOptions { - parse?: (this: ITagImpl, token: TagToken, remainingTokens: Array) => void; - render?: (this: ITagImpl, scope: Scope, hash: Hash) => any | Promise; -} diff --git a/dist/template/tag/itag-impl.d.ts b/dist/template/tag/itag-impl.d.ts deleted file mode 100644 index 674972aa5..000000000 --- a/dist/template/tag/itag-impl.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import Liquid from 'src/liquid'; -import ITagImplOptions from './itag-impl-options'; -export default interface ITagImpl extends ITagImplOptions { - liquid: Liquid; - [key: string]: any; -} diff --git a/dist/template/tag/tag.d.ts b/dist/template/tag/tag.d.ts deleted file mode 100644 index 175d73882..000000000 --- a/dist/template/tag/tag.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import Scope from 'src/scope/scope'; -import ITagImplOptions from './itag-impl-options'; -import Liquid from 'src/liquid'; -import Template from 'src/template/template'; -import ITemplate from 'src/template/itemplate'; -import TagToken from 'src/parser/tag-token'; -import Token from 'src/parser/token'; -export default class Tag extends Template implements ITemplate { - name: string; - private impl; - static impls: { - [key: string]: ITagImplOptions; - }; - constructor(token: TagToken, tokens: Token[], liquid: Liquid); - render(scope: Scope): Promise; - static register(name: string, tag: ITagImplOptions): void; - static clear(): void; -} diff --git a/dist/template/template.d.ts b/dist/template/template.d.ts deleted file mode 100644 index a6bda3b2d..000000000 --- a/dist/template/template.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default abstract class Template { - token: T; - constructor(token: T); -} diff --git a/dist/template/value.d.ts b/dist/template/value.d.ts deleted file mode 100644 index 9af16c0e2..000000000 --- a/dist/template/value.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import Filter from './filter/filter'; -import Scope from 'src/scope/scope'; -export default class { - initial: any; - filters: Array; - constructor(str: string, strictFilters?: boolean); - value(scope: Scope): any; -} diff --git a/dist/types.d.ts b/dist/types.d.ts deleted file mode 100644 index ac78bd4e9..000000000 --- a/dist/types.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { AssignScope, CaptureScope, IncrementScope, DecrementScope } from './scope/scopes'; -export { ParseError, TokenizationError, RenderBreakError, AssertionError } from './util/error'; diff --git a/dist/util/assert.d.ts b/dist/util/assert.d.ts deleted file mode 100644 index a6177e3b0..000000000 --- a/dist/util/assert.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (predicate: any, message?: string): void; diff --git a/dist/util/error.d.ts b/dist/util/error.d.ts deleted file mode 100644 index 5d0fd82fe..000000000 --- a/dist/util/error.d.ts +++ /dev/null @@ -1,25 +0,0 @@ -import Token from 'src/parser/token'; -import ITemplate from 'src/template/itemplate'; -declare abstract class LiquidError extends Error { - private token; - private originalError; - constructor(err: Error, token: Token); - protected update(): void; -} -export declare class TokenizationError extends LiquidError { - constructor(message: string, token: Token); -} -export declare class ParseError extends LiquidError { - constructor(err: Error, token: Token); -} -export declare class RenderError extends LiquidError { - constructor(err: Error, tpl: ITemplate); -} -export declare class RenderBreakError extends Error { - resolvedHTML: string; - constructor(message: string); -} -export declare class AssertionError extends Error { - constructor(message: string); -} -export {}; diff --git a/dist/util/promise.d.ts b/dist/util/promise.d.ts deleted file mode 100644 index 6140ae2de..000000000 --- a/dist/util/promise.d.ts +++ /dev/null @@ -1 +0,0 @@ -export declare function mapSeries(iterable: T1[], iteratee: (item: T1, idx: number, iterable: T1[]) => Promise | T2): Promise; diff --git a/dist/util/strftime.d.ts b/dist/util/strftime.d.ts deleted file mode 100644 index 8627363d5..000000000 --- a/dist/util/strftime.d.ts +++ /dev/null @@ -1 +0,0 @@ -export default function (d: Date, format: string): string; diff --git a/dist/util/underscore.d.ts b/dist/util/underscore.d.ts deleted file mode 100644 index a5df471c3..000000000 --- a/dist/util/underscore.d.ts +++ /dev/null @@ -1,21 +0,0 @@ -export declare function isString(value: any): boolean; -export declare function isFunction(value: any): boolean; -export declare function promisify(fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise; -export declare function promisify(fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise; -export declare function stringify(value: any): string; -export declare function create(proto: T1): T2; -export declare function isNil(value: any): boolean; -export declare function isArray(value: any): boolean; -export declare function isError(value: any): boolean; -export declare function forOwn(object: { - [key: string]: T; -} | undefined, iteratee: ((val: T, key: string, obj: { - [key: string]: T; -}) => boolean | void)): { - [key: string]: T; -}; -export declare function last(arr: T[]): T; -export declare function last(arr: string): string; -export declare function isObject(value: any): boolean; -export declare function range(start: number, stop?: number, step?: number): number[]; -export declare function padStart(str: any, length: number, ch?: string): any; diff --git a/package.json b/package.json index 28a90c8e1..8e2d8dcb0 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,14 @@ "scripts": { "lint": "eslint . --ext .ts", "unit": "mocha 'test/unit/**/*.ts'", + "integration": "mocha 'test/integration/**/*.ts'", "e2e": "npm run build && mocha 'test/e2e/**/*.ts'", - "test": "npm run unit && npm run e2e", + "test": "npm run build && mocha 'test/**/*.ts'", "benchmark": "ts-node --require tsconfig-paths/register benchmark", - "coverage-html": "nyc --reporter=html npm run unit", - "coverage-coveralls": "nyc npm run unit && nyc report --reporter=text-lcov | coveralls", + "coverage-html": "nyc --reporter=html mocha 'test/{unit,integration}/**/*.ts'", + "coverage-coveralls": "nyc mocha 'test/{unit,integration}/**/*.ts' && nyc report --reporter=text-lcov | coveralls", "build": "rollup -c rollup.config.ts && ls -lh dist", - "version": "npm run build && git add -A dist" + "version": "npm run build" }, "repository": { "type": "git", diff --git a/rollup.config.ts b/rollup.config.ts index 86dc2a8b8..25cbdc3d6 100644 --- a/rollup.config.ts +++ b/rollup.config.ts @@ -27,7 +27,8 @@ export default [{ external: ['path', 'fs'], plugins: [typescript({ tsconfigOverride: { - exclude: [ 'test' ], + include: [ 'src' ], + exclude: [ 'test', 'benchmark' ], compilerOptions: { module: 'ES2015' } @@ -47,7 +48,8 @@ export default [{ shim(fake), typescript({ tsconfigOverride: { - exclude: [ 'test' ], + include: [ 'src' ], + exclude: [ 'test', 'benchmark' ], compilerOptions: { module: 'ES2015', paths: { 'src/fs': ['src/fs/browser'] } @@ -68,7 +70,8 @@ export default [{ shim(fake), typescript({ tsconfigOverride: { - exclude: [ 'test' ], + include: [ 'src' ], + exclude: [ 'test', 'benchmark' ], compilerOptions: { module: 'ES2015', paths: { 'src/fs': ['src/fs/browser'] } diff --git a/test/unit/builtin/filters/array.ts b/test/integration/builtin/filters/array.ts similarity index 100% rename from test/unit/builtin/filters/array.ts rename to test/integration/builtin/filters/array.ts diff --git a/test/unit/builtin/filters/date.ts b/test/integration/builtin/filters/date.ts similarity index 100% rename from test/unit/builtin/filters/date.ts rename to test/integration/builtin/filters/date.ts diff --git a/test/unit/builtin/filters/html.ts b/test/integration/builtin/filters/html.ts similarity index 100% rename from test/unit/builtin/filters/html.ts rename to test/integration/builtin/filters/html.ts diff --git a/test/unit/builtin/filters/math.ts b/test/integration/builtin/filters/math.ts similarity index 100% rename from test/unit/builtin/filters/math.ts rename to test/integration/builtin/filters/math.ts diff --git a/test/unit/builtin/filters/object.ts b/test/integration/builtin/filters/object.ts similarity index 100% rename from test/unit/builtin/filters/object.ts rename to test/integration/builtin/filters/object.ts diff --git a/test/unit/builtin/filters/string.ts b/test/integration/builtin/filters/string.ts similarity index 100% rename from test/unit/builtin/filters/string.ts rename to test/integration/builtin/filters/string.ts diff --git a/test/unit/builtin/filters/url.ts b/test/integration/builtin/filters/url.ts similarity index 100% rename from test/unit/builtin/filters/url.ts rename to test/integration/builtin/filters/url.ts diff --git a/test/unit/builtin/tags/assign.ts b/test/integration/builtin/tags/assign.ts similarity index 100% rename from test/unit/builtin/tags/assign.ts rename to test/integration/builtin/tags/assign.ts diff --git a/test/unit/builtin/tags/capture.ts b/test/integration/builtin/tags/capture.ts similarity index 100% rename from test/unit/builtin/tags/capture.ts rename to test/integration/builtin/tags/capture.ts diff --git a/test/unit/builtin/tags/case.ts b/test/integration/builtin/tags/case.ts similarity index 100% rename from test/unit/builtin/tags/case.ts rename to test/integration/builtin/tags/case.ts diff --git a/test/unit/builtin/tags/comment.ts b/test/integration/builtin/tags/comment.ts similarity index 100% rename from test/unit/builtin/tags/comment.ts rename to test/integration/builtin/tags/comment.ts diff --git a/test/unit/builtin/tags/cycle.ts b/test/integration/builtin/tags/cycle.ts similarity index 100% rename from test/unit/builtin/tags/cycle.ts rename to test/integration/builtin/tags/cycle.ts diff --git a/test/unit/builtin/tags/decrement.ts b/test/integration/builtin/tags/decrement.ts similarity index 100% rename from test/unit/builtin/tags/decrement.ts rename to test/integration/builtin/tags/decrement.ts diff --git a/test/unit/builtin/tags/for.ts b/test/integration/builtin/tags/for.ts similarity index 100% rename from test/unit/builtin/tags/for.ts rename to test/integration/builtin/tags/for.ts diff --git a/test/unit/builtin/tags/if.ts b/test/integration/builtin/tags/if.ts similarity index 100% rename from test/unit/builtin/tags/if.ts rename to test/integration/builtin/tags/if.ts diff --git a/test/unit/builtin/tags/include.ts b/test/integration/builtin/tags/include.ts similarity index 100% rename from test/unit/builtin/tags/include.ts rename to test/integration/builtin/tags/include.ts diff --git a/test/unit/builtin/tags/increment.ts b/test/integration/builtin/tags/increment.ts similarity index 100% rename from test/unit/builtin/tags/increment.ts rename to test/integration/builtin/tags/increment.ts diff --git a/test/unit/builtin/tags/layout.ts b/test/integration/builtin/tags/layout.ts similarity index 100% rename from test/unit/builtin/tags/layout.ts rename to test/integration/builtin/tags/layout.ts diff --git a/test/unit/builtin/tags/raw.ts b/test/integration/builtin/tags/raw.ts similarity index 100% rename from test/unit/builtin/tags/raw.ts rename to test/integration/builtin/tags/raw.ts diff --git a/test/unit/builtin/tags/tablerow.ts b/test/integration/builtin/tags/tablerow.ts similarity index 100% rename from test/unit/builtin/tags/tablerow.ts rename to test/integration/builtin/tags/tablerow.ts diff --git a/test/unit/builtin/tags/unless.ts b/test/integration/builtin/tags/unless.ts similarity index 100% rename from test/unit/builtin/tags/unless.ts rename to test/integration/builtin/tags/unless.ts diff --git a/test/unit/drop/blank-drop.ts b/test/integration/drop/blank-drop.ts similarity index 100% rename from test/unit/drop/blank-drop.ts rename to test/integration/drop/blank-drop.ts diff --git a/test/unit/drop/empty-drop.ts b/test/integration/drop/empty-drop.ts similarity index 63% rename from test/unit/drop/empty-drop.ts rename to test/integration/drop/empty-drop.ts index 15382cb8a..c084531c3 100644 --- a/test/unit/drop/empty-drop.ts +++ b/test/integration/drop/empty-drop.ts @@ -49,4 +49,34 @@ describe('drop/empty-drop', function () { const html = await liquid.parseAndRender(src, { arr: [1] }) expect(html).to.equal('[1] != empty') }) + it('1 < empty should be false', async function () { + const src = '{%if 1 < empty %}true{%else%}false{% endif %}' + const html = await liquid.parseAndRender(src) + expect(html).to.equal('false') + }) + it('1 <= empty should be false', async function () { + const src = '{%if 1 <= empty %}true{%else%}false{% endif %}' + const html = await liquid.parseAndRender(src) + expect(html).to.equal('false') + }) + it('1 > empty should be false', async function () { + const src = '{%if 1 > empty %}true{%else%}false{% endif %}' + const html = await liquid.parseAndRender(src) + expect(html).to.equal('false') + }) + it('1 >= empty should be false', async function () { + const src = '{%if 1 >= empty %}true{%else%}false{% endif %}' + const html = await liquid.parseAndRender(src) + expect(html).to.equal('false') + }) + it('1 == empty should be false', async function () { + const src = '{%if 1 == empty %}true{%else%}false{% endif %}' + const html = await liquid.parseAndRender(src) + expect(html).to.equal('false') + }) + it('1 != empty should be true', async function () { + const src = '{%if 1 != empty %}true{%else%}false{% endif %}' + const html = await liquid.parseAndRender(src) + expect(html).to.equal('true') + }) }) diff --git a/test/unit/drop/null-drop.ts b/test/integration/drop/null-drop.ts similarity index 100% rename from test/unit/drop/null-drop.ts rename to test/integration/drop/null-drop.ts diff --git a/test/unit/liquid/cache.ts b/test/integration/liquid/cache.ts similarity index 100% rename from test/unit/liquid/cache.ts rename to test/integration/liquid/cache.ts diff --git a/test/unit/liquid/delimiter.ts b/test/integration/liquid/delimiter.ts similarity index 100% rename from test/unit/liquid/delimiter.ts rename to test/integration/liquid/delimiter.ts diff --git a/test/unit/liquid/liquid-options.ts b/test/integration/liquid/liquid-options.ts similarity index 100% rename from test/unit/liquid/liquid-options.ts rename to test/integration/liquid/liquid-options.ts diff --git a/test/unit/liquid/liquid.ts b/test/integration/liquid/liquid.ts similarity index 100% rename from test/unit/liquid/liquid.ts rename to test/integration/liquid/liquid.ts diff --git a/test/unit/liquid/strict.ts b/test/integration/liquid/strict.ts similarity index 100% rename from test/unit/liquid/strict.ts rename to test/integration/liquid/strict.ts diff --git a/test/unit/liquid/trimming.ts b/test/integration/liquid/trimming.ts similarity index 100% rename from test/unit/liquid/trimming.ts rename to test/integration/liquid/trimming.ts diff --git a/test/unit/util/error.ts b/test/integration/util/error.ts similarity index 100% rename from test/unit/util/error.ts rename to test/integration/util/error.ts diff --git a/tsconfig.json b/tsconfig.json index 131ac40c5..40fccf9a3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -16,6 +16,6 @@ "test/*": ["test/*"] } }, - "all": true, + "include": [ "*.ts", "src", "test", "benchmark" ], "exclude": [ "node_modules", "dist" ] }