diff options
| author | Shipwreckt <me@shipwreckt.co.uk> | 2025-10-31 20:02:14 +0000 |
|---|---|---|
| committer | Shipwreckt <me@shipwreckt.co.uk> | 2025-10-31 20:02:14 +0000 |
| commit | 7a52ddeba2a68388b544f529d2d92104420f77b0 (patch) | |
| tree | 15ddd47457a2cb4a96060747437d36474e4f6b4e /node_modules/liquidjs | |
| parent | 53d6ae2b5568437afa5e4995580a3fb679b7b91b (diff) | |
Changed from static to 11ty!
Diffstat (limited to 'node_modules/liquidjs')
159 files changed, 24453 insertions, 0 deletions
diff --git a/node_modules/liquidjs/LICENSE b/node_modules/liquidjs/LICENSE new file mode 100644 index 0000000..62a9eeb --- /dev/null +++ b/node_modules/liquidjs/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2016 Jun Yang + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/liquidjs/README.md b/node_modules/liquidjs/README.md new file mode 100644 index 0000000..74da1d3 --- /dev/null +++ b/node_modules/liquidjs/README.md @@ -0,0 +1,234 @@ +# liquidjs +[](https://www.npmjs.org/package/liquidjs) +[](https://www.npmjs.org/package/liquidjs) +[](https://coveralls.io/github/harttle/liquidjs?branch=master) +[](https://github.com/harttle/liquidjs/actions/workflows/ci-build.yml?query=branch%3Amaster) +[](https://github.com/harttle/liquidjs/blob/master/LICENSE) +[](https://github.com/harttle/liquidjs) + +A simple, expressive and safe [Shopify][shopify/liquid] / GitHub Pages compatible template engine in pure JavaScript. +**The purpose of this repo** is to provide a standard Liquid implementation for the JavaScript community so that [Jekyll sites](https://jekyllrb.com), [GitHub Pages](https://pages.github.com/) and [Shopify templates](https://themes.shopify.com/) can be ported to Node.js without pain. + +* [Documentation][doc] +* Please star [LiquidJS on GitHub][github]! +* Financial support via [GitHub Sponsors](https://github.com/sponsors/harttle). + +<p align="center"><a href="https://liquidjs.com"><img height="155px" width="155px" src="https://liquidjs.com/icon/mstile-310x310.png" alt="logo"></a></p> + +## What's it like? + +Basically there're two types of Liquid syntax: tags enclosed by `{% %}` and outputs enclosed by `{{ }}`. A Liquid template looks like: + +```liquid +{% if username %} + {{ username | append: ", welcome to LiquidJS!" | capitalize }} +{% endif %} +``` + +[A live demo](https://liquidjs.com/playground.html) is also available and here's a [quick tutorial](https://liquidjs.com/tutorials/intro-to-liquid.html) for Liquid syntax. + + +## Installation + +Install from npm in Node.js: + +```bash +npm install liquidjs +``` + +Or use the UMD bundle from jsDelivr: + +```html +<script src="https://cdn.jsdelivr.net/npm/liquidjs/dist/liquid.browser.min.js"></script> +``` + +Or render directly from CLI using npx: + +```bash +npx liquidjs --template 'Hello, {{ name }}!' --context '{"name": "Snake"}' +``` + +For more details, refer to the [Setup Guide][setup]. + +## Who's Using LiquidJS? + +- [Eleventy](https://www.11ty.dev/): Eleventy, a simpler static site generator. +- [Github Docs](https://github.com/github/docs): The open-source repo for docs.github.com. +- [Opensense](https://www.opensense.com/): The smarter way to send email. +- [Directus](https://docs.directus.io/): an instant REST+GraphQL API and intuitive no-code data collaboration app for any SQL database. +- [Semgrep](https://github.com/returntocorp/semgrep): Lightweight static analysis for many languages. +- [Rock](https://www.rockrms.com/): An open source CMS, Relationship Management System (RMS) and Church Management System (ChMS) all rolled into one. +- [Mitosis](https://github.com/BuilderIO/mitosis): Write components once, run everywhere. Compiles to React, Vue, Qwik, Solid, Angular, Svelte, and more. +- [Pattern Lab](https://patternlab.io/): a frontend workshop environment that helps you build, view, test, and showcase your design system's UI components. +- [Builder.io](https://www.builder.io/m/developers): the first and only headless CMS with a visual editor that lets you drag and drop with your components, directly within your current site or app. Completely API-driven, for cleaner code and simpler workflows. +- [Microsoft Power Pages](https://learn.microsoft.com/en-us/power-pages/introduction): a secure, enterprise-grade, low-code software as a service (SaaS) platform for creating, hosting, and administering modern external-facing business websites. +- [Azure API Management developer portal](https://learn.microsoft.com/en-us/azure/api-management/api-management-howto-developer-portal): an automatically generated, fully customizable website with the documentation of your APIs. +- [WISMOlabs](https://wismolabs.com/): Post Purchase Experience platform for eCommerce retailers enhancing customer satisfaction by using LiquidJS to provide customizable post-purchase experiences through programmable email, SMS, order tracking pages, and webhooks. + +Feel free to create a PR or contact me to add your use case into this list! + +## Financial Support + +If you personally love LiquidJS or it's benefiting your business, please consider financially support us via [GitHub Sponsors](https://github.com/sponsors/harttle). Special thanks to our sponsors! + +<!-- FINANCIAL-CONTRIBUTORS-BEGIN --> +<table> + <tbody> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://www.opensense.com/"><img src="https://images.opencollective.com/opensense-inc/bf840ae/logo/256.png?height=100" width="100px;" alt="Opensense Inc."/><br /><sub><b>Opensense</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.11ty.dev/"><img src="https://avatars.githubusercontent.com/u/35147177?v=4&s=100" width="100px;" alt="Eleventy"/><br /><sub><b>Eleventy</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://about.me/peterdehaan"><img src="https://avatars2.githubusercontent.com/u/557895?v=4&s=100" width="100px;" alt="Peter deHaan"/><br /><sub><b>Peter deHaan</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://opencollective.com/touchless"><img src="https://images.opencollective.com/touchless/273bc74/logo/256.png?height=100" width="100px;" alt="Touchless"/><br /><sub><b>Touchless</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.dropkiq.com/"><img src="https://images.opencollective.com/1bertlol/43a8ea8/logo/256.png?height=100" width="100px;" alt="Adam Darrah"/><br /><sub><b>Dropkiq</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://dailycontributors.com/"><img src="https://images.opencollective.com/dailycontributors/3c2e057/logo/256.png?height=100&width=100" width="100px;" alt="Dailycontributors"/><br /><sub><b>Dailycontributors</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/coni2k"><img src="https://avatars0.githubusercontent.com/u/1284601?v=4&s=100" width="100px;" alt="coni2k"/><br /><sub><b>Serkan Holat</b></sub></a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/amit777"><img src="https://avatars0.githubusercontent.com/u/2703309?v=4&s=100" width="100px;" alt="amit777"/><br /><sub><b>amit777</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://opencollective.com/khaled-salem"><img src="https://images.opencollective.com/khaled-salem/avatar/256.png?height=256" width="100px;" alt="Khaled Salem"/><br /><sub><b>Khaled Salem</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://sentry.io/"><img src="https://avatars.githubusercontent.com/u/1396951?v=4&s=100" width="100px;" alt="Sentry"/><br /><sub><b>Sentry</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.checkoutblocks.com/"><img src="https://avatars.githubusercontent.com/u/114603307?v=4&s=100" width="100px;" alt="Checkout Blocks"/><br /><sub><b>Checkout Blocks</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://customer.io/"><img src="https://avatars.githubusercontent.com/u/1152079?v=4&s=100" width="100px;" alt="Customer IO"/><br /><sub><b>Customer IO</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/15fathoms"><img src="https://avatars.githubusercontent.com/u/79156039?v=4&s=100" width="100px;" alt="Emmanuel Cartelli"/><br /><sub><b>Emmanuel Cartelli</b></sub></a><br /></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/microsoft"><img src="https://avatars.githubusercontent.com/u/6154722?v=4&s=100" width="100px;" alt="Microsoft"/><br /><sub><b>Microsoft</b></sub></a><br /></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://www.pakstyle.pk/"><img src="https://images.opencollective.com/pakstyle/2b81605/logo/256.png?height=100" width="100px;" alt="PakStyle.pk"/><br /><sub><b>PakStyle.pk</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://syntax.fm/"><img src="https://avatars.githubusercontent.com/u/130389858?v=4&s=100" width="100px;" alt="Syntax Podcast"/><br /><sub><b>Syntax Podcast</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://opencollective.com/cartelli-emmanuel"><img src="https://images.opencollective.com/cartelli-emmanuel/avatar/256.png?height=100" width="100px;" alt="Cartelli Emmanuel"/><br /><sub><b>Cartelli Emmanuel</b></sub></a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.escorta.com/"><img src="https://images.opencollective.com/escortacom/avatar/256.png?height=100" width="100px;" alt="EscortA.com"/><br /><sub><b>EscortA.com</b></sub></a></td> + <td align="center" valign="middle" width="14.28%"><a href="https://chudovo.com/"><img src="https://images.opencollective.com/Chudovo/avatar/256.png?height=100" style="max-width:100px;max-height:100px;" alt="Chudovo"/><br /><sub><b>Chudovo</b></sub></a></td> + </tr> + </tbody> +</table> +<!-- FINANCIAL-CONTRIBUTORS-END --> + +## Contributors ✨ + +Want to contribute? see [Contribution Guidelines][contribution]. Thanks goes to these wonderful people: + +<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> +<!-- prettier-ignore-start --> +<!-- markdownlint-disable --> +<table> + <tbody> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://harttle.land"><img src="https://avatars3.githubusercontent.com/u/4427974?v=4?s=100" width="100px;" alt="Jun Yang"/><br /><sub><b>Jun Yang</b></sub></a><br /><a href="#maintenance-harttle" title="Maintenance">🚧</a> <a href="https://github.com/harttle/liquidjs/commits?author=harttle" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/chenos"><img src="https://avatars0.githubusercontent.com/u/2993310?v=4?s=100" width="100px;" alt="chenos"/><br /><sub><b>chenos</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=chenos" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://zachleat.com/"><img src="https://avatars2.githubusercontent.com/u/39355?v=4?s=100" width="100px;" alt="Zach Leatherman"/><br /><sub><b>Zach Leatherman</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/issues?q=author%3Azachleat" title="Bug reports">🐛</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/thardy"><img src="https://avatars3.githubusercontent.com/u/120636?v=4?s=100" width="100px;" alt="Tim Hardy"/><br /><sub><b>Tim Hardy</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=thardy" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://paulrobertlloyd.com/"><img src="https://avatars3.githubusercontent.com/u/813383?v=4?s=100" width="100px;" alt="Paul Robert Lloyd"/><br /><sub><b>Paul Robert Lloyd</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=paulrobertlloyd" title="Code">💻</a> <a href="https://github.com/harttle/liquidjs/issues?q=author%3Apaulrobertlloyd" title="Bug reports">🐛</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/alecdotbiz"><img src="https://avatars2.githubusercontent.com/u/1925840?v=4?s=100" width="100px;" alt="Alec Larson"/><br /><sub><b>Alec Larson</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=aleclarson" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/pmalouin"><img src="https://avatars1.githubusercontent.com/u/1411117?v=4?s=100" width="100px;" alt="Patrick Malouin"/><br /><sub><b>Patrick Malouin</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=pmalouin" title="Code">💻</a> <a href="https://github.com/harttle/liquidjs/commits?author=pmalouin" title="Documentation">📖</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://jaswrks.com"><img src="https://avatars3.githubusercontent.com/u/1563559?v=4?s=100" width="100px;" alt="jaswrks"/><br /><sub><b>jaswrks</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=jaswrks" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://oott123.com"><img src="https://avatars2.githubusercontent.com/u/905663?v=4?s=100" width="100px;" alt="三三"/><br /><sub><b>三三</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=oott123" title="Code">💻</a> <a href="#ideas-oott123" title="Ideas, Planning, & Feedback">🤔</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/ssendev"><img src="https://avatars0.githubusercontent.com/u/450793?v=4?s=100" width="100px;" alt="ssendev"/><br /><sub><b>ssendev</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=ssendev" title="Code">💻</a> <a href="https://github.com/harttle/liquidjs/commits?author=ssendev" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/wojtask9"><img src="https://avatars3.githubusercontent.com/u/6099236?v=4?s=100" width="100px;" alt="wojtask9"/><br /><sub><b>wojtask9</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=wojtask9" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/thelornenelson"><img src="https://avatars3.githubusercontent.com/u/24596583?v=4?s=100" width="100px;" alt="Andrew Barclay"/><br /><sub><b>Andrew Barclay</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=thelornenelson" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.stam.pr/"><img src="https://avatars2.githubusercontent.com/u/142338?v=4?s=100" width="100px;" alt="Cory Mawhorter"/><br /><sub><b>Cory Mawhorter</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=cmawhorter" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/thehappybug"><img src="https://avatars0.githubusercontent.com/u/3393530?v=4?s=100" width="100px;" alt="Mehdi Jaffery"/><br /><sub><b>Mehdi Jaffery</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=thehappybug" title="Code">💻</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/robinbijlani"><img src="https://avatars0.githubusercontent.com/u/2503108?v=4?s=100" width="100px;" alt="Robin Bijlani"/><br /><sub><b>Robin Bijlani</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=robinbijlani" title="Code">💻</a> <a href="https://github.com/harttle/liquidjs/issues?q=author%3Arobinbijlani" title="Bug reports">🐛</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.rmkennedy.com"><img src="https://avatars3.githubusercontent.com/u/8356669?v=4?s=100" width="100px;" alt="Ryan Kennedy"/><br /><sub><b>Ryan Kennedy</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=ryaninvents" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/strax"><img src="https://avatars2.githubusercontent.com/u/587213?v=4?s=100" width="100px;" alt="Sami Kukkonen"/><br /><sub><b>Sami Kukkonen</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=strax" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://ScottFreeCode.github.io/"><img src="https://avatars3.githubusercontent.com/u/16506071?v=4?s=100" width="100px;" alt="Scott Santucci"/><br /><sub><b>Scott Santucci</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=ScottFreeCode" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://stevenrescigno.com"><img src="https://avatars3.githubusercontent.com/u/8505293?v=4?s=100" width="100px;" alt="Steven "/><br /><sub><b>Steven </b></sub></a><br /><a href="#example-stevenanthonyrevo" title="Examples">💡</a> <a href="https://github.com/harttle/liquidjs/commits?author=stevenanthonyrevo" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://efcl.info/"><img src="https://avatars1.githubusercontent.com/u/19714?v=4?s=100" width="100px;" alt="azu"/><br /><sub><b>azu</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=azu" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/wyozi"><img src="https://avatars3.githubusercontent.com/u/4894573?v=4?s=100" width="100px;" alt="Joonas"/><br /><sub><b>Joonas</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=wyozi" title="Code">💻</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/jamelait"><img src="https://avatars1.githubusercontent.com/u/14369255?v=4?s=100" width="100px;" alt="Jamel A."/><br /><sub><b>Jamel A.</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=jamelait" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://brandonpittman.net"><img src="https://avatars0.githubusercontent.com/u/967145?v=4?s=100" width="100px;" alt="Brandon Pittman"/><br /><sub><b>Brandon Pittman</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=brandonpittman" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/tgrandgent"><img src="https://avatars3.githubusercontent.com/u/17069042?v=4?s=100" width="100px;" alt="tgrandgent"/><br /><sub><b>tgrandgent</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=tgrandgent" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/mastodon0"><img src="https://avatars1.githubusercontent.com/u/7924332?v=4?s=100" width="100px;" alt="Martin Schuster"/><br /><sub><b>Martin Schuster</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=mastodon0" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://js.chenlei.me"><img src="https://avatars0.githubusercontent.com/u/6339390?v=4?s=100" width="100px;" alt="Ray"/><br /><sub><b>Ray</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=richardo2016" title="Tests">⚠️</a> <a href="https://github.com/harttle/liquidjs/commits?author=richardo2016" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/CriGoT"><img src="https://avatars0.githubusercontent.com/u/1936786?v=4?s=100" width="100px;" alt="Cristofer Gonzales"/><br /><sub><b>Cristofer Gonzales</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=CriGoT" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.raymondcamden.com"><img src="https://avatars3.githubusercontent.com/u/393660?v=4?s=100" width="100px;" alt="Raymond Camden"/><br /><sub><b>Raymond Camden</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=cfjedimaster" title="Documentation">📖</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://stedman.dev"><img src="https://avatars1.githubusercontent.com/u/183122?v=4?s=100" width="100px;" alt="Steve Stedman"/><br /><sub><b>Steve Stedman</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=stedman" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://ciccarello.me"><img src="https://avatars0.githubusercontent.com/u/11273838?v=4?s=100" width="100px;" alt="Anthony Ciccarello"/><br /><sub><b>Anthony Ciccarello</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=aciccarello" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://twitter.com/IAmTrySound"><img src="https://avatars0.githubusercontent.com/u/5635476?v=4?s=100" width="100px;" alt="Bogdan Chadkin"/><br /><sub><b>Bogdan Chadkin</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=TrySound" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://hightouch.io"><img src="https://avatars0.githubusercontent.com/u/5959235?v=4?s=100" width="100px;" alt="Tejas Manohar"/><br /><sub><b>Tejas Manohar</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=tejasmanohar" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://about.me/peterdehaan"><img src="https://avatars2.githubusercontent.com/u/557895?v=4?s=100" width="100px;" alt="Peter deHaan"/><br /><sub><b>Peter deHaan</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=pdehaan" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/amit777"><img src="https://avatars0.githubusercontent.com/u/2703309?v=4?s=100" width="100px;" alt="amit777"/><br /><sub><b>amit777</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=amit777" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://www.ifi.uzh.ch/en/ce/people/schuldenzucker.html"><img src="https://avatars3.githubusercontent.com/u/1100776?v=4?s=100" width="100px;" alt="Steffen Schuldenzucker"/><br /><sub><b>Steffen Schuldenzucker</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=sschuldenzucker" title="Code">💻</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/Pixcell"><img src="https://avatars0.githubusercontent.com/u/4005291?v=4?s=100" width="100px;" alt="Pixcell"/><br /><sub><b>Pixcell</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=Pixcell" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://jasonet.co"><img src="https://avatars.githubusercontent.com/u/10660468?v=4?s=100" width="100px;" alt="Jason Etcovitch"/><br /><sub><b>Jason Etcovitch</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=JasonEtco" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/kayuapi"><img src="https://avatars.githubusercontent.com/u/10304328?v=4?s=100" width="100px;" alt="ZC"/><br /><sub><b>ZC</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=kayuapi" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://memmie.lenglet.name"><img src="https://avatars.githubusercontent.com/u/729275?v=4?s=100" width="100px;" alt="Memmie Lenglet"/><br /><sub><b>Memmie Lenglet</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=mems" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/ilhamdev0"><img src="https://avatars.githubusercontent.com/u/57636145?v=4?s=100" width="100px;" alt="ilhamdev0"/><br /><sub><b>ilhamdev0</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=ilhamdev0" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/c412216887"><img src="https://avatars.githubusercontent.com/u/29691650?v=4?s=100" width="100px;" alt="一饮一啄皆是人生"/><br /><sub><b>一饮一啄皆是人生</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=c412216887" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://digitalinspiration.com/"><img src="https://avatars.githubusercontent.com/u/1344071?v=4?s=100" width="100px;" alt="Amit Agarwal"/><br /><sub><b>Amit Agarwal</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=labnol" title="Documentation">📖</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://n1ru4l.cloud/"><img src="https://avatars.githubusercontent.com/u/14338007?v=4?s=100" width="100px;" alt="Laurin Quast"/><br /><sub><b>Laurin Quast</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=n1ru4l" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/mattvague"><img src="https://avatars.githubusercontent.com/u/64985?v=4?s=100" width="100px;" alt="Matt Vague"/><br /><sub><b>Matt Vague</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=mattvague" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/bglw"><img src="https://avatars.githubusercontent.com/u/40188355?v=4?s=100" width="100px;" alt="Liam Bigelow"/><br /><sub><b>Liam Bigelow</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=bglw" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://about.me/jasonkurian"><img src="https://avatars.githubusercontent.com/u/2642545?v=4?s=100" width="100px;" alt="Jason Kurian"/><br /><sub><b>Jason Kurian</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=JaKXz" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/dphm"><img src="https://avatars.githubusercontent.com/u/1707217?v=4?s=100" width="100px;" alt="d pham (they/them)"/><br /><sub><b>d pham (they/them)</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=dphm" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.aleksandrhovhannisyan.com/"><img src="https://avatars.githubusercontent.com/u/19352442?v=4?s=100" width="100px;" alt="Aleksandr Hovhannisyan"/><br /><sub><b>Aleksandr Hovhannisyan</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=AleksandrHovhannisyan" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/jg-rp"><img src="https://avatars.githubusercontent.com/u/72664870?v=4?s=100" width="100px;" alt="jg-rp"/><br /><sub><b>jg-rp</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=jg-rp" title="Code">💻</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/ameyaapte1"><img src="https://avatars.githubusercontent.com/u/16054747?v=4?s=100" width="100px;" alt="Ameya Apte"/><br /><sub><b>Ameya Apte</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=ameyaapte1" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/tbdrz"><img src="https://avatars.githubusercontent.com/u/50599116?v=4?s=100" width="100px;" alt="tbdrz"/><br /><sub><b>tbdrz</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=tbdrz" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://santialbo.com"><img src="https://avatars.githubusercontent.com/u/1557563?v=4?s=100" width="100px;" alt="Santi Albo"/><br /><sub><b>Santi Albo</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=santialbo" title="Documentation">📖</a> <a href="https://github.com/harttle/liquidjs/commits?author=santialbo" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/YahangWu"><img src="https://avatars.githubusercontent.com/u/12295975?v=4?s=100" width="100px;" alt="Yahang Wu"/><br /><sub><b>Yahang Wu</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=YahangWu" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/hongl-1"><img src="https://avatars.githubusercontent.com/u/101576612?v=4?s=100" width="100px;" alt="hongl"/><br /><sub><b>hongl</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=hongl-1" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/zxx-457"><img src="https://avatars.githubusercontent.com/u/114141362?v=4?s=100" width="100px;" alt="zxx-457"/><br /><sub><b>zxx-457</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=zxx-457" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/prassie"><img src="https://avatars.githubusercontent.com/u/1357831?v=4?s=100" width="100px;" alt="prassie"/><br /><sub><b>prassie</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=prassie" title="Documentation">📖</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="http://slavv.com/"><img src="https://avatars.githubusercontent.com/u/713329?v=4?s=100" width="100px;" alt="Slav Ivanov"/><br /><sub><b>Slav Ivanov</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=slavivanov" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://www.orgflow.io/"><img src="https://avatars.githubusercontent.com/u/3889090?v=4?s=100" width="100px;" alt="Daniel Rosenberg"/><br /><sub><b>Daniel Rosenberg</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=DaRosenberg" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/bobgubko"><img src="https://avatars.githubusercontent.com/u/733312?v=4?s=100" width="100px;" alt="bobgubko"/><br /><sub><b>bobgubko</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=bobgubko" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/bangank36"><img src="https://avatars.githubusercontent.com/u/10071857?v=4?s=100" width="100px;" alt="BaNgan"/><br /><sub><b>BaNgan</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=bangank36" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/mahyar-pasarzangene"><img src="https://avatars.githubusercontent.com/u/16485039?v=4?s=100" width="100px;" alt="Mahyar Pasarzangene"/><br /><sub><b>Mahyar Pasarzangene</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=mahyar-pasarzangene" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://hubelbauer.net/"><img src="https://avatars.githubusercontent.com/u/6831144?v=4?s=100" width="100px;" alt="Tomáš Hübelbauer"/><br /><sub><b>Tomáš Hübelbauer</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=TomasHubelbauer" title="Code">💻</a> <a href="https://github.com/harttle/liquidjs/commits?author=TomasHubelbauer" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://sixtwothree.org"><img src="https://avatars.githubusercontent.com/u/73866?v=4?s=100" width="100px;" alt="Jason Garber"/><br /><sub><b>Jason Garber</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=jgarber623" title="Code">💻</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="http://nickreilingh.com/"><img src="https://avatars.githubusercontent.com/u/2458645?v=4?s=100" width="100px;" alt="Nick Reilingh"/><br /><sub><b>Nick Reilingh</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=NReilingh" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="http://ebobby.org"><img src="https://avatars.githubusercontent.com/u/170356?v=4?s=100" width="100px;" alt="Francisco Soto"/><br /><sub><b>Francisco Soto</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=ebobby" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.davidlj95.com"><img src="https://avatars.githubusercontent.com/u/8050648?v=4?s=100" width="100px;" alt="David LJ"/><br /><sub><b>David LJ</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=davidlj95" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/RasmusWL"><img src="https://avatars.githubusercontent.com/u/1054041?v=4?s=100" width="100px;" alt="Rasmus Wriedt Larsen"/><br /><sub><b>Rasmus Wriedt Larsen</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=RasmusWL" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/brunodccarvalho"><img src="https://avatars.githubusercontent.com/u/24962950?v=4?s=100" width="100px;" alt="Bruno Carvalho"/><br /><sub><b>Bruno Carvalho</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=brunodccarvalho" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/fupengl"><img src="https://avatars.githubusercontent.com/u/20211964?v=4?s=100" width="100px;" alt="傅鹏"/><br /><sub><b>傅鹏</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=fupengl" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/joel-hamilton"><img src="https://avatars.githubusercontent.com/u/12899024?v=4?s=100" width="100px;" alt="Joel Hamilton"/><br /><sub><b>Joel Hamilton</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=joel-hamilton" title="Code">💻</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/amedve"><img src="https://avatars.githubusercontent.com/u/23156422?v=4?s=100" width="100px;" alt="Max Medve"/><br /><sub><b>Max Medve</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=amedve" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://maizzle.com"><img src="https://avatars.githubusercontent.com/u/1656595?v=4?s=100" width="100px;" alt="Cosmin Popovici"/><br /><sub><b>Cosmin Popovici</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=cossssmin" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/admtnnr"><img src="https://avatars.githubusercontent.com/u/27502?v=4?s=100" width="100px;" alt="Adam Tanner"/><br /><sub><b>Adam Tanner</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=admtnnr" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/GuillermoCasalCaro"><img src="https://avatars.githubusercontent.com/u/18685581?v=4?s=100" width="100px;" alt="Guillermo Casal Caro"/><br /><sub><b>Guillermo Casal Caro</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=GuillermoCasalCaro" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/jsoref"><img src="https://avatars.githubusercontent.com/u/2119212?v=4?s=100" width="100px;" alt="Josh Soref"/><br /><sub><b>Josh Soref</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=jsoref" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://vrugtehagel.nl"><img src="https://avatars.githubusercontent.com/u/41021050?v=4?s=100" width="100px;" alt="Koen"/><br /><sub><b>Koen</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=vrugtehagel" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://neamar.fr"><img src="https://avatars.githubusercontent.com/u/536844?v=4?s=100" width="100px;" alt="Matthieu Bacconnier"/><br /><sub><b>Matthieu Bacconnier</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=Neamar" title="Documentation">📖</a></td> + </tr> + <tr> + <td align="center" valign="top" width="14.28%"><a href="https://tovd.dev"><img src="https://avatars.githubusercontent.com/u/35376389?v=4?s=100" width="100px;" alt="Tim van Dam"/><br /><sub><b>Tim van Dam</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=timvandam" title="Code">💻</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://github.com/edh649"><img src="https://avatars.githubusercontent.com/u/527604?v=4?s=100" width="100px;" alt="Ed Hanton"/><br /><sub><b>Ed Hanton</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=edh649" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://gurdiga.com"><img src="https://avatars.githubusercontent.com/u/53922?v=4?s=100" width="100px;" alt="Vlad GURDIGA"/><br /><sub><b>Vlad GURDIGA</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=gurdiga" title="Documentation">📖</a></td> + <td align="center" valign="top" width="14.28%"><a href="https://www.streakingman.com"><img src="https://avatars.githubusercontent.com/u/30397306?v=4?s=100" width="100px;" alt="裸奔狂甩丁丁"/><br /><sub><b>裸奔狂甩丁丁</b></sub></a><br /><a href="https://github.com/harttle/liquidjs/commits?author=StreakingMan" title="Documentation">📖</a></td> + </tr> + </tbody> +</table> + +<!-- markdownlint-restore --> +<!-- prettier-ignore-end --> + +<!-- ALL-CONTRIBUTORS-LIST:END --> + +[shopify/liquid]: https://shopify.github.io/liquid/ +[plugins]: https://liquidjs.com/tutorials/plugins.html#Plugin-List +[setup]: https://liquidjs.com/tutorials/setup.html +[doc]: https://liquidjs.com +[github]: https://github.com/harttle/liquidjs +[oc]: https://opencollective.com/liquidjs/ +[contribution]: https://liquidjs.com/tutorials/contribution-guidelines.html diff --git a/node_modules/liquidjs/bin/liquid.js b/node_modules/liquidjs/bin/liquid.js new file mode 100755 index 0000000..9d54b86 --- /dev/null +++ b/node_modules/liquidjs/bin/liquid.js @@ -0,0 +1,139 @@ +#!/usr/bin/env node + +const fs = require('fs/promises') +const Liquid = require('..').Liquid + +// Preserve compatibility by falling back to legacy CLI behavior if: +// - stdin is redirected (i.e. not connected to a terminal) AND +// - there are either no arguments, or only a single argument which does not start with a dash +// TODO: Remove this fallback for 11.0 + +let renderPromise = null +if (!process.stdin.isTTY && (process.argv.length === 2 || (process.argv.length === 3 && !process.argv[2].startsWith('-')))) { + renderPromise = renderLegacy() +} else { + renderPromise = render() +} + +renderPromise.catch(err => { + process.stderr.write(`${err.message}\n`) + process.exitCode = 1 +}) + +async function render () { + const { program } = require('commander') + + program + .name('liquidjs') + .description('Render a Liquid template') + .requiredOption('-t, --template <liquid | @path>', 'liquid template to render (@- to read from stdin)') // TODO: Change to argument in 11.0 + .option('-c, --context <json | @path>', 'input context in JSON format (@- to read from stdin)') + .option('-o, --output <path>', 'write rendered output to file (omit to write to stdout)') + .option('--cache [size]', 'cache previously parsed template structures (default cache size: 1024)') + .option('--extname <string>', 'use a default filename extension when resolving partials and layouts') + .option('--jekyll-include', 'use jekyll-style include (pass parameters to include variable of current scope)') + .option('--js-truthy', 'use JavaScript-style truthiness') + .option('--layouts <path...>', 'directories from where to resolve layouts (defaults to --root)') + .option('--lenient-if', 'do not throw on undefined variables in conditional expressions (when using --strict-variables)') + .option('--no-dynamic-partials', 'always treat file paths for partials and layouts as a literal value') + .option('--no-greedy', 'disable greedy matching for --trim* options') + .option('--no-relative-reference', 'require absolute file paths for partials and layouts') + .option('--ordered-filter-parameters', 'respect parameter order when using filters') + .option('--output-delimiter-left <string>', 'left delimiter to use for liquid outputs') + .option('--output-delimiter-right <string>', 'right delimiter to use for liquid outputs') + .option('--partials <path...>', 'directories from where to resolve partials (defaults to --root)') + .option('--preserve-timezones', 'preserve input timezone in date filter') + .option('--root <path...>', 'directories from where to resolve partials and layouts (defaults to ".")') + .option('--strict-filters', 'throw on undefined filters instead of skipping them') + .option('--strict-variables', 'throw on undefined variables instead of rendering them as empty string') + .option('--tag-delimiter-left', 'left delimiter to use for liquid tags') + .option('--tag-delimiter-right', 'right delimiter to use for liquid tags') + .option('--timezone-offset <value>', 'JavaScript timezone name or timezoneOffset value to use in date filter (defaults to local timezone)') + .option('--trim-output-left', 'trim whitespace from left of liquid outputs') + .option('--trim-output-right', 'trim whitespace from right of liquid outputs') + .option('--trim-tag-left', 'trim whitespace from left of liquid tags') + .option('--trim-tag-right', 'trim whitespace from right of liquid tags') + .showHelpAfterError('Use -h or --help for additional information.') + .parse() + + const options = program.opts() + + if (Object.values(options).filter((value) => value === '@-').length > 1) { + throw new Error(`The stdin input specifier '@-' must only be used once.`) + } + + const template = await resolveInputOption(options.template) + const context = await resolveContext(options.context) + const liquid = new Liquid(options) + const output = liquid.parseAndRenderSync(template, context) + if (options.output) { + await fs.writeFile(options.output, output) + } else { + process.stdout.write(output) + } +} + +async function resolveContext (contextOption) { + let contextJson = '{}' + if (contextOption) { + contextJson = await resolveInputOption(contextOption) + } + const context = JSON.parse(contextJson) + return context +} + +async function resolveInputOption (option) { + let content = null + if (option) { + if (option === '@-') { + content = await readStream(process.stdin) + } else if (option.startsWith('@')) { + const filePath = option.slice(1) + const stat = await fs.stat(filePath, { throwIfNoEntry: false }) + if (!stat || !stat.isFile) { + throw new Error(`'${filePath}' does not exist or is not a file`) + } + content = await fs.readFile(filePath, 'utf8') + } else { + content = option + } + } + return content +} + +async function readStream (stream) { + const chunks = [] + for await (const chunk of stream) { + chunks.push(chunk) + } + return Buffer.concat(chunks).toString('utf8') +} + +// TODO: Remove for 11.0 +async function renderLegacy () { + process.stderr.write('Reading template from stdin. This mode will be removed in next major version, use --template option instead.\n') + const contextArg = process.argv.slice(2)[0] + let context = {} + if (contextArg) { + const contextJson = await resolveInputOptionLegacy(contextArg) + context = JSON.parse(contextJson) + } + const template = await readStream(process.stdin) + const liquid = new Liquid() + const output = liquid.parseAndRenderSync(template, context) + process.stdout.write(output) +} + +// TODO: Remove for 11.0 +async function resolveInputOptionLegacy (option) { + let content = null + if (option) { + const stat = await fs.stat(option).catch(e => null) + if (stat && stat.isFile) { + content = await fs.readFile(option, 'utf8') + } else { + content = option + } + } + return content +} diff --git a/node_modules/liquidjs/dist/build/fs-impl-browser.d.ts b/node_modules/liquidjs/dist/build/fs-impl-browser.d.ts new file mode 100644 index 0000000..094df8d --- /dev/null +++ b/node_modules/liquidjs/dist/build/fs-impl-browser.d.ts @@ -0,0 +1,7 @@ +export declare function resolve(root: string, filepath: string, ext: string): string;
+export declare function readFile(url: string): Promise<string>;
+export declare function readFileSync(url: string): string;
+export declare function exists(filepath: string): Promise<boolean>;
+export declare function existsSync(filepath: string): boolean;
+export declare function dirname(filepath: string): string;
+export declare const sep = "/";
diff --git a/node_modules/liquidjs/dist/build/fs-impl-browser.spec.d.ts b/node_modules/liquidjs/dist/build/fs-impl-browser.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/build/fs-impl-browser.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/build/streamed-emitter-browser.d.ts b/node_modules/liquidjs/dist/build/streamed-emitter-browser.d.ts new file mode 100644 index 0000000..19883ca --- /dev/null +++ b/node_modules/liquidjs/dist/build/streamed-emitter-browser.d.ts @@ -0,0 +1,10 @@ +/// <reference types="node" />
+import { Emitter } from '../emitters';
+export declare class StreamedEmitter implements Emitter {
+ buffer: string;
+ stream: NodeJS.ReadableStream;
+ constructor();
+ write: (html: any) => void;
+ error: (err: Error) => void;
+ end: () => void;
+}
diff --git a/node_modules/liquidjs/dist/build/streamed-emitter-browser.spec.d.ts b/node_modules/liquidjs/dist/build/streamed-emitter-browser.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/build/streamed-emitter-browser.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/cache/cache.d.ts b/node_modules/liquidjs/dist/cache/cache.d.ts new file mode 100644 index 0000000..57debad --- /dev/null +++ b/node_modules/liquidjs/dist/cache/cache.d.ts @@ -0,0 +1,7 @@ +import type { Template } from '../template/template';
+export interface Cache<T> {
+ write(key: string, value: T): void | Promise<void>;
+ read(key: string): T | undefined | Promise<T | undefined>;
+ remove(key: string): void | Promise<void>;
+}
+export type LiquidCache = Cache<Template[] | Promise<Template[]>>;
diff --git a/node_modules/liquidjs/dist/cache/index.d.ts b/node_modules/liquidjs/dist/cache/index.d.ts new file mode 100644 index 0000000..66fd9cb --- /dev/null +++ b/node_modules/liquidjs/dist/cache/index.d.ts @@ -0,0 +1,2 @@ +export * from './cache';
+export * from './lru';
diff --git a/node_modules/liquidjs/dist/cache/lru.d.ts b/node_modules/liquidjs/dist/cache/lru.d.ts new file mode 100644 index 0000000..9532ed1 --- /dev/null +++ b/node_modules/liquidjs/dist/cache/lru.d.ts @@ -0,0 +1,14 @@ +import { Cache } from './cache';
+export declare class LRU<T> implements Cache<T> {
+ limit: number;
+ size: number;
+ private cache;
+ private head;
+ private tail;
+ constructor(limit: number, size?: number);
+ write(key: string, value: T): void;
+ read(key: string): T | undefined;
+ remove(key: string): void;
+ clear(): void;
+ private ensureLimit;
+}
diff --git a/node_modules/liquidjs/dist/cache/lru.spec.d.ts b/node_modules/liquidjs/dist/cache/lru.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/cache/lru.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/context/block-mode.d.ts b/node_modules/liquidjs/dist/context/block-mode.d.ts new file mode 100644 index 0000000..428746e --- /dev/null +++ b/node_modules/liquidjs/dist/context/block-mode.d.ts @@ -0,0 +1,4 @@ +export declare enum BlockMode {
+ OUTPUT = 0,
+ STORE = 1
+}
diff --git a/node_modules/liquidjs/dist/context/context.d.ts b/node_modules/liquidjs/dist/context/context.d.ts new file mode 100644 index 0000000..c359993 --- /dev/null +++ b/node_modules/liquidjs/dist/context/context.d.ts @@ -0,0 +1,64 @@ +import { Drop } from '../drop/drop';
+import { NormalizedFullOptions, RenderOptions } from '../liquid-options';
+import { Scope } from './scope';
+import { Limiter } from '../util';
+type PropertyKey = string | number;
+export declare class Context {
+ /**
+ * insert a Context-level empty scope,
+ * for tags like `{% capture %}` `{% assign %}` to operate
+ */
+ private scopes;
+ private registers;
+ /**
+ * user passed in scope
+ * `{% increment %}`, `{% decrement %}` changes this scope,
+ * whereas `{% capture %}`, `{% assign %}` only hide this scope
+ */
+ environments: Scope;
+ /**
+ * global scope used as fallback for missing variables
+ */
+ globals: Scope;
+ sync: boolean;
+ breakCalled: boolean;
+ continueCalled: boolean;
+ /**
+ * The normalized liquid options object
+ */
+ opts: NormalizedFullOptions;
+ /**
+ * Throw when accessing undefined variable?
+ */
+ strictVariables: boolean;
+ ownPropertyOnly: boolean;
+ memoryLimit: Limiter;
+ renderLimit: Limiter;
+ constructor(env?: object, opts?: NormalizedFullOptions, renderOptions?: RenderOptions, { memoryLimit, renderLimit }?: {
+ [key: string]: Limiter;
+ });
+ getRegister(key: string): any;
+ setRegister(key: string, value: any): any;
+ saveRegister(...keys: string[]): [string, any][];
+ restoreRegister(keyValues: [string, any][]): void;
+ getAll(): Scope;
+ /**
+ * @deprecated use `_get()` or `getSync()` instead
+ */
+ get(paths: PropertyKey[]): unknown;
+ getSync(paths: PropertyKey[]): unknown;
+ _get(paths: (PropertyKey | Drop)[]): IterableIterator<unknown>;
+ /**
+ * @deprecated use `_get()` instead
+ */
+ getFromScope(scope: unknown, paths: PropertyKey[] | string): IterableIterator<unknown>;
+ _getFromScope(scope: unknown, paths: (PropertyKey | Drop)[] | string, strictVariables?: boolean): IterableIterator<unknown>;
+ push(ctx: object): number;
+ pop(): Scope | undefined;
+ bottom(): Scope;
+ spawn(scope?: {}): Context;
+ private findScope;
+ readProperty(obj: Scope, key: (PropertyKey | Drop)): any;
+}
+export declare function readJSProperty(obj: Scope, key: PropertyKey, ownPropertyOnly: boolean): any;
+export {};
diff --git a/node_modules/liquidjs/dist/context/context.spec.d.ts b/node_modules/liquidjs/dist/context/context.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/context/context.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/context/index.d.ts b/node_modules/liquidjs/dist/context/index.d.ts new file mode 100644 index 0000000..2a8b56f --- /dev/null +++ b/node_modules/liquidjs/dist/context/index.d.ts @@ -0,0 +1,3 @@ +export * from './context';
+export * from './scope';
+export * from './block-mode';
diff --git a/node_modules/liquidjs/dist/context/scope.d.ts b/node_modules/liquidjs/dist/context/scope.d.ts new file mode 100644 index 0000000..4257c6b --- /dev/null +++ b/node_modules/liquidjs/dist/context/scope.d.ts @@ -0,0 +1,6 @@ +import { Drop } from '../drop/drop';
+interface ScopeObject extends Record<string, any> {
+ toLiquid?: () => any;
+}
+export type Scope = ScopeObject | Drop;
+export {};
diff --git a/node_modules/liquidjs/dist/drop/blank-drop.d.ts b/node_modules/liquidjs/dist/drop/blank-drop.d.ts new file mode 100644 index 0000000..fb6e678 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/blank-drop.d.ts @@ -0,0 +1,5 @@ +import { EmptyDrop } from '../drop';
+export declare class BlankDrop extends EmptyDrop {
+ equals(value: any): boolean;
+ static is(value: unknown): boolean;
+}
diff --git a/node_modules/liquidjs/dist/drop/block-drop.d.ts b/node_modules/liquidjs/dist/drop/block-drop.d.ts new file mode 100644 index 0000000..882ec5e --- /dev/null +++ b/node_modules/liquidjs/dist/drop/block-drop.d.ts @@ -0,0 +1,11 @@ +import { Emitter } from '../emitters';
+import { Drop } from './drop';
+export declare class BlockDrop extends Drop {
+ private superBlockRender;
+ constructor(superBlockRender?: (emitter: Emitter) => IterableIterator<unknown> | string);
+ /**
+ * Provide parent access in child block by
+ * {{ block.super }}
+ */
+ super(): IterableIterator<unknown>;
+}
diff --git a/node_modules/liquidjs/dist/drop/comparable.d.ts b/node_modules/liquidjs/dist/drop/comparable.d.ts new file mode 100644 index 0000000..fc0e1e0 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/comparable.d.ts @@ -0,0 +1,8 @@ +export interface Comparable {
+ 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 Comparable;
diff --git a/node_modules/liquidjs/dist/drop/drop.d.ts b/node_modules/liquidjs/dist/drop/drop.d.ts new file mode 100644 index 0000000..33060d0 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/drop.d.ts @@ -0,0 +1,4 @@ +import { Context } from '../context';
+export declare abstract class Drop {
+ liquidMethodMissing(key: string | number, context: Context): Promise<any> | any;
+}
diff --git a/node_modules/liquidjs/dist/drop/empty-drop.d.ts b/node_modules/liquidjs/dist/drop/empty-drop.d.ts new file mode 100644 index 0000000..125550c --- /dev/null +++ b/node_modules/liquidjs/dist/drop/empty-drop.d.ts @@ -0,0 +1,11 @@ +import { Drop } from './drop';
+import { Comparable } from './comparable';
+export declare class EmptyDrop extends Drop implements Comparable {
+ equals(value: any): boolean;
+ gt(): boolean;
+ geq(): boolean;
+ lt(): boolean;
+ leq(): boolean;
+ valueOf(): string;
+ static is(value: unknown): boolean;
+}
diff --git a/node_modules/liquidjs/dist/drop/forloop-drop.d.ts b/node_modules/liquidjs/dist/drop/forloop-drop.d.ts new file mode 100644 index 0000000..517c014 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/forloop-drop.d.ts @@ -0,0 +1,15 @@ +import { Drop } from './drop';
+export declare class ForloopDrop extends Drop {
+ protected i: number;
+ name: string;
+ length: number;
+ constructor(length: number, collection: string, variable: string);
+ next(): void;
+ index0(): number;
+ index(): number;
+ first(): boolean;
+ last(): boolean;
+ rindex(): number;
+ rindex0(): number;
+ valueOf(): string;
+}
diff --git a/node_modules/liquidjs/dist/drop/index.d.ts b/node_modules/liquidjs/dist/drop/index.d.ts new file mode 100644 index 0000000..411b24d --- /dev/null +++ b/node_modules/liquidjs/dist/drop/index.d.ts @@ -0,0 +1,7 @@ +export * from './drop';
+export * from './null-drop';
+export * from './empty-drop';
+export * from './blank-drop';
+export * from './forloop-drop';
+export * from './block-drop';
+export * from './comparable';
diff --git a/node_modules/liquidjs/dist/drop/null-drop.d.ts b/node_modules/liquidjs/dist/drop/null-drop.d.ts new file mode 100644 index 0000000..e4af427 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/null-drop.d.ts @@ -0,0 +1,10 @@ +import { Drop } from './drop';
+import { Comparable } from './comparable';
+export declare class NullDrop extends Drop implements Comparable {
+ equals(value: any): boolean;
+ gt(): boolean;
+ geq(): boolean;
+ lt(): boolean;
+ leq(): boolean;
+ valueOf(): null;
+}
diff --git a/node_modules/liquidjs/dist/drop/tablerowloop-drop.d.ts b/node_modules/liquidjs/dist/drop/tablerowloop-drop.d.ts new file mode 100644 index 0000000..e04c807 --- /dev/null +++ b/node_modules/liquidjs/dist/drop/tablerowloop-drop.d.ts @@ -0,0 +1,10 @@ +import { ForloopDrop } from './forloop-drop';
+export declare class TablerowloopDrop extends ForloopDrop {
+ private cols;
+ constructor(length: number, cols: number, collection: string, variable: string);
+ row(): number;
+ col0(): number;
+ col(): number;
+ col_first(): boolean;
+ col_last(): boolean;
+}
diff --git a/node_modules/liquidjs/dist/emitters/emitter.d.ts b/node_modules/liquidjs/dist/emitters/emitter.d.ts new file mode 100644 index 0000000..6f6fd00 --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/emitter.d.ts @@ -0,0 +1,11 @@ +export interface Emitter {
+ /**
+ * Write a html value into emitter
+ * @param html string, Drop or other primitive value
+ */
+ write(html: any): void;
+ /**
+ * Buffered string
+ */
+ buffer: string;
+}
diff --git a/node_modules/liquidjs/dist/emitters/index.d.ts b/node_modules/liquidjs/dist/emitters/index.d.ts new file mode 100644 index 0000000..37a5506 --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/index.d.ts @@ -0,0 +1,4 @@ +export * from './emitter';
+export * from './simple-emitter';
+export * from '../build/streamed-emitter-browser';
+export * from './keeping-type-emitter';
diff --git a/node_modules/liquidjs/dist/emitters/keeping-type-emitter.d.ts b/node_modules/liquidjs/dist/emitters/keeping-type-emitter.d.ts new file mode 100644 index 0000000..86ced10 --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/keeping-type-emitter.d.ts @@ -0,0 +1,5 @@ +import { Emitter } from './emitter';
+export declare class KeepingTypeEmitter implements Emitter {
+ buffer: any;
+ write(html: any): void;
+}
diff --git a/node_modules/liquidjs/dist/emitters/simple-emitter.d.ts b/node_modules/liquidjs/dist/emitters/simple-emitter.d.ts new file mode 100644 index 0000000..c1c0788 --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/simple-emitter.d.ts @@ -0,0 +1,5 @@ +import { Emitter } from './emitter';
+export declare class SimpleEmitter implements Emitter {
+ buffer: string;
+ write(html: any): void;
+}
diff --git a/node_modules/liquidjs/dist/emitters/streamed-emitter.d.ts b/node_modules/liquidjs/dist/emitters/streamed-emitter.d.ts new file mode 100644 index 0000000..31ab2ce --- /dev/null +++ b/node_modules/liquidjs/dist/emitters/streamed-emitter.d.ts @@ -0,0 +1,9 @@ +/// <reference types="node" />
+import { Emitter } from './emitter';
+export declare class StreamedEmitter implements Emitter {
+ buffer: string;
+ stream: NodeJS.ReadWriteStream;
+ write(html: any): void;
+ error(err: Error): void;
+ end(): void;
+}
diff --git a/node_modules/liquidjs/dist/filters/array.d.ts b/node_modules/liquidjs/dist/filters/array.d.ts new file mode 100644 index 0000000..f3d91a2 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/array.d.ts @@ -0,0 +1,32 @@ +import { FilterImpl } from '../template';
+import type { Scope } from '../context';
+export declare const join: (this: unknown, v: any[], arg: string) => any;
+export declare const last: (this: unknown, v: any) => any;
+export declare const first: (this: unknown, v: any) => any;
+export declare const reverse: (this: unknown, v: any[]) => any;
+export declare function sort<T>(this: FilterImpl, arr: T[], property?: string): IterableIterator<unknown>;
+export declare function sort_natural<T>(this: FilterImpl, input: T[], property?: string): any[];
+export declare const size: (v: string | any[]) => number;
+export declare function map(this: FilterImpl, arr: Scope[], property: string): IterableIterator<unknown>;
+export declare function sum(this: FilterImpl, arr: Scope[], property?: string): IterableIterator<unknown>;
+export declare function compact<T>(this: FilterImpl, arr: T[]): any[];
+export declare function concat<T1, T2>(this: FilterImpl, v: T1[], arg?: T2[]): (T1 | T2)[];
+export declare function push<T>(this: FilterImpl, v: T[], arg: T): T[];
+export declare function unshift<T>(this: FilterImpl, v: T[], arg: T): T[];
+export declare function pop<T>(v: T[]): T[];
+export declare function shift<T>(this: FilterImpl, v: T[]): T[];
+export declare function slice<T>(this: FilterImpl, v: T[] | string, begin: number, length?: number): T[] | string;
+export declare function where<T extends object>(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown>;
+export declare function reject<T extends object>(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown>;
+export declare function where_exp<T extends object>(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown>;
+export declare function reject_exp<T extends object>(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown>;
+export declare function group_by<T extends object>(this: FilterImpl, arr: T[], property: string): IterableIterator<unknown>;
+export declare function group_by_exp<T extends object>(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown>;
+export declare function has<T extends object>(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown>;
+export declare function has_exp<T extends object>(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown>;
+export declare function find_index<T extends object>(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown>;
+export declare function find_index_exp<T extends object>(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown>;
+export declare function find<T extends object>(this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown>;
+export declare function find_exp<T extends object>(this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown>;
+export declare function uniq<T>(this: FilterImpl, arr: T[]): T[];
+export declare function sample<T>(this: FilterImpl, v: T[] | string, count?: number): T | string | (T | string)[];
diff --git a/node_modules/liquidjs/dist/filters/date.d.ts b/node_modules/liquidjs/dist/filters/date.d.ts new file mode 100644 index 0000000..56357a7 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/date.d.ts @@ -0,0 +1,6 @@ +import { FilterImpl } from '../template';
+export declare function date(this: FilterImpl, v: string | Date, format?: string, timezoneOffset?: number | string): string | Date;
+export declare function date_to_xmlschema(this: FilterImpl, v: string | Date): string | Date;
+export declare function date_to_rfc822(this: FilterImpl, v: string | Date): string | Date;
+export declare function date_to_string(this: FilterImpl, v: string | Date, type?: string, style?: string): string | Date;
+export declare function date_to_long_string(this: FilterImpl, v: string | Date, type?: string, style?: string): string | Date;
diff --git a/node_modules/liquidjs/dist/filters/html.d.ts b/node_modules/liquidjs/dist/filters/html.d.ts new file mode 100644 index 0000000..71a020a --- /dev/null +++ b/node_modules/liquidjs/dist/filters/html.d.ts @@ -0,0 +1,6 @@ +import { FilterImpl } from '../template';
+export declare function escape(this: FilterImpl, str: string): string;
+export declare function xml_escape(this: FilterImpl, str: string): string;
+export declare function escape_once(this: FilterImpl, str: string): string;
+export declare function newline_to_br(this: FilterImpl, v: string): string;
+export declare function strip_html(this: FilterImpl, v: string): string;
diff --git a/node_modules/liquidjs/dist/filters/index.d.ts b/node_modules/liquidjs/dist/filters/index.d.ts new file mode 100644 index 0000000..95cf6a2 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/index.d.ts @@ -0,0 +1,2 @@ +import { FilterImplOptions } from '../template';
+export declare const filters: Record<string, FilterImplOptions>;
diff --git a/node_modules/liquidjs/dist/filters/math.d.ts b/node_modules/liquidjs/dist/filters/math.d.ts new file mode 100644 index 0000000..7574b0a --- /dev/null +++ b/node_modules/liquidjs/dist/filters/math.d.ts @@ -0,0 +1,11 @@ +export declare const abs: (this: unknown, x: number) => any;
+export declare const at_least: (this: unknown, ...args: number[]) => any;
+export declare const at_most: (this: unknown, ...args: number[]) => any;
+export declare const ceil: (this: unknown, x: number) => any;
+export declare const divided_by: (this: unknown, dividend: number, divisor: number, integerArithmetic?: any) => any;
+export declare const floor: (this: unknown, x: number) => any;
+export declare const minus: (this: unknown, v: number, arg: number) => any;
+export declare const plus: (this: unknown, lhs: number, rhs: number) => any;
+export declare const modulo: (this: unknown, v: number, arg: number) => any;
+export declare const times: (this: unknown, v: number, arg: number) => any;
+export declare function round(v: number, arg?: number): number;
diff --git a/node_modules/liquidjs/dist/filters/misc.d.ts b/node_modules/liquidjs/dist/filters/misc.d.ts new file mode 100644 index 0000000..237dc21 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/misc.d.ts @@ -0,0 +1,18 @@ +import { identify } from '../util/underscore';
+import { FilterImpl } from '../template';
+declare function defaultFilter<T1 extends boolean, T2>(this: FilterImpl, value: T1, defaultValue: T2, ...args: Array<[string, any]>): T1 | T2;
+declare function json(value: any, space?: number): string;
+declare function inspect(value: any, space?: number): string;
+declare function to_integer(value: any): number;
+declare const _default: {
+ default: typeof defaultFilter;
+ raw: {
+ raw: boolean;
+ handler: typeof identify;
+ };
+ jsonify: typeof json;
+ to_integer: typeof to_integer;
+ json: typeof json;
+ inspect: typeof inspect;
+};
+export default _default;
diff --git a/node_modules/liquidjs/dist/filters/string.d.ts b/node_modules/liquidjs/dist/filters/string.d.ts new file mode 100644 index 0000000..f1a0006 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/string.d.ts @@ -0,0 +1,27 @@ +/**
+ * String related filters
+ *
+ * * prefer stringify() to String() since `undefined`, `null` should eval ''
+ */
+import { FilterImpl } from '../template';
+export declare function append(this: FilterImpl, v: string, arg: string): string;
+export declare function prepend(this: FilterImpl, v: string, arg: string): string;
+export declare function lstrip(this: FilterImpl, v: string, chars?: string): string;
+export declare function downcase(this: FilterImpl, v: string): string;
+export declare function upcase(this: FilterImpl, v: string): string;
+export declare function remove(this: FilterImpl, v: string, arg: string): string;
+export declare function remove_first(this: FilterImpl, v: string, l: string): string;
+export declare function remove_last(this: FilterImpl, v: string, l: string): string;
+export declare function rstrip(this: FilterImpl, str: string, chars?: string): string;
+export declare function split(this: FilterImpl, v: string, arg: string): string[];
+export declare function strip(this: FilterImpl, v: string, chars?: string): string;
+export declare function strip_newlines(this: FilterImpl, v: string): string;
+export declare function capitalize(this: FilterImpl, str: string): string;
+export declare function replace(this: FilterImpl, v: string, pattern: string, replacement: string): string;
+export declare function replace_first(this: FilterImpl, v: string, arg1: string, arg2: string): string;
+export declare function replace_last(this: FilterImpl, v: string, arg1: string, arg2: string): string;
+export declare function truncate(this: FilterImpl, v: string, l?: number, o?: string): string;
+export declare function truncatewords(this: FilterImpl, v: string, words?: number, o?: string): string;
+export declare function normalize_whitespace(this: FilterImpl, v: string): string;
+export declare function number_of_words(this: FilterImpl, input: string, mode?: 'cjk' | 'auto'): number;
+export declare function array_to_sentence_string(this: FilterImpl, array: unknown[], connector?: string): unknown;
diff --git a/node_modules/liquidjs/dist/filters/url.d.ts b/node_modules/liquidjs/dist/filters/url.d.ts new file mode 100644 index 0000000..da45394 --- /dev/null +++ b/node_modules/liquidjs/dist/filters/url.d.ts @@ -0,0 +1,14 @@ +export declare const url_decode: (x: string) => string;
+export declare const url_encode: (x: string) => string;
+export declare const cgi_escape: (x: string) => string;
+export declare const uri_escape: (x: string) => string;
+declare const rSlugifyReplacers: {
+ raw: RegExp;
+ default: RegExp;
+ pretty: RegExp;
+ ascii: RegExp;
+ latin: RegExp;
+ none: null;
+};
+export declare function slugify(str: string, mode?: keyof typeof rSlugifyReplacers, cased?: boolean): string;
+export {};
diff --git a/node_modules/liquidjs/dist/fs/fs-impl.d.ts b/node_modules/liquidjs/dist/fs/fs-impl.d.ts new file mode 100644 index 0000000..0d82dad --- /dev/null +++ b/node_modules/liquidjs/dist/fs/fs-impl.d.ts @@ -0,0 +1,9 @@ +export declare function exists(filepath: string): Promise<boolean>;
+export declare function readFile(filepath: string): Promise<string>;
+export declare function existsSync(filepath: string): boolean;
+export declare function readFileSync(filepath: string): string;
+export declare function resolve(root: string, file: string, ext: string): string;
+export declare function fallback(file: string): string | undefined;
+export declare function dirname(filepath: string): string;
+export declare function contains(root: string, file: string): boolean;
+export { sep } from 'path';
diff --git a/node_modules/liquidjs/dist/fs/fs-impl.spec.d.ts b/node_modules/liquidjs/dist/fs/fs-impl.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/fs-impl.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/fs/fs.d.ts b/node_modules/liquidjs/dist/fs/fs.d.ts new file mode 100644 index 0000000..86cf1e1 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/fs.d.ts @@ -0,0 +1,20 @@ +export interface FS {
+ /** check if a file exists asynchronously */
+ exists: (filepath: string) => Promise<boolean>;
+ /** check if a file exists synchronously */
+ existsSync: (filepath: string) => boolean;
+ /** read a file asynchronously */
+ readFile: (filepath: string) => Promise<string>;
+ /** read a file synchronously */
+ readFileSync: (filepath: string) => string;
+ /** resolve a file against directory, for given `ext` option */
+ resolve: (dir: string, file: string, ext: string) => string;
+ /** check if file is contained in `root`, always return `true` by default. Warning: not setting this could expose path traversal vulnerabilities. */
+ contains?: (root: string, file: string) => boolean;
+ /** defaults to "/" */
+ sep?: string;
+ /** required for relative path resolving */
+ dirname?: (file: string) => string;
+ /** fallback file for lookup failure */
+ fallback?: (file: string) => string | undefined;
+}
diff --git a/node_modules/liquidjs/dist/fs/index.d.ts b/node_modules/liquidjs/dist/fs/index.d.ts new file mode 100644 index 0000000..b40725f --- /dev/null +++ b/node_modules/liquidjs/dist/fs/index.d.ts @@ -0,0 +1,2 @@ +export * from './loader';
+export * from './fs';
diff --git a/node_modules/liquidjs/dist/fs/loader.d.ts b/node_modules/liquidjs/dist/fs/loader.d.ts new file mode 100644 index 0000000..6d590b7 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/loader.d.ts @@ -0,0 +1,24 @@ +import { FS } from './fs';
+export interface LoaderOptions {
+ fs: FS;
+ extname: string;
+ root: string[];
+ partials: string[];
+ layouts: string[];
+ relativeReference: boolean;
+}
+export declare enum LookupType {
+ Partials = "partials",
+ Layouts = "layouts",
+ Root = "root"
+}
+export declare class Loader {
+ shouldLoadRelative: (referencedFile: string) => boolean;
+ private options;
+ private contains;
+ constructor(options: LoaderOptions);
+ lookup(file: string, type: LookupType, sync?: boolean, currentFile?: string): Generator<unknown, string, string>;
+ candidates(file: string, dirs: string[], currentFile?: string, enforceRoot?: boolean): Generator<string, void, unknown>;
+ private dirname;
+ private lookupError;
+}
diff --git a/node_modules/liquidjs/dist/fs/loader.spec.d.ts b/node_modules/liquidjs/dist/fs/loader.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/loader.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/fs/map-fs.d.ts b/node_modules/liquidjs/dist/fs/map-fs.d.ts new file mode 100644 index 0000000..c5d6d79 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/map-fs.d.ts @@ -0,0 +1,13 @@ +export declare class MapFS {
+ private mapping;
+ constructor(mapping: {
+ [key: string]: string;
+ });
+ sep: string;
+ exists(filepath: string): Promise<boolean>;
+ existsSync(filepath: string): boolean;
+ readFile(filepath: string): Promise<string>;
+ readFileSync(filepath: string): string;
+ dirname(filepath: string): string;
+ resolve(dir: string, file: string, ext: string): string;
+}
diff --git a/node_modules/liquidjs/dist/fs/map-fs.spec.d.ts b/node_modules/liquidjs/dist/fs/map-fs.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/fs/map-fs.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/fs/node-require.d.ts b/node_modules/liquidjs/dist/fs/node-require.d.ts new file mode 100644 index 0000000..6b117df --- /dev/null +++ b/node_modules/liquidjs/dist/fs/node-require.d.ts @@ -0,0 +1 @@ +export declare const requireResolve: (partial: string) => string;
diff --git a/node_modules/liquidjs/dist/index.d.ts b/node_modules/liquidjs/dist/index.d.ts new file mode 100644 index 0000000..f6696e6 --- /dev/null +++ b/node_modules/liquidjs/dist/index.d.ts @@ -0,0 +1,16 @@ +export declare const version = "[VI]{version}[/VI]";
+export * as TypeGuards from './util/type-guards';
+export { toValue, createTrie, Trie, toPromise, toValueSync, assert, LiquidError, ParseError, RenderError, UndefinedVariableError, TokenizationError, AssertionError } from './util';
+export { Drop } from './drop';
+export { Emitter } from './emitters';
+export { defaultOperators, Operators, evalToken, evalQuotedToken, Expression, isFalsy, isTruthy } from './render';
+export { Context, Scope } from './context';
+export { Value, Hash, Template, FilterImplOptions, Tag, Filter, Output, Variable, VariableLocation, VariableSegments, Variables, StaticAnalysis, StaticAnalysisOptions, analyze, analyzeSync, Arguments, PartialScope } from './template';
+export { Token, TopLevelToken, TagToken, ValueToken } from './tokens';
+export type { RangeToken, LiteralToken, QuotedToken, PropertyAccessToken, NumberToken } from './tokens';
+export { TokenKind, Tokenizer, ParseStream, Parser } from './parser';
+export { filters } from './filters';
+export * from './tags';
+export { defaultOptions, LiquidOptions } from './liquid-options';
+export { FS } from './fs';
+export { Liquid } from './liquid';
diff --git a/node_modules/liquidjs/dist/liquid-options.d.ts b/node_modules/liquidjs/dist/liquid-options.d.ts new file mode 100644 index 0000000..fac12b2 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid-options.d.ts @@ -0,0 +1,159 @@ +import { LiquidCache } from './cache';
+import { FS, LookupType } from './fs';
+import { Operators } from './render';
+type OutputEscape = (value: any) => string;
+type OutputEscapeOption = 'escape' | 'json' | OutputEscape;
+export interface LiquidOptions {
+ /** A directory or an array of directories from where to resolve layout and include templates, and the filename passed to `.renderFile()`. If it's an array, the files are looked up in the order they occur in the array. Defaults to `["."]` */
+ root?: string | string[];
+ /** A directory or an array of directories from where to resolve included templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */
+ partials?: string | string[];
+ /** A directory or an array of directories from where to resolve layout templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */
+ layouts?: string | string[];
+ /** Allow refer to layouts/partials by relative pathname. To avoid arbitrary filesystem read, paths been referenced also need to be within corresponding root, partials, layouts. Defaults to `true`. */
+ relativeReference?: boolean;
+ /** Use jekyll style include, pass parameters to `include` variable of current scope. Defaults to `false`. */
+ jekyllInclude?: boolean;
+ /** Use jekyll style where filter, enables array item match. Defaults to `false`. */
+ jekyllWhere?: boolean;
+ /** Add a extname (if filepath doesn't include one) before template file lookup. Eg: setting to `".html"` will allow including file by basename. Defaults to `""`. */
+ extname?: string;
+ /** Whether or not to cache resolved templates. Defaults to `false`. */
+ cache?: boolean | number | LiquidCache;
+ /** Use JavaScript Truthiness. Defaults to `false`. */
+ jsTruthy?: boolean;
+ /** If set, treat the `filepath` parameter in `{%include filepath %}` and `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */
+ dynamicPartials?: boolean;
+ /** Whether or not to assert filter existence. If set to `false`, undefined filters will be skipped. Otherwise, undefined filters will cause an exception. Defaults to `false`. */
+ strictFilters?: boolean;
+ /** Whether or not to assert variable existence. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */
+ strictVariables?: boolean;
+ /** Catch all errors instead of exit upon one. Please note that render errors won't be reached when parse fails. */
+ catchAllErrors?: boolean;
+ /** Hide scope variables from prototypes, useful when you're passing a not sanitized object into LiquidJS or need to hide prototypes from templates. */
+ ownPropertyOnly?: boolean;
+ /** Modifies the behavior of `strictVariables`. If set, a single undefined variable will *not* cause an exception in the context of the `if`/`elsif`/`unless` tag and the `default` filter. Instead, it will evaluate to `false` and `null`, respectively. Irrelevant if `strictVariables` is not set. Defaults to `false`. **/
+ lenientIf?: boolean;
+ /** JavaScript timezone name or timezoneOffset for `date` filter, default to local time. That means if you're in Australia (UTC+10), it'll default to `-600` or `Australia/Lindeman` */
+ timezoneOffset?: number | string;
+ /** Default date format to use if the date filter doesn't include a format. Defaults to `%A, %B %-e, %Y at %-l:%M %P %z`. */
+ dateFormat?: string;
+ /** Default locale, will be used by date filter. Defaults to system locale. */
+ locale?: string;
+ /** Strip blank characters (including ` `, `\t`, and `\r`) from the right of tags (`{% %}`) until `\n` (inclusive). Defaults to `false`. */
+ trimTagRight?: boolean;
+ /** Similar to `trimTagRight`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */
+ trimTagLeft?: boolean;
+ /** Strip blank characters (including ` `, `\t`, and `\r`) from the right of values (`{{ }}`) until `\n` (inclusive). Defaults to `false`. */
+ trimOutputRight?: boolean;
+ /** Similar to `trimOutputRight`, whereas the `\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */
+ trimOutputLeft?: boolean;
+ /** The left delimiter for liquid tags. **/
+ tagDelimiterLeft?: string;
+ /** The right delimiter for liquid tags. **/
+ tagDelimiterRight?: string;
+ /** The left delimiter for liquid outputs. **/
+ outputDelimiterLeft?: string;
+ /** The right delimiter for liquid outputs. **/
+ outputDelimiterRight?: string;
+ /** Whether input strings to date filter preserve the given timezone **/
+ preserveTimezones?: boolean;
+ /** Whether `trim*Left`/`trim*Right` is greedy. When set to `true`, all consecutive blank characters including `\n` will be trimmed regardless of line breaks. Defaults to `true`. */
+ greedy?: boolean;
+ /** `fs` is used to override the default file-system module with a custom implementation. */
+ fs?: FS;
+ /** keyValue separator */
+ keyValueSeparator?: string;
+ /** Render from in-memory `templates` mapping instead of file system. File system related options like `fs`, 'root', and `relativeReference` will be ignored when `templates` is specified. */
+ templates?: {
+ [key: string]: string;
+ };
+ /** the global scope passed down to all partial and layout templates, i.e. templates included by `include`, `layout` and `render` tags. */
+ globals?: object;
+ /** Whether or not to keep value type when writing the Output, not working for streamed rendering. Defaults to `false`. */
+ keepOutputType?: boolean;
+ /** Default escape filter applied to output values, when set, you'll have to add `| raw` for values don't need to be escaped. Defaults to `undefined`. */
+ outputEscape?: OutputEscapeOption;
+ /** An object of operators for conditional statements. Defaults to the regular Liquid operators. */
+ operators?: Operators;
+ /** Respect parameter order when using filters like "for ... reversed limit", Defaults to `false`. */
+ orderedFilterParameters?: boolean;
+ /** For DoS handling, limit total length of templates parsed in one `parse()` call. A typical PC can handle 1e8 (100M) characters without issues. */
+ parseLimit?: number;
+ /** For DoS handling, limit total time (in ms) for each `render()` call. */
+ renderLimit?: number;
+ /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue. */
+ memoryLimit?: number;
+}
+export interface RenderOptions {
+ /**
+ * This call is sync or async? It's used by Liquid internal methods, you'll not need this.
+ */
+ sync?: boolean;
+ /**
+ * Same as `globals` on LiquidOptions, but only for current render() call
+ */
+ globals?: object;
+ /**
+ * Same as `strictVariables` on LiquidOptions, but only for current render() call
+ */
+ strictVariables?: boolean;
+ /**
+ * Same as `ownPropertyOnly` on LiquidOptions, but only for current render() call
+ */
+ ownPropertyOnly?: boolean;
+ /** For DoS handling, limit total renders of tag/HTML/output in one `render()` call. A typical PC can handle 1e5 renders of typical templates per second. */
+ templateLimit?: number;
+ /** For DoS handling, limit total time (in ms) for each `render()` call. */
+ renderLimit?: number;
+ /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue.. */
+ memoryLimit?: number;
+}
+export interface RenderFileOptions extends RenderOptions {
+ lookupType?: LookupType;
+}
+interface NormalizedOptions extends LiquidOptions {
+ root?: string[];
+ partials?: string[];
+ layouts?: string[];
+ cache?: LiquidCache;
+ outputEscape?: OutputEscape;
+}
+export interface NormalizedFullOptions extends NormalizedOptions {
+ root: string[];
+ partials: string[];
+ layouts: string[];
+ relativeReference: boolean;
+ jekyllInclude: boolean;
+ extname: string;
+ cache?: LiquidCache;
+ jsTruthy: boolean;
+ dynamicPartials: boolean;
+ fs: FS;
+ strictFilters: boolean;
+ strictVariables: boolean;
+ ownPropertyOnly: boolean;
+ lenientIf: boolean;
+ dateFormat: string;
+ locale: string;
+ trimTagRight: boolean;
+ trimTagLeft: boolean;
+ trimOutputRight: boolean;
+ trimOutputLeft: boolean;
+ tagDelimiterLeft: string;
+ tagDelimiterRight: string;
+ outputDelimiterLeft: string;
+ outputDelimiterRight: string;
+ preserveTimezones: boolean;
+ greedy: boolean;
+ globals: object;
+ keepOutputType: boolean;
+ operators: Operators;
+ parseLimit: number;
+ renderLimit: number;
+ memoryLimit: number;
+}
+export declare const defaultOptions: NormalizedFullOptions;
+export declare function normalize(options: LiquidOptions): NormalizedFullOptions;
+export declare function normalizeDirectoryList(value: any): string[];
+export {};
diff --git a/node_modules/liquidjs/dist/liquid-options.spec.d.ts b/node_modules/liquidjs/dist/liquid-options.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid-options.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/liquid.browser.min.js b/node_modules/liquidjs/dist/liquid.browser.min.js new file mode 100644 index 0000000..80cbfe1 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.min.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).liquidjs={})}(this,function(l){"use strict";var q=function(e,t){return(q=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){e.__proto__=t}:function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])}))(e,t)};function s(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function r(){this.constructor=e}q(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var T=function(){return(T=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function o(e,a,o,u){return new(o=o||Promise)(function(r,t){function n(e){try{s(u.next(e))}catch(e){t(e)}}function i(e){try{s(u.throw(e))}catch(e){t(e)}}function s(e){var t;e.done?r(e.value):((t=e.value)instanceof o?t:new o(function(e){e(t)})).then(n,i)}s((u=u.apply(e,a||[])).next())})}function G(n,i){var s,a,o,u={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},c={next:e(0),throw:e(1),return:e(2)};return"function"==typeof Symbol&&(c[Symbol.iterator]=function(){return this}),c;function e(r){return function(e){var t=[r,e];if(s)throw new TypeError("Generator is already executing.");for(;u=c&&t[c=0]?0:u;)try{if(s=1,a&&(o=2&t[0]?a.return:t[0]?a.throw||((o=a.return)&&o.call(a),0):a.next)&&!(o=o.call(a,t[1])).done)return o;switch(a=0,(t=o?[2&t[0],o.value]:t)[0]){case 0:case 1:o=t;break;case 4:return u.label++,{value:t[1],done:!1};case 5:u.label++,a=t[1],t=[0];continue;case 7:t=u.ops.pop(),u.trys.pop();continue;default:if(!(o=0<(o=u.trys).length&&o[o.length-1])&&(6===t[0]||2===t[0])){u=0;continue}if(3===t[0]&&(!o||t[1]>o[0]&&t[1]<o[3]))u.label=t[1];else if(6===t[0]&&u.label<o[1])u.label=o[1],o=t;else{if(!(o&&u.label<o[2])){o[2]&&u.ops.pop(),u.trys.pop();continue}u.label=o[2],u.ops.push(t)}}t=i.call(n,u)}catch(e){t=[6,e],a=0}finally{s=o=0}if(5&t[0])throw t[1];return{value:t[0]?t[1]:void 0,done:!0}}}}function X(e){var t="function"==typeof Symbol&&Symbol.iterator,r=t&&e[t],n=0;if(r)return r.call(e);if(e&&"number"==typeof e.length)return{next:function(){return{value:(e=e&&n>=e.length?void 0:e)&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function ee(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,i,s=r.call(e),a=[];try{for(;(void 0===t||0<t--)&&!(n=s.next()).done;)a.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(r=s.return)&&r.call(s)}finally{if(i)throw i.error}}return a}function d(e,t,r){if(r||2===arguments.length)for(var n,i=0,s=t.length;i<s;i++)!n&&i in t||((n=n||Array.prototype.slice.call(t,0,i))[i]=t[i]);return e.concat(n||Array.prototype.slice.call(t))}E.prototype.getText=function(){return this.input.slice(this.begin,this.end)},E.prototype.getPosition=function(){for(var e=ee([1,1],2),t=e[0],r=e[1],n=0;n<this.begin;n++)"\n"===this.input[n]?(t++,r=1):r++;return[t,r]},E.prototype.size=function(){return this.end-this.begin};var e=E;function E(e,t,r,n,i){this.kind=e,this.input=t,this.begin=r,this.end=n,this.file=i}M.prototype.liquidMethodMissing=function(e,t){};var A=M;function M(){}var D=Object.prototype.toString,N=String.prototype.toLowerCase,V=Object.hasOwnProperty;function te(e){return"string"==typeof e}function u(e){return"function"==typeof e}function P(e){return e&&u(e.next)&&u(e.throw)&&u(e.return)}function y(e){return te(e=g(e))?e:i(e)?"":a(e)?e.map(y).join(""):String(e)}function C(t){var e;return a(t=g(t))?t:te(t)&&0<t.length?[t]:W(e=t)&&Symbol.iterator in e?Array.from(t):W(t)?Object.keys(t).map(function(e){return[e,t[e]]}):[]}function v(e){return i(e=g(e))?[]:a(e)?e:[e]}function g(e){return e instanceof A&&u(e.valueOf)?e.valueOf():e}function I(e){return+g(e)||0}function B(e){return"number"==typeof e}function i(e){return null==e}function a(e){return"[object Array]"===D.call(e)}function H(e){return e&&B(e.length)}function U(e,t){for(var r in e=e||{})if(V.call(e,r)&&!1===t(e[r],r,e))break}function K(e){return e[e.length-1]}function W(e){var t=typeof e;return null!==e&&("object"==t||"function"==t)}function Y(e,t,r){void 0===r&&(r=1);for(var n=[],i=e;i<t;i+=r)n.push(i);return n}function $(e,t,r){return Z(e,t,r=void 0===r?" ":r,function(e,t){return t+e})}function Z(e,t,r,n){for(var i=t-(e=String(e)).length;0<i--;)e=n(e,r);return e}function J(e){return e}function Q(e,t){return null==e&&null==t?0:null==e?1:null==t||(e=N.call(e))<(t=N.call(t))?-1:t<e?1:0}function re(r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return r.call.apply(r,d([this],ee(e.map(g)),!1))}}function t(r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return r.call.apply(r,d([this],ee(e.map(I)),!1))}}function ne(e){return e.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")}function ie(t){var r,n,i,s,a,o,u;return G(this,function(e){switch(e.label){case 0:r=new Set,e.label=1;case 1:e.trys.push([1,6,7,8]),n=X(t),i=n.next(),e.label=2;case 2:return i.done?[3,5]:(s=i.value,a=JSON.stringify(s),r.has(a)?[3,4]:(r.add(a),[4,s]));case 3:e.sent(),e.label=4;case 4:return i=n.next(),[3,2];case 5:return[3,8];case 6:return a=e.sent(),o={error:a},[3,8];case 7:try{i&&!i.done&&(u=n.return)&&u.call(n)}finally{if(o)throw o.error}return[7];case 8:return[2]}})}var se,ae="__liquidClass__",oe=(s(ue,se=Error),ue.prototype.update=function(){var n,i,s,a,e,t,r;Object.defineProperty(this,"context",{value:(e=this.token,t=ee(e.getPosition(),2),n=t[0],i=t[1],s=e.input.split("\n"),t=Math.max(n-2,1),a=Math.min(n+3,s.length),Y(t,a+1).map(function(e){var t=e===n?">> ":" ",r=$(String(e),String(a).length),t="".concat(t).concat(r,"| "),r=e===n?"\n"+$("^",i+t.length):"";return t+s[e-1]+r}).join("\n")),enumerable:!1}),this.message=(e=this.message,(t=this.token).file&&(e+=", file:".concat(t.file)),t=ee(t.getPosition(),2),r=t[0],t=t[1],e+=", line:".concat(r,", col:").concat(t)),this.stack=this.message+"\n"+this.context+"\n"+this.stack,this.originalError&&(this.stack+="\nFrom "+this.originalError.stack)},ue.is=function(e){return"LiquidError"===(null==e?void 0:e[ae])},ue);function ue(e,t){var r=se.call(this,"string"==typeof e?e:e.message)||this;return r.context="","string"!=typeof e&&Object.defineProperty(r,"originalError",{value:e,enumerable:!1}),Object.defineProperty(r,"token",{value:t,enumerable:!1}),Object.defineProperty(r,ae,{value:"LiquidError",enumerable:!1}),r}s(he,ce=oe);var ce,le=he;function he(e,t){e=ce.call(this,e,t)||this;return e.name="TokenizationError",ce.prototype.update.call(e),e}s(de,pe=oe);var pe,fe=de;function de(e,t){t=pe.call(this,e,t)||this;return t.name="ParseError",t.message=e.message,pe.prototype.update.call(t),t}s(ge,ye=oe),ge.is=function(e){return"RenderError"===e.name};var ye,ve=ge;function ge(e,t){t=ye.call(this,e,t.token)||this;return t.name="RenderError",t.message=e.message,ye.prototype.update.call(t),t}s(we,me=oe),we.is=function(e){return"LiquidErrors"===e.name};var me,be=we;function we(e){var t=me.call(this,e[0],e[0].token)||this,r=(t.errors=e,t.name="LiquidErrors",1<e.length?"s":"");return t.message="".concat(e.length," error").concat(r," found"),me.prototype.update.call(t),t}s(xe,ke=oe);var ke,Te=xe;function xe(e,t){t=ke.call(this,e,t)||this;return t.name="UndefinedVariableError",t.message=e.message,ke.prototype.update.call(t),t}s(Fe,Se=Error);var Se,Le=Fe;function Fe(e){var t=Se.call(this,"undefined variable: ".concat(e))||this;return t.name="InternalUndefinedVariableError",t.variableName=e,t}s(ze,Oe=Error);var Oe,_e=ze;function ze(e){var t=Oe.call(this,e)||this;return t.name="AssertionError",t.message=e+"",t}var h=[0,0,0,0,0,0,0,0,0,20,4,4,4,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,2,8,0,0,0,0,8,0,0,0,64,0,65,0,0,33,33,33,33,33,33,33,33,33,33,0,0,2,2,2,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0],Re=1,je=4,qe=16;function Ee(e){e=e.charCodeAt(0);return 128<=e?!h[e]:h[e]&Re}function x(e,t){if(!e)throw t="function"==typeof t?t():t||"expect ".concat(e," to be true"),new _e(t)}function Ae(e,t){x(!e,t=void 0===t?"unexpected ".concat(JSON.stringify(e)):t)}h[160]=h[5760]=h[6158]=h[8192]=h[8193]=h[8194]=h[8195]=h[8196]=h[8197]=h[8198]=h[8199]=h[8200]=h[8201]=h[8202]=h[8232]=h[8233]=h[8239]=h[8287]=h[12288]=je,h[8220]=h[8221]=128;s(De,Me=A),De.prototype.equals=function(e){return i(g(e))},De.prototype.gt=function(){return!1},De.prototype.geq=function(){return!1},De.prototype.lt=function(){return!1},De.prototype.leq=function(){return!1},De.prototype.valueOf=function(){return null};var Me,r=De;function De(){return null!==Me&&Me.apply(this,arguments)||this}s(n,Ne=A),n.prototype.equals=function(e){return!(e instanceof n||(te(e=g(e))||a(e)?0!==e.length:!W(e)||0!==Object.keys(e).length))},n.prototype.gt=function(){return!1},n.prototype.geq=function(){return!1},n.prototype.lt=function(){return!1},n.prototype.leq=function(){return!1},n.prototype.valueOf=function(){return""},n.is=function(e){return e instanceof n};var Ne,Ve=n;function n(){return null!==Ne&&Ne.apply(this,arguments)||this}s(Ie,Pe=Ve),Ie.prototype.equals=function(e){return!1===e||!!i(g(e))||(te(e)?/^\s*$/.test(e):Pe.prototype.equals.call(this,e))},Ie.is=function(e){return e instanceof Ie};var Pe,Ce=Ie;function Ie(){return null!==Pe&&Pe.apply(this,arguments)||this}s(c,Be=A),c.prototype.next=function(){this.i++},c.prototype.index0=function(){return this.i},c.prototype.index=function(){return this.i+1},c.prototype.first=function(){return 0===this.i},c.prototype.last=function(){return this.i===this.length-1},c.prototype.rindex=function(){return this.length-this.i},c.prototype.rindex0=function(){return this.length-this.i-1},c.prototype.valueOf=function(){return JSON.stringify(this)};var Be,He=c;function c(e,t,r){var n=Be.call(this)||this;return n.i=0,n.length=e,n.name="".concat(r,"-").concat(t),n}Ke.prototype.write=function(e){this.buffer+=y(e)};var Ue=Ke;function Ke(){this.buffer=""}var We=function(){throw this.buffer="",this.stream=null,new Error("streaming not supported in browser")},Ye=($e.prototype.write=function(e){"string"!=typeof(e=g(e))&&""===this.buffer?this.buffer=e:this.buffer=y(this.buffer)+y(e)},$e);function $e(){this.buffer=""}s(Qe,Ze=A),Qe.prototype.super=function(){var t;return G(this,function(e){switch(e.label){case 0:return t=new Ue,[4,this.superBlockRender(t)];case 1:return e.sent(),[2,t.buffer]}})};var Ze,Je=Qe;function Qe(e){void 0===e&&(e=function(){return""});var t=Ze.call(this)||this;return t.superBlockRender=e,t}function p(e){return e&&u(e.equals)&&u(e.gt)&&u(e.geq)&&u(e.lt)&&u(e.leq)}var r=new r,Ge={true:!0,false:!1,nil:r,null:r,empty:new Ve,blank:new Ce};function Xe(e){var t,r,n={};try{for(var i=X(Object.entries(e)),s=i.next();!s.done;s=i.next()){for(var a=ee(s.value,2),o=a[0],u=a[1],c=n,l=0;l<o.length;l++){var h=o[l];c[h]=c[h]||{},l===o.length-1&&Ee(o[l])&&(c[h].needBoundary=!0),c=c[h]}c.data=u,c.end=!0}}catch(e){t={error:e}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return n}function f(a){return o(this,void 0,void 0,function(){var r,n,i,s;return G(this,function(e){switch(e.label){case 0:if(!P(a))return[2,a];n=!1,i="next",e.label=1;case 1:s=a[i](r),n=s.done,r=s.value,i="next",e.label=2;case 2:return(e.trys.push([2,5,,6]),P(r)&&(r=f(r)),(t=r)&&u(t.then))?[4,r]:[3,4];case 3:r=e.sent(),e.label=4;case 4:return[3,6];case 5:return s=e.sent(),i="throw",r=s,[3,6];case 6:if(!n)return[3,1];e.label=7;case 7:return[2,r]}var t})})}function m(e){if(!P(e))return e;var t="next";do{var r,n=e[t](r),i=n.done,t="next";if(P(r=n.value))try{r=m(r)}catch(e){t="throw",r=e}}while(!i);return r}var et=/%([-_0^#:]+)?(\d+)?([EO])?(.)/;function tt(e){return[31,function(e){e=e.getFullYear();return 0==(3&e)&&(e%100||e%400==0&&e)}(e)?29:28,31,30,31,30,31,31,30,31,30,31]}function rt(e){for(var t=0,r=0;r<e.getMonth();++r)t+=tt(e)[r];return t+e.getDate()}function nt(e,t){var r=rt(e)+(t-e.getDay()),e=7-new Date(e.getFullYear(),0,1).getDay()+t;return String(Math.floor((r-e)/7)+1)}var it={d:2,e:2,H:2,I:2,j:3,k:2,l:2,L:3,m:2,M:2,S:2,U:2,W:2},st=new Set("aAbBceklpP");function at(e,t){var r=Math.abs(e.getTimezoneOffset()),n=Math.floor(r/60),r=r%60;return(0<e.getTimezoneOffset()?"-":"+")+$(n,2,"0")+(t.flags[":"]?":":"")+$(r,2,"0")}var ot={a:function(e){return e.getShortWeekdayName()},A:function(e){return e.getLongWeekdayName()},b:function(e){return e.getShortMonthName()},B:function(e){return e.getLongMonthName()},c:function(e){return e.toLocaleString()},C:function(e){return parseInt(e.getFullYear().toString().substring(0,2),10)},d:function(e){return e.getDate()},e:function(e){return e.getDate()},H:function(e){return e.getHours()},I:function(e){return String(e.getHours()%12||12)},j:rt,k:function(e){return e.getHours()},l:function(e){return String(e.getHours()%12||12)},L:function(e){return e.getMilliseconds()},m:function(e){return e.getMonth()+1},M:function(e){return e.getMinutes()},N:function(e,t){t=Number(t.width)||9;return Z(String(e.getMilliseconds()).slice(0,t),t,e=void 0===(e="0")?" ":e,function(e,t){return e+t})},p:function(e){return e.getHours()<12?"AM":"PM"},P:function(e){return e.getHours()<12?"am":"pm"},q:function(e){if(e=e.getDate(),[11,12,13].includes(e))return"th";switch(e%10){case 1:return"st";case 2:return"nd";case 3:return"rd";default:return"th"}},s:function(e){return Math.round(e.getTime()/1e3)},S:function(e){return e.getSeconds()},u:function(e){return e.getDay()||7},U:function(e){return nt(e,0)},w:function(e){return e.getDay()},W:function(e){return nt(e,1)},x:function(e){return e.toLocaleDateString()},X:function(e){return e.toLocaleTimeString()},y:function(e){return e.getFullYear().toString().slice(2,4)},Y:function(e){return e.getFullYear()},z:at,Z:function(e,t){return e.getTimeZoneName()||at(e,t)},t:function(){return"\t"},n:function(){return"\n"},"%":function(){return"%"}};function ut(e,t){for(var r,n="",i=t;r=et.exec(i);)n+=i.slice(0,r.index),i=i.slice(r.index+r[0].length),n+=function(e,t){var r,t=ee(t,5),n=t[0],i=t[1],i=void 0===i?"":i,s=t[2],a=t[3],t=t[4],o=ot[t];if(!o)return n;var u={};try{for(var c=X(i),l=c.next();!l.done;l=c.next()){var h=l.value;u[h]=!0}}catch(e){r={error:e}}finally{try{l&&!l.done&&(p=c.return)&&p.call(c)}finally{if(r)throw r.error}}var n=String(o(e,{flags:u,width:s,modifier:a})),i=st.has(t)?" ":"0",p=s||it[t]||0;u["^"]?n=n.toUpperCase():u["#"]&&(n=function(e){return d([],ee(e),!1).some(function(e){return"a"<=e&&e<="z"})?e.toUpperCase():e.toLowerCase()}(n));u._?i=" ":u[0]&&(i="0");u["-"]&&(p=0);return $(n,p,i)}(e,r);return n+i}function ct(){return"undefined"!=typeof Intl?Intl.DateTimeFormat:void 0}ot.h=ot.b;var lt=/([zZ]|([+-])(\d{2}):?(\d{2}))$/,ht=["January","February","March","April","May","June","July","August","September","October","November","December"],pt=ht.map(function(e){return e.slice(0,3)}),ft=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dt=ft.map(function(e){return e.slice(0,3)}),yt=(b.prototype.getTime=function(){return this.displayDate.getTime()},b.prototype.getMilliseconds=function(){return this.displayDate.getMilliseconds()},b.prototype.getSeconds=function(){return this.displayDate.getSeconds()},b.prototype.getMinutes=function(){return this.displayDate.getMinutes()},b.prototype.getHours=function(){return this.displayDate.getHours()},b.prototype.getDay=function(){return this.displayDate.getDay()},b.prototype.getDate=function(){return this.displayDate.getDate()},b.prototype.getMonth=function(){return this.displayDate.getMonth()},b.prototype.getFullYear=function(){return this.displayDate.getFullYear()},b.prototype.toLocaleString=function(e,t){return(null!=t&&t.timeZone?this.date:this.displayDate).toLocaleString(e,t)},b.prototype.toLocaleTimeString=function(e){return this.displayDate.toLocaleTimeString(e)},b.prototype.toLocaleDateString=function(e){return this.displayDate.toLocaleDateString(e)},b.prototype.getTimezoneOffset=function(){return this.timezoneOffset},b.prototype.getTimeZoneName=function(){return this.timezoneFixed?this.timezoneName:this.DateTimeFormat?this.DateTimeFormat().resolvedOptions().timeZone:void 0},b.prototype.getLongMonthName=function(){var e;return null!=(e=this.format({month:"long"}))?e:ht[this.getMonth()]},b.prototype.getShortMonthName=function(){var e;return null!=(e=this.format({month:"short"}))?e:pt[this.getMonth()]},b.prototype.getLongWeekdayName=function(){var e;return null!=(e=this.format({weekday:"long"}))?e:ft[this.displayDate.getDay()]},b.prototype.getShortWeekdayName=function(){var e;return null!=(e=this.format({weekday:"short"}))?e:dt[this.displayDate.getDay()]},b.prototype.valid=function(){return!isNaN(this.getTime())},b.prototype.format=function(e){return this.DateTimeFormat&&this.DateTimeFormat(this.locale,e).format(this.displayDate)},b.createDateFixedToTimezone=function(e,t){var r,n,i=e.match(lt);return i&&"Z"===i[1]?new b(+new Date(e),t,0):i&&i[2]&&i[3]&&i[4]?(n=(i=ee(i,5))[2],r=i[3],i=i[4],n=("+"===n?-1:1)*(60*parseInt(r,10)+parseInt(i,10)),new b(+new Date(e),t,n)):new b(e,t)},b.getTimezoneOffset=function(e,t){e=t.toLocaleString("en-US",{timeZone:e}),t=t.toLocaleString("en-US",{timeZone:"UTC"}),e=new Date(e);return(+new Date(t)-+e)/6e4},b);function b(e,t,r){this.locale=t,this.DateTimeFormat=ct(),this.date=new Date(e),this.timezoneFixed=void 0!==r,void 0===r&&(r=this.date.getTimezoneOffset()),this.timezoneOffset=te(r)?b.getTimezoneOffset(r,this.date):r,this.timezoneName=te(r)?r:"";t=6e4*(this.date.getTimezoneOffset()-this.timezoneOffset),e=this.date.getTime()+t;this.displayDate=new Date(e)}gt.prototype.use=function(e){x(this.base+(e=+e||0)<=this.limit,this.message),this.base+=e},gt.prototype.check=function(e){x((e=+e||0)<=this.limit,this.message)};var vt=gt;function gt(e,t){this.base=0,this.message="".concat(e," limit exceeded"),this.limit=t}s(bt,mt=e),Object.defineProperty(bt.prototype,"content",{get:function(){return this.input.slice(this.contentRange[0],this.contentRange[1])},enumerable:!1,configurable:!0});var mt,r=bt;function bt(e,t,r,n,i,s,a,o){for(var t=ee(t,2),u=t[0],t=t[1],e=mt.call(this,e,r,n,i,o)||this,n=(e.trimLeft=!1,e.trimRight=!1,"-"===r[u]),i="-"===r[t-1],c=n?u+1:u,l=i?t-1:t;c<l&&h[r.charCodeAt(c)]&je;)c++;for(;c<l&&h[r.charCodeAt(l-1)]&je;)l--;return e.contentRange=[c,l],e.trimLeft=n||s,e.trimRight=i||a,e}s(Tt,wt=r);var wt,kt=Tt;function Tt(e,t,r,n,i){var s=this,a=n.trimTagLeft,o=n.trimTagRight,u=n.tagDelimiterLeft,c=n.tagDelimiterRight,u=ee([t+u.length,r-c.length],2),c=u[0],u=u[1];return(s=wt.call(this,l.TokenKind.Tag,[c,u],e,t,r,a,o,i)||this).tokenizer=new w(e,n.operators,i,s.contentRange),s.name=s.tokenizer.readTagName(),s.tokenizer.assert(s.name,"illegal tag syntax, tag name expected"),s.tokenizer.skipBlank(),s.args=s.tokenizer.input.slice(s.tokenizer.p,s.contentRange[1]),s}s(Lt,xt=r);var xt,St=Lt;function Lt(e,t,r,n,i){var s=n.trimOutputLeft,a=n.trimOutputRight,o=n.outputDelimiterLeft,n=n.outputDelimiterRight,o=[t+o.length,r-n.length];return xt.call(this,l.TokenKind.Output,o,e,t,r,s,a,i)||this}s(_t,Ft=e),_t.prototype.getContent=function(){return this.input.slice(this.begin+this.trimLeft,this.end-this.trimRight)};var Ft,Ot=_t;function _t(e,t,r,n){var i=Ft.call(this,l.TokenKind.HTML,e,t,r,n)||this;return i.input=e,i.begin=t,i.end=r,i.file=n,i.trimLeft=0,i.trimRight=0,i}s(jt,zt=e);var zt,Rt=jt;function jt(e,t,r,n){var i=zt.call(this,l.TokenKind.Number,e,t,r,n)||this;return i.input=e,i.begin=t,i.end=r,i.file=n,i.content=Number(i.getText()),i}s(At,qt=e);var qt,Et=At;function At(e,t,r,n){var i=qt.call(this,l.TokenKind.Word,e,t,r,n)||this;return i.input=e,i.begin=t,i.end=r,i.file=n,i.content=i.getText(),i}s(Nt,Mt=e);var Mt,Dt=Nt;function Nt(e,t,r,n){var i=Mt.call(this,l.TokenKind.Literal,e,t,r,n)||this;return i.input=e,i.begin=t,i.end=r,i.file=n,i.literal=i.getText(),i.content=Ge[i.literal],i}var Vt,Pt={"==":2,"!=":2,">":2,"<":2,">=":2,"<=":2,contains:2,not:1,and:0,or:0},Ct={"==":0,"!=":0,">":0,"<":0,">=":0,"<=":0,contains:0,not:1,and:0,or:0},It=(s(Bt,Vt=e),Bt.prototype.getPrecedence=function(){var e=this.getText();return e in Pt?Pt[e]:1},Bt);function Bt(e,t,r,n){var i=Vt.call(this,l.TokenKind.Operator,e,t,r,n)||this;return i.input=e,i.begin=t,i.end=r,i.file=n,i.operator=i.getText(),i}s(Kt,Ht=e);var Ht,Ut=Kt;function Kt(e,t,r,n,i,s){r=Ht.call(this,l.TokenKind.PropertyAccess,r,n,i,s)||this;return r.variable=e,r.props=t,r}s($t,Wt=e);var Wt,Yt=$t;function $t(e,t,r,n,i,s){r=Wt.call(this,l.TokenKind.Filter,r,n,i,s)||this;return r.name=e,r.args=t,r}s(Qt,Zt=e);var Zt,Jt=Qt;function Qt(e,t,r,n,i,s){var a=Zt.call(this,l.TokenKind.Hash,e,t,r,s)||this;return a.input=e,a.begin=t,a.end=r,a.name=n,a.value=i,a.file=s,a}var Gt=/[\da-fA-F]/,Xt=/[0-7]/,er={b:"\b",f:"\f",n:"\n",r:"\r",t:"\t",v:"\v"};function tr(e){e=e.charCodeAt(0);return 97<=e?e-87:65<=e?e-55:e-48}s(ir,rr=e);var rr,nr=ir;function ir(e,t,r,n){var i=rr.call(this,l.TokenKind.Quoted,e,t,r,n)||this;return i.input=e,i.begin=t,i.end=r,i.file=n,i.content=function(e){for(var t="",r=1;r<e.length-1;r++)if("\\"!==e[r])t+=e[r];else if(void 0!==er[e[r+1]])t+=er[e[++r]];else if("u"===e[r+1]){for(var n=0,i=r+2;i<=r+5&&Gt.test(e[i]);)n=16*n+tr(e[i++]);r=i-1,t+=String.fromCharCode(n)}else if(Xt.test(e[r+1])){for(i=r+1,n=0;i<=r+3&&Xt.test(e[i]);)n=8*n+tr(e[i++]);r=i-1,t+=String.fromCharCode(n)}else t+=e[++r];return t}(i.getText()),i}s(or,sr=e);var sr,ar=or;function or(e,t,r,n,i,s){var a=sr.call(this,l.TokenKind.Range,e,t,r,s)||this;return a.input=e,a.begin=t,a.end=r,a.lhs=n,a.rhs=i,a.file=s,a}s(lr,ur=r),Object.defineProperty(lr.prototype,"args",{get:function(){return this.tokenizer.input.slice(this.tokenizer.p,this.contentRange[1])},enumerable:!1,configurable:!0});var ur,cr=lr;function lr(e,t,r,n,i){t=ur.call(this,l.TokenKind.Tag,[t,r],e,t,r,!1,!1,i)||this;return t.tokenizer=new w(e,n.operators,i,t.contentRange),t.name=t.tokenizer.readTagName(),t.tokenizer.assert(t.name,"illegal liquid tag syntax"),t.tokenizer.skipBlank(),t}s(fr,hr=e);var hr,pr=fr;function fr(e,t,r,n,i,s){var a=hr.call(this,l.TokenKind.FilteredValue,r,n,i,s)||this;return a.initial=e,a.filters=t,a.input=r,a.begin=n,a.end=i,a.file=s,a}var dr={now:function(){return Date.now()}};function yr(){return"object"==typeof global&&global.performance||"object"==typeof window&&window.performance||dr}gr.prototype.renderTemplatesToNodeStream=function(e,t){var r=this,n=new We;return Promise.resolve().then(function(){return f(r.renderTemplates(e,t,n))}).then(function(){return n.end()},function(e){return n.error(e)}),n.stream},gr.prototype.renderTemplates=function(t,r,n){var i,s,a,o,u,c,l,h;return G(this,function(e){switch(e.label){case 0:n=n||new(r.opts.keepOutputType?Ye:Ue),i=[],e.label=1;case 1:e.trys.push([1,8,9,10]),s=X(t),a=s.next(),e.label=2;case 2:if(a.done)return[3,7];o=a.value,r.renderLimit.check(yr().now()),e.label=3;case 3:return e.trys.push([3,5,,6]),[4,o.render(r,n)];case 4:return(u=e.sent())&&n.write(u),r.breakCalled||r.continueCalled?[3,7]:[3,6];case 5:if(u=e.sent(),c=oe.is(u)?u:new ve(u,o),r.opts.catchAllErrors)return i.push(c),[3,6];throw c;case 6:return a=s.next(),[3,2];case 7:return[3,10];case 8:return c=e.sent(),l={error:c},[3,10];case 9:try{a&&!a.done&&(h=s.return)&&h.call(s)}finally{if(l)throw l.error}return[7];case 10:if(i.length)throw new be(i);return[2,n.buffer]}})};var vr=gr;function gr(){}br.prototype.evaluate=function(t,r){var n,i,s,a,o,u,c,l,h,p,f;return G(this,function(e){switch(e.label){case 0:x(t,"unable to evaluate: context not defined"),n=[],e.label=1;case 1:e.trys.push([1,11,12,13]),i=X(this.postfix),s=i.next(),e.label=2;case 2:return s.done?[3,10]:xn(a=s.value)?(o=n.pop(),u=void 0,1!==Ct[a.operator]?[3,4]:[4,t.opts.operators[a.operator](o,t)]):[3,7];case 3:return u=e.sent(),[3,6];case 4:return h=n.pop(),[4,t.opts.operators[a.operator](h,o,t)];case 5:u=e.sent(),e.label=6;case 6:return n.push(u),[3,9];case 7:return l=(c=n).push,[4,S(a,t,r)];case 8:l.apply(c,[e.sent()]),e.label=9;case 9:return s=i.next(),[3,2];case 10:return[3,13];case 11:return h=e.sent(),p={error:h},[3,13];case 12:try{s&&!s.done&&(f=i.return)&&f.call(i)}finally{if(p)throw p.error}return[7];case 13:return[2,n[0]]}})},br.prototype.valid=function(){return!!this.postfix.length};var mr=br;function br(e){this.postfix=d([],ee(function(t){var r,n,i,s,a,o;return G(this,function(e){switch(e.label){case 0:r=[],e.label=1;case 1:e.trys.push([1,10,11,12]),n=X(t),i=n.next(),e.label=2;case 2:if(i.done)return[3,9];if(!xn(s=i.value))return[3,6];e.label=3;case 3:return r.length&&r[r.length-1].getPrecedence()>s.getPrecedence()?[4,r.pop()]:[3,5];case 4:return e.sent(),[3,3];case 5:return r.push(s),[3,8];case 6:return[4,s];case 7:e.sent(),e.label=8;case 8:return i=n.next(),[3,2];case 9:return[3,12];case 10:return a=e.sent(),a={error:a},[3,12];case 11:try{i&&!i.done&&(o=n.return)&&o.call(n)}finally{if(a)throw a.error}return[7];case 12:return r.length?[4,r.pop()]:[3,14];case 13:return e.sent(),[3,12];case 14:return[2]}})}(e)),!1)}function S(t,r,n){return void 0===n&&(n=!1),G(this,function(e){switch(e.label){case 0:return t?"content"in t?[2,t.content]:zn(t)?[4,function(t,r,n){var i,s,a,o,u,c,l,h,p;return G(this,function(e){switch(e.label){case 0:i=[],e.label=1;case 1:e.trys.push([1,6,7,8]),s=X(t.props),a=s.next(),e.label=2;case 2:return a.done?[3,5]:(c=a.value,u=(o=i).push,[4,S(c,r,!1)]);case 3:u.apply(o,[e.sent()]),e.label=4;case 4:return a=s.next(),[3,2];case 5:return[3,8];case 6:return c=e.sent(),h={error:c},[3,8];case 7:try{a&&!a.done&&(p=s.return)&&p.call(s)}finally{if(h)throw h.error}return[7];case 8:return(e.trys.push([8,14,,15]),t.variable)?[4,S(t.variable,r,n)]:[3,11];case 9:return l=e.sent(),[4,r._getFromScope(l,i)];case 10:return[2,e.sent()];case 11:return[4,r._get(i)];case 12:return[2,e.sent()];case 13:return[3,15];case 14:if(l=e.sent(),n&&"InternalUndefinedVariableError"===l.name)return[2,null];throw new Te(l,t);case 15:return[2]}})}(t,r,n)]:[3,2]:[2];case 1:return[2,e.sent()];case 2:return jn(t)?[4,function(t,r){var n,i;return G(this,function(e){switch(e.label){case 0:return[4,S(t.lhs,r)];case 1:return n=e.sent(),[4,S(t.rhs,r)];case 2:return i=e.sent(),r.memoryLimit.use(i-n+1),[2,Y(+n,+i+1)]}})}(t,r)]:[3,4];case 3:return[2,e.sent()];case 4:return[2]}})}function wr(e){return e.content}function kr(e,t){return!Tr(e,t)}function Tr(e,t){return e=g(e),t.opts.jsTruthy?!e:!1===e||null==e}Ce={"==":xr,"!=":function(e,t){return!xr(e,t)},">":function(e,t){return p(e)?e.gt(t):p(t)?t.lt(e):g(e)>g(t)},"<":function(e,t){return p(e)?e.lt(t):p(t)?t.gt(e):g(e)<g(t)},">=":function(e,t){return p(e)?e.geq(t):p(t)?t.leq(e):g(e)>=g(t)},"<=":function(e,t){return p(e)?e.leq(t):p(t)?t.geq(e):g(e)<=g(t)},contains:function(e,t){return a(e=g(e))?e.some(function(e){return xr(e,t)}):!!u(null==e?void 0:e.indexOf)&&-1<e.indexOf(g(t))},not:function(e,t){return Tr(g(e),t)},and:function(e,t,r){return kr(g(e),r)&&kr(g(t),r)},or:function(e,t,r){return kr(g(e),r)||kr(g(t),r)}};function xr(e,t){var r,n;return p(e)?e.equals(t):p(t)?t.equals(e):(e=g(e),t=g(t),a(e)?a(t)&&(n=t,(r=e).length===n.length)&&!r.some(function(e,t){return!xr(e,n[t])}):e===t)}var Sr=function(e,t,r,n){this.key=e,this.value=t,this.next=r,this.prev=n},Lr=(Fr.prototype.write=function(e,t){this.cache[e]?this.cache[e].value=t:(t=new Sr(e,t,this.head.next,this.head),this.head.next.prev=t,this.head.next=t,this.cache[e]=t,this.size++,this.ensureLimit())},Fr.prototype.read=function(e){var t;if(this.cache[e])return t=this.cache[e].value,this.remove(e),this.write(e,t),t},Fr.prototype.remove=function(e){var t=this.cache[e];t.prev.next=t.next,t.next.prev=t.prev,delete this.cache[e],this.size--},Fr.prototype.clear=function(){this.head.next=this.tail,this.tail.prev=this.head,this.size=0,this.cache={}},Fr.prototype.ensureLimit=function(){this.size>this.limit&&this.remove(this.tail.prev.key)},Fr);function Fr(e,t){void 0===t&&(t=0),this.limit=e,this.size=t,this.cache={},this.head=new Sr("HEAD",null,null,null),this.tail=new Sr("TAIL",null,null,null),this.head.next=this.tail,this.tail.prev=this.head}function Or(e,t){var r=document.createElement("base"),e=(r.href=e,document.getElementsByTagName("head")[0]),n=(e.insertBefore(r,e.firstChild),document.createElement("a")),t=(n.href=t,n.href);return e.removeChild(r),t}r=Object.freeze({__proto__:null,resolve:function(e,t,i){return e.length&&"/"!==K(e)&&(e+="/"),Or(e,t).replace(/^(\w+:\/\/[^/]+)(\/[^?]+)/,function(e,t,r){var n=r.split("/").pop();return/\.\w+$/.test(n)?e:t+r+i})},readFile:function(n){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,new Promise(function(e,t){var r=new XMLHttpRequest;r.onload=function(){200<=r.status&&r.status<300?e(r.responseText):t(new Error(r.statusText))},r.onerror=function(){t(new Error("An error occurred whilst receiving the response."))},r.open("GET",n),r.send()})]})})},readFileSync:function(e){var t=new XMLHttpRequest;if(t.open("GET",e,!1),t.send(),t.status<200||300<=t.status)throw new Error(t.statusText);return t.responseText},exists:function(e){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,!0]})})},existsSync:function(e){return!0},dirname:function(e){return Or(e,".")},sep:"/"});function _r(e,t){return void 0===t&&(t=0),JSON.stringify(e,null,t)}var zr={default:function(e,t){for(var r=[],n=2;n<arguments.length;n++)r[n-2]=arguments[n];return a(e=g(e))||te(e)?e.length?e:t:(!1!==e||!new Map(r).get("allow_false"))&&(Tr(e,this.context)?t:e)},raw:{raw:!0,handler:J},jsonify:_r,to_integer:function(e){return Number(e)},json:_r,inspect:function(e,t){void 0===t&&(t=0);var r=[];return JSON.stringify(e,function(e,t){if("object"==typeof t&&null!==t){for(;0<r.length&&r[r.length-1]!==this;)r.pop();if(r.includes(t))return"[Circular]";r.push(t)}return t},t)}},Rr={"&":"&","<":"<",">":">",'"':""","'":"'"},jr={"&":"&","<":"<",">":">",""":'"',"'":"'"};function qr(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/&|<|>|"|'/g,function(e){return Rr[e]})}var Er=Object.freeze({__proto__:null,escape:qr,xml_escape:function(e){return qr.call(this,e)},escape_once:function(e){return qr.call(this,function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/&(amp|lt|gt|#34|#39);/g,function(e){return jr[e]})}.call(this,e))},newline_to_br:function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/\r?\n/gm,"<br />\n")},strip_html:function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/<script[\s\S]*?<\/script>|<style[\s\S]*?<\/style>|<.*?>|<!--[\s\S]*?-->/g,"")}}),Ar=(Mr.prototype.exists=function(t){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,this.existsSync(t)]})})},Mr.prototype.existsSync=function(e){return!i(this.mapping[e])},Mr.prototype.readFile=function(t){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,this.readFileSync(t)]})})},Mr.prototype.readFileSync=function(e){var t=this.mapping[e];if(i(t))throw new Error("ENOENT: ".concat(e));return t},Mr.prototype.dirname=function(e){e=e.split(this.sep);return e.pop(),e.join(this.sep)},Mr.prototype.resolve=function(e,t,r){var n,i;if(t+=r,"."===e)return t;var s=e.split(/\/+/);try{for(var a=X(t.split(this.sep)),o=a.next();!o.done;o=a.next()){var u=o.value;"."!==u&&""!==u&&(".."===u?(1<s.length||""!==s[0])&&s.pop():s.push(u))}}catch(e){n={error:e}}finally{try{o&&!o.done&&(i=a.return)&&i.call(a)}finally{if(n)throw n.error}}return s.join(this.sep)},Mr);function Mr(e){this.mapping=e,this.sep="/"}var Dr={root:["."],layouts:["."],partials:["."],relativeReference:!0,jekyllInclude:!1,keyValueSeparator:":",cache:void 0,extname:"",fs:r,dynamicPartials:!0,jsTruthy:!1,dateFormat:"%A, %B %-e, %Y at %-l:%M %P %z",locale:"",trimTagRight:!1,trimTagLeft:!1,trimOutputRight:!1,trimOutputLeft:!1,greedy:!0,tagDelimiterLeft:"{%",tagDelimiterRight:"%}",outputDelimiterLeft:"{{",outputDelimiterRight:"}}",preserveTimezones:!1,strictFilters:!1,strictVariables:!1,ownPropertyOnly:!0,lenientIf:!1,globals:{},keepOutputType:!1,operators:Ce,memoryLimit:1/0,parseLimit:1/0,renderLimit:1/0};function Nr(e){var t,r;return e.hasOwnProperty("root")&&(e.hasOwnProperty("partials")||(e.partials=e.root),e.hasOwnProperty("layouts")||(e.layouts=e.root)),e.hasOwnProperty("cache")&&(r=void 0,r="number"==typeof e.cache?0<e.cache?new Lr(e.cache):void 0:"object"==typeof e.cache?e.cache:e.cache?new Lr(1024):void 0,e.cache=r),(e=T(T(T({},Dr),e.jekyllInclude?{dynamicPartials:!1}:{}),e)).fs.dirname&&e.fs.sep||!e.relativeReference||(console.warn("[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning"),e.relativeReference=!1),e.root=Vr(e.root),e.partials=Vr(e.partials),e.layouts=Vr(e.layouts),e.outputEscape=e.outputEscape&&("escape"===(r=e.outputEscape)?qr:"json"===r?zr.json:(x(u(r),"`outputEscape` need to be of type string or function"),r)),e.locale||(e.locale=null!=(t=null==(t=ct())?void 0:t().resolvedOptions().locale)?t:"en-US"),e.templates&&(e.fs=new Ar(e.templates),e.relativeReference=!0,e.root=e.partials=e.layouts="."),e}function Vr(e){var t=[];return a(e)&&(t=e),t=te(e)?[e]:t}function Pr(e,t){for(var r=!1,n=0;n<e.length;n++){var i=e[n];if(Tn(i)){if(!r&&i.trimLeft){o=a=s=void 0;var s=e[n-1],a=t.greedy;if(s&&Sn(s))for(var o=a?je:qe;h[s.input.charCodeAt(s.end-1-s.trimRight)]&o;)s.trimRight++}if(Fn(i)&&("raw"===i.name?r=!0:"endraw"===i.name&&(r=!1)),!r&&i.trimRight){c=a=u=void 0;var u=e[n+1],a=t.greedy;if(u&&Sn(u)){for(var c=a?je:qe;h[u.input.charCodeAt(u.begin+u.trimLeft)]&c;)u.trimLeft++;"\n"===u.input.charAt(u.begin+u.trimLeft)&&u.trimLeft++}}}}}k.prototype.readExpression=function(){return new mr(this.readExpressionTokens())},k.prototype.readExpressionTokens=function(){var t;return G(this,function(e){switch(e.label){case 0:return this.p<this.N?(t=this.readOperator())?[4,t]:[3,2]:[3,5];case 1:return e.sent(),[3,0];case 2:return(t=this.readValue())?[4,t]:[3,4];case 3:return e.sent(),[3,0];case 4:case 5:return[2]}})},k.prototype.readOperator=function(){this.skipBlank();var e=this.matchTrie(this.opTrie);if(-1!==e)return new It(this.input,this.p,this.p=e,this.file)},k.prototype.matchTrie=function(e){for(var t,r=e,n=this.p;r[this.input[n]]&&n<this.N;)(r=r[this.input[n++]]).end&&(t=r);return!t||t.needBoundary&&Ee(this.peek(n-this.p))?-1:n},k.prototype.readFilteredValue=function(){var e=this.p,t=this.readExpression(),r=(this.assert(t.valid(),"invalid value expression: ".concat(this.snapshot())),this.readFilters());return new pr(t,r,this.input,e,this.p,this.file)},k.prototype.readFilters=function(){for(var e=[];;){var t=this.readFilter();if(!t)return e;e.push(t)}},k.prototype.readFilter=function(){var e=this;if(this.skipBlank(),this.end())return null;this.assert("|"===this.read(),'expected "|" before filter');var t=this.readIdentifier();if(!t.size())return this.assert(this.end(),"expected filter name"),null;var r=[];if(this.skipBlank(),":"===this.peek())do{++this.p;var n=this.readFilterArg()}while(n&&r.push(n),this.skipBlank(),this.assert(this.end()||","===this.peek()||"|"===this.peek(),function(){return"unexpected character ".concat(e.snapshot())}),","===this.peek());else if("|"!==this.peek()&&!this.end())throw this.error('expected ":" after filter name');return new Yt(t.getText(),r,this.input,t.begin,this.p,this.file)},k.prototype.readFilterArg=function(){var e=this.readValue();if(e){if(this.skipBlank(),":"!==this.peek())return e;++this.p;var t=this.readValue();return[e.getText(),t]}},k.prototype.readTopLevelTokens=function(e){void 0===e&&(e=Dr);for(var t=[];this.p<this.N;){var r=this.readTopLevelToken(e);t.push(r)}return Pr(t,e),t},k.prototype.readTopLevelToken=function(e){var t=e.tagDelimiterLeft,r=e.outputDelimiterLeft;return-1<this.rawBeginAt?this.readEndrawOrRawContent(e):this.match(t)?this.readTagToken(e):this.match(r)?this.readOutputToken(e):this.readHTMLToken([t,r])},k.prototype.readHTMLToken=function(e){for(var t=this,r=this.p;this.p<this.N&&!e.some(function(e){return t.match(e)});)++this.p;return new Ot(this.input,r,this.p,this.file)},k.prototype.readTagToken=function(e){var t=this.file,r=this.input,n=this.p;if(-1===this.readToDelimiter(e.tagDelimiterRight))throw this.error("tag ".concat(this.snapshot(n)," not closed"),n);r=new kt(r,n,this.p,e,t);return"raw"===r.name&&(this.rawBeginAt=n),r},k.prototype.readToDelimiter=function(e,t){for(void 0===t&&(t=!1),this.skipBlank();this.p<this.N;)if(t&&8&this.peekType())this.readQuoted();else if(++this.p,this.rmatch(e))return this.p;return-1},k.prototype.readOutputToken=function(e){void 0===e&&(e=Dr);var t=this.file,r=this.input,n=e.outputDelimiterRight,i=this.p;if(-1===this.readToDelimiter(n,!0))throw this.error("output ".concat(this.snapshot(i)," not closed"),i);return new St(r,i,this.p,e,t)},k.prototype.readEndrawOrRawContent=function(e){for(var t,r=e.tagDelimiterLeft,n=e.tagDelimiterRight,i=this.p,s=this.readTo(r)-r.length;this.p<this.N;)if("endraw"!==this.readIdentifier().getText())s=this.readTo(r)-r.length;else for(;this.p<=this.N;){if(this.rmatch(n))return t=this.p,i===s?(this.rawBeginAt=-1,new kt(this.input,i,t,e,this.file)):(this.p=s,new Ot(this.input,i,s,this.file));if(this.rmatch(r))break;this.p++}throw this.error("raw ".concat(this.snapshot(this.rawBeginAt)," not closed"),i)},k.prototype.readLiquidTagTokens=function(e){void 0===e&&(e=Dr);for(var t=[];this.p<this.N;){var r=this.readLiquidTagToken(e);r&&t.push(r)}return t},k.prototype.readLiquidTagToken=function(e){var t,r;if(this.skipBlank(),!this.end())return t=this.p,this.readToDelimiter("\n"),r=this.p,new cr(this.input,t,r,e,this.file)},k.prototype.error=function(e,t){return void 0===t&&(t=this.p),new le(e,new Et(this.input,t,this.N,this.file))},k.prototype.assert=function(e,t,r){if(!e)throw this.error("function"==typeof t?t():t,r)},k.prototype.snapshot=function(e){return void 0===e&&(e=this.p),JSON.stringify((e=this.input.slice(e,this.N),t=32,e.length>t?e.slice(0,t-3)+"...":e));var t},k.prototype.readWord=function(){return this.readIdentifier()},k.prototype.readIdentifier=function(){this.skipBlank();for(var e=this.p;!this.end()&&Ee(this.peek());)++this.p;return new Et(this.input,e,this.p,this.file)},k.prototype.readNonEmptyIdentifier=function(){var e=this.readIdentifier();return e.size()?e:void 0},k.prototype.readTagName=function(){return this.skipBlank(),"#"===this.input[this.p]?this.input.slice(this.p,++this.p):this.readIdentifier().getText()},k.prototype.readHashes=function(e){for(var t=[];;){var r=this.readHash(e);if(!r)return t;t.push(r)}},k.prototype.readHash=function(e){this.skipBlank(),","===this.peek()&&++this.p;var t,r=this.p,n=this.readNonEmptyIdentifier();if(n)return this.skipBlank(),e=te(e)?e:e?"=":":",this.peek()===e&&(++this.p,t=this.readValue()),new Jt(this.input,r,this.p,n,t,this.file)},k.prototype.remaining=function(){return this.input.slice(this.p,this.N)},k.prototype.advance=function(e){this.p+=e=void 0===e?1:e},k.prototype.end=function(){return this.p>=this.N},k.prototype.read=function(){return this.input[this.p++]},k.prototype.readTo=function(e){for(;this.p<this.N;)if(++this.p,this.rmatch(e))return this.p;return-1},k.prototype.readValue=function(){this.skipBlank();var e=this.p,t=this.readLiteral()||this.readQuoted()||this.readRange()||this.readNumber(),r=this.readProperties(!t);return r.length?new Ut(t,r,this.input,e,this.p):t},k.prototype.readScopeValue=function(){this.skipBlank();var e=this.p,t=this.readProperties();if(t.length)return new Ut(void 0,t,this.input,e,this.p)},k.prototype.readProperties=function(e){void 0===e&&(e=!0);for(var t=[];;){if("["===this.peek()){this.p++;var r=this.readValue()||new Et(this.input,this.p,this.p,this.file);this.assert(-1!==this.readTo("]"),"[ not closed")}else{if(e&&!t.length)if(r=this.readNonEmptyIdentifier()){t.push(r);continue}if("."!==this.peek()||"."===this.peek(1))break;if(this.p++,!(r=this.readNonEmptyIdentifier()))break}t.push(r)}return t},k.prototype.readNumber=function(){this.skipBlank();var e,t=!1,r=!1,n=0;for(64&this.peekType()&&n++;this.p+n<=this.N;){if(32&this.peekType(n))r=!0;else{if("."!==this.peek(n)||"."===this.peek(n+1))break;if(t||!r)return;t=!0}n++}if(r&&!Ee(this.peek(n)))return e=new Rt(this.input,this.p,this.p+n,this.file),this.advance(n),e},k.prototype.readLiteral=function(){this.skipBlank();var e,t=this.matchTrie(this.literalTrie);if(-1!==t)return e=new Dt(this.input,this.p,t,this.file),this.p=t,e},k.prototype.readRange=function(){this.skipBlank();var e,t,r=this.p;if("("===this.peek())return++this.p,e=this.readValueOrThrow(),this.skipBlank(),this.assert("."===this.read()&&"."===this.read(),"invalid range syntax"),t=this.readValueOrThrow(),this.skipBlank(),this.assert(")"===this.read(),"invalid range syntax"),new ar(this.input,r,this.p,e,t,this.file)},k.prototype.readValueOrThrow=function(){var e=this,t=this.readValue();return this.assert(t,function(){return"unexpected token ".concat(e.snapshot(),", value expected")}),t},k.prototype.readQuoted=function(){this.skipBlank();var e=this.p;if(8&this.peekType()){++this.p;for(var t=!1;this.p<this.N&&(++this.p,this.input[this.p-1]!==this.input[e]||t);)t?t=!1:"\\"===this.input[this.p-1]&&(t=!0);return new nr(this.input,e,this.p,this.file)}},k.prototype.readFileNameTemplate=function(t){var r,n,i;return G(this,function(e){switch(e.label){case 0:r=t.outputDelimiterLeft,n=[","," ",r],i=new Set(n),e.label=1;case 1:return this.p<this.N&&!i.has(this.peek())?[4,this.match(r)?this.readOutputToken(t):this.readHTMLToken(n)]:[3,3];case 2:return e.sent(),[3,1];case 3:return[2]}})},k.prototype.match=function(e){for(var t=0;t<e.length;t++)if(e[t]!==this.input[this.p+t])return!1;return!0},k.prototype.rmatch=function(e){for(var t=0;t<e.length;t++)if(e[e.length-1-t]!==this.input[this.p-1-t])return!1;return!0},k.prototype.peekType=function(e){return this.p+(e=void 0===e?0:e)>=this.N?0:h[this.input.charCodeAt(this.p+e)]},k.prototype.peek=function(e){return this.p+(e=void 0===e?0:e)>=this.N?"":this.input[this.p+e]},k.prototype.skipBlank=function(){for(;this.peekType()&je;)++this.p};var w=k;function k(e,t,r,n){void 0===t&&(t=Dr.operators),this.input=e,this.file=r,this.rawBeginAt=-1,this.p=n?n[0]:0,this.N=n?n[1]:e.length,this.opTrie=Xe(t),this.literalTrie=Xe(Ge)}Ir.prototype.on=function(e,t){return this.handlers[e]=t,this},Ir.prototype.trigger=function(e,t){e=this.handlers[e];return!!e&&(e.call(this,t),!0)},Ir.prototype.start=function(){var e,t;for(this.trigger("start");!this.stopRequested&&(e=this.tokens.shift());)this.trigger("token",e)||Fn(e)&&this.trigger("tag:".concat(e.name),e)||(t=this.parseToken(e,this.tokens),this.trigger("template",t));return this.stopRequested||this.trigger("end"),this},Ir.prototype.stop=function(){return this.stopRequested=!0,this};var Cr=Ir;function Ir(e,t){this.handlers={},this.stopRequested=!1,this.tokens=e,this.parseToken=t}function Br(e){this.token=e}s(Ur,Hr=Br);var Hr,L=Ur;function Ur(e,t,r){var n=Hr.call(this,e)||this;return n.name=e.name,n.liquid=r,n.tokenizer=e.tokenizer,n}Wr.prototype.render=function(t){var r,n,i,s,a,o,u,c,l;return G(this,function(e){switch(e.label){case 0:r={},e.label=1;case 1:e.trys.push([1,8,9,10]),n=X(Object.keys(this.hash)),i=n.next(),e.label=2;case 2:return i.done?[3,7]:(s=i.value,a=r,o=s,void 0!==this.hash[s]?[3,3]:(u=!0,[3,5]));case 3:return[4,S(this.hash[s],t)];case 4:u=e.sent(),e.label=5;case 5:a[o]=u,e.label=6;case 6:return i=n.next(),[3,2];case 7:return[3,10];case 8:return c=e.sent(),c={error:c},[3,10];case 9:try{i&&!i.done&&(l=n.return)&&l.call(n)}finally{if(c)throw c.error}return[7];case 10:return[2,r]}})};var Kr=Wr;function Wr(e,t){this.hash={};var r,n,e=e instanceof w?e:new w(e,{});try{for(var i=X(e.readHashes(t)),s=i.next();!s.done;s=i.next()){var a=s.value;this.hash[a.name.content]=a.value}}catch(e){r={error:e}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}}function Yr(e){return a(e)}Zr.prototype.render=function(t,r){var n,i,s,a,o,u,c,l,h,p,f;return G(this,function(e){switch(e.label){case 0:n=[],e.label=1;case 1:e.trys.push([1,8,9,10]),i=X(this.args),s=i.next(),e.label=2;case 2:return s.done?[3,7]:Yr(a=s.value)?(u=(o=n).push,c=[a[0]],[4,S(a[1],r)]):[3,4];case 3:return u.apply(o,[c.concat([e.sent()])]),[3,6];case 4:return h=(l=n).push,[4,S(a,r)];case 5:h.apply(l,[e.sent()]),e.label=6;case 6:return s=i.next(),[3,2];case 7:return[3,10];case 8:return p=e.sent(),p={error:p},[3,10];case 9:try{s&&!s.done&&(f=i.return)&&f.call(i)}finally{if(p)throw p.error}return[7];case 10:return[4,this.handler.apply({context:r,token:this.token,liquid:this.liquid},d([t],ee(n),!1))];case 11:return[2,e.sent()]}})};var $r=Zr;function Zr(e,t,r){this.token=e,this.name=e.name,this.handler=u(t)?t:u(null==t?void 0:t.handler)?t.handler:J,this.raw=!u(t)&&!(null==t||!t.raw),this.args=e.args,this.liquid=r}Jr.prototype.value=function(t,r){var n,i,s,a,o;return G(this,function(e){switch(e.label){case 0:return r=r||t.opts.lenientIf&&0<this.filters.length&&"default"===this.filters[0].name,[4,this.initial.evaluate(t,r)];case 1:n=e.sent(),e.label=2;case 2:e.trys.push([2,7,8,9]),i=X(this.filters),s=i.next(),e.label=3;case 3:return s.done?[3,6]:[4,s.value.render(n,t)];case 4:n=e.sent(),e.label=5;case 5:return s=i.next(),[3,3];case 6:return[3,9];case 7:return a=e.sent(),a={error:a},[3,9];case 8:try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(a)throw a.error}return[7];case 9:return[2,n]}})},Jr.prototype.getFilter=function(e,t){var r=e.filters[t];return x(r||!e.options.strictFilters,function(){return"undefined filter: ".concat(t)}),r};var F=Jr;function Jr(e,t){var r=this,e=(this.filters=[],"string"==typeof e?new w(e,t.options.operators).readFilteredValue():e);this.initial=e.initial,this.filters=e.filters.map(function(e){return new $r(e,r.getFilter(t,e.name),t)})}s(Xr,Qr=Br),Xr.prototype.render=function(t,r){var n;return G(this,function(e){switch(e.label){case 0:return[4,this.value.value(t,!1)];case 1:return n=e.sent(),r.write(n),[2]}})},Xr.prototype.arguments=function(){return G(this,function(e){switch(e.label){case 0:return[4,this.value];case 1:return e.sent(),[2]}})};var Qr,Gr=Xr;function Xr(e,t){var r,n=this,n=Qr.call(this,e)||this,e=new w(e.input,t.options.operators,e.file,e.contentRange),e=(n.value=new F(e.readFilteredValue(),t),n.value.filters),i=t.options.outputEscape;return null!=(r=e[e.length-1])&&r.raw||!i||(r=new Yt(toString.call(i),[],"",0,0),e.push(new $r(r,i,t))),n}s(rn,en=Br),rn.prototype.render=function(e,t){return G(this,function(e){return t.write(this.str),[2]})};var en,tn=rn;function rn(e){var t=en.call(this,e)||this;return t.str=e.getContent(),t}sn.prototype.toString=function(){return gn(this.segments,!0)},sn.prototype.toArray=function(){function o(){for(var t,r,n,i,s,a=[],e=0;e<arguments.length;e++)a[e]=arguments[e];return G(this,function(e){switch(e.label){case 0:e.trys.push([0,7,8,9]),t=X(a),r=t.next(),e.label=1;case 1:return r.done?[3,6]:(n=r.value)instanceof sn?[4,Array.from(o.apply(void 0,d([],ee(n.segments),!1)))]:[3,3];case 2:return e.sent(),[3,5];case 3:return[4,n];case 4:e.sent(),e.label=5;case 5:return r=t.next(),[3,1];case 6:return[3,9];case 7:return i=e.sent(),i={error:i},[3,9];case 8:try{r&&!r.done&&(s=t.return)&&s.call(t)}finally{if(i)throw i.error}return[7];case 9:return[2]}})}return Array.from(o.apply(void 0,d([],ee(this.segments),!1)))};var nn=sn;function sn(e,t){this.segments=e,this.location=t}on.prototype.get=function(e){e=gn([e.segments[0]]);return this.map.has(e)||this.map.set(e,[]),this.map.get(e)},on.prototype.has=function(e){return this.map.has(gn([e.segments[0]]))},on.prototype.push=function(e){this.get(e).push(e)},on.prototype.asObject=function(){return Object.fromEntries(this.map)};var an=on;function on(){this.map=new Map}var un={partials:!0};function cn(t,U,K){function W(t,r){var n,i,s,a,o,u,c,l,h,p,f,d,y,v,g,m,b,w,k,T,x,S,L,F,O,_,z,R,N,j,V,q,P,E,C,A,I,M,B,D,H;return G(this,function(e){switch(e.label){case 0:if(t.arguments)try{for(n=X(t.arguments()),i=n.next();!i.done;i=n.next()){s=i.value;try{for(j=void 0,a=X(fn(s)),o=a.next();!o.done;o=a.next())!function e(t,r){Y.push(t);var n,i,s,a=r.alias(t);void 0!==a?te(s=a.segments[0])&&!J.has(s)&&$.push(a):te(s=t.segments[0])&&!r.has(s)&&$.push(t);try{for(var o=X(t.segments),u=o.next();!u.done;u=o.next()){var c=u.value;c instanceof nn&&e(c,r)}}catch(e){n={error:e}}finally{try{u&&!u.done&&(i=o.return)&&i.call(o)}finally{if(n)throw n.error}}}(o.value,r)}catch(e){j={error:e}}finally{try{o&&!o.done&&(V=a.return)&&V.call(a)}finally{if(j)throw j.error}}}}catch(e){R={error:e}}finally{try{i&&!i.done&&(N=n.return)&&N.call(n)}finally{if(R)throw R.error}}if(t.localScope)try{for(u=X(t.localScope()),c=u.next();!c.done;c=u.next())l=c.value,r.add(l.content),r.deleteAlias(l.content),h=ee(l.getPosition(),2),p=h[0],f=h[1],Z.push(new nn([l.content],{row:p,col:f,file:l.file}))}catch(e){q={error:e}}finally{try{c&&!c.done&&(P=u.return)&&P.call(u)}finally{if(q)throw q.error}}if(!t.children)return[3,30];if(!t.partialScope)return[3,20];if(void 0!==(d=t.partialScope()))return[3,10];e.label=1;case 1:return e.trys.push([1,7,8,9]),[4,t.children(U,K)];case 2:y=X.apply(void 0,[e.sent()]),v=y.next(),e.label=3;case 3:return v.done?[3,6]:[4,W(v.value,r)];case 4:e.sent(),e.label=5;case 5:return v=y.next(),[3,3];case 6:return[3,9];case 7:return E=e.sent(),E={error:E},[3,9];case 8:try{v&&!v.done&&(C=y.return)&&C.call(y)}finally{if(E)throw E.error}return[7];case 9:return[2];case 10:if(Q.has(d.name))return[2];g=new Set,m=d.isolated?new hn(g):r.push(g);try{for(b=X(d.scope),w=b.next();!w.done;w=b.next())te(k=w.value)?g.add(k):(T=ee(k,2),x=T[0],S=T[1],g.add(x),(L=Array.from(fn(S))).length&&m.setAlias(x,L[0].segments))}catch(e){A={error:e}}finally{try{w&&!w.done&&(I=b.return)&&I.call(b)}finally{if(A)throw A.error}}e.label=11;case 11:return e.trys.push([11,17,18,19]),[4,t.children(U,K)];case 12:F=X.apply(void 0,[e.sent()]),O=F.next(),e.label=13;case 13:return O.done?[3,16]:[4,W(O.value,m)];case 14:e.sent(),Q.add(d.name),e.label=15;case 15:return O=F.next(),[3,13];case 16:return[3,19];case 17:return M=e.sent(),M={error:M},[3,19];case 18:try{O&&!O.done&&(B=F.return)&&B.call(F)}finally{if(M)throw M.error}return[7];case 19:return m.pop(),[3,30];case 20:t.blockScope&&r.push(new Set(t.blockScope())),e.label=21;case 21:return e.trys.push([21,27,28,29]),[4,t.children(U,K)];case 22:_=X.apply(void 0,[e.sent()]),z=_.next(),e.label=23;case 23:return z.done?[3,26]:[4,W(z.value,r)];case 24:e.sent(),e.label=25;case 25:return z=_.next(),[3,23];case 26:return[3,29];case 27:return D=e.sent(),D={error:D},[3,29];case 28:try{z&&!z.done&&(H=_.return)&&H.call(_)}finally{if(D)throw D.error}return[7];case 29:t.blockScope&&r.pop(),e.label=30;case 30:return[2]}})}var Y,$,Z,J,Q,r,n,i,s;return G(this,function(e){switch(e.label){case 0:Y=new an,$=new an,Z=new an,J=new hn(new Set),Q=new Set,e.label=1;case 1:e.trys.push([1,6,7,8]),r=X(t),n=r.next(),e.label=2;case 2:return n.done?[3,5]:[4,W(n.value,J)];case 3:e.sent(),e.label=4;case 4:return n=r.next(),[3,2];case 5:return[3,8];case 6:return i=e.sent(),i={error:i},[3,8];case 7:try{n&&!n.done&&(s=r.return)&&s.call(r)}finally{if(i)throw i.error}return[7];case 8:return[2,{variables:Y.asObject(),globals:$.asObject(),locals:Z.asObject()}]}})}function O(e,t){return void 0===t&&(t={}),f(cn(e,T(T({},un),t).partials,!1))}function ln(e,t){return void 0===t&&(t={}),m(cn(e,T(T({},un),t).partials,!0))}pn.prototype.has=function(e){var t,r;try{for(var n=X(this.stack),i=n.next();!i.done;i=n.next())if(i.value.names.has(e))return!0}catch(e){t={error:e}}finally{try{i&&!i.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}return!1},pn.prototype.push=function(e){return this.stack.push({names:e,aliases:new Map}),this},pn.prototype.pop=function(){var e;return null==(e=this.stack.pop())?void 0:e.names},pn.prototype.add=function(e){this.stack[0].names.add(e)},pn.prototype.alias=function(e){var t=e.segments[0];if(te(t)){t=this.getAlias(t);if(void 0!==t)return new nn(d(d([],ee(t),!1),ee(e.segments.slice(1)),!1),e.location)}},pn.prototype.setAlias=function(e,t){this.stack[this.stack.length-1].aliases.set(e,t)},pn.prototype.deleteAlias=function(e){this.stack[this.stack.length-1].aliases.delete(e)},pn.prototype.getAlias=function(e){var t,r;try{for(var n=X(this.stack),i=n.next();!i.done;i=n.next()){var s=i.value;if(s.aliases.has(e))return s.aliases.get(e);if(s.names.has(e))return}}catch(e){t={error:e}}finally{try{i&&!i.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}};var hn=pn;function pn(e){this.stack=[{names:e,aliases:new Map}]}function fn(t){return G(this,function(e){switch(e.label){case 0:return _(t)?[5,X(dn(t))]:[3,2];case 1:return e.sent(),[3,4];case 2:return t instanceof F?[5,X(function(t){var r,n,i,s,a,o,u,c,l,h,p,f,d,y,v,g;return G(this,function(e){switch(e.label){case 0:e.trys.push([0,5,6,7]),r=X(t.initial.postfix),n=r.next(),e.label=1;case 1:return n.done?[3,4]:_(i=n.value)?[5,X(dn(i))]:[3,3];case 2:e.sent(),e.label=3;case 3:return n=r.next(),[3,1];case 4:return[3,7];case 5:return i=e.sent(),p={error:i},[3,7];case 6:try{n&&!n.done&&(f=r.return)&&f.call(r)}finally{if(p)throw p.error}return[7];case 7:e.trys.push([7,20,21,22]),s=X(t.filters),a=s.next(),e.label=8;case 8:if(a.done)return[3,19];o=a.value,e.label=9;case 9:e.trys.push([9,16,17,18]),v=void 0,u=X(o.args),c=u.next(),e.label=10;case 10:return c.done?[3,15]:Yr(l=c.value)&&l[1]?[5,X(dn(l[1]))]:[3,12];case 11:return e.sent(),[3,14];case 12:return _(l)?[5,X(dn(l))]:[3,14];case 13:e.sent(),e.label=14;case 14:return c=u.next(),[3,10];case 15:return[3,18];case 16:return h=e.sent(),v={error:h},[3,18];case 17:try{c&&!c.done&&(g=u.return)&&g.call(u)}finally{if(v)throw v.error}return[7];case 18:return a=s.next(),[3,8];case 19:return[3,22];case 20:return h=e.sent(),d={error:h},[3,22];case 21:try{a&&!a.done&&(y=s.return)&&y.call(s)}finally{if(d)throw d.error}return[7];case 22:return[2]}})}(t))]:[3,4];case 3:e.sent(),e.label=4;case 4:return[2]}})}function dn(t){return G(this,function(e){switch(e.label){case 0:return jn(t)?[5,X(dn(t.lhs))]:[3,3];case 1:return e.sent(),[5,X(dn(t.rhs))];case 2:return e.sent(),[3,5];case 3:return zn(t)?[4,function e(t){var r=[];var n=t.file;var i=t.props[0];n=n||i.file;On(i)||_n(i)||Rn(i)?r.push(i.content):zn(i)&&r.push.apply(r,d([],ee(e(i).segments),!1));try{for(var s=X(t.props.slice(1)),a=s.next();!a.done;a=s.next()){var o=a.value;n=n||o.file,On(o)||_n(o)||Rn(o)?r.push(o.content):zn(o)&&r.push(e(o))}}catch(e){c={error:e}}finally{try{a&&!a.done&&(u=s.return)&&u.call(s)}finally{if(c)throw c.error}}var i=ee(t.getPosition(),2),u=i[0],c=i[1];return new nn(r,{row:u,col:c,file:n})}(t)]:[3,5];case 4:e.sent(),e.label=5;case 5:return[2]}})}var yn,vn=/^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/;function gn(e,t){void 0===t&&(t=!1);var r,n,i=[],s=e[0];te(s)&&(!t||s.match(vn)?i.push("".concat(s)):i.push("['".concat(s,"']")));try{for(var a=X(e.slice(1)),o=a.next();!o.done;o=a.next()){var u=o.value;u instanceof nn?i.push("[".concat(gn(u.segments),"]")):te(u)?u.match(vn)?i.push(".".concat(u)):i.push("['".concat(u,"']")):i.push("[".concat(u,"]"))}}catch(e){r={error:e}}finally{try{o&&!o.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return i.join("")}(r=yn=yn||{}).Partials="partials",r.Layouts="layouts",r.Root="root";bn.prototype.lookup=function(t,r,n,i){var s,a,o,u,c,l,h,p;return G(this,function(e){switch(e.label){case 0:s=this.options.fs,a=this.options[r],e.label=1;case 1:e.trys.push([1,8,9,10]),o=X(this.candidates(t,a,i,r!==yn.Root)),u=o.next(),e.label=2;case 2:return u.done?[3,7]:(c=u.value,n?(l=s.existsSync(c),[3,5]):[3,3]);case 3:return[4,s.exists(c)];case 4:l=e.sent(),e.label=5;case 5:if(l)return[2,c];e.label=6;case 6:return u=o.next(),[3,2];case 7:return[3,10];case 8:return h=e.sent(),h={error:h},[3,10];case 9:try{u&&!u.done&&(p=o.return)&&p.call(o)}finally{if(h)throw h.error}return[7];case 10:throw this.lookupError(t,a)}})},bn.prototype.candidates=function(t,r,n,i){var s,a,o,u,c,l,h,p,f,d,y,v,g;return G(this,function(e){switch(e.label){case 0:if(a=this.options,s=a.fs,a=a.extname,!this.shouldLoadRelative(t)||!n)return[3,8];p=s.resolve(this.dirname(n),t,a),e.label=1;case 1:e.trys.push([1,6,7,8]),o=X(r),u=o.next(),e.label=2;case 2:return u.done?[3,5]:(h=u.value,i&&!this.contains(h,p)?[3,4]:[4,p]);case 3:return e.sent(),[3,5];case 4:return u=o.next(),[3,2];case 5:return[3,8];case 6:return d=e.sent(),d={error:d},[3,8];case 7:try{u&&!u.done&&(y=o.return)&&y.call(o)}finally{if(d)throw d.error}return[7];case 8:e.trys.push([8,13,14,15]),c=X(r),l=c.next(),e.label=9;case 9:return l.done?[3,12]:(h=l.value,p=s.resolve(h,t,a),i&&!this.contains(h,p)?[3,11]:[4,p]);case 10:e.sent(),e.label=11;case 11:return l=c.next(),[3,9];case 12:return[3,15];case 13:return v=e.sent(),v={error:v},[3,15];case 14:try{l&&!l.done&&(g=c.return)&&g.call(c)}finally{if(v)throw v.error}return[7];case 15:return void 0===s.fallback?[3,17]:void 0===(f=s.fallback(t))?[3,17]:[4,f];case 16:e.sent(),e.label=17;case 17:return[2]}})},bn.prototype.dirname=function(e){var t=this.options.fs;return x(t.dirname,"`fs.dirname` is required for relative reference"),t.dirname(e)},bn.prototype.lookupError=function(e,t){var r=new Error("ENOENT");return r.message='ENOENT: Failed to lookup "'.concat(e,'" in "').concat(t,'"'),r.code="ENOENT",r};var mn=bn;function bn(e){var t;(this.options=e).relativeReference?(x(e=e.fs.sep,"`fs.sep` is required for relative reference"),t=new RegExp(["."+e,".."+e,"./","../"].map(function(e){return e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}).join("|")),this.shouldLoadRelative=function(e){return t.test(e)}):this.shouldLoadRelative=function(e){return!1},this.contains=this.options.fs.contains||function(){return!0}}kn.prototype.parse=function(e,t){e=String(e),this.parseLimit.use(e.length);e=new w(e,this.liquid.options.operators,t).readTopLevelTokens(this.liquid.options);return this.parseTokens(e)},kn.prototype.parseTokens=function(e){for(var t,r=[],n=[];t=e.shift();)try{r.push(this.parseToken(t,e))}catch(e){if(!this.liquid.options.catchAllErrors)throw e;n.push(e)}if(n.length)throw new be(n);return r},kn.prototype.parseToken=function(t,e){try{var r;return Fn(t)?(x(r=this.liquid.tags[t.name],'tag "'.concat(t.name,'" not found')),new r(t,e,this.liquid,this)):Ln(t)?new Gr(t,this.liquid):new tn(t)}catch(e){if(oe.is(e))throw e;throw new fe(e,t)}},kn.prototype.parseStream=function(e){var r=this;return new Cr(e,function(e,t){return r.parseToken(e,t)})},kn.prototype._parseFileCached=function(t,r,n,i){var s,a,o,u,c,l;return void 0===n&&(n=yn.Root),G(this,function(e){switch(e.label){case 0:return s=this.cache,a=this.loader.shouldLoadRelative(t)?i+","+t:n+":"+t,[4,s.read(a)];case 1:return(l=e.sent())?[2,l]:(o=this._parseFile(t,r,n,i),r?[4,o]:[3,3]);case 2:return c=e.sent(),[3,4];case 3:c=f(o),e.label=4;case 4:u=c,s.write(a,u),e.label=5;case 5:return e.trys.push([5,7,,8]),[4,u];case 6:return[2,e.sent()];case 7:throw l=e.sent(),s.remove(a),l;case 8:return[2]}})},kn.prototype._parseFile=function(t,r,n,i){var s,a,o;return void 0===n&&(n=yn.Root),G(this,function(e){switch(e.label){case 0:return[4,this.loader.lookup(t,n,r,i)];case 1:return(s=e.sent(),a=this.parse,r)?(o=this.fs.readFileSync(s),[3,4]):[3,2];case 2:return[4,this.fs.readFile(s)];case 3:o=e.sent(),e.label=4;case 4:return[2,a.apply(this,[o,s])]}})};var wn=kn;function kn(e){this.liquid=e,this.cache=this.liquid.options.cache,this.fs=this.liquid.options.fs,this.parseFile=this.cache?this._parseFileCached:this._parseFile,this.loader=new mn(this.liquid.options),this.parseLimit=new vt("parse length",e.options.parseLimit)}function Tn(e){return!!(z(e)&l.TokenKind.Delimited)}function xn(e){return z(e)===l.TokenKind.Operator}function Sn(e){return z(e)===l.TokenKind.HTML}function Ln(e){return z(e)===l.TokenKind.Output}function Fn(e){return z(e)===l.TokenKind.Tag}function On(e){return z(e)===l.TokenKind.Quoted}function _n(e){return z(e)===l.TokenKind.Number}function zn(e){return z(e)===l.TokenKind.PropertyAccess}function Rn(e){return z(e)===l.TokenKind.Word}function jn(e){return z(e)===l.TokenKind.Range}function _(e){return 0<(1667&z(e))}function z(e){return e?e.kind:-1}(r=l.TokenKind||(l.TokenKind={}))[r.Number=1]="Number",r[r.Literal=2]="Literal",r[r.Tag=4]="Tag",r[r.Output=8]="Output",r[r.HTML=16]="HTML",r[r.Filter=32]="Filter",r[r.Hash=64]="Hash",r[r.PropertyAccess=128]="PropertyAccess",r[r.Word=256]="Word",r[r.Range=512]="Range",r[r.Quoted=1024]="Quoted",r[r.Operator=2048]="Operator",r[r.FilteredValue=4096]="FilteredValue",r[r.Delimited=12]="Delimited";var qn,r=Object.freeze({__proto__:null,isDelimitedToken:Tn,isOperatorToken:xn,isHTMLToken:Sn,isOutputToken:Ln,isTagToken:Fn,isQuotedToken:On,isLiteralToken:function(e){return z(e)===l.TokenKind.Literal},isNumberToken:_n,isPropertyAccessToken:zn,isWordToken:Rn,isRangeToken:jn,isValueToken:_}),En=(R.prototype.getRegister=function(e){return this.registers[e]=this.registers[e]||{}},R.prototype.setRegister=function(e,t){return this.registers[e]=t},R.prototype.saveRegister=function(){for(var t=this,e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return e.map(function(e){return[e,t.getRegister(e)]})},R.prototype.restoreRegister=function(e){var r=this;return e.forEach(function(e){var e=ee(e,2),t=e[0],e=e[1];return r.setRegister(t,e)})},R.prototype.getAll=function(){return d([this.globals,this.environments],ee(this.scopes),!1).reduce(function(e,t){return T(e,t)},{})},R.prototype.get=function(e){return this.getSync(e)},R.prototype.getSync=function(e){return m(this._get(e))},R.prototype._get=function(t){var r;return G(this,function(e){switch(e.label){case 0:return r=this.findScope(t[0]),[4,this._getFromScope(r,t)];case 1:return[2,e.sent()]}})},R.prototype.getFromScope=function(e,t){return m(this._getFromScope(e,t))},R.prototype._getFromScope=function(t,r,n){var i;return void 0===n&&(n=this.strictVariables),G(this,function(e){switch(e.label){case 0:te(r)&&(r=r.split(".")),i=0,e.label=1;case 1:return i<r.length?[4,this.readProperty(t,r[i])]:[3,4];case 2:if(t=e.sent(),n&&void 0===t)throw new Le(r.slice(0,i+1).join("."));e.label=3;case 3:return i++,[3,1];case 4:return[2,t]}})},R.prototype.push=function(e){return this.scopes.push(e)},R.prototype.pop=function(){return this.scopes.pop()},R.prototype.bottom=function(){return this.scopes[0]},R.prototype.spawn=function(e){return new R(e=void 0===e?{}:e,this.opts,{sync:this.sync,globals:this.globals,strictVariables:this.strictVariables},{renderLimit:this.renderLimit,memoryLimit:this.memoryLimit})},R.prototype.findScope=function(e){for(var t=this.scopes.length-1;0<=t;t--){var r=this.scopes[t];if(e in r)return r}return e in this.environments?this.environments:this.globals},R.prototype.readProperty=function(e,t){var r,n;return e=function e(t){return t&&u(t.toLiquid)?e(t.toLiquid()):t}(e),t=g(t),i(e)?e:a(e)&&t<0?e[e.length+ +t]:void 0===(r=function(e,t,r){if(!r||V.call(e,t)||e instanceof A)return e[t]}(e,t,this.ownPropertyOnly))&&e instanceof A?e.liquidMethodMissing(t,this):u(r)?r.call(e):"size"===t?(n=e,V.call(n,"size")||void 0!==n.size?n.size:a(n)||te(n)?n.length:"object"==typeof n?Object.keys(n).length:void 0):"first"===t?a(n=e)?n[0]:n.first:"last"===t?a(t=e)?t[t.length-1]:t.last:r},R);function R(e,t,r,n){void 0===e&&(e={}),void 0===t&&(t=Dr),void 0===r&&(r={});var i,n=void 0===n?{}:n,s=n.memoryLimit,n=n.renderLimit;this.scopes=[{}],this.registers={},this.breakCalled=!1,this.continueCalled=!1,this.sync=!!r.sync,this.opts=t,this.globals=null!=(i=r.globals)?i:t.globals,this.environments=W(e)?e:Object(e),this.strictVariables=null!=(i=r.strictVariables)?i:this.opts.strictVariables,this.ownPropertyOnly=null!=(e=r.ownPropertyOnly)?e:t.ownPropertyOnly,this.memoryLimit=null!=s?s:new vt("memory alloc",null!=(i=r.memoryLimit)?i:t.memoryLimit),this.renderLimit=null!=n?n:new vt("template render",yr().now()+(null!=(e=r.renderLimit)?e:t.renderLimit))}(An=qn=qn||{})[An.OUTPUT=0]="OUTPUT",An[An.STORE=1]="STORE";var An=t(Math.abs),Mn=t(Math.max),Dn=t(Math.min),Nn=t(Math.ceil),Vn=t(function(e,t,r){return(r=void 0===r?!1:r)?Math.floor(e/t):e/t}),Pn=t(Math.floor),Cn=t(function(e,t){return e-t}),In=t(function(e,t){return e+t}),Bn=t(function(e,t){return e%t}),Hn=t(function(e,t){return e*t});var An=Object.freeze({__proto__:null,abs:An,at_least:Mn,at_most:Dn,ceil:Nn,divided_by:Vn,floor:Pn,minus:Cn,plus:In,modulo:Bn,times:Hn,round:function(e,t){return void 0===t&&(t=0),e=I(e),t=I(t),t=Math.pow(10,t),Math.round(e*t)/t}}),Mn=/[^\p{M}\p{L}\p{Nd}]+/gu,Un={raw:/\s+/g,default:Mn,pretty:/[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/gu,ascii:/[^A-Za-z0-9]+/g,latin:Mn,none:null};Dn=Object.freeze({__proto__:null,url_decode:function(e){return decodeURIComponent(y(e)).replace(/\+/g," ")},url_encode:function(e){return encodeURIComponent(y(e)).replace(/%20/g,"+")},cgi_escape:function(e){return encodeURIComponent(y(e)).replace(/%20/g,"+").replace(/[!'()*]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})},uri_escape:function(e){return encodeURI(y(e)).replace(/%5B/g,"[").replace(/%5D/g,"]")},slugify:function(e,t,r){void 0===t&&(t="default"),void 0===r&&(r=!1),e=y(e);var n=Un[t];return n&&(e=(e="latin"===t?e.replace(/[àáâãäå]/g,"a").replace(/[æ]/g,"ae").replace(/[ç]/g,"c").replace(/[èéêë]/g,"e").replace(/[ìíîï]/g,"i").replace(/[ð]/g,"d").replace(/[ñ]/g,"n").replace(/[òóôõöø]/g,"o").replace(/[ùúûü]/g,"u").replace(/[ýÿ]/g,"y").replace(/[ß]/g,"ss").replace(/[œ]/g,"oe").replace(/[þ]/g,"th").replace(/[ẞ]/g,"SS").replace(/[Œ]/g,"OE").replace(/[Þ]/g,"TH"):e).replace(n,"-").replace(/^-|-$/g,"")),r?e:e.toLowerCase()}}),Nn=re(function(e,t){var e=v(e),t=i(t)?" ":y(t),r=e.length*(1+t.length);return this.context.memoryLimit.use(r),e.join(t)}),Vn=re(function(e){return H(e)?K(e):""}),Pn=re(function(e){return H(e)?e[0]:""}),Cn=re(function(e){e=v(e);return this.context.memoryLimit.use(e.length),d([],ee(e),!1).reverse()});function Kn(e,t){void 0===t&&(t=[]);e=v(e),t=v(t);return this.context.memoryLimit.use(e.length+t.length),e.concat(t)}function Wn(r){var t=this;return this.context.opts.jekyllWhere?function(e){return!Ve.is(r)&&a(e)?(t=r,e.some(function(e){return xr(e,t)})):xr(e,r);var t}:void 0===r?function(e){return kr(e,t.context)}:function(e){return xr(e,r)}}function Yn(r,t,n,i){var s,a,o,u,c,l,h,p,f,d;return G(this,function(e){switch(e.label){case 0:s=[],t=v(t),this.context.memoryLimit.use(t.length),a=new w(y(n)).readScopeValue(),e.label=1;case 1:e.trys.push([1,6,7,8]),o=X(t),u=o.next(),e.label=2;case 2:return u.done?[3,5]:(h=u.value,l=(c=s).push,[4,S(a,this.context.spawn(h))]);case 3:l.apply(c,[e.sent()]),e.label=4;case 4:return u=o.next(),[3,2];case 5:return[3,8];case 6:return h=e.sent(),f={error:h},[3,8];case 7:try{u&&!u.done&&(d=o.return)&&d.call(o)}finally{if(f)throw f.error}return[7];case 8:return p=Wn.call(this,i),[2,t.filter(function(e,t){return p(s[t])===r})]}})}function $n(t,r,n,i){var s,a,o,u,c,l,h,p,f;return G(this,function(e){switch(e.label){case 0:s=[],a=new F(y(i),this.liquid),o=v(r),this.context.memoryLimit.use(o.length),e.label=1;case 1:e.trys.push([1,6,7,8]),u=X(o),c=u.next(),e.label=2;case 2:return c.done?[3,5]:(l=c.value,this.context.push(((f={})[n]=l,f)),[4,a.value(this.context)]);case 3:f=e.sent(),this.context.pop(),f===t&&s.push(l),e.label=4;case 4:return c=u.next(),[3,2];case 5:return[3,8];case 6:return h=e.sent(),h={error:h},[3,8];case 7:try{c&&!c.done&&(p=u.return)&&p.call(u)}finally{if(h)throw h.error}return[7];case 8:return[2,s]}})}function Zn(t,r,n){var i,s,a,o,u;return G(this,function(e){switch(e.label){case 0:i=new w(y(r)).readScopeValue(),s=v(t),a=Wn.call(this,n),o=0,e.label=1;case 1:return o<s.length?[4,S(i,this.context.spawn(s[o]))]:[3,4];case 2:if(u=e.sent(),a(u))return[2,[o,s[o]]];e.label=3;case 3:return o++,[3,1];case 4:return[2]}})}function Jn(t,r,n){var i,s,a,o;return G(this,function(e){switch(e.label){case 0:i=new F(y(n),this.liquid),s=v(t),a=0,e.label=1;case 1:return a<s.length?(this.context.push(((o={})[r]=s[a],o)),[4,i.value(this.context)]):[3,4];case 2:if(o=e.sent(),this.context.pop(),o)return[2,[a,s[a]]];e.label=3;case 3:return a++,[3,1];case 4:return[2]}})}In=Object.freeze({__proto__:null,join:Nn,last:Vn,first:Pn,reverse:Cn,sort:function(t,r){var n,i,s,a,o,u,c,l,h,p,f;return G(this,function(e){switch(e.label){case 0:n=[],i=v(t),this.context.memoryLimit.use(i.length),e.label=1;case 1:e.trys.push([1,8,9,10]),s=X(i),a=s.next(),e.label=2;case 2:return a.done?[3,7]:(o=a.value,c=(u=n).push,l=[o],r?[4,this.context._getFromScope(o,y(r).split("."),!1)]:[3,4]);case 3:return h=e.sent(),[3,5];case 4:h=o,e.label=5;case 5:c.apply(u,[l.concat([h])]),e.label=6;case 6:return a=s.next(),[3,2];case 7:return[3,10];case 8:return p=e.sent(),p={error:p},[3,10];case 9:try{a&&!a.done&&(f=s.return)&&f.call(s)}finally{if(p)throw p.error}return[7];case 10:return[2,n.sort(function(e,t){e=e[1],t=t[1];return e<t?-1:t<e?1:0}).map(function(e){return e[0]})]}})},sort_natural:function(e,t){var r=y(t),t=void 0===t?Q:function(e,t){return Q(e[r],t[r])},e=v(e);return this.context.memoryLimit.use(e.length),d([],ee(e),!1).sort(t)},size:function(e){return e&&e.length||0},map:function(t,r){var n,i,s,a,o,u,c,l,h;return G(this,function(e){switch(e.label){case 0:n=[],i=v(t),this.context.memoryLimit.use(i.length),e.label=1;case 1:e.trys.push([1,6,7,8]),s=X(i),a=s.next(),e.label=2;case 2:return a.done?[3,5]:(c=a.value,u=(o=n).push,[4,this.context._getFromScope(c,y(r),!1)]);case 3:u.apply(o,[e.sent()]),e.label=4;case 4:return a=s.next(),[3,2];case 5:return[3,8];case 6:return c=e.sent(),l={error:c},[3,8];case 7:try{a&&!a.done&&(h=s.return)&&h.call(s)}finally{if(l)throw l.error}return[7];case 8:return[2,n]}})},sum:function(t,r){var n,i,s,a,o,u,c,l,h,p;return G(this,function(e){switch(e.label){case 0:n=0,i=v(t),e.label=1;case 1:e.trys.push([1,8,9,10]),s=X(i),a=s.next(),e.label=2;case 2:return a.done?[3,7]:(o=a.value,u=Number,r?[4,this.context._getFromScope(o,y(r),!1)]:[3,4]);case 3:return c=e.sent(),[3,5];case 4:c=o,e.label=5;case 5:l=u.apply(void 0,[c]),n+=Number.isNaN(l)?0:l,e.label=6;case 6:return a=s.next(),[3,2];case 7:return[3,10];case 8:return l=e.sent(),h={error:l},[3,10];case 9:try{a&&!a.done&&(p=s.return)&&p.call(s)}finally{if(h)throw h.error}return[7];case 10:return[2,n]}})},compact:function(e){return e=v(e),this.context.memoryLimit.use(e.length),e.filter(function(e){return!i(g(e))})},concat:Kn,push:function(e,t){return Kn.call(this,e,[t])},unshift:function(e,t){return e=v(e),this.context.memoryLimit.use(e.length),(e=d([],ee(e),!1)).unshift(t),e},pop:function(e){return(e=d([],ee(v(e)),!1)).pop(),e},shift:function(e){return e=v(e),this.context.memoryLimit.use(e.length),(e=d([],ee(e),!1)).shift(),e},slice:function(e,t,r){return void 0===r&&(r=1),i(e=g(e))?[]:(a(e)||(e=y(e)),t=t<0?e.length+t:t,this.context.memoryLimit.use(r),e.slice(t,t+r))},where:function(t,r,n){return G(this,function(e){switch(e.label){case 0:return[5,X(Yn.call(this,!0,t,r,n))];case 1:return[2,e.sent()]}})},reject:function(t,r,n){return G(this,function(e){switch(e.label){case 0:return[5,X(Yn.call(this,!1,t,r,n))];case 1:return[2,e.sent()]}})},where_exp:function(t,r,n){return G(this,function(e){switch(e.label){case 0:return[5,X($n.call(this,!0,t,r,n))];case 1:return[2,e.sent()]}})},reject_exp:function(t,r,n){return G(this,function(e){switch(e.label){case 0:return[5,X($n.call(this,!1,t,r,n))];case 1:return[2,e.sent()]}})},group_by:function(t,r){var n,i,s,a,o,u,c,l;return G(this,function(e){switch(e.label){case 0:n=new Map,t=C(t),i=new w(y(r)).readScopeValue(),this.context.memoryLimit.use(t.length),e.label=1;case 1:e.trys.push([1,6,7,8]),s=X(t),a=s.next(),e.label=2;case 2:return a.done?[3,5]:(o=a.value,[4,S(i,this.context.spawn(o))]);case 3:u=e.sent(),n.has(u)||n.set(u,[]),n.get(u).push(o),e.label=4;case 4:return a=s.next(),[3,2];case 5:return[3,8];case 6:return u=e.sent(),c={error:u},[3,8];case 7:try{a&&!a.done&&(l=s.return)&&l.call(s)}finally{if(c)throw c.error}return[7];case 8:return[2,d([],ee(n.entries()),!1).map(function(e){e=ee(e,2);return{name:e[0],items:e[1]}})]}})},group_by_exp:function(t,r,n){var i,s,a,o,u,c,l,h;return G(this,function(e){switch(e.label){case 0:i=new Map,s=new F(y(n),this.liquid),t=C(t),this.context.memoryLimit.use(t.length),e.label=1;case 1:e.trys.push([1,6,7,8]),a=X(t),o=a.next(),e.label=2;case 2:return o.done?[3,5]:(u=o.value,this.context.push(((h={})[r]=u,h)),[4,s.value(this.context)]);case 3:h=e.sent(),this.context.pop(),i.has(h)||i.set(h,[]),i.get(h).push(u),e.label=4;case 4:return o=a.next(),[3,2];case 5:return[3,8];case 6:return c=e.sent(),c={error:c},[3,8];case 7:try{o&&!o.done&&(l=a.return)&&l.call(a)}finally{if(c)throw c.error}return[7];case 8:return[2,d([],ee(i.entries()),!1).map(function(e){e=ee(e,2);return{name:e[0],items:e[1]}})]}})},has:function(t,r,n){return G(this,function(e){switch(e.label){case 0:return[5,X(Zn.call(this,t,r,n))];case 1:return[2,!!e.sent()]}})},has_exp:function(t,r,n){return G(this,function(e){switch(e.label){case 0:return[5,X(Jn.call(this,t,r,n))];case 1:return[2,!!e.sent()]}})},find_index:function(t,r,n){var i;return G(this,function(e){switch(e.label){case 0:return[5,X(Zn.call(this,t,r,n))];case 1:return[2,(i=e.sent())?i[0]:void 0]}})},find_index_exp:function(t,r,n){var i;return G(this,function(e){switch(e.label){case 0:return[5,X(Jn.call(this,t,r,n))];case 1:return[2,(i=e.sent())?i[0]:void 0]}})},find:function(t,r,n){var i;return G(this,function(e){switch(e.label){case 0:return[5,X(Zn.call(this,t,r,n))];case 1:return[2,(i=e.sent())?i[1]:void 0]}})},find_exp:function(t,r,n){var i;return G(this,function(e){switch(e.label){case 0:return[5,X(Jn.call(this,t,r,n))];case 1:return[2,(i=e.sent())?i[1]:void 0]}})},uniq:function(e){return e=v(e),this.context.memoryLimit.use(e.length),d([],ee(new Set(e)),!1)},sample:function(e,t){return void 0===t&&(t=1),i(e=g(e))?[]:(a(e)||(e=y(e)),this.context.memoryLimit.use(t),e=d([],ee(e),!1).sort(function(){return Math.random()-.5}),1===t?e[0]:e.slice(0,t))}});function Qn(e,t,r){var n=(null!=(n=null==e?void 0:e.length)?n:0)+(null!=(n=null==t?void 0:t.length)?n:0)+(null!=(n=null==r?void 0:r.length)?n:0),n=(this.context.memoryLimit.use(n),Xn(e,this.context.opts,r));return n?ut(n,t=i(t=g(t))?this.context.opts.dateFormat:y(t)):e}function Gn(e,t,r,n){var i=Xn(e,this.context.opts);return i?"ordinal"===r?(r=i.getDate(),ut(i,"US"===n?"".concat(t," ").concat(r,"%q, %Y"):"".concat(r,"%q ").concat(t," %Y"))):ut(i,"%d ".concat(t," %Y")):e}function Xn(e,t,r){var n=null!=r?r:t.timezoneOffset,i=t.locale;return(t="now"===(e=g(e))||"today"===e?new yt(Date.now(),i,n):B(e)?new yt(1e3*e,i,n):te(e)?/^\d+$/.test(e)?new yt(1e3*+e,i,n):t.preserveTimezones&&void 0===r?yt.createDateFixedToTimezone(e,i):new yt(e,i,n):new yt(e,i,n)).valid()?t:void 0}var Bn=Object.freeze({__proto__:null,date:Qn,date_to_xmlschema:function(e){return Qn.call(this,e,"%Y-%m-%dT%H:%M:%S%:z")},date_to_rfc822:function(e){return Qn.call(this,e,"%a, %d %b %Y %H:%M:%S %z")},date_to_string:function(e,t,r){return Gn.call(this,e,"%b",t,r)},date_to_long_string:function(e,t,r){return Gn.call(this,e,"%B",t,r)}}),ei=/[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu,ti=/[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu;var ri,Hn=Object.freeze({__proto__:null,append:function(e,t){return x(2===arguments.length,"append expect 2 arguments"),e=y(e),t=y(t),this.context.memoryLimit.use(e.length+t.length),e+t},prepend:function(e,t){return x(2===arguments.length,"prepend expect 2 arguments"),e=y(e),t=y(t),this.context.memoryLimit.use(e.length+t.length),t+e},lstrip:function(e,t){return e=y(e),this.context.memoryLimit.use(e.length),t?(t=ne(y(t)),e.replace(new RegExp("^[".concat(t,"]+"),"g"),"")):e.replace(/^\s+/,"")},downcase:function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.toLowerCase()},upcase:function(e){return e=y(e),this.context.memoryLimit.use(e.length),y(e).toUpperCase()},remove:function(e,t){return e=y(e),this.context.memoryLimit.use(e.length),e.split(y(t)).join("")},remove_first:function(e,t){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(y(t),"")},remove_last:function(e,t){var e=y(e),t=(this.context.memoryLimit.use(e.length),y(t)),r=e.lastIndexOf(t);return-1===r?e:e.substring(0,r)+e.substring(r+t.length)},rstrip:function(e,t){return e=y(e),this.context.memoryLimit.use(e.length),t?(t=ne(y(t)),e.replace(new RegExp("[".concat(t,"]+$"),"g"),"")):e.replace(/\s+$/,"")},split:function(e,t){for(var e=y(e),r=(this.context.memoryLimit.use(e.length),e.split(y(t)));r.length&&""===r[r.length-1];)r.pop();return r},strip:function(e,t){return e=y(e),this.context.memoryLimit.use(e.length),t?(t=ne(y(t)),e.replace(new RegExp("^[".concat(t,"]+"),"g"),"").replace(new RegExp("[".concat(t,"]+$"),"g"),"")):e.trim()},strip_newlines:function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/\r?\n/gm,"")},capitalize:function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()},replace:function(e,t,r){return e=y(e),this.context.memoryLimit.use(e.length),e.split(y(t)).join(r)},replace_first:function(e,t,r){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(y(t),r)},replace_last:function(e,t,r){var e=y(e),t=(this.context.memoryLimit.use(e.length),y(t)),n=e.lastIndexOf(t);return-1===n?e:(r=y(r),e.substring(0,n)+r+e.substring(n+t.length))},truncate:function(e,t,r){void 0===t&&(t=50),void 0===r&&(r="...");var n=y(e);return this.context.memoryLimit.use(n.length),n.length<=t?e:n.substring(0,t-r.length)+r},truncatewords:function(e,t,r){void 0===t&&(t=15),void 0===r&&(r="...");e=y(e);this.context.memoryLimit.use(e.length);var n=(e=e.split(/\s+/)).slice(0,t=t<=0?1:t).join(" ");return e.length>=t&&(n+=r),n},normalize_whitespace:function(e){return e=y(e),this.context.memoryLimit.use(e.length),e.replace(/\s+/g," ")},number_of_words:function(e,t){var r=y(e);if(this.context.memoryLimit.use(r.length),!(e=r.trim()))return 0;switch(t){case"cjk":return(e.match(ei)||[]).length+(e.match(ti)||[]).length;case"auto":return ei.test(e)?e.match(ei).length+(e.match(ti)||[]).length:e.split(/\s+/).length;default:return e.split(/\s+/).length}},array_to_sentence_string:function(e,t){switch(void 0===t&&(t="and"),this.context.memoryLimit.use(e.length),e.length){case 0:return"";case 1:return e[0];case 2:return"".concat(e[0]," ").concat(t," ").concat(e[1]);default:return"".concat(e.slice(0,-1).join(", "),", ").concat(t," ").concat(e[e.length-1])}}}),ni=T(T(T(T(T(T(T({},Er),An),Dn),In),Bn),Hn),zr),Mn=(s(ii,ri=L),ii.prototype.render=function(t){var r,n;return G(this,function(e){switch(e.label){case 0:return r=t.bottom(),n=this.key,[4,this.value.value(t,this.liquid.options.lenientIf)];case 1:return r[n]=e.sent(),[2]}})},ii.prototype.arguments=function(){return G(this,function(e){switch(e.label){case 0:return[4,this.value];case 1:return e.sent(),[2]}})},ii.prototype.localScope=function(){return G(this,function(e){switch(e.label){case 0:return[4,this.identifier];case 1:return e.sent(),[2]}})},ii);function ii(e,t,r){e=ri.call(this,e,t,r)||this;return e.identifier=e.tokenizer.readIdentifier(),e.key=e.identifier.content,e.tokenizer.assert(e.key,"expected variable name"),e.tokenizer.skipBlank(),e.tokenizer.assert("="===e.tokenizer.peek(),'expected "="'),e.tokenizer.advance(),e.value=new F(e.tokenizer.readFilteredValue(),e.liquid),e}var si,ai=["offset","limit","reversed"],Nn=(s(oi,si=L),oi.prototype.render=function(t,r){var n,i,s,a,o,u,c,l,h,p,f;return G(this,function(e){switch(e.label){case 0:return n=this.liquid.renderer,s=C,[4,S(this.collection,t)];case 1:return(i=s.apply(void 0,[e.sent()])).length?[3,3]:[4,n.renderTemplates(this.elseTemplates,t,r)];case 2:return e.sent(),[2];case 3:return a="continue-"+this.variable+"-"+this.collection.getText(),t.push({continue:t.getRegister(a)}),[4,this.hash.render(t)];case 4:o=e.sent(),t.pop(),u=this.liquid.options.orderedFilterParameters?Object.keys(o).filter(function(e){return ai.includes(e)}):ai.filter(function(e){return void 0!==o[e]}),i=u.reduce(function(e,t){var r;return"offset"===t?(r=o.offset,e.slice(r)):"limit"===t?(r=o.limit,e.slice(0,r)):d([],ee(e),!1).reverse()},i),t.setRegister(a,(o.offset||0)+i.length),u={forloop:new He(i.length,this.collection.getText(),this.variable)},t.push(u),e.label=5;case 5:e.trys.push([5,10,11,12]),c=X(i),l=c.next(),e.label=6;case 6:return l.done?[3,9]:(h=l.value,u[this.variable]=h,t.continueCalled=t.breakCalled=!1,[4,n.renderTemplates(this.templates,t,r)]);case 7:if(e.sent(),t.breakCalled)return[3,9];u.forloop.next(),e.label=8;case 8:return l=c.next(),[3,6];case 9:return[3,12];case 10:return h=e.sent(),p={error:h},[3,12];case 11:try{l&&!l.done&&(f=c.return)&&f.call(c)}finally{if(p)throw p.error}return[7];case 12:return t.continueCalled=t.breakCalled=!1,t.pop(),[2]}})},oi.prototype.children=function(){var t;return G(this,function(e){return t=this.templates.slice(),this.elseTemplates&&t.push.apply(t,d([],ee(this.elseTemplates),!1)),[2,t]})},oi.prototype.arguments=function(){var t,r,n,i,s;return G(this,function(e){switch(e.label){case 0:return[4,this.collection];case 1:e.sent(),e.label=2;case 2:e.trys.push([2,7,8,9]),t=X(Object.values(this.hash.hash)),r=t.next(),e.label=3;case 3:return r.done?[3,6]:_(n=r.value)?[4,n]:[3,5];case 4:e.sent(),e.label=5;case 5:return r=t.next(),[3,3];case 6:return[3,9];case 7:return n=e.sent(),i={error:n},[3,9];case 8:try{r&&!r.done&&(s=t.return)&&s.call(t)}finally{if(i)throw i.error}return[7];case 9:return[2]}})},oi.prototype.blockScope=function(){return[this.variable,"forloop"]},oi);function oi(e,t,r,n){var i,s=si.call(this,e,t,r)||this,a=s.tokenizer.readIdentifier(),o=s.tokenizer.readIdentifier(),u=s.tokenizer.readValue();if(!a.size()||"in"!==o.content||!u)throw new Error("illegal tag: ".concat(e.getText()));s.variable=a.content,s.collection=u,s.hash=new Kr(s.tokenizer,r.options.keyValueSeparator),s.templates=[],s.elseTemplates=[];var c=n.parseStream(t).on("start",function(){return i=s.templates}).on("tag:else",function(e){Ae(e.args),i=s.elseTemplates}).on("tag:endfor",function(e){Ae(e.args),c.stop()}).on("template",function(e){return i.push(e)}).on("end",function(){throw new Error("tag ".concat(e.getText()," not closed"))});return c.start(),s}s(ci,ui=L),ci.prototype.readVariable=function(){var e=this.tokenizer.readIdentifier();if(e.content)return e;if(e=this.tokenizer.readQuoted())return e;throw this.tokenizer.error("invalid capture name")},ci.prototype.render=function(t){var r;return G(this,function(e){switch(e.label){case 0:return[4,this.liquid.renderer.renderTemplates(this.templates,t)];case 1:return r=e.sent(),t.bottom()[this.variable]=r,[2]}})},ci.prototype.children=function(){return G(this,function(e){return[2,this.templates]})},ci.prototype.localScope=function(){return G(this,function(e){switch(e.label){case 0:return[4,this.identifier];case 1:return e.sent(),[2]}})};var ui,Vn=ci;function ci(e,t,r,n){var i=ui.call(this,e,t,r)||this;for(i.templates=[],i.identifier=i.readVariable(),i.variable=i.identifier.content;t.length;){var s=t.shift();if(Fn(s)&&"endcapture"===s.name)return i;i.templates.push(n.parseToken(s,t))}throw new Error("tag ".concat(e.getText()," not closed"))}s(hi,li=L),hi.prototype.render=function(t,r){var n,i,s,a,o,u,c,l,h,p,f,d,y,v;return G(this,function(e){switch(e.label){case 0:return n=this.liquid.renderer,s=g,[4,this.value.value(t,t.opts.lenientIf)];case 1:i=s.apply(void 0,[e.sent()]),a=!1,e.label=2;case 2:e.trys.push([2,14,15,16]),o=X(this.branches),u=o.next(),e.label=3;case 3:if(u.done)return[3,13];c=u.value,e.label=4;case 4:e.trys.push([4,10,11,12]),y=void 0,l=X(c.values),h=l.next(),e.label=5;case 5:return h.done?[3,9]:[4,S(h.value,t,t.opts.lenientIf)];case 6:return(p=e.sent(),xr(i,p))?[4,n.renderTemplates(c.templates,t,r)]:[3,8];case 7:return e.sent(),a=!0,[3,9];case 8:return h=l.next(),[3,5];case 9:return[3,12];case 10:return p=e.sent(),y={error:p},[3,12];case 11:try{h&&!h.done&&(v=l.return)&&v.call(l)}finally{if(y)throw y.error}return[7];case 12:return u=o.next(),[3,3];case 13:return[3,16];case 14:return f=e.sent(),f={error:f},[3,16];case 15:try{u&&!u.done&&(d=o.return)&&d.call(o)}finally{if(f)throw f.error}return[7];case 16:return a?[3,18]:[4,n.renderTemplates(this.elseTemplates,t,r)];case 17:e.sent(),e.label=18;case 18:return[2]}})},hi.prototype.arguments=function(){return G(this,function(e){switch(e.label){case 0:return[4,this.value];case 1:return e.sent(),[5,X(this.branches.flatMap(function(e){return e.values}))];case 2:return e.sent(),[2]}})},hi.prototype.children=function(){var t;return G(this,function(e){return t=this.branches.flatMap(function(e){return e.templates}),this.elseTemplates&&t.push.apply(t,d([],ee(this.elseTemplates),!1)),[2,t]})};var li,Pn=hi;function hi(e,t,r,n){var i=li.call(this,e,t,r)||this,s=(i.branches=[],i.elseTemplates=[],i.value=new F(i.tokenizer.readFilteredValue(),i.liquid),i.elseTemplates=[],[]),a=0,o=n.parseStream(t).on("tag:when",function(e){if(!(0<a)){s=[];for(var t=[];!e.tokenizer.end();)t.push(e.tokenizer.readValueOrThrow()),e.tokenizer.skipBlank(),","===e.tokenizer.peek()?e.tokenizer.readTo(","):e.tokenizer.readTo("or");i.branches.push({values:t,templates:s})}}).on("tag:else",function(){a++,s=i.elseTemplates}).on("tag:endcase",function(){return o.stop()}).on("template",function(e){s===i.elseTemplates&&1!==a||s.push(e)}).on("end",function(){throw new Error("tag ".concat(e.getText()," not closed"))});return o.start(),i}s(fi,pi=L),fi.prototype.render=function(){};var pi,Cn=fi;function fi(e,t,r){for(var n=pi.call(this,e,t,r)||this;t.length;){var i=t.shift();if(Fn(i)&&"endcomment"===i.name)return n}throw new Error("tag ".concat(e.getText()," not closed"))}s(yi,di=L),yi.prototype.render=function(t,r){var n,i,s,a,o,u,c,l,h,p,f,d,y,v,g,m,b,w,k;return G(this,function(e){switch(e.label){case 0:return n=(i=this).liquid,i=i.hash,[4,mi(this.file,t,n)];case 1:return x(s=e.sent(),function(){return'illegal file path "'.concat(s,'"')}),a=t.spawn(),o=a.bottom(),u=T,c=[o],[4,i.render(t)];case 2:return(u.apply(void 0,c.concat([e.sent()])),this.with)?(f=this.with,p=f.value,f=f.alias,l=o,h=f||s,[4,S(p,t)]):[3,4];case 3:l[h]=e.sent(),e.label=4;case 4:return this.for?(y=this.for,p=y.value,f=y.alias,y=C,[4,S(p,t)]):[3,15];case 5:d=y.apply(void 0,[e.sent()]),o.forloop=new He(d.length,p.getText(),f),e.label=6;case 6:e.trys.push([6,12,13,14]),v=X(d),g=v.next(),e.label=7;case 7:return g.done?[3,11]:(m=g.value,o[f]=m,[4,n._parsePartialFile(s,a.sync,this.currentFile)]);case 8:return b=e.sent(),[4,n.renderer.renderTemplates(b,a,r)];case 9:e.sent(),o.forloop.next(),e.label=10;case 10:return g=v.next(),[3,7];case 11:return[3,14];case 12:return m=e.sent(),w={error:m},[3,14];case 13:try{g&&!g.done&&(k=v.return)&&k.call(v)}finally{if(w)throw w.error}return[7];case 14:return[3,18];case 15:return[4,n._parsePartialFile(s,a.sync,this.currentFile)];case 16:return b=e.sent(),[4,n.renderer.renderTemplates(b,a,r)];case 17:e.sent(),e.label=18;case 18:return[2]}})},yi.prototype.children=function(t,r){return G(this,function(e){switch(e.label){case 0:return t&&te(this.file)?[4,this.liquid._parsePartialFile(this.file,r,this.currentFile)]:[3,2];case 1:return[2,e.sent()];case 2:return[2,[]]}})},yi.prototype.partialScope=function(){var e,t,r,n;if(te(this.file))return e=Object.keys(this.hash.hash),this.with&&(r=(n=this.with).value,te(n=n.alias)?e.push([n,r]):te(this.file)&&e.push([this.file,r])),this.for&&(r=(t=this.for).value,te(n=t.alias)?e.push([n,r]):te(this.file)&&e.push([this.file,r])),{name:this.file,isolated:!0,scope:e}},yi.prototype.arguments=function(){var t,r,n,i,s,a;return G(this,function(e){switch(e.label){case 0:e.trys.push([0,5,6,7]),t=X(Object.values(this.hash.hash)),r=t.next(),e.label=1;case 1:return r.done?[3,4]:_(n=r.value)?[4,n]:[3,3];case 2:e.sent(),e.label=3;case 3:return r=t.next(),[3,1];case 4:return[3,7];case 5:return n=e.sent(),s={error:n},[3,7];case 6:try{r&&!r.done&&(a=t.return)&&a.call(t)}finally{if(s)throw s.error}return[7];case 7:return this.with?_(i=this.with.value)?[4,i]:[3,9]:[3,9];case 8:e.sent(),e.label=9;case 9:return this.for?_(i=this.for.value)?[4,i]:[3,11]:[3,11];case 10:e.sent(),e.label=11;case 11:return[2]}})};var di,Er=yi;function yi(e,t,r,n){var i=di.call(this,e,t,r)||this,s=i.tokenizer;for(i.file=vi(s,i.liquid,n),i.currentFile=e.file;!s.end();){s.skipBlank();var a=s.p,o=s.readIdentifier();if(("with"===o.content||"for"===o.content)&&(s.skipBlank(),":"!==s.peek())){var u=s.readValue();if(u){var c=s.p,l=void 0;"as"===s.readIdentifier().content?l=s.readIdentifier():s.p=c,i[o.content]={value:u,alias:l&&l.content},s.skipBlank(),","===s.peek()&&s.advance();continue}}s.p=a;break}return i.hash=new Kr(s,r.options.keyValueSeparator),i}function vi(e,t,r){var n;return t.options.dynamicPartials?(n=e.readValue(),e.assert(n,"illegal file path"),"none"===n.getText()?void 0:On(n)?gi(r.parse(wr(n))):n):(n=d([],ee(e.readFileNameTemplate(t.options)),!1),"none"===(e=gi(r.parseTokens(n)))?void 0:e)}function gi(e){return 1===e.length&&Sn(e[0].token)?e[0].token.getContent():e}function mi(t,r,n){return G(this,function(e){switch(e.label){case 0:return"string"==typeof t?[2,t]:Array.isArray(t)?[2,n.renderer.renderTemplates(t,r)]:[4,S(t,r)];case 1:return[2,e.sent()]}})}s(wi,bi=L),wi.prototype.render=function(t,r){var n,i,s,a,o,u,c,l,h,p;return G(this,function(e){switch(e.label){case 0:return n=(s=this).liquid,i=s.hash,s=s.withVar,a=n.renderer,[4,mi(this.file,t,n)];case 1:return x(o=e.sent(),function(){return'illegal file path "'.concat(o,'"')}),u=t.saveRegister("blocks","blockMode"),t.setRegister("blocks",{}),t.setRegister("blockMode",qn.OUTPUT),[4,i.render(t)];case 2:return(c=e.sent(),s)?(l=c,h=o,[4,S(s,t)]):[3,4];case 3:l[h]=e.sent(),e.label=4;case 4:return[4,n._parsePartialFile(o,t.sync,this.currentFile)];case 5:return p=e.sent(),t.push(t.opts.jekyllInclude?{include:c}:c),[4,a.renderTemplates(p,t,r)];case 6:return e.sent(),t.pop(),t.restoreRegister(u),[2]}})},wi.prototype.children=function(t,r){return G(this,function(e){switch(e.label){case 0:return t&&te(this.file)?[4,this.liquid._parsePartialFile(this.file,r,this.currentFile)]:[3,2];case 1:return[2,e.sent()];case 2:return[2,[]]}})},wi.prototype.partialScope=function(){var e;if(te(this.file))return e=void 0,this.liquid.options.jekyllInclude?e=["include"]:(e=Object.keys(this.hash.hash),this.withVar&&e.push([this.file,this.withVar])),{name:this.file,isolated:!1,scope:e}},wi.prototype.arguments=function(){return G(this,function(e){switch(e.label){case 0:return[5,X(Object.values(this.hash.hash).filter(_))];case 1:return(e.sent(),_(this.file))?[4,this.file]:[3,3];case 2:e.sent(),e.label=3;case 3:return _(this.withVar)?[4,this.withVar]:[3,5];case 4:e.sent(),e.label=5;case 5:return[2]}})};var bi,An=wi;function wi(e,t,r,n){var t=bi.call(this,e,t,r)||this,i=e.tokenizer,n=(t.file=vi(i,t.liquid,n),t.currentFile=e.file,i.p);return"with"===i.readIdentifier().content&&(i.skipBlank(),":"!==i.peek())?t.withVar=i.readValue():i.p=n,t.hash=new Kr(i,r.options.jekyllInclude||r.options.keyValueSeparator),t}s(Ti,ki=L),Ti.prototype.render=function(e,t){e=e.environments;B(e[this.variable])||(e[this.variable]=0),t.write(y(--e[this.variable]))},Ti.prototype.localScope=function(){return G(this,function(e){switch(e.label){case 0:return[4,this.identifier];case 1:return e.sent(),[2]}})};var ki,Dn=Ti;function Ti(e,t,r){e=ki.call(this,e,t,r)||this;return e.identifier=e.tokenizer.readIdentifier(),e.variable=e.identifier.content,e}s(Si,xi=L),Si.prototype.render=function(t,e){var r,n,i,s;return G(this,function(e){switch(e.label){case 0:return[4,S(this.group,t)];case 1:return r=e.sent(),r="cycle:".concat(r,":")+this.candidates.join(","),n=t.getRegister("cycle"),void 0===(i=n[r])&&(i=n[r]=0),s=this.candidates[i],i=(i+1)%this.candidates.length,n[r]=i,[4,S(s,t)];case 2:return[2,e.sent()]}})},Si.prototype.arguments=function(){return G(this,function(e){switch(e.label){case 0:return[5,X(this.candidates)];case 1:return(e.sent(),this.group)?[4,this.group]:[3,3];case 2:e.sent(),e.label=3;case 3:return[2]}})};var xi,In=Si;function Si(e,t,r){var n=xi.call(this,e,t,r)||this,t=(n.candidates=[],n.tokenizer.readValue());for(n.tokenizer.skipBlank(),t&&(":"===n.tokenizer.peek()?(n.group=t,n.tokenizer.advance()):n.candidates.push(t));!n.tokenizer.end();){var i=n.tokenizer.readValue();i&&n.candidates.push(i),n.tokenizer.readTo(",")}return n.tokenizer.assert(n.candidates.length,function(){return'empty candidates: "'.concat(e.getText(),'"')}),n}s(Fi,Li=L),Fi.prototype.render=function(t,r){var n,i,s,a,o,u,c;return G(this,function(e){switch(e.label){case 0:n=this.liquid.renderer,e.label=1;case 1:e.trys.push([1,7,8,9]),i=X(this.branches),s=i.next(),e.label=2;case 2:return s.done?[3,6]:(a=s.value,o=a.value,a=a.templates,[4,o.value(t,t.opts.lenientIf)]);case 3:return kr(e.sent(),t)?[4,n.renderTemplates(a,t,r)]:[3,5];case 4:return e.sent(),[2];case 5:return s=i.next(),[3,2];case 6:return[3,9];case 7:return o=e.sent(),u={error:o},[3,9];case 8:try{s&&!s.done&&(c=i.return)&&c.call(i)}finally{if(u)throw u.error}return[7];case 9:return[4,n.renderTemplates(this.elseTemplates||[],t,r)];case 10:return e.sent(),[2]}})},Fi.prototype.children=function(){var t;return G(this,function(e){return t=this.branches.flatMap(function(e){return e.templates}),this.elseTemplates&&t.push.apply(t,d([],ee(this.elseTemplates),!1)),[2,t]})},Fi.prototype.arguments=function(){return this.branches.map(function(e){return e.value})};var Li,Bn=Fi;function Fi(e,t,r,n){var i=Li.call(this,e,t,r)||this,s=(i.branches=[],[]);return n.parseStream(t).on("start",function(){return i.branches.push({value:new F(e.tokenizer.readFilteredValue(),i.liquid),templates:s=[]})}).on("tag:elsif",function(e){x(!i.elseTemplates,"unexpected elsif after else"),i.branches.push({value:new F(e.tokenizer.readFilteredValue(),i.liquid),templates:s=[]})}).on("tag:else",function(e){Ae(e.args),x(!i.elseTemplates,"duplicated else"),s=i.elseTemplates=[]}).on("tag:endif",function(e){Ae(e.args),this.stop()}).on("template",function(e){return s.push(e)}).on("end",function(){throw new Error("tag ".concat(e.getText()," not closed"))}).start(),i}s(_i,Oi=L),_i.prototype.render=function(e,t){var e=e.environments,r=(B(e[this.variable])||(e[this.variable]=0),e[this.variable]);e[this.variable]++,t.write(y(r))},_i.prototype.localScope=function(){return G(this,function(e){switch(e.label){case 0:return[4,this.identifier];case 1:return e.sent(),[2]}})};var Oi,Hn=_i;function _i(e,t,r){e=Oi.call(this,e,t,r)||this;return e.identifier=e.tokenizer.readIdentifier(),e.variable=e.identifier.content,e}s(ji,zi=L),ji.prototype.render=function(t,r){var n,i,s,a,o,u,c,l,h;return G(this,function(e){switch(e.label){case 0:return(n=(c=this).liquid,i=c.args,c=c.file,s=n.renderer,void 0!==c)?[3,2]:(t.setRegister("blockMode",qn.OUTPUT),[4,s.renderTemplates(this.templates,t,r)]);case 1:return e.sent(),[2];case 2:return[4,mi(this.file,t,n)];case 3:return x(a=e.sent(),function(){return'illegal file path "'.concat(a,'"')}),[4,n._parseLayoutFile(a,t.sync,this.currentFile)];case 4:return o=e.sent(),t.setRegister("blockMode",qn.STORE),[4,s.renderTemplates(this.templates,t)];case 5:return u=e.sent(),void 0===(c=t.getRegister("blocks"))[""]&&(c[""]=function(e,t){return t.write(u)}),t.setRegister("blockMode",qn.OUTPUT),h=(l=t).push,[4,i.render(t)];case 6:return h.apply(l,[e.sent()]),[4,s.renderTemplates(o,t,r)];case 7:return e.sent(),t.pop(),[2]}})},ji.prototype.children=function(t){var r,n,i,s,a;return G(this,function(e){switch(e.label){case 0:return(r=this.templates.slice(),t&&te(this.file))?(i=(n=r.push).apply,s=[r],a=[[]],[4,this.liquid._parsePartialFile(this.file,!0,this.currentFile)]):[3,2];case 1:i.apply(n,s.concat([d.apply(void 0,a.concat([ee.apply(void 0,[e.sent()]),!1]))])),e.label=2;case 2:return[2,r]}})},ji.prototype.arguments=function(){var t,r,n,i,s;return G(this,function(e){switch(e.label){case 0:e.trys.push([0,5,6,7]),t=X(Object.values(this.args.hash)),r=t.next(),e.label=1;case 1:return r.done?[3,4]:_(n=r.value)?[4,n]:[3,3];case 2:e.sent(),e.label=3;case 3:return r=t.next(),[3,1];case 4:return[3,7];case 5:return n=e.sent(),i={error:n},[3,7];case 6:try{r&&!r.done&&(s=t.return)&&s.call(t)}finally{if(i)throw i.error}return[7];case 7:return _(this.file)?[4,this.file]:[3,9];case 8:e.sent(),e.label=9;case 9:return[2]}})},ji.prototype.partialScope=function(){if(te(this.file))return{name:this.file,isolated:!1,scope:Object.keys(this.args.hash)}};var zi,Ri=ji;function ji(e,t,r,n){var i=zi.call(this,e,t,r)||this;return i.file=vi(i.tokenizer,i.liquid,n),i.currentFile=e.file,i.args=new Kr(i.tokenizer,r.options.keyValueSeparator),i.templates=n.parseTokens(t),i}s(Ai,qi=L),Ai.prototype.render=function(t,r){var n;return G(this,function(e){switch(e.label){case 0:return(n=this.getBlockRender(t),t.getRegister("blockMode")!==qn.STORE)?[3,1]:(t.getRegister("blocks")[this.block]=n,[3,3]);case 1:return[4,n(new Je,r)];case 2:e.sent(),e.label=3;case 3:return[2]}})},Ai.prototype.getBlockRender=function(n){function r(t,r){return G(this,function(e){switch(e.label){case 0:return n.push({block:t}),[4,i.renderer.renderTemplates(s,n,r)];case 1:return e.sent(),n.pop(),[2]}})}var i=this.liquid,s=this.templates,a=n.getRegister("blocks")[this.block];return a?function(t,e){return a(new Je(function(e){return r(t,e)}),e)}:r},Ai.prototype.children=function(){return G(this,function(e){return[2,this.templates]})},Ai.prototype.blockScope=function(){return["block"]};var qi,Ei=Ai;function Ai(e,t,r,n){var i=qi.call(this,e,t,r)||this,r=(i.templates=[],/\w+/.exec(e.args));for(i.block=r?r[0]:"";t.length;){var s=t.shift();if(Fn(s)&&"endblock"===s.name)return i;s=n.parseToken(s,t);i.templates.push(s)}throw new Error("tag ".concat(e.getText()," not closed"))}s(Ni,Mi=L),Ni.prototype.render=function(){return this.tokens.map(function(e){return e.getText()}).join("")};var Mi,Di=Ni;function Ni(e,t,r){var n=Mi.call(this,e,t,r)||this;for(n.tokens=[];t.length;){var i=t.shift();if(Fn(i)&&"endraw"===i.name)return n;n.tokens.push(i)}throw new Error("tag ".concat(e.getText()," not closed"))}s(Ci,Vi=He),Ci.prototype.row=function(){return Math.floor(this.i/this.cols)+1},Ci.prototype.col0=function(){return this.i%this.cols},Ci.prototype.col=function(){return this.col0()+1},Ci.prototype.col_first=function(){return 0===this.col0()},Ci.prototype.col_last=function(){return this.col()===this.cols};var Vi,Pi=Ci;function Ci(e,t,r,n){r=Vi.call(this,e,r,n)||this;return r.length=e,r.cols=t,r}s(Hi,Ii=L),Hi.prototype.render=function(t,r){var n,i,s,a,o,u;return G(this,function(e){switch(e.label){case 0:return i=C,[4,S(this.collection,t)];case 1:return n=i.apply(void 0,[e.sent()]),[4,this.args.render(t)];case 2:a=e.sent(),o=a.offset||0,s=void 0===a.limit?n.length:a.limit,n=n.slice(o,o+s),o=a.cols||n.length,s=this.liquid.renderer,a=new Pi(n.length,o,this.collection.getText(),this.variable),o={tablerowloop:a},t.push(o),u=0,e.label=3;case 3:return u<n.length?(o[this.variable]=n[u],0===a.col0()&&(1!==a.row()&&r.write("</tr>"),r.write('<tr class="row'.concat(a.row(),'">'))),r.write('<td class="col'.concat(a.col(),'">')),[4,s.renderTemplates(this.templates,t,r)]):[3,6];case 4:e.sent(),r.write("</td>"),e.label=5;case 5:return u++,a.next(),[3,3];case 6:return n.length&&r.write("</tr>"),t.pop(),[2]}})},Hi.prototype.children=function(){return G(this,function(e){return[2,this.templates]})},Hi.prototype.arguments=function(){var t,r,n,i,s;return G(this,function(e){switch(e.label){case 0:return[4,this.collection];case 1:e.sent(),e.label=2;case 2:e.trys.push([2,7,8,9]),t=X(Object.values(this.args.hash)),r=t.next(),e.label=3;case 3:return r.done?[3,6]:_(n=r.value)?[4,n]:[3,5];case 4:e.sent(),e.label=5;case 5:return r=t.next(),[3,3];case 6:return[3,9];case 7:return n=e.sent(),i={error:n},[3,9];case 8:try{r&&!r.done&&(s=t.return)&&s.call(t)}finally{if(i)throw i.error}return[7];case 9:return[2]}})},Hi.prototype.blockScope=function(){return[this.variable,"tablerowloop"]};var Ii,Bi=Hi;function Hi(e,t,r,n){var i,s=Ii.call(this,e,t,r)||this,a=s.tokenizer.readIdentifier(),o=(s.tokenizer.skipBlank(),s.tokenizer.readIdentifier()),u=s.tokenizer.readValue();if("in"!==o.content||!u)throw new Error("illegal tag: ".concat(e.getText()));s.variable=a.content,s.collection=u,s.args=new Kr(s.tokenizer,r.options.keyValueSeparator),s.templates=[];var c=n.parseStream(t).on("start",function(){return i=s.templates}).on("tag:endtablerow",function(){return c.stop()}).on("template",function(e){return i.push(e)}).on("end",function(){throw new Error("tag ".concat(e.getText()," not closed"))});return c.start(),s}s(Wi,Ui=L),Wi.prototype.render=function(t,r){var n,i,s,a,o,u,c,l;return G(this,function(e){switch(e.label){case 0:n=this.liquid.renderer,e.label=1;case 1:e.trys.push([1,7,8,9]),i=X(this.branches),s=i.next(),e.label=2;case 2:return s.done?[3,6]:(o=s.value,u=o.value,a=o.test,o=o.templates,[4,u.value(t,t.opts.lenientIf)]);case 3:return(u=e.sent(),a(u,t))?[4,n.renderTemplates(o,t,r)]:[3,5];case 4:return e.sent(),[2];case 5:return s=i.next(),[3,2];case 6:return[3,9];case 7:return c=e.sent(),c={error:c},[3,9];case 8:try{s&&!s.done&&(l=i.return)&&l.call(i)}finally{if(c)throw c.error}return[7];case 9:return[4,n.renderTemplates(this.elseTemplates,t,r)];case 10:return e.sent(),[2]}})},Wi.prototype.children=function(){var t;return G(this,function(e){return t=this.branches.flatMap(function(e){return e.templates}),this.elseTemplates&&t.push.apply(t,d([],ee(this.elseTemplates),!1)),[2,t]})},Wi.prototype.arguments=function(){return this.branches.map(function(e){return e.value})};var Ui,Ki=Wi;function Wi(e,t,r,n){var i=Ui.call(this,e,t,r)||this,s=(i.branches=[],i.elseTemplates=[],[]),a=0;return n.parseStream(t).on("start",function(){return i.branches.push({value:new F(e.tokenizer.readFilteredValue(),i.liquid),test:Tr,templates:s=[]})}).on("tag:elsif",function(e){0<a?s=[]:i.branches.push({value:new F(e.tokenizer.readFilteredValue(),i.liquid),test:kr,templates:s=[]})}).on("tag:else",function(){a++,s=i.elseTemplates}).on("tag:endunless",function(){this.stop()}).on("template",function(e){s===i.elseTemplates&&1!==a||s.push(e)}).on("end",function(){throw new Error("tag ".concat(e.getText()," not closed"))}).start(),i}s(Zi,Yi=L),Zi.prototype.render=function(e,t){e.breakCalled=!0};var Yi,$i=Zi;function Zi(){return null!==Yi&&Yi.apply(this,arguments)||this}s(Gi,Ji=L),Gi.prototype.render=function(e,t){e.continueCalled=!0};var Ji,Qi=Gi;function Gi(){return null!==Ji&&Ji.apply(this,arguments)||this}s(ts,Xi=L),ts.prototype.render=function(t,r){var n;return G(this,function(e){switch(e.label){case 0:return this.value?[4,this.value.value(t,!1)]:[2];case 1:return n=e.sent(),r.write(n),[2]}})},ts.prototype.arguments=function(){return G(this,function(e){switch(e.label){case 0:return this.value?[4,this.value]:[3,2];case 1:e.sent(),e.label=2;case 2:return[2]}})};var Xi,es=ts;function ts(e,t,r){e=Xi.call(this,e,t,r)||this;return e.tokenizer.skipBlank(),e.tokenizer.end()||(e.value=new F(e.tokenizer.readFilteredValue(),e.liquid)),e}s(is,rs=L),is.prototype.render=function(t,r){return G(this,function(e){switch(e.label){case 0:return[4,this.liquid.renderer.renderTemplates(this.templates,t,r)];case 1:return e.sent(),[2]}})},is.prototype.children=function(){return G(this,function(e){return[2,this.templates]})};var rs,ns=is;function is(e,t,r,n){e=rs.call(this,e,t,r)||this,t=e.tokenizer.readLiquidTagTokens(e.liquid.options);return e.templates=n.parseTokens(t),e}s(os,ss=L),os.prototype.render=function(){};var ss,as=os;function os(e,t,r){t=ss.call(this,e,t,r)||this;if(-1!==e.args.search(/\n\s*[^#\s]/g))throw new Error("every line of an inline comment must start with a '#' character");return t}var us={assign:Mn,for:Nn,capture:Vn,case:Pn,comment:Cn,include:An,render:Er,decrement:Dn,increment:Hn,cycle:In,if:Bn,layout:Ri,block:Ei,raw:Di,tablerow:Bi,unless:Ki,break:$i,continue:Qi,echo:es,liquid:ns,"#":as},cs=(j.prototype.parse=function(e,t){return new wn(this).parse(e,t)},j.prototype._render=function(e,t,r){t=t instanceof En?t:new En(t,this.options,r);return this.renderer.renderTemplates(e,t)},j.prototype.render=function(t,r,n){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,f(this._render(t,r,T(T({},n),{sync:!1})))]})})},j.prototype.renderSync=function(e,t,r){return m(this._render(e,t,T(T({},r),{sync:!0})))},j.prototype.renderToNodeStream=function(e,t,r){t=new En(t,this.options,r=void 0===r?{}:r);return this.renderer.renderTemplatesToNodeStream(e,t)},j.prototype._parseAndRender=function(e,t,r){e=this.parse(e);return this._render(e,t,r)},j.prototype.parseAndRender=function(t,r,n){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,f(this._parseAndRender(t,r,T(T({},n),{sync:!1})))]})})},j.prototype.parseAndRenderSync=function(e,t,r){return m(this._parseAndRender(e,t,T(T({},r),{sync:!0})))},j.prototype._parsePartialFile=function(e,t,r){return new wn(this).parseFile(e,t,yn.Partials,r)},j.prototype._parseLayoutFile=function(e,t,r){return new wn(this).parseFile(e,t,yn.Layouts,r)},j.prototype._parseFile=function(e,t,r,n){return new wn(this).parseFile(e,t,r,n)},j.prototype.parseFile=function(t,r){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,f(new wn(this).parseFile(t,!1,r))]})})},j.prototype.parseFileSync=function(e,t){return m(new wn(this).parseFile(e,!0,t))},j.prototype._renderFile=function(t,r,n){var i;return G(this,function(e){switch(e.label){case 0:return[4,this._parseFile(t,n.sync,n.lookupType)];case 1:return i=e.sent(),[4,this._render(i,r,n)];case 2:return[2,e.sent()]}})},j.prototype.renderFile=function(t,r,n){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,f(this._renderFile(t,r,T(T({},n),{sync:!1})))]})})},j.prototype.renderFileSync=function(e,t,r){return m(this._renderFile(e,t,T(T({},r),{sync:!0})))},j.prototype.renderFileToNodeStream=function(r,n,i){return o(this,void 0,void 0,function(){var t;return G(this,function(e){switch(e.label){case 0:return[4,this.parseFile(r)];case 1:return t=e.sent(),[2,this.renderToNodeStream(t,n,i)]}})})},j.prototype._evalValue=function(e,t){e=new F(e,this),t=t instanceof En?t:new En(t,this.options);return e.value(t)},j.prototype.evalValue=function(t,r){return o(this,void 0,void 0,function(){return G(this,function(e){return[2,f(this._evalValue(t,r))]})})},j.prototype.evalValueSync=function(e,t){return m(this._evalValue(e,t))},j.prototype.registerFilter=function(e,t){this.filters[e]=t},j.prototype.registerTag=function(e,t){function r(e,t,r){r=n.call(this,e,t,r)||this;return u(i.parse)&&i.parse.call(r,e,t),r}var i,n;this.tags[e]=u(t)?t:(i=t,s(r,n=L),r.prototype.render=function(t,r){var n;return G(this,function(e){switch(e.label){case 0:return[4,new Kr(this.token.args,t.opts.keyValueSeparator).render(t)];case 1:return n=e.sent(),[4,i.render.call(this,t,r,n)];case 2:return[2,e.sent()]}})},r)},j.prototype.plugin=function(e){return e.call(this,j)},j.prototype.express=function(){var s=this,a=!0;return function(e,t,r){var n,i;a&&(a=!1,i=Vr(this.root),(n=s.options.root).unshift.apply(n,d([],ee(i),!1)),(n=s.options.layouts).unshift.apply(n,d([],ee(i),!1)),(n=s.options.partials).unshift.apply(n,d([],ee(i),!1))),s.renderFile(e,t).then(function(e){return r(null,e)},r)}},j.prototype.analyze=function(t,r){return void 0===r&&(r={}),o(this,void 0,void 0,function(){return G(this,function(e){return[2,O(t,r)]})})},j.prototype.analyzeSync=function(e,t){return ln(e,t=void 0===t?{}:t)},j.prototype.parseAndAnalyze=function(t,r,n){return void 0===n&&(n={}),o(this,void 0,void 0,function(){return G(this,function(e){return[2,O(this.parse(t,r),n)]})})},j.prototype.parseAndAnalyzeSync=function(e,t,r){return void 0===r&&(r={}),ln(this.parse(e,t),r)},j.prototype.variables=function(r,n){return void 0===n&&(n={}),o(this,void 0,void 0,function(){var t;return G(this,function(e){switch(e.label){case 0:return[4,O(te(r)?this.parse(r):r,n)];case 1:return t=e.sent(),[2,Object.keys(t.variables)]}})})},j.prototype.variablesSync=function(e,t){void 0===t&&(t={});e=ln(te(e)?this.parse(e):e,t);return Object.keys(e.variables)},j.prototype.fullVariables=function(r,n){return void 0===n&&(n={}),o(this,void 0,void 0,function(){var t;return G(this,function(e){switch(e.label){case 0:return[4,O(te(r)?this.parse(r):r,n)];case 1:return t=e.sent(),[2,Array.from(new Set(Object.values(t.variables).flatMap(function(e){return e.map(function(e){return String(e)})})))]}})})},j.prototype.fullVariablesSync=function(e,t){void 0===t&&(t={});e=ln(te(e)?this.parse(e):e,t);return Array.from(new Set(Object.values(e.variables).flatMap(function(e){return e.map(function(e){return String(e)})})))},j.prototype.variableSegments=function(r,n){return void 0===n&&(n={}),o(this,void 0,void 0,function(){var t;return G(this,function(e){switch(e.label){case 0:return[4,O(te(r)?this.parse(r):r,n)];case 1:return t=e.sent(),[2,Array.from(ie(Object.values(t.variables).flatMap(function(e){return e.map(function(e){return e.toArray()})})))]}})})},j.prototype.variableSegmentsSync=function(e,t){void 0===t&&(t={});e=ln(te(e)?this.parse(e):e,t);return Array.from(ie(Object.values(e.variables).flatMap(function(e){return e.map(function(e){return e.toArray()})})))},j.prototype.globalVariables=function(r,n){return void 0===n&&(n={}),o(this,void 0,void 0,function(){var t;return G(this,function(e){switch(e.label){case 0:return[4,O(te(r)?this.parse(r):r,n)];case 1:return t=e.sent(),[2,Object.keys(t.globals)]}})})},j.prototype.globalVariablesSync=function(e,t){void 0===t&&(t={});e=ln(te(e)?this.parse(e):e,t);return Object.keys(e.globals)},j.prototype.globalFullVariables=function(r,n){return void 0===n&&(n={}),o(this,void 0,void 0,function(){var t;return G(this,function(e){switch(e.label){case 0:return[4,O(te(r)?this.parse(r):r,n)];case 1:return t=e.sent(),[2,Array.from(new Set(Object.values(t.globals).flatMap(function(e){return e.map(function(e){return String(e)})})))]}})})},j.prototype.globalFullVariablesSync=function(e,t){void 0===t&&(t={});e=ln(te(e)?this.parse(e):e,t);return Array.from(new Set(Object.values(e.globals).flatMap(function(e){return e.map(function(e){return String(e)})})))},j.prototype.globalVariableSegments=function(r,n){return void 0===n&&(n={}),o(this,void 0,void 0,function(){var t;return G(this,function(e){switch(e.label){case 0:return[4,O(te(r)?this.parse(r):r,n)];case 1:return t=e.sent(),[2,Array.from(ie(Object.values(t.globals).flatMap(function(e){return e.map(function(e){return e.toArray()})})))]}})})},j.prototype.globalVariableSegmentsSync=function(e,t){void 0===t&&(t={});e=ln(te(e)?this.parse(e):e,t);return Array.from(ie(Object.values(e.globals).flatMap(function(e){return e.map(function(e){return e.toArray()})})))},j);function j(e){void 0===e&&(e={});var r=this;this.renderer=new vr,this.filters={},this.tags={},this.options=Nr(e),this.parser=new wn(this),U(us,function(e,t){return r.registerTag(t,e)}),U(ni,function(e,t){return r.registerFilter(t,e)})}l.AssertionError=_e,l.AssignTag=Mn,l.BlockTag=Ei,l.BreakTag=$i,l.CaptureTag=Vn,l.CaseTag=Pn,l.CommentTag=Cn,l.Context=En,l.ContinueTag=Qi,l.CycleTag=In,l.DecrementTag=Dn,l.Drop=A,l.EchoTag=es,l.Expression=mr,l.Filter=$r,l.ForTag=Nn,l.Hash=Kr,l.IfTag=Bn,l.IncludeTag=An,l.IncrementTag=Hn,l.InlineCommentTag=as,l.LayoutTag=Ri,l.Liquid=cs,l.LiquidError=oe,l.LiquidTag=ns,l.Output=Gr,l.ParseError=fe,l.ParseStream=Cr,l.Parser=wn,l.RawTag=Di,l.RenderError=ve,l.RenderTag=Er,l.TablerowTag=Bi,l.Tag=L,l.TagToken=kt,l.Token=e,l.TokenizationError=le,l.Tokenizer=w,l.TypeGuards=r,l.UndefinedVariableError=Te,l.UnlessTag=Ki,l.Value=F,l.Variable=nn,l.analyze=O,l.analyzeSync=ln,l.assert=x,l.createTrie=Xe,l.defaultOperators=Ce,l.defaultOptions=Dr,l.evalQuotedToken=wr,l.evalToken=S,l.filters=ni,l.isFalsy=Tr,l.isTruthy=kr,l.tags=us,l.toPromise=f,l.toValue=g,l.toValueSync=m,l.version="10.23.0",Object.defineProperty(l,"__esModule",{value:!0})}); +//# sourceMappingURL=liquid.browser.min.js.map diff --git a/node_modules/liquidjs/dist/liquid.browser.min.js.map b/node_modules/liquidjs/dist/liquid.browser.min.js.map new file mode 100644 index 0000000..ea07f38 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"liquid.browser.min.js","sources":["../src/tokens/token.ts","../src/drop/drop.ts","../src/util/underscore.ts","../src/util/error.ts","../src/util/character.ts","../src/util/assert.ts","../src/drop/null-drop.ts","../src/drop/empty-drop.ts","../src/drop/blank-drop.ts","../src/drop/forloop-drop.ts","../src/emitters/simple-emitter.ts","../src/build/streamed-emitter-browser.ts","../src/emitters/keeping-type-emitter.ts","../src/drop/block-drop.ts","../src/drop/comparable.ts","../src/util/literal.ts","../src/util/operator-trie.ts","../src/util/async.ts","../src/util/strftime.ts","../src/util/intl.ts","../src/util/liquid-date.ts","../src/util/limiter.ts","../src/tokens/delimited-token.ts","../src/tokens/tag-token.ts","../src/tokens/output-token.ts","../src/tokens/html-token.ts","../src/tokens/number-token.ts","../src/tokens/identifier-token.ts","../src/tokens/literal-token.ts","../src/tokens/operator-token.ts","../src/tokens/property-access-token.ts","../src/tokens/filter-token.ts","../src/tokens/hash-token.ts","../src/render/string.ts","../src/tokens/quoted-token.ts","../src/tokens/range-token.ts","../src/tokens/liquid-tag-token.ts","../src/tokens/filtered-value-token.ts","../src/util/performance.ts","../src/render/render.ts","../src/render/expression.ts","../src/render/boolean.ts","../src/render/operator.ts","../src/cache/lru.ts","../src/build/fs-impl-browser.ts","../src/filters/misc.ts","../src/filters/html.ts","../src/fs/map-fs.ts","../src/liquid-options.ts","../src/parser/whitespace-ctrl.ts","../src/parser/tokenizer.ts","../src/parser/parse-stream.ts","../src/template/template-impl.ts","../src/template/tag.ts","../src/template/hash.ts","../src/parser/filter-arg.ts","../src/template/filter.ts","../src/template/value.ts","../src/template/output.ts","../src/template/html.ts","../src/template/analysis.ts","../src/fs/loader.ts","../src/parser/parser.ts","../src/util/type-guards.ts","../src/parser/token-kind.ts","../src/context/block-mode.ts","../src/context/context.ts","../src/filters/math.ts","../src/filters/url.ts","../src/filters/array.ts","../src/filters/date.ts","../src/filters/string.ts","../src/filters/index.ts","../src/tags/assign.ts","../src/tags/for.ts","../src/tags/capture.ts","../src/tags/case.ts","../src/tags/comment.ts","../src/tags/render.ts","../src/tags/include.ts","../src/tags/decrement.ts","../src/tags/cycle.ts","../src/tags/if.ts","../src/tags/increment.ts","../src/tags/layout.ts","../src/tags/block.ts","../src/tags/raw.ts","../src/drop/tablerowloop-drop.ts","../src/tags/tablerow.ts","../src/tags/unless.ts","../src/tags/break.ts","../src/tags/continue.ts","../src/tags/echo.ts","../src/tags/liquid.ts","../src/tags/inline-comment.ts","../src/tags/index.ts","../src/liquid.ts","../src/template/tag-options-adapter.ts","../src/index.ts"],"sourcesContent":["import { TokenKind } from '../parser'\n\nexport abstract class Token {\n public constructor (\n public kind: TokenKind,\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {}\n public getText () {\n return this.input.slice(this.begin, this.end)\n }\n public getPosition () {\n let [row, col] = [1, 1]\n for (let i = 0; i < this.begin; i++) {\n if (this.input[i] === '\\n') {\n row++\n col = 1\n } else col++\n }\n return [row, col]\n }\n public size () {\n return this.end - this.begin\n }\n}\n","import { Context } from '../context'\n\nexport abstract class Drop {\n public liquidMethodMissing (key: string | number, context: Context): Promise<any> | any {\n return undefined\n }\n}\n","import { Drop } from '../drop/drop'\n\nexport const toString = Object.prototype.toString\nconst toLowerCase = String.prototype.toLowerCase\n\nexport const hasOwnProperty = Object.hasOwnProperty\n\nexport function isString (value: any): value is string {\n return typeof value === 'string'\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isFunction (value: any): value is Function {\n return typeof value === 'function'\n}\n\nexport function isPromise<T> (val: any): val is Promise<T> {\n return val && isFunction(val.then)\n}\n\nexport function isIterator (val: any): val is IterableIterator<any> {\n return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return)\n}\n\nexport function escapeRegex (str: string) {\n return str.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n}\n\nexport function promisify<T1, T2> (fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise<T2>;\nexport function promisify<T1, T2, T3> (fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise<T3>;\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 value = toValue(value)\n if (isString(value)) return value\n if (isNil(value)) return ''\n if (isArray(value)) return value.map(x => stringify(x)).join('')\n return String(value)\n}\n\nexport function toEnumerable<T = unknown> (val: any): T[] {\n val = toValue(val)\n if (isArray(val)) return val\n if (isString(val) && val.length > 0) return [val] as unknown as T[]\n if (isIterable(val)) return Array.from(val)\n if (isObject(val)) return Object.keys(val).map((key) => [key, val[key]]) as unknown as T[]\n return []\n}\n\nexport function toArray (val: any) {\n val = toValue(val)\n if (isNil(val)) return []\n if (isArray(val)) return val\n return [ val ]\n}\n\nexport function toValue (value: any): any {\n return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value\n}\n\nexport function toNumber (value: any): number {\n return +toValue(value) || 0\n}\n\nexport function isNumber (value: any): value is number {\n return typeof value === 'number'\n}\n\nexport function toLiquid (value: any): any {\n if (value && isFunction(value.toLiquid)) return toLiquid(value.toLiquid())\n return value\n}\n\nexport function isNil (value: any): boolean {\n return value == null\n}\n\nexport function isUndefined (value: any): boolean {\n return value === undefined\n}\n\nexport function isArray (value: any): value is any[] {\n // be compatible with IE 8\n return toString.call(value) === '[object Array]'\n}\n\nexport function isArrayLike (value: any): value is any[] {\n return value && isNumber(value.length)\n}\n\nexport function isIterable (value: any): value is Iterable<any> {\n return isObject(value) && Symbol.iterator in value\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 <T> (\n obj: Record<string, T> | undefined,\n iteratee: ((val: T, key: string, obj: {[key: string]: T}) => boolean | void)\n) {\n obj = obj || {}\n for (const k in obj) {\n if (hasOwnProperty.call(obj, k)) {\n if (iteratee(obj[k], k, obj) === false) break\n }\n }\n return obj\n}\n\nexport function last <T>(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\nexport function range (start: number, stop: number, step = 1) {\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 = ' ') {\n return pad(str, length, ch, (str, ch) => ch + str)\n}\n\nexport function padEnd (str: any, length: number, ch = ' ') {\n return pad(str, length, ch, (str, ch) => str + ch)\n}\n\nexport function pad (str: any, length: number, ch: string, add: (str: string, ch: string) => string) {\n str = String(str)\n let n = length - str.length\n while (n-- > 0) str = add(str, ch)\n return str\n}\n\nexport function identify<T> (val: T): T {\n return val\n}\n\nexport function changeCase (str: string): string {\n const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z')\n return hasLowerCase ? str.toUpperCase() : str.toLowerCase()\n}\n\nexport function ellipsis (str: string, N: number): string {\n return str.length > N ? str.slice(0, N - 3) + '...' : str\n}\n\n// compare string in case-insensitive way, undefined values to the tail\nexport function caseInsensitiveCompare (a: any, b: any) {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n a = toLowerCase.call(a)\n b = toLowerCase.call(b)\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n\nexport function argumentsToValue<F extends (...args: any) => any, T> (fn: F) {\n return function (this: T, ...args: Parameters<F>) { return fn.call(this, ...args.map(toValue)) }\n}\n\nexport function argumentsToNumber<F extends (...args: any) => any, T> (fn: F) {\n return function (this: T, ...args: Parameters<F>) { return fn.call(this, ...args.map(toNumber)) }\n}\n\nexport function escapeRegExp (text: string) {\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\n/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */\nexport function * strictUniq<T> (array: Array<T>): Generator<T> {\n const seen = new Set()\n\n for (const element of array) {\n const key = JSON.stringify(element)\n if (!seen.has(key)) {\n seen.add(key)\n yield element\n }\n }\n}\n","import * as _ from './underscore'\nimport { Token } from '../tokens/token'\nimport { Template } from '../template/template'\n\n/**\n * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes\n */\nconst TRAIT = '__liquidClass__'\n\nexport abstract class LiquidError extends Error {\n public token!: Token\n public context = ''\n public originalError?: Error\n public constructor (err: Error | string, token: Token) {\n /**\n * note: for ES5 targeting, `this` will be replaced by return value of Error(),\n * thus everything on `this` will be lost, avoid calling `LiquidError` methods here\n */\n super(typeof err === 'string' ? err : err.message)\n if (typeof err !== 'string') Object.defineProperty(this, 'originalError', { value: err, enumerable: false })\n Object.defineProperty(this, 'token', { value: token, enumerable: false })\n Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false })\n }\n protected update () {\n Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false })\n this.message = mkMessage(this.message, this.token)\n this.stack = this.message + '\\n' + this.context +\n '\\n' + this.stack\n if (this.originalError) this.stack += '\\nFrom ' + this.originalError.stack\n }\n static is (obj: unknown): obj is LiquidError {\n return obj?.[TRAIT] === 'LiquidError'\n }\n}\n\nexport class TokenizationError extends LiquidError {\n public constructor (message: string, token: Token) {\n super(message, token)\n this.name = 'TokenizationError'\n super.update()\n }\n}\n\nexport class ParseError extends LiquidError {\n public 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 public constructor (err: Error, tpl: Template) {\n super(err, tpl.token)\n this.name = 'RenderError'\n this.message = err.message\n super.update()\n }\n public static is (obj: any): obj is RenderError {\n return obj.name === 'RenderError'\n }\n}\n\nexport class LiquidErrors extends LiquidError {\n public constructor (public errors: RenderError[]) {\n super(errors[0], errors[0].token)\n this.name = 'LiquidErrors'\n const s = errors.length > 1 ? 's' : ''\n this.message = `${errors.length} error${s} found`\n super.update()\n }\n public static is (obj: any): obj is LiquidErrors {\n return obj.name === 'LiquidErrors'\n }\n}\n\nexport class UndefinedVariableError extends LiquidError {\n public constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'UndefinedVariableError'\n this.message = err.message\n super.update()\n }\n}\n\n// only used internally; raised where we don't have token information,\n// so it can't be an UndefinedVariableError.\nexport class InternalUndefinedVariableError extends Error {\n variableName: string\n\n public constructor (variableName: string) {\n super(`undefined variable: ${variableName}`)\n this.name = 'InternalUndefinedVariableError'\n this.variableName = variableName\n }\n}\n\nexport class AssertionError extends Error {\n public constructor (message: string) {\n super(message)\n this.name = 'AssertionError'\n this.message = message + ''\n }\n}\n\nfunction mkContext (token: Token) {\n const [line, col] = token.getPosition()\n const lines = token.input.split('\\n')\n const begin = Math.max(line - 2, 1)\n const end = Math.min(line + 3, lines.length)\n\n const context = _\n .range(begin, end + 1)\n .map(lineNumber => {\n const rowIndicator = (lineNumber === line) ? '>> ' : ' '\n const num = _.padStart(String(lineNumber), String(end).length)\n let text = `${rowIndicator}${num}| `\n\n const colIndicator = lineNumber === line\n ? '\\n' + _.padStart('^', col + text.length)\n : ''\n\n text += lines[lineNumber - 1]\n text += colIndicator\n return 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 const [line, col] = token.getPosition()\n msg += `, line:${line}, col:${col}`\n return msg\n}\n","// **DO NOT CHANGE THIS FILE**\n//\n// This file is generated by bin/character-gen.js\n// bitmask character types to boost performance\nexport const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]\nexport const WORD = 1\nexport const OPERATOR = 2\nexport const BLANK = 4\nexport const QUOTE = 8\nexport const INLINE_BLANK = 16\nexport const NUMBER = 32\nexport const SIGN = 64\nexport const PUNCTUATION = 128\n\nexport function isWord (char: string): boolean {\n const code = char.charCodeAt(0)\n return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD)\n}\nTYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK\nTYPES[8220] = TYPES[8221] = PUNCTUATION\n","import { AssertionError } from './error'\n\nexport function assert <T> (predicate: T | null | undefined, message?: string | (() => string)) {\n if (!predicate) {\n const msg = typeof message === 'function'\n ? message()\n : (message || `expect ${predicate} to be true`)\n throw new AssertionError(msg)\n }\n}\n\nexport function assertEmpty<T> (predicate: T | null | undefined, message = `unexpected ${JSON.stringify(predicate)}`) {\n assert(!predicate, message)\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isNil, toValue } from '../util'\n\nexport class NullDrop extends Drop implements Comparable {\n public equals (value: any) {\n return isNil(toValue(value))\n }\n public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return null\n }\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isObject, isString, isArray, toValue } from '../util'\n\nexport class EmptyDrop extends Drop implements Comparable {\n public equals (value: any) {\n if (value instanceof EmptyDrop) return false\n value = toValue(value)\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 public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return ''\n }\n static is (value: unknown) {\n return value instanceof EmptyDrop\n }\n}\n","import { isNil, isString, toValue } from '../util'\nimport { EmptyDrop } from '../drop'\n\nexport class BlankDrop extends EmptyDrop {\n public equals (value: any) {\n if (value === false) return true\n if (isNil(toValue(value))) return true\n if (isString(value)) return /^\\s*$/.test(value)\n return super.equals(value)\n }\n static is (value: unknown) {\n return value instanceof BlankDrop\n }\n}\n","import { Drop } from './drop'\n\nexport class ForloopDrop extends Drop {\n protected i = 0\n public name: string\n public length: number\n public constructor (length: number, collection: string, variable: string) {\n super()\n this.length = length\n this.name = `${variable}-${collection}`\n }\n public next () {\n this.i++\n }\n public index0 () {\n return this.i\n }\n public index () {\n return this.i + 1\n }\n public first () {\n return this.i === 0\n }\n public last () {\n return this.i === this.length - 1\n }\n public rindex () {\n return this.length - this.i\n }\n public rindex0 () {\n return this.length - this.i - 1\n }\n public valueOf () {\n return JSON.stringify(this)\n }\n}\n","import { stringify } from '../util'\nimport { Emitter } from './emitter'\n\nexport class SimpleEmitter implements Emitter {\n public buffer = '';\n\n public write (html: any) {\n this.buffer += stringify(html)\n }\n}\n","import { Emitter } from '../emitters'\n\nexport class StreamedEmitter implements Emitter {\n public buffer = '';\n public stream: NodeJS.ReadableStream = null as any\n constructor () {\n throw new Error('streaming not supported in browser')\n }\n public write: (html: any) => void\n public error: (err: Error) => void\n public end: () => void\n}\n","import { stringify, toValue } from '../util'\nimport { Emitter } from './emitter'\n\nexport class KeepingTypeEmitter implements Emitter {\n public buffer: any = '';\n\n public write (html: any) {\n html = toValue(html)\n // This will only preserve the type if the value is isolated.\n // I.E:\n // {{ my-port }} -> 42\n // {{ my-host }}:{{ my-port }} -> 'host:42'\n if (typeof html !== 'string' && this.buffer === '') {\n this.buffer = html\n } else {\n this.buffer = stringify(this.buffer) + stringify(html)\n }\n }\n}\n","import { Emitter, SimpleEmitter } from '../emitters'\nimport { Drop } from './drop'\n\nexport class BlockDrop extends Drop {\n constructor (\n // the block render from layout template\n private superBlockRender: (emitter: Emitter) => IterableIterator<unknown> | string = () => ''\n ) {\n super()\n }\n /**\n * Provide parent access in child block by\n * {{ block.super }}\n */\n public * super (): IterableIterator<unknown> {\n const emitter = new SimpleEmitter()\n yield this.superBlockRender(emitter)\n return emitter.buffer\n }\n}\n","import { isFunction } from '../util'\n\nexport interface Comparable {\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 Comparable {\n return (\n arg &&\n isFunction(arg.equals) &&\n isFunction(arg.gt) &&\n isFunction(arg.geq) &&\n isFunction(arg.lt) &&\n isFunction(arg.leq)\n )\n}\n","import { BlankDrop, EmptyDrop, NullDrop } from '../drop'\n\nconst nil = new NullDrop()\nexport const literalValues = {\n 'true': true,\n 'false': false,\n 'nil': nil,\n 'null': nil,\n 'empty': new EmptyDrop(),\n 'blank': new BlankDrop()\n}\n\nexport type LiteralKey = keyof typeof literalValues\nexport type LiteralValue = typeof literalValues[LiteralKey]\n","import { isWord } from '../util/character'\n\ninterface TrieInput<T> {\n [key: string]: T\n}\n\ninterface TrieLeafNode<T> {\n data: T;\n end: true;\n needBoundary?: true;\n}\n\nexport interface Trie<T> {\n [key: string]: Trie<T> | TrieLeafNode<T>;\n}\n\nexport type TrieNode<T> = Trie<T> | TrieLeafNode<T>\n\nexport function createTrie<T = any> (input: TrieInput<T>): Trie<T> {\n const trie: Trie<T> = {}\n for (const [name, data] of Object.entries(input)) {\n let node: Trie<T> | TrieLeafNode<T> = trie\n\n for (let i = 0; i < name.length; i++) {\n const c = name[i]\n node[c] = node[c] || {}\n\n if (i === name.length - 1 && isWord(name[i])) {\n node[c].needBoundary = true\n }\n\n node = node[c]\n }\n\n node.data = data\n node.end = true\n }\n return trie\n}\n","import { isPromise, isIterator } from './underscore'\n\n// convert an async iterator to a Promise\nexport async function toPromise<T> (val: Generator<unknown, T, unknown> | Promise<T> | T): Promise<T> {\n if (!isIterator(val)) return val\n let value: unknown\n let done = false\n let next = 'next'\n do {\n const state = val[next](value)\n done = state.done\n value = state.value\n next = 'next'\n try {\n if (isIterator(value)) value = toPromise(value)\n if (isPromise(value)) value = await value\n } catch (err) {\n next = 'throw'\n value = err\n }\n } while (!done)\n return value as T\n}\n\n// convert an async iterator to a value in a synchronous manner\nexport function toValueSync<T> (val: Generator<unknown, T, unknown> | T): T {\n if (!isIterator(val)) return val\n let value: any\n let done = false\n let next = 'next'\n do {\n const state = val[next](value)\n done = state.done\n value = state.value\n next = 'next'\n if (isIterator(value)) {\n try {\n value = toValueSync(value)\n } catch (err) {\n next = 'throw'\n value = err\n }\n }\n } while (!done)\n return value\n}\n","import { changeCase, padStart, padEnd } from './underscore'\nimport { LiquidDate } from './liquid-date'\n\nconst rFormat = /%([-_0^#:]+)?(\\d+)?([EO])?(.)/\ninterface FormatOptions {\n flags: object;\n width?: string;\n modifier?: string;\n}\n\n// prototype extensions\nfunction daysInMonth (d: LiquidDate) {\n const feb = isLeapYear(d) ? 29 : 28\n return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n}\nfunction getDayOfYear (d: LiquidDate) {\n let num = 0\n for (let i = 0; i < d.getMonth(); ++i) {\n num += daysInMonth(d)[i]\n }\n return num + d.getDate()\n}\nfunction getWeekOfYear (d: LiquidDate, startDay: number) {\n // Skip to startDay of this week\n const now = 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 String(Math.floor((now - then) / 7) + 1)\n}\nfunction isLeapYear (d: LiquidDate) {\n const year = d.getFullYear()\n return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)))\n}\nfunction ordinal (d: LiquidDate) {\n const date = d.getDate()\n if ([11, 12, 13].includes(date)) return 'th'\n\n switch (date % 10) {\n case 1: return 'st'\n case 2: return 'nd'\n case 3: return 'rd'\n default: return 'th'\n }\n}\nfunction century (d: LiquidDate) {\n return parseInt(d.getFullYear().toString().substring(0, 2), 10)\n}\n\n// default to 0\nconst padWidths = {\n d: 2,\n e: 2,\n H: 2,\n I: 2,\n j: 3,\n k: 2,\n l: 2,\n L: 3,\n m: 2,\n M: 2,\n S: 2,\n U: 2,\n W: 2\n}\n\nconst padSpaceChars = new Set('aAbBceklpP')\n\nfunction getTimezoneOffset (d: LiquidDate, opts: FormatOptions) {\n const nOffset = Math.abs(d.getTimezoneOffset())\n const h = Math.floor(nOffset / 60)\n const m = nOffset % 60\n return (d.getTimezoneOffset() > 0 ? '-' : '+') +\n padStart(h, 2, '0') +\n (opts.flags[':'] ? ':' : '') +\n padStart(m, 2, '0')\n}\nconst formatCodes = {\n a: (d: LiquidDate) => d.getShortWeekdayName(),\n A: (d: LiquidDate) => d.getLongWeekdayName(),\n b: (d: LiquidDate) => d.getShortMonthName(),\n B: (d: LiquidDate) => d.getLongMonthName(),\n c: (d: LiquidDate) => d.toLocaleString(),\n C: (d: LiquidDate) => century(d),\n d: (d: LiquidDate) => d.getDate(),\n e: (d: LiquidDate) => d.getDate(),\n H: (d: LiquidDate) => d.getHours(),\n I: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n j: (d: LiquidDate) => getDayOfYear(d),\n k: (d: LiquidDate) => d.getHours(),\n l: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n L: (d: LiquidDate) => d.getMilliseconds(),\n m: (d: LiquidDate) => d.getMonth() + 1,\n M: (d: LiquidDate) => d.getMinutes(),\n N: (d: LiquidDate, opts: FormatOptions) => {\n const width = Number(opts.width) || 9\n const str = String(d.getMilliseconds()).slice(0, width)\n return padEnd(str, width, '0')\n },\n p: (d: LiquidDate) => (d.getHours() < 12 ? 'AM' : 'PM'),\n P: (d: LiquidDate) => (d.getHours() < 12 ? 'am' : 'pm'),\n q: (d: LiquidDate) => ordinal(d),\n s: (d: LiquidDate) => Math.round(d.getTime() / 1000),\n S: (d: LiquidDate) => d.getSeconds(),\n u: (d: LiquidDate) => d.getDay() || 7,\n U: (d: LiquidDate) => getWeekOfYear(d, 0),\n w: (d: LiquidDate) => d.getDay(),\n W: (d: LiquidDate) => getWeekOfYear(d, 1),\n x: (d: LiquidDate) => d.toLocaleDateString(),\n X: (d: LiquidDate) => d.toLocaleTimeString(),\n y: (d: LiquidDate) => d.getFullYear().toString().slice(2, 4),\n Y: (d: LiquidDate) => d.getFullYear(),\n z: getTimezoneOffset,\n Z: (d: LiquidDate, opts: FormatOptions) => d.getTimeZoneName() || getTimezoneOffset(d, opts),\n 't': () => '\\t',\n 'n': () => '\\n',\n '%': () => '%'\n};\n(formatCodes as any).h = formatCodes.b\n\nexport function strftime (d: LiquidDate, formatStr: string) {\n let output = ''\n let remaining = formatStr\n let match\n while ((match = rFormat.exec(remaining))) {\n output += remaining.slice(0, match.index)\n remaining = remaining.slice(match.index + match[0].length)\n output += format(d, match)\n }\n return output + remaining\n}\n\nfunction format (d: LiquidDate, match: RegExpExecArray) {\n const [input, flagStr = '', width, modifier, conversion] = match\n const convert = formatCodes[conversion]\n if (!convert) return input\n const flags = {}\n for (const flag of flagStr) flags[flag] = true\n let ret = String(convert(d, { flags, width, modifier }))\n let padChar = padSpaceChars.has(conversion) ? ' ' : '0'\n let padWidth = width || padWidths[conversion] || 0\n if (flags['^']) ret = ret.toUpperCase()\n else if (flags['#']) ret = changeCase(ret)\n if (flags['_']) padChar = ' '\n else if (flags['0']) padChar = '0'\n if (flags['-']) padWidth = 0\n return padStart(ret, padWidth, padChar)\n}\n","export function getDateTimeFormat () {\n return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined)\n}\n","import { getDateTimeFormat } from './intl'\nimport { isString } from './underscore'\n\n// one minute in milliseconds\nconst OneMinute = 60000\n/**\n * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS\n * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3\n */\nconst TIMEZONE_PATTERN = /([zZ]|([+-])(\\d{2}):?(\\d{2}))$/\nconst monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\nconst monthNamesShort = monthNames.map(name => name.slice(0, 3))\nconst dayNames = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n]\nconst dayNamesShort = dayNames.map(name => name.slice(0, 3))\n\n/**\n * A date implementation with timezone info, just like Ruby date\n *\n * Implementation:\n * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods\n * - rewrite getTimezoneOffset() to trick strftime\n */\nexport class LiquidDate {\n private timezoneOffset: number\n private timezoneName: string\n private date: Date\n private displayDate: Date\n private DateTimeFormat = getDateTimeFormat()\n public timezoneFixed: boolean\n constructor (\n init: string | number | Date,\n private locale: string,\n timezone?: number | string\n ) {\n this.date = new Date(init)\n this.timezoneFixed = timezone !== undefined\n if (timezone === undefined) {\n timezone = this.date.getTimezoneOffset()\n }\n this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone\n this.timezoneName = isString(timezone) ? timezone : ''\n\n const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute\n const time = this.date.getTime() + diff\n this.displayDate = new Date(time)\n }\n\n getTime () {\n return this.displayDate.getTime()\n }\n getMilliseconds () {\n return this.displayDate.getMilliseconds()\n }\n getSeconds () {\n return this.displayDate.getSeconds()\n }\n getMinutes () {\n return this.displayDate.getMinutes()\n }\n getHours () {\n return this.displayDate.getHours()\n }\n getDay () {\n return this.displayDate.getDay()\n }\n getDate () {\n return this.displayDate.getDate()\n }\n getMonth () {\n return this.displayDate.getMonth()\n }\n getFullYear () {\n return this.displayDate.getFullYear()\n }\n toLocaleString (locale?: string, init?: any) {\n if (init?.timeZone) {\n return this.date.toLocaleString(locale, init)\n }\n return this.displayDate.toLocaleString(locale, init)\n }\n toLocaleTimeString (locale?: string) {\n return this.displayDate.toLocaleTimeString(locale)\n }\n toLocaleDateString (locale?: string) {\n return this.displayDate.toLocaleDateString(locale)\n }\n getTimezoneOffset () {\n return this.timezoneOffset!\n }\n getTimeZoneName () {\n if (this.timezoneFixed) return this.timezoneName\n if (!this.DateTimeFormat) return\n return this.DateTimeFormat().resolvedOptions().timeZone\n }\n getLongMonthName () {\n return this.format({ month: 'long' }) ?? monthNames[this.getMonth()]\n }\n getShortMonthName () {\n return this.format({ month: 'short' }) ?? monthNamesShort[this.getMonth()]\n }\n getLongWeekdayName () {\n return this.format({ weekday: 'long' }) ?? dayNames[this.displayDate.getDay()]\n }\n getShortWeekdayName () {\n return this.format({ weekday: 'short' }) ?? dayNamesShort[this.displayDate.getDay()]\n }\n valid () {\n return !isNaN(this.getTime())\n }\n private format (options: Intl.DateTimeFormatOptions) {\n return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate)\n }\n\n /**\n * Create a Date object fixed to it's declared Timezone. Both\n * - 2021-08-06T02:29:00.000Z and\n * - 2021-08-06T02:29:00.000+08:00\n * will always be displayed as\n * - 2021-08-06 02:29:00\n * regardless timezoneOffset in JavaScript realm\n *\n * The implementation hack:\n * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,\n * we create a different Date to trick strftime, it's both simpler and more performant.\n * Given that a template is expected to be parsed fewer times than rendered.\n */\n static createDateFixedToTimezone (dateString: string, locale: string): LiquidDate {\n const m = dateString.match(TIMEZONE_PATTERN)\n // representing a UTC timestamp\n if (m && m[1] === 'Z') {\n return new LiquidDate(+new Date(dateString), locale, 0)\n }\n // has a timezone specified\n if (m && m[2] && m[3] && m[4]) {\n const [, , sign, hours, minutes] = m\n const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10))\n return new LiquidDate(+new Date(dateString), locale, offset)\n }\n return new LiquidDate(dateString, locale)\n }\n private static getTimezoneOffset (timezoneName: string, date: Date) {\n const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName })\n const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' })\n\n const localDate = new Date(localDateString)\n const utcDate = new Date(utcDateString)\n return (+utcDate - +localDate) / (60 * 1000)\n }\n}\n","import { assert } from './assert'\n\nexport class Limiter {\n private message: string\n private base = 0\n private limit: number\n constructor (resource: string, limit: number) {\n this.message = `${resource} limit exceeded`\n this.limit = limit\n }\n use (count: number) {\n count = +count || 0\n assert(this.base + count <= this.limit, this.message)\n this.base += count\n }\n check (count: number) {\n count = +count || 0\n assert(count <= this.limit, this.message)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { TYPES, BLANK } from '../util'\n\nexport abstract class DelimitedToken extends Token {\n public trimLeft = false\n public trimRight = false\n public contentRange: [number, number]\n public constructor (\n kind: TokenKind,\n [contentBegin, contentEnd]: [number, number],\n input: string,\n begin: number,\n end: number,\n trimLeft: boolean,\n trimRight: boolean,\n file?: string\n ) {\n super(kind, input, begin, end, file)\n const tl = input[contentBegin] === '-'\n const tr = input[contentEnd - 1] === '-'\n\n let l = tl ? contentBegin + 1 : contentBegin\n let r = tr ? contentEnd - 1 : contentEnd\n while (l < r && (TYPES[input.charCodeAt(l)] & BLANK)) l++\n while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK)) r--\n\n this.contentRange = [l, r]\n this.trimLeft = tl || trimLeft\n this.trimRight = tr || trimRight\n }\n get content () {\n return this.input.slice(this.contentRange[0], this.contentRange[1])\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { Tokenizer, TokenKind } from '../parser'\nimport type { NormalizedFullOptions } from '../liquid-options'\n\nexport class TagToken extends DelimitedToken {\n public name: string\n public tokenizer: Tokenizer\n public readonly args: string;\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options\n const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length]\n super(TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file)\n\n this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange)\n this.name = this.tokenizer.readTagName()\n this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`)\n this.tokenizer.skipBlank()\n this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1])\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { TokenKind } from '../parser'\n\nexport class OutputToken extends DelimitedToken {\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options\n const valueRange: [number, number] = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length]\n super(TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class HTMLToken extends Token {\n trimLeft = 0\n trimRight = 0\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.HTML, input, begin, end, file)\n }\n public getContent () {\n return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class NumberToken extends Token {\n public content: number\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Number, input, begin, end, file)\n this.content = Number(this.getText())\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class IdentifierToken extends Token {\n public content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Word, input, begin, end, file)\n this.content = this.getText()\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { literalValues, LiteralValue } from '../util'\n\nexport class LiteralToken extends Token {\n public content: LiteralValue\n public literal: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Literal, input, begin, end, file)\n this.literal = this.getText()\n this.content = literalValues[this.literal]\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport const enum OperatorType {\n Binary,\n Unary\n}\n\nexport const operatorPrecedences = {\n '==': 2,\n '!=': 2,\n '>': 2,\n '<': 2,\n '>=': 2,\n '<=': 2,\n 'contains': 2,\n 'not': 1,\n 'and': 0,\n 'or': 0\n}\n\nexport const operatorTypes = {\n '==': OperatorType.Binary,\n '!=': OperatorType.Binary,\n '>': OperatorType.Binary,\n '<': OperatorType.Binary,\n '>=': OperatorType.Binary,\n '<=': OperatorType.Binary,\n 'contains': OperatorType.Binary,\n 'not': OperatorType.Unary,\n 'and': OperatorType.Binary,\n 'or': OperatorType.Binary\n}\n\nexport class OperatorToken extends Token {\n public operator: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Operator, input, begin, end, file)\n this.operator = this.getText()\n }\n getPrecedence () {\n const key = this.getText()\n return key in operatorPrecedences ? operatorPrecedences[key] : 1\n }\n}\n","import { Token } from './token'\nimport { LiteralToken } from './literal-token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { NumberToken } from './number-token'\nimport { RangeToken } from './range-token'\nimport { QuotedToken } from './quoted-token'\nimport { TokenKind } from '../parser'\n\nexport class PropertyAccessToken extends Token {\n constructor (\n public variable: QuotedToken | RangeToken | LiteralToken | NumberToken | undefined,\n public props: (ValueToken | IdentifierToken)[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.PropertyAccess, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { FilterArg } from '../parser/filter-arg'\nimport { TokenKind } from '../parser'\n\nexport class FilterToken extends Token {\n public constructor (\n public name: string,\n public args: FilterArg[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.Filter, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { TokenKind } from '../parser'\n\nexport class HashToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public name: IdentifierToken,\n public value?: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Hash, input, begin, end, file)\n }\n}\n","const rHex = /[\\da-fA-F]/\nconst rOct = /[0-7]/\nconst escapeChar = {\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t',\n v: '\\x0B'\n}\n\nfunction hexVal (c: string) {\n const code = c.charCodeAt(0)\n if (code >= 97) return code - 87\n if (code >= 65) return code - 55\n return code - 48\n}\n\nexport function parseStringLiteral (str: string): string {\n let ret = ''\n for (let i = 1; i < str.length - 1; i++) {\n if (str[i] !== '\\\\') {\n ret += str[i]\n continue\n }\n if (escapeChar[str[i + 1]] !== undefined) {\n ret += escapeChar[str[++i]]\n } else if (str[i + 1] === 'u') {\n let val = 0\n let j = i + 2\n while (j <= i + 5 && rHex.test(str[j])) {\n val = val * 16 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n } else if (!rOct.test(str[i + 1])) {\n ret += str[++i]\n } else {\n let j = i + 1\n let val = 0\n while (j <= i + 3 && rOct.test(str[j])) {\n val = val * 8 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n }\n }\n return ret\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { parseStringLiteral } from '../render/string'\n\nexport class QuotedToken extends Token {\n public readonly content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Quoted, input, begin, end, file)\n this.content = parseStringLiteral(this.getText())\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { TokenKind } from '../parser'\n\nexport class RangeToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public lhs: ValueToken,\n public rhs: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Range, input, begin, end, file)\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { Tokenizer, TokenKind } from '../parser'\n\n/**\n * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`\n */\nexport class LiquidTagToken extends DelimitedToken {\n public name: string\n public tokenizer: Tokenizer\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n super(TokenKind.Tag, [begin, end], input, begin, end, false, false, file)\n this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange)\n this.name = this.tokenizer.readTagName()\n this.tokenizer.assert(this.name, 'illegal liquid tag syntax')\n this.tokenizer.skipBlank()\n }\n\n get args (): string {\n return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1])\n }\n}\n","import { Token } from './token'\nimport { FilterToken } from './filter-token'\nimport { TokenKind } from '../parser'\nimport { Expression } from '../render'\n\n/**\n * value expression with optional filters\n * e.g.\n * {% assign foo=\"bar\" | append: \"coo\" %}\n */\nexport class FilteredValueToken extends Token {\n constructor (\n public initial: Expression,\n public filters: FilterToken[],\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.FilteredValue, input, begin, end, file)\n }\n}\n","interface LiquidPerformance {\n now: () => number\n}\n\nconst polyfill: LiquidPerformance = {\n now: () => Date.now()\n}\n\nexport function getPerformance (): LiquidPerformance {\n return (typeof global === 'object' && global.performance) ||\n (typeof window === 'object' && window.performance) ||\n polyfill\n}\n","import { getPerformance } from '../util/performance'\nimport { toPromise, RenderError, LiquidErrors, LiquidError } from '../util'\nimport { Context } from '../context'\nimport { Template } from '../template'\nimport { Emitter, KeepingTypeEmitter, StreamedEmitter, SimpleEmitter } from '../emitters'\n\nexport class Render {\n public renderTemplatesToNodeStream (templates: Template[], ctx: Context): NodeJS.ReadableStream {\n const emitter = new StreamedEmitter()\n Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter)))\n .then(() => emitter.end(), err => emitter.error(err))\n return emitter.stream\n }\n public * renderTemplates (templates: Template[], ctx: Context, emitter?: Emitter): IterableIterator<any> {\n if (!emitter) {\n emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter()\n }\n const errors = []\n for (const tpl of templates) {\n ctx.renderLimit.check(getPerformance().now())\n try {\n // if tpl.render supports emitter, it'll return empty `html`\n const html = yield tpl.render(ctx, emitter)\n // if not, it'll return an `html`, write to the emitter for it\n html && emitter.write(html)\n if (ctx.breakCalled || ctx.continueCalled) break\n } catch (e) {\n const err = LiquidError.is(e) ? e : new RenderError(e as Error, tpl)\n if (ctx.opts.catchAllErrors) errors.push(err)\n else throw err\n }\n }\n if (errors.length) {\n throw new LiquidErrors(errors)\n }\n return emitter.buffer\n }\n}\n","import { QuotedToken, RangeToken, OperatorToken, Token, PropertyAccessToken, OperatorType, operatorTypes } from '../tokens'\nimport { isRangeToken, isPropertyAccessToken, UndefinedVariableError, range, isOperatorToken, assert } from '../util'\nimport type { Context } from '../context'\nimport type { UnaryOperatorHandler } from '../render'\nimport { Drop } from '../drop'\n\nexport class Expression {\n readonly postfix: Token[]\n\n public constructor (tokens: IterableIterator<Token>) {\n this.postfix = [...toPostfix(tokens)]\n }\n public * evaluate (ctx: Context, lenient?: boolean): Generator<unknown, unknown, unknown> {\n assert(ctx, 'unable to evaluate: context not defined')\n const operands: any[] = []\n for (const token of this.postfix) {\n if (isOperatorToken(token)) {\n const r = operands.pop()\n let result\n if (operatorTypes[token.operator] === OperatorType.Unary) {\n result = yield (ctx.opts.operators[token.operator] as UnaryOperatorHandler)(r, ctx)\n } else {\n const l = operands.pop()\n result = yield ctx.opts.operators[token.operator](l, r, ctx)\n }\n operands.push(result)\n } else {\n operands.push(yield evalToken(token, ctx, lenient))\n }\n }\n return operands[0]\n }\n public valid () {\n return !!this.postfix.length\n }\n}\n\nexport function * evalToken (token: Token | undefined, ctx: Context, lenient = false): IterableIterator<unknown> {\n if (!token) return\n if ('content' in token) return token.content\n if (isPropertyAccessToken(token)) return yield evalPropertyAccessToken(token, ctx, lenient)\n if (isRangeToken(token)) return yield evalRangeToken(token, ctx)\n}\n\nfunction * evalPropertyAccessToken (token: PropertyAccessToken, ctx: Context, lenient: boolean): IterableIterator<unknown> {\n const props: (string | number | Drop)[] = []\n for (const prop of token.props) {\n props.push((yield evalToken(prop, ctx, false)) as unknown as string | number | Drop)\n }\n try {\n if (token.variable) {\n const variable = yield evalToken(token.variable, ctx, lenient)\n return yield ctx._getFromScope(variable, props)\n } else {\n return yield ctx._get(props)\n }\n } catch (e) {\n if (lenient && (e as Error).name === 'InternalUndefinedVariableError') return null\n throw (new UndefinedVariableError(e as Error, token))\n }\n}\n\nexport function evalQuotedToken (token: QuotedToken) {\n return token.content\n}\n\nfunction * evalRangeToken (token: RangeToken, ctx: Context) {\n const low: number = yield evalToken(token.lhs, ctx)\n const high: number = yield evalToken(token.rhs, ctx)\n ctx.memoryLimit.use(high - low + 1)\n return range(+low, +high + 1)\n}\n\nfunction * toPostfix (tokens: IterableIterator<Token>): IterableIterator<Token> {\n const ops: OperatorToken[] = []\n for (const token of tokens) {\n if (isOperatorToken(token)) {\n while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {\n yield ops.pop()!\n }\n ops.push(token)\n } else yield token\n }\n while (ops.length) {\n yield ops.pop()!\n }\n}\n","import { Context } from '../context/context'\nimport { toValue } from '../util'\n\nexport function isTruthy (val: any, ctx: Context): boolean {\n return !isFalsy(val, ctx)\n}\n\nexport function isFalsy (val: any, ctx: Context): boolean {\n val = toValue(val)\n\n if (ctx.opts.jsTruthy) {\n return !val\n } else {\n return val === false || undefined === val || val === null\n }\n}\n","import { isComparable } from '../drop/comparable'\nimport { Context } from '../context'\nimport { toValue } from '../util'\nimport { isFalsy, isTruthy } from '../render/boolean'\nimport { isArray, isFunction } from '../util/underscore'\n\nexport type UnaryOperatorHandler = (operand: any, ctx: Context) => boolean;\nexport type BinaryOperatorHandler = (lhs: any, rhs: any, ctx: Context) => boolean;\nexport type OperatorHandler = UnaryOperatorHandler | BinaryOperatorHandler;\nexport type Operators = Record<string, OperatorHandler>\n\nexport const defaultOperators: Operators = {\n '==': equals,\n '!=': (l: any, r: any) => !equals(l, r),\n '>': (l: any, r: any) => {\n if (isComparable(l)) return l.gt(r)\n if (isComparable(r)) return r.lt(l)\n return toValue(l) > toValue(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 toValue(l) < toValue(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 toValue(l) >= toValue(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 toValue(l) <= toValue(r)\n },\n 'contains': (l: any, r: any) => {\n l = toValue(l)\n if (isArray(l)) return l.some((i) => equals(i, r))\n if (isFunction(l?.indexOf)) return l.indexOf(toValue(r)) > -1\n return false\n },\n 'not': (v: any, ctx: Context) => isFalsy(toValue(v), ctx),\n 'and': (l: any, r: any, ctx: Context) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx),\n 'or': (l: any, r: any, ctx: Context) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx)\n}\n\nexport function equals (lhs: any, rhs: any): boolean {\n if (isComparable(lhs)) return lhs.equals(rhs)\n if (isComparable(rhs)) return rhs.equals(lhs)\n lhs = toValue(lhs)\n rhs = toValue(rhs)\n if (isArray(lhs)) {\n return isArray(rhs) && arrayEquals(lhs, rhs)\n }\n return lhs === rhs\n}\n\nfunction arrayEquals (lhs: any[], rhs: any[]): boolean {\n if (lhs.length !== rhs.length) return false\n return !lhs.some((value, i) => !equals(value, rhs[i]))\n}\n\nexport function arrayIncludes (arr: any[], item: any): boolean {\n return arr.some(value => equals(value, item))\n}\n","import { Cache } from './cache'\n\nclass Node<T> {\n constructor (\n public key: string,\n public value: T,\n public next: Node<T>,\n public prev: Node<T>\n ) {}\n}\n\nexport class LRU<T> implements Cache<T> {\n private cache: Record<string, Node<T>> = {}\n private head: Node<T>\n private tail: Node<T>\n\n constructor (\n public limit: number,\n public size = 0\n ) {\n this.head = new Node<T>('HEAD', null as any, null as any, null as any)\n this.tail = new Node<T>('TAIL', null as any, null as any, null as any)\n this.head.next = this.tail\n this.tail.prev = this.head\n }\n\n write (key: string, value: T) {\n if (this.cache[key]) {\n this.cache[key].value = value\n } else {\n const node = new Node(key, value, this.head.next, this.head)\n this.head.next.prev = node\n this.head.next = node\n\n this.cache[key] = node\n this.size++\n this.ensureLimit()\n }\n }\n\n read (key: string): T | undefined {\n if (!this.cache[key]) return\n const { value } = this.cache[key]\n this.remove(key)\n this.write(key, value)\n return value\n }\n\n remove (key: string) {\n const node = this.cache[key]\n node.prev.next = node.next\n node.next.prev = node.prev\n delete this.cache[key]\n this.size--\n }\n\n clear () {\n this.head.next = this.tail\n this.tail.prev = this.head\n this.size = 0\n this.cache = {}\n }\n\n private ensureLimit () {\n if (this.size > this.limit) this.remove(this.tail.prev.key)\n }\n}\n","import { last } from '../util'\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\nexport function 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\nexport async function readFile (url: string): Promise<string> {\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\nexport function readFileSync (url: string): string {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, false)\n xhr.send()\n if (xhr.status < 200 || xhr.status >= 300) {\n throw new Error(xhr.statusText)\n }\n return xhr.responseText as string\n}\n\nexport async function exists (filepath: string) {\n return true\n}\n\nexport function existsSync (filepath: string) {\n return true\n}\n\nexport function dirname (filepath: string) {\n return domResolve(filepath, '.')\n}\n\nexport const sep = '/'\n","import { isFalsy } from '../render/boolean'\nimport { identify, isArray, isString, toValue } from '../util/underscore'\nimport { FilterImpl } from '../template'\n\nfunction defaultFilter<T1 extends boolean, T2> (this: FilterImpl, value: T1, defaultValue: T2, ...args: Array<[string, any]>): T1 | T2 {\n value = toValue(value)\n if (isArray(value) || isString(value)) return value.length ? value : defaultValue\n if (value === false && (new Map(args)).get('allow_false')) return false as T1\n return isFalsy(value, this.context) ? defaultValue : value\n}\n\nfunction json (value: any, space = 0) {\n return JSON.stringify(value, null, space)\n}\n\nfunction inspect (value: any, space = 0) {\n const ancestors: object[] = []\n return JSON.stringify(value, function (this: unknown, _key: unknown, value: any) {\n if (typeof value !== 'object' || value === null) return value\n // `this` is the object that value is contained in, i.e., its direct parent.\n while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) ancestors.pop()\n if (ancestors.includes(value)) return '[Circular]'\n ancestors.push(value)\n return value\n }, space)\n}\n\nfunction to_integer (value: any) {\n return Number(value)\n}\n\nconst raw = {\n raw: true,\n handler: identify\n}\n\nexport default {\n default: defaultFilter,\n raw,\n jsonify: json,\n to_integer,\n json,\n inspect\n}\n","import { FilterImpl } from '../template'\nimport { stringify } from '../util/underscore'\n\nconst escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\nconst unescapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n}\n\nexport function escape (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.replace(/&|<|>|\"|'/g, m => escapeMap[m])\n}\n\nexport function xml_escape (this: FilterImpl, str: string) {\n return escape.call(this, str)\n}\n\nfunction unescape (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m])\n}\n\nexport function escape_once (this: FilterImpl, str: string) {\n return escape.call(this, unescape.call(this, str))\n}\n\nexport function newline_to_br (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\r?\\n/gm, '<br />\\n')\n}\n\nexport function strip_html (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/<script[\\s\\S]*?<\\/script>|<style[\\s\\S]*?<\\/style>|<.*?>|<!--[\\s\\S]*?-->/g, '')\n}\n","import { isNil } from '../util'\n\nexport class MapFS {\n constructor (private mapping: {[key: string]: string}) {}\n\n public sep = '/'\n\n async exists (filepath: string) {\n return this.existsSync(filepath)\n }\n\n existsSync (filepath: string) {\n return !isNil(this.mapping[filepath])\n }\n\n async readFile (filepath: string) {\n return this.readFileSync(filepath)\n }\n\n readFileSync (filepath: string) {\n const content = this.mapping[filepath]\n if (isNil(content)) throw new Error(`ENOENT: ${filepath}`)\n return content\n }\n\n dirname (filepath: string) {\n const segments = filepath.split(this.sep)\n segments.pop()\n return segments.join(this.sep)\n }\n\n resolve (dir: string, file: string, ext: string) {\n file += ext\n if (dir === '.') return file\n const segments = dir.split(/\\/+/)\n for (const segment of file.split(this.sep)) {\n if (segment === '.' || segment === '') continue\n else if (segment === '..') {\n if (segments.length > 1 || segments[0] !== '') segments.pop()\n } else segments.push(segment)\n }\n return segments.join(this.sep)\n }\n}\n","import { assert, isArray, isString, isFunction } from './util'\nimport { getDateTimeFormat } from './util/intl'\nimport { LRU, LiquidCache } from './cache'\nimport { FS, LookupType } from './fs'\nimport * as fs from './fs/fs-impl'\nimport { defaultOperators, Operators } from './render'\nimport misc from './filters/misc'\nimport { escape } from './filters/html'\nimport { MapFS } from './fs/map-fs'\n\ntype OutputEscape = (value: any) => string\ntype OutputEscapeOption = 'escape' | 'json' | OutputEscape\n\nexport interface LiquidOptions {\n /** A directory or an array of directories from where to resolve layout and include templates, and the filename passed to `.renderFile()`. If it's an array, the files are looked up in the order they occur in the array. Defaults to `[\".\"]` */\n root?: string | string[];\n /** A directory or an array of directories from where to resolve included templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n partials?: string | string[];\n /** A directory or an array of directories from where to resolve layout templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n layouts?: string | string[];\n /** Allow refer to layouts/partials by relative pathname. To avoid arbitrary filesystem read, paths been referenced also need to be within corresponding root, partials, layouts. Defaults to `true`. */\n relativeReference?: boolean;\n /** Use jekyll style include, pass parameters to `include` variable of current scope. Defaults to `false`. */\n jekyllInclude?: boolean;\n /** Use jekyll style where filter, enables array item match. Defaults to `false`. */\n jekyllWhere?: boolean;\n /** Add a extname (if filepath doesn't include one) before template file lookup. Eg: setting to `\".html\"` will allow including file by basename. Defaults to `\"\"`. */\n extname?: string;\n /** Whether or not to cache resolved templates. Defaults to `false`. */\n cache?: boolean | number | LiquidCache;\n /** Use JavaScript Truthiness. Defaults to `false`. */\n jsTruthy?: boolean;\n /** If set, treat the `filepath` parameter in `{%include filepath %}` and `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */\n dynamicPartials?: boolean;\n /** Whether or not to assert filter existence. If set to `false`, undefined filters will be skipped. Otherwise, undefined filters will cause an exception. Defaults to `false`. */\n strictFilters?: boolean;\n /** Whether or not to assert variable existence. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */\n strictVariables?: boolean;\n /** Catch all errors instead of exit upon one. Please note that render errors won't be reached when parse fails. */\n catchAllErrors?: boolean;\n /** Hide scope variables from prototypes, useful when you're passing a not sanitized object into LiquidJS or need to hide prototypes from templates. */\n ownPropertyOnly?: boolean;\n /** Modifies the behavior of `strictVariables`. If set, a single undefined variable will *not* cause an exception in the context of the `if`/`elsif`/`unless` tag and the `default` filter. Instead, it will evaluate to `false` and `null`, respectively. Irrelevant if `strictVariables` is not set. Defaults to `false`. **/\n lenientIf?: boolean;\n /** JavaScript timezone name or timezoneOffset for `date` filter, default to local time. That means if you're in Australia (UTC+10), it'll default to `-600` or `Australia/Lindeman` */\n timezoneOffset?: number | string;\n /** Default date format to use if the date filter doesn't include a format. Defaults to `%A, %B %-e, %Y at %-l:%M %P %z`. */\n dateFormat?: string;\n /** Default locale, will be used by date filter. Defaults to system locale. */\n locale?: string;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of tags (`{% %}`) until `\\n` (inclusive). Defaults to `false`. */\n trimTagRight?: boolean;\n /** Similar to `trimTagRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimTagLeft?: boolean;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of values (`{{ }}`) until `\\n` (inclusive). Defaults to `false`. */\n trimOutputRight?: boolean;\n /** Similar to `trimOutputRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimOutputLeft?: boolean;\n /** The left delimiter for liquid tags. **/\n tagDelimiterLeft?: string;\n /** The right delimiter for liquid tags. **/\n tagDelimiterRight?: string;\n /** The left delimiter for liquid outputs. **/\n outputDelimiterLeft?: string;\n /** The right delimiter for liquid outputs. **/\n outputDelimiterRight?: string;\n /** Whether input strings to date filter preserve the given timezone **/\n preserveTimezones?: boolean;\n /** Whether `trim*Left`/`trim*Right` is greedy. When set to `true`, all consecutive blank characters including `\\n` will be trimmed regardless of line breaks. Defaults to `true`. */\n greedy?: boolean;\n /** `fs` is used to override the default file-system module with a custom implementation. */\n fs?: FS;\n /** keyValue separator */\n keyValueSeparator?: string;\n /** Render from in-memory `templates` mapping instead of file system. File system related options like `fs`, 'root', and `relativeReference` will be ignored when `templates` is specified. */\n templates?: {[key: string]: string};\n /** the global scope passed down to all partial and layout templates, i.e. templates included by `include`, `layout` and `render` tags. */\n globals?: object;\n /** Whether or not to keep value type when writing the Output, not working for streamed rendering. Defaults to `false`. */\n keepOutputType?: boolean;\n /** Default escape filter applied to output values, when set, you'll have to add `| raw` for values don't need to be escaped. Defaults to `undefined`. */\n outputEscape?: OutputEscapeOption;\n /** An object of operators for conditional statements. Defaults to the regular Liquid operators. */\n operators?: Operators;\n /** Respect parameter order when using filters like \"for ... reversed limit\", Defaults to `false`. */\n orderedFilterParameters?: boolean;\n /** For DoS handling, limit total length of templates parsed in one `parse()` call. A typical PC can handle 1e8 (100M) characters without issues. */\n parseLimit?: number;\n /** For DoS handling, limit total time (in ms) for each `render()` call. */\n renderLimit?: number;\n /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue. */\n memoryLimit?: number;\n}\n\nexport interface RenderOptions {\n /**\n * This call is sync or async? It's used by Liquid internal methods, you'll not need this.\n */\n sync?: boolean;\n /**\n * Same as `globals` on LiquidOptions, but only for current render() call\n */\n globals?: object;\n /**\n * Same as `strictVariables` on LiquidOptions, but only for current render() call\n */\n strictVariables?: boolean;\n /**\n * Same as `ownPropertyOnly` on LiquidOptions, but only for current render() call\n */\n ownPropertyOnly?: boolean;\n /** For DoS handling, limit total renders of tag/HTML/output in one `render()` call. A typical PC can handle 1e5 renders of typical templates per second. */\n templateLimit?: number;\n /** For DoS handling, limit total time (in ms) for each `render()` call. */\n renderLimit?: number;\n /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue.. */\n memoryLimit?: number;\n}\n\nexport interface RenderFileOptions extends RenderOptions {\n lookupType?: LookupType;\n}\n\ninterface NormalizedOptions extends LiquidOptions {\n root?: string[];\n partials?: string[];\n layouts?: string[];\n cache?: LiquidCache;\n outputEscape?: OutputEscape;\n}\n\nexport interface NormalizedFullOptions extends NormalizedOptions {\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n jekyllInclude: boolean;\n extname: string;\n cache?: LiquidCache;\n jsTruthy: boolean;\n dynamicPartials: boolean;\n fs: FS;\n strictFilters: boolean;\n strictVariables: boolean;\n ownPropertyOnly: boolean;\n lenientIf: boolean;\n dateFormat: string;\n locale: string;\n trimTagRight: boolean;\n trimTagLeft: boolean;\n trimOutputRight: boolean;\n trimOutputLeft: boolean;\n tagDelimiterLeft: string;\n tagDelimiterRight: string;\n outputDelimiterLeft: string;\n outputDelimiterRight: string;\n preserveTimezones: boolean;\n greedy: boolean;\n globals: object;\n keepOutputType: boolean;\n operators: Operators;\n parseLimit: number;\n renderLimit: number;\n memoryLimit: number;\n}\n\nexport const defaultOptions: NormalizedFullOptions = {\n root: ['.'],\n layouts: ['.'],\n partials: ['.'],\n relativeReference: true,\n jekyllInclude: false,\n keyValueSeparator: ':',\n cache: undefined,\n extname: '',\n fs: fs,\n dynamicPartials: true,\n jsTruthy: false,\n dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',\n locale: '',\n trimTagRight: false,\n trimTagLeft: false,\n trimOutputRight: false,\n trimOutputLeft: false,\n greedy: true,\n tagDelimiterLeft: '{%',\n tagDelimiterRight: '%}',\n outputDelimiterLeft: '{{',\n outputDelimiterRight: '}}',\n preserveTimezones: false,\n strictFilters: false,\n strictVariables: false,\n ownPropertyOnly: true,\n lenientIf: false,\n globals: {},\n keepOutputType: false,\n operators: defaultOperators,\n memoryLimit: Infinity,\n parseLimit: Infinity,\n renderLimit: Infinity\n}\n\nexport function normalize (options: LiquidOptions): NormalizedFullOptions {\n if (options.hasOwnProperty('root')) {\n if (!options.hasOwnProperty('partials')) options.partials = options.root\n if (!options.hasOwnProperty('layouts')) options.layouts = options.root\n }\n if (options.hasOwnProperty('cache')) {\n let cache: LiquidCache | undefined\n if (typeof options.cache === 'number') cache = options.cache > 0 ? new LRU(options.cache) : undefined\n else if (typeof options.cache === 'object') cache = options.cache\n else cache = options.cache ? new LRU(1024) : undefined\n options.cache = cache\n }\n options = { ...defaultOptions, ...(options.jekyllInclude ? { dynamicPartials: false } : {}), ...options }\n if ((!options.fs!.dirname || !options.fs!.sep) && options.relativeReference) {\n console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning')\n options.relativeReference = false\n }\n options.root = normalizeDirectoryList(options.root)\n options.partials = normalizeDirectoryList(options.partials)\n options.layouts = normalizeDirectoryList(options.layouts)\n options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape)\n if (!options.locale) {\n options.locale = getDateTimeFormat()?.().resolvedOptions().locale ?? 'en-US'\n }\n if (options.templates) {\n options.fs = new MapFS(options.templates)\n options.relativeReference = true\n options.root = options.partials = options.layouts = '.'\n }\n return options as NormalizedFullOptions\n}\n\nfunction getOutputEscapeFunction (nameOrFunction: OutputEscapeOption): OutputEscape {\n if (nameOrFunction === 'escape') return escape\n if (nameOrFunction === 'json') return misc.json\n assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function')\n return nameOrFunction\n}\n\nexport function normalizeDirectoryList (value: any): string[] {\n let list: string[] = []\n if (isArray(value)) list = value\n if (isString(value)) list = [value]\n return list\n}\n","import { Token } from '../tokens'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { isTagToken, isHTMLToken, isDelimitedToken, TYPES, INLINE_BLANK, BLANK } from '../util'\n\nexport function whiteSpaceCtrl (tokens: Token[], options: NormalizedFullOptions) {\n let inRaw = false\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n if (!isDelimitedToken(token)) continue\n if (!inRaw && token.trimLeft) {\n trimLeft(tokens[i - 1], options.greedy)\n }\n\n if (isTagToken(token)) {\n if (token.name === 'raw') inRaw = true\n else if (token.name === 'endraw') inRaw = false\n }\n\n if (!inRaw && token.trimRight) {\n trimRight(tokens[i + 1], options.greedy)\n }\n }\n}\n\nfunction trimLeft (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) token.trimRight++\n}\n\nfunction trimRight (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) token.trimLeft++\n if (token.input.charAt(token.begin + token.trimLeft) === '\\n') token.trimLeft++\n}\n","import { FilteredValueToken, TagToken, HTMLToken, HashToken, QuotedToken, LiquidTagToken, OutputToken, ValueToken, Token, RangeToken, FilterToken, TopLevelToken, PropertyAccessToken, OperatorToken, LiteralToken, IdentifierToken, NumberToken } from '../tokens'\nimport { OperatorHandler } from '../render/operator'\nimport { TrieNode, LiteralValue, Trie, createTrie, ellipsis, literalValues, TokenizationError, TYPES, QUOTE, BLANK, NUMBER, SIGN, isWord, isString } from '../util'\nimport { Operators, Expression } from '../render'\nimport { NormalizedFullOptions, defaultOptions } from '../liquid-options'\nimport { FilterArg } from './filter-arg'\nimport { whiteSpaceCtrl } from './whitespace-ctrl'\n\nexport class Tokenizer {\n p: number\n N: number\n private rawBeginAt = -1\n private opTrie: Trie<OperatorHandler>\n private literalTrie: Trie<LiteralValue>\n\n constructor (\n public input: string,\n operators: Operators = defaultOptions.operators,\n public file?: string,\n range?: [number, number]\n ) {\n this.p = range ? range[0] : 0\n this.N = range ? range[1] : input.length\n this.opTrie = createTrie(operators)\n this.literalTrie = createTrie(literalValues)\n }\n\n readExpression () {\n return new Expression(this.readExpressionTokens())\n }\n\n * readExpressionTokens (): IterableIterator<Token> {\n while (this.p < this.N) {\n const operator = this.readOperator()\n if (operator) {\n yield operator\n continue\n }\n const operand = this.readValue()\n if (operand) {\n yield operand\n continue\n }\n return\n }\n }\n readOperator (): OperatorToken | undefined {\n this.skipBlank()\n const end = this.matchTrie(this.opTrie)\n if (end === -1) return\n return new OperatorToken(this.input, this.p, (this.p = end), this.file)\n }\n matchTrie<T> (trie: Trie<T>) {\n let node: TrieNode<T> = trie\n let i = this.p\n let info\n while (node[this.input[i]] && i < this.N) {\n node = node[this.input[i++]]\n if (node['end']) info = node\n }\n if (!info) return -1\n if (info['needBoundary'] && isWord(this.peek(i - this.p))) return -1\n return i\n }\n readFilteredValue (): FilteredValueToken {\n const begin = this.p\n const initial = this.readExpression()\n this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`)\n const filters = this.readFilters()\n return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file)\n }\n readFilters (): FilterToken[] {\n const filters = []\n while (true) {\n const filter = this.readFilter()\n if (!filter) return filters\n filters.push(filter)\n }\n }\n readFilter (): FilterToken | null {\n this.skipBlank()\n if (this.end()) return null\n this.assert(this.read() === '|', `expected \"|\" before filter`)\n const name = this.readIdentifier()\n if (!name.size()) {\n this.assert(this.end(), `expected filter name`)\n return null\n }\n const args = []\n this.skipBlank()\n if (this.peek() === ':') {\n do {\n ++this.p\n const arg = this.readFilterArg()\n arg && args.push(arg)\n this.skipBlank()\n this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`)\n } while (this.peek() === ',')\n } else if (this.peek() === '|' || this.end()) {\n // do nothing\n } else {\n throw this.error('expected \":\" after filter name')\n }\n return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file)\n }\n\n readFilterArg (): FilterArg | undefined {\n const key = this.readValue()\n if (!key) return\n this.skipBlank()\n if (this.peek() !== ':') return key\n ++this.p\n const value = this.readValue()\n return [key.getText(), value]\n }\n\n readTopLevelTokens (options: NormalizedFullOptions = defaultOptions): TopLevelToken[] {\n const tokens: TopLevelToken[] = []\n while (this.p < this.N) {\n const token = this.readTopLevelToken(options)\n tokens.push(token)\n }\n whiteSpaceCtrl(tokens, options)\n return tokens\n }\n\n readTopLevelToken (options: NormalizedFullOptions): TopLevelToken {\n const { tagDelimiterLeft, outputDelimiterLeft } = options\n if (this.rawBeginAt > -1) return this.readEndrawOrRawContent(options)\n if (this.match(tagDelimiterLeft)) return this.readTagToken(options)\n if (this.match(outputDelimiterLeft)) return this.readOutputToken(options)\n return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft])\n }\n\n readHTMLToken (stopStrings: string[]): HTMLToken {\n const begin = this.p\n while (this.p < this.N) {\n if (stopStrings.some(str => this.match(str))) break\n ++this.p\n }\n return new HTMLToken(this.input, begin, this.p, this.file)\n }\n\n readTagToken (options: NormalizedFullOptions): TagToken {\n const { file, input } = this\n const begin = this.p\n if (this.readToDelimiter(options.tagDelimiterRight) === -1) {\n throw this.error(`tag ${this.snapshot(begin)} not closed`, begin)\n }\n const token = new TagToken(input, begin, this.p, options, file)\n if (token.name === 'raw') this.rawBeginAt = begin\n return token\n }\n\n readToDelimiter (delimiter: string, respectQuoted = false) {\n this.skipBlank()\n while (this.p < this.N) {\n if (respectQuoted && (this.peekType() & QUOTE)) {\n this.readQuoted()\n continue\n }\n ++this.p\n if (this.rmatch(delimiter)) return this.p\n }\n return -1\n }\n\n readOutputToken (options: NormalizedFullOptions = defaultOptions): OutputToken {\n const { file, input } = this\n const { outputDelimiterRight } = options\n const begin = this.p\n if (this.readToDelimiter(outputDelimiterRight, true) === -1) {\n throw this.error(`output ${this.snapshot(begin)} not closed`, begin)\n }\n return new OutputToken(input, begin, this.p, options, file)\n }\n\n readEndrawOrRawContent (options: NormalizedFullOptions): HTMLToken | TagToken {\n const { tagDelimiterLeft, tagDelimiterRight } = options\n const begin = this.p\n let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n while (this.p < this.N) {\n if (this.readIdentifier().getText() !== 'endraw') {\n leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n continue\n }\n while (this.p <= this.N) {\n if (this.rmatch(tagDelimiterRight)) {\n const end = this.p\n if (begin === leftPos) {\n this.rawBeginAt = -1\n return new TagToken(this.input, begin, end, options, this.file)\n } else {\n this.p = leftPos\n return new HTMLToken(this.input, begin, leftPos, this.file)\n }\n }\n if (this.rmatch(tagDelimiterLeft)) break\n this.p++\n }\n }\n throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin)\n }\n\n readLiquidTagTokens (options: NormalizedFullOptions = defaultOptions): LiquidTagToken[] {\n const tokens: LiquidTagToken[] = []\n while (this.p < this.N) {\n const token = this.readLiquidTagToken(options)\n token && tokens.push(token)\n }\n return tokens\n }\n\n readLiquidTagToken (options: NormalizedFullOptions): LiquidTagToken | undefined {\n this.skipBlank()\n if (this.end()) return\n\n const begin = this.p\n this.readToDelimiter('\\n')\n const end = this.p\n return new LiquidTagToken(this.input, begin, end, options, this.file)\n }\n\n error (msg: string, pos: number = this.p) {\n return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file))\n }\n\n assert (pred: unknown, msg: string | (() => string), pos?: number) {\n if (!pred) throw this.error(typeof msg === 'function' ? msg() : msg, pos)\n }\n\n snapshot (begin: number = this.p) {\n return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32))\n }\n\n /**\n * @deprecated use #readIdentifier instead\n */\n readWord () {\n return this.readIdentifier()\n }\n\n readIdentifier (): IdentifierToken {\n this.skipBlank()\n const begin = this.p\n while (!this.end() && isWord(this.peek())) ++this.p\n return new IdentifierToken(this.input, begin, this.p, this.file)\n }\n\n readNonEmptyIdentifier (): IdentifierToken | undefined {\n const id = this.readIdentifier()\n return id.size() ? id : undefined\n }\n\n readTagName (): string {\n this.skipBlank()\n // Handle inline comment tags\n if (this.input[this.p] === '#') return this.input.slice(this.p, ++this.p)\n return this.readIdentifier().getText()\n }\n\n readHashes (jekyllStyle?: boolean | string) {\n const hashes = []\n while (true) {\n const hash = this.readHash(jekyllStyle)\n if (!hash) return hashes\n hashes.push(hash)\n }\n }\n\n readHash (jekyllStyle?: boolean | string): HashToken | undefined {\n this.skipBlank()\n if (this.peek() === ',') ++this.p\n const begin = this.p\n const name = this.readNonEmptyIdentifier()\n if (!name) return\n let value\n\n this.skipBlank()\n const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':')\n if (this.peek() === sep) {\n ++this.p\n value = this.readValue()\n }\n return new HashToken(this.input, begin, this.p, name, value, this.file)\n }\n\n remaining () {\n return this.input.slice(this.p, this.N)\n }\n\n advance (step = 1) {\n this.p += step\n }\n\n end () {\n return this.p >= this.N\n }\n read () {\n return this.input[this.p++]\n }\n readTo (end: string): number {\n while (this.p < this.N) {\n ++this.p\n if (this.rmatch(end)) return this.p\n }\n return -1\n }\n\n readValue (): ValueToken | undefined {\n this.skipBlank()\n const begin = this.p\n const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber()\n const props = this.readProperties(!variable)\n if (!props.length) return variable\n return new PropertyAccessToken(variable, props, this.input, begin, this.p)\n }\n\n readScopeValue (): ValueToken | undefined {\n this.skipBlank()\n const begin = this.p\n const props = this.readProperties()\n if (!props.length) return undefined\n return new PropertyAccessToken(undefined, props, this.input, begin, this.p)\n }\n\n private readProperties (isBegin = true): (ValueToken | IdentifierToken)[] {\n const props: (ValueToken | IdentifierToken)[] = []\n while (true) {\n if (this.peek() === '[') {\n this.p++\n const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file)\n this.assert(this.readTo(']') !== -1, '[ not closed')\n props.push(prop)\n continue\n }\n if (isBegin && !props.length) {\n const prop = this.readNonEmptyIdentifier()\n if (prop) {\n props.push(prop)\n continue\n }\n }\n if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax\n this.p++\n const prop = this.readNonEmptyIdentifier()\n if (!prop) break\n props.push(prop)\n continue\n }\n break\n }\n return props\n }\n\n readNumber (): NumberToken | undefined {\n this.skipBlank()\n let decimalFound = false\n let digitFound = false\n let n = 0\n if (this.peekType() & SIGN) n++\n while (this.p + n <= this.N) {\n if (this.peekType(n) & NUMBER) {\n digitFound = true\n n++\n } else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') {\n if (decimalFound || !digitFound) return\n decimalFound = true\n n++\n } else break\n }\n if (digitFound && !isWord(this.peek(n))) {\n const num = new NumberToken(this.input, this.p, this.p + n, this.file)\n this.advance(n)\n return num\n }\n }\n\n readLiteral (): LiteralToken | undefined {\n this.skipBlank()\n const end = this.matchTrie(this.literalTrie)\n if (end === -1) return\n const literal = new LiteralToken(this.input, this.p, end, this.file)\n this.p = end\n return literal\n }\n\n readRange (): RangeToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (this.peek() !== '(') return\n ++this.p\n const lhs = this.readValueOrThrow()\n this.skipBlank()\n this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax')\n const rhs = this.readValueOrThrow()\n this.skipBlank()\n this.assert(this.read() === ')', 'invalid range syntax')\n return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file)\n }\n\n readValueOrThrow (): ValueToken {\n const value = this.readValue()\n this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`)\n return value!\n }\n\n readQuoted (): QuotedToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (!(this.peekType() & QUOTE)) return\n ++this.p\n let escaped = false\n while (this.p < this.N) {\n ++this.p\n if (this.input[this.p - 1] === this.input[begin] && !escaped) break\n if (escaped) escaped = false\n else if (this.input[this.p - 1] === '\\\\') escaped = true\n }\n return new QuotedToken(this.input, begin, this.p, this.file)\n }\n\n * readFileNameTemplate (options: NormalizedFullOptions): IterableIterator<TopLevelToken> {\n const { outputDelimiterLeft } = options\n const htmlStopStrings = [',', ' ', outputDelimiterLeft]\n const htmlStopStringSet = new Set(htmlStopStrings)\n // break on ',' and ' ', outputDelimiterLeft only stops HTML token\n while (this.p < this.N && !htmlStopStringSet.has(this.peek())) {\n yield this.match(outputDelimiterLeft)\n ? this.readOutputToken(options)\n : this.readHTMLToken(htmlStopStrings)\n }\n }\n\n match (word: string) {\n for (let i = 0; i < word.length; i++) {\n if (word[i] !== this.input[this.p + i]) return false\n }\n return true\n }\n\n rmatch (pattern: string) {\n for (let i = 0; i < pattern.length; i++) {\n if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) return false\n }\n return true\n }\n\n peekType (n = 0) {\n return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)]\n }\n\n peek (n = 0): string {\n return this.p + n >= this.N ? '' : this.input[this.p + n]\n }\n\n skipBlank () {\n while (this.peekType() & BLANK) ++this.p\n }\n}\n","import { Token, TopLevelToken } from '../tokens'\nimport { Template } from '../template'\nimport { isTagToken } from '../util'\n\ntype ParseToken<T extends Token> = ((token: T, remainTokens: T[]) => Template)\n\nexport class ParseStream<T extends Token = TopLevelToken> {\n private tokens: T[]\n private handlers: Record<string, (arg: any) => void> = {}\n private stopRequested = false\n private parseToken: ParseToken<T>\n\n public constructor (tokens: T[], parseToken: ParseToken<T>) {\n this.tokens = tokens\n this.parseToken = parseToken\n }\n public on<T2 extends Template | T | undefined> (name: string, cb: (this: ParseStream, arg: T2) => void): ParseStream<T> {\n this.handlers[name] = cb\n return this\n }\n private trigger <T extends Token | Template> (event: string, arg?: T) {\n const h = this.handlers[event]\n return h ? (h.call(this, arg), true) : false\n }\n public start () {\n this.trigger('start')\n let token: T | undefined\n while (!this.stopRequested && (token = this.tokens.shift())) {\n if (this.trigger('token', token)) continue\n if (isTagToken(token) && 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 public stop () {\n this.stopRequested = true\n return this\n }\n}\n","export abstract class TemplateImpl<T> {\n public token: T;\n public constructor (token: T) {\n this.token = token\n }\n}\n","import { TemplateImpl } from './template-impl'\nimport type { Emitter } from '../emitters/emitter'\nimport type { Parser, Tokenizer } from '../parser'\nimport type { Context } from '../context/context'\nimport type { TopLevelToken, TagToken } from '../tokens'\nimport type { Template } from './template'\nimport type { Liquid } from '../liquid'\n\nexport type TagRenderReturn = Generator<unknown, unknown, unknown> | Promise<unknown> | unknown\n\nexport abstract class Tag extends TemplateImpl<TagToken> implements Template {\n public name: string\n public liquid: Liquid\n protected tokenizer: Tokenizer\n\n public constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token)\n this.name = token.name\n this.liquid = liquid\n this.tokenizer = token.tokenizer\n }\n public abstract render (ctx: Context, emitter: Emitter): TagRenderReturn;\n}\n\nexport interface TagClass {\n new(token: TagToken, tokens: TopLevelToken[], liquid: Liquid, parser: Parser): Tag\n}\n","import { evalToken } from '../render/expression'\nimport { Context } from '../context/context'\nimport { Tokenizer } from '../parser/tokenizer'\nimport { Token } from '../tokens/token'\n\ntype HashValueTokens = Record<string, Token | undefined>\n\n/**\n * Key-Value Pairs Representing Tag Arguments\n * Example:\n * For the markup `, foo:'bar', coo:2 reversed %}`,\n * hash['foo'] === 'bar'\n * hash['coo'] === 2\n * hash['reversed'] === undefined\n */\nexport class Hash {\n hash: HashValueTokens = {}\n\n constructor (input: string | Tokenizer, jekyllStyle?: boolean | string) {\n const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {})\n for (const hash of tokenizer.readHashes(jekyllStyle)) {\n this.hash[hash.name.content] = hash.value\n }\n }\n\n * render (ctx: Context): Generator<unknown, Record<string, any>, unknown> {\n const hash = {}\n for (const key of Object.keys(this.hash)) {\n hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx)\n }\n return hash\n }\n}\n","import { isArray } from '../util/underscore'\nimport { ValueToken } from '../tokens/value-token'\n\ntype KeyValuePair = [string?, ValueToken?]\n\nexport type FilterArg = ValueToken | KeyValuePair\n\nexport function isKeyValuePair (arr: FilterArg): arr is KeyValuePair {\n return isArray(arr)\n}\n","import { evalToken } from '../render'\nimport { Context } from '../context'\nimport { identify, isFunction } from '../util/underscore'\nimport { FilterHandler, FilterImplOptions } from './filter-impl-options'\nimport { FilterArg, isKeyValuePair } from '../parser/filter-arg'\nimport { Liquid } from '../liquid'\nimport { FilterToken } from '../tokens'\n\nexport class Filter {\n public name: string\n public args: FilterArg[]\n public readonly raw: boolean\n private handler: FilterHandler\n private liquid: Liquid\n private token: FilterToken\n\n public constructor (token: FilterToken, options: FilterImplOptions | undefined, liquid: Liquid) {\n this.token = token\n this.name = token.name\n this.handler = isFunction(options)\n ? options\n : (isFunction(options?.handler) ? options!.handler : identify)\n this.raw = !isFunction(options) && !!options?.raw\n this.args = token.args\n this.liquid = liquid\n }\n public * render (value: any, context: Context): IterableIterator<unknown> {\n const argv: any[] = []\n for (const arg of this.args as FilterArg[]) {\n if (isKeyValuePair(arg)) argv.push([arg[0], yield evalToken(arg[1], context)])\n else argv.push(yield evalToken(arg, context))\n }\n return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv])\n }\n}\n","import { Filter } from './filter'\nimport { Expression } from '../render'\nimport { Tokenizer } from '../parser'\nimport { assert } from '../util'\nimport type { FilteredValueToken } from '../tokens'\nimport type { Liquid } from '../liquid'\nimport type { Context } from '../context'\n\nexport class Value {\n public readonly filters: Filter[] = []\n public readonly initial: Expression\n\n /**\n * @param str the value to be valuated, eg.: \"foobar\" | truncate: 3\n */\n public constructor (input: string | FilteredValueToken, liquid: Liquid) {\n const token: FilteredValueToken = typeof input === 'string'\n ? new Tokenizer(input, liquid.options.operators).readFilteredValue()\n : input\n this.initial = token.initial\n this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid))\n }\n\n public * value (ctx: Context, lenient?: boolean): Generator<unknown, unknown, unknown> {\n lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default')\n let val = yield this.initial.evaluate(ctx, lenient)\n\n for (const filter of this.filters) {\n val = yield filter.render(val, ctx)\n }\n return val\n }\n\n private getFilter (liquid: Liquid, name: string) {\n const impl = liquid.filters[name]\n assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`)\n return impl\n }\n}\n","import { Value } from './value'\nimport { Arguments, Template, TemplateImpl } from '../template'\nimport { Context } from '../context/context'\nimport { Emitter } from '../emitters/emitter'\nimport { OutputToken } from '../tokens/output-token'\nimport { Tokenizer } from '../parser'\nimport { Liquid } from '../liquid'\nimport { Filter } from './filter'\nimport { FilterToken } from '../tokens'\n\nexport class Output extends TemplateImpl<OutputToken> implements Template {\n value: Value\n public constructor (token: OutputToken, liquid: Liquid) {\n super(token)\n const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange)\n this.value = new Value(tokenizer.readFilteredValue(), liquid)\n const filters = this.value.filters\n const outputEscape = liquid.options.outputEscape\n if (!filters[filters.length - 1]?.raw && outputEscape) {\n const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0)\n filters.push(new Filter(token, outputEscape, liquid))\n }\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator<unknown> {\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n\n public * arguments (): Arguments {\n yield this.value\n }\n}\n","import { TemplateImpl, Template } from '../template'\nimport { HTMLToken } from '../tokens'\nimport { Context } from '../context'\nimport { Emitter } from '../emitters'\n\nexport class HTML extends TemplateImpl<HTMLToken> implements Template {\n private str: string\n public constructor (token: HTMLToken) {\n super(token)\n this.str = token.getContent()\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator<void> {\n emitter.write(this.str)\n }\n}\n","import { Argument, Template, Value } from '.'\nimport { isKeyValuePair } from '../parser/filter-arg'\nimport { PropertyAccessToken, ValueToken } from '../tokens'\nimport {\n isNumberToken,\n isPropertyAccessToken,\n isQuotedToken,\n isRangeToken,\n isString,\n isValueToken,\n isWordToken,\n toPromise,\n toValueSync\n} from '../util'\n\n/**\n * Row, column and file name where a variable was found.\n */\nexport interface VariableLocation {\n row: number;\n col: number;\n file?: string;\n}\n\n/**\n * A variable's segments as an array, possibly with nested arrays of segments.\n */\nexport type SegmentArray = Array<string | number | SegmentArray>\n\n/**\n * A variable's segments and location, which can be coerced to a string.\n */\nexport class Variable {\n constructor (\n readonly segments: Array<string | number | Variable>,\n readonly location: VariableLocation\n ) {}\n\n public toString (): string {\n return segmentsString(this.segments, true)\n }\n\n /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */\n public toArray (): SegmentArray {\n function * _visit (...segments: Array<string | number | Variable>): Generator<string | number | SegmentArray> {\n for (const segment of segments) {\n if (segment instanceof Variable) {\n yield Array.from(_visit(...segment.segments))\n } else {\n yield segment\n }\n }\n }\n return Array.from(_visit(...this.segments))\n }\n}\n\n/**\n * Property names and array indexes that make up a path to a variable.\n */\nexport type VariableSegments = Array<string | number | Variable>;\n\n/**\n * A mapping of variable names to an array of locations at which the variable was found.\n */\nexport type Variables = { [key: string]: Variable[] };\n\n/**\n * Group variables by the string representation of their root segment.\n */\nexport class VariableMap {\n private map: Map<string, Variable[]>\n\n constructor () {\n this.map = new Map()\n }\n\n public get (key: Variable): Variable[] {\n const k = segmentsString([key.segments[0]])\n if (!this.map.has(k)) {\n this.map.set(k, [])\n }\n return this.map.get(k) as Variable[]\n }\n\n public has (key: Variable): boolean {\n return this.map.has(segmentsString([key.segments[0]]))\n }\n\n public push (variable: Variable): void {\n this.get(variable).push(variable)\n }\n\n public asObject (): Variables {\n return Object.fromEntries(this.map)\n }\n}\n\n/**\n * The result of calling `analyze()` or `analyzeSync()`.\n */\nexport interface StaticAnalysis {\n /**\n * All variables, whether they are in scope or not. Including references to names\n * such as `forloop` from the `for` tag.\n */\n variables: Variables;\n\n /**\n * Variables that are not in scope. These could be a \"global\" variables that are\n * expected to be provided by the application developer, or possible mistakes\n * from the template author.\n *\n * If a variable is referenced before and after assignment, you should expect\n * that variable to be included in `globals`, `variables` and `locals`, each with\n * a different location.\n */\n globals: Variables;\n\n /**\n * Template variables that are added to the template local scope using tags like\n * `assign`, `capture` or `increment`.\n */\n locals: Variables;\n}\n\nexport interface StaticAnalysisOptions {\n /**\n * When `true` (the default), try to load partial templates and analyze them too.\n */\n partials?: boolean;\n}\n\nexport const defaultStaticAnalysisOptions: StaticAnalysisOptions = {\n partials: true\n}\n\nfunction * _analyze (templates: Template[], partials: boolean, sync: boolean): Generator<unknown, StaticAnalysis> {\n const variables = new VariableMap()\n const globals = new VariableMap()\n const locals = new VariableMap()\n\n const rootScope = new DummyScope(new Set())\n\n // Names of partial templates that we've already analyzed.\n const seen: Set<string | undefined> = new Set()\n\n function updateVariables (variable: Variable, scope: DummyScope) {\n variables.push(variable)\n const aliased = scope.alias(variable)\n\n if (aliased !== undefined) {\n const root = aliased.segments[0]\n // TODO: What if a a template renders a rendered template? Do we need scope.parent?\n if (isString(root) && !rootScope.has(root)) {\n globals.push(aliased)\n }\n } else {\n const root = variable.segments[0]\n if (isString(root) && !scope.has(root)) {\n globals.push(variable)\n }\n }\n\n // Recurse for nested Variables\n for (const segment of variable.segments) {\n if (segment instanceof Variable) {\n updateVariables(segment, scope)\n }\n }\n }\n\n function * visit (template: Template, scope: DummyScope): Generator<unknown, void> {\n if (template.arguments) {\n for (const arg of template.arguments()) {\n for (const variable of extractVariables(arg)) {\n updateVariables(variable, scope)\n }\n }\n }\n\n if (template.localScope) {\n for (const ident of template.localScope()) {\n scope.add(ident.content)\n scope.deleteAlias(ident.content)\n const [row, col] = ident.getPosition()\n locals.push(new Variable([ident.content], { row, col, file: ident.file }))\n }\n }\n\n if (template.children) {\n if (template.partialScope) {\n const partial = template.partialScope()\n\n if (partial === undefined) {\n // Layouts, for example, can have children that are not partials.\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, scope)\n }\n return\n }\n\n if (seen.has(partial.name)) return\n\n const partialScopeNames: Set<string> = new Set()\n const partialScope = partial.isolated\n ? new DummyScope(partialScopeNames)\n : scope.push(partialScopeNames)\n\n for (const name of partial.scope) {\n if (isString(name)) {\n partialScopeNames.add(name)\n } else {\n const [alias, argument] = name\n partialScopeNames.add(alias)\n const variables = Array.from(extractVariables(argument))\n if (variables.length) {\n partialScope.setAlias(alias, variables[0].segments)\n }\n }\n }\n\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, partialScope)\n seen.add(partial.name)\n }\n\n partialScope.pop()\n } else {\n if (template.blockScope) {\n scope.push(new Set(template.blockScope()))\n }\n\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, scope)\n }\n\n if (template.blockScope) {\n scope.pop()\n }\n }\n }\n }\n\n for (const template of templates) {\n yield visit(template, rootScope)\n }\n\n return {\n variables: variables.asObject(),\n globals: globals.asObject(),\n locals: locals.asObject()\n }\n}\n\n/**\n * Statically analyze a template and report variable usage.\n */\nexport function analyze (template: Template[], options: StaticAnalysisOptions = {}): Promise<StaticAnalysis> {\n const opts = { ...defaultStaticAnalysisOptions, ...options } as Required<StaticAnalysisOptions>\n return toPromise(_analyze(template, opts.partials, false))\n}\n\n/**\n * Statically analyze a template and report variable usage.\n */\nexport function analyzeSync (template: Template[], options: StaticAnalysisOptions = {}): StaticAnalysis {\n const opts = { ...defaultStaticAnalysisOptions, ...options } as Required<StaticAnalysisOptions>\n return toValueSync(_analyze(template, opts.partials, true))\n}\n\ninterface ScopeStackItem {\n names: Set<string>;\n aliases: Map<string, VariableSegments>;\n}\n\n/**\n * A stack to manage scopes while traversing templates during static analysis.\n */\nclass DummyScope {\n private stack: Array<ScopeStackItem>\n\n constructor (globals: Set<string>) {\n this.stack = [{ names: globals, aliases: new Map() }]\n }\n\n /** Return true if `name` is in scope. */\n public has (name: string): boolean {\n for (const scope of this.stack) {\n if (scope.names.has(name)) {\n return true\n }\n }\n return false\n }\n\n public push (scope: Set<string>): DummyScope {\n this.stack.push({ names: scope, aliases: new Map() })\n return this\n }\n\n public pop (): Set<string> | undefined {\n return this.stack.pop()?.names\n }\n\n // Add a name to the template scope.\n public add (name: string): void {\n this.stack[0].names.add(name)\n }\n\n /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */\n public alias (variable: Variable): Variable | undefined {\n const root = variable.segments[0]\n if (!isString(root)) return undefined\n const alias = this.getAlias(root)\n if (alias === undefined) return undefined\n return new Variable([...alias, ...variable.segments.slice(1)], variable.location)\n }\n\n // TODO: `from` could be a path with multiple segments, like `include.x`.\n public setAlias (from: string, to: VariableSegments): void {\n this.stack[this.stack.length - 1].aliases.set(from, to)\n }\n\n public deleteAlias (name: string): void {\n this.stack[this.stack.length - 1].aliases.delete(name)\n }\n\n private getAlias (name: string): VariableSegments | undefined {\n for (const scope of this.stack) {\n if (scope.aliases.has(name)) {\n return scope.aliases.get(name)\n }\n\n // If a scope has defined `name`, then it masks aliases in parent scopes.\n if (scope.names.has(name)) {\n return undefined\n }\n }\n return undefined\n }\n}\n\nfunction * extractVariables (value: Argument): Generator<Variable> {\n if (isValueToken(value)) {\n yield * extractValueTokenVariables(value)\n } else if (value instanceof Value) {\n yield * extractFilteredValueVariables(value)\n }\n}\n\nfunction * extractFilteredValueVariables (value: Value): Generator<Variable> {\n for (const token of value.initial.postfix) {\n if (isValueToken(token)) {\n yield * extractValueTokenVariables(token)\n }\n }\n\n for (const filter of value.filters) {\n for (const arg of filter.args) {\n if (isKeyValuePair(arg) && arg[1]) {\n yield * extractValueTokenVariables(arg[1])\n } else if (isValueToken(arg)) {\n yield * extractValueTokenVariables(arg)\n }\n }\n }\n}\n\nfunction * extractValueTokenVariables (token: ValueToken): Generator<Variable> {\n if (isRangeToken(token)) {\n yield * extractValueTokenVariables(token.lhs)\n yield * extractValueTokenVariables(token.rhs)\n } else if (isPropertyAccessToken(token)) {\n yield extractPropertyAccessVariable(token)\n }\n}\n\nfunction extractPropertyAccessVariable (token: PropertyAccessToken): Variable {\n const segments: VariableSegments = []\n\n // token is not guaranteed to have `file` set. We'll try to get it from a prop if not.\n let file: string | undefined = token.file\n\n // Here we're flattening the first segment of a path if it is a nested path.\n const root = token.props[0]\n file = file || root.file\n if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) {\n segments.push(root.content)\n } else if (isPropertyAccessToken(root)) {\n // Flatten paths that start with a nested path.\n segments.push(...extractPropertyAccessVariable(root).segments)\n }\n\n for (const prop of token.props.slice(1)) {\n file = file || prop.file\n if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) {\n segments.push(prop.content)\n } else if (isPropertyAccessToken(prop)) {\n segments.push(extractPropertyAccessVariable(prop))\n }\n }\n\n const [row, col] = token.getPosition()\n return new Variable(segments, {\n row,\n col,\n file\n })\n}\n\n// This is used to detect segments that can be represented with dot notation\n// when creating a string representation of VariableSegments.\nconst RE_PROPERTY = /^[\\u0080-\\uFFFFa-zA-Z_][\\u0080-\\uFFFFa-zA-Z0-9_-]*$/\n\n/**\n * Return a string representation of segments using dot notation where possible.\n * @param segments - The property names and array indices that make up a path to a variable.\n * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets.\n */\nfunction segmentsString (segments: VariableSegments, bracketedRoot = false): string {\n const buf: string[] = []\n\n const root = segments[0]\n if (isString(root)) {\n if (!bracketedRoot || root.match(RE_PROPERTY)) {\n buf.push(`${root}`)\n } else {\n buf.push(`['${root}']`)\n }\n }\n\n for (const segment of segments.slice(1)) {\n if (segment instanceof Variable) {\n buf.push(`[${segmentsString(segment.segments)}]`)\n } else if (isString(segment)) {\n if (segment.match(RE_PROPERTY)) {\n buf.push(`.${segment}`)\n } else {\n buf.push(`['${segment}']`)\n }\n } else {\n buf.push(`[${segment}]`)\n }\n }\n\n return buf.join('')\n}\n","import { FS } from './fs'\nimport { assert, escapeRegex } from '../util'\n\nexport interface LoaderOptions {\n fs: FS;\n extname: string;\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n}\nexport enum LookupType {\n Partials = 'partials',\n Layouts = 'layouts',\n Root = 'root'\n}\nexport class Loader {\n public shouldLoadRelative: (referencedFile: string) => boolean\n private options: LoaderOptions\n private contains: (root: string, file: string) => boolean\n\n constructor (options: LoaderOptions) {\n this.options = options\n if (options.relativeReference) {\n const sep = options.fs.sep\n assert(sep, '`fs.sep` is required for relative reference')\n const rRelativePath = new RegExp(['.' + sep, '..' + sep, './', '../'].map(prefix => escapeRegex(prefix)).join('|'))\n this.shouldLoadRelative = (referencedFile: string) => rRelativePath.test(referencedFile)\n } else {\n this.shouldLoadRelative = (_referencedFile: string) => false\n }\n this.contains = this.options.fs.contains || (() => true)\n }\n\n public * lookup (file: string, type: LookupType, sync?: boolean, currentFile?: string): Generator<unknown, string, string> {\n const { fs } = this.options\n const dirs = this.options[type]\n for (const filepath of this.candidates(file, dirs, currentFile, type !== LookupType.Root)) {\n if (sync ? fs.existsSync(filepath) : yield fs.exists(filepath)) return filepath\n }\n throw this.lookupError(file, dirs)\n }\n\n public * candidates (file: string, dirs: string[], currentFile?: string, enforceRoot?: boolean) {\n const { fs, extname } = this.options\n if (this.shouldLoadRelative(file) && currentFile) {\n const referenced = fs.resolve(this.dirname(currentFile), file, extname)\n for (const dir of dirs) {\n if (!enforceRoot || this.contains(dir, referenced)) {\n // the relatively referenced file is within one of root dirs\n yield referenced\n break\n }\n }\n }\n for (const dir of dirs) {\n const referenced = fs.resolve(dir, file, extname)\n if (!enforceRoot || this.contains(dir, referenced)) {\n yield referenced\n }\n }\n if (fs.fallback !== undefined) {\n const filepath = fs.fallback(file)\n if (filepath !== undefined) yield filepath\n }\n }\n\n private dirname (path: string) {\n const fs = this.options.fs\n assert(fs.dirname, '`fs.dirname` is required for relative reference')\n return fs.dirname!(path)\n }\n\n private lookupError (file: string, roots: string[]) {\n const err = new Error('ENOENT') as any\n err.message = `ENOENT: Failed to lookup \"${file}\" in \"${roots}\"`\n err.code = 'ENOENT'\n return err\n }\n}\n","import { Limiter, toPromise, assert, isTagToken, isOutputToken, ParseError } from '../util'\nimport { Tokenizer } from './tokenizer'\nimport { ParseStream } from './parse-stream'\nimport { TopLevelToken, OutputToken } from '../tokens'\nimport { Template, Output, HTML } from '../template'\nimport { LiquidCache } from '../cache'\nimport { FS, Loader, LookupType } from '../fs'\nimport { LiquidError, LiquidErrors } from '../util/error'\nimport type { Liquid } from '../liquid'\n\nexport class Parser {\n public parseFile: (file: string, sync?: boolean, type?: LookupType, currentFile?: string) => Generator<unknown, Template[], Template[] | string>\n\n private liquid: Liquid\n private fs: FS\n private cache?: LiquidCache\n private loader: Loader\n private parseLimit: Limiter\n\n public constructor (liquid: Liquid) {\n this.liquid = liquid\n this.cache = this.liquid.options.cache\n this.fs = this.liquid.options.fs\n this.parseFile = this.cache ? this._parseFileCached : this._parseFile\n this.loader = new Loader(this.liquid.options)\n this.parseLimit = new Limiter('parse length', liquid.options.parseLimit)\n }\n public parse (html: string, filepath?: string): Template[] {\n html = String(html)\n this.parseLimit.use(html.length)\n const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath)\n const tokens = tokenizer.readTopLevelTokens(this.liquid.options)\n return this.parseTokens(tokens)\n }\n public parseTokens (tokens: TopLevelToken[]) {\n let token\n const templates: Template[] = []\n const errors: LiquidError[] = []\n while ((token = tokens.shift())) {\n try {\n templates.push(this.parseToken(token, tokens))\n } catch (err) {\n if (this.liquid.options.catchAllErrors) errors.push(err as LiquidError)\n else throw err\n }\n }\n if (errors.length) throw new LiquidErrors(errors)\n return templates\n }\n public parseToken (token: TopLevelToken, remainTokens: TopLevelToken[]) {\n try {\n if (isTagToken(token)) {\n const TagClass = this.liquid.tags[token.name]\n assert(TagClass, `tag \"${token.name}\" not found`)\n return new TagClass(token, remainTokens, this.liquid, this)\n }\n if (isOutputToken(token)) {\n return new Output(token as OutputToken, this.liquid)\n }\n return new HTML(token)\n } catch (e) {\n if (LiquidError.is(e)) throw e\n throw new ParseError(e as Error, token)\n }\n }\n public parseStream (tokens: TopLevelToken[]) {\n return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens))\n }\n private * _parseFileCached (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator<unknown, Template[], Template[]> {\n const cache = this.cache!\n const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file\n const tpls = yield cache.read(key)\n if (tpls) return tpls\n\n const task = this._parseFile(file, sync, type, currentFile)\n // sync mode: exec the task and cache the result\n // async mode: cache the task before exec\n const taskOrTpl = sync ? yield task : toPromise(task)\n cache.write(key, taskOrTpl as any)\n // note: concurrent tasks will be reused, cache for failed task is removed until its end\n try { return yield taskOrTpl } catch (err) { cache.remove(key); throw err }\n }\n private * _parseFile (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator<unknown, Template[], string> {\n const filepath = yield this.loader.lookup(file, type, sync, currentFile)\n return this.parse(sync ? this.fs.readFileSync(filepath) : yield this.fs.readFile(filepath), filepath)\n }\n}\n","import { RangeToken, NumberToken, QuotedToken, LiteralToken, PropertyAccessToken, OutputToken, HTMLToken, TagToken, IdentifierToken, DelimitedToken, OperatorToken, ValueToken } from '../tokens'\nimport { TokenKind } from '../parser'\n\nexport function isDelimitedToken (val: any): val is DelimitedToken {\n return !!(getKind(val) & TokenKind.Delimited)\n}\n\nexport function isOperatorToken (val: any): val is OperatorToken {\n return getKind(val) === TokenKind.Operator\n}\n\nexport function isHTMLToken (val: any): val is HTMLToken {\n return getKind(val) === TokenKind.HTML\n}\n\nexport function isOutputToken (val: any): val is OutputToken {\n return getKind(val) === TokenKind.Output\n}\n\nexport function isTagToken (val: any): val is TagToken {\n return getKind(val) === TokenKind.Tag\n}\n\nexport function isQuotedToken (val: any): val is QuotedToken {\n return getKind(val) === TokenKind.Quoted\n}\n\nexport function isLiteralToken (val: any): val is LiteralToken {\n return getKind(val) === TokenKind.Literal\n}\n\nexport function isNumberToken (val: any): val is NumberToken {\n return getKind(val) === TokenKind.Number\n}\n\nexport function isPropertyAccessToken (val: any): val is PropertyAccessToken {\n return getKind(val) === TokenKind.PropertyAccess\n}\n\nexport function isWordToken (val: any): val is IdentifierToken {\n return getKind(val) === TokenKind.Word\n}\n\nexport function isRangeToken (val: any): val is RangeToken {\n return getKind(val) === TokenKind.Range\n}\n\nexport function isValueToken (val: any): val is ValueToken {\n // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range\n return (getKind(val) & 1667) > 0\n}\n\nfunction getKind (val: any) {\n return val ? val.kind : -1\n}\n","export enum TokenKind {\n Number = 1,\n Literal = 2,\n Tag = 4,\n Output = 8,\n HTML = 16,\n Filter = 32,\n Hash = 64,\n PropertyAccess = 128,\n Word = 256,\n Range = 512,\n Quoted = 1024,\n Operator = 2048,\n FilteredValue = 4096,\n Delimited = Tag | Output\n}\n","export enum BlockMode {\n /* store rendered html into blocks */\n OUTPUT,\n /* output rendered html directly */\n STORE\n}\n","import { getPerformance } from '../util/performance'\nimport { Drop } from '../drop/drop'\nimport { __assign } from 'tslib'\nimport { NormalizedFullOptions, defaultOptions, RenderOptions } from '../liquid-options'\nimport { Scope } from './scope'\nimport { hasOwnProperty, isArray, isNil, isUndefined, isString, isFunction, toLiquid, InternalUndefinedVariableError, toValueSync, isObject, Limiter, toValue } from '../util'\n\ntype PropertyKey = string | number;\n\nexport class Context {\n /**\n * insert a Context-level empty scope,\n * for tags like `{% capture %}` `{% assign %}` to operate\n */\n private scopes: Scope[] = [{}]\n private registers = {}\n /**\n * user passed in scope\n * `{% increment %}`, `{% decrement %}` changes this scope,\n * whereas `{% capture %}`, `{% assign %}` only hide this scope\n */\n public environments: Scope\n /**\n * global scope used as fallback for missing variables\n */\n public globals: Scope\n public sync: boolean\n public breakCalled = false\n public continueCalled = false\n /**\n * The normalized liquid options object\n */\n public opts: NormalizedFullOptions\n /**\n * Throw when accessing undefined variable?\n */\n public strictVariables: boolean;\n public ownPropertyOnly: boolean;\n public memoryLimit: Limiter;\n public renderLimit: Limiter;\n public constructor (env: object = {}, opts: NormalizedFullOptions = defaultOptions, renderOptions: RenderOptions = {}, { memoryLimit, renderLimit }: { [key: string]: Limiter } = {}) {\n this.sync = !!renderOptions.sync\n this.opts = opts\n this.globals = renderOptions.globals ?? opts.globals\n this.environments = isObject(env) ? env : Object(env)\n this.strictVariables = renderOptions.strictVariables ?? this.opts.strictVariables\n this.ownPropertyOnly = renderOptions.ownPropertyOnly ?? opts.ownPropertyOnly\n this.memoryLimit = memoryLimit ?? new Limiter('memory alloc', renderOptions.memoryLimit ?? opts.memoryLimit)\n this.renderLimit = renderLimit ?? new Limiter('template render', getPerformance().now() + (renderOptions.renderLimit ?? opts.renderLimit))\n }\n public getRegister (key: string) {\n return (this.registers[key] = this.registers[key] || {})\n }\n public setRegister (key: string, value: any) {\n return (this.registers[key] = value)\n }\n public saveRegister (...keys: string[]): [string, any][] {\n return keys.map(key => [key, this.getRegister(key)])\n }\n public restoreRegister (keyValues: [string, any][]) {\n return keyValues.forEach(([key, value]) => this.setRegister(key, value))\n }\n public getAll () {\n return [this.globals, this.environments, ...this.scopes]\n .reduce((ctx, val) => __assign(ctx, val), {})\n }\n /**\n * @deprecated use `_get()` or `getSync()` instead\n */\n public get (paths: PropertyKey[]): unknown {\n return this.getSync(paths)\n }\n public getSync (paths: PropertyKey[]): unknown {\n return toValueSync(this._get(paths))\n }\n public * _get (paths: (PropertyKey | Drop)[]): IterableIterator<unknown> {\n const scope = this.findScope(paths[0] as string) // first prop should always be a string\n return yield this._getFromScope(scope, paths)\n }\n /**\n * @deprecated use `_get()` instead\n */\n public getFromScope (scope: unknown, paths: PropertyKey[] | string): IterableIterator<unknown> {\n return toValueSync(this._getFromScope(scope, paths))\n }\n public * _getFromScope (scope: unknown, paths: (PropertyKey | Drop)[] | string, strictVariables = this.strictVariables): IterableIterator<unknown> {\n if (isString(paths)) paths = paths.split('.')\n for (let i = 0; i < paths.length; i++) {\n scope = yield this.readProperty(scope as object, paths[i])\n if (strictVariables && isUndefined(scope)) {\n throw new InternalUndefinedVariableError((paths as string[]).slice(0, i + 1).join!('.'))\n }\n }\n return scope\n }\n public push (ctx: object) {\n return this.scopes.push(ctx)\n }\n public pop () {\n return this.scopes.pop()\n }\n public bottom () {\n return this.scopes[0]\n }\n public spawn (scope = {}) {\n return new Context(scope, this.opts, {\n sync: this.sync,\n globals: this.globals,\n strictVariables: this.strictVariables\n }, {\n renderLimit: this.renderLimit,\n memoryLimit: this.memoryLimit\n })\n }\n private findScope (key: string | number) {\n for (let i = this.scopes.length - 1; i >= 0; i--) {\n const candidate = this.scopes[i]\n if (key in candidate) return candidate\n }\n if (key in this.environments) return this.environments\n return this.globals\n }\n readProperty (obj: Scope, key: (PropertyKey | Drop)) {\n obj = toLiquid(obj)\n key = toValue(key) as PropertyKey\n if (isNil(obj)) return obj\n if (isArray(obj) && (key as number) < 0) return obj[obj.length + +key]\n const value = readJSProperty(obj, key, this.ownPropertyOnly)\n if (value === undefined && obj instanceof Drop) return obj.liquidMethodMissing(key, this)\n if (isFunction(value)) return value.call(obj)\n if (key === 'size') return readSize(obj)\n else if (key === 'first') return readFirst(obj)\n else if (key === 'last') return readLast(obj)\n return value\n }\n}\n\nexport function readJSProperty (obj: Scope, key: PropertyKey, ownPropertyOnly: boolean) {\n if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop)) return undefined\n return obj[key]\n}\n\nfunction readFirst (obj: Scope) {\n if (isArray(obj)) return obj[0]\n return obj['first']\n}\n\nfunction readLast (obj: Scope) {\n if (isArray(obj)) return obj[obj.length - 1]\n return obj['last']\n}\n\nfunction readSize (obj: Scope) {\n if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined) return obj['size']\n if (isArray(obj) || isString(obj)) return obj.length\n if (typeof obj === 'object') return Object.keys(obj).length\n}\n","import { toNumber, argumentsToNumber } from '../util/underscore'\n\nexport const abs = argumentsToNumber(Math.abs)\nexport const at_least = argumentsToNumber(Math.max)\nexport const at_most = argumentsToNumber(Math.min)\nexport const ceil = argumentsToNumber(Math.ceil)\nexport const divided_by = argumentsToNumber((dividend: number, divisor: number, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor)\nexport const floor = argumentsToNumber(Math.floor)\nexport const minus = argumentsToNumber((v: number, arg: number) => v - arg)\nexport const plus = argumentsToNumber((lhs: number, rhs: number) => lhs + rhs)\nexport const modulo = argumentsToNumber((v: number, arg: number) => v % arg)\nexport const times = argumentsToNumber((v: number, arg: number) => v * arg)\n\nexport function round (v: number, arg = 0) {\n v = toNumber(v)\n arg = toNumber(arg)\n const amp = Math.pow(10, arg)\n return Math.round(v * amp) / amp\n}\n","import { stringify } from '../util/underscore'\n\nexport const url_decode = (x: string) => decodeURIComponent(stringify(x)).replace(/\\+/g, ' ')\nexport const url_encode = (x: string) => encodeURIComponent(stringify(x)).replace(/%20/g, '+')\nexport const cgi_escape = (x: string) => encodeURIComponent(stringify(x))\n .replace(/%20/g, '+')\n .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase())\nexport const uri_escape = (x: string) => encodeURI(stringify(x))\n .replace(/%5B/g, '[')\n .replace(/%5D/g, ']')\n\nconst rSlugifyDefault = /[^\\p{M}\\p{L}\\p{Nd}]+/ug\nconst rSlugifyReplacers = {\n 'raw': /\\s+/g,\n 'default': rSlugifyDefault,\n 'pretty': /[^\\p{M}\\p{L}\\p{Nd}._~!$&'()+,;=@]+/ug,\n 'ascii': /[^A-Za-z0-9]+/g,\n 'latin': rSlugifyDefault,\n 'none': null\n}\n\nexport function slugify (str: string, mode: keyof typeof rSlugifyReplacers = 'default', cased = false): string {\n str = stringify(str)\n\n const replacer = rSlugifyReplacers[mode]\n if (replacer) {\n if (mode === 'latin') str = removeAccents(str)\n str = str.replace(replacer, '-').replace(/^-|-$/g, '')\n }\n\n return cased ? str : str.toLowerCase()\n}\n\nfunction removeAccents (str: string): string {\n return str.replace(/[àáâãäå]/g, 'a')\n .replace(/[æ]/g, 'ae')\n .replace(/[ç]/g, 'c')\n .replace(/[èéêë]/g, 'e')\n .replace(/[ìíîï]/g, 'i')\n .replace(/[ð]/g, 'd')\n .replace(/[ñ]/g, 'n')\n .replace(/[òóôõöø]/g, 'o')\n .replace(/[ùúûü]/g, 'u')\n .replace(/[ýÿ]/g, 'y')\n .replace(/[ß]/g, 'ss')\n .replace(/[œ]/g, 'oe')\n .replace(/[þ]/g, 'th')\n .replace(/[ẞ]/g, 'SS')\n .replace(/[Œ]/g, 'OE')\n .replace(/[Þ]/g, 'TH')\n}\n","import { toArray, argumentsToValue, toValue, stringify, caseInsensitiveCompare, isArray, isNil, last as arrayLast, isArrayLike, toEnumerable } from '../util'\nimport { arrayIncludes, equals, evalToken, isTruthy } from '../render'\nimport { Value, FilterImpl } from '../template'\nimport { Tokenizer } from '../parser'\nimport type { Scope } from '../context'\nimport { EmptyDrop } from '../drop'\n\nexport const join = argumentsToValue(function (this: FilterImpl, v: any[], arg: string) {\n const array = toArray(v)\n const sep = isNil(arg) ? ' ' : stringify(arg)\n const complexity = array.length * (1 + sep.length)\n this.context.memoryLimit.use(complexity)\n return array.join(sep)\n})\nexport const last = argumentsToValue((v: any) => isArrayLike(v) ? arrayLast(v) : '')\nexport const first = argumentsToValue((v: any) => isArrayLike(v) ? v[0] : '')\nexport const reverse = argumentsToValue(function (this: FilterImpl, v: any[]) {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n return [...array].reverse()\n})\n\nexport function * sort<T> (this: FilterImpl, arr: T[], property?: string): IterableIterator<unknown> {\n const values: [T, string | number][] = []\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n values.push([\n item,\n property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item\n ])\n }\n return values.sort((lhs, rhs) => {\n const lvalue = lhs[1]\n const rvalue = rhs[1]\n return lvalue < rvalue ? -1 : (lvalue > rvalue ? 1 : 0)\n }).map(tuple => tuple[0])\n}\n\nexport function sort_natural<T> (this: FilterImpl, input: T[], property?: string) {\n const propertyString = stringify(property)\n const compare = property === undefined\n ? caseInsensitiveCompare\n : (lhs: T, rhs: T) => caseInsensitiveCompare(lhs[propertyString], rhs[propertyString])\n const array = toArray(input)\n this.context.memoryLimit.use(array.length)\n return [...array].sort(compare)\n}\n\nexport const size = (v: string | any[]) => (v && v.length) || 0\n\nexport function * map (this: FilterImpl, arr: Scope[], property: string): IterableIterator<unknown> {\n const results = []\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n results.push(yield this.context._getFromScope(item, stringify(property), false))\n }\n return results\n}\n\nexport function * sum (this: FilterImpl, arr: Scope[], property?: string): IterableIterator<unknown> {\n let sum = 0\n const array = toArray(arr)\n for (const item of array) {\n const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item)\n sum += Number.isNaN(data) ? 0 : data\n }\n return sum\n}\n\nexport function compact<T> (this: FilterImpl, arr: T[]) {\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n return array.filter(x => !isNil(toValue(x)))\n}\n\nexport function concat<T1, T2> (this: FilterImpl, v: T1[], arg: T2[] = []): (T1 | T2)[] {\n const lhs = toArray(v)\n const rhs = toArray(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return lhs.concat(rhs)\n}\n\nexport function push<T> (this: FilterImpl, v: T[], arg: T): T[] {\n return concat.call(this, v, [arg]) as T[]\n}\n\nexport function unshift<T> (this: FilterImpl, v: T[], arg: T): T[] {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n const clone = [...array]\n clone.unshift(arg)\n return clone\n}\n\nexport function pop<T> (v: T[]): T[] {\n const clone = [...toArray(v)]\n clone.pop()\n return clone\n}\n\nexport function shift<T> (this: FilterImpl, v: T[]): T[] {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n const clone = [...array]\n clone.shift()\n return clone\n}\n\nexport function slice<T> (this: FilterImpl, v: T[] | string, begin: number, length = 1): T[] | string {\n v = toValue(v)\n if (isNil(v)) return []\n if (!isArray(v)) v = stringify(v)\n begin = begin < 0 ? v.length + begin : begin\n this.context.memoryLimit.use(length)\n return v.slice(begin, begin + length)\n}\n\nfunction expectedMatcher (this: FilterImpl, expected: any): (v: any) => boolean {\n if (this.context.opts.jekyllWhere) {\n return (v: any) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected))\n } else if (expected === undefined) {\n return (v: any) => isTruthy(v, this.context)\n } else {\n return (v: any) => equals(v, expected)\n }\n}\n\nfunction * filter<T extends object> (this: FilterImpl, include: boolean, arr: T[], property: string, expected: any): IterableIterator<unknown> {\n const values: unknown[] = []\n arr = toArray(arr)\n this.context.memoryLimit.use(arr.length)\n const token = new Tokenizer(stringify(property)).readScopeValue()\n for (const item of arr) {\n values.push(yield evalToken(token, this.context.spawn(item)))\n }\n const matcher = expectedMatcher.call(this, expected)\n return arr.filter((_, i) => matcher(values[i]) === include)\n}\n\nfunction * filter_exp<T extends object> (this: FilterImpl, include: boolean, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const filtered: unknown[] = []\n const keyTemplate = new Value(stringify(exp), this.liquid)\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n this.context.push({ [itemName]: item })\n const value = yield keyTemplate.value(this.context)\n this.context.pop()\n if (value === include) filtered.push(item)\n }\n return filtered\n}\n\nexport function * where<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n return yield * filter.call(this, true, arr, property, expected)\n}\n\nexport function * reject<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n return yield * filter.call(this, false, arr, property, expected)\n}\n\nexport function * where_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n return yield * filter_exp.call(this, true, arr, itemName, exp)\n}\n\nexport function * reject_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n return yield * filter_exp.call(this, false, arr, itemName, exp)\n}\n\nexport function * group_by<T extends object> (this: FilterImpl, arr: T[], property: string): IterableIterator<unknown> {\n const map = new Map()\n arr = toEnumerable(arr)\n const token = new Tokenizer(stringify(property)).readScopeValue()\n this.context.memoryLimit.use(arr.length)\n for (const item of arr) {\n const key = yield evalToken(token, this.context.spawn(item))\n if (!map.has(key)) map.set(key, [])\n map.get(key).push(item)\n }\n return [...map.entries()].map(([name, items]) => ({ name, items }))\n}\n\nexport function * group_by_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const map = new Map()\n const keyTemplate = new Value(stringify(exp), this.liquid)\n arr = toEnumerable(arr)\n this.context.memoryLimit.use(arr.length)\n for (const item of arr) {\n this.context.push({ [itemName]: item })\n const key = yield keyTemplate.value(this.context)\n this.context.pop()\n if (!map.has(key)) map.set(key, [])\n map.get(key).push(item)\n }\n return [...map.entries()].map(([name, items]) => ({ name, items }))\n}\n\nfunction * search<T extends object> (this: FilterImpl, arr: T[], property: string, expected: string): IterableIterator<unknown> {\n const token = new Tokenizer(stringify(property)).readScopeValue()\n const array = toArray(arr)\n const matcher = expectedMatcher.call(this, expected)\n for (let index = 0; index < array.length; index++) {\n const value = yield evalToken(token, this.context.spawn(array[index]))\n if (matcher(value)) return [index, array[index]]\n }\n}\n\nfunction * search_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const predicate = new Value(stringify(exp), this.liquid)\n const array = toArray(arr)\n for (let index = 0; index < array.length; index++) {\n this.context.push({ [itemName]: array[index] })\n const value = yield predicate.value(this.context)\n this.context.pop()\n if (value) return [index, array[index]]\n }\n}\n\nexport function * has<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n const result = yield * search.call(this, arr, property, expected)\n return !!result\n}\n\nexport function * has_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return !!result\n}\n\nexport function * find_index<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n const result = yield * search.call(this, arr, property, expected)\n return result ? result[0] : undefined\n}\n\nexport function * find_index_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return result ? result[0] : undefined\n}\n\nexport function * find<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n const result = yield * search.call(this, arr, property, expected)\n return result ? result[1] : undefined\n}\n\nexport function * find_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return result ? result[1] : undefined\n}\n\nexport function uniq<T> (this: FilterImpl, arr: T[]): T[] {\n arr = toArray(arr)\n this.context.memoryLimit.use(arr.length)\n return [...new Set(arr)]\n}\n\nexport function sample<T> (this: FilterImpl, v: T[] | string, count = 1): T | string | (T | string)[] {\n v = toValue(v)\n if (isNil(v)) return []\n if (!isArray(v)) v = stringify(v)\n this.context.memoryLimit.use(count)\n const shuffled = [...v].sort(() => Math.random() - 0.5)\n if (count === 1) return shuffled[0]\n return shuffled.slice(0, count)\n}\n","import { toValue, stringify, isString, isNumber, LiquidDate, strftime, isNil } from '../util'\nimport { FilterImpl } from '../template'\nimport { NormalizedFullOptions } from '../liquid-options'\n\nexport function date (this: FilterImpl, v: string | Date, format?: string, timezoneOffset?: number | string) {\n const size = ((v as string)?.length ?? 0) + (format?.length ?? 0) + ((timezoneOffset as string)?.length ?? 0)\n this.context.memoryLimit.use(size)\n const date = parseDate(v, this.context.opts, timezoneOffset)\n if (!date) return v\n format = toValue(format)\n format = isNil(format) ? this.context.opts.dateFormat : stringify(format)\n return strftime(date, format)\n}\n\nexport function date_to_xmlschema (this: FilterImpl, v: string | Date) {\n return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z')\n}\n\nexport function date_to_rfc822 (this: FilterImpl, v: string | Date) {\n return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z')\n}\n\nexport function date_to_string (this: FilterImpl, v: string | Date, type?: string, style?: string) {\n return stringify_date.call(this, v, '%b', type, style)\n}\n\nexport function date_to_long_string (this: FilterImpl, v: string | Date, type?: string, style?: string) {\n return stringify_date.call(this, v, '%B', type, style)\n}\n\nfunction stringify_date (this: FilterImpl, v: string | Date, month_type: string, type?: string, style?: string) {\n const date = parseDate(v, this.context.opts)\n if (!date) return v\n if (type === 'ordinal') {\n const d = date.getDate()\n return style === 'US'\n ? strftime(date, `${month_type} ${d}%q, %Y`)\n : strftime(date, `${d}%q ${month_type} %Y`)\n }\n return strftime(date, `%d ${month_type} %Y`)\n}\n\nfunction parseDate (v: string | Date, opts: NormalizedFullOptions, timezoneOffset?: number | string): LiquidDate | undefined {\n let date: LiquidDate | undefined\n const defaultTimezoneOffset = timezoneOffset ?? opts.timezoneOffset\n const locale = opts.locale\n v = toValue(v)\n if (v === 'now' || v === 'today') {\n date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset)\n } else if (isNumber(v)) {\n date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset)\n } else if (isString(v)) {\n if (/^\\d+$/.test(v)) {\n date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset)\n } else if (opts.preserveTimezones && timezoneOffset === undefined) {\n date = LiquidDate.createDateFixedToTimezone(v, locale)\n } else {\n date = new LiquidDate(v, locale, defaultTimezoneOffset)\n }\n } else {\n date = new LiquidDate(v, locale, defaultTimezoneOffset)\n }\n return date.valid() ? date : undefined\n}\n","/**\n * String related filters\n *\n * * prefer stringify() to String() since `undefined`, `null` should eval ''\n */\n\n// Han (Chinese) characters: \\u4E00-\\u9FFF\n// Additional Han characters: \\uF900-\\uFAFF (CJK Compatibility Ideographs)\n// Additional Han characters: \\u3400-\\u4DBF (CJK Unified Ideographs Extension A)\n// Katakana (Japanese): \\u30A0-\\u30FF\n// Hiragana (Japanese): \\u3040-\\u309F\n// Hangul (Korean): \\uAC00-\\uD7AF\nimport { FilterImpl } from '../template'\nimport { assert, escapeRegExp, stringify } from '../util'\n\nconst rCJKWord = /[\\u4E00-\\u9FFF\\uF900-\\uFAFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF]/gu\n\n// Word boundary followed by word characters (for detecting words)\nconst rNonCJKWord = /[^\\u4E00-\\u9FFF\\uF900-\\uFAFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF\\s]+/gu\n\nexport function append (this: FilterImpl, v: string, arg: string) {\n assert(arguments.length === 2, 'append expect 2 arguments')\n const lhs = stringify(v)\n const rhs = stringify(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return lhs + rhs\n}\n\nexport function prepend (this: FilterImpl, v: string, arg: string) {\n assert(arguments.length === 2, 'prepend expect 2 arguments')\n const lhs = stringify(v)\n const rhs = stringify(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return rhs + lhs\n}\n\nexport function lstrip (this: FilterImpl, v: string, chars?: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = escapeRegExp(stringify(chars))\n return str.replace(new RegExp(`^[${chars}]+`, 'g'), '')\n }\n return str.replace(/^\\s+/, '')\n}\n\nexport function downcase (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.toLowerCase()\n}\n\nexport function upcase (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return stringify(str).toUpperCase()\n}\n\nexport function remove (this: FilterImpl, v: string, arg: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.split(stringify(arg)).join('')\n}\n\nexport function remove_first (this: FilterImpl, v: string, l: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(stringify(l), '')\n}\n\nexport function remove_last (this: FilterImpl, v: string, l: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const pattern = stringify(l)\n const index = str.lastIndexOf(pattern)\n if (index === -1) return str\n return str.substring(0, index) + str.substring(index + pattern.length)\n}\n\nexport function rstrip (this: FilterImpl, str: string, chars?: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = escapeRegExp(stringify(chars))\n return str.replace(new RegExp(`[${chars}]+$`, 'g'), '')\n }\n return str.replace(/\\s+$/, '')\n}\n\nexport function split (this: FilterImpl, v: string, arg: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const arr = str.split(stringify(arg))\n // align to ruby split, which is the behavior of shopify/liquid\n // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split\n while (arr.length && arr[arr.length - 1] === '') arr.pop()\n return arr\n}\n\nexport function strip (this: FilterImpl, v: string, chars?: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = escapeRegExp(stringify(chars))\n return str\n .replace(new RegExp(`^[${chars}]+`, 'g'), '')\n .replace(new RegExp(`[${chars}]+$`, 'g'), '')\n }\n return str.trim()\n}\n\nexport function strip_newlines (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\r?\\n/gm, '')\n}\n\nexport function capitalize (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\nexport function replace (this: FilterImpl, v: string, pattern: string, replacement: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.split(stringify(pattern)).join(replacement)\n}\n\nexport function replace_first (this: FilterImpl, v: string, arg1: string, arg2: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(stringify(arg1), arg2)\n}\n\nexport function replace_last (this: FilterImpl, v: string, arg1: string, arg2: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const pattern = stringify(arg1)\n const index = str.lastIndexOf(pattern)\n if (index === -1) return str\n const replacement = stringify(arg2)\n return str.substring(0, index) + replacement + str.substring(index + pattern.length)\n}\n\nexport function truncate (this: FilterImpl, v: string, l = 50, o = '...') {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (str.length <= l) return v\n return str.substring(0, l - o.length) + o\n}\n\nexport function truncatewords (this: FilterImpl, v: string, words = 15, o = '...') {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const arr = str.split(/\\s+/)\n if (words <= 0) words = 1\n let ret = arr.slice(0, words).join(' ')\n if (arr.length >= words) ret += o\n return ret\n}\n\nexport function normalize_whitespace (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\s+/g, ' ')\n}\n\nexport function number_of_words (this: FilterImpl, input: string, mode?: 'cjk' | 'auto') {\n const str = stringify(input)\n this.context.memoryLimit.use(str.length)\n input = str.trim()\n if (!input) return 0\n switch (mode) {\n case 'cjk':\n // Count CJK characters and words\n return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length\n case 'auto':\n // Count CJK characters, if none, count words\n return rCJKWord.test(input)\n ? input.match(rCJKWord)!.length + (input.match(rNonCJKWord) || []).length\n : input.split(/\\s+/).length\n default:\n // Count words only\n return input.split(/\\s+/).length\n }\n}\n\nexport function array_to_sentence_string (this: FilterImpl, array: unknown[], connector = 'and') {\n this.context.memoryLimit.use(array.length)\n switch (array.length) {\n case 0:\n return ''\n case 1:\n return array[0]\n case 2:\n return `${array[0]} ${connector} ${array[1]}`\n default:\n return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`\n }\n}\n","import * as htmlFilters from './html'\nimport * as mathFilters from './math'\nimport * as urlFilters from './url'\nimport * as arrayFilters from './array'\nimport * as dateFilters from './date'\nimport * as stringFilters from './string'\nimport misc from './misc'\nimport { FilterImplOptions } from '../template'\n\nexport const filters: Record<string, FilterImplOptions> = {\n ...htmlFilters,\n ...mathFilters,\n ...urlFilters,\n ...arrayFilters,\n ...dateFilters,\n ...stringFilters,\n ...misc\n}\n","import { Value, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\nimport { IdentifierToken } from '../tokens'\n\nexport default class extends Tag {\n private key: string\n private value: Value\n private identifier: IdentifierToken\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.key = this.identifier.content\n this.tokenizer.assert(this.key, 'expected variable name')\n\n this.tokenizer.skipBlank()\n this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected \"=\"')\n\n this.tokenizer.advance()\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n }\n * render (ctx: Context): Generator<unknown, void, unknown> {\n ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf)\n }\n\n public * arguments (): Arguments {\n yield this.value\n }\n\n public * localScope (): Iterable<IdentifierToken> {\n yield this.identifier\n }\n}\n","import { Hash, ValueToken, Liquid, Tag, evalToken, Emitter, TagToken, TopLevelToken, Context, Template, ParseStream } from '..'\nimport { assertEmpty, isValueToken, toEnumerable } from '../util'\nimport { ForloopDrop } from '../drop/forloop-drop'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nconst MODIFIERS = ['offset', 'limit', 'reversed']\n\ntype valueOf<T> = T[keyof T]\n\nexport default class extends Tag {\n variable: string\n collection: ValueToken\n hash: Hash\n templates: Template[]\n elseTemplates: Template[]\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const variable = this.tokenizer.readIdentifier()\n const inStr = this.tokenizer.readIdentifier()\n const collection = this.tokenizer.readValue()\n if (!variable.size() || inStr.content !== 'in' || !collection) {\n throw new Error(`illegal tag: ${token.getText()}`)\n }\n\n this.variable = variable.content\n this.collection = collection\n this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on<TagToken>('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates })\n .on<TagToken>('tag:endfor', tag => { assertEmpty(tag.args); stream.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${token.getText()} not closed`) })\n\n stream.start()\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void | string, Template[]> {\n const r = this.liquid.renderer\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n\n if (!collection.length) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n return\n }\n\n const continueKey = 'continue-' + this.variable + '-' + this.collection.getText()\n ctx.push({ continue: ctx.getRegister(continueKey) })\n const hash = yield this.hash.render(ctx)\n ctx.pop()\n\n const modifiers = this.liquid.options.orderedFilterParameters\n ? Object.keys(hash).filter(x => MODIFIERS.includes(x))\n : MODIFIERS.filter(x => hash[x] !== undefined)\n\n collection = modifiers.reduce((collection, modifier: valueOf<typeof MODIFIERS>) => {\n if (modifier === 'offset') return offset(collection, hash['offset'])\n if (modifier === 'limit') return limit(collection, hash['limit'])\n return reversed(collection)\n }, collection)\n\n ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length)\n const scope = { forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) }\n ctx.push(scope)\n for (const item of collection) {\n scope[this.variable] = item\n ctx.continueCalled = ctx.breakCalled = false\n yield r.renderTemplates(this.templates, ctx, emitter)\n if (ctx.breakCalled) break\n scope.forloop.next()\n }\n ctx.continueCalled = ctx.breakCalled = false\n ctx.pop()\n }\n\n public * children (): Generator<unknown, Template[]> {\n const templates = this.templates.slice()\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n\n public * arguments (): Arguments {\n yield this.collection\n\n for (const v of Object.values(this.hash.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n }\n\n public blockScope (): Iterable<string> {\n return [this.variable, 'forloop']\n }\n}\n\nfunction reversed<T> (arr: Array<T>) {\n return [...arr].reverse()\n}\n\nfunction offset<T> (arr: Array<T>, count: number) {\n return arr.slice(count)\n}\n\nfunction limit<T> (arr: Array<T>, count: number) {\n return arr.slice(0, count)\n}\n","import { Liquid, Tag, Template, Context, TagToken, TopLevelToken } from '..'\nimport { Parser } from '../parser'\nimport { IdentifierToken, QuotedToken } from '../tokens'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n identifier: IdentifierToken | QuotedToken\n variable: string\n templates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n this.identifier = this.readVariable()\n this.variable = this.identifier.content\n\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endcapture') return\n this.templates.push(parser.parseToken(token, remainTokens))\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n\n private readVariable (): IdentifierToken | QuotedToken {\n let ident: IdentifierToken | QuotedToken | undefined = this.tokenizer.readIdentifier()\n if (ident.content) return ident\n ident = this.tokenizer.readQuoted()\n if (ident) return ident\n throw this.tokenizer.error('invalid capture name')\n }\n\n * render (ctx: Context): Generator<unknown, void, string> {\n const r = this.liquid.renderer\n const html = yield r.renderTemplates(this.templates, ctx)\n ctx.bottom()[this.variable] = html\n }\n\n public * children (): Generator<unknown, Template[]> {\n return this.templates\n }\n\n public * localScope (): Iterable<string | IdentifierToken | QuotedToken> {\n yield this.identifier\n }\n}\n","import { ValueToken, Liquid, toValue, evalToken, Value, Emitter, TagToken, TopLevelToken, Context, Template, Tag, ParseStream } from '..'\nimport { Parser } from '../parser'\nimport { equals } from '../render'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n value: Value\n branches: { values: ValueToken[], templates: Template[] }[] = []\n elseTemplates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n this.elseTemplates = []\n\n let p: Template[] = []\n let elseCount = 0\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('tag:when', (token: TagToken) => {\n if (elseCount > 0) {\n return\n }\n\n p = []\n\n const values: ValueToken[] = []\n while (!token.tokenizer.end()) {\n values.push(token.tokenizer.readValueOrThrow())\n token.tokenizer.skipBlank()\n if (token.tokenizer.peek() === ',') {\n token.tokenizer.readTo(',')\n } else {\n token.tokenizer.readTo('or')\n }\n }\n this.branches.push({\n values,\n templates: p\n })\n })\n .on('tag:else', () => {\n elseCount++\n p = this.elseTemplates\n })\n .on('tag:endcase', () => stream.stop())\n .on('template', (tpl: Template) => {\n if (p !== this.elseTemplates || elseCount === 1) {\n p.push(tpl)\n }\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const r = this.liquid.renderer\n const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf))\n let branchHit = false\n for (const branch of this.branches) {\n for (const valueToken of branch.values) {\n const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf)\n if (equals(target, value)) {\n yield r.renderTemplates(branch.templates, ctx, emitter)\n branchHit = true\n break\n }\n }\n }\n if (!branchHit) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n }\n\n public * arguments (): Arguments {\n yield this.value\n yield * this.branches.flatMap(b => b.values)\n }\n\n public * children (): Generator<unknown, Template[]> {\n const templates = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n}\n","import { Liquid, TopLevelToken, TagToken, Tag } from '..'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endcomment') return\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n render () {}\n}\n","import { __assign } from 'tslib'\nimport { ForloopDrop } from '../drop'\nimport { isString, isValueToken, toEnumerable } from '../util'\nimport { TopLevelToken, assert, Liquid, Token, Template, evalQuotedToken, TypeGuards, Tokenizer, evalToken, Hash, Emitter, TagToken, Context, Tag } from '..'\nimport { Parser } from '../parser'\nimport { Argument, Arguments, PartialScope } from '../template'\n\nexport type ParsedFileName = Template[] | Token | string | undefined\n\nexport default class extends Tag {\n private file: ParsedFileName\n private currentFile?: string\n private hash: Hash\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const tokenizer = this.tokenizer\n this.file = parseFilePath(tokenizer, this.liquid, parser)\n this.currentFile = token.file\n while (!tokenizer.end()) {\n tokenizer.skipBlank()\n const begin = tokenizer.p\n const keyword = tokenizer.readIdentifier()\n if (keyword.content === 'with' || keyword.content === 'for') {\n tokenizer.skipBlank()\n // can be normal key/value pair, like \"with: true\"\n if (tokenizer.peek() !== ':') {\n const value = tokenizer.readValue()\n // can be normal key, like \"with,\"\n if (value) {\n const beforeAs = tokenizer.p\n const asStr = tokenizer.readIdentifier()\n let alias\n if (asStr.content === 'as') alias = tokenizer.readIdentifier()\n else tokenizer.p = beforeAs\n\n this[keyword.content] = { value, alias: alias && alias.content }\n tokenizer.skipBlank()\n if (tokenizer.peek() === ',') tokenizer.advance()\n continue // matched!\n }\n }\n }\n /**\n * restore cursor if with/for not matched\n */\n tokenizer.p = begin\n break\n }\n this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator)\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const { liquid, hash } = this\n const filepath = (yield renderFilePath(this['file'], ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n\n const childCtx = ctx.spawn()\n const scope = childCtx.bottom()\n __assign(scope, yield hash.render(ctx))\n if (this['with']) {\n const { value, alias } = this['with']\n scope[alias || filepath] = yield evalToken(value, ctx)\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n const collection = toEnumerable(yield evalToken(value, ctx))\n scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias)\n for (const item of collection) {\n scope[alias] = item\n const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])) as Template[]\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n scope['forloop'].next()\n }\n } else {\n const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])) as Template[]\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n }\n }\n\n public * children (partials: boolean, sync: boolean): Generator<unknown, Template[]> {\n if (partials && isString(this['file'])) {\n return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])) as Template[]\n }\n return []\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this['file'])) {\n const names: Array<string | [string, Argument]> = Object.keys(this.hash.hash)\n\n if (this['with']) {\n const { value, alias } = this['with']\n if (isString(alias)) {\n names.push([alias, value])\n } else if (isString(this.file)) {\n names.push([this.file, value])\n }\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n if (isString(alias)) {\n names.push([alias, value])\n } else if (isString(this.file)) {\n names.push([this.file, value])\n }\n }\n\n return { name: this['file'], isolated: true, scope: names }\n }\n }\n\n public * arguments (): Arguments {\n for (const v of Object.values(this.hash.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n\n if (this['with']) {\n const { value } = this['with']\n if (isValueToken(value)) {\n yield value\n }\n }\n\n if (this['for']) {\n const { value } = this['for']\n if (isValueToken(value)) {\n yield value\n }\n }\n }\n}\n\n/**\n * @return null for \"none\",\n * @return Template[] for quoted with tags and/or filters\n * @return Token for expression (not quoted)\n * @throws TypeError if cannot read next token\n */\nexport function parseFilePath (tokenizer: Tokenizer, liquid: Liquid, parser: Parser): ParsedFileName {\n if (liquid.options.dynamicPartials) {\n const file = tokenizer.readValue()\n tokenizer.assert(file, 'illegal file path')\n if (file!.getText() === 'none') return\n if (TypeGuards.isQuotedToken(file)) {\n // for filenames like \"files/{{file}}\", eval as liquid template\n const templates = parser.parse(evalQuotedToken(file))\n return optimize(templates)\n }\n return file\n }\n const tokens = [...tokenizer.readFileNameTemplate(liquid.options)]\n const templates = optimize(parser.parseTokens(tokens))\n return templates === 'none' ? undefined : templates\n}\n\nfunction optimize (templates: Template[]): string | Template[] {\n // for filenames like \"files/file.liquid\", extract the string directly\n if (templates.length === 1 && TypeGuards.isHTMLToken(templates[0].token)) return templates[0].token.getContent()\n return templates\n}\n\nexport function * renderFilePath (file: ParsedFileName, ctx: Context, liquid: Liquid): IterableIterator<unknown> {\n if (typeof file === 'string') return file\n if (Array.isArray(file)) return liquid.renderer.renderTemplates(file, ctx)\n return yield evalToken(file, ctx)\n}\n","import { Template, ValueToken, TopLevelToken, Liquid, Tag, assert, evalToken, Hash, Emitter, TagToken, Context } from '..'\nimport { BlockMode, Scope } from '../context'\nimport { Parser } from '../parser'\nimport { Argument, Arguments, PartialScope } from '../template'\nimport { isString, isValueToken } from '../util'\nimport { parseFilePath, renderFilePath } from './render'\n\nexport default class extends Tag {\n private withVar?: ValueToken\n private hash: Hash\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const { tokenizer } = token\n this['file'] = parseFilePath(tokenizer, this.liquid, parser)\n this['currentFile'] = token.file\n\n const begin = tokenizer.p\n const withStr = tokenizer.readIdentifier()\n if (withStr.content === 'with') {\n tokenizer.skipBlank()\n if (tokenizer.peek() !== ':') {\n this.withVar = tokenizer.readValue()\n } else tokenizer.p = begin\n } else tokenizer.p = begin\n\n this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator)\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const { liquid, hash, withVar } = this\n const { renderer } = liquid\n const filepath = (yield renderFilePath(this['file'], ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n\n const saved = ctx.saveRegister('blocks', 'blockMode')\n ctx.setRegister('blocks', {})\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n const scope = (yield hash.render(ctx)) as Scope\n if (withVar) scope[filepath] = yield evalToken(withVar, ctx)\n const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])) as Template[]\n ctx.push(ctx.opts.jekyllInclude ? { include: scope } : scope)\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n ctx.restoreRegister(saved)\n }\n\n public * children (partials: boolean, sync: boolean): Generator<unknown, Template[]> {\n if (partials && isString(this['file'])) {\n return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])) as Template[]\n }\n return []\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this['file'])) {\n let names: Array<string | [string, Argument]>\n\n if (this.liquid.options.jekyllInclude) {\n names = ['include']\n } else {\n names = Object.keys(this.hash.hash)\n if (this.withVar) {\n names.push([this['file'], this.withVar])\n }\n }\n\n return { name: this['file'], isolated: false, scope: names }\n }\n }\n\n public * arguments (): Arguments {\n yield * Object.values(this.hash.hash).filter(isValueToken)\n\n if (isValueToken(this['file'])) {\n yield this['file']\n }\n\n if (isValueToken(this.withVar)) {\n yield this.withVar\n }\n }\n}\n","import { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'\nimport { IdentifierToken } from '../tokens'\nimport { isNumber, stringify } from '../util'\n\nexport default class extends Tag {\n private identifier: IdentifierToken\n private variable: string\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.variable = this.identifier.content\n }\n render (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n emitter.write(stringify(--scope[this.variable]))\n }\n\n public * localScope (): Iterable<string | IdentifierToken> {\n yield this.identifier\n }\n}\n","import { TopLevelToken, Liquid, ValueToken, evalToken, Emitter, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n private candidates: ValueToken[] = []\n private group?: ValueToken\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n const group = this.tokenizer.readValue()\n this.tokenizer.skipBlank()\n\n if (group) {\n if (this.tokenizer.peek() === ':') {\n this.group = group\n this.tokenizer.advance()\n } else this.candidates.push(group)\n }\n\n while (!this.tokenizer.end()) {\n const value = this.tokenizer.readValue()\n if (value) this.candidates.push(value)\n this.tokenizer.readTo(',')\n }\n this.tokenizer.assert(this.candidates.length, () => `empty candidates: \"${token.getText()}\"`)\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown> {\n const group = (yield evalToken(this.group, ctx)) as ValueToken\n const fingerprint = `cycle:${group}:` + this.candidates.join(',')\n const groups = ctx.getRegister('cycle')\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 return yield evalToken(candidate, ctx)\n }\n\n public * arguments (): Arguments {\n yield * this.candidates\n\n if (this.group) {\n yield this.group\n }\n }\n}\n","import { Liquid, Tag, Value, Emitter, isTruthy, TagToken, TopLevelToken, Context, Template } from '..'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\nimport { assert, assertEmpty } from '../util'\n\nexport default class extends Tag {\n branches: { value: Value, templates: Template[] }[] = []\n elseTemplates: Template[] | undefined\n\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n let p: Template[] = []\n parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n assert(!this.elseTemplates, 'unexpected elsif after else')\n this.branches.push({\n value: new Value(token.tokenizer.readFilteredValue(), this.liquid),\n templates: (p = [])\n })\n })\n .on<TagToken>('tag:else', tag => {\n assertEmpty(tag.args)\n assert(!this.elseTemplates, 'duplicated else')\n p = this.elseTemplates = []\n })\n .on<TagToken>('tag:endif', function (tag) { assertEmpty(tag.args); this.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, string> {\n const r = this.liquid.renderer\n\n for (const { value, templates } of this.branches) {\n const v = yield value.value(ctx, ctx.opts.lenientIf)\n if (isTruthy(v, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n yield r.renderTemplates(this.elseTemplates || [], ctx, emitter)\n }\n\n public * children (): Generator<unknown, Template[]> {\n const templates = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n\n public arguments (): Arguments {\n return this.branches.map(b => b.value)\n }\n}\n","import { isNumber, stringify } from '../util'\nimport { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'\nimport { IdentifierToken } from '../tokens'\n\nexport default class extends Tag {\n private identifier: IdentifierToken\n private variable: string\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.variable = this.identifier.content\n }\n render (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n const val = scope[this.variable]\n scope[this.variable]++\n emitter.write(stringify(val))\n }\n\n public * localScope (): Iterable<string | IdentifierToken> {\n yield this.identifier\n }\n}\n","import { Scope, Template, Liquid, Tag, assert, Emitter, Hash, TagToken, TopLevelToken, Context } from '..'\nimport { BlockMode } from '../context'\nimport { parseFilePath, renderFilePath, ParsedFileName } from './render'\nimport { BlankDrop } from '../drop'\nimport { Parser } from '../parser'\nimport { Arguments, PartialScope } from '../template'\nimport { isString, isValueToken } from '../util'\n\nexport default class extends Tag {\n args: Hash\n templates: Template[]\n file?: ParsedFileName\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n this.file = parseFilePath(this.tokenizer, this.liquid, parser)\n this['currentFile'] = token.file\n this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = parser.parseTokens(remainTokens)\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown> {\n const { liquid, args, file } = this\n const { renderer } = liquid\n if (file === undefined) {\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n yield renderer.renderTemplates(this.templates, ctx, emitter)\n return\n }\n const filepath = (yield renderFilePath(this.file, ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])) as Template[]\n\n // render remaining contents and store rendered results\n ctx.setRegister('blockMode', BlockMode.STORE)\n const html = yield renderer.renderTemplates(this.templates, ctx)\n const blocks = ctx.getRegister('blocks')\n\n // set whole content to anonymous block if anonymous doesn't specified\n if (blocks[''] === undefined) blocks[''] = (parent: BlankDrop, emitter: Emitter) => emitter.write(html)\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n\n // render the layout file use stored blocks\n ctx.push((yield args.render(ctx)) as Scope)\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n }\n\n public * children (partials: boolean): Generator<unknown, Template[]> {\n const templates = this.templates.slice()\n\n if (partials && isString(this.file)) {\n templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile'])) as Template[])\n }\n\n return templates\n }\n\n public * arguments (): Arguments {\n for (const v of Object.values(this.args.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n\n if (isValueToken(this.file)) {\n yield this.file\n }\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this.file)) {\n return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) }\n }\n }\n}\n","import { BlockMode } from '../context'\nimport { isTagToken } from '../util'\nimport { BlockDrop } from '../drop'\nimport { Liquid, TagToken, TopLevelToken, Template, Context, Emitter, Tag } from '..'\nimport { Parser } from '../parser'\n\nexport default class extends Tag {\n block: string\n templates: Template[] = []\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const match = /\\w+/.exec(token.args)\n this.block = match ? match[0] : ''\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endblock') return\n const template = parser.parseToken(token, remainTokens)\n this.templates.push(template)\n }\n throw new Error(`tag ${token.getText()} not closed`)\n }\n\n * render (ctx: Context, emitter: Emitter) {\n const blockRender = this.getBlockRender(ctx)\n if (ctx.getRegister('blockMode') === BlockMode.STORE) {\n ctx.getRegister('blocks')[this.block] = blockRender\n } else {\n yield blockRender(new BlockDrop(), emitter)\n }\n }\n\n private getBlockRender (ctx: Context) {\n const { liquid, templates } = this\n const renderChild = ctx.getRegister('blocks')[this.block]\n const renderCurrent = function * (superBlock: BlockDrop, emitter: Emitter) {\n // add {{ block.super }} support when rendering\n ctx.push({ block: superBlock })\n yield liquid.renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n }\n return renderChild\n ? (superBlock: BlockDrop, emitter: Emitter) => renderChild(\n new BlockDrop(\n (emitter: Emitter) => renderCurrent(superBlock, emitter)\n ),\n emitter)\n : renderCurrent\n }\n\n public * children (): Generator<unknown, Template[]> {\n return this.templates\n }\n\n public blockScope (): Iterable<string> {\n return ['block']\n }\n}\n","import { Liquid, TagToken, TopLevelToken, Tag } from '..'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n private tokens: TopLevelToken[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endraw') return\n this.tokens.push(token)\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n render () {\n return this.tokens.map((token: TopLevelToken) => token.getText()).join('')\n }\n}\n","import { ForloopDrop } from './forloop-drop'\n\nexport class TablerowloopDrop extends ForloopDrop {\n private cols: number\n public constructor (length: number, cols: number, collection: string, variable: string) {\n super(length, collection, variable)\n this.length = length\n this.cols = cols\n }\n public row () {\n return Math.floor(this.i / this.cols) + 1\n }\n public col0 () {\n return (this.i % this.cols)\n }\n public col () {\n return this.col0() + 1\n }\n public col_first () { // eslint-disable-line\n return this.col0() === 0\n }\n public col_last () { // eslint-disable-line\n return this.col() === this.cols\n }\n}\n","import { isValueToken, toEnumerable } from '../util'\nimport { ValueToken, Liquid, Tag, evalToken, Emitter, Hash, TagToken, TopLevelToken, Context, Template, ParseStream } from '..'\nimport { TablerowloopDrop } from '../drop/tablerowloop-drop'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n variable: string\n args: Hash\n templates: Template[]\n collection: ValueToken\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n const variable = this.tokenizer.readIdentifier()\n this.tokenizer.skipBlank()\n\n const predicate = this.tokenizer.readIdentifier()\n const collectionToken = this.tokenizer.readValue()\n if (predicate.content !== 'in' || !collectionToken) {\n throw new Error(`illegal tag: ${tagToken.getText()}`)\n }\n\n this.variable = variable.content\n this.collection = collectionToken\n this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = []\n\n let p\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:endtablerow', () => stream.stop())\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n const args = (yield this.args.render(ctx)) as Record<string, any>\n const offset = args.offset || 0\n const limit = (args.limit === undefined) ? collection.length : args.limit\n\n collection = collection.slice(offset, offset + limit)\n const cols = args.cols || collection.length\n\n const r = this.liquid.renderer\n const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable)\n const scope = { tablerowloop }\n ctx.push(scope)\n\n for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) {\n scope[this.variable] = collection[idx]\n if (tablerowloop.col0() === 0) {\n if (tablerowloop.row() !== 1) emitter.write('</tr>')\n emitter.write(`<tr class=\"row${tablerowloop.row()}\">`)\n }\n emitter.write(`<td class=\"col${tablerowloop.col()}\">`)\n yield r.renderTemplates(this.templates, ctx, emitter)\n emitter.write('</td>')\n }\n if (collection.length) emitter.write('</tr>')\n ctx.pop()\n }\n\n public * children (): Generator<unknown, Template[]> {\n return this.templates\n }\n\n public * arguments (): Arguments {\n yield this.collection\n\n for (const v of Object.values(this.args.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n }\n\n public blockScope (): string[] {\n return [this.variable, 'tablerowloop']\n }\n}\n","import { Liquid, Tag, Value, TopLevelToken, Template, Emitter, isTruthy, isFalsy, Context, TagToken } from '..'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n branches: { value: Value, test: (val: any, ctx: Context) => boolean, templates: Template[] }[] = []\n elseTemplates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n let p: Template[] = []\n let elseCount = 0\n parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),\n test: isFalsy,\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n if (elseCount > 0) {\n p = []\n return\n }\n this.branches.push({\n value: new Value(token.tokenizer.readFilteredValue(), this.liquid),\n test: isTruthy,\n templates: (p = [])\n })\n })\n .on('tag:else', () => {\n elseCount++\n p = this.elseTemplates\n })\n .on('tag:endunless', function () { this.stop() })\n .on('template', (tpl: Template) => {\n if (p !== this.elseTemplates || elseCount === 1) {\n p.push(tpl)\n }\n })\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown> {\n const r = this.liquid.renderer\n\n for (const { value, test, templates } of this.branches) {\n const v = yield value.value(ctx, ctx.opts.lenientIf)\n if (test(v, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n\n public * children (): Generator<unknown, Template[]> {\n const children = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n children.push(...this.elseTemplates)\n }\n return children\n }\n\n public arguments (): Arguments {\n return this.branches.map(b => b.value)\n }\n}\n","import { Context, Emitter, Tag } from '..'\n\nexport default class extends Tag {\n render (ctx: Context, _emitter: Emitter) {\n ctx.breakCalled = true\n }\n}\n","import { Tag, Emitter, Context } from '..'\n\nexport default class extends Tag {\n render (ctx: Context, _emitter: Emitter) {\n ctx.continueCalled = true\n }\n}\n","import { Liquid, TopLevelToken, Emitter, Value, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n private value?: Value\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.tokenizer.skipBlank()\n if (!this.tokenizer.end()) {\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n }\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n if (!this.value) return\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n\n public * arguments (): Arguments {\n if (this.value) {\n yield this.value\n }\n }\n}\n","import { Template, Emitter, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'\nimport { Parser } from '../parser'\n\nexport default class extends Tag {\n templates: Template[]\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options)\n this.templates = parser.parseTokens(tokens)\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter)\n }\n\n public * children (): Generator<unknown, Template[]> {\n return this.templates\n }\n}\n","import { TagToken, Liquid, TopLevelToken, Tag } from '..'\n\nexport default class extends Tag {\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n if (tagToken.args.search(/\\n\\s*[^#\\s]/g) !== -1) {\n throw new Error('every line of an inline comment must start with a \\'#\\' character')\n }\n }\n render () { }\n}\n","import AssignTag from './assign'\nimport ForTag from './for'\nimport CaptureTag from './capture'\nimport CaseTag from './case'\nimport CommentTag from './comment'\nimport IncludeTag from './include'\nimport RenderTag from './render'\nimport DecrementTag from './decrement'\nimport CycleTag from './cycle'\nimport IfTag from './if'\nimport IncrementTag from './increment'\nimport LayoutTag from './layout'\nimport BlockTag from './block'\nimport RawTag from './raw'\nimport TablerowTag from './tablerow'\nimport UnlessTag from './unless'\nimport BreakTag from './break'\nimport ContinueTag from './continue'\nimport EchoTag from './echo'\nimport LiquidTag from './liquid'\nimport InlineCommentTag from './inline-comment'\nimport type { TagClass } from '../template/tag'\n\nexport const tags: Record<string, TagClass> = {\n assign: AssignTag,\n 'for': ForTag,\n capture: CaptureTag,\n 'case': CaseTag,\n comment: CommentTag,\n include: IncludeTag,\n render: RenderTag,\n decrement: DecrementTag,\n increment: IncrementTag,\n cycle: CycleTag,\n 'if': IfTag,\n layout: LayoutTag,\n block: BlockTag,\n raw: RawTag,\n tablerow: TablerowTag,\n unless: UnlessTag,\n 'break': BreakTag,\n 'continue': ContinueTag,\n echo: EchoTag,\n liquid: LiquidTag,\n '#': InlineCommentTag\n}\n\nexport { AssignTag, ForTag, CaptureTag, CaseTag, CommentTag, IncludeTag, RenderTag, DecrementTag, IncrementTag, CycleTag, IfTag, LayoutTag, BlockTag, RawTag, TablerowTag, UnlessTag, BreakTag, ContinueTag, EchoTag, LiquidTag, InlineCommentTag }\n","import { Context } from './context'\nimport { toPromise, toValueSync, isFunction, forOwn, isString, strictUniq } from './util'\nimport { TagClass, createTagClass, TagImplOptions, FilterImplOptions, Template, Value, StaticAnalysisOptions, StaticAnalysis, analyze, analyzeSync, SegmentArray } from './template'\nimport { LookupType } from './fs/loader'\nimport { Render } from './render'\nimport { Parser } from './parser'\nimport { tags } from './tags'\nimport { filters } from './filters'\nimport { LiquidOptions, normalizeDirectoryList, NormalizedFullOptions, normalize, RenderOptions, RenderFileOptions } from './liquid-options'\n\nexport class Liquid {\n public readonly options: NormalizedFullOptions\n public readonly renderer = new Render()\n /**\n * @deprecated will be removed. In tags use `this.parser` instead\n */\n public readonly parser: Parser\n public readonly filters: Record<string, FilterImplOptions> = {}\n public readonly tags: Record<string, TagClass> = {}\n\n public constructor (opts: LiquidOptions = {}) {\n this.options = normalize(opts)\n // eslint-disable-next-line deprecation/deprecation\n this.parser = new Parser(this)\n forOwn(tags, (conf: TagClass, name: string) => this.registerTag(name, conf))\n forOwn(filters, (handler: FilterImplOptions, name: string) => this.registerFilter(name, handler))\n }\n public parse (html: string, filepath?: string): Template[] {\n const parser = new Parser(this)\n return parser.parse(html, filepath)\n }\n\n public _render (tpl: Template[], scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator<any> {\n const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplates(tpl, ctx)\n }\n public async render (tpl: Template[], scope?: object, renderOptions?: RenderOptions): Promise<any> {\n return toPromise(this._render(tpl, scope, { ...renderOptions, sync: false }))\n }\n public renderSync (tpl: Template[], scope?: object, renderOptions?: RenderOptions): any {\n return toValueSync(this._render(tpl, scope, { ...renderOptions, sync: true }))\n }\n public renderToNodeStream (tpl: Template[], scope?: object, renderOptions: RenderOptions = {}): NodeJS.ReadableStream {\n const ctx = new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplatesToNodeStream(tpl, ctx)\n }\n\n public _parseAndRender (html: string, scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator<any> {\n const tpl = this.parse(html)\n return this._render(tpl, scope, renderOptions)\n }\n public async parseAndRender (html: string, scope?: Context | object, renderOptions?: RenderOptions): Promise<any> {\n return toPromise(this._parseAndRender(html, scope, { ...renderOptions, sync: false }))\n }\n public parseAndRenderSync (html: string, scope?: Context | object, renderOptions?: RenderOptions): any {\n return toValueSync(this._parseAndRender(html, scope, { ...renderOptions, sync: true }))\n }\n\n public _parsePartialFile (file: string, sync?: boolean, currentFile?: string) {\n return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile)\n }\n public _parseLayoutFile (file: string, sync?: boolean, currentFile?: string) {\n return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile)\n }\n public _parseFile (file: string, sync?: boolean, lookupType?: LookupType, currentFile?: string): Generator<unknown, Template[]> {\n return new Parser(this).parseFile(file, sync, lookupType, currentFile)\n }\n public async parseFile (file: string, lookupType?: LookupType): Promise<Template[]> {\n return toPromise<Template[]>(new Parser(this).parseFile(file, false, lookupType))\n }\n public parseFileSync (file: string, lookupType?: LookupType): Template[] {\n return toValueSync<Template[]>(new Parser(this).parseFile(file, true, lookupType))\n }\n public * _renderFile (file: string, ctx: Context | object | undefined, renderFileOptions: RenderFileOptions): Generator<any> {\n const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)) as Template[]\n return yield this._render(templates, ctx, renderFileOptions)\n }\n public async renderFile (file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions) {\n return toPromise(this._renderFile(file, ctx, { ...renderFileOptions, sync: false }))\n }\n public renderFileSync (file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions) {\n return toValueSync(this._renderFile(file, ctx, { ...renderFileOptions, sync: true }))\n }\n public async renderFileToNodeStream (file: string, scope?: object, renderOptions?: RenderOptions) {\n const templates = await this.parseFile(file)\n return this.renderToNodeStream(templates, scope, renderOptions)\n }\n\n public _evalValue (str: string, scope?: object | Context): IterableIterator<any> {\n const value = new Value(str, this)\n const ctx = scope instanceof Context ? scope : new Context(scope, this.options)\n return value.value(ctx)\n }\n public async evalValue (str: string, scope?: object | Context): Promise<any> {\n return toPromise(this._evalValue(str, scope))\n }\n public evalValueSync (str: string, scope?: object | Context): any {\n return toValueSync(this._evalValue(str, scope))\n }\n\n public registerFilter (name: string, filter: FilterImplOptions) {\n this.filters[name] = filter\n }\n public registerTag (name: string, tag: TagClass | TagImplOptions) {\n this.tags[name] = isFunction(tag) ? tag : createTagClass(tag)\n }\n public plugin (plugin: (this: Liquid, L: typeof Liquid) => void) {\n return plugin.call(this, Liquid)\n }\n public express () {\n const self = this // eslint-disable-line\n let firstCall = true\n\n return function (this: any, filePath: string, ctx: object, callback: (err: Error | null, rendered: string) => void) {\n if (firstCall) {\n firstCall = false\n const dirs = normalizeDirectoryList(this.root)\n self.options.root.unshift(...dirs)\n self.options.layouts.unshift(...dirs)\n self.options.partials.unshift(...dirs)\n }\n self.renderFile(filePath, ctx).then(html => callback(null, html) as any, callback as any)\n }\n }\n\n public async analyze (template: Template[], options: StaticAnalysisOptions = {}): Promise<StaticAnalysis> {\n return analyze(template, options)\n }\n\n public analyzeSync (template: Template[], options: StaticAnalysisOptions = {}): StaticAnalysis {\n return analyzeSync(template, options)\n }\n\n public async parseAndAnalyze (html: string, filename?: string, options: StaticAnalysisOptions = {}): Promise<StaticAnalysis> {\n return analyze(this.parse(html, filename), options)\n }\n\n public parseAndAnalyzeSync (html: string, filename?: string, options: StaticAnalysisOptions = {}): StaticAnalysis {\n return analyzeSync(this.parse(html, filename), options)\n }\n\n /** Return an array of all variables without their properties. */\n public async variables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<string[]> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.variables)\n }\n\n /** Return an array of all variables without their properties. */\n public variablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.variables)\n }\n\n /** Return an array of all variables including their properties/paths. */\n public async fullVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<string[]> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all variables including their properties/paths. */\n public fullVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all variables, each as an array of properties/segments. */\n public async variableSegments (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<Array<SegmentArray>> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all variables, each as an array of properties/segments. */\n public variableSegmentsSync (template: string | Template[], options: StaticAnalysisOptions = {}): Array<SegmentArray> {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all expected context variables without their properties. */\n public async globalVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<string[]> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.globals)\n }\n\n /** Return an array of all expected context variables without their properties. */\n public globalVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.globals)\n }\n\n /** Return an array of all expected context variables including their properties/paths. */\n public async globalFullVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<string[]> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all expected context variables including their properties/paths. */\n public globalFullVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all expected context variables, each as an array of properties/segments. */\n public async globalVariableSegments (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<Array<SegmentArray>> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all expected context variables, each as an array of properties/segments. */\n public globalVariableSegmentsSync (template: string | Template[], options: StaticAnalysisOptions = {}): Array<SegmentArray> {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))))\n }\n}\n","import { isFunction } from '../util'\nimport { Hash } from './hash'\nimport { Tag, TagClass, TagRenderReturn } from './tag'\nimport { TagToken, TopLevelToken } from '../tokens'\nimport { Emitter } from '../emitters'\nimport { Context } from '../context'\nimport type { Liquid } from '../liquid'\n\nexport interface TagImplOptions {\n [key: string]: any\n parse?: (this: Tag & TagImplOptions, token: TagToken, remainingTokens: TopLevelToken[]) => void;\n render: (this: Tag & TagImplOptions, ctx: Context, emitter: Emitter, hash: Record<string, any>) => TagRenderReturn;\n}\n\nexport function createTagClass (options: TagImplOptions): TagClass {\n return class extends Tag {\n constructor (token: TagToken, tokens: TopLevelToken[], liquid: Liquid) {\n super(token, tokens, liquid)\n if (isFunction(options.parse)) {\n options.parse.call(this, token, tokens)\n }\n }\n * render (ctx: Context, emitter: Emitter): TagRenderReturn {\n const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)) as Record<string, any>\n return yield options.render.call(this, ctx, emitter, hash)\n }\n }\n}\n","/* istanbul ignore file */\nexport const version = '[VI]{version}[/VI]'\nexport * as TypeGuards from './util/type-guards'\nexport { toValue, createTrie, Trie, toPromise, toValueSync, assert, LiquidError, ParseError, RenderError, UndefinedVariableError, TokenizationError, AssertionError } from './util'\nexport { Drop } from './drop'\nexport { Emitter } from './emitters'\nexport { defaultOperators, Operators, evalToken, evalQuotedToken, Expression, isFalsy, isTruthy } from './render'\nexport { Context, Scope } from './context'\nexport { Value, Hash, Template, FilterImplOptions, Tag, Filter, Output, Variable, VariableLocation, VariableSegments, Variables, StaticAnalysis, StaticAnalysisOptions, analyze, analyzeSync, Arguments, PartialScope } from './template'\nexport { Token, TopLevelToken, TagToken, ValueToken } from './tokens'\nexport type { RangeToken, LiteralToken, QuotedToken, PropertyAccessToken, NumberToken } from './tokens'\nexport { TokenKind, Tokenizer, ParseStream, Parser } from './parser'\nexport { filters } from './filters'\nexport * from './tags'\nexport { defaultOptions, LiquidOptions } from './liquid-options'\nexport { FS } from './fs'\nexport { Liquid } from './liquid'\n"],"names":["Token","this","input","slice","begin","end","_a","__read","row","col","i","kind","file","Drop","key","context","toString","Object","prototype","toLowerCase","String","hasOwnProperty","isString","value","isFunction","isIterator","val","next","throw","return","stringify","toValue","isNil","isArray","map","join","toEnumerable","length","isObject","Symbol","iterator","Array","from","keys","toArray","valueOf","toNumber","isNumber","call","isArrayLike","forOwn","obj","iteratee","k","last","arr","type","range","start","stop","step","push","padStart","str","ch","pad","add","n","identify","caseInsensitiveCompare","a","b","argumentsToValue","fn","_i","args","argumentsToNumber","escapeRegExp","text","replace","strictUniq","array","seen","Set","array_1","__values","element","JSON","has","_b","TRAIT","__extends","Error","LiquidError","line","lines","msg","token","defineProperty","getPosition","split","Math","max","min","_\r\n .range","lineNumber","rowIndicator","num","_.padStart","colIndicator","enumerable","message","stack","originalError","err","_super","_this","name","update","RenderError","tpl","LiquidErrors","errors","s","variableName","TYPES","WORD","BLANK","INLINE_BLANK","isWord","char","code","charCodeAt","assert","predicate","AssertionError","assertEmpty","NullDrop","EmptyDrop","BlankDrop","test","equals","ForloopDrop","collection","variable","SimpleEmitter","html","buffer","KeepingTypeEmitter","BlockDrop","emitter","superBlockRender","isComparable","arg","gt","geq","lt","leq","nil","literalValues","true","false","null","empty","blank","createTrie","trie","entries","_d","name_1","data","node","c","needBoundary","toPromise","done","state","then","err_1","toValueSync","rFormat","daysInMonth","d","year","getFullYear","getDayOfYear","getMonth","getDate","getWeekOfYear","startDay","now","getDay","Date","floor","padWidths","e","H","I","j","l","L","m","M","S","U","W","padSpaceChars","getTimezoneOffset","opts","nOffset","abs","h","flags","formatCodes","getShortWeekdayName","A","getLongWeekdayName","getShortMonthName","B","getLongMonthName","toLocaleString","C","parseInt","substring","getHours","getMilliseconds","getMinutes","N","width","Number","p","P","q","date","includes","round","getTime","getSeconds","u","w","x","toLocaleDateString","X","toLocaleTimeString","y","Y","z","Z","getTimeZoneName","t","%","strftime","formatStr","match","output","remaining","exec","index","_c","flagStr","modifier","conversion","convert","flagStr_1","flag","ret","padChar","padWidth","toUpperCase","__spreadArray","some","getDateTimeFormat","Intl","DateTimeFormat","undefined","TIMEZONE_PATTERN","monthNames","monthNamesShort","dayNames","dayNamesShort","LiquidDate","displayDate","locale","init","timeZone","timezoneOffset","timezoneFixed","timezoneName","resolvedOptions","format","month","weekday","isNaN","options","dateString","hours","offset","sign","minutes","localDateString","utcDateString","localDate","timezone","diff","time","Limiter","count","base","limit","resource","DelimitedToken","contentRange","trimLeft","trimRight","contentBegin","contentEnd","tl","tr","r","trimTagLeft","trimTagRight","tagDelimiterLeft","tagDelimiterRight","valueBegin","valueEnd","TokenKind","Tag","tokenizer","Tokenizer","operators","readTagName","skipBlank","trimOutputLeft","trimOutputRight","outputDelimiterLeft","outputDelimiterRight","valueRange","Output","HTMLToken","HTML","content","getText","Word","Literal","literal","operatorPrecedences","==","!=",">","<",">=","<=","contains","not","and","or","operatorTypes","OperatorToken","Operator","operator","props","PropertyAccess","Filter","Hash","rHex","rOct","escapeChar","f","v","hexVal","Quoted","fromCharCode","lhs","rhs","Range","LiquidTagToken","initial","filters","FilteredValue","polyfill","getPerformance","global","performance","window","Render","templates","ctx","StreamedEmitter","Promise","resolve","renderTemplates","error","stream","keepOutputType","templates_1","renderLimit","check","render","write","breakCalled","continueCalled","is","e_1","catchAllErrors","Expression","lenient","operands","postfix","isOperatorToken","pop","result","_f","evalToken","tokens","ops","tokens_1","getPrecedence","isPropertyAccessToken","prop","_getFromScope","_get","e_3","UndefinedVariableError","isRangeToken","low","high","memoryLimit","use","evalQuotedToken","isTruthy","isFalsy","jsTruthy","defaultOperators","indexOf","prev","LRU","cache","Node","head","size","ensureLimit","remove","tail","domResolve","root","path","document","createElement","href","getElementsByTagName","insertBefore","firstChild","resolved","removeChild","filepath","ext","origin","url","reject","xhr","XMLHttpRequest","onload","status","responseText","statusText","onerror","open","send","json","space","default","defaultValue","Map","get","raw","handler","jsonify","to_integer","inspect","ancestors","_key","escapeMap","&","\"","'","unescapeMap","&","<",">",""","'","escape","MapFS","existsSync","mapping","readFileSync","segments","sep","dir","segment","defaultOptions","layouts","partials","relativeReference","jekyllInclude","keyValueSeparator","extname","fs","dynamicPartials","dateFormat","greedy","preserveTimezones","strictFilters","strictVariables","ownPropertyOnly","lenientIf","globals","Infinity","parseLimit","normalize","nameOrFunction","dirname","console","warn","normalizeDirectoryList","outputEscape","misc","list","whiteSpaceCtrl","inRaw","isDelimitedToken","mask","isHTMLToken","isTagToken","charAt","readExpressionTokens","readOperator","operand","readValue","matchTrie","opTrie","info","peek","readExpression","valid","snapshot","readFilters","FilteredValueToken","filter","readFilter","read","readIdentifier","readFilterArg","FilterToken","readTopLevelToken","rawBeginAt","readEndrawOrRawContent","readTagToken","readOutputToken","readHTMLToken","stopStrings","readToDelimiter","TagToken","delimiter","respectQuoted","peekType","readQuoted","rmatch","OutputToken","leftPos","readTo","readLiquidTagToken","pos","TokenizationError","IdentifierToken","pred","id","jekyllStyle","hashes","hash","readHash","readNonEmptyIdentifier","HashToken","readLiteral","readRange","readNumber","readProperties","PropertyAccessToken","isBegin","decimalFound","digitFound","NumberToken","advance","literalTrie","LiteralToken","readValueOrThrow","RangeToken","escaped","QuotedToken","htmlStopStrings","htmlStopStringSet","word","pattern","ParseStream","cb","handlers","event","template","trigger","stopRequested","shift","parseToken","TemplateImpl","remainTokens","liquid","_e","_g","readHashes","isKeyValuePair","argv","_j","apply","Value","evaluate","impl","readFilteredValue","getFilter","token_1","getContent","Variable","segmentsString","_visit","segments_1","location","VariableMap","set","fromEntries","defaultStaticAnalysisOptions","_analyze","sync","visit","scope","arguments","extractVariables","updateVariables","variables","aliased","alias","rootScope","localScope","ident","deleteAlias","locals","children","partialScope","partial","_h","_z","partialScopeNames","isolated","DummyScope","_k","_m","argument","variables_1","setAlias","_o","blockScope","_q","asObject","analyze","__assign","analyzeSync","names","aliases","getAlias","to","delete","isValueToken","extractValueTokenVariables","extractPropertyAccessVariable","isQuotedToken","isNumberToken","isWordToken","LookupType","RE_PROPERTY","bracketedRoot","buf","Loader","currentFile","dirs","candidates","Root","exists","lookupError","enforceRoot","shouldLoadRelative","referenced","dirs_1","dirs_2","fallback","roots","rRelativePath_1","RegExp","prefix","referencedFile","_referencedFile","Parser","readTopLevelTokens","parseTokens","TagClass","tags","isOutputToken","ParseError","loader","tpls","task","_parseFile","taskOrTpl","lookup","parse","readFile","parseFile","_parseFileCached","getKind","Delimited","BlockMode","Context","registers","getRegister","keyValues","forEach","setRegister","environments","scopes","reduce","paths","getSync","findScope","readProperty","InternalUndefinedVariableError","candidate","toLiquid","liquidMethodMissing","env","renderOptions","at_least","at_most","ceil","divided_by","dividend","divisor","integerArithmetic","minus","plus","modulo","times","amp","pow","rSlugifyDefault","rSlugifyReplacers","pretty","ascii","latin","none","decodeURIComponent","encodeURIComponent","encodeURI","mode","cased","replacer","complexity","arrayLast","first","reverse","concat","expectedMatcher","expected","jekyllWhere","item","include","property","values","readScopeValue","arr_1","spawn","matcher","_","filter_exp","itemName","exp","filtered","keyTemplate","array_4","search","search_exp","sort","lvalue","rvalue","tuple","propertyString","compare","results","array_2","sum","array_3","clone","unshift","arr_2","items","arr_3","shuffled","random","parseDate","stringify_date","month_type","style","defaultTimezoneOffset","createDateFixedToTimezone","rCJKWord","rNonCJKWord","chars","lastIndexOf","trim","replacement","arg1","arg2","o","words","connector","htmlFilters","mathFilters","urlFilters","arrayFilters","dateFilters","stringFilters","default_1","bottom","identifier","MODIFIERS","renderer","elseTemplates","continueKey","continue","modifiers","orderedFilterParameters","forloop","collection_1","parser","inStr","parseStream","on","tag","tagToken","readVariable","target","branchHit","branches","branch","flatMap","elseCount","renderFilePath","childCtx","_parsePartialFile","parseFilePath","keyword","beforeAs","TypeGuards.isQuotedToken","optimize","readFileNameTemplate","TypeGuards.isHTMLToken","withVar","saved","saveRegister","OUTPUT","restoreRegister","group","fingerprint","groups","idx","_parseLayoutFile","STORE","blocks","parent","blockRender","getBlockRender","block","renderCurrent","superBlock","renderChild","TablerowloopDrop","cols","col0","tablerowloop","collectionToken","test_1","_emitter","readLiquidTagTokens","assign","AssignTag","for","ForTag","capture","CaptureTag","case","CaseTag","comment","CommentTag","IncludeTag","RenderTag","decrement","DecrementTag","increment","IncrementTag","cycle","CycleTag","if","IfTag","layout","LayoutTag","BlockTag","RawTag","tablerow","TablerowTag","unless","UnlessTag","break","BreakTag","ContinueTag","echo","EchoTag","LiquidTag","#","InlineCommentTag","Liquid","_render","renderTemplatesToNodeStream","_parseAndRender","Partials","Layouts","lookupType","renderFileOptions","_renderFile","renderToNodeStream","_evalValue","class_1","plugin","self","firstCall","filePath","callback","renderFile","filename","analysis","conf","registerTag","registerFilter"],"mappings":"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"}
\ No newline at end of file diff --git a/node_modules/liquidjs/dist/liquid.browser.mjs b/node_modules/liquidjs/dist/liquid.browser.mjs new file mode 100644 index 0000000..6f0c9c2 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.mjs @@ -0,0 +1,4937 @@ +/* + * liquidjs@10.23.0, https://github.com/harttle/liquidjs + * (c) 2016-2025 harttle + * Released under the MIT License. + */ +class Token {
+ constructor(kind, input, begin, end, file) {
+ this.kind = kind;
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ }
+ getText() {
+ return this.input.slice(this.begin, this.end);
+ }
+ getPosition() {
+ let [row, col] = [1, 1];
+ for (let i = 0; i < this.begin; i++) {
+ if (this.input[i] === '\n') {
+ row++;
+ col = 1;
+ }
+ else
+ col++;
+ }
+ return [row, col];
+ }
+ size() {
+ return this.end - this.begin;
+ }
+} + +class Drop {
+ liquidMethodMissing(key, context) {
+ return undefined;
+ }
+} + +const toString$1 = Object.prototype.toString;
+const toLowerCase = String.prototype.toLowerCase;
+const hasOwnProperty = Object.hasOwnProperty;
+function isString(value) {
+ return typeof value === 'string';
+}
+// eslint-disable-next-line @typescript-eslint/ban-types
+function isFunction(value) {
+ return typeof value === 'function';
+}
+function isPromise(val) {
+ return val && isFunction(val.then);
+}
+function isIterator(val) {
+ return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return);
+}
+function escapeRegex(str) {
+ return str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
+}
+function stringify(value) {
+ value = toValue(value);
+ if (isString(value))
+ return value;
+ if (isNil(value))
+ return '';
+ if (isArray(value))
+ return value.map(x => stringify(x)).join('');
+ return String(value);
+}
+function toEnumerable(val) {
+ val = toValue(val);
+ if (isArray(val))
+ return val;
+ if (isString(val) && val.length > 0)
+ return [val];
+ if (isIterable(val))
+ return Array.from(val);
+ if (isObject(val))
+ return Object.keys(val).map((key) => [key, val[key]]);
+ return [];
+}
+function toArray(val) {
+ val = toValue(val);
+ if (isNil(val))
+ return [];
+ if (isArray(val))
+ return val;
+ return [val];
+}
+function toValue(value) {
+ return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value;
+}
+function toNumber(value) {
+ return +toValue(value) || 0;
+}
+function isNumber(value) {
+ return typeof value === 'number';
+}
+function toLiquid(value) {
+ if (value && isFunction(value.toLiquid))
+ return toLiquid(value.toLiquid());
+ return value;
+}
+function isNil(value) {
+ return value == null;
+}
+function isUndefined(value) {
+ return value === undefined;
+}
+function isArray(value) {
+ // be compatible with IE 8
+ return toString$1.call(value) === '[object Array]';
+}
+function isArrayLike(value) {
+ return value && isNumber(value.length);
+}
+function isIterable(value) {
+ return isObject(value) && Symbol.iterator in value;
+}
+/*
+ * 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(obj, iteratee) {
+ obj = obj || {};
+ for (const k in obj) {
+ if (hasOwnProperty.call(obj, k)) {
+ if (iteratee(obj[k], k, obj) === false)
+ break;
+ }
+ }
+ return obj;
+}
+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) {
+ const type = typeof value;
+ return value !== null && (type === 'object' || type === 'function');
+}
+function range(start, stop, step = 1) {
+ const arr = [];
+ for (let i = start; i < stop; i += step) {
+ arr.push(i);
+ }
+ return arr;
+}
+function padStart(str, length, ch = ' ') {
+ return pad(str, length, ch, (str, ch) => ch + str);
+}
+function padEnd(str, length, ch = ' ') {
+ return pad(str, length, ch, (str, ch) => str + ch);
+}
+function pad(str, length, ch, add) {
+ str = String(str);
+ let n = length - str.length;
+ while (n-- > 0)
+ str = add(str, ch);
+ return str;
+}
+function identify(val) {
+ return val;
+}
+function changeCase(str) {
+ const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z');
+ return hasLowerCase ? str.toUpperCase() : str.toLowerCase();
+}
+function ellipsis(str, N) {
+ return str.length > N ? str.slice(0, N - 3) + '...' : str;
+}
+// compare string in case-insensitive way, undefined values to the tail
+function caseInsensitiveCompare(a, b) {
+ if (a == null && b == null)
+ return 0;
+ if (a == null)
+ return 1;
+ if (b == null)
+ return -1;
+ a = toLowerCase.call(a);
+ b = toLowerCase.call(b);
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+}
+function argumentsToValue(fn) {
+ return function (...args) { return fn.call(this, ...args.map(toValue)); };
+}
+function argumentsToNumber(fn) {
+ return function (...args) { return fn.call(this, ...args.map(toNumber)); };
+}
+function escapeRegExp(text) {
+ return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
+}
+/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */
+function* strictUniq(array) {
+ const seen = new Set();
+ for (const element of array) {
+ const key = JSON.stringify(element);
+ if (!seen.has(key)) {
+ seen.add(key);
+ yield element;
+ }
+ }
+} + +/**
+ * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes
+ */
+const TRAIT = '__liquidClass__';
+class LiquidError extends Error {
+ constructor(err, token) {
+ /**
+ * note: for ES5 targeting, `this` will be replaced by return value of Error(),
+ * thus everything on `this` will be lost, avoid calling `LiquidError` methods here
+ */
+ super(typeof err === 'string' ? err : err.message);
+ this.context = '';
+ if (typeof err !== 'string')
+ Object.defineProperty(this, 'originalError', { value: err, enumerable: false });
+ Object.defineProperty(this, 'token', { value: token, enumerable: false });
+ Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false });
+ }
+ update() {
+ Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false });
+ this.message = mkMessage(this.message, this.token);
+ this.stack = this.message + '\n' + this.context +
+ '\n' + this.stack;
+ if (this.originalError)
+ this.stack += '\nFrom ' + this.originalError.stack;
+ }
+ static is(obj) {
+ return (obj === null || obj === void 0 ? void 0 : obj[TRAIT]) === 'LiquidError';
+ }
+}
+class TokenizationError extends LiquidError {
+ constructor(message, token) {
+ super(message, token);
+ this.name = 'TokenizationError';
+ super.update();
+ }
+}
+class ParseError extends LiquidError {
+ constructor(err, token) {
+ super(err, token);
+ this.name = 'ParseError';
+ this.message = err.message;
+ super.update();
+ }
+}
+class RenderError extends LiquidError {
+ constructor(err, tpl) {
+ super(err, tpl.token);
+ this.name = 'RenderError';
+ this.message = err.message;
+ super.update();
+ }
+ static is(obj) {
+ return obj.name === 'RenderError';
+ }
+}
+class LiquidErrors extends LiquidError {
+ constructor(errors) {
+ super(errors[0], errors[0].token);
+ this.errors = errors;
+ this.name = 'LiquidErrors';
+ const s = errors.length > 1 ? 's' : '';
+ this.message = `${errors.length} error${s} found`;
+ super.update();
+ }
+ static is(obj) {
+ return obj.name === 'LiquidErrors';
+ }
+}
+class UndefinedVariableError extends LiquidError {
+ constructor(err, token) {
+ super(err, token);
+ this.name = 'UndefinedVariableError';
+ this.message = err.message;
+ super.update();
+ }
+}
+// only used internally; raised where we don't have token information,
+// so it can't be an UndefinedVariableError.
+class InternalUndefinedVariableError extends Error {
+ constructor(variableName) {
+ super(`undefined variable: ${variableName}`);
+ this.name = 'InternalUndefinedVariableError';
+ this.variableName = variableName;
+ }
+}
+class AssertionError extends Error {
+ constructor(message) {
+ super(message);
+ this.name = 'AssertionError';
+ this.message = message + '';
+ }
+}
+function mkContext(token) {
+ const [line, col] = token.getPosition();
+ const lines = token.input.split('\n');
+ const begin = Math.max(line - 2, 1);
+ const end = Math.min(line + 3, lines.length);
+ const context = range(begin, end + 1)
+ .map(lineNumber => {
+ const rowIndicator = (lineNumber === line) ? '>> ' : ' ';
+ const num = padStart(String(lineNumber), String(end).length);
+ let text = `${rowIndicator}${num}| `;
+ const colIndicator = lineNumber === line
+ ? '\n' + padStart('^', col + text.length)
+ : '';
+ text += lines[lineNumber - 1];
+ text += colIndicator;
+ return text;
+ })
+ .join('\n');
+ return context;
+}
+function mkMessage(msg, token) {
+ if (token.file)
+ msg += `, file:${token.file}`;
+ const [line, col] = token.getPosition();
+ msg += `, line:${line}, col:${col}`;
+ return msg;
+} + +// **DO NOT CHANGE THIS FILE**
+//
+// This file is generated by bin/character-gen.js
+// bitmask character types to boost performance
+const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
+const WORD = 1;
+const BLANK = 4;
+const QUOTE = 8;
+const INLINE_BLANK = 16;
+const NUMBER = 32;
+const SIGN = 64;
+const PUNCTUATION = 128;
+function isWord(char) {
+ const code = char.charCodeAt(0);
+ return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD);
+}
+TYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK;
+TYPES[8220] = TYPES[8221] = PUNCTUATION; + +function assert(predicate, message) {
+ if (!predicate) {
+ const msg = typeof message === 'function'
+ ? message()
+ : (message || `expect ${predicate} to be true`);
+ throw new AssertionError(msg);
+ }
+}
+function assertEmpty(predicate, message = `unexpected ${JSON.stringify(predicate)}`) {
+ assert(!predicate, message);
+} + +class NullDrop extends Drop {
+ equals(value) {
+ return isNil(toValue(value));
+ }
+ gt() {
+ return false;
+ }
+ geq() {
+ return false;
+ }
+ lt() {
+ return false;
+ }
+ leq() {
+ return false;
+ }
+ valueOf() {
+ return null;
+ }
+} + +class EmptyDrop extends Drop {
+ equals(value) {
+ if (value instanceof EmptyDrop)
+ return false;
+ value = toValue(value);
+ if (isString(value) || isArray(value))
+ return value.length === 0;
+ if (isObject(value))
+ return Object.keys(value).length === 0;
+ return false;
+ }
+ gt() {
+ return false;
+ }
+ geq() {
+ return false;
+ }
+ lt() {
+ return false;
+ }
+ leq() {
+ return false;
+ }
+ valueOf() {
+ return '';
+ }
+ static is(value) {
+ return value instanceof EmptyDrop;
+ }
+} + +class BlankDrop extends EmptyDrop {
+ equals(value) {
+ if (value === false)
+ return true;
+ if (isNil(toValue(value)))
+ return true;
+ if (isString(value))
+ return /^\s*$/.test(value);
+ return super.equals(value);
+ }
+ static is(value) {
+ return value instanceof BlankDrop;
+ }
+} + +class ForloopDrop extends Drop {
+ constructor(length, collection, variable) {
+ super();
+ this.i = 0;
+ this.length = length;
+ this.name = `${variable}-${collection}`;
+ }
+ next() {
+ this.i++;
+ }
+ index0() {
+ return this.i;
+ }
+ index() {
+ return this.i + 1;
+ }
+ first() {
+ return this.i === 0;
+ }
+ last() {
+ return this.i === this.length - 1;
+ }
+ rindex() {
+ return this.length - this.i;
+ }
+ rindex0() {
+ return this.length - this.i - 1;
+ }
+ valueOf() {
+ return JSON.stringify(this);
+ }
+} + +class SimpleEmitter {
+ constructor() {
+ this.buffer = '';
+ }
+ write(html) {
+ this.buffer += stringify(html);
+ }
+} + +class StreamedEmitter {
+ constructor() {
+ this.buffer = '';
+ this.stream = null;
+ throw new Error('streaming not supported in browser');
+ }
+} + +class KeepingTypeEmitter {
+ constructor() {
+ this.buffer = '';
+ }
+ write(html) {
+ html = toValue(html);
+ // This will only preserve the type if the value is isolated.
+ // I.E:
+ // {{ my-port }} -> 42
+ // {{ my-host }}:{{ my-port }} -> 'host:42'
+ if (typeof html !== 'string' && this.buffer === '') {
+ this.buffer = html;
+ }
+ else {
+ this.buffer = stringify(this.buffer) + stringify(html);
+ }
+ }
+} + +class BlockDrop extends Drop {
+ constructor(
+ // the block render from layout template
+ superBlockRender = () => '') {
+ super();
+ this.superBlockRender = superBlockRender;
+ }
+ /**
+ * Provide parent access in child block by
+ * {{ block.super }}
+ */
+ *super() {
+ const emitter = new SimpleEmitter();
+ yield this.superBlockRender(emitter);
+ return emitter.buffer;
+ }
+} + +function isComparable(arg) {
+ return (arg &&
+ isFunction(arg.equals) &&
+ isFunction(arg.gt) &&
+ isFunction(arg.geq) &&
+ isFunction(arg.lt) &&
+ isFunction(arg.leq));
+} + +const nil = new NullDrop();
+const literalValues = {
+ 'true': true,
+ 'false': false,
+ 'nil': nil,
+ 'null': nil,
+ 'empty': new EmptyDrop(),
+ 'blank': new BlankDrop()
+}; + +function createTrie(input) {
+ const trie = {};
+ for (const [name, data] of Object.entries(input)) {
+ let node = trie;
+ for (let i = 0; i < name.length; i++) {
+ const c = name[i];
+ node[c] = node[c] || {};
+ if (i === name.length - 1 && isWord(name[i])) {
+ node[c].needBoundary = true;
+ }
+ node = node[c];
+ }
+ node.data = data;
+ node.end = true;
+ }
+ return trie;
+} + +/******************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+
+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) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ 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) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+} + +// convert an async iterator to a Promise
+function toPromise(val) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!isIterator(val))
+ return val;
+ let value;
+ let done = false;
+ let next = 'next';
+ do {
+ const state = val[next](value);
+ done = state.done;
+ value = state.value;
+ next = 'next';
+ try {
+ if (isIterator(value))
+ value = toPromise(value);
+ if (isPromise(value))
+ value = yield value;
+ }
+ catch (err) {
+ next = 'throw';
+ value = err;
+ }
+ } while (!done);
+ return value;
+ });
+}
+// convert an async iterator to a value in a synchronous manner
+function toValueSync(val) {
+ if (!isIterator(val))
+ return val;
+ let value;
+ let done = false;
+ let next = 'next';
+ do {
+ const state = val[next](value);
+ done = state.done;
+ value = state.value;
+ next = 'next';
+ if (isIterator(value)) {
+ try {
+ value = toValueSync(value);
+ }
+ catch (err) {
+ next = 'throw';
+ value = err;
+ }
+ }
+ } while (!done);
+ return value;
+} + +const rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/;
+// prototype extensions
+function daysInMonth(d) {
+ const feb = isLeapYear(d) ? 29 : 28;
+ return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+}
+function getDayOfYear(d) {
+ let num = 0;
+ for (let i = 0; i < d.getMonth(); ++i) {
+ num += daysInMonth(d)[i];
+ }
+ return num + d.getDate();
+}
+function getWeekOfYear(d, startDay) {
+ // Skip to startDay of this week
+ const now = getDayOfYear(d) + (startDay - d.getDay());
+ // Find the first startDay of the year
+ const jan1 = new Date(d.getFullYear(), 0, 1);
+ const then = (7 - jan1.getDay() + startDay);
+ return String(Math.floor((now - then) / 7) + 1);
+}
+function isLeapYear(d) {
+ const year = d.getFullYear();
+ return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)));
+}
+function ordinal(d) {
+ const date = d.getDate();
+ if ([11, 12, 13].includes(date))
+ return 'th';
+ switch (date % 10) {
+ case 1: return 'st';
+ case 2: return 'nd';
+ case 3: return 'rd';
+ default: return 'th';
+ }
+}
+function century(d) {
+ return parseInt(d.getFullYear().toString().substring(0, 2), 10);
+}
+// default to 0
+const padWidths = {
+ d: 2,
+ e: 2,
+ H: 2,
+ I: 2,
+ j: 3,
+ k: 2,
+ l: 2,
+ L: 3,
+ m: 2,
+ M: 2,
+ S: 2,
+ U: 2,
+ W: 2
+};
+const padSpaceChars = new Set('aAbBceklpP');
+function getTimezoneOffset(d, opts) {
+ const nOffset = Math.abs(d.getTimezoneOffset());
+ const h = Math.floor(nOffset / 60);
+ const m = nOffset % 60;
+ return (d.getTimezoneOffset() > 0 ? '-' : '+') +
+ padStart(h, 2, '0') +
+ (opts.flags[':'] ? ':' : '') +
+ padStart(m, 2, '0');
+}
+const formatCodes = {
+ a: (d) => d.getShortWeekdayName(),
+ A: (d) => d.getLongWeekdayName(),
+ b: (d) => d.getShortMonthName(),
+ B: (d) => d.getLongMonthName(),
+ c: (d) => d.toLocaleString(),
+ C: (d) => century(d),
+ d: (d) => d.getDate(),
+ e: (d) => d.getDate(),
+ H: (d) => d.getHours(),
+ I: (d) => String(d.getHours() % 12 || 12),
+ j: (d) => getDayOfYear(d),
+ k: (d) => d.getHours(),
+ l: (d) => String(d.getHours() % 12 || 12),
+ L: (d) => d.getMilliseconds(),
+ m: (d) => d.getMonth() + 1,
+ M: (d) => d.getMinutes(),
+ N: (d, opts) => {
+ const width = Number(opts.width) || 9;
+ const str = String(d.getMilliseconds()).slice(0, width);
+ return padEnd(str, width, '0');
+ },
+ p: (d) => (d.getHours() < 12 ? 'AM' : 'PM'),
+ P: (d) => (d.getHours() < 12 ? 'am' : 'pm'),
+ q: (d) => ordinal(d),
+ s: (d) => Math.round(d.getTime() / 1000),
+ S: (d) => d.getSeconds(),
+ u: (d) => d.getDay() || 7,
+ U: (d) => getWeekOfYear(d, 0),
+ w: (d) => d.getDay(),
+ W: (d) => getWeekOfYear(d, 1),
+ x: (d) => d.toLocaleDateString(),
+ X: (d) => d.toLocaleTimeString(),
+ y: (d) => d.getFullYear().toString().slice(2, 4),
+ Y: (d) => d.getFullYear(),
+ z: getTimezoneOffset,
+ Z: (d, opts) => d.getTimeZoneName() || getTimezoneOffset(d, opts),
+ 't': () => '\t',
+ 'n': () => '\n',
+ '%': () => '%'
+};
+formatCodes.h = formatCodes.b;
+function strftime(d, formatStr) {
+ let output = '';
+ let remaining = formatStr;
+ let match;
+ while ((match = rFormat.exec(remaining))) {
+ output += remaining.slice(0, match.index);
+ remaining = remaining.slice(match.index + match[0].length);
+ output += format(d, match);
+ }
+ return output + remaining;
+}
+function format(d, match) {
+ const [input, flagStr = '', width, modifier, conversion] = match;
+ const convert = formatCodes[conversion];
+ if (!convert)
+ return input;
+ const flags = {};
+ for (const flag of flagStr)
+ flags[flag] = true;
+ let ret = String(convert(d, { flags, width, modifier }));
+ let padChar = padSpaceChars.has(conversion) ? ' ' : '0';
+ let padWidth = width || padWidths[conversion] || 0;
+ if (flags['^'])
+ ret = ret.toUpperCase();
+ else if (flags['#'])
+ ret = changeCase(ret);
+ if (flags['_'])
+ padChar = ' ';
+ else if (flags['0'])
+ padChar = '0';
+ if (flags['-'])
+ padWidth = 0;
+ return padStart(ret, padWidth, padChar);
+} + +function getDateTimeFormat() {
+ return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined);
+} + +// one minute in milliseconds
+const OneMinute = 60000;
+/**
+ * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS
+ * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3
+ */
+const TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/;
+const monthNames = [
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
+ 'September', 'October', 'November', 'December'
+];
+const monthNamesShort = monthNames.map(name => name.slice(0, 3));
+const dayNames = [
+ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
+];
+const dayNamesShort = dayNames.map(name => name.slice(0, 3));
+/**
+ * A date implementation with timezone info, just like Ruby date
+ *
+ * Implementation:
+ * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods
+ * - rewrite getTimezoneOffset() to trick strftime
+ */
+class LiquidDate {
+ constructor(init, locale, timezone) {
+ this.locale = locale;
+ this.DateTimeFormat = getDateTimeFormat();
+ this.date = new Date(init);
+ this.timezoneFixed = timezone !== undefined;
+ if (timezone === undefined) {
+ timezone = this.date.getTimezoneOffset();
+ }
+ this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone;
+ this.timezoneName = isString(timezone) ? timezone : '';
+ const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute;
+ const time = this.date.getTime() + diff;
+ this.displayDate = new Date(time);
+ }
+ getTime() {
+ return this.displayDate.getTime();
+ }
+ getMilliseconds() {
+ return this.displayDate.getMilliseconds();
+ }
+ getSeconds() {
+ return this.displayDate.getSeconds();
+ }
+ getMinutes() {
+ return this.displayDate.getMinutes();
+ }
+ getHours() {
+ return this.displayDate.getHours();
+ }
+ getDay() {
+ return this.displayDate.getDay();
+ }
+ getDate() {
+ return this.displayDate.getDate();
+ }
+ getMonth() {
+ return this.displayDate.getMonth();
+ }
+ getFullYear() {
+ return this.displayDate.getFullYear();
+ }
+ toLocaleString(locale, init) {
+ if (init === null || init === void 0 ? void 0 : init.timeZone) {
+ return this.date.toLocaleString(locale, init);
+ }
+ return this.displayDate.toLocaleString(locale, init);
+ }
+ toLocaleTimeString(locale) {
+ return this.displayDate.toLocaleTimeString(locale);
+ }
+ toLocaleDateString(locale) {
+ return this.displayDate.toLocaleDateString(locale);
+ }
+ getTimezoneOffset() {
+ return this.timezoneOffset;
+ }
+ getTimeZoneName() {
+ if (this.timezoneFixed)
+ return this.timezoneName;
+ if (!this.DateTimeFormat)
+ return;
+ return this.DateTimeFormat().resolvedOptions().timeZone;
+ }
+ getLongMonthName() {
+ var _a;
+ return (_a = this.format({ month: 'long' })) !== null && _a !== void 0 ? _a : monthNames[this.getMonth()];
+ }
+ getShortMonthName() {
+ var _a;
+ return (_a = this.format({ month: 'short' })) !== null && _a !== void 0 ? _a : monthNamesShort[this.getMonth()];
+ }
+ getLongWeekdayName() {
+ var _a;
+ return (_a = this.format({ weekday: 'long' })) !== null && _a !== void 0 ? _a : dayNames[this.displayDate.getDay()];
+ }
+ getShortWeekdayName() {
+ var _a;
+ return (_a = this.format({ weekday: 'short' })) !== null && _a !== void 0 ? _a : dayNamesShort[this.displayDate.getDay()];
+ }
+ valid() {
+ return !isNaN(this.getTime());
+ }
+ format(options) {
+ return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate);
+ }
+ /**
+ * Create a Date object fixed to it's declared Timezone. Both
+ * - 2021-08-06T02:29:00.000Z and
+ * - 2021-08-06T02:29:00.000+08:00
+ * will always be displayed as
+ * - 2021-08-06 02:29:00
+ * regardless timezoneOffset in JavaScript realm
+ *
+ * The implementation hack:
+ * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,
+ * we create a different Date to trick strftime, it's both simpler and more performant.
+ * Given that a template is expected to be parsed fewer times than rendered.
+ */
+ static createDateFixedToTimezone(dateString, locale) {
+ const m = dateString.match(TIMEZONE_PATTERN);
+ // representing a UTC timestamp
+ if (m && m[1] === 'Z') {
+ return new LiquidDate(+new Date(dateString), locale, 0);
+ }
+ // has a timezone specified
+ if (m && m[2] && m[3] && m[4]) {
+ const [, , sign, hours, minutes] = m;
+ const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10));
+ return new LiquidDate(+new Date(dateString), locale, offset);
+ }
+ return new LiquidDate(dateString, locale);
+ }
+ static getTimezoneOffset(timezoneName, date) {
+ const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName });
+ const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' });
+ const localDate = new Date(localDateString);
+ const utcDate = new Date(utcDateString);
+ return (+utcDate - +localDate) / (60 * 1000);
+ }
+} + +class Limiter {
+ constructor(resource, limit) {
+ this.base = 0;
+ this.message = `${resource} limit exceeded`;
+ this.limit = limit;
+ }
+ use(count) {
+ count = +count || 0;
+ assert(this.base + count <= this.limit, this.message);
+ this.base += count;
+ }
+ check(count) {
+ count = +count || 0;
+ assert(count <= this.limit, this.message);
+ }
+} + +class DelimitedToken extends Token {
+ constructor(kind, [contentBegin, contentEnd], input, begin, end, trimLeft, trimRight, file) {
+ super(kind, input, begin, end, file);
+ this.trimLeft = false;
+ this.trimRight = false;
+ const tl = input[contentBegin] === '-';
+ const tr = input[contentEnd - 1] === '-';
+ let l = tl ? contentBegin + 1 : contentBegin;
+ let r = tr ? contentEnd - 1 : contentEnd;
+ while (l < r && (TYPES[input.charCodeAt(l)] & BLANK))
+ l++;
+ while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK))
+ r--;
+ this.contentRange = [l, r];
+ this.trimLeft = tl || trimLeft;
+ this.trimRight = tr || trimRight;
+ }
+ get content() {
+ return this.input.slice(this.contentRange[0], this.contentRange[1]);
+ }
+} + +class TagToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options;
+ const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length];
+ super(TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file);
+ this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange);
+ this.name = this.tokenizer.readTagName();
+ this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`);
+ this.tokenizer.skipBlank();
+ this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]);
+ }
+} + +class OutputToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options;
+ const valueRange = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length];
+ super(TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file);
+ }
+} + +class HTMLToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.HTML, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.trimLeft = 0;
+ this.trimRight = 0;
+ }
+ getContent() {
+ return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight);
+ }
+} + +class NumberToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Number, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = Number(this.getText());
+ }
+} + +class IdentifierToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Word, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = this.getText();
+ }
+} + +class LiteralToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Literal, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.literal = this.getText();
+ this.content = literalValues[this.literal];
+ }
+} + +const operatorPrecedences = {
+ '==': 2,
+ '!=': 2,
+ '>': 2,
+ '<': 2,
+ '>=': 2,
+ '<=': 2,
+ 'contains': 2,
+ 'not': 1,
+ 'and': 0,
+ 'or': 0
+};
+const operatorTypes = {
+ '==': 0 /* OperatorType.Binary */,
+ '!=': 0 /* OperatorType.Binary */,
+ '>': 0 /* OperatorType.Binary */,
+ '<': 0 /* OperatorType.Binary */,
+ '>=': 0 /* OperatorType.Binary */,
+ '<=': 0 /* OperatorType.Binary */,
+ 'contains': 0 /* OperatorType.Binary */,
+ 'not': 1 /* OperatorType.Unary */,
+ 'and': 0 /* OperatorType.Binary */,
+ 'or': 0 /* OperatorType.Binary */
+};
+class OperatorToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Operator, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.operator = this.getText();
+ }
+ getPrecedence() {
+ const key = this.getText();
+ return key in operatorPrecedences ? operatorPrecedences[key] : 1;
+ }
+} + +class PropertyAccessToken extends Token {
+ constructor(variable, props, input, begin, end, file) {
+ super(TokenKind.PropertyAccess, input, begin, end, file);
+ this.variable = variable;
+ this.props = props;
+ }
+} + +class FilterToken extends Token {
+ constructor(name, args, input, begin, end, file) {
+ super(TokenKind.Filter, input, begin, end, file);
+ this.name = name;
+ this.args = args;
+ }
+} + +class HashToken extends Token {
+ constructor(input, begin, end, name, value, file) {
+ super(TokenKind.Hash, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.name = name;
+ this.value = value;
+ this.file = file;
+ }
+} + +const rHex = /[\da-fA-F]/;
+const rOct = /[0-7]/;
+const escapeChar = {
+ b: '\b',
+ f: '\f',
+ n: '\n',
+ r: '\r',
+ t: '\t',
+ v: '\x0B'
+};
+function hexVal(c) {
+ const code = c.charCodeAt(0);
+ if (code >= 97)
+ return code - 87;
+ if (code >= 65)
+ return code - 55;
+ return code - 48;
+}
+function parseStringLiteral(str) {
+ let ret = '';
+ for (let i = 1; i < str.length - 1; i++) {
+ if (str[i] !== '\\') {
+ ret += str[i];
+ continue;
+ }
+ if (escapeChar[str[i + 1]] !== undefined) {
+ ret += escapeChar[str[++i]];
+ }
+ else if (str[i + 1] === 'u') {
+ let val = 0;
+ let j = i + 2;
+ while (j <= i + 5 && rHex.test(str[j])) {
+ val = val * 16 + hexVal(str[j++]);
+ }
+ i = j - 1;
+ ret += String.fromCharCode(val);
+ }
+ else if (!rOct.test(str[i + 1])) {
+ ret += str[++i];
+ }
+ else {
+ let j = i + 1;
+ let val = 0;
+ while (j <= i + 3 && rOct.test(str[j])) {
+ val = val * 8 + hexVal(str[j++]);
+ }
+ i = j - 1;
+ ret += String.fromCharCode(val);
+ }
+ }
+ return ret;
+} + +class QuotedToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Quoted, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = parseStringLiteral(this.getText());
+ }
+} + +class RangeToken extends Token {
+ constructor(input, begin, end, lhs, rhs, file) {
+ super(TokenKind.Range, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.lhs = lhs;
+ this.rhs = rhs;
+ this.file = file;
+ }
+} + +/**
+ * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`
+ */
+class LiquidTagToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ super(TokenKind.Tag, [begin, end], input, begin, end, false, false, file);
+ this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange);
+ this.name = this.tokenizer.readTagName();
+ this.tokenizer.assert(this.name, 'illegal liquid tag syntax');
+ this.tokenizer.skipBlank();
+ }
+ get args() {
+ return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]);
+ }
+} + +/**
+ * value expression with optional filters
+ * e.g.
+ * {% assign foo="bar" | append: "coo" %}
+ */
+class FilteredValueToken extends Token {
+ constructor(initial, filters, input, begin, end, file) {
+ super(TokenKind.FilteredValue, input, begin, end, file);
+ this.initial = initial;
+ this.filters = filters;
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ }
+} + +const polyfill = {
+ now: () => Date.now()
+};
+function getPerformance() {
+ return (typeof global === 'object' && global.performance) ||
+ (typeof window === 'object' && window.performance) ||
+ polyfill;
+} + +class Render {
+ renderTemplatesToNodeStream(templates, ctx) {
+ const emitter = new StreamedEmitter();
+ Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter)))
+ .then(() => emitter.end(), err => emitter.error(err));
+ return emitter.stream;
+ }
+ *renderTemplates(templates, ctx, emitter) {
+ if (!emitter) {
+ emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter();
+ }
+ const errors = [];
+ for (const tpl of templates) {
+ ctx.renderLimit.check(getPerformance().now());
+ try {
+ // if tpl.render supports emitter, it'll return empty `html`
+ const html = yield tpl.render(ctx, emitter);
+ // if not, it'll return an `html`, write to the emitter for it
+ html && emitter.write(html);
+ if (ctx.breakCalled || ctx.continueCalled)
+ break;
+ }
+ catch (e) {
+ const err = LiquidError.is(e) ? e : new RenderError(e, tpl);
+ if (ctx.opts.catchAllErrors)
+ errors.push(err);
+ else
+ throw err;
+ }
+ }
+ if (errors.length) {
+ throw new LiquidErrors(errors);
+ }
+ return emitter.buffer;
+ }
+} + +class Expression {
+ constructor(tokens) {
+ this.postfix = [...toPostfix(tokens)];
+ }
+ *evaluate(ctx, lenient) {
+ assert(ctx, 'unable to evaluate: context not defined');
+ const operands = [];
+ for (const token of this.postfix) {
+ if (isOperatorToken(token)) {
+ const r = operands.pop();
+ let result;
+ if (operatorTypes[token.operator] === 1 /* OperatorType.Unary */) {
+ result = yield ctx.opts.operators[token.operator](r, ctx);
+ }
+ else {
+ const l = operands.pop();
+ result = yield ctx.opts.operators[token.operator](l, r, ctx);
+ }
+ operands.push(result);
+ }
+ else {
+ operands.push(yield evalToken(token, ctx, lenient));
+ }
+ }
+ return operands[0];
+ }
+ valid() {
+ return !!this.postfix.length;
+ }
+}
+function* evalToken(token, ctx, lenient = false) {
+ if (!token)
+ return;
+ if ('content' in token)
+ return token.content;
+ if (isPropertyAccessToken(token))
+ return yield evalPropertyAccessToken(token, ctx, lenient);
+ if (isRangeToken(token))
+ return yield evalRangeToken(token, ctx);
+}
+function* evalPropertyAccessToken(token, ctx, lenient) {
+ const props = [];
+ for (const prop of token.props) {
+ props.push((yield evalToken(prop, ctx, false)));
+ }
+ try {
+ if (token.variable) {
+ const variable = yield evalToken(token.variable, ctx, lenient);
+ return yield ctx._getFromScope(variable, props);
+ }
+ else {
+ return yield ctx._get(props);
+ }
+ }
+ catch (e) {
+ if (lenient && e.name === 'InternalUndefinedVariableError')
+ return null;
+ throw (new UndefinedVariableError(e, token));
+ }
+}
+function evalQuotedToken(token) {
+ return token.content;
+}
+function* evalRangeToken(token, ctx) {
+ const low = yield evalToken(token.lhs, ctx);
+ const high = yield evalToken(token.rhs, ctx);
+ ctx.memoryLimit.use(high - low + 1);
+ return range(+low, +high + 1);
+}
+function* toPostfix(tokens) {
+ const ops = [];
+ for (const token of tokens) {
+ if (isOperatorToken(token)) {
+ while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {
+ yield ops.pop();
+ }
+ ops.push(token);
+ }
+ else
+ yield token;
+ }
+ while (ops.length) {
+ yield ops.pop();
+ }
+} + +function isTruthy(val, ctx) {
+ return !isFalsy(val, ctx);
+}
+function isFalsy(val, ctx) {
+ val = toValue(val);
+ if (ctx.opts.jsTruthy) {
+ return !val;
+ }
+ else {
+ return val === false || undefined === val || val === null;
+ }
+} + +const defaultOperators = {
+ '==': equals,
+ '!=': (l, r) => !equals(l, r),
+ '>': (l, r) => {
+ if (isComparable(l))
+ return l.gt(r);
+ if (isComparable(r))
+ return r.lt(l);
+ return toValue(l) > toValue(r);
+ },
+ '<': (l, r) => {
+ if (isComparable(l))
+ return l.lt(r);
+ if (isComparable(r))
+ return r.gt(l);
+ return toValue(l) < toValue(r);
+ },
+ '>=': (l, r) => {
+ if (isComparable(l))
+ return l.geq(r);
+ if (isComparable(r))
+ return r.leq(l);
+ return toValue(l) >= toValue(r);
+ },
+ '<=': (l, r) => {
+ if (isComparable(l))
+ return l.leq(r);
+ if (isComparable(r))
+ return r.geq(l);
+ return toValue(l) <= toValue(r);
+ },
+ 'contains': (l, r) => {
+ l = toValue(l);
+ if (isArray(l))
+ return l.some((i) => equals(i, r));
+ if (isFunction(l === null || l === void 0 ? void 0 : l.indexOf))
+ return l.indexOf(toValue(r)) > -1;
+ return false;
+ },
+ 'not': (v, ctx) => isFalsy(toValue(v), ctx),
+ 'and': (l, r, ctx) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx),
+ 'or': (l, r, ctx) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx)
+};
+function equals(lhs, rhs) {
+ if (isComparable(lhs))
+ return lhs.equals(rhs);
+ if (isComparable(rhs))
+ return rhs.equals(lhs);
+ lhs = toValue(lhs);
+ rhs = toValue(rhs);
+ if (isArray(lhs)) {
+ return isArray(rhs) && arrayEquals(lhs, rhs);
+ }
+ return lhs === rhs;
+}
+function arrayEquals(lhs, rhs) {
+ if (lhs.length !== rhs.length)
+ return false;
+ return !lhs.some((value, i) => !equals(value, rhs[i]));
+}
+function arrayIncludes(arr, item) {
+ return arr.some(value => equals(value, item));
+} + +class Node {
+ constructor(key, value, next, prev) {
+ this.key = key;
+ this.value = value;
+ this.next = next;
+ this.prev = prev;
+ }
+}
+class LRU {
+ constructor(limit, size = 0) {
+ this.limit = limit;
+ this.size = size;
+ this.cache = {};
+ this.head = new Node('HEAD', null, null, null);
+ this.tail = new Node('TAIL', null, null, null);
+ this.head.next = this.tail;
+ this.tail.prev = this.head;
+ }
+ write(key, value) {
+ if (this.cache[key]) {
+ this.cache[key].value = value;
+ }
+ else {
+ const node = new Node(key, value, this.head.next, this.head);
+ this.head.next.prev = node;
+ this.head.next = node;
+ this.cache[key] = node;
+ this.size++;
+ this.ensureLimit();
+ }
+ }
+ read(key) {
+ if (!this.cache[key])
+ return;
+ const { value } = this.cache[key];
+ this.remove(key);
+ this.write(key, value);
+ return value;
+ }
+ remove(key) {
+ const node = this.cache[key];
+ node.prev.next = node.next;
+ node.next.prev = node.prev;
+ delete this.cache[key];
+ this.size--;
+ }
+ clear() {
+ this.head.next = this.tail;
+ this.tail.prev = this.head;
+ this.size = 0;
+ this.cache = {};
+ }
+ ensureLimit() {
+ if (this.size > this.limit)
+ this.remove(this.tail.prev.key);
+ }
+} + +function domResolve(root, path) {
+ const base = document.createElement('base');
+ base.href = root;
+ const head = document.getElementsByTagName('head')[0];
+ head.insertBefore(base, head.firstChild);
+ const a = document.createElement('a');
+ a.href = path;
+ const resolved = a.href;
+ head.removeChild(base);
+ return resolved;
+}
+function resolve(root, filepath, ext) {
+ if (root.length && last(root) !== '/')
+ root += '/';
+ const url = domResolve(root, filepath);
+ return url.replace(/^(\w+:\/\/[^/]+)(\/[^?]+)/, (str, origin, path) => {
+ const last = path.split('/').pop();
+ if (/\.\w+$/.test(last))
+ return str;
+ return origin + path + ext;
+ });
+}
+function readFile(url) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return new Promise((resolve, reject) => {
+ const xhr = new XMLHttpRequest();
+ xhr.onload = () => {
+ if (xhr.status >= 200 && xhr.status < 300) {
+ resolve(xhr.responseText);
+ }
+ else {
+ reject(new Error(xhr.statusText));
+ }
+ };
+ xhr.onerror = () => {
+ reject(new Error('An error occurred whilst receiving the response.'));
+ };
+ xhr.open('GET', url);
+ xhr.send();
+ });
+ });
+}
+function readFileSync(url) {
+ const xhr = new XMLHttpRequest();
+ xhr.open('GET', url, false);
+ xhr.send();
+ if (xhr.status < 200 || xhr.status >= 300) {
+ throw new Error(xhr.statusText);
+ }
+ return xhr.responseText;
+}
+function exists(filepath) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return true;
+ });
+}
+function existsSync(filepath) {
+ return true;
+}
+function dirname(filepath) {
+ return domResolve(filepath, '.');
+}
+const sep = '/'; + +var fs = /*#__PURE__*/Object.freeze({ + __proto__: null, + resolve: resolve, + readFile: readFile, + readFileSync: readFileSync, + exists: exists, + existsSync: existsSync, + dirname: dirname, + sep: sep +}); + +function defaultFilter(value, defaultValue, ...args) {
+ value = toValue(value);
+ if (isArray(value) || isString(value))
+ return value.length ? value : defaultValue;
+ if (value === false && (new Map(args)).get('allow_false'))
+ return false;
+ return isFalsy(value, this.context) ? defaultValue : value;
+}
+function json(value, space = 0) {
+ return JSON.stringify(value, null, space);
+}
+function inspect(value, space = 0) {
+ const ancestors = [];
+ return JSON.stringify(value, function (_key, value) {
+ if (typeof value !== 'object' || value === null)
+ return value;
+ // `this` is the object that value is contained in, i.e., its direct parent.
+ while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this)
+ ancestors.pop();
+ if (ancestors.includes(value))
+ return '[Circular]';
+ ancestors.push(value);
+ return value;
+ }, space);
+}
+function to_integer(value) {
+ return Number(value);
+}
+const raw = {
+ raw: true,
+ handler: identify
+};
+var misc = {
+ default: defaultFilter,
+ raw,
+ jsonify: json,
+ to_integer,
+ json,
+ inspect
+}; + +const escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": '''
+};
+const unescapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ ''': "'"
+};
+function escape(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/&|<|>|"|'/g, m => escapeMap[m]);
+}
+function xml_escape(str) {
+ return escape.call(this, str);
+}
+function unescape(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]);
+}
+function escape_once(str) {
+ return escape.call(this, unescape.call(this, str));
+}
+function newline_to_br(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\r?\n/gm, '<br />\n');
+}
+function strip_html(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/<script[\s\S]*?<\/script>|<style[\s\S]*?<\/style>|<.*?>|<!--[\s\S]*?-->/g, '');
+} + +var htmlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + escape: escape, + xml_escape: xml_escape, + escape_once: escape_once, + newline_to_br: newline_to_br, + strip_html: strip_html +}); + +class MapFS {
+ constructor(mapping) {
+ this.mapping = mapping;
+ this.sep = '/';
+ }
+ exists(filepath) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.existsSync(filepath);
+ });
+ }
+ existsSync(filepath) {
+ return !isNil(this.mapping[filepath]);
+ }
+ readFile(filepath) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.readFileSync(filepath);
+ });
+ }
+ readFileSync(filepath) {
+ const content = this.mapping[filepath];
+ if (isNil(content))
+ throw new Error(`ENOENT: ${filepath}`);
+ return content;
+ }
+ dirname(filepath) {
+ const segments = filepath.split(this.sep);
+ segments.pop();
+ return segments.join(this.sep);
+ }
+ resolve(dir, file, ext) {
+ file += ext;
+ if (dir === '.')
+ return file;
+ const segments = dir.split(/\/+/);
+ for (const segment of file.split(this.sep)) {
+ if (segment === '.' || segment === '')
+ continue;
+ else if (segment === '..') {
+ if (segments.length > 1 || segments[0] !== '')
+ segments.pop();
+ }
+ else
+ segments.push(segment);
+ }
+ return segments.join(this.sep);
+ }
+} + +const defaultOptions = {
+ root: ['.'],
+ layouts: ['.'],
+ partials: ['.'],
+ relativeReference: true,
+ jekyllInclude: false,
+ keyValueSeparator: ':',
+ cache: undefined,
+ extname: '',
+ fs: fs,
+ dynamicPartials: true,
+ jsTruthy: false,
+ dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',
+ locale: '',
+ trimTagRight: false,
+ trimTagLeft: false,
+ trimOutputRight: false,
+ trimOutputLeft: false,
+ greedy: true,
+ tagDelimiterLeft: '{%',
+ tagDelimiterRight: '%}',
+ outputDelimiterLeft: '{{',
+ outputDelimiterRight: '}}',
+ preserveTimezones: false,
+ strictFilters: false,
+ strictVariables: false,
+ ownPropertyOnly: true,
+ lenientIf: false,
+ globals: {},
+ keepOutputType: false,
+ operators: defaultOperators,
+ memoryLimit: Infinity,
+ parseLimit: Infinity,
+ renderLimit: Infinity
+};
+function normalize(options) {
+ var _a, _b;
+ if (options.hasOwnProperty('root')) {
+ if (!options.hasOwnProperty('partials'))
+ options.partials = options.root;
+ if (!options.hasOwnProperty('layouts'))
+ options.layouts = options.root;
+ }
+ if (options.hasOwnProperty('cache')) {
+ let cache;
+ if (typeof options.cache === 'number')
+ cache = options.cache > 0 ? new LRU(options.cache) : undefined;
+ else if (typeof options.cache === 'object')
+ cache = options.cache;
+ else
+ cache = options.cache ? new LRU(1024) : undefined;
+ options.cache = cache;
+ }
+ options = Object.assign(Object.assign(Object.assign({}, defaultOptions), (options.jekyllInclude ? { dynamicPartials: false } : {})), options);
+ if ((!options.fs.dirname || !options.fs.sep) && options.relativeReference) {
+ console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning');
+ options.relativeReference = false;
+ }
+ options.root = normalizeDirectoryList(options.root);
+ options.partials = normalizeDirectoryList(options.partials);
+ options.layouts = normalizeDirectoryList(options.layouts);
+ options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape);
+ if (!options.locale) {
+ options.locale = (_b = (_a = getDateTimeFormat()) === null || _a === void 0 ? void 0 : _a().resolvedOptions().locale) !== null && _b !== void 0 ? _b : 'en-US';
+ }
+ if (options.templates) {
+ options.fs = new MapFS(options.templates);
+ options.relativeReference = true;
+ options.root = options.partials = options.layouts = '.';
+ }
+ return options;
+}
+function getOutputEscapeFunction(nameOrFunction) {
+ if (nameOrFunction === 'escape')
+ return escape;
+ if (nameOrFunction === 'json')
+ return misc.json;
+ assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function');
+ return nameOrFunction;
+}
+function normalizeDirectoryList(value) {
+ let list = [];
+ if (isArray(value))
+ list = value;
+ if (isString(value))
+ list = [value];
+ return list;
+} + +function whiteSpaceCtrl(tokens, options) {
+ let inRaw = false;
+ for (let i = 0; i < tokens.length; i++) {
+ const token = tokens[i];
+ if (!isDelimitedToken(token))
+ continue;
+ if (!inRaw && token.trimLeft) {
+ trimLeft(tokens[i - 1], options.greedy);
+ }
+ if (isTagToken(token)) {
+ if (token.name === 'raw')
+ inRaw = true;
+ else if (token.name === 'endraw')
+ inRaw = false;
+ }
+ if (!inRaw && token.trimRight) {
+ trimRight(tokens[i + 1], options.greedy);
+ }
+ }
+}
+function trimLeft(token, greedy) {
+ if (!token || !isHTMLToken(token))
+ return;
+ const mask = greedy ? BLANK : INLINE_BLANK;
+ while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask)
+ token.trimRight++;
+}
+function trimRight(token, greedy) {
+ if (!token || !isHTMLToken(token))
+ return;
+ const mask = greedy ? BLANK : INLINE_BLANK;
+ while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask)
+ token.trimLeft++;
+ if (token.input.charAt(token.begin + token.trimLeft) === '\n')
+ token.trimLeft++;
+} + +class Tokenizer {
+ constructor(input, operators = defaultOptions.operators, file, range) {
+ this.input = input;
+ this.file = file;
+ this.rawBeginAt = -1;
+ this.p = range ? range[0] : 0;
+ this.N = range ? range[1] : input.length;
+ this.opTrie = createTrie(operators);
+ this.literalTrie = createTrie(literalValues);
+ }
+ readExpression() {
+ return new Expression(this.readExpressionTokens());
+ }
+ *readExpressionTokens() {
+ while (this.p < this.N) {
+ const operator = this.readOperator();
+ if (operator) {
+ yield operator;
+ continue;
+ }
+ const operand = this.readValue();
+ if (operand) {
+ yield operand;
+ continue;
+ }
+ return;
+ }
+ }
+ readOperator() {
+ this.skipBlank();
+ const end = this.matchTrie(this.opTrie);
+ if (end === -1)
+ return;
+ return new OperatorToken(this.input, this.p, (this.p = end), this.file);
+ }
+ matchTrie(trie) {
+ let node = trie;
+ let i = this.p;
+ let info;
+ while (node[this.input[i]] && i < this.N) {
+ node = node[this.input[i++]];
+ if (node['end'])
+ info = node;
+ }
+ if (!info)
+ return -1;
+ if (info['needBoundary'] && isWord(this.peek(i - this.p)))
+ return -1;
+ return i;
+ }
+ readFilteredValue() {
+ const begin = this.p;
+ const initial = this.readExpression();
+ this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`);
+ const filters = this.readFilters();
+ return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file);
+ }
+ readFilters() {
+ const filters = [];
+ while (true) {
+ const filter = this.readFilter();
+ if (!filter)
+ return filters;
+ filters.push(filter);
+ }
+ }
+ readFilter() {
+ this.skipBlank();
+ if (this.end())
+ return null;
+ this.assert(this.read() === '|', `expected "|" before filter`);
+ const name = this.readIdentifier();
+ if (!name.size()) {
+ this.assert(this.end(), `expected filter name`);
+ return null;
+ }
+ const args = [];
+ this.skipBlank();
+ if (this.peek() === ':') {
+ do {
+ ++this.p;
+ const arg = this.readFilterArg();
+ arg && args.push(arg);
+ this.skipBlank();
+ this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`);
+ } while (this.peek() === ',');
+ }
+ else if (this.peek() === '|' || this.end()) ;
+ else {
+ throw this.error('expected ":" after filter name');
+ }
+ return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file);
+ }
+ readFilterArg() {
+ const key = this.readValue();
+ if (!key)
+ return;
+ this.skipBlank();
+ if (this.peek() !== ':')
+ return key;
+ ++this.p;
+ const value = this.readValue();
+ return [key.getText(), value];
+ }
+ readTopLevelTokens(options = defaultOptions) {
+ const tokens = [];
+ while (this.p < this.N) {
+ const token = this.readTopLevelToken(options);
+ tokens.push(token);
+ }
+ whiteSpaceCtrl(tokens, options);
+ return tokens;
+ }
+ readTopLevelToken(options) {
+ const { tagDelimiterLeft, outputDelimiterLeft } = options;
+ if (this.rawBeginAt > -1)
+ return this.readEndrawOrRawContent(options);
+ if (this.match(tagDelimiterLeft))
+ return this.readTagToken(options);
+ if (this.match(outputDelimiterLeft))
+ return this.readOutputToken(options);
+ return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft]);
+ }
+ readHTMLToken(stopStrings) {
+ const begin = this.p;
+ while (this.p < this.N) {
+ if (stopStrings.some(str => this.match(str)))
+ break;
+ ++this.p;
+ }
+ return new HTMLToken(this.input, begin, this.p, this.file);
+ }
+ readTagToken(options) {
+ const { file, input } = this;
+ const begin = this.p;
+ if (this.readToDelimiter(options.tagDelimiterRight) === -1) {
+ throw this.error(`tag ${this.snapshot(begin)} not closed`, begin);
+ }
+ const token = new TagToken(input, begin, this.p, options, file);
+ if (token.name === 'raw')
+ this.rawBeginAt = begin;
+ return token;
+ }
+ readToDelimiter(delimiter, respectQuoted = false) {
+ this.skipBlank();
+ while (this.p < this.N) {
+ if (respectQuoted && (this.peekType() & QUOTE)) {
+ this.readQuoted();
+ continue;
+ }
+ ++this.p;
+ if (this.rmatch(delimiter))
+ return this.p;
+ }
+ return -1;
+ }
+ readOutputToken(options = defaultOptions) {
+ const { file, input } = this;
+ const { outputDelimiterRight } = options;
+ const begin = this.p;
+ if (this.readToDelimiter(outputDelimiterRight, true) === -1) {
+ throw this.error(`output ${this.snapshot(begin)} not closed`, begin);
+ }
+ return new OutputToken(input, begin, this.p, options, file);
+ }
+ readEndrawOrRawContent(options) {
+ const { tagDelimiterLeft, tagDelimiterRight } = options;
+ const begin = this.p;
+ let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length;
+ while (this.p < this.N) {
+ if (this.readIdentifier().getText() !== 'endraw') {
+ leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length;
+ continue;
+ }
+ while (this.p <= this.N) {
+ if (this.rmatch(tagDelimiterRight)) {
+ const end = this.p;
+ if (begin === leftPos) {
+ this.rawBeginAt = -1;
+ return new TagToken(this.input, begin, end, options, this.file);
+ }
+ else {
+ this.p = leftPos;
+ return new HTMLToken(this.input, begin, leftPos, this.file);
+ }
+ }
+ if (this.rmatch(tagDelimiterLeft))
+ break;
+ this.p++;
+ }
+ }
+ throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin);
+ }
+ readLiquidTagTokens(options = defaultOptions) {
+ const tokens = [];
+ while (this.p < this.N) {
+ const token = this.readLiquidTagToken(options);
+ token && tokens.push(token);
+ }
+ return tokens;
+ }
+ readLiquidTagToken(options) {
+ this.skipBlank();
+ if (this.end())
+ return;
+ const begin = this.p;
+ this.readToDelimiter('\n');
+ const end = this.p;
+ return new LiquidTagToken(this.input, begin, end, options, this.file);
+ }
+ error(msg, pos = this.p) {
+ return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file));
+ }
+ assert(pred, msg, pos) {
+ if (!pred)
+ throw this.error(typeof msg === 'function' ? msg() : msg, pos);
+ }
+ snapshot(begin = this.p) {
+ return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32));
+ }
+ /**
+ * @deprecated use #readIdentifier instead
+ */
+ readWord() {
+ return this.readIdentifier();
+ }
+ readIdentifier() {
+ this.skipBlank();
+ const begin = this.p;
+ while (!this.end() && isWord(this.peek()))
+ ++this.p;
+ return new IdentifierToken(this.input, begin, this.p, this.file);
+ }
+ readNonEmptyIdentifier() {
+ const id = this.readIdentifier();
+ return id.size() ? id : undefined;
+ }
+ readTagName() {
+ this.skipBlank();
+ // Handle inline comment tags
+ if (this.input[this.p] === '#')
+ return this.input.slice(this.p, ++this.p);
+ return this.readIdentifier().getText();
+ }
+ readHashes(jekyllStyle) {
+ const hashes = [];
+ while (true) {
+ const hash = this.readHash(jekyllStyle);
+ if (!hash)
+ return hashes;
+ hashes.push(hash);
+ }
+ }
+ readHash(jekyllStyle) {
+ this.skipBlank();
+ if (this.peek() === ',')
+ ++this.p;
+ const begin = this.p;
+ const name = this.readNonEmptyIdentifier();
+ if (!name)
+ return;
+ let value;
+ this.skipBlank();
+ const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':');
+ if (this.peek() === sep) {
+ ++this.p;
+ value = this.readValue();
+ }
+ return new HashToken(this.input, begin, this.p, name, value, this.file);
+ }
+ remaining() {
+ return this.input.slice(this.p, this.N);
+ }
+ advance(step = 1) {
+ this.p += step;
+ }
+ end() {
+ return this.p >= this.N;
+ }
+ read() {
+ return this.input[this.p++];
+ }
+ readTo(end) {
+ while (this.p < this.N) {
+ ++this.p;
+ if (this.rmatch(end))
+ return this.p;
+ }
+ return -1;
+ }
+ readValue() {
+ this.skipBlank();
+ const begin = this.p;
+ const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber();
+ const props = this.readProperties(!variable);
+ if (!props.length)
+ return variable;
+ return new PropertyAccessToken(variable, props, this.input, begin, this.p);
+ }
+ readScopeValue() {
+ this.skipBlank();
+ const begin = this.p;
+ const props = this.readProperties();
+ if (!props.length)
+ return undefined;
+ return new PropertyAccessToken(undefined, props, this.input, begin, this.p);
+ }
+ readProperties(isBegin = true) {
+ const props = [];
+ while (true) {
+ if (this.peek() === '[') {
+ this.p++;
+ const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file);
+ this.assert(this.readTo(']') !== -1, '[ not closed');
+ props.push(prop);
+ continue;
+ }
+ if (isBegin && !props.length) {
+ const prop = this.readNonEmptyIdentifier();
+ if (prop) {
+ props.push(prop);
+ continue;
+ }
+ }
+ if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax
+ this.p++;
+ const prop = this.readNonEmptyIdentifier();
+ if (!prop)
+ break;
+ props.push(prop);
+ continue;
+ }
+ break;
+ }
+ return props;
+ }
+ readNumber() {
+ this.skipBlank();
+ let decimalFound = false;
+ let digitFound = false;
+ let n = 0;
+ if (this.peekType() & SIGN)
+ n++;
+ while (this.p + n <= this.N) {
+ if (this.peekType(n) & NUMBER) {
+ digitFound = true;
+ n++;
+ }
+ else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') {
+ if (decimalFound || !digitFound)
+ return;
+ decimalFound = true;
+ n++;
+ }
+ else
+ break;
+ }
+ if (digitFound && !isWord(this.peek(n))) {
+ const num = new NumberToken(this.input, this.p, this.p + n, this.file);
+ this.advance(n);
+ return num;
+ }
+ }
+ readLiteral() {
+ this.skipBlank();
+ const end = this.matchTrie(this.literalTrie);
+ if (end === -1)
+ return;
+ const literal = new LiteralToken(this.input, this.p, end, this.file);
+ this.p = end;
+ return literal;
+ }
+ readRange() {
+ this.skipBlank();
+ const begin = this.p;
+ if (this.peek() !== '(')
+ return;
+ ++this.p;
+ const lhs = this.readValueOrThrow();
+ this.skipBlank();
+ this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax');
+ const rhs = this.readValueOrThrow();
+ this.skipBlank();
+ this.assert(this.read() === ')', 'invalid range syntax');
+ return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file);
+ }
+ readValueOrThrow() {
+ const value = this.readValue();
+ this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`);
+ return value;
+ }
+ readQuoted() {
+ this.skipBlank();
+ const begin = this.p;
+ if (!(this.peekType() & QUOTE))
+ return;
+ ++this.p;
+ let escaped = false;
+ while (this.p < this.N) {
+ ++this.p;
+ if (this.input[this.p - 1] === this.input[begin] && !escaped)
+ break;
+ if (escaped)
+ escaped = false;
+ else if (this.input[this.p - 1] === '\\')
+ escaped = true;
+ }
+ return new QuotedToken(this.input, begin, this.p, this.file);
+ }
+ *readFileNameTemplate(options) {
+ const { outputDelimiterLeft } = options;
+ const htmlStopStrings = [',', ' ', outputDelimiterLeft];
+ const htmlStopStringSet = new Set(htmlStopStrings);
+ // break on ',' and ' ', outputDelimiterLeft only stops HTML token
+ while (this.p < this.N && !htmlStopStringSet.has(this.peek())) {
+ yield this.match(outputDelimiterLeft)
+ ? this.readOutputToken(options)
+ : this.readHTMLToken(htmlStopStrings);
+ }
+ }
+ match(word) {
+ for (let i = 0; i < word.length; i++) {
+ if (word[i] !== this.input[this.p + i])
+ return false;
+ }
+ return true;
+ }
+ rmatch(pattern) {
+ for (let i = 0; i < pattern.length; i++) {
+ if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i])
+ return false;
+ }
+ return true;
+ }
+ peekType(n = 0) {
+ return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)];
+ }
+ peek(n = 0) {
+ return this.p + n >= this.N ? '' : this.input[this.p + n];
+ }
+ skipBlank() {
+ while (this.peekType() & BLANK)
+ ++this.p;
+ }
+} + +class ParseStream {
+ constructor(tokens, parseToken) {
+ this.handlers = {};
+ this.stopRequested = false;
+ this.tokens = tokens;
+ this.parseToken = parseToken;
+ }
+ on(name, cb) {
+ this.handlers[name] = cb;
+ return this;
+ }
+ trigger(event, arg) {
+ const h = this.handlers[event];
+ return h ? (h.call(this, arg), true) : false;
+ }
+ start() {
+ this.trigger('start');
+ let token;
+ while (!this.stopRequested && (token = this.tokens.shift())) {
+ if (this.trigger('token', token))
+ continue;
+ if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) {
+ continue;
+ }
+ const template = this.parseToken(token, this.tokens);
+ this.trigger('template', template);
+ }
+ if (!this.stopRequested)
+ this.trigger('end');
+ return this;
+ }
+ stop() {
+ this.stopRequested = true;
+ return this;
+ }
+} + +class TemplateImpl {
+ constructor(token) {
+ this.token = token;
+ }
+} + +class Tag extends TemplateImpl {
+ constructor(token, remainTokens, liquid) {
+ super(token);
+ this.name = token.name;
+ this.liquid = liquid;
+ this.tokenizer = token.tokenizer;
+ }
+} + +/**
+ * Key-Value Pairs Representing Tag Arguments
+ * Example:
+ * For the markup `, foo:'bar', coo:2 reversed %}`,
+ * hash['foo'] === 'bar'
+ * hash['coo'] === 2
+ * hash['reversed'] === undefined
+ */
+class Hash {
+ constructor(input, jekyllStyle) {
+ this.hash = {};
+ const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {});
+ for (const hash of tokenizer.readHashes(jekyllStyle)) {
+ this.hash[hash.name.content] = hash.value;
+ }
+ }
+ *render(ctx) {
+ const hash = {};
+ for (const key of Object.keys(this.hash)) {
+ hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx);
+ }
+ return hash;
+ }
+} + +function createTagClass(options) {
+ return class extends Tag {
+ constructor(token, tokens, liquid) {
+ super(token, tokens, liquid);
+ if (isFunction(options.parse)) {
+ options.parse.call(this, token, tokens);
+ }
+ }
+ *render(ctx, emitter) {
+ const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx));
+ return yield options.render.call(this, ctx, emitter, hash);
+ }
+ };
+} + +function isKeyValuePair(arr) {
+ return isArray(arr);
+} + +class Filter {
+ constructor(token, options, liquid) {
+ this.token = token;
+ this.name = token.name;
+ this.handler = isFunction(options)
+ ? options
+ : (isFunction(options === null || options === void 0 ? void 0 : options.handler) ? options.handler : identify);
+ this.raw = !isFunction(options) && !!(options === null || options === void 0 ? void 0 : options.raw);
+ this.args = token.args;
+ this.liquid = liquid;
+ }
+ *render(value, context) {
+ const argv = [];
+ for (const arg of this.args) {
+ if (isKeyValuePair(arg))
+ argv.push([arg[0], yield evalToken(arg[1], context)]);
+ else
+ argv.push(yield evalToken(arg, context));
+ }
+ return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv]);
+ }
+} + +class Value {
+ /**
+ * @param str the value to be valuated, eg.: "foobar" | truncate: 3
+ */
+ constructor(input, liquid) {
+ this.filters = [];
+ const token = typeof input === 'string'
+ ? new Tokenizer(input, liquid.options.operators).readFilteredValue()
+ : input;
+ this.initial = token.initial;
+ this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid));
+ }
+ *value(ctx, lenient) {
+ lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default');
+ let val = yield this.initial.evaluate(ctx, lenient);
+ for (const filter of this.filters) {
+ val = yield filter.render(val, ctx);
+ }
+ return val;
+ }
+ getFilter(liquid, name) {
+ const impl = liquid.filters[name];
+ assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`);
+ return impl;
+ }
+} + +class Output extends TemplateImpl {
+ constructor(token, liquid) {
+ var _a;
+ super(token);
+ const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange);
+ this.value = new Value(tokenizer.readFilteredValue(), liquid);
+ const filters = this.value.filters;
+ const outputEscape = liquid.options.outputEscape;
+ if (!((_a = filters[filters.length - 1]) === null || _a === void 0 ? void 0 : _a.raw) && outputEscape) {
+ const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0);
+ filters.push(new Filter(token, outputEscape, liquid));
+ }
+ }
+ *render(ctx, emitter) {
+ const val = yield this.value.value(ctx, false);
+ emitter.write(val);
+ }
+ *arguments() {
+ yield this.value;
+ }
+} + +class HTML extends TemplateImpl {
+ constructor(token) {
+ super(token);
+ this.str = token.getContent();
+ }
+ *render(ctx, emitter) {
+ emitter.write(this.str);
+ }
+} + +/**
+ * A variable's segments and location, which can be coerced to a string.
+ */
+class Variable {
+ constructor(segments, location) {
+ this.segments = segments;
+ this.location = location;
+ }
+ toString() {
+ return segmentsString(this.segments, true);
+ }
+ /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */
+ toArray() {
+ function* _visit(...segments) {
+ for (const segment of segments) {
+ if (segment instanceof Variable) {
+ yield Array.from(_visit(...segment.segments));
+ }
+ else {
+ yield segment;
+ }
+ }
+ }
+ return Array.from(_visit(...this.segments));
+ }
+}
+/**
+ * Group variables by the string representation of their root segment.
+ */
+class VariableMap {
+ constructor() {
+ this.map = new Map();
+ }
+ get(key) {
+ const k = segmentsString([key.segments[0]]);
+ if (!this.map.has(k)) {
+ this.map.set(k, []);
+ }
+ return this.map.get(k);
+ }
+ has(key) {
+ return this.map.has(segmentsString([key.segments[0]]));
+ }
+ push(variable) {
+ this.get(variable).push(variable);
+ }
+ asObject() {
+ return Object.fromEntries(this.map);
+ }
+}
+const defaultStaticAnalysisOptions = {
+ partials: true
+};
+function* _analyze(templates, partials, sync) {
+ const variables = new VariableMap();
+ const globals = new VariableMap();
+ const locals = new VariableMap();
+ const rootScope = new DummyScope(new Set());
+ // Names of partial templates that we've already analyzed.
+ const seen = new Set();
+ function updateVariables(variable, scope) {
+ variables.push(variable);
+ const aliased = scope.alias(variable);
+ if (aliased !== undefined) {
+ const root = aliased.segments[0];
+ // TODO: What if a a template renders a rendered template? Do we need scope.parent?
+ if (isString(root) && !rootScope.has(root)) {
+ globals.push(aliased);
+ }
+ }
+ else {
+ const root = variable.segments[0];
+ if (isString(root) && !scope.has(root)) {
+ globals.push(variable);
+ }
+ }
+ // Recurse for nested Variables
+ for (const segment of variable.segments) {
+ if (segment instanceof Variable) {
+ updateVariables(segment, scope);
+ }
+ }
+ }
+ function* visit(template, scope) {
+ if (template.arguments) {
+ for (const arg of template.arguments()) {
+ for (const variable of extractVariables(arg)) {
+ updateVariables(variable, scope);
+ }
+ }
+ }
+ if (template.localScope) {
+ for (const ident of template.localScope()) {
+ scope.add(ident.content);
+ scope.deleteAlias(ident.content);
+ const [row, col] = ident.getPosition();
+ locals.push(new Variable([ident.content], { row, col, file: ident.file }));
+ }
+ }
+ if (template.children) {
+ if (template.partialScope) {
+ const partial = template.partialScope();
+ if (partial === undefined) {
+ // Layouts, for example, can have children that are not partials.
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, scope);
+ }
+ return;
+ }
+ if (seen.has(partial.name))
+ return;
+ const partialScopeNames = new Set();
+ const partialScope = partial.isolated
+ ? new DummyScope(partialScopeNames)
+ : scope.push(partialScopeNames);
+ for (const name of partial.scope) {
+ if (isString(name)) {
+ partialScopeNames.add(name);
+ }
+ else {
+ const [alias, argument] = name;
+ partialScopeNames.add(alias);
+ const variables = Array.from(extractVariables(argument));
+ if (variables.length) {
+ partialScope.setAlias(alias, variables[0].segments);
+ }
+ }
+ }
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, partialScope);
+ seen.add(partial.name);
+ }
+ partialScope.pop();
+ }
+ else {
+ if (template.blockScope) {
+ scope.push(new Set(template.blockScope()));
+ }
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, scope);
+ }
+ if (template.blockScope) {
+ scope.pop();
+ }
+ }
+ }
+ }
+ for (const template of templates) {
+ yield visit(template, rootScope);
+ }
+ return {
+ variables: variables.asObject(),
+ globals: globals.asObject(),
+ locals: locals.asObject()
+ };
+}
+/**
+ * Statically analyze a template and report variable usage.
+ */
+function analyze(template, options = {}) {
+ const opts = Object.assign(Object.assign({}, defaultStaticAnalysisOptions), options);
+ return toPromise(_analyze(template, opts.partials, false));
+}
+/**
+ * Statically analyze a template and report variable usage.
+ */
+function analyzeSync(template, options = {}) {
+ const opts = Object.assign(Object.assign({}, defaultStaticAnalysisOptions), options);
+ return toValueSync(_analyze(template, opts.partials, true));
+}
+/**
+ * A stack to manage scopes while traversing templates during static analysis.
+ */
+class DummyScope {
+ constructor(globals) {
+ this.stack = [{ names: globals, aliases: new Map() }];
+ }
+ /** Return true if `name` is in scope. */
+ has(name) {
+ for (const scope of this.stack) {
+ if (scope.names.has(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ push(scope) {
+ this.stack.push({ names: scope, aliases: new Map() });
+ return this;
+ }
+ pop() {
+ var _a;
+ return (_a = this.stack.pop()) === null || _a === void 0 ? void 0 : _a.names;
+ }
+ // Add a name to the template scope.
+ add(name) {
+ this.stack[0].names.add(name);
+ }
+ /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */
+ alias(variable) {
+ const root = variable.segments[0];
+ if (!isString(root))
+ return undefined;
+ const alias = this.getAlias(root);
+ if (alias === undefined)
+ return undefined;
+ return new Variable([...alias, ...variable.segments.slice(1)], variable.location);
+ }
+ // TODO: `from` could be a path with multiple segments, like `include.x`.
+ setAlias(from, to) {
+ this.stack[this.stack.length - 1].aliases.set(from, to);
+ }
+ deleteAlias(name) {
+ this.stack[this.stack.length - 1].aliases.delete(name);
+ }
+ getAlias(name) {
+ for (const scope of this.stack) {
+ if (scope.aliases.has(name)) {
+ return scope.aliases.get(name);
+ }
+ // If a scope has defined `name`, then it masks aliases in parent scopes.
+ if (scope.names.has(name)) {
+ return undefined;
+ }
+ }
+ return undefined;
+ }
+}
+function* extractVariables(value) {
+ if (isValueToken(value)) {
+ yield* extractValueTokenVariables(value);
+ }
+ else if (value instanceof Value) {
+ yield* extractFilteredValueVariables(value);
+ }
+}
+function* extractFilteredValueVariables(value) {
+ for (const token of value.initial.postfix) {
+ if (isValueToken(token)) {
+ yield* extractValueTokenVariables(token);
+ }
+ }
+ for (const filter of value.filters) {
+ for (const arg of filter.args) {
+ if (isKeyValuePair(arg) && arg[1]) {
+ yield* extractValueTokenVariables(arg[1]);
+ }
+ else if (isValueToken(arg)) {
+ yield* extractValueTokenVariables(arg);
+ }
+ }
+ }
+}
+function* extractValueTokenVariables(token) {
+ if (isRangeToken(token)) {
+ yield* extractValueTokenVariables(token.lhs);
+ yield* extractValueTokenVariables(token.rhs);
+ }
+ else if (isPropertyAccessToken(token)) {
+ yield extractPropertyAccessVariable(token);
+ }
+}
+function extractPropertyAccessVariable(token) {
+ const segments = [];
+ // token is not guaranteed to have `file` set. We'll try to get it from a prop if not.
+ let file = token.file;
+ // Here we're flattening the first segment of a path if it is a nested path.
+ const root = token.props[0];
+ file = file || root.file;
+ if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) {
+ segments.push(root.content);
+ }
+ else if (isPropertyAccessToken(root)) {
+ // Flatten paths that start with a nested path.
+ segments.push(...extractPropertyAccessVariable(root).segments);
+ }
+ for (const prop of token.props.slice(1)) {
+ file = file || prop.file;
+ if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) {
+ segments.push(prop.content);
+ }
+ else if (isPropertyAccessToken(prop)) {
+ segments.push(extractPropertyAccessVariable(prop));
+ }
+ }
+ const [row, col] = token.getPosition();
+ return new Variable(segments, {
+ row,
+ col,
+ file
+ });
+}
+// This is used to detect segments that can be represented with dot notation
+// when creating a string representation of VariableSegments.
+const RE_PROPERTY = /^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/;
+/**
+ * Return a string representation of segments using dot notation where possible.
+ * @param segments - The property names and array indices that make up a path to a variable.
+ * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets.
+ */
+function segmentsString(segments, bracketedRoot = false) {
+ const buf = [];
+ const root = segments[0];
+ if (isString(root)) {
+ if (!bracketedRoot || root.match(RE_PROPERTY)) {
+ buf.push(`${root}`);
+ }
+ else {
+ buf.push(`['${root}']`);
+ }
+ }
+ for (const segment of segments.slice(1)) {
+ if (segment instanceof Variable) {
+ buf.push(`[${segmentsString(segment.segments)}]`);
+ }
+ else if (isString(segment)) {
+ if (segment.match(RE_PROPERTY)) {
+ buf.push(`.${segment}`);
+ }
+ else {
+ buf.push(`['${segment}']`);
+ }
+ }
+ else {
+ buf.push(`[${segment}]`);
+ }
+ }
+ return buf.join('');
+} + +var LookupType;
+(function (LookupType) {
+ LookupType["Partials"] = "partials";
+ LookupType["Layouts"] = "layouts";
+ LookupType["Root"] = "root";
+})(LookupType || (LookupType = {}));
+class Loader {
+ constructor(options) {
+ this.options = options;
+ if (options.relativeReference) {
+ const sep = options.fs.sep;
+ assert(sep, '`fs.sep` is required for relative reference');
+ const rRelativePath = new RegExp(['.' + sep, '..' + sep, './', '../'].map(prefix => escapeRegex(prefix)).join('|'));
+ this.shouldLoadRelative = (referencedFile) => rRelativePath.test(referencedFile);
+ }
+ else {
+ this.shouldLoadRelative = (_referencedFile) => false;
+ }
+ this.contains = this.options.fs.contains || (() => true);
+ }
+ *lookup(file, type, sync, currentFile) {
+ const { fs } = this.options;
+ const dirs = this.options[type];
+ for (const filepath of this.candidates(file, dirs, currentFile, type !== LookupType.Root)) {
+ if (sync ? fs.existsSync(filepath) : yield fs.exists(filepath))
+ return filepath;
+ }
+ throw this.lookupError(file, dirs);
+ }
+ *candidates(file, dirs, currentFile, enforceRoot) {
+ const { fs, extname } = this.options;
+ if (this.shouldLoadRelative(file) && currentFile) {
+ const referenced = fs.resolve(this.dirname(currentFile), file, extname);
+ for (const dir of dirs) {
+ if (!enforceRoot || this.contains(dir, referenced)) {
+ // the relatively referenced file is within one of root dirs
+ yield referenced;
+ break;
+ }
+ }
+ }
+ for (const dir of dirs) {
+ const referenced = fs.resolve(dir, file, extname);
+ if (!enforceRoot || this.contains(dir, referenced)) {
+ yield referenced;
+ }
+ }
+ if (fs.fallback !== undefined) {
+ const filepath = fs.fallback(file);
+ if (filepath !== undefined)
+ yield filepath;
+ }
+ }
+ dirname(path) {
+ const fs = this.options.fs;
+ assert(fs.dirname, '`fs.dirname` is required for relative reference');
+ return fs.dirname(path);
+ }
+ lookupError(file, roots) {
+ const err = new Error('ENOENT');
+ err.message = `ENOENT: Failed to lookup "${file}" in "${roots}"`;
+ err.code = 'ENOENT';
+ return err;
+ }
+} + +class Parser {
+ constructor(liquid) {
+ this.liquid = liquid;
+ this.cache = this.liquid.options.cache;
+ this.fs = this.liquid.options.fs;
+ this.parseFile = this.cache ? this._parseFileCached : this._parseFile;
+ this.loader = new Loader(this.liquid.options);
+ this.parseLimit = new Limiter('parse length', liquid.options.parseLimit);
+ }
+ parse(html, filepath) {
+ html = String(html);
+ this.parseLimit.use(html.length);
+ const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath);
+ const tokens = tokenizer.readTopLevelTokens(this.liquid.options);
+ return this.parseTokens(tokens);
+ }
+ parseTokens(tokens) {
+ let token;
+ const templates = [];
+ const errors = [];
+ while ((token = tokens.shift())) {
+ try {
+ templates.push(this.parseToken(token, tokens));
+ }
+ catch (err) {
+ if (this.liquid.options.catchAllErrors)
+ errors.push(err);
+ else
+ throw err;
+ }
+ }
+ if (errors.length)
+ throw new LiquidErrors(errors);
+ return templates;
+ }
+ parseToken(token, remainTokens) {
+ try {
+ if (isTagToken(token)) {
+ const TagClass = this.liquid.tags[token.name];
+ assert(TagClass, `tag "${token.name}" not found`);
+ return new TagClass(token, remainTokens, this.liquid, this);
+ }
+ if (isOutputToken(token)) {
+ return new Output(token, this.liquid);
+ }
+ return new HTML(token);
+ }
+ catch (e) {
+ if (LiquidError.is(e))
+ throw e;
+ throw new ParseError(e, token);
+ }
+ }
+ parseStream(tokens) {
+ return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens));
+ }
+ *_parseFileCached(file, sync, type = LookupType.Root, currentFile) {
+ const cache = this.cache;
+ const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file;
+ const tpls = yield cache.read(key);
+ if (tpls)
+ return tpls;
+ const task = this._parseFile(file, sync, type, currentFile);
+ // sync mode: exec the task and cache the result
+ // async mode: cache the task before exec
+ const taskOrTpl = sync ? yield task : toPromise(task);
+ cache.write(key, taskOrTpl);
+ // note: concurrent tasks will be reused, cache for failed task is removed until its end
+ try {
+ return yield taskOrTpl;
+ }
+ catch (err) {
+ cache.remove(key);
+ throw err;
+ }
+ }
+ *_parseFile(file, sync, type = LookupType.Root, currentFile) {
+ const filepath = yield this.loader.lookup(file, type, sync, currentFile);
+ return this.parse(sync ? this.fs.readFileSync(filepath) : yield this.fs.readFile(filepath), filepath);
+ }
+} + +var TokenKind;
+(function (TokenKind) {
+ TokenKind[TokenKind["Number"] = 1] = "Number";
+ TokenKind[TokenKind["Literal"] = 2] = "Literal";
+ TokenKind[TokenKind["Tag"] = 4] = "Tag";
+ TokenKind[TokenKind["Output"] = 8] = "Output";
+ TokenKind[TokenKind["HTML"] = 16] = "HTML";
+ TokenKind[TokenKind["Filter"] = 32] = "Filter";
+ TokenKind[TokenKind["Hash"] = 64] = "Hash";
+ TokenKind[TokenKind["PropertyAccess"] = 128] = "PropertyAccess";
+ TokenKind[TokenKind["Word"] = 256] = "Word";
+ TokenKind[TokenKind["Range"] = 512] = "Range";
+ TokenKind[TokenKind["Quoted"] = 1024] = "Quoted";
+ TokenKind[TokenKind["Operator"] = 2048] = "Operator";
+ TokenKind[TokenKind["FilteredValue"] = 4096] = "FilteredValue";
+ TokenKind[TokenKind["Delimited"] = 12] = "Delimited";
+})(TokenKind || (TokenKind = {})); + +function isDelimitedToken(val) {
+ return !!(getKind(val) & TokenKind.Delimited);
+}
+function isOperatorToken(val) {
+ return getKind(val) === TokenKind.Operator;
+}
+function isHTMLToken(val) {
+ return getKind(val) === TokenKind.HTML;
+}
+function isOutputToken(val) {
+ return getKind(val) === TokenKind.Output;
+}
+function isTagToken(val) {
+ return getKind(val) === TokenKind.Tag;
+}
+function isQuotedToken(val) {
+ return getKind(val) === TokenKind.Quoted;
+}
+function isLiteralToken(val) {
+ return getKind(val) === TokenKind.Literal;
+}
+function isNumberToken(val) {
+ return getKind(val) === TokenKind.Number;
+}
+function isPropertyAccessToken(val) {
+ return getKind(val) === TokenKind.PropertyAccess;
+}
+function isWordToken(val) {
+ return getKind(val) === TokenKind.Word;
+}
+function isRangeToken(val) {
+ return getKind(val) === TokenKind.Range;
+}
+function isValueToken(val) {
+ // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range
+ return (getKind(val) & 1667) > 0;
+}
+function getKind(val) {
+ return val ? val.kind : -1;
+} + +var typeGuards = /*#__PURE__*/Object.freeze({ + __proto__: null, + isDelimitedToken: isDelimitedToken, + isOperatorToken: isOperatorToken, + isHTMLToken: isHTMLToken, + isOutputToken: isOutputToken, + isTagToken: isTagToken, + isQuotedToken: isQuotedToken, + isLiteralToken: isLiteralToken, + isNumberToken: isNumberToken, + isPropertyAccessToken: isPropertyAccessToken, + isWordToken: isWordToken, + isRangeToken: isRangeToken, + isValueToken: isValueToken +}); + +class Context {
+ constructor(env = {}, opts = defaultOptions, renderOptions = {}, { memoryLimit, renderLimit } = {}) {
+ var _a, _b, _c, _d, _e;
+ /**
+ * insert a Context-level empty scope,
+ * for tags like `{% capture %}` `{% assign %}` to operate
+ */
+ this.scopes = [{}];
+ this.registers = {};
+ this.breakCalled = false;
+ this.continueCalled = false;
+ this.sync = !!renderOptions.sync;
+ this.opts = opts;
+ this.globals = (_a = renderOptions.globals) !== null && _a !== void 0 ? _a : opts.globals;
+ this.environments = isObject(env) ? env : Object(env);
+ this.strictVariables = (_b = renderOptions.strictVariables) !== null && _b !== void 0 ? _b : this.opts.strictVariables;
+ this.ownPropertyOnly = (_c = renderOptions.ownPropertyOnly) !== null && _c !== void 0 ? _c : opts.ownPropertyOnly;
+ this.memoryLimit = memoryLimit !== null && memoryLimit !== void 0 ? memoryLimit : new Limiter('memory alloc', (_d = renderOptions.memoryLimit) !== null && _d !== void 0 ? _d : opts.memoryLimit);
+ this.renderLimit = renderLimit !== null && renderLimit !== void 0 ? renderLimit : new Limiter('template render', getPerformance().now() + ((_e = renderOptions.renderLimit) !== null && _e !== void 0 ? _e : opts.renderLimit));
+ }
+ getRegister(key) {
+ return (this.registers[key] = this.registers[key] || {});
+ }
+ setRegister(key, value) {
+ return (this.registers[key] = value);
+ }
+ saveRegister(...keys) {
+ return keys.map(key => [key, this.getRegister(key)]);
+ }
+ restoreRegister(keyValues) {
+ return keyValues.forEach(([key, value]) => this.setRegister(key, value));
+ }
+ getAll() {
+ return [this.globals, this.environments, ...this.scopes]
+ .reduce((ctx, val) => __assign(ctx, val), {});
+ }
+ /**
+ * @deprecated use `_get()` or `getSync()` instead
+ */
+ get(paths) {
+ return this.getSync(paths);
+ }
+ getSync(paths) {
+ return toValueSync(this._get(paths));
+ }
+ *_get(paths) {
+ const scope = this.findScope(paths[0]); // first prop should always be a string
+ return yield this._getFromScope(scope, paths);
+ }
+ /**
+ * @deprecated use `_get()` instead
+ */
+ getFromScope(scope, paths) {
+ return toValueSync(this._getFromScope(scope, paths));
+ }
+ *_getFromScope(scope, paths, strictVariables = this.strictVariables) {
+ if (isString(paths))
+ paths = paths.split('.');
+ for (let i = 0; i < paths.length; i++) {
+ scope = yield this.readProperty(scope, paths[i]);
+ if (strictVariables && isUndefined(scope)) {
+ throw new InternalUndefinedVariableError(paths.slice(0, i + 1).join('.'));
+ }
+ }
+ return scope;
+ }
+ push(ctx) {
+ return this.scopes.push(ctx);
+ }
+ pop() {
+ return this.scopes.pop();
+ }
+ bottom() {
+ return this.scopes[0];
+ }
+ spawn(scope = {}) {
+ return new Context(scope, this.opts, {
+ sync: this.sync,
+ globals: this.globals,
+ strictVariables: this.strictVariables
+ }, {
+ renderLimit: this.renderLimit,
+ memoryLimit: this.memoryLimit
+ });
+ }
+ findScope(key) {
+ for (let i = this.scopes.length - 1; i >= 0; i--) {
+ const candidate = this.scopes[i];
+ if (key in candidate)
+ return candidate;
+ }
+ if (key in this.environments)
+ return this.environments;
+ return this.globals;
+ }
+ readProperty(obj, key) {
+ obj = toLiquid(obj);
+ key = toValue(key);
+ if (isNil(obj))
+ return obj;
+ if (isArray(obj) && key < 0)
+ return obj[obj.length + +key];
+ const value = readJSProperty(obj, key, this.ownPropertyOnly);
+ if (value === undefined && obj instanceof Drop)
+ return obj.liquidMethodMissing(key, this);
+ if (isFunction(value))
+ return value.call(obj);
+ if (key === 'size')
+ return readSize(obj);
+ else if (key === 'first')
+ return readFirst(obj);
+ else if (key === 'last')
+ return readLast(obj);
+ return value;
+ }
+}
+function readJSProperty(obj, key, ownPropertyOnly) {
+ if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop))
+ return undefined;
+ return obj[key];
+}
+function readFirst(obj) {
+ if (isArray(obj))
+ return obj[0];
+ return obj['first'];
+}
+function readLast(obj) {
+ if (isArray(obj))
+ return obj[obj.length - 1];
+ return obj['last'];
+}
+function readSize(obj) {
+ if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined)
+ return obj['size'];
+ if (isArray(obj) || isString(obj))
+ return obj.length;
+ if (typeof obj === 'object')
+ return Object.keys(obj).length;
+} + +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 = {})); + +const abs = argumentsToNumber(Math.abs);
+const at_least = argumentsToNumber(Math.max);
+const at_most = argumentsToNumber(Math.min);
+const ceil = argumentsToNumber(Math.ceil);
+const divided_by = argumentsToNumber((dividend, divisor, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor);
+const floor = argumentsToNumber(Math.floor);
+const minus = argumentsToNumber((v, arg) => v - arg);
+const plus = argumentsToNumber((lhs, rhs) => lhs + rhs);
+const modulo = argumentsToNumber((v, arg) => v % arg);
+const times = argumentsToNumber((v, arg) => v * arg);
+function round(v, arg = 0) {
+ v = toNumber(v);
+ arg = toNumber(arg);
+ const amp = Math.pow(10, arg);
+ return Math.round(v * amp) / amp;
+} + +var mathFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + abs: abs, + at_least: at_least, + at_most: at_most, + ceil: ceil, + divided_by: divided_by, + floor: floor, + minus: minus, + plus: plus, + modulo: modulo, + times: times, + round: round +}); + +const url_decode = (x) => decodeURIComponent(stringify(x)).replace(/\+/g, ' ');
+const url_encode = (x) => encodeURIComponent(stringify(x)).replace(/%20/g, '+');
+const cgi_escape = (x) => encodeURIComponent(stringify(x))
+ .replace(/%20/g, '+')
+ .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase());
+const uri_escape = (x) => encodeURI(stringify(x))
+ .replace(/%5B/g, '[')
+ .replace(/%5D/g, ']');
+const rSlugifyDefault = /[^\p{M}\p{L}\p{Nd}]+/ug;
+const rSlugifyReplacers = {
+ 'raw': /\s+/g,
+ 'default': rSlugifyDefault,
+ 'pretty': /[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/ug,
+ 'ascii': /[^A-Za-z0-9]+/g,
+ 'latin': rSlugifyDefault,
+ 'none': null
+};
+function slugify(str, mode = 'default', cased = false) {
+ str = stringify(str);
+ const replacer = rSlugifyReplacers[mode];
+ if (replacer) {
+ if (mode === 'latin')
+ str = removeAccents(str);
+ str = str.replace(replacer, '-').replace(/^-|-$/g, '');
+ }
+ return cased ? str : str.toLowerCase();
+}
+function removeAccents(str) {
+ return str.replace(/[àáâãäå]/g, 'a')
+ .replace(/[æ]/g, 'ae')
+ .replace(/[ç]/g, 'c')
+ .replace(/[èéêë]/g, 'e')
+ .replace(/[ìíîï]/g, 'i')
+ .replace(/[ð]/g, 'd')
+ .replace(/[ñ]/g, 'n')
+ .replace(/[òóôõöø]/g, 'o')
+ .replace(/[ùúûü]/g, 'u')
+ .replace(/[ýÿ]/g, 'y')
+ .replace(/[ß]/g, 'ss')
+ .replace(/[œ]/g, 'oe')
+ .replace(/[þ]/g, 'th')
+ .replace(/[ẞ]/g, 'SS')
+ .replace(/[Œ]/g, 'OE')
+ .replace(/[Þ]/g, 'TH');
+} + +var urlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + url_decode: url_decode, + url_encode: url_encode, + cgi_escape: cgi_escape, + uri_escape: uri_escape, + slugify: slugify +}); + +const join = argumentsToValue(function (v, arg) {
+ const array = toArray(v);
+ const sep = isNil(arg) ? ' ' : stringify(arg);
+ const complexity = array.length * (1 + sep.length);
+ this.context.memoryLimit.use(complexity);
+ return array.join(sep);
+});
+const last$1 = argumentsToValue((v) => isArrayLike(v) ? last(v) : '');
+const first = argumentsToValue((v) => isArrayLike(v) ? v[0] : '');
+const reverse = argumentsToValue(function (v) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ return [...array].reverse();
+});
+function* sort(arr, property) {
+ const values = [];
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ values.push([
+ item,
+ property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item
+ ]);
+ }
+ return values.sort((lhs, rhs) => {
+ const lvalue = lhs[1];
+ const rvalue = rhs[1];
+ return lvalue < rvalue ? -1 : (lvalue > rvalue ? 1 : 0);
+ }).map(tuple => tuple[0]);
+}
+function sort_natural(input, property) {
+ const propertyString = stringify(property);
+ const compare = property === undefined
+ ? caseInsensitiveCompare
+ : (lhs, rhs) => caseInsensitiveCompare(lhs[propertyString], rhs[propertyString]);
+ const array = toArray(input);
+ this.context.memoryLimit.use(array.length);
+ return [...array].sort(compare);
+}
+const size = (v) => (v && v.length) || 0;
+function* map(arr, property) {
+ const results = [];
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ results.push(yield this.context._getFromScope(item, stringify(property), false));
+ }
+ return results;
+}
+function* sum(arr, property) {
+ let sum = 0;
+ const array = toArray(arr);
+ for (const item of array) {
+ const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item);
+ sum += Number.isNaN(data) ? 0 : data;
+ }
+ return sum;
+}
+function compact(arr) {
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ return array.filter(x => !isNil(toValue(x)));
+}
+function concat(v, arg = []) {
+ const lhs = toArray(v);
+ const rhs = toArray(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return lhs.concat(rhs);
+}
+function push(v, arg) {
+ return concat.call(this, v, [arg]);
+}
+function unshift(v, arg) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ const clone = [...array];
+ clone.unshift(arg);
+ return clone;
+}
+function pop(v) {
+ const clone = [...toArray(v)];
+ clone.pop();
+ return clone;
+}
+function shift(v) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ const clone = [...array];
+ clone.shift();
+ return clone;
+}
+function slice(v, begin, length = 1) {
+ v = toValue(v);
+ if (isNil(v))
+ return [];
+ if (!isArray(v))
+ v = stringify(v);
+ begin = begin < 0 ? v.length + begin : begin;
+ this.context.memoryLimit.use(length);
+ return v.slice(begin, begin + length);
+}
+function expectedMatcher(expected) {
+ if (this.context.opts.jekyllWhere) {
+ return (v) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected));
+ }
+ else if (expected === undefined) {
+ return (v) => isTruthy(v, this.context);
+ }
+ else {
+ return (v) => equals(v, expected);
+ }
+}
+function* filter(include, arr, property, expected) {
+ const values = [];
+ arr = toArray(arr);
+ this.context.memoryLimit.use(arr.length);
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ for (const item of arr) {
+ values.push(yield evalToken(token, this.context.spawn(item)));
+ }
+ const matcher = expectedMatcher.call(this, expected);
+ return arr.filter((_, i) => matcher(values[i]) === include);
+}
+function* filter_exp(include, arr, itemName, exp) {
+ const filtered = [];
+ const keyTemplate = new Value(stringify(exp), this.liquid);
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ this.context.push({ [itemName]: item });
+ const value = yield keyTemplate.value(this.context);
+ this.context.pop();
+ if (value === include)
+ filtered.push(item);
+ }
+ return filtered;
+}
+function* where(arr, property, expected) {
+ return yield* filter.call(this, true, arr, property, expected);
+}
+function* reject(arr, property, expected) {
+ return yield* filter.call(this, false, arr, property, expected);
+}
+function* where_exp(arr, itemName, exp) {
+ return yield* filter_exp.call(this, true, arr, itemName, exp);
+}
+function* reject_exp(arr, itemName, exp) {
+ return yield* filter_exp.call(this, false, arr, itemName, exp);
+}
+function* group_by(arr, property) {
+ const map = new Map();
+ arr = toEnumerable(arr);
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ this.context.memoryLimit.use(arr.length);
+ for (const item of arr) {
+ const key = yield evalToken(token, this.context.spawn(item));
+ if (!map.has(key))
+ map.set(key, []);
+ map.get(key).push(item);
+ }
+ return [...map.entries()].map(([name, items]) => ({ name, items }));
+}
+function* group_by_exp(arr, itemName, exp) {
+ const map = new Map();
+ const keyTemplate = new Value(stringify(exp), this.liquid);
+ arr = toEnumerable(arr);
+ this.context.memoryLimit.use(arr.length);
+ for (const item of arr) {
+ this.context.push({ [itemName]: item });
+ const key = yield keyTemplate.value(this.context);
+ this.context.pop();
+ if (!map.has(key))
+ map.set(key, []);
+ map.get(key).push(item);
+ }
+ return [...map.entries()].map(([name, items]) => ({ name, items }));
+}
+function* search(arr, property, expected) {
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ const array = toArray(arr);
+ const matcher = expectedMatcher.call(this, expected);
+ for (let index = 0; index < array.length; index++) {
+ const value = yield evalToken(token, this.context.spawn(array[index]));
+ if (matcher(value))
+ return [index, array[index]];
+ }
+}
+function* search_exp(arr, itemName, exp) {
+ const predicate = new Value(stringify(exp), this.liquid);
+ const array = toArray(arr);
+ for (let index = 0; index < array.length; index++) {
+ this.context.push({ [itemName]: array[index] });
+ const value = yield predicate.value(this.context);
+ this.context.pop();
+ if (value)
+ return [index, array[index]];
+ }
+}
+function* has(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return !!result;
+}
+function* has_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return !!result;
+}
+function* find_index(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return result ? result[0] : undefined;
+}
+function* find_index_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return result ? result[0] : undefined;
+}
+function* find(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return result ? result[1] : undefined;
+}
+function* find_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return result ? result[1] : undefined;
+}
+function uniq(arr) {
+ arr = toArray(arr);
+ this.context.memoryLimit.use(arr.length);
+ return [...new Set(arr)];
+}
+function sample(v, count = 1) {
+ v = toValue(v);
+ if (isNil(v))
+ return [];
+ if (!isArray(v))
+ v = stringify(v);
+ this.context.memoryLimit.use(count);
+ const shuffled = [...v].sort(() => Math.random() - 0.5);
+ if (count === 1)
+ return shuffled[0];
+ return shuffled.slice(0, count);
+} + +var arrayFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + join: join, + last: last$1, + first: first, + reverse: reverse, + sort: sort, + sort_natural: sort_natural, + size: size, + map: map, + sum: sum, + compact: compact, + concat: concat, + push: push, + unshift: unshift, + pop: pop, + shift: shift, + slice: slice, + where: where, + reject: reject, + where_exp: where_exp, + reject_exp: reject_exp, + group_by: group_by, + group_by_exp: group_by_exp, + has: has, + has_exp: has_exp, + find_index: find_index, + find_index_exp: find_index_exp, + find: find, + find_exp: find_exp, + uniq: uniq, + sample: sample +}); + +function date(v, format, timezoneOffset) {
+ var _a, _b, _c;
+ const size = ((_a = v === null || v === void 0 ? void 0 : v.length) !== null && _a !== void 0 ? _a : 0) + ((_b = format === null || format === void 0 ? void 0 : format.length) !== null && _b !== void 0 ? _b : 0) + ((_c = timezoneOffset === null || timezoneOffset === void 0 ? void 0 : timezoneOffset.length) !== null && _c !== void 0 ? _c : 0);
+ this.context.memoryLimit.use(size);
+ const date = parseDate(v, this.context.opts, timezoneOffset);
+ if (!date)
+ return v;
+ format = toValue(format);
+ format = isNil(format) ? this.context.opts.dateFormat : stringify(format);
+ return strftime(date, format);
+}
+function date_to_xmlschema(v) {
+ return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z');
+}
+function date_to_rfc822(v) {
+ return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z');
+}
+function date_to_string(v, type, style) {
+ return stringify_date.call(this, v, '%b', type, style);
+}
+function date_to_long_string(v, type, style) {
+ return stringify_date.call(this, v, '%B', type, style);
+}
+function stringify_date(v, month_type, type, style) {
+ const date = parseDate(v, this.context.opts);
+ if (!date)
+ return v;
+ if (type === 'ordinal') {
+ const d = date.getDate();
+ return style === 'US'
+ ? strftime(date, `${month_type} ${d}%q, %Y`)
+ : strftime(date, `${d}%q ${month_type} %Y`);
+ }
+ return strftime(date, `%d ${month_type} %Y`);
+}
+function parseDate(v, opts, timezoneOffset) {
+ let date;
+ const defaultTimezoneOffset = timezoneOffset !== null && timezoneOffset !== void 0 ? timezoneOffset : opts.timezoneOffset;
+ const locale = opts.locale;
+ v = toValue(v);
+ if (v === 'now' || v === 'today') {
+ date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset);
+ }
+ else if (isNumber(v)) {
+ date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset);
+ }
+ else if (isString(v)) {
+ if (/^\d+$/.test(v)) {
+ date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset);
+ }
+ else if (opts.preserveTimezones && timezoneOffset === undefined) {
+ date = LiquidDate.createDateFixedToTimezone(v, locale);
+ }
+ else {
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
+ }
+ }
+ else {
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
+ }
+ return date.valid() ? date : undefined;
+} + +var dateFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + date: date, + date_to_xmlschema: date_to_xmlschema, + date_to_rfc822: date_to_rfc822, + date_to_string: date_to_string, + date_to_long_string: date_to_long_string +}); + +/**
+ * String related filters
+ *
+ * * prefer stringify() to String() since `undefined`, `null` should eval ''
+ */
+const rCJKWord = /[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu;
+// Word boundary followed by word characters (for detecting words)
+const rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu;
+function append(v, arg) {
+ assert(arguments.length === 2, 'append expect 2 arguments');
+ const lhs = stringify(v);
+ const rhs = stringify(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return lhs + rhs;
+}
+function prepend(v, arg) {
+ assert(arguments.length === 2, 'prepend expect 2 arguments');
+ const lhs = stringify(v);
+ const rhs = stringify(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return rhs + lhs;
+}
+function lstrip(v, chars) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str.replace(new RegExp(`^[${chars}]+`, 'g'), '');
+ }
+ return str.replace(/^\s+/, '');
+}
+function downcase(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.toLowerCase();
+}
+function upcase(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return stringify(str).toUpperCase();
+}
+function remove(v, arg) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.split(stringify(arg)).join('');
+}
+function remove_first(v, l) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(stringify(l), '');
+}
+function remove_last(v, l) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const pattern = stringify(l);
+ const index = str.lastIndexOf(pattern);
+ if (index === -1)
+ return str;
+ return str.substring(0, index) + str.substring(index + pattern.length);
+}
+function rstrip(str, chars) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str.replace(new RegExp(`[${chars}]+$`, 'g'), '');
+ }
+ return str.replace(/\s+$/, '');
+}
+function split(v, arg) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const arr = str.split(stringify(arg));
+ // align to ruby split, which is the behavior of shopify/liquid
+ // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split
+ while (arr.length && arr[arr.length - 1] === '')
+ arr.pop();
+ return arr;
+}
+function strip(v, chars) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str
+ .replace(new RegExp(`^[${chars}]+`, 'g'), '')
+ .replace(new RegExp(`[${chars}]+$`, 'g'), '');
+ }
+ return str.trim();
+}
+function strip_newlines(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\r?\n/gm, '');
+}
+function capitalize(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
+}
+function replace(v, pattern, replacement) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.split(stringify(pattern)).join(replacement);
+}
+function replace_first(v, arg1, arg2) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(stringify(arg1), arg2);
+}
+function replace_last(v, arg1, arg2) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const pattern = stringify(arg1);
+ const index = str.lastIndexOf(pattern);
+ if (index === -1)
+ return str;
+ const replacement = stringify(arg2);
+ return str.substring(0, index) + replacement + str.substring(index + pattern.length);
+}
+function truncate(v, l = 50, o = '...') {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (str.length <= l)
+ return v;
+ return str.substring(0, l - o.length) + o;
+}
+function truncatewords(v, words = 15, o = '...') {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const arr = str.split(/\s+/);
+ if (words <= 0)
+ words = 1;
+ let ret = arr.slice(0, words).join(' ');
+ if (arr.length >= words)
+ ret += o;
+ return ret;
+}
+function normalize_whitespace(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\s+/g, ' ');
+}
+function number_of_words(input, mode) {
+ const str = stringify(input);
+ this.context.memoryLimit.use(str.length);
+ input = str.trim();
+ if (!input)
+ return 0;
+ switch (mode) {
+ case 'cjk':
+ // Count CJK characters and words
+ return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length;
+ case 'auto':
+ // Count CJK characters, if none, count words
+ return rCJKWord.test(input)
+ ? input.match(rCJKWord).length + (input.match(rNonCJKWord) || []).length
+ : input.split(/\s+/).length;
+ default:
+ // Count words only
+ return input.split(/\s+/).length;
+ }
+}
+function array_to_sentence_string(array, connector = 'and') {
+ this.context.memoryLimit.use(array.length);
+ switch (array.length) {
+ case 0:
+ return '';
+ case 1:
+ return array[0];
+ case 2:
+ return `${array[0]} ${connector} ${array[1]}`;
+ default:
+ return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`;
+ }
+} + +var stringFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + append: append, + prepend: prepend, + lstrip: lstrip, + downcase: downcase, + upcase: upcase, + remove: remove, + remove_first: remove_first, + remove_last: remove_last, + rstrip: rstrip, + split: split, + strip: strip, + strip_newlines: strip_newlines, + capitalize: capitalize, + replace: replace, + replace_first: replace_first, + replace_last: replace_last, + truncate: truncate, + truncatewords: truncatewords, + normalize_whitespace: normalize_whitespace, + number_of_words: number_of_words, + array_to_sentence_string: array_to_sentence_string +}); + +const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, htmlFilters), mathFilters), urlFilters), arrayFilters), dateFilters), stringFilters), misc); + +class AssignTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.key = this.identifier.content;
+ this.tokenizer.assert(this.key, 'expected variable name');
+ this.tokenizer.skipBlank();
+ this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected "="');
+ this.tokenizer.advance();
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ }
+ *render(ctx) {
+ ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf);
+ }
+ *arguments() {
+ yield this.value;
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +const MODIFIERS = ['offset', 'limit', 'reversed'];
+class ForTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const variable = this.tokenizer.readIdentifier();
+ const inStr = this.tokenizer.readIdentifier();
+ const collection = this.tokenizer.readValue();
+ if (!variable.size() || inStr.content !== 'in' || !collection) {
+ throw new Error(`illegal tag: ${token.getText()}`);
+ }
+ this.variable = variable.content;
+ this.collection = collection;
+ this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = [];
+ this.elseTemplates = [];
+ let p;
+ const stream = parser.parseStream(remainTokens)
+ .on('start', () => (p = this.templates))
+ .on('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates; })
+ .on('tag:endfor', tag => { assertEmpty(tag.args); stream.stop(); })
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => { throw new Error(`tag ${token.getText()} not closed`); });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ let collection = toEnumerable(yield evalToken(this.collection, ctx));
+ if (!collection.length) {
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ return;
+ }
+ const continueKey = 'continue-' + this.variable + '-' + this.collection.getText();
+ ctx.push({ continue: ctx.getRegister(continueKey) });
+ const hash = yield this.hash.render(ctx);
+ ctx.pop();
+ const modifiers = this.liquid.options.orderedFilterParameters
+ ? Object.keys(hash).filter(x => MODIFIERS.includes(x))
+ : MODIFIERS.filter(x => hash[x] !== undefined);
+ collection = modifiers.reduce((collection, modifier) => {
+ if (modifier === 'offset')
+ return offset(collection, hash['offset']);
+ if (modifier === 'limit')
+ return limit(collection, hash['limit']);
+ return reversed(collection);
+ }, collection);
+ ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length);
+ const scope = { forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) };
+ ctx.push(scope);
+ for (const item of collection) {
+ scope[this.variable] = item;
+ ctx.continueCalled = ctx.breakCalled = false;
+ yield r.renderTemplates(this.templates, ctx, emitter);
+ if (ctx.breakCalled)
+ break;
+ scope.forloop.next();
+ }
+ ctx.continueCalled = ctx.breakCalled = false;
+ ctx.pop();
+ }
+ *children() {
+ const templates = this.templates.slice();
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+ *arguments() {
+ yield this.collection;
+ for (const v of Object.values(this.hash.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ }
+ blockScope() {
+ return [this.variable, 'forloop'];
+ }
+}
+function reversed(arr) {
+ return [...arr].reverse();
+}
+function offset(arr, count) {
+ return arr.slice(count);
+}
+function limit(arr, count) {
+ return arr.slice(0, count);
+} + +class CaptureTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.templates = [];
+ this.identifier = this.readVariable();
+ this.variable = this.identifier.content;
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endcapture')
+ return;
+ this.templates.push(parser.parseToken(token, remainTokens));
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ readVariable() {
+ let ident = this.tokenizer.readIdentifier();
+ if (ident.content)
+ return ident;
+ ident = this.tokenizer.readQuoted();
+ if (ident)
+ return ident;
+ throw this.tokenizer.error('invalid capture name');
+ }
+ *render(ctx) {
+ const r = this.liquid.renderer;
+ const html = yield r.renderTemplates(this.templates, ctx);
+ ctx.bottom()[this.variable] = html;
+ }
+ *children() {
+ return this.templates;
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class CaseTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ this.elseTemplates = [];
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ this.elseTemplates = [];
+ let p = [];
+ let elseCount = 0;
+ const stream = parser.parseStream(remainTokens)
+ .on('tag:when', (token) => {
+ if (elseCount > 0) {
+ return;
+ }
+ p = [];
+ const values = [];
+ while (!token.tokenizer.end()) {
+ values.push(token.tokenizer.readValueOrThrow());
+ token.tokenizer.skipBlank();
+ if (token.tokenizer.peek() === ',') {
+ token.tokenizer.readTo(',');
+ }
+ else {
+ token.tokenizer.readTo('or');
+ }
+ }
+ this.branches.push({
+ values,
+ templates: p
+ });
+ })
+ .on('tag:else', () => {
+ elseCount++;
+ p = this.elseTemplates;
+ })
+ .on('tag:endcase', () => stream.stop())
+ .on('template', (tpl) => {
+ if (p !== this.elseTemplates || elseCount === 1) {
+ p.push(tpl);
+ }
+ })
+ .on('end', () => {
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf));
+ let branchHit = false;
+ for (const branch of this.branches) {
+ for (const valueToken of branch.values) {
+ const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf);
+ if (equals(target, value)) {
+ yield r.renderTemplates(branch.templates, ctx, emitter);
+ branchHit = true;
+ break;
+ }
+ }
+ }
+ if (!branchHit) {
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ }
+ }
+ *arguments() {
+ yield this.value;
+ yield* this.branches.flatMap(b => b.values);
+ }
+ *children() {
+ const templates = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+} + +class CommentTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endcomment')
+ return;
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ render() { }
+} + +class RenderTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const tokenizer = this.tokenizer;
+ this.file = parseFilePath(tokenizer, this.liquid, parser);
+ this.currentFile = token.file;
+ while (!tokenizer.end()) {
+ tokenizer.skipBlank();
+ const begin = tokenizer.p;
+ const keyword = tokenizer.readIdentifier();
+ if (keyword.content === 'with' || keyword.content === 'for') {
+ tokenizer.skipBlank();
+ // can be normal key/value pair, like "with: true"
+ if (tokenizer.peek() !== ':') {
+ const value = tokenizer.readValue();
+ // can be normal key, like "with,"
+ if (value) {
+ const beforeAs = tokenizer.p;
+ const asStr = tokenizer.readIdentifier();
+ let alias;
+ if (asStr.content === 'as')
+ alias = tokenizer.readIdentifier();
+ else
+ tokenizer.p = beforeAs;
+ this[keyword.content] = { value, alias: alias && alias.content };
+ tokenizer.skipBlank();
+ if (tokenizer.peek() === ',')
+ tokenizer.advance();
+ continue; // matched!
+ }
+ }
+ }
+ /**
+ * restore cursor if with/for not matched
+ */
+ tokenizer.p = begin;
+ break;
+ }
+ this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator);
+ }
+ *render(ctx, emitter) {
+ const { liquid, hash } = this;
+ const filepath = (yield renderFilePath(this['file'], ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const childCtx = ctx.spawn();
+ const scope = childCtx.bottom();
+ __assign(scope, yield hash.render(ctx));
+ if (this['with']) {
+ const { value, alias } = this['with'];
+ scope[alias || filepath] = yield evalToken(value, ctx);
+ }
+ if (this['for']) {
+ const { value, alias } = this['for'];
+ const collection = toEnumerable(yield evalToken(value, ctx));
+ scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias);
+ for (const item of collection) {
+ scope[alias] = item;
+ const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile']));
+ yield liquid.renderer.renderTemplates(templates, childCtx, emitter);
+ scope['forloop'].next();
+ }
+ }
+ else {
+ const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile']));
+ yield liquid.renderer.renderTemplates(templates, childCtx, emitter);
+ }
+ }
+ *children(partials, sync) {
+ if (partials && isString(this['file'])) {
+ return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile']));
+ }
+ return [];
+ }
+ partialScope() {
+ if (isString(this['file'])) {
+ const names = Object.keys(this.hash.hash);
+ if (this['with']) {
+ const { value, alias } = this['with'];
+ if (isString(alias)) {
+ names.push([alias, value]);
+ }
+ else if (isString(this.file)) {
+ names.push([this.file, value]);
+ }
+ }
+ if (this['for']) {
+ const { value, alias } = this['for'];
+ if (isString(alias)) {
+ names.push([alias, value]);
+ }
+ else if (isString(this.file)) {
+ names.push([this.file, value]);
+ }
+ }
+ return { name: this['file'], isolated: true, scope: names };
+ }
+ }
+ *arguments() {
+ for (const v of Object.values(this.hash.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ if (this['with']) {
+ const { value } = this['with'];
+ if (isValueToken(value)) {
+ yield value;
+ }
+ }
+ if (this['for']) {
+ const { value } = this['for'];
+ if (isValueToken(value)) {
+ yield value;
+ }
+ }
+ }
+}
+/**
+ * @return null for "none",
+ * @return Template[] for quoted with tags and/or filters
+ * @return Token for expression (not quoted)
+ * @throws TypeError if cannot read next token
+ */
+function parseFilePath(tokenizer, liquid, parser) {
+ if (liquid.options.dynamicPartials) {
+ const file = tokenizer.readValue();
+ tokenizer.assert(file, 'illegal file path');
+ if (file.getText() === 'none')
+ return;
+ if (isQuotedToken(file)) {
+ // for filenames like "files/{{file}}", eval as liquid template
+ const templates = parser.parse(evalQuotedToken(file));
+ return optimize(templates);
+ }
+ return file;
+ }
+ const tokens = [...tokenizer.readFileNameTemplate(liquid.options)];
+ const templates = optimize(parser.parseTokens(tokens));
+ return templates === 'none' ? undefined : templates;
+}
+function optimize(templates) {
+ // for filenames like "files/file.liquid", extract the string directly
+ if (templates.length === 1 && isHTMLToken(templates[0].token))
+ return templates[0].token.getContent();
+ return templates;
+}
+function* renderFilePath(file, ctx, liquid) {
+ if (typeof file === 'string')
+ return file;
+ if (Array.isArray(file))
+ return liquid.renderer.renderTemplates(file, ctx);
+ return yield evalToken(file, ctx);
+} + +class IncludeTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const { tokenizer } = token;
+ this['file'] = parseFilePath(tokenizer, this.liquid, parser);
+ this['currentFile'] = token.file;
+ const begin = tokenizer.p;
+ const withStr = tokenizer.readIdentifier();
+ if (withStr.content === 'with') {
+ tokenizer.skipBlank();
+ if (tokenizer.peek() !== ':') {
+ this.withVar = tokenizer.readValue();
+ }
+ else
+ tokenizer.p = begin;
+ }
+ else
+ tokenizer.p = begin;
+ this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator);
+ }
+ *render(ctx, emitter) {
+ const { liquid, hash, withVar } = this;
+ const { renderer } = liquid;
+ const filepath = (yield renderFilePath(this['file'], ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const saved = ctx.saveRegister('blocks', 'blockMode');
+ ctx.setRegister('blocks', {});
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ const scope = (yield hash.render(ctx));
+ if (withVar)
+ scope[filepath] = yield evalToken(withVar, ctx);
+ const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile']));
+ ctx.push(ctx.opts.jekyllInclude ? { include: scope } : scope);
+ yield renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ ctx.restoreRegister(saved);
+ }
+ *children(partials, sync) {
+ if (partials && isString(this['file'])) {
+ return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile']));
+ }
+ return [];
+ }
+ partialScope() {
+ if (isString(this['file'])) {
+ let names;
+ if (this.liquid.options.jekyllInclude) {
+ names = ['include'];
+ }
+ else {
+ names = Object.keys(this.hash.hash);
+ if (this.withVar) {
+ names.push([this['file'], this.withVar]);
+ }
+ }
+ return { name: this['file'], isolated: false, scope: names };
+ }
+ }
+ *arguments() {
+ yield* Object.values(this.hash.hash).filter(isValueToken);
+ if (isValueToken(this['file'])) {
+ yield this['file'];
+ }
+ if (isValueToken(this.withVar)) {
+ yield this.withVar;
+ }
+ }
+} + +class DecrementTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.variable = this.identifier.content;
+ }
+ render(context, emitter) {
+ const scope = context.environments;
+ if (!isNumber(scope[this.variable])) {
+ scope[this.variable] = 0;
+ }
+ emitter.write(stringify(--scope[this.variable]));
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class CycleTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.candidates = [];
+ const group = this.tokenizer.readValue();
+ this.tokenizer.skipBlank();
+ if (group) {
+ if (this.tokenizer.peek() === ':') {
+ this.group = group;
+ this.tokenizer.advance();
+ }
+ else
+ this.candidates.push(group);
+ }
+ while (!this.tokenizer.end()) {
+ const value = this.tokenizer.readValue();
+ if (value)
+ this.candidates.push(value);
+ this.tokenizer.readTo(',');
+ }
+ this.tokenizer.assert(this.candidates.length, () => `empty candidates: "${token.getText()}"`);
+ }
+ *render(ctx, emitter) {
+ const group = (yield evalToken(this.group, ctx));
+ const fingerprint = `cycle:${group}:` + this.candidates.join(',');
+ const groups = ctx.getRegister('cycle');
+ let idx = groups[fingerprint];
+ if (idx === undefined) {
+ idx = groups[fingerprint] = 0;
+ }
+ const candidate = this.candidates[idx];
+ idx = (idx + 1) % this.candidates.length;
+ groups[fingerprint] = idx;
+ return yield evalToken(candidate, ctx);
+ }
+ *arguments() {
+ yield* this.candidates;
+ if (this.group) {
+ yield this.group;
+ }
+ }
+} + +class IfTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ let p = [];
+ parser.parseStream(remainTokens)
+ .on('start', () => this.branches.push({
+ value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),
+ templates: (p = [])
+ }))
+ .on('tag:elsif', (token) => {
+ assert(!this.elseTemplates, 'unexpected elsif after else');
+ this.branches.push({
+ value: new Value(token.tokenizer.readFilteredValue(), this.liquid),
+ templates: (p = [])
+ });
+ })
+ .on('tag:else', tag => {
+ assertEmpty(tag.args);
+ assert(!this.elseTemplates, 'duplicated else');
+ p = this.elseTemplates = [];
+ })
+ .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); })
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); })
+ .start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ for (const { value, templates } of this.branches) {
+ const v = yield value.value(ctx, ctx.opts.lenientIf);
+ if (isTruthy(v, ctx)) {
+ yield r.renderTemplates(templates, ctx, emitter);
+ return;
+ }
+ }
+ yield r.renderTemplates(this.elseTemplates || [], ctx, emitter);
+ }
+ *children() {
+ const templates = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+ arguments() {
+ return this.branches.map(b => b.value);
+ }
+} + +class IncrementTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.variable = this.identifier.content;
+ }
+ render(context, emitter) {
+ const scope = context.environments;
+ if (!isNumber(scope[this.variable])) {
+ scope[this.variable] = 0;
+ }
+ const val = scope[this.variable];
+ scope[this.variable]++;
+ emitter.write(stringify(val));
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class LayoutTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ this.file = parseFilePath(this.tokenizer, this.liquid, parser);
+ this['currentFile'] = token.file;
+ this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = parser.parseTokens(remainTokens);
+ }
+ *render(ctx, emitter) {
+ const { liquid, args, file } = this;
+ const { renderer } = liquid;
+ if (file === undefined) {
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ yield renderer.renderTemplates(this.templates, ctx, emitter);
+ return;
+ }
+ const filepath = (yield renderFilePath(this.file, ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile']));
+ // render remaining contents and store rendered results
+ ctx.setRegister('blockMode', BlockMode.STORE);
+ const html = yield renderer.renderTemplates(this.templates, ctx);
+ const blocks = ctx.getRegister('blocks');
+ // set whole content to anonymous block if anonymous doesn't specified
+ if (blocks[''] === undefined)
+ blocks[''] = (parent, emitter) => emitter.write(html);
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ // render the layout file use stored blocks
+ ctx.push((yield args.render(ctx)));
+ yield renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ }
+ *children(partials) {
+ const templates = this.templates.slice();
+ if (partials && isString(this.file)) {
+ templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile'])));
+ }
+ return templates;
+ }
+ *arguments() {
+ for (const v of Object.values(this.args.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ if (isValueToken(this.file)) {
+ yield this.file;
+ }
+ }
+ partialScope() {
+ if (isString(this.file)) {
+ return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) };
+ }
+ }
+} + +class BlockTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ this.templates = [];
+ const match = /\w+/.exec(token.args);
+ this.block = match ? match[0] : '';
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endblock')
+ return;
+ const template = parser.parseToken(token, remainTokens);
+ this.templates.push(template);
+ }
+ throw new Error(`tag ${token.getText()} not closed`);
+ }
+ *render(ctx, emitter) {
+ const blockRender = this.getBlockRender(ctx);
+ if (ctx.getRegister('blockMode') === BlockMode.STORE) {
+ ctx.getRegister('blocks')[this.block] = blockRender;
+ }
+ else {
+ yield blockRender(new BlockDrop(), emitter);
+ }
+ }
+ getBlockRender(ctx) {
+ const { liquid, templates } = this;
+ const renderChild = ctx.getRegister('blocks')[this.block];
+ const renderCurrent = function* (superBlock, emitter) {
+ // add {{ block.super }} support when rendering
+ ctx.push({ block: superBlock });
+ yield liquid.renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ };
+ return renderChild
+ ? (superBlock, emitter) => renderChild(new BlockDrop((emitter) => renderCurrent(superBlock, emitter)), emitter)
+ : renderCurrent;
+ }
+ *children() {
+ return this.templates;
+ }
+ blockScope() {
+ return ['block'];
+ }
+} + +class RawTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ this.tokens = [];
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endraw')
+ return;
+ this.tokens.push(token);
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ render() {
+ return this.tokens.map((token) => token.getText()).join('');
+ }
+} + +class TablerowloopDrop extends ForloopDrop {
+ constructor(length, cols, collection, variable) {
+ super(length, collection, variable);
+ this.length = length;
+ this.cols = cols;
+ }
+ row() {
+ return Math.floor(this.i / this.cols) + 1;
+ }
+ col0() {
+ return (this.i % this.cols);
+ }
+ col() {
+ return this.col0() + 1;
+ }
+ col_first() {
+ return this.col0() === 0;
+ }
+ col_last() {
+ return this.col() === this.cols;
+ }
+} + +class TablerowTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ const variable = this.tokenizer.readIdentifier();
+ this.tokenizer.skipBlank();
+ const predicate = this.tokenizer.readIdentifier();
+ const collectionToken = this.tokenizer.readValue();
+ if (predicate.content !== 'in' || !collectionToken) {
+ throw new Error(`illegal tag: ${tagToken.getText()}`);
+ }
+ this.variable = variable.content;
+ this.collection = collectionToken;
+ this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = [];
+ let p;
+ const stream = parser.parseStream(remainTokens)
+ .on('start', () => (p = this.templates))
+ .on('tag:endtablerow', () => stream.stop())
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => {
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ let collection = toEnumerable(yield evalToken(this.collection, ctx));
+ const args = (yield this.args.render(ctx));
+ const offset = args.offset || 0;
+ const limit = (args.limit === undefined) ? collection.length : args.limit;
+ collection = collection.slice(offset, offset + limit);
+ const cols = args.cols || collection.length;
+ const r = this.liquid.renderer;
+ const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable);
+ const scope = { tablerowloop };
+ ctx.push(scope);
+ for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) {
+ scope[this.variable] = collection[idx];
+ if (tablerowloop.col0() === 0) {
+ if (tablerowloop.row() !== 1)
+ emitter.write('</tr>');
+ emitter.write(`<tr class="row${tablerowloop.row()}">`);
+ }
+ emitter.write(`<td class="col${tablerowloop.col()}">`);
+ yield r.renderTemplates(this.templates, ctx, emitter);
+ emitter.write('</td>');
+ }
+ if (collection.length)
+ emitter.write('</tr>');
+ ctx.pop();
+ }
+ *children() {
+ return this.templates;
+ }
+ *arguments() {
+ yield this.collection;
+ for (const v of Object.values(this.args.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ }
+ blockScope() {
+ return [this.variable, 'tablerowloop'];
+ }
+} + +class UnlessTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ this.elseTemplates = [];
+ let p = [];
+ let elseCount = 0;
+ parser.parseStream(remainTokens)
+ .on('start', () => this.branches.push({
+ value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),
+ test: isFalsy,
+ templates: (p = [])
+ }))
+ .on('tag:elsif', (token) => {
+ if (elseCount > 0) {
+ p = [];
+ return;
+ }
+ this.branches.push({
+ value: new Value(token.tokenizer.readFilteredValue(), this.liquid),
+ test: isTruthy,
+ templates: (p = [])
+ });
+ })
+ .on('tag:else', () => {
+ elseCount++;
+ p = this.elseTemplates;
+ })
+ .on('tag:endunless', function () { this.stop(); })
+ .on('template', (tpl) => {
+ if (p !== this.elseTemplates || elseCount === 1) {
+ p.push(tpl);
+ }
+ })
+ .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); })
+ .start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ for (const { value, test, templates } of this.branches) {
+ const v = yield value.value(ctx, ctx.opts.lenientIf);
+ if (test(v, ctx)) {
+ yield r.renderTemplates(templates, ctx, emitter);
+ return;
+ }
+ }
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ }
+ *children() {
+ const children = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ children.push(...this.elseTemplates);
+ }
+ return children;
+ }
+ arguments() {
+ return this.branches.map(b => b.value);
+ }
+} + +class BreakTag extends Tag {
+ render(ctx, _emitter) {
+ ctx.breakCalled = true;
+ }
+} + +class ContinueTag extends Tag {
+ render(ctx, _emitter) {
+ ctx.continueCalled = true;
+ }
+} + +class EchoTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.tokenizer.skipBlank();
+ if (!this.tokenizer.end()) {
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ }
+ }
+ *render(ctx, emitter) {
+ if (!this.value)
+ return;
+ const val = yield this.value.value(ctx, false);
+ emitter.write(val);
+ }
+ *arguments() {
+ if (this.value) {
+ yield this.value;
+ }
+ }
+} + +class LiquidTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options);
+ this.templates = parser.parseTokens(tokens);
+ }
+ *render(ctx, emitter) {
+ yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter);
+ }
+ *children() {
+ return this.templates;
+ }
+} + +class InlineCommentTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ if (tagToken.args.search(/\n\s*[^#\s]/g) !== -1) {
+ throw new Error('every line of an inline comment must start with a \'#\' character');
+ }
+ }
+ render() { }
+} + +const tags = {
+ assign: AssignTag,
+ 'for': ForTag,
+ capture: CaptureTag,
+ 'case': CaseTag,
+ comment: CommentTag,
+ include: IncludeTag,
+ render: RenderTag,
+ decrement: DecrementTag,
+ increment: IncrementTag,
+ cycle: CycleTag,
+ 'if': IfTag,
+ layout: LayoutTag,
+ block: BlockTag,
+ raw: RawTag,
+ tablerow: TablerowTag,
+ unless: UnlessTag,
+ 'break': BreakTag,
+ 'continue': ContinueTag,
+ echo: EchoTag,
+ liquid: LiquidTag,
+ '#': InlineCommentTag
+}; + +class Liquid {
+ constructor(opts = {}) {
+ this.renderer = new Render();
+ this.filters = {};
+ this.tags = {};
+ this.options = normalize(opts);
+ // eslint-disable-next-line deprecation/deprecation
+ this.parser = new Parser(this);
+ forOwn(tags, (conf, name) => this.registerTag(name, conf));
+ forOwn(filters, (handler, name) => this.registerFilter(name, handler));
+ }
+ parse(html, filepath) {
+ const parser = new Parser(this);
+ return parser.parse(html, filepath);
+ }
+ _render(tpl, scope, renderOptions) {
+ const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions);
+ return this.renderer.renderTemplates(tpl, ctx);
+ }
+ render(tpl, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(this._render(tpl, scope, Object.assign(Object.assign({}, renderOptions), { sync: false })));
+ });
+ }
+ renderSync(tpl, scope, renderOptions) {
+ return toValueSync(this._render(tpl, scope, Object.assign(Object.assign({}, renderOptions), { sync: true })));
+ }
+ renderToNodeStream(tpl, scope, renderOptions = {}) {
+ const ctx = new Context(scope, this.options, renderOptions);
+ return this.renderer.renderTemplatesToNodeStream(tpl, ctx);
+ }
+ _parseAndRender(html, scope, renderOptions) {
+ const tpl = this.parse(html);
+ return this._render(tpl, scope, renderOptions);
+ }
+ parseAndRender(html, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(this._parseAndRender(html, scope, Object.assign(Object.assign({}, renderOptions), { sync: false })));
+ });
+ }
+ parseAndRenderSync(html, scope, renderOptions) {
+ return toValueSync(this._parseAndRender(html, scope, Object.assign(Object.assign({}, renderOptions), { sync: true })));
+ }
+ _parsePartialFile(file, sync, currentFile) {
+ return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile);
+ }
+ _parseLayoutFile(file, sync, currentFile) {
+ return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile);
+ }
+ _parseFile(file, sync, lookupType, currentFile) {
+ return new Parser(this).parseFile(file, sync, lookupType, currentFile);
+ }
+ parseFile(file, lookupType) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(new Parser(this).parseFile(file, false, lookupType));
+ });
+ }
+ parseFileSync(file, lookupType) {
+ return toValueSync(new Parser(this).parseFile(file, true, lookupType));
+ }
+ *_renderFile(file, ctx, renderFileOptions) {
+ const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType));
+ return yield this._render(templates, ctx, renderFileOptions);
+ }
+ renderFile(file, ctx, renderFileOptions) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(this._renderFile(file, ctx, Object.assign(Object.assign({}, renderFileOptions), { sync: false })));
+ });
+ }
+ renderFileSync(file, ctx, renderFileOptions) {
+ return toValueSync(this._renderFile(file, ctx, Object.assign(Object.assign({}, renderFileOptions), { sync: true })));
+ }
+ renderFileToNodeStream(file, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const templates = yield this.parseFile(file);
+ return this.renderToNodeStream(templates, scope, renderOptions);
+ });
+ }
+ _evalValue(str, scope) {
+ const value = new Value(str, this);
+ const ctx = scope instanceof Context ? scope : new Context(scope, this.options);
+ return value.value(ctx);
+ }
+ evalValue(str, scope) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(this._evalValue(str, scope));
+ });
+ }
+ evalValueSync(str, scope) {
+ return toValueSync(this._evalValue(str, scope));
+ }
+ registerFilter(name, filter) {
+ this.filters[name] = filter;
+ }
+ registerTag(name, tag) {
+ this.tags[name] = isFunction(tag) ? tag : createTagClass(tag);
+ }
+ plugin(plugin) {
+ return plugin.call(this, Liquid);
+ }
+ express() {
+ const self = this; // eslint-disable-line
+ let firstCall = true;
+ return function (filePath, ctx, callback) {
+ if (firstCall) {
+ firstCall = false;
+ const dirs = normalizeDirectoryList(this.root);
+ self.options.root.unshift(...dirs);
+ self.options.layouts.unshift(...dirs);
+ self.options.partials.unshift(...dirs);
+ }
+ self.renderFile(filePath, ctx).then(html => callback(null, html), callback);
+ };
+ }
+ analyze(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return analyze(template, options);
+ });
+ }
+ analyzeSync(template, options = {}) {
+ return analyzeSync(template, options);
+ }
+ parseAndAnalyze(html, filename, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return analyze(this.parse(html, filename), options);
+ });
+ }
+ parseAndAnalyzeSync(html, filename, options = {}) {
+ return analyzeSync(this.parse(html, filename), options);
+ }
+ /** Return an array of all variables without their properties. */
+ variables(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.variables);
+ });
+ }
+ /** Return an array of all variables without their properties. */
+ variablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.variables);
+ }
+ /** Return an array of all variables including their properties/paths. */
+ fullVariables(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))));
+ });
+ }
+ /** Return an array of all variables including their properties/paths. */
+ fullVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))));
+ }
+ /** Return an array of all variables, each as an array of properties/segments. */
+ variableSegments(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))));
+ });
+ }
+ /** Return an array of all variables, each as an array of properties/segments. */
+ variableSegmentsSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))));
+ }
+ /** Return an array of all expected context variables without their properties. */
+ globalVariables(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.globals);
+ });
+ }
+ /** Return an array of all expected context variables without their properties. */
+ globalVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.globals);
+ }
+ /** Return an array of all expected context variables including their properties/paths. */
+ globalFullVariables(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))));
+ });
+ }
+ /** Return an array of all expected context variables including their properties/paths. */
+ globalFullVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))));
+ }
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ globalVariableSegments(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))));
+ });
+ }
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ globalVariableSegmentsSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))));
+ }
+} + +/* istanbul ignore file */
+const version = '[VI]{version}[/VI]'; + +export { AssertionError, AssignTag, BlockTag, BreakTag, CaptureTag, CaseTag, CommentTag, Context, ContinueTag, CycleTag, DecrementTag, Drop, EchoTag, Expression, Filter, ForTag, Hash, IfTag, IncludeTag, IncrementTag, InlineCommentTag, LayoutTag, Liquid, LiquidError, LiquidTag, Output, ParseError, ParseStream, Parser, RawTag, RenderError, RenderTag, TablerowTag, Tag, TagToken, Token, TokenKind, TokenizationError, Tokenizer, typeGuards as TypeGuards, UndefinedVariableError, UnlessTag, Value, Variable, analyze, analyzeSync, assert, createTrie, defaultOperators, defaultOptions, evalQuotedToken, evalToken, filters, isFalsy, isTruthy, tags, toPromise, toValue, toValueSync, version }; diff --git a/node_modules/liquidjs/dist/liquid.browser.umd.js b/node_modules/liquidjs/dist/liquid.browser.umd.js new file mode 100644 index 0000000..cdf40d9 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.umd.js @@ -0,0 +1,7265 @@ +/* + * liquidjs@10.23.0, https://github.com/harttle/liquidjs + * (c) 2016-2025 harttle + * Released under the MIT License. + */ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.liquidjs = {})); +}(this, (function (exports) { 'use strict'; + + /******************************************************************************
+ Copyright (c) Microsoft Corporation.
+
+ Permission to use, copy, modify, and/or distribute this software for any
+ purpose with or without fee is hereby granted.
+
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ PERFORMANCE OF THIS SOFTWARE.
+ ***************************************************************************** */
+ /* 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 (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
+ return extendStatics(d, b);
+ };
+
+ function __extends(d, b) {
+ if (typeof b !== "function" && b !== null)
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+ 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) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ 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) : adopt(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 (g && (g = 0, op[0] && (_ = 0)), _) 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 };
+ }
+ }
+
+ function __values(o) {
+ var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+ if (m) return m.call(o);
+ if (o && typeof o.length === "number") return {
+ next: function () {
+ if (o && i >= o.length) o = void 0;
+ return { value: o && o[i++], done: !o };
+ }
+ };
+ throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+ }
+
+ function __read(o, n) {
+ var m = typeof Symbol === "function" && o[Symbol.iterator];
+ if (!m) return o;
+ var i = m.call(o), r, ar = [], e;
+ try {
+ while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+ }
+ catch (error) { e = { error: error }; }
+ finally {
+ try {
+ if (r && !r.done && (m = i["return"])) m.call(i);
+ }
+ finally { if (e) throw e.error; }
+ }
+ return ar;
+ }
+
+ function __spreadArray(to, from, pack) {
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
+ if (ar || !(i in from)) {
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
+ ar[i] = from[i];
+ }
+ }
+ return to.concat(ar || Array.prototype.slice.call(from));
+ } + + var Token = /** @class */ (function () {
+ function Token(kind, input, begin, end, file) {
+ this.kind = kind;
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ }
+ Token.prototype.getText = function () {
+ return this.input.slice(this.begin, this.end);
+ };
+ Token.prototype.getPosition = function () {
+ var _a = __read([1, 1], 2), row = _a[0], col = _a[1];
+ for (var i = 0; i < this.begin; i++) {
+ if (this.input[i] === '\n') {
+ row++;
+ col = 1;
+ }
+ else
+ col++;
+ }
+ return [row, col];
+ };
+ Token.prototype.size = function () {
+ return this.end - this.begin;
+ };
+ return Token;
+ }()); + + var Drop = /** @class */ (function () {
+ function Drop() {
+ }
+ Drop.prototype.liquidMethodMissing = function (key, context) {
+ return undefined;
+ };
+ return Drop;
+ }()); + + var toString$1 = Object.prototype.toString;
+ var toLowerCase = String.prototype.toLowerCase;
+ var hasOwnProperty = Object.hasOwnProperty;
+ function isString(value) {
+ return typeof value === 'string';
+ }
+ // eslint-disable-next-line @typescript-eslint/ban-types
+ function isFunction(value) {
+ return typeof value === 'function';
+ }
+ function isPromise(val) {
+ return val && isFunction(val.then);
+ }
+ function isIterator(val) {
+ return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return);
+ }
+ function escapeRegex(str) {
+ return str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
+ }
+ function stringify(value) {
+ value = toValue(value);
+ if (isString(value))
+ return value;
+ if (isNil(value))
+ return '';
+ if (isArray(value))
+ return value.map(function (x) { return stringify(x); }).join('');
+ return String(value);
+ }
+ function toEnumerable(val) {
+ val = toValue(val);
+ if (isArray(val))
+ return val;
+ if (isString(val) && val.length > 0)
+ return [val];
+ if (isIterable(val))
+ return Array.from(val);
+ if (isObject(val))
+ return Object.keys(val).map(function (key) { return [key, val[key]]; });
+ return [];
+ }
+ function toArray(val) {
+ val = toValue(val);
+ if (isNil(val))
+ return [];
+ if (isArray(val))
+ return val;
+ return [val];
+ }
+ function toValue(value) {
+ return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value;
+ }
+ function toNumber(value) {
+ return +toValue(value) || 0;
+ }
+ function isNumber(value) {
+ return typeof value === 'number';
+ }
+ function toLiquid(value) {
+ if (value && isFunction(value.toLiquid))
+ return toLiquid(value.toLiquid());
+ return value;
+ }
+ function isNil(value) {
+ return value == null;
+ }
+ function isUndefined(value) {
+ return value === undefined;
+ }
+ function isArray(value) {
+ // be compatible with IE 8
+ return toString$1.call(value) === '[object Array]';
+ }
+ function isArrayLike(value) {
+ return value && isNumber(value.length);
+ }
+ function isIterable(value) {
+ return isObject(value) && Symbol.iterator in value;
+ }
+ /*
+ * 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(obj, iteratee) {
+ obj = obj || {};
+ for (var k in obj) {
+ if (hasOwnProperty.call(obj, k)) {
+ if (iteratee(obj[k], k, obj) === false)
+ break;
+ }
+ }
+ return obj;
+ }
+ 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');
+ }
+ function range(start, stop, step) {
+ if (step === void 0) { 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 = ' '; }
+ return pad(str, length, ch, function (str, ch) { return ch + str; });
+ }
+ function padEnd(str, length, ch) {
+ if (ch === void 0) { ch = ' '; }
+ return pad(str, length, ch, function (str, ch) { return str + ch; });
+ }
+ function pad(str, length, ch, add) {
+ str = String(str);
+ var n = length - str.length;
+ while (n-- > 0)
+ str = add(str, ch);
+ return str;
+ }
+ function identify(val) {
+ return val;
+ }
+ function changeCase(str) {
+ var hasLowerCase = __spreadArray([], __read(str), false).some(function (ch) { return ch >= 'a' && ch <= 'z'; });
+ return hasLowerCase ? str.toUpperCase() : str.toLowerCase();
+ }
+ function ellipsis(str, N) {
+ return str.length > N ? str.slice(0, N - 3) + '...' : str;
+ }
+ // compare string in case-insensitive way, undefined values to the tail
+ function caseInsensitiveCompare(a, b) {
+ if (a == null && b == null)
+ return 0;
+ if (a == null)
+ return 1;
+ if (b == null)
+ return -1;
+ a = toLowerCase.call(a);
+ b = toLowerCase.call(b);
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+ }
+ function argumentsToValue(fn) {
+ return function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i] = arguments[_i];
+ }
+ return fn.call.apply(fn, __spreadArray([this], __read(args.map(toValue)), false));
+ };
+ }
+ function argumentsToNumber(fn) {
+ return function () {
+ var args = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ args[_i] = arguments[_i];
+ }
+ return fn.call.apply(fn, __spreadArray([this], __read(args.map(toNumber)), false));
+ };
+ }
+ function escapeRegExp(text) {
+ return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
+ }
+ /** Return an array containing unique elements from _array_. Works with nested arrays and objects. */
+ function strictUniq(array) {
+ var seen, array_1, array_1_1, element, key, e_1_1;
+ var e_1, _a;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ seen = new Set();
+ _b.label = 1;
+ case 1:
+ _b.trys.push([1, 6, 7, 8]);
+ array_1 = __values(array), array_1_1 = array_1.next();
+ _b.label = 2;
+ case 2:
+ if (!!array_1_1.done) return [3 /*break*/, 5];
+ element = array_1_1.value;
+ key = JSON.stringify(element);
+ if (!!seen.has(key)) return [3 /*break*/, 4];
+ seen.add(key);
+ return [4 /*yield*/, element];
+ case 3:
+ _b.sent();
+ _b.label = 4;
+ case 4:
+ array_1_1 = array_1.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_1_1 = _b.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (array_1_1 && !array_1_1.done && (_a = array_1.return)) _a.call(array_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 8: return [2 /*return*/];
+ }
+ });
+ } + + /**
+ * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes
+ */
+ var TRAIT = '__liquidClass__';
+ var LiquidError = /** @class */ (function (_super) {
+ __extends(LiquidError, _super);
+ function LiquidError(err, token) {
+ var _this =
+ /**
+ * note: for ES5 targeting, `this` will be replaced by return value of Error(),
+ * thus everything on `this` will be lost, avoid calling `LiquidError` methods here
+ */
+ _super.call(this, typeof err === 'string' ? err : err.message) || this;
+ _this.context = '';
+ if (typeof err !== 'string')
+ Object.defineProperty(_this, 'originalError', { value: err, enumerable: false });
+ Object.defineProperty(_this, 'token', { value: token, enumerable: false });
+ Object.defineProperty(_this, TRAIT, { value: 'LiquidError', enumerable: false });
+ return _this;
+ }
+ LiquidError.prototype.update = function () {
+ Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false });
+ this.message = mkMessage(this.message, this.token);
+ this.stack = this.message + '\n' + this.context +
+ '\n' + this.stack;
+ if (this.originalError)
+ this.stack += '\nFrom ' + this.originalError.stack;
+ };
+ LiquidError.is = function (obj) {
+ return (obj === null || obj === void 0 ? void 0 : obj[TRAIT]) === 'LiquidError';
+ };
+ return LiquidError;
+ }(Error));
+ var TokenizationError = /** @class */ (function (_super) {
+ __extends(TokenizationError, _super);
+ function TokenizationError(message, token) {
+ var _this = _super.call(this, 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;
+ }
+ RenderError.is = function (obj) {
+ return obj.name === 'RenderError';
+ };
+ return RenderError;
+ }(LiquidError));
+ var LiquidErrors = /** @class */ (function (_super) {
+ __extends(LiquidErrors, _super);
+ function LiquidErrors(errors) {
+ var _this = _super.call(this, errors[0], errors[0].token) || this;
+ _this.errors = errors;
+ _this.name = 'LiquidErrors';
+ var s = errors.length > 1 ? 's' : '';
+ _this.message = "".concat(errors.length, " error").concat(s, " found");
+ _super.prototype.update.call(_this);
+ return _this;
+ }
+ LiquidErrors.is = function (obj) {
+ return obj.name === 'LiquidErrors';
+ };
+ return LiquidErrors;
+ }(LiquidError));
+ var UndefinedVariableError = /** @class */ (function (_super) {
+ __extends(UndefinedVariableError, _super);
+ function UndefinedVariableError(err, token) {
+ var _this = _super.call(this, err, token) || this;
+ _this.name = 'UndefinedVariableError';
+ _this.message = err.message;
+ _super.prototype.update.call(_this);
+ return _this;
+ }
+ return UndefinedVariableError;
+ }(LiquidError));
+ // only used internally; raised where we don't have token information,
+ // so it can't be an UndefinedVariableError.
+ var InternalUndefinedVariableError = /** @class */ (function (_super) {
+ __extends(InternalUndefinedVariableError, _super);
+ function InternalUndefinedVariableError(variableName) {
+ var _this = _super.call(this, "undefined variable: ".concat(variableName)) || this;
+ _this.name = 'InternalUndefinedVariableError';
+ _this.variableName = variableName;
+ return _this;
+ }
+ return InternalUndefinedVariableError;
+ }(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 _a = __read(token.getPosition(), 2), line = _a[0], col = _a[1];
+ var lines = token.input.split('\n');
+ var begin = Math.max(line - 2, 1);
+ var end = Math.min(line + 3, lines.length);
+ var context = range(begin, end + 1)
+ .map(function (lineNumber) {
+ var rowIndicator = (lineNumber === line) ? '>> ' : ' ';
+ var num = padStart(String(lineNumber), String(end).length);
+ var text = "".concat(rowIndicator).concat(num, "| ");
+ var colIndicator = lineNumber === line
+ ? '\n' + padStart('^', col + text.length)
+ : '';
+ text += lines[lineNumber - 1];
+ text += colIndicator;
+ return text;
+ })
+ .join('\n');
+ return context;
+ }
+ function mkMessage(msg, token) {
+ if (token.file)
+ msg += ", file:".concat(token.file);
+ var _a = __read(token.getPosition(), 2), line = _a[0], col = _a[1];
+ msg += ", line:".concat(line, ", col:").concat(col);
+ return msg;
+ } + + // **DO NOT CHANGE THIS FILE**
+ //
+ // This file is generated by bin/character-gen.js
+ // bitmask character types to boost performance
+ var TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
+ var WORD = 1;
+ var BLANK = 4;
+ var QUOTE = 8;
+ var INLINE_BLANK = 16;
+ var NUMBER = 32;
+ var SIGN = 64;
+ var PUNCTUATION = 128;
+ function isWord(char) {
+ var code = char.charCodeAt(0);
+ return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD);
+ }
+ TYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK;
+ TYPES[8220] = TYPES[8221] = PUNCTUATION; + + function assert(predicate, message) {
+ if (!predicate) {
+ var msg = typeof message === 'function'
+ ? message()
+ : (message || "expect ".concat(predicate, " to be true"));
+ throw new AssertionError(msg);
+ }
+ }
+ function assertEmpty(predicate, message) {
+ if (message === void 0) { message = "unexpected ".concat(JSON.stringify(predicate)); }
+ assert(!predicate, message);
+ } + + 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(toValue(value));
+ };
+ 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.valueOf = function () {
+ return null;
+ };
+ return NullDrop;
+ }(Drop)); + + var EmptyDrop = /** @class */ (function (_super) {
+ __extends(EmptyDrop, _super);
+ function EmptyDrop() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ EmptyDrop.prototype.equals = function (value) {
+ if (value instanceof EmptyDrop)
+ return false;
+ value = toValue(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.valueOf = function () {
+ return '';
+ };
+ EmptyDrop.is = function (value) {
+ return value instanceof EmptyDrop;
+ };
+ 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(toValue(value)))
+ return true;
+ if (isString(value))
+ return /^\s*$/.test(value);
+ return _super.prototype.equals.call(this, value);
+ };
+ BlankDrop.is = function (value) {
+ return value instanceof BlankDrop;
+ };
+ return BlankDrop;
+ }(EmptyDrop)); + + var ForloopDrop = /** @class */ (function (_super) {
+ __extends(ForloopDrop, _super);
+ function ForloopDrop(length, collection, variable) {
+ var _this = _super.call(this) || this;
+ _this.i = 0;
+ _this.length = length;
+ _this.name = "".concat(variable, "-").concat(collection);
+ return _this;
+ }
+ ForloopDrop.prototype.next = function () {
+ this.i++;
+ };
+ ForloopDrop.prototype.index0 = function () {
+ return this.i;
+ };
+ ForloopDrop.prototype.index = function () {
+ return this.i + 1;
+ };
+ ForloopDrop.prototype.first = function () {
+ return this.i === 0;
+ };
+ ForloopDrop.prototype.last = function () {
+ return this.i === this.length - 1;
+ };
+ ForloopDrop.prototype.rindex = function () {
+ return this.length - this.i;
+ };
+ ForloopDrop.prototype.rindex0 = function () {
+ return this.length - this.i - 1;
+ };
+ ForloopDrop.prototype.valueOf = function () {
+ return JSON.stringify(this);
+ };
+ return ForloopDrop;
+ }(Drop)); + + var SimpleEmitter = /** @class */ (function () {
+ function SimpleEmitter() {
+ this.buffer = '';
+ }
+ SimpleEmitter.prototype.write = function (html) {
+ this.buffer += stringify(html);
+ };
+ return SimpleEmitter;
+ }()); + + var StreamedEmitter = /** @class */ (function () {
+ function StreamedEmitter() {
+ this.buffer = '';
+ this.stream = null;
+ throw new Error('streaming not supported in browser');
+ }
+ return StreamedEmitter;
+ }()); + + var KeepingTypeEmitter = /** @class */ (function () {
+ function KeepingTypeEmitter() {
+ this.buffer = '';
+ }
+ KeepingTypeEmitter.prototype.write = function (html) {
+ html = toValue(html);
+ // This will only preserve the type if the value is isolated.
+ // I.E:
+ // {{ my-port }} -> 42
+ // {{ my-host }}:{{ my-port }} -> 'host:42'
+ if (typeof html !== 'string' && this.buffer === '') {
+ this.buffer = html;
+ }
+ else {
+ this.buffer = stringify(this.buffer) + stringify(html);
+ }
+ };
+ return KeepingTypeEmitter;
+ }()); + + var BlockDrop = /** @class */ (function (_super) {
+ __extends(BlockDrop, _super);
+ function BlockDrop(
+ // the block render from layout template
+ superBlockRender) {
+ if (superBlockRender === void 0) { superBlockRender = function () { return ''; }; }
+ var _this = _super.call(this) || this;
+ _this.superBlockRender = superBlockRender;
+ return _this;
+ }
+ /**
+ * Provide parent access in child block by
+ * {{ block.super }}
+ */
+ BlockDrop.prototype.super = function () {
+ var emitter;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ emitter = new SimpleEmitter();
+ return [4 /*yield*/, this.superBlockRender(emitter)];
+ case 1:
+ _a.sent();
+ return [2 /*return*/, emitter.buffer];
+ }
+ });
+ };
+ return BlockDrop;
+ }(Drop)); + + function isComparable(arg) {
+ return (arg &&
+ isFunction(arg.equals) &&
+ isFunction(arg.gt) &&
+ isFunction(arg.geq) &&
+ isFunction(arg.lt) &&
+ isFunction(arg.leq));
+ } + + var nil = new NullDrop();
+ var literalValues = {
+ 'true': true,
+ 'false': false,
+ 'nil': nil,
+ 'null': nil,
+ 'empty': new EmptyDrop(),
+ 'blank': new BlankDrop()
+ }; + + function createTrie(input) {
+ var e_1, _a;
+ var trie = {};
+ try {
+ for (var _b = __values(Object.entries(input)), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var _d = __read(_c.value, 2), name_1 = _d[0], data = _d[1];
+ var node = trie;
+ for (var i = 0; i < name_1.length; i++) {
+ var c = name_1[i];
+ node[c] = node[c] || {};
+ if (i === name_1.length - 1 && isWord(name_1[i])) {
+ node[c].needBoundary = true;
+ }
+ node = node[c];
+ }
+ node.data = data;
+ node.end = true;
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ return trie;
+ } + + // convert an async iterator to a Promise
+ function toPromise(val) {
+ return __awaiter(this, void 0, void 0, function () {
+ var value, done, next, state, err_1;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!isIterator(val))
+ return [2 /*return*/, val];
+ done = false;
+ next = 'next';
+ _a.label = 1;
+ case 1:
+ state = val[next](value);
+ done = state.done;
+ value = state.value;
+ next = 'next';
+ _a.label = 2;
+ case 2:
+ _a.trys.push([2, 5, , 6]);
+ if (isIterator(value))
+ value = toPromise(value);
+ if (!isPromise(value)) return [3 /*break*/, 4];
+ return [4 /*yield*/, value];
+ case 3:
+ value = _a.sent();
+ _a.label = 4;
+ case 4: return [3 /*break*/, 6];
+ case 5:
+ err_1 = _a.sent();
+ next = 'throw';
+ value = err_1;
+ return [3 /*break*/, 6];
+ case 6:
+ if (!done) return [3 /*break*/, 1];
+ _a.label = 7;
+ case 7: return [2 /*return*/, value];
+ }
+ });
+ });
+ }
+ // convert an async iterator to a value in a synchronous manner
+ function toValueSync(val) {
+ if (!isIterator(val))
+ return val;
+ var value;
+ var done = false;
+ var next = 'next';
+ do {
+ var state = val[next](value);
+ done = state.done;
+ value = state.value;
+ next = 'next';
+ if (isIterator(value)) {
+ try {
+ value = toValueSync(value);
+ }
+ catch (err) {
+ next = 'throw';
+ value = err;
+ }
+ }
+ } while (!done);
+ return value;
+ } + + var rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/;
+ // prototype extensions
+ function daysInMonth(d) {
+ var feb = isLeapYear(d) ? 29 : 28;
+ return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+ }
+ function getDayOfYear(d) {
+ var num = 0;
+ for (var i = 0; i < d.getMonth(); ++i) {
+ num += daysInMonth(d)[i];
+ }
+ return num + d.getDate();
+ }
+ function getWeekOfYear(d, startDay) {
+ // Skip to startDay of this week
+ var now = 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 String(Math.floor((now - then) / 7) + 1);
+ }
+ function isLeapYear(d) {
+ var year = d.getFullYear();
+ return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)));
+ }
+ function ordinal(d) {
+ var date = d.getDate();
+ if ([11, 12, 13].includes(date))
+ return 'th';
+ switch (date % 10) {
+ case 1: return 'st';
+ case 2: return 'nd';
+ case 3: return 'rd';
+ default: return 'th';
+ }
+ }
+ function century(d) {
+ return parseInt(d.getFullYear().toString().substring(0, 2), 10);
+ }
+ // default to 0
+ var padWidths = {
+ d: 2,
+ e: 2,
+ H: 2,
+ I: 2,
+ j: 3,
+ k: 2,
+ l: 2,
+ L: 3,
+ m: 2,
+ M: 2,
+ S: 2,
+ U: 2,
+ W: 2
+ };
+ var padSpaceChars = new Set('aAbBceklpP');
+ function getTimezoneOffset(d, opts) {
+ var nOffset = Math.abs(d.getTimezoneOffset());
+ var h = Math.floor(nOffset / 60);
+ var m = nOffset % 60;
+ return (d.getTimezoneOffset() > 0 ? '-' : '+') +
+ padStart(h, 2, '0') +
+ (opts.flags[':'] ? ':' : '') +
+ padStart(m, 2, '0');
+ }
+ var formatCodes = {
+ a: function (d) { return d.getShortWeekdayName(); },
+ A: function (d) { return d.getLongWeekdayName(); },
+ b: function (d) { return d.getShortMonthName(); },
+ B: function (d) { return d.getLongMonthName(); },
+ c: function (d) { return d.toLocaleString(); },
+ C: function (d) { return century(d); },
+ d: function (d) { return d.getDate(); },
+ e: function (d) { return d.getDate(); },
+ H: function (d) { return d.getHours(); },
+ I: function (d) { return String(d.getHours() % 12 || 12); },
+ j: function (d) { return getDayOfYear(d); },
+ k: function (d) { return d.getHours(); },
+ l: function (d) { return String(d.getHours() % 12 || 12); },
+ L: function (d) { return d.getMilliseconds(); },
+ m: function (d) { return d.getMonth() + 1; },
+ M: function (d) { return d.getMinutes(); },
+ N: function (d, opts) {
+ var width = Number(opts.width) || 9;
+ var str = String(d.getMilliseconds()).slice(0, width);
+ return padEnd(str, width, '0');
+ },
+ p: function (d) { return (d.getHours() < 12 ? 'AM' : 'PM'); },
+ P: function (d) { return (d.getHours() < 12 ? 'am' : 'pm'); },
+ q: function (d) { return ordinal(d); },
+ s: function (d) { return Math.round(d.getTime() / 1000); },
+ S: function (d) { return d.getSeconds(); },
+ u: function (d) { return d.getDay() || 7; },
+ U: function (d) { return getWeekOfYear(d, 0); },
+ w: function (d) { return d.getDay(); },
+ W: function (d) { return getWeekOfYear(d, 1); },
+ x: function (d) { return d.toLocaleDateString(); },
+ X: function (d) { return d.toLocaleTimeString(); },
+ y: function (d) { return d.getFullYear().toString().slice(2, 4); },
+ Y: function (d) { return d.getFullYear(); },
+ z: getTimezoneOffset,
+ Z: function (d, opts) { return d.getTimeZoneName() || getTimezoneOffset(d, opts); },
+ 't': function () { return '\t'; },
+ 'n': function () { return '\n'; },
+ '%': function () { return '%'; }
+ };
+ formatCodes.h = formatCodes.b;
+ function strftime(d, formatStr) {
+ var output = '';
+ var remaining = formatStr;
+ var match;
+ while ((match = rFormat.exec(remaining))) {
+ output += remaining.slice(0, match.index);
+ remaining = remaining.slice(match.index + match[0].length);
+ output += format(d, match);
+ }
+ return output + remaining;
+ }
+ function format(d, match) {
+ var e_1, _a;
+ var _b = __read(match, 5), input = _b[0], _c = _b[1], flagStr = _c === void 0 ? '' : _c, width = _b[2], modifier = _b[3], conversion = _b[4];
+ var convert = formatCodes[conversion];
+ if (!convert)
+ return input;
+ var flags = {};
+ try {
+ for (var flagStr_1 = __values(flagStr), flagStr_1_1 = flagStr_1.next(); !flagStr_1_1.done; flagStr_1_1 = flagStr_1.next()) {
+ var flag = flagStr_1_1.value;
+ flags[flag] = true;
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (flagStr_1_1 && !flagStr_1_1.done && (_a = flagStr_1.return)) _a.call(flagStr_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ var ret = String(convert(d, { flags: flags, width: width, modifier: modifier }));
+ var padChar = padSpaceChars.has(conversion) ? ' ' : '0';
+ var padWidth = width || padWidths[conversion] || 0;
+ if (flags['^'])
+ ret = ret.toUpperCase();
+ else if (flags['#'])
+ ret = changeCase(ret);
+ if (flags['_'])
+ padChar = ' ';
+ else if (flags['0'])
+ padChar = '0';
+ if (flags['-'])
+ padWidth = 0;
+ return padStart(ret, padWidth, padChar);
+ } + + function getDateTimeFormat() {
+ return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined);
+ } + + // one minute in milliseconds
+ var OneMinute = 60000;
+ /**
+ * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS
+ * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3
+ */
+ var TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/;
+ var monthNames = [
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
+ 'September', 'October', 'November', 'December'
+ ];
+ var monthNamesShort = monthNames.map(function (name) { return name.slice(0, 3); });
+ var dayNames = [
+ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
+ ];
+ var dayNamesShort = dayNames.map(function (name) { return name.slice(0, 3); });
+ /**
+ * A date implementation with timezone info, just like Ruby date
+ *
+ * Implementation:
+ * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods
+ * - rewrite getTimezoneOffset() to trick strftime
+ */
+ var LiquidDate = /** @class */ (function () {
+ function LiquidDate(init, locale, timezone) {
+ this.locale = locale;
+ this.DateTimeFormat = getDateTimeFormat();
+ this.date = new Date(init);
+ this.timezoneFixed = timezone !== undefined;
+ if (timezone === undefined) {
+ timezone = this.date.getTimezoneOffset();
+ }
+ this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone;
+ this.timezoneName = isString(timezone) ? timezone : '';
+ var diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute;
+ var time = this.date.getTime() + diff;
+ this.displayDate = new Date(time);
+ }
+ LiquidDate.prototype.getTime = function () {
+ return this.displayDate.getTime();
+ };
+ LiquidDate.prototype.getMilliseconds = function () {
+ return this.displayDate.getMilliseconds();
+ };
+ LiquidDate.prototype.getSeconds = function () {
+ return this.displayDate.getSeconds();
+ };
+ LiquidDate.prototype.getMinutes = function () {
+ return this.displayDate.getMinutes();
+ };
+ LiquidDate.prototype.getHours = function () {
+ return this.displayDate.getHours();
+ };
+ LiquidDate.prototype.getDay = function () {
+ return this.displayDate.getDay();
+ };
+ LiquidDate.prototype.getDate = function () {
+ return this.displayDate.getDate();
+ };
+ LiquidDate.prototype.getMonth = function () {
+ return this.displayDate.getMonth();
+ };
+ LiquidDate.prototype.getFullYear = function () {
+ return this.displayDate.getFullYear();
+ };
+ LiquidDate.prototype.toLocaleString = function (locale, init) {
+ if (init === null || init === void 0 ? void 0 : init.timeZone) {
+ return this.date.toLocaleString(locale, init);
+ }
+ return this.displayDate.toLocaleString(locale, init);
+ };
+ LiquidDate.prototype.toLocaleTimeString = function (locale) {
+ return this.displayDate.toLocaleTimeString(locale);
+ };
+ LiquidDate.prototype.toLocaleDateString = function (locale) {
+ return this.displayDate.toLocaleDateString(locale);
+ };
+ LiquidDate.prototype.getTimezoneOffset = function () {
+ return this.timezoneOffset;
+ };
+ LiquidDate.prototype.getTimeZoneName = function () {
+ if (this.timezoneFixed)
+ return this.timezoneName;
+ if (!this.DateTimeFormat)
+ return;
+ return this.DateTimeFormat().resolvedOptions().timeZone;
+ };
+ LiquidDate.prototype.getLongMonthName = function () {
+ var _a;
+ return (_a = this.format({ month: 'long' })) !== null && _a !== void 0 ? _a : monthNames[this.getMonth()];
+ };
+ LiquidDate.prototype.getShortMonthName = function () {
+ var _a;
+ return (_a = this.format({ month: 'short' })) !== null && _a !== void 0 ? _a : monthNamesShort[this.getMonth()];
+ };
+ LiquidDate.prototype.getLongWeekdayName = function () {
+ var _a;
+ return (_a = this.format({ weekday: 'long' })) !== null && _a !== void 0 ? _a : dayNames[this.displayDate.getDay()];
+ };
+ LiquidDate.prototype.getShortWeekdayName = function () {
+ var _a;
+ return (_a = this.format({ weekday: 'short' })) !== null && _a !== void 0 ? _a : dayNamesShort[this.displayDate.getDay()];
+ };
+ LiquidDate.prototype.valid = function () {
+ return !isNaN(this.getTime());
+ };
+ LiquidDate.prototype.format = function (options) {
+ return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate);
+ };
+ /**
+ * Create a Date object fixed to it's declared Timezone. Both
+ * - 2021-08-06T02:29:00.000Z and
+ * - 2021-08-06T02:29:00.000+08:00
+ * will always be displayed as
+ * - 2021-08-06 02:29:00
+ * regardless timezoneOffset in JavaScript realm
+ *
+ * The implementation hack:
+ * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,
+ * we create a different Date to trick strftime, it's both simpler and more performant.
+ * Given that a template is expected to be parsed fewer times than rendered.
+ */
+ LiquidDate.createDateFixedToTimezone = function (dateString, locale) {
+ var m = dateString.match(TIMEZONE_PATTERN);
+ // representing a UTC timestamp
+ if (m && m[1] === 'Z') {
+ return new LiquidDate(+new Date(dateString), locale, 0);
+ }
+ // has a timezone specified
+ if (m && m[2] && m[3] && m[4]) {
+ var _a = __read(m, 5), sign = _a[2], hours = _a[3], minutes = _a[4];
+ var offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10));
+ return new LiquidDate(+new Date(dateString), locale, offset);
+ }
+ return new LiquidDate(dateString, locale);
+ };
+ LiquidDate.getTimezoneOffset = function (timezoneName, date) {
+ var localDateString = date.toLocaleString('en-US', { timeZone: timezoneName });
+ var utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' });
+ var localDate = new Date(localDateString);
+ var utcDate = new Date(utcDateString);
+ return (+utcDate - +localDate) / (60 * 1000);
+ };
+ return LiquidDate;
+ }()); + + var Limiter = /** @class */ (function () {
+ function Limiter(resource, limit) {
+ this.base = 0;
+ this.message = "".concat(resource, " limit exceeded");
+ this.limit = limit;
+ }
+ Limiter.prototype.use = function (count) {
+ count = +count || 0;
+ assert(this.base + count <= this.limit, this.message);
+ this.base += count;
+ };
+ Limiter.prototype.check = function (count) {
+ count = +count || 0;
+ assert(count <= this.limit, this.message);
+ };
+ return Limiter;
+ }()); + + var DelimitedToken = /** @class */ (function (_super) {
+ __extends(DelimitedToken, _super);
+ function DelimitedToken(kind, _a, input, begin, end, trimLeft, trimRight, file) {
+ var _b = __read(_a, 2), contentBegin = _b[0], contentEnd = _b[1];
+ var _this = _super.call(this, kind, input, begin, end, file) || this;
+ _this.trimLeft = false;
+ _this.trimRight = false;
+ var tl = input[contentBegin] === '-';
+ var tr = input[contentEnd - 1] === '-';
+ var l = tl ? contentBegin + 1 : contentBegin;
+ var r = tr ? contentEnd - 1 : contentEnd;
+ while (l < r && (TYPES[input.charCodeAt(l)] & BLANK))
+ l++;
+ while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK))
+ r--;
+ _this.contentRange = [l, r];
+ _this.trimLeft = tl || trimLeft;
+ _this.trimRight = tr || trimRight;
+ return _this;
+ }
+ Object.defineProperty(DelimitedToken.prototype, "content", {
+ get: function () {
+ return this.input.slice(this.contentRange[0], this.contentRange[1]);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return DelimitedToken;
+ }(Token)); + + var TagToken = /** @class */ (function (_super) {
+ __extends(TagToken, _super);
+ function TagToken(input, begin, end, options, file) {
+ var _this = this;
+ var trimTagLeft = options.trimTagLeft, trimTagRight = options.trimTagRight, tagDelimiterLeft = options.tagDelimiterLeft, tagDelimiterRight = options.tagDelimiterRight;
+ var _a = __read([begin + tagDelimiterLeft.length, end - tagDelimiterRight.length], 2), valueBegin = _a[0], valueEnd = _a[1];
+ _this = _super.call(this, exports.TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file) || this;
+ _this.tokenizer = new Tokenizer(input, options.operators, file, _this.contentRange);
+ _this.name = _this.tokenizer.readTagName();
+ _this.tokenizer.assert(_this.name, "illegal tag syntax, tag name expected");
+ _this.tokenizer.skipBlank();
+ _this.args = _this.tokenizer.input.slice(_this.tokenizer.p, _this.contentRange[1]);
+ return _this;
+ }
+ return TagToken;
+ }(DelimitedToken)); + + var OutputToken = /** @class */ (function (_super) {
+ __extends(OutputToken, _super);
+ function OutputToken(input, begin, end, options, file) {
+ var trimOutputLeft = options.trimOutputLeft, trimOutputRight = options.trimOutputRight, outputDelimiterLeft = options.outputDelimiterLeft, outputDelimiterRight = options.outputDelimiterRight;
+ var valueRange = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length];
+ return _super.call(this, exports.TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file) || this;
+ }
+ return OutputToken;
+ }(DelimitedToken)); + + var HTMLToken = /** @class */ (function (_super) {
+ __extends(HTMLToken, _super);
+ function HTMLToken(input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.HTML, input, begin, end, file) || this;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.file = file;
+ _this.trimLeft = 0;
+ _this.trimRight = 0;
+ return _this;
+ }
+ HTMLToken.prototype.getContent = function () {
+ return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight);
+ };
+ return HTMLToken;
+ }(Token)); + + var NumberToken = /** @class */ (function (_super) {
+ __extends(NumberToken, _super);
+ function NumberToken(input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.Number, input, begin, end, file) || this;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.file = file;
+ _this.content = Number(_this.getText());
+ return _this;
+ }
+ return NumberToken;
+ }(Token)); + + var IdentifierToken = /** @class */ (function (_super) {
+ __extends(IdentifierToken, _super);
+ function IdentifierToken(input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.Word, input, begin, end, file) || this;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.file = file;
+ _this.content = _this.getText();
+ return _this;
+ }
+ return IdentifierToken;
+ }(Token)); + + var LiteralToken = /** @class */ (function (_super) {
+ __extends(LiteralToken, _super);
+ function LiteralToken(input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.Literal, input, begin, end, file) || this;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.file = file;
+ _this.literal = _this.getText();
+ _this.content = literalValues[_this.literal];
+ return _this;
+ }
+ return LiteralToken;
+ }(Token)); + + var operatorPrecedences = {
+ '==': 2,
+ '!=': 2,
+ '>': 2,
+ '<': 2,
+ '>=': 2,
+ '<=': 2,
+ 'contains': 2,
+ 'not': 1,
+ 'and': 0,
+ 'or': 0
+ };
+ var operatorTypes = {
+ '==': 0 /* OperatorType.Binary */,
+ '!=': 0 /* OperatorType.Binary */,
+ '>': 0 /* OperatorType.Binary */,
+ '<': 0 /* OperatorType.Binary */,
+ '>=': 0 /* OperatorType.Binary */,
+ '<=': 0 /* OperatorType.Binary */,
+ 'contains': 0 /* OperatorType.Binary */,
+ 'not': 1 /* OperatorType.Unary */,
+ 'and': 0 /* OperatorType.Binary */,
+ 'or': 0 /* OperatorType.Binary */
+ };
+ var OperatorToken = /** @class */ (function (_super) {
+ __extends(OperatorToken, _super);
+ function OperatorToken(input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.Operator, input, begin, end, file) || this;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.file = file;
+ _this.operator = _this.getText();
+ return _this;
+ }
+ OperatorToken.prototype.getPrecedence = function () {
+ var key = this.getText();
+ return key in operatorPrecedences ? operatorPrecedences[key] : 1;
+ };
+ return OperatorToken;
+ }(Token)); + + var PropertyAccessToken = /** @class */ (function (_super) {
+ __extends(PropertyAccessToken, _super);
+ function PropertyAccessToken(variable, props, input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.PropertyAccess, input, begin, end, file) || this;
+ _this.variable = variable;
+ _this.props = props;
+ return _this;
+ }
+ return PropertyAccessToken;
+ }(Token)); + + var FilterToken = /** @class */ (function (_super) {
+ __extends(FilterToken, _super);
+ function FilterToken(name, args, input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.Filter, input, begin, end, file) || this;
+ _this.name = name;
+ _this.args = args;
+ return _this;
+ }
+ return FilterToken;
+ }(Token)); + + var HashToken = /** @class */ (function (_super) {
+ __extends(HashToken, _super);
+ function HashToken(input, begin, end, name, value, file) {
+ var _this = _super.call(this, exports.TokenKind.Hash, input, begin, end, file) || this;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.name = name;
+ _this.value = value;
+ _this.file = file;
+ return _this;
+ }
+ return HashToken;
+ }(Token)); + + var rHex = /[\da-fA-F]/;
+ var rOct = /[0-7]/;
+ var escapeChar = {
+ b: '\b',
+ f: '\f',
+ n: '\n',
+ r: '\r',
+ t: '\t',
+ v: '\x0B'
+ };
+ function hexVal(c) {
+ var code = c.charCodeAt(0);
+ if (code >= 97)
+ return code - 87;
+ if (code >= 65)
+ return code - 55;
+ return code - 48;
+ }
+ function parseStringLiteral(str) {
+ var ret = '';
+ for (var i = 1; i < str.length - 1; i++) {
+ if (str[i] !== '\\') {
+ ret += str[i];
+ continue;
+ }
+ if (escapeChar[str[i + 1]] !== undefined) {
+ ret += escapeChar[str[++i]];
+ }
+ else if (str[i + 1] === 'u') {
+ var val = 0;
+ var j = i + 2;
+ while (j <= i + 5 && rHex.test(str[j])) {
+ val = val * 16 + hexVal(str[j++]);
+ }
+ i = j - 1;
+ ret += String.fromCharCode(val);
+ }
+ else if (!rOct.test(str[i + 1])) {
+ ret += str[++i];
+ }
+ else {
+ var j = i + 1;
+ var val = 0;
+ while (j <= i + 3 && rOct.test(str[j])) {
+ val = val * 8 + hexVal(str[j++]);
+ }
+ i = j - 1;
+ ret += String.fromCharCode(val);
+ }
+ }
+ return ret;
+ } + + var QuotedToken = /** @class */ (function (_super) {
+ __extends(QuotedToken, _super);
+ function QuotedToken(input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.Quoted, input, begin, end, file) || this;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.file = file;
+ _this.content = parseStringLiteral(_this.getText());
+ return _this;
+ }
+ return QuotedToken;
+ }(Token)); + + var RangeToken = /** @class */ (function (_super) {
+ __extends(RangeToken, _super);
+ function RangeToken(input, begin, end, lhs, rhs, file) {
+ var _this = _super.call(this, exports.TokenKind.Range, input, begin, end, file) || this;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.lhs = lhs;
+ _this.rhs = rhs;
+ _this.file = file;
+ return _this;
+ }
+ return RangeToken;
+ }(Token)); + + /**
+ * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`
+ */
+ var LiquidTagToken = /** @class */ (function (_super) {
+ __extends(LiquidTagToken, _super);
+ function LiquidTagToken(input, begin, end, options, file) {
+ var _this = _super.call(this, exports.TokenKind.Tag, [begin, end], input, begin, end, false, false, file) || this;
+ _this.tokenizer = new Tokenizer(input, options.operators, file, _this.contentRange);
+ _this.name = _this.tokenizer.readTagName();
+ _this.tokenizer.assert(_this.name, 'illegal liquid tag syntax');
+ _this.tokenizer.skipBlank();
+ return _this;
+ }
+ Object.defineProperty(LiquidTagToken.prototype, "args", {
+ get: function () {
+ return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]);
+ },
+ enumerable: false,
+ configurable: true
+ });
+ return LiquidTagToken;
+ }(DelimitedToken)); + + /**
+ * value expression with optional filters
+ * e.g.
+ * {% assign foo="bar" | append: "coo" %}
+ */
+ var FilteredValueToken = /** @class */ (function (_super) {
+ __extends(FilteredValueToken, _super);
+ function FilteredValueToken(initial, filters, input, begin, end, file) {
+ var _this = _super.call(this, exports.TokenKind.FilteredValue, input, begin, end, file) || this;
+ _this.initial = initial;
+ _this.filters = filters;
+ _this.input = input;
+ _this.begin = begin;
+ _this.end = end;
+ _this.file = file;
+ return _this;
+ }
+ return FilteredValueToken;
+ }(Token)); + + var polyfill = {
+ now: function () { return Date.now(); }
+ };
+ function getPerformance() {
+ return (typeof global === 'object' && global.performance) ||
+ (typeof window === 'object' && window.performance) ||
+ polyfill;
+ } + + var Render = /** @class */ (function () {
+ function Render() {
+ }
+ Render.prototype.renderTemplatesToNodeStream = function (templates, ctx) {
+ var _this = this;
+ var emitter = new StreamedEmitter();
+ Promise.resolve().then(function () { return toPromise(_this.renderTemplates(templates, ctx, emitter)); })
+ .then(function () { return emitter.end(); }, function (err) { return emitter.error(err); });
+ return emitter.stream;
+ };
+ Render.prototype.renderTemplates = function (templates, ctx, emitter) {
+ var errors, templates_1, templates_1_1, tpl, html, e_1, err, e_2_1;
+ var e_2, _a;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ if (!emitter) {
+ emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter();
+ }
+ errors = [];
+ _b.label = 1;
+ case 1:
+ _b.trys.push([1, 8, 9, 10]);
+ templates_1 = __values(templates), templates_1_1 = templates_1.next();
+ _b.label = 2;
+ case 2:
+ if (!!templates_1_1.done) return [3 /*break*/, 7];
+ tpl = templates_1_1.value;
+ ctx.renderLimit.check(getPerformance().now());
+ _b.label = 3;
+ case 3:
+ _b.trys.push([3, 5, , 6]);
+ return [4 /*yield*/, tpl.render(ctx, emitter)
+ // if not, it'll return an `html`, write to the emitter for it
+ ];
+ case 4:
+ html = _b.sent();
+ // if not, it'll return an `html`, write to the emitter for it
+ html && emitter.write(html);
+ if (ctx.breakCalled || ctx.continueCalled)
+ return [3 /*break*/, 7];
+ return [3 /*break*/, 6];
+ case 5:
+ e_1 = _b.sent();
+ err = LiquidError.is(e_1) ? e_1 : new RenderError(e_1, tpl);
+ if (ctx.opts.catchAllErrors)
+ errors.push(err);
+ else
+ throw err;
+ return [3 /*break*/, 6];
+ case 6:
+ templates_1_1 = templates_1.next();
+ return [3 /*break*/, 2];
+ case 7: return [3 /*break*/, 10];
+ case 8:
+ e_2_1 = _b.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 10];
+ case 9:
+ try {
+ if (templates_1_1 && !templates_1_1.done && (_a = templates_1.return)) _a.call(templates_1);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 10:
+ if (errors.length) {
+ throw new LiquidErrors(errors);
+ }
+ return [2 /*return*/, emitter.buffer];
+ }
+ });
+ };
+ return Render;
+ }()); + + var Expression = /** @class */ (function () {
+ function Expression(tokens) {
+ this.postfix = __spreadArray([], __read(toPostfix(tokens)), false);
+ }
+ Expression.prototype.evaluate = function (ctx, lenient) {
+ var operands, _a, _b, token, r, result, l, _c, _d, e_1_1;
+ var e_1, _e;
+ return __generator(this, function (_f) {
+ switch (_f.label) {
+ case 0:
+ assert(ctx, 'unable to evaluate: context not defined');
+ operands = [];
+ _f.label = 1;
+ case 1:
+ _f.trys.push([1, 11, 12, 13]);
+ _a = __values(this.postfix), _b = _a.next();
+ _f.label = 2;
+ case 2:
+ if (!!_b.done) return [3 /*break*/, 10];
+ token = _b.value;
+ if (!isOperatorToken(token)) return [3 /*break*/, 7];
+ r = operands.pop();
+ result = void 0;
+ if (!(operatorTypes[token.operator] === 1 /* OperatorType.Unary */)) return [3 /*break*/, 4];
+ return [4 /*yield*/, ctx.opts.operators[token.operator](r, ctx)];
+ case 3:
+ result = _f.sent();
+ return [3 /*break*/, 6];
+ case 4:
+ l = operands.pop();
+ return [4 /*yield*/, ctx.opts.operators[token.operator](l, r, ctx)];
+ case 5:
+ result = _f.sent();
+ _f.label = 6;
+ case 6:
+ operands.push(result);
+ return [3 /*break*/, 9];
+ case 7:
+ _d = (_c = operands).push;
+ return [4 /*yield*/, evalToken(token, ctx, lenient)];
+ case 8:
+ _d.apply(_c, [_f.sent()]);
+ _f.label = 9;
+ case 9:
+ _b = _a.next();
+ return [3 /*break*/, 2];
+ case 10: return [3 /*break*/, 13];
+ case 11:
+ e_1_1 = _f.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 13];
+ case 12:
+ try {
+ if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 13: return [2 /*return*/, operands[0]];
+ }
+ });
+ };
+ Expression.prototype.valid = function () {
+ return !!this.postfix.length;
+ };
+ return Expression;
+ }());
+ function evalToken(token, ctx, lenient) {
+ if (lenient === void 0) { lenient = false; }
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!token)
+ return [2 /*return*/];
+ if ('content' in token)
+ return [2 /*return*/, token.content];
+ if (!isPropertyAccessToken(token)) return [3 /*break*/, 2];
+ return [4 /*yield*/, evalPropertyAccessToken(token, ctx, lenient)];
+ case 1: return [2 /*return*/, _a.sent()];
+ case 2:
+ if (!isRangeToken(token)) return [3 /*break*/, 4];
+ return [4 /*yield*/, evalRangeToken(token, ctx)];
+ case 3: return [2 /*return*/, _a.sent()];
+ case 4: return [2 /*return*/];
+ }
+ });
+ }
+ function evalPropertyAccessToken(token, ctx, lenient) {
+ var props, _a, _b, prop, _c, _d, e_2_1, variable, e_3;
+ var e_2, _e;
+ return __generator(this, function (_f) {
+ switch (_f.label) {
+ case 0:
+ props = [];
+ _f.label = 1;
+ case 1:
+ _f.trys.push([1, 6, 7, 8]);
+ _a = __values(token.props), _b = _a.next();
+ _f.label = 2;
+ case 2:
+ if (!!_b.done) return [3 /*break*/, 5];
+ prop = _b.value;
+ _d = (_c = props).push;
+ return [4 /*yield*/, evalToken(prop, ctx, false)];
+ case 3:
+ _d.apply(_c, [(_f.sent())]);
+ _f.label = 4;
+ case 4:
+ _b = _a.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_2_1 = _f.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (_b && !_b.done && (_e = _a.return)) _e.call(_a);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 8:
+ _f.trys.push([8, 14, , 15]);
+ if (!token.variable) return [3 /*break*/, 11];
+ return [4 /*yield*/, evalToken(token.variable, ctx, lenient)];
+ case 9:
+ variable = _f.sent();
+ return [4 /*yield*/, ctx._getFromScope(variable, props)];
+ case 10: return [2 /*return*/, _f.sent()];
+ case 11: return [4 /*yield*/, ctx._get(props)];
+ case 12: return [2 /*return*/, _f.sent()];
+ case 13: return [3 /*break*/, 15];
+ case 14:
+ e_3 = _f.sent();
+ if (lenient && e_3.name === 'InternalUndefinedVariableError')
+ return [2 /*return*/, null];
+ throw (new UndefinedVariableError(e_3, token));
+ case 15: return [2 /*return*/];
+ }
+ });
+ }
+ function evalQuotedToken(token) {
+ return token.content;
+ }
+ function evalRangeToken(token, ctx) {
+ var low, high;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, evalToken(token.lhs, ctx)];
+ case 1:
+ low = _a.sent();
+ return [4 /*yield*/, evalToken(token.rhs, ctx)];
+ case 2:
+ high = _a.sent();
+ ctx.memoryLimit.use(high - low + 1);
+ return [2 /*return*/, range(+low, +high + 1)];
+ }
+ });
+ }
+ function toPostfix(tokens) {
+ var ops, tokens_1, tokens_1_1, token, e_4_1;
+ var e_4, _a;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ ops = [];
+ _b.label = 1;
+ case 1:
+ _b.trys.push([1, 10, 11, 12]);
+ tokens_1 = __values(tokens), tokens_1_1 = tokens_1.next();
+ _b.label = 2;
+ case 2:
+ if (!!tokens_1_1.done) return [3 /*break*/, 9];
+ token = tokens_1_1.value;
+ if (!isOperatorToken(token)) return [3 /*break*/, 6];
+ _b.label = 3;
+ case 3:
+ if (!(ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence())) return [3 /*break*/, 5];
+ return [4 /*yield*/, ops.pop()];
+ case 4:
+ _b.sent();
+ return [3 /*break*/, 3];
+ case 5:
+ ops.push(token);
+ return [3 /*break*/, 8];
+ case 6: return [4 /*yield*/, token];
+ case 7:
+ _b.sent();
+ _b.label = 8;
+ case 8:
+ tokens_1_1 = tokens_1.next();
+ return [3 /*break*/, 2];
+ case 9: return [3 /*break*/, 12];
+ case 10:
+ e_4_1 = _b.sent();
+ e_4 = { error: e_4_1 };
+ return [3 /*break*/, 12];
+ case 11:
+ try {
+ if (tokens_1_1 && !tokens_1_1.done && (_a = tokens_1.return)) _a.call(tokens_1);
+ }
+ finally { if (e_4) throw e_4.error; }
+ return [7 /*endfinally*/];
+ case 12:
+ if (!ops.length) return [3 /*break*/, 14];
+ return [4 /*yield*/, ops.pop()];
+ case 13:
+ _b.sent();
+ return [3 /*break*/, 12];
+ case 14: return [2 /*return*/];
+ }
+ });
+ } + + function isTruthy(val, ctx) {
+ return !isFalsy(val, ctx);
+ }
+ function isFalsy(val, ctx) {
+ val = toValue(val);
+ if (ctx.opts.jsTruthy) {
+ return !val;
+ }
+ else {
+ return val === false || undefined === val || val === null;
+ }
+ } + + var defaultOperators = {
+ '==': equals,
+ '!=': function (l, r) { return !equals(l, r); },
+ '>': function (l, r) {
+ if (isComparable(l))
+ return l.gt(r);
+ if (isComparable(r))
+ return r.lt(l);
+ return toValue(l) > toValue(r);
+ },
+ '<': function (l, r) {
+ if (isComparable(l))
+ return l.lt(r);
+ if (isComparable(r))
+ return r.gt(l);
+ return toValue(l) < toValue(r);
+ },
+ '>=': function (l, r) {
+ if (isComparable(l))
+ return l.geq(r);
+ if (isComparable(r))
+ return r.leq(l);
+ return toValue(l) >= toValue(r);
+ },
+ '<=': function (l, r) {
+ if (isComparable(l))
+ return l.leq(r);
+ if (isComparable(r))
+ return r.geq(l);
+ return toValue(l) <= toValue(r);
+ },
+ 'contains': function (l, r) {
+ l = toValue(l);
+ if (isArray(l))
+ return l.some(function (i) { return equals(i, r); });
+ if (isFunction(l === null || l === void 0 ? void 0 : l.indexOf))
+ return l.indexOf(toValue(r)) > -1;
+ return false;
+ },
+ 'not': function (v, ctx) { return isFalsy(toValue(v), ctx); },
+ 'and': function (l, r, ctx) { return isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx); },
+ 'or': function (l, r, ctx) { return isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx); }
+ };
+ function equals(lhs, rhs) {
+ if (isComparable(lhs))
+ return lhs.equals(rhs);
+ if (isComparable(rhs))
+ return rhs.equals(lhs);
+ lhs = toValue(lhs);
+ rhs = toValue(rhs);
+ if (isArray(lhs)) {
+ return isArray(rhs) && arrayEquals(lhs, rhs);
+ }
+ return lhs === rhs;
+ }
+ function arrayEquals(lhs, rhs) {
+ if (lhs.length !== rhs.length)
+ return false;
+ return !lhs.some(function (value, i) { return !equals(value, rhs[i]); });
+ }
+ function arrayIncludes(arr, item) {
+ return arr.some(function (value) { return equals(value, item); });
+ } + + var Node = /** @class */ (function () {
+ function Node(key, value, next, prev) {
+ this.key = key;
+ this.value = value;
+ this.next = next;
+ this.prev = prev;
+ }
+ return Node;
+ }());
+ var LRU = /** @class */ (function () {
+ function LRU(limit, size) {
+ if (size === void 0) { size = 0; }
+ this.limit = limit;
+ this.size = size;
+ this.cache = {};
+ this.head = new Node('HEAD', null, null, null);
+ this.tail = new Node('TAIL', null, null, null);
+ this.head.next = this.tail;
+ this.tail.prev = this.head;
+ }
+ LRU.prototype.write = function (key, value) {
+ if (this.cache[key]) {
+ this.cache[key].value = value;
+ }
+ else {
+ var node = new Node(key, value, this.head.next, this.head);
+ this.head.next.prev = node;
+ this.head.next = node;
+ this.cache[key] = node;
+ this.size++;
+ this.ensureLimit();
+ }
+ };
+ LRU.prototype.read = function (key) {
+ if (!this.cache[key])
+ return;
+ var value = this.cache[key].value;
+ this.remove(key);
+ this.write(key, value);
+ return value;
+ };
+ LRU.prototype.remove = function (key) {
+ var node = this.cache[key];
+ node.prev.next = node.next;
+ node.next.prev = node.prev;
+ delete this.cache[key];
+ this.size--;
+ };
+ LRU.prototype.clear = function () {
+ this.head.next = this.tail;
+ this.tail.prev = this.head;
+ this.size = 0;
+ this.cache = {};
+ };
+ LRU.prototype.ensureLimit = function () {
+ if (this.size > this.limit)
+ this.remove(this.tail.prev.key);
+ };
+ return LRU;
+ }()); + + 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 = path.split('/').pop();
+ if (/\.\w+$/.test(last))
+ 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 readFileSync(url) {
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url, false);
+ xhr.send();
+ if (xhr.status < 200 || xhr.status >= 300) {
+ throw new Error(xhr.statusText);
+ }
+ return xhr.responseText;
+ }
+ function exists(filepath) {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, true];
+ });
+ });
+ }
+ function existsSync(filepath) {
+ return true;
+ }
+ function dirname(filepath) {
+ return domResolve(filepath, '.');
+ }
+ var sep = '/'; + + var fs = /*#__PURE__*/Object.freeze({ + __proto__: null, + resolve: resolve, + readFile: readFile, + readFileSync: readFileSync, + exists: exists, + existsSync: existsSync, + dirname: dirname, + sep: sep + }); + + function defaultFilter(value, defaultValue) {
+ var args = [];
+ for (var _i = 2; _i < arguments.length; _i++) {
+ args[_i - 2] = arguments[_i];
+ }
+ value = toValue(value);
+ if (isArray(value) || isString(value))
+ return value.length ? value : defaultValue;
+ if (value === false && (new Map(args)).get('allow_false'))
+ return false;
+ return isFalsy(value, this.context) ? defaultValue : value;
+ }
+ function json(value, space) {
+ if (space === void 0) { space = 0; }
+ return JSON.stringify(value, null, space);
+ }
+ function inspect(value, space) {
+ if (space === void 0) { space = 0; }
+ var ancestors = [];
+ return JSON.stringify(value, function (_key, value) {
+ if (typeof value !== 'object' || value === null)
+ return value;
+ // `this` is the object that value is contained in, i.e., its direct parent.
+ while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this)
+ ancestors.pop();
+ if (ancestors.includes(value))
+ return '[Circular]';
+ ancestors.push(value);
+ return value;
+ }, space);
+ }
+ function to_integer(value) {
+ return Number(value);
+ }
+ var raw = {
+ raw: true,
+ handler: identify
+ };
+ var misc = {
+ default: defaultFilter,
+ raw: raw,
+ jsonify: json,
+ to_integer: to_integer,
+ json: json,
+ inspect: inspect
+ }; + + var escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": '''
+ };
+ var unescapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ ''': "'"
+ };
+ function escape(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/&|<|>|"|'/g, function (m) { return escapeMap[m]; });
+ }
+ function xml_escape(str) {
+ return escape.call(this, str);
+ }
+ function unescape(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/&(amp|lt|gt|#34|#39);/g, function (m) { return unescapeMap[m]; });
+ }
+ function escape_once(str) {
+ return escape.call(this, unescape.call(this, str));
+ }
+ function newline_to_br(v) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\r?\n/gm, '<br />\n');
+ }
+ function strip_html(v) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/<script[\s\S]*?<\/script>|<style[\s\S]*?<\/style>|<.*?>|<!--[\s\S]*?-->/g, '');
+ } + + var htmlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + escape: escape, + xml_escape: xml_escape, + escape_once: escape_once, + newline_to_br: newline_to_br, + strip_html: strip_html + }); + + var MapFS = /** @class */ (function () {
+ function MapFS(mapping) {
+ this.mapping = mapping;
+ this.sep = '/';
+ }
+ MapFS.prototype.exists = function (filepath) {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, this.existsSync(filepath)];
+ });
+ });
+ };
+ MapFS.prototype.existsSync = function (filepath) {
+ return !isNil(this.mapping[filepath]);
+ };
+ MapFS.prototype.readFile = function (filepath) {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, this.readFileSync(filepath)];
+ });
+ });
+ };
+ MapFS.prototype.readFileSync = function (filepath) {
+ var content = this.mapping[filepath];
+ if (isNil(content))
+ throw new Error("ENOENT: ".concat(filepath));
+ return content;
+ };
+ MapFS.prototype.dirname = function (filepath) {
+ var segments = filepath.split(this.sep);
+ segments.pop();
+ return segments.join(this.sep);
+ };
+ MapFS.prototype.resolve = function (dir, file, ext) {
+ var e_1, _a;
+ file += ext;
+ if (dir === '.')
+ return file;
+ var segments = dir.split(/\/+/);
+ try {
+ for (var _b = __values(file.split(this.sep)), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var segment = _c.value;
+ if (segment === '.' || segment === '')
+ continue;
+ else if (segment === '..') {
+ if (segments.length > 1 || segments[0] !== '')
+ segments.pop();
+ }
+ else
+ segments.push(segment);
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ return segments.join(this.sep);
+ };
+ return MapFS;
+ }()); + + var defaultOptions = {
+ root: ['.'],
+ layouts: ['.'],
+ partials: ['.'],
+ relativeReference: true,
+ jekyllInclude: false,
+ keyValueSeparator: ':',
+ cache: undefined,
+ extname: '',
+ fs: fs,
+ dynamicPartials: true,
+ jsTruthy: false,
+ dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',
+ locale: '',
+ trimTagRight: false,
+ trimTagLeft: false,
+ trimOutputRight: false,
+ trimOutputLeft: false,
+ greedy: true,
+ tagDelimiterLeft: '{%',
+ tagDelimiterRight: '%}',
+ outputDelimiterLeft: '{{',
+ outputDelimiterRight: '}}',
+ preserveTimezones: false,
+ strictFilters: false,
+ strictVariables: false,
+ ownPropertyOnly: true,
+ lenientIf: false,
+ globals: {},
+ keepOutputType: false,
+ operators: defaultOperators,
+ memoryLimit: Infinity,
+ parseLimit: Infinity,
+ renderLimit: Infinity
+ };
+ function normalize(options) {
+ var _a, _b;
+ if (options.hasOwnProperty('root')) {
+ if (!options.hasOwnProperty('partials'))
+ options.partials = options.root;
+ if (!options.hasOwnProperty('layouts'))
+ options.layouts = options.root;
+ }
+ if (options.hasOwnProperty('cache')) {
+ var cache = void 0;
+ if (typeof options.cache === 'number')
+ cache = options.cache > 0 ? new LRU(options.cache) : undefined;
+ else if (typeof options.cache === 'object')
+ cache = options.cache;
+ else
+ cache = options.cache ? new LRU(1024) : undefined;
+ options.cache = cache;
+ }
+ options = __assign(__assign(__assign({}, defaultOptions), (options.jekyllInclude ? { dynamicPartials: false } : {})), options);
+ if ((!options.fs.dirname || !options.fs.sep) && options.relativeReference) {
+ console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning');
+ options.relativeReference = false;
+ }
+ options.root = normalizeDirectoryList(options.root);
+ options.partials = normalizeDirectoryList(options.partials);
+ options.layouts = normalizeDirectoryList(options.layouts);
+ options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape);
+ if (!options.locale) {
+ options.locale = (_b = (_a = getDateTimeFormat()) === null || _a === void 0 ? void 0 : _a().resolvedOptions().locale) !== null && _b !== void 0 ? _b : 'en-US';
+ }
+ if (options.templates) {
+ options.fs = new MapFS(options.templates);
+ options.relativeReference = true;
+ options.root = options.partials = options.layouts = '.';
+ }
+ return options;
+ }
+ function getOutputEscapeFunction(nameOrFunction) {
+ if (nameOrFunction === 'escape')
+ return escape;
+ if (nameOrFunction === 'json')
+ return misc.json;
+ assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function');
+ return nameOrFunction;
+ }
+ function normalizeDirectoryList(value) {
+ var list = [];
+ if (isArray(value))
+ list = value;
+ if (isString(value))
+ list = [value];
+ return list;
+ } + + function whiteSpaceCtrl(tokens, options) {
+ var inRaw = false;
+ for (var i = 0; i < tokens.length; i++) {
+ var token = tokens[i];
+ if (!isDelimitedToken(token))
+ continue;
+ if (!inRaw && token.trimLeft) {
+ trimLeft(tokens[i - 1], options.greedy);
+ }
+ if (isTagToken(token)) {
+ if (token.name === 'raw')
+ inRaw = true;
+ else if (token.name === 'endraw')
+ inRaw = false;
+ }
+ if (!inRaw && token.trimRight) {
+ trimRight(tokens[i + 1], options.greedy);
+ }
+ }
+ }
+ function trimLeft(token, greedy) {
+ if (!token || !isHTMLToken(token))
+ return;
+ var mask = greedy ? BLANK : INLINE_BLANK;
+ while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask)
+ token.trimRight++;
+ }
+ function trimRight(token, greedy) {
+ if (!token || !isHTMLToken(token))
+ return;
+ var mask = greedy ? BLANK : INLINE_BLANK;
+ while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask)
+ token.trimLeft++;
+ if (token.input.charAt(token.begin + token.trimLeft) === '\n')
+ token.trimLeft++;
+ } + + var Tokenizer = /** @class */ (function () {
+ function Tokenizer(input, operators, file, range) {
+ if (operators === void 0) { operators = defaultOptions.operators; }
+ this.input = input;
+ this.file = file;
+ this.rawBeginAt = -1;
+ this.p = range ? range[0] : 0;
+ this.N = range ? range[1] : input.length;
+ this.opTrie = createTrie(operators);
+ this.literalTrie = createTrie(literalValues);
+ }
+ Tokenizer.prototype.readExpression = function () {
+ return new Expression(this.readExpressionTokens());
+ };
+ Tokenizer.prototype.readExpressionTokens = function () {
+ var operator, operand;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!(this.p < this.N)) return [3 /*break*/, 5];
+ operator = this.readOperator();
+ if (!operator) return [3 /*break*/, 2];
+ return [4 /*yield*/, operator];
+ case 1:
+ _a.sent();
+ return [3 /*break*/, 0];
+ case 2:
+ operand = this.readValue();
+ if (!operand) return [3 /*break*/, 4];
+ return [4 /*yield*/, operand];
+ case 3:
+ _a.sent();
+ return [3 /*break*/, 0];
+ case 4: return [2 /*return*/];
+ case 5: return [2 /*return*/];
+ }
+ });
+ };
+ Tokenizer.prototype.readOperator = function () {
+ this.skipBlank();
+ var end = this.matchTrie(this.opTrie);
+ if (end === -1)
+ return;
+ return new OperatorToken(this.input, this.p, (this.p = end), this.file);
+ };
+ Tokenizer.prototype.matchTrie = function (trie) {
+ var node = trie;
+ var i = this.p;
+ var info;
+ while (node[this.input[i]] && i < this.N) {
+ node = node[this.input[i++]];
+ if (node['end'])
+ info = node;
+ }
+ if (!info)
+ return -1;
+ if (info['needBoundary'] && isWord(this.peek(i - this.p)))
+ return -1;
+ return i;
+ };
+ Tokenizer.prototype.readFilteredValue = function () {
+ var begin = this.p;
+ var initial = this.readExpression();
+ this.assert(initial.valid(), "invalid value expression: ".concat(this.snapshot()));
+ var filters = this.readFilters();
+ return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file);
+ };
+ Tokenizer.prototype.readFilters = function () {
+ var filters = [];
+ while (true) {
+ var filter = this.readFilter();
+ if (!filter)
+ return filters;
+ filters.push(filter);
+ }
+ };
+ Tokenizer.prototype.readFilter = function () {
+ var _this = this;
+ this.skipBlank();
+ if (this.end())
+ return null;
+ this.assert(this.read() === '|', "expected \"|\" before filter");
+ var name = this.readIdentifier();
+ if (!name.size()) {
+ this.assert(this.end(), "expected filter name");
+ return null;
+ }
+ var args = [];
+ this.skipBlank();
+ if (this.peek() === ':') {
+ do {
+ ++this.p;
+ var arg = this.readFilterArg();
+ arg && args.push(arg);
+ this.skipBlank();
+ this.assert(this.end() || this.peek() === ',' || this.peek() === '|', function () { return "unexpected character ".concat(_this.snapshot()); });
+ } while (this.peek() === ',');
+ }
+ else if (this.peek() === '|' || this.end()) ;
+ else {
+ throw this.error('expected ":" after filter name');
+ }
+ return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file);
+ };
+ Tokenizer.prototype.readFilterArg = function () {
+ var key = this.readValue();
+ if (!key)
+ return;
+ this.skipBlank();
+ if (this.peek() !== ':')
+ return key;
+ ++this.p;
+ var value = this.readValue();
+ return [key.getText(), value];
+ };
+ Tokenizer.prototype.readTopLevelTokens = function (options) {
+ if (options === void 0) { options = defaultOptions; }
+ var tokens = [];
+ while (this.p < this.N) {
+ var token = this.readTopLevelToken(options);
+ tokens.push(token);
+ }
+ whiteSpaceCtrl(tokens, options);
+ return tokens;
+ };
+ Tokenizer.prototype.readTopLevelToken = function (options) {
+ var tagDelimiterLeft = options.tagDelimiterLeft, outputDelimiterLeft = options.outputDelimiterLeft;
+ if (this.rawBeginAt > -1)
+ return this.readEndrawOrRawContent(options);
+ if (this.match(tagDelimiterLeft))
+ return this.readTagToken(options);
+ if (this.match(outputDelimiterLeft))
+ return this.readOutputToken(options);
+ return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft]);
+ };
+ Tokenizer.prototype.readHTMLToken = function (stopStrings) {
+ var _this = this;
+ var begin = this.p;
+ while (this.p < this.N) {
+ if (stopStrings.some(function (str) { return _this.match(str); }))
+ break;
+ ++this.p;
+ }
+ return new HTMLToken(this.input, begin, this.p, this.file);
+ };
+ Tokenizer.prototype.readTagToken = function (options) {
+ var _a = this, file = _a.file, input = _a.input;
+ var begin = this.p;
+ if (this.readToDelimiter(options.tagDelimiterRight) === -1) {
+ throw this.error("tag ".concat(this.snapshot(begin), " not closed"), begin);
+ }
+ var token = new TagToken(input, begin, this.p, options, file);
+ if (token.name === 'raw')
+ this.rawBeginAt = begin;
+ return token;
+ };
+ Tokenizer.prototype.readToDelimiter = function (delimiter, respectQuoted) {
+ if (respectQuoted === void 0) { respectQuoted = false; }
+ this.skipBlank();
+ while (this.p < this.N) {
+ if (respectQuoted && (this.peekType() & QUOTE)) {
+ this.readQuoted();
+ continue;
+ }
+ ++this.p;
+ if (this.rmatch(delimiter))
+ return this.p;
+ }
+ return -1;
+ };
+ Tokenizer.prototype.readOutputToken = function (options) {
+ if (options === void 0) { options = defaultOptions; }
+ var _a = this, file = _a.file, input = _a.input;
+ var outputDelimiterRight = options.outputDelimiterRight;
+ var begin = this.p;
+ if (this.readToDelimiter(outputDelimiterRight, true) === -1) {
+ throw this.error("output ".concat(this.snapshot(begin), " not closed"), begin);
+ }
+ return new OutputToken(input, begin, this.p, options, file);
+ };
+ Tokenizer.prototype.readEndrawOrRawContent = function (options) {
+ var tagDelimiterLeft = options.tagDelimiterLeft, tagDelimiterRight = options.tagDelimiterRight;
+ var begin = this.p;
+ var leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length;
+ while (this.p < this.N) {
+ if (this.readIdentifier().getText() !== 'endraw') {
+ leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length;
+ continue;
+ }
+ while (this.p <= this.N) {
+ if (this.rmatch(tagDelimiterRight)) {
+ var end = this.p;
+ if (begin === leftPos) {
+ this.rawBeginAt = -1;
+ return new TagToken(this.input, begin, end, options, this.file);
+ }
+ else {
+ this.p = leftPos;
+ return new HTMLToken(this.input, begin, leftPos, this.file);
+ }
+ }
+ if (this.rmatch(tagDelimiterLeft))
+ break;
+ this.p++;
+ }
+ }
+ throw this.error("raw ".concat(this.snapshot(this.rawBeginAt), " not closed"), begin);
+ };
+ Tokenizer.prototype.readLiquidTagTokens = function (options) {
+ if (options === void 0) { options = defaultOptions; }
+ var tokens = [];
+ while (this.p < this.N) {
+ var token = this.readLiquidTagToken(options);
+ token && tokens.push(token);
+ }
+ return tokens;
+ };
+ Tokenizer.prototype.readLiquidTagToken = function (options) {
+ this.skipBlank();
+ if (this.end())
+ return;
+ var begin = this.p;
+ this.readToDelimiter('\n');
+ var end = this.p;
+ return new LiquidTagToken(this.input, begin, end, options, this.file);
+ };
+ Tokenizer.prototype.error = function (msg, pos) {
+ if (pos === void 0) { pos = this.p; }
+ return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file));
+ };
+ Tokenizer.prototype.assert = function (pred, msg, pos) {
+ if (!pred)
+ throw this.error(typeof msg === 'function' ? msg() : msg, pos);
+ };
+ Tokenizer.prototype.snapshot = function (begin) {
+ if (begin === void 0) { begin = this.p; }
+ return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32));
+ };
+ /**
+ * @deprecated use #readIdentifier instead
+ */
+ Tokenizer.prototype.readWord = function () {
+ return this.readIdentifier();
+ };
+ Tokenizer.prototype.readIdentifier = function () {
+ this.skipBlank();
+ var begin = this.p;
+ while (!this.end() && isWord(this.peek()))
+ ++this.p;
+ return new IdentifierToken(this.input, begin, this.p, this.file);
+ };
+ Tokenizer.prototype.readNonEmptyIdentifier = function () {
+ var id = this.readIdentifier();
+ return id.size() ? id : undefined;
+ };
+ Tokenizer.prototype.readTagName = function () {
+ this.skipBlank();
+ // Handle inline comment tags
+ if (this.input[this.p] === '#')
+ return this.input.slice(this.p, ++this.p);
+ return this.readIdentifier().getText();
+ };
+ Tokenizer.prototype.readHashes = function (jekyllStyle) {
+ var hashes = [];
+ while (true) {
+ var hash = this.readHash(jekyllStyle);
+ if (!hash)
+ return hashes;
+ hashes.push(hash);
+ }
+ };
+ Tokenizer.prototype.readHash = function (jekyllStyle) {
+ this.skipBlank();
+ if (this.peek() === ',')
+ ++this.p;
+ var begin = this.p;
+ var name = this.readNonEmptyIdentifier();
+ if (!name)
+ return;
+ var value;
+ this.skipBlank();
+ var sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':');
+ if (this.peek() === sep) {
+ ++this.p;
+ value = this.readValue();
+ }
+ return new HashToken(this.input, begin, this.p, name, value, this.file);
+ };
+ Tokenizer.prototype.remaining = function () {
+ return this.input.slice(this.p, this.N);
+ };
+ Tokenizer.prototype.advance = function (step) {
+ if (step === void 0) { step = 1; }
+ this.p += step;
+ };
+ Tokenizer.prototype.end = function () {
+ return this.p >= this.N;
+ };
+ Tokenizer.prototype.read = function () {
+ return this.input[this.p++];
+ };
+ Tokenizer.prototype.readTo = function (end) {
+ while (this.p < this.N) {
+ ++this.p;
+ if (this.rmatch(end))
+ return this.p;
+ }
+ return -1;
+ };
+ Tokenizer.prototype.readValue = function () {
+ this.skipBlank();
+ var begin = this.p;
+ var variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber();
+ var props = this.readProperties(!variable);
+ if (!props.length)
+ return variable;
+ return new PropertyAccessToken(variable, props, this.input, begin, this.p);
+ };
+ Tokenizer.prototype.readScopeValue = function () {
+ this.skipBlank();
+ var begin = this.p;
+ var props = this.readProperties();
+ if (!props.length)
+ return undefined;
+ return new PropertyAccessToken(undefined, props, this.input, begin, this.p);
+ };
+ Tokenizer.prototype.readProperties = function (isBegin) {
+ if (isBegin === void 0) { isBegin = true; }
+ var props = [];
+ while (true) {
+ if (this.peek() === '[') {
+ this.p++;
+ var prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file);
+ this.assert(this.readTo(']') !== -1, '[ not closed');
+ props.push(prop);
+ continue;
+ }
+ if (isBegin && !props.length) {
+ var prop = this.readNonEmptyIdentifier();
+ if (prop) {
+ props.push(prop);
+ continue;
+ }
+ }
+ if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax
+ this.p++;
+ var prop = this.readNonEmptyIdentifier();
+ if (!prop)
+ break;
+ props.push(prop);
+ continue;
+ }
+ break;
+ }
+ return props;
+ };
+ Tokenizer.prototype.readNumber = function () {
+ this.skipBlank();
+ var decimalFound = false;
+ var digitFound = false;
+ var n = 0;
+ if (this.peekType() & SIGN)
+ n++;
+ while (this.p + n <= this.N) {
+ if (this.peekType(n) & NUMBER) {
+ digitFound = true;
+ n++;
+ }
+ else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') {
+ if (decimalFound || !digitFound)
+ return;
+ decimalFound = true;
+ n++;
+ }
+ else
+ break;
+ }
+ if (digitFound && !isWord(this.peek(n))) {
+ var num = new NumberToken(this.input, this.p, this.p + n, this.file);
+ this.advance(n);
+ return num;
+ }
+ };
+ Tokenizer.prototype.readLiteral = function () {
+ this.skipBlank();
+ var end = this.matchTrie(this.literalTrie);
+ if (end === -1)
+ return;
+ var literal = new LiteralToken(this.input, this.p, end, this.file);
+ this.p = end;
+ return literal;
+ };
+ Tokenizer.prototype.readRange = function () {
+ this.skipBlank();
+ var begin = this.p;
+ if (this.peek() !== '(')
+ return;
+ ++this.p;
+ var lhs = this.readValueOrThrow();
+ this.skipBlank();
+ this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax');
+ var rhs = this.readValueOrThrow();
+ this.skipBlank();
+ this.assert(this.read() === ')', 'invalid range syntax');
+ return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file);
+ };
+ Tokenizer.prototype.readValueOrThrow = function () {
+ var _this = this;
+ var value = this.readValue();
+ this.assert(value, function () { return "unexpected token ".concat(_this.snapshot(), ", value expected"); });
+ return value;
+ };
+ Tokenizer.prototype.readQuoted = function () {
+ this.skipBlank();
+ var begin = this.p;
+ if (!(this.peekType() & QUOTE))
+ return;
+ ++this.p;
+ var escaped = false;
+ while (this.p < this.N) {
+ ++this.p;
+ if (this.input[this.p - 1] === this.input[begin] && !escaped)
+ break;
+ if (escaped)
+ escaped = false;
+ else if (this.input[this.p - 1] === '\\')
+ escaped = true;
+ }
+ return new QuotedToken(this.input, begin, this.p, this.file);
+ };
+ Tokenizer.prototype.readFileNameTemplate = function (options) {
+ var outputDelimiterLeft, htmlStopStrings, htmlStopStringSet;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ outputDelimiterLeft = options.outputDelimiterLeft;
+ htmlStopStrings = [',', ' ', outputDelimiterLeft];
+ htmlStopStringSet = new Set(htmlStopStrings);
+ _a.label = 1;
+ case 1:
+ if (!(this.p < this.N && !htmlStopStringSet.has(this.peek()))) return [3 /*break*/, 3];
+ return [4 /*yield*/, this.match(outputDelimiterLeft)
+ ? this.readOutputToken(options)
+ : this.readHTMLToken(htmlStopStrings)];
+ case 2:
+ _a.sent();
+ return [3 /*break*/, 1];
+ case 3: return [2 /*return*/];
+ }
+ });
+ };
+ Tokenizer.prototype.match = function (word) {
+ for (var i = 0; i < word.length; i++) {
+ if (word[i] !== this.input[this.p + i])
+ return false;
+ }
+ return true;
+ };
+ Tokenizer.prototype.rmatch = function (pattern) {
+ for (var i = 0; i < pattern.length; i++) {
+ if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i])
+ return false;
+ }
+ return true;
+ };
+ Tokenizer.prototype.peekType = function (n) {
+ if (n === void 0) { n = 0; }
+ return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)];
+ };
+ Tokenizer.prototype.peek = function (n) {
+ if (n === void 0) { n = 0; }
+ return this.p + n >= this.N ? '' : this.input[this.p + n];
+ };
+ Tokenizer.prototype.skipBlank = function () {
+ while (this.peekType() & BLANK)
+ ++this.p;
+ };
+ return Tokenizer;
+ }()); + + 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];
+ return h ? (h.call(this, arg), true) : false;
+ };
+ ParseStream.prototype.start = function () {
+ this.trigger('start');
+ var token;
+ while (!this.stopRequested && (token = this.tokens.shift())) {
+ if (this.trigger('token', token))
+ continue;
+ if (isTagToken(token) && this.trigger("tag:".concat(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 TemplateImpl = /** @class */ (function () {
+ function TemplateImpl(token) {
+ this.token = token;
+ }
+ return TemplateImpl;
+ }()); + + var Tag = /** @class */ (function (_super) {
+ __extends(Tag, _super);
+ function Tag(token, remainTokens, liquid) {
+ var _this = _super.call(this, token) || this;
+ _this.name = token.name;
+ _this.liquid = liquid;
+ _this.tokenizer = token.tokenizer;
+ return _this;
+ }
+ return Tag;
+ }(TemplateImpl)); + + /**
+ * Key-Value Pairs Representing Tag Arguments
+ * Example:
+ * For the markup `, foo:'bar', coo:2 reversed %}`,
+ * hash['foo'] === 'bar'
+ * hash['coo'] === 2
+ * hash['reversed'] === undefined
+ */
+ var Hash = /** @class */ (function () {
+ function Hash(input, jekyllStyle) {
+ var e_1, _a;
+ this.hash = {};
+ var tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {});
+ try {
+ for (var _b = __values(tokenizer.readHashes(jekyllStyle)), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var hash = _c.value;
+ this.hash[hash.name.content] = hash.value;
+ }
+ }
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_1) throw e_1.error; }
+ }
+ }
+ Hash.prototype.render = function (ctx) {
+ var hash, _a, _b, key, _c, _d, _e, e_2_1;
+ var e_2, _f;
+ return __generator(this, function (_g) {
+ switch (_g.label) {
+ case 0:
+ hash = {};
+ _g.label = 1;
+ case 1:
+ _g.trys.push([1, 8, 9, 10]);
+ _a = __values(Object.keys(this.hash)), _b = _a.next();
+ _g.label = 2;
+ case 2:
+ if (!!_b.done) return [3 /*break*/, 7];
+ key = _b.value;
+ _c = hash;
+ _d = key;
+ if (!(this.hash[key] === undefined)) return [3 /*break*/, 3];
+ _e = true;
+ return [3 /*break*/, 5];
+ case 3: return [4 /*yield*/, evalToken(this.hash[key], ctx)];
+ case 4:
+ _e = _g.sent();
+ _g.label = 5;
+ case 5:
+ _c[_d] = _e;
+ _g.label = 6;
+ case 6:
+ _b = _a.next();
+ return [3 /*break*/, 2];
+ case 7: return [3 /*break*/, 10];
+ case 8:
+ e_2_1 = _g.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 10];
+ case 9:
+ try {
+ if (_b && !_b.done && (_f = _a.return)) _f.call(_a);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 10: return [2 /*return*/, hash];
+ }
+ });
+ };
+ return Hash;
+ }()); + + function createTagClass(options) {
+ return /** @class */ (function (_super) {
+ __extends(class_1, _super);
+ function class_1(token, tokens, liquid) {
+ var _this = _super.call(this, token, tokens, liquid) || this;
+ if (isFunction(options.parse)) {
+ options.parse.call(_this, token, tokens);
+ }
+ return _this;
+ }
+ class_1.prototype.render = function (ctx, emitter) {
+ var hash;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)];
+ case 1:
+ hash = (_a.sent());
+ return [4 /*yield*/, options.render.call(this, ctx, emitter, hash)];
+ case 2: return [2 /*return*/, _a.sent()];
+ }
+ });
+ };
+ return class_1;
+ }(Tag));
+ } + + function isKeyValuePair(arr) {
+ return isArray(arr);
+ } + + var Filter = /** @class */ (function () {
+ function Filter(token, options, liquid) {
+ this.token = token;
+ this.name = token.name;
+ this.handler = isFunction(options)
+ ? options
+ : (isFunction(options === null || options === void 0 ? void 0 : options.handler) ? options.handler : identify);
+ this.raw = !isFunction(options) && !!(options === null || options === void 0 ? void 0 : options.raw);
+ this.args = token.args;
+ this.liquid = liquid;
+ }
+ Filter.prototype.render = function (value, context) {
+ var argv, _a, _b, arg, _c, _d, _e, _f, _g, e_1_1;
+ var e_1, _h;
+ return __generator(this, function (_j) {
+ switch (_j.label) {
+ case 0:
+ argv = [];
+ _j.label = 1;
+ case 1:
+ _j.trys.push([1, 8, 9, 10]);
+ _a = __values(this.args), _b = _a.next();
+ _j.label = 2;
+ case 2:
+ if (!!_b.done) return [3 /*break*/, 7];
+ arg = _b.value;
+ if (!isKeyValuePair(arg)) return [3 /*break*/, 4];
+ _d = (_c = argv).push;
+ _e = [arg[0]];
+ return [4 /*yield*/, evalToken(arg[1], context)];
+ case 3:
+ _d.apply(_c, [_e.concat([_j.sent()])]);
+ return [3 /*break*/, 6];
+ case 4:
+ _g = (_f = argv).push;
+ return [4 /*yield*/, evalToken(arg, context)];
+ case 5:
+ _g.apply(_f, [_j.sent()]);
+ _j.label = 6;
+ case 6:
+ _b = _a.next();
+ return [3 /*break*/, 2];
+ case 7: return [3 /*break*/, 10];
+ case 8:
+ e_1_1 = _j.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 10];
+ case 9:
+ try {
+ if (_b && !_b.done && (_h = _a.return)) _h.call(_a);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 10: return [4 /*yield*/, this.handler.apply({ context: context, token: this.token, liquid: this.liquid }, __spreadArray([value], __read(argv), false))];
+ case 11: return [2 /*return*/, _j.sent()];
+ }
+ });
+ };
+ return Filter;
+ }()); + + var Value = /** @class */ (function () {
+ /**
+ * @param str the value to be valuated, eg.: "foobar" | truncate: 3
+ */
+ function Value(input, liquid) {
+ var _this = this;
+ this.filters = [];
+ var token = typeof input === 'string'
+ ? new Tokenizer(input, liquid.options.operators).readFilteredValue()
+ : input;
+ this.initial = token.initial;
+ this.filters = token.filters.map(function (token) { return new Filter(token, _this.getFilter(liquid, token.name), liquid); });
+ }
+ Value.prototype.value = function (ctx, lenient) {
+ var val, _a, _b, filter, e_1_1;
+ var e_1, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default');
+ return [4 /*yield*/, this.initial.evaluate(ctx, lenient)];
+ case 1:
+ val = _d.sent();
+ _d.label = 2;
+ case 2:
+ _d.trys.push([2, 7, 8, 9]);
+ _a = __values(this.filters), _b = _a.next();
+ _d.label = 3;
+ case 3:
+ if (!!_b.done) return [3 /*break*/, 6];
+ filter = _b.value;
+ return [4 /*yield*/, filter.render(val, ctx)];
+ case 4:
+ val = _d.sent();
+ _d.label = 5;
+ case 5:
+ _b = _a.next();
+ return [3 /*break*/, 3];
+ case 6: return [3 /*break*/, 9];
+ case 7:
+ e_1_1 = _d.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 9];
+ case 8:
+ try {
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 9: return [2 /*return*/, val];
+ }
+ });
+ };
+ Value.prototype.getFilter = function (liquid, name) {
+ var impl = liquid.filters[name];
+ assert(impl || !liquid.options.strictFilters, function () { return "undefined filter: ".concat(name); });
+ return impl;
+ };
+ return Value;
+ }()); + + var Output = /** @class */ (function (_super) {
+ __extends(Output, _super);
+ function Output(token, liquid) {
+ var _this = this;
+ var _a;
+ _this = _super.call(this, token) || this;
+ var tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange);
+ _this.value = new Value(tokenizer.readFilteredValue(), liquid);
+ var filters = _this.value.filters;
+ var outputEscape = liquid.options.outputEscape;
+ if (!((_a = filters[filters.length - 1]) === null || _a === void 0 ? void 0 : _a.raw) && outputEscape) {
+ var token_1 = new FilterToken(toString.call(outputEscape), [], '', 0, 0);
+ filters.push(new Filter(token_1, outputEscape, liquid));
+ }
+ return _this;
+ }
+ Output.prototype.render = function (ctx, emitter) {
+ var val;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.value.value(ctx, false)];
+ case 1:
+ val = _a.sent();
+ emitter.write(val);
+ return [2 /*return*/];
+ }
+ });
+ };
+ Output.prototype.arguments = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.value];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ return Output;
+ }(TemplateImpl)); + + var HTML = /** @class */ (function (_super) {
+ __extends(HTML, _super);
+ function HTML(token) {
+ var _this = _super.call(this, token) || this;
+ _this.str = token.getContent();
+ return _this;
+ }
+ HTML.prototype.render = function (ctx, emitter) {
+ return __generator(this, function (_a) {
+ emitter.write(this.str);
+ return [2 /*return*/];
+ });
+ };
+ return HTML;
+ }(TemplateImpl)); + + /**
+ * A variable's segments and location, which can be coerced to a string.
+ */
+ var Variable = /** @class */ (function () {
+ function Variable(segments, location) {
+ this.segments = segments;
+ this.location = location;
+ }
+ Variable.prototype.toString = function () {
+ return segmentsString(this.segments, true);
+ };
+ /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */
+ Variable.prototype.toArray = function () {
+ function _visit() {
+ var _i, segments_1, segments_1_1, segment, e_1_1;
+ var e_1, _a;
+ var segments = [];
+ for (_i = 0; _i < arguments.length; _i++) {
+ segments[_i] = arguments[_i];
+ }
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ _b.trys.push([0, 7, 8, 9]);
+ segments_1 = __values(segments), segments_1_1 = segments_1.next();
+ _b.label = 1;
+ case 1:
+ if (!!segments_1_1.done) return [3 /*break*/, 6];
+ segment = segments_1_1.value;
+ if (!(segment instanceof Variable)) return [3 /*break*/, 3];
+ return [4 /*yield*/, Array.from(_visit.apply(void 0, __spreadArray([], __read(segment.segments), false)))];
+ case 2:
+ _b.sent();
+ return [3 /*break*/, 5];
+ case 3: return [4 /*yield*/, segment];
+ case 4:
+ _b.sent();
+ _b.label = 5;
+ case 5:
+ segments_1_1 = segments_1.next();
+ return [3 /*break*/, 1];
+ case 6: return [3 /*break*/, 9];
+ case 7:
+ e_1_1 = _b.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 9];
+ case 8:
+ try {
+ if (segments_1_1 && !segments_1_1.done && (_a = segments_1.return)) _a.call(segments_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 9: return [2 /*return*/];
+ }
+ });
+ }
+ return Array.from(_visit.apply(void 0, __spreadArray([], __read(this.segments), false)));
+ };
+ return Variable;
+ }());
+ /**
+ * Group variables by the string representation of their root segment.
+ */
+ var VariableMap = /** @class */ (function () {
+ function VariableMap() {
+ this.map = new Map();
+ }
+ VariableMap.prototype.get = function (key) {
+ var k = segmentsString([key.segments[0]]);
+ if (!this.map.has(k)) {
+ this.map.set(k, []);
+ }
+ return this.map.get(k);
+ };
+ VariableMap.prototype.has = function (key) {
+ return this.map.has(segmentsString([key.segments[0]]));
+ };
+ VariableMap.prototype.push = function (variable) {
+ this.get(variable).push(variable);
+ };
+ VariableMap.prototype.asObject = function () {
+ return Object.fromEntries(this.map);
+ };
+ return VariableMap;
+ }());
+ var defaultStaticAnalysisOptions = {
+ partials: true
+ };
+ function _analyze(templates, partials, sync) {
+ function updateVariables(variable, scope) {
+ var e_3, _a;
+ variables.push(variable);
+ var aliased = scope.alias(variable);
+ if (aliased !== undefined) {
+ var root = aliased.segments[0];
+ // TODO: What if a a template renders a rendered template? Do we need scope.parent?
+ if (isString(root) && !rootScope.has(root)) {
+ globals.push(aliased);
+ }
+ }
+ else {
+ var root = variable.segments[0];
+ if (isString(root) && !scope.has(root)) {
+ globals.push(variable);
+ }
+ }
+ try {
+ // Recurse for nested Variables
+ for (var _b = __values(variable.segments), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var segment = _c.value;
+ if (segment instanceof Variable) {
+ updateVariables(segment, scope);
+ }
+ }
+ }
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_3) throw e_3.error; }
+ }
+ }
+ function visit(template, scope) {
+ var _a, _b, arg, _c, _d, variable, _e, _f, ident, _g, row, col, partial, _h, _j, child, e_4_1, partialScopeNames, partialScope, _k, _l, name_1, _m, alias, argument, variables_1, _o, _p, child, e_5_1, _q, _r, child, e_6_1;
+ var e_7, _s, e_8, _t, e_9, _u, e_4, _v, e_10, _w, e_5, _x, e_6, _y;
+ return __generator(this, function (_z) {
+ switch (_z.label) {
+ case 0:
+ if (template.arguments) {
+ try {
+ for (_a = __values(template.arguments()), _b = _a.next(); !_b.done; _b = _a.next()) {
+ arg = _b.value;
+ try {
+ for (_c = (e_8 = void 0, __values(extractVariables(arg))), _d = _c.next(); !_d.done; _d = _c.next()) {
+ variable = _d.value;
+ updateVariables(variable, scope);
+ }
+ }
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
+ finally {
+ try {
+ if (_d && !_d.done && (_t = _c.return)) _t.call(_c);
+ }
+ finally { if (e_8) throw e_8.error; }
+ }
+ }
+ }
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
+ finally {
+ try {
+ if (_b && !_b.done && (_s = _a.return)) _s.call(_a);
+ }
+ finally { if (e_7) throw e_7.error; }
+ }
+ }
+ if (template.localScope) {
+ try {
+ for (_e = __values(template.localScope()), _f = _e.next(); !_f.done; _f = _e.next()) {
+ ident = _f.value;
+ scope.add(ident.content);
+ scope.deleteAlias(ident.content);
+ _g = __read(ident.getPosition(), 2), row = _g[0], col = _g[1];
+ locals.push(new Variable([ident.content], { row: row, col: col, file: ident.file }));
+ }
+ }
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
+ finally {
+ try {
+ if (_f && !_f.done && (_u = _e.return)) _u.call(_e);
+ }
+ finally { if (e_9) throw e_9.error; }
+ }
+ }
+ if (!template.children) return [3 /*break*/, 30];
+ if (!template.partialScope) return [3 /*break*/, 20];
+ partial = template.partialScope();
+ if (!(partial === undefined)) return [3 /*break*/, 10];
+ _z.label = 1;
+ case 1:
+ _z.trys.push([1, 7, 8, 9]);
+ return [4 /*yield*/, template.children(partials, sync)];
+ case 2:
+ _h = __values.apply(void 0, [(_z.sent())]), _j = _h.next();
+ _z.label = 3;
+ case 3:
+ if (!!_j.done) return [3 /*break*/, 6];
+ child = _j.value;
+ return [4 /*yield*/, visit(child, scope)];
+ case 4:
+ _z.sent();
+ _z.label = 5;
+ case 5:
+ _j = _h.next();
+ return [3 /*break*/, 3];
+ case 6: return [3 /*break*/, 9];
+ case 7:
+ e_4_1 = _z.sent();
+ e_4 = { error: e_4_1 };
+ return [3 /*break*/, 9];
+ case 8:
+ try {
+ if (_j && !_j.done && (_v = _h.return)) _v.call(_h);
+ }
+ finally { if (e_4) throw e_4.error; }
+ return [7 /*endfinally*/];
+ case 9: return [2 /*return*/];
+ case 10:
+ if (seen.has(partial.name))
+ return [2 /*return*/];
+ partialScopeNames = new Set();
+ partialScope = partial.isolated
+ ? new DummyScope(partialScopeNames)
+ : scope.push(partialScopeNames);
+ try {
+ for (_k = __values(partial.scope), _l = _k.next(); !_l.done; _l = _k.next()) {
+ name_1 = _l.value;
+ if (isString(name_1)) {
+ partialScopeNames.add(name_1);
+ }
+ else {
+ _m = __read(name_1, 2), alias = _m[0], argument = _m[1];
+ partialScopeNames.add(alias);
+ variables_1 = Array.from(extractVariables(argument));
+ if (variables_1.length) {
+ partialScope.setAlias(alias, variables_1[0].segments);
+ }
+ }
+ }
+ }
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
+ finally {
+ try {
+ if (_l && !_l.done && (_w = _k.return)) _w.call(_k);
+ }
+ finally { if (e_10) throw e_10.error; }
+ }
+ _z.label = 11;
+ case 11:
+ _z.trys.push([11, 17, 18, 19]);
+ return [4 /*yield*/, template.children(partials, sync)];
+ case 12:
+ _o = __values.apply(void 0, [(_z.sent())]), _p = _o.next();
+ _z.label = 13;
+ case 13:
+ if (!!_p.done) return [3 /*break*/, 16];
+ child = _p.value;
+ return [4 /*yield*/, visit(child, partialScope)];
+ case 14:
+ _z.sent();
+ seen.add(partial.name);
+ _z.label = 15;
+ case 15:
+ _p = _o.next();
+ return [3 /*break*/, 13];
+ case 16: return [3 /*break*/, 19];
+ case 17:
+ e_5_1 = _z.sent();
+ e_5 = { error: e_5_1 };
+ return [3 /*break*/, 19];
+ case 18:
+ try {
+ if (_p && !_p.done && (_x = _o.return)) _x.call(_o);
+ }
+ finally { if (e_5) throw e_5.error; }
+ return [7 /*endfinally*/];
+ case 19:
+ partialScope.pop();
+ return [3 /*break*/, 30];
+ case 20:
+ if (template.blockScope) {
+ scope.push(new Set(template.blockScope()));
+ }
+ _z.label = 21;
+ case 21:
+ _z.trys.push([21, 27, 28, 29]);
+ return [4 /*yield*/, template.children(partials, sync)];
+ case 22:
+ _q = __values.apply(void 0, [(_z.sent())]), _r = _q.next();
+ _z.label = 23;
+ case 23:
+ if (!!_r.done) return [3 /*break*/, 26];
+ child = _r.value;
+ return [4 /*yield*/, visit(child, scope)];
+ case 24:
+ _z.sent();
+ _z.label = 25;
+ case 25:
+ _r = _q.next();
+ return [3 /*break*/, 23];
+ case 26: return [3 /*break*/, 29];
+ case 27:
+ e_6_1 = _z.sent();
+ e_6 = { error: e_6_1 };
+ return [3 /*break*/, 29];
+ case 28:
+ try {
+ if (_r && !_r.done && (_y = _q.return)) _y.call(_q);
+ }
+ finally { if (e_6) throw e_6.error; }
+ return [7 /*endfinally*/];
+ case 29:
+ if (template.blockScope) {
+ scope.pop();
+ }
+ _z.label = 30;
+ case 30: return [2 /*return*/];
+ }
+ });
+ }
+ var variables, globals, locals, rootScope, seen, templates_1, templates_1_1, template, e_2_1;
+ var e_2, _a;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ variables = new VariableMap();
+ globals = new VariableMap();
+ locals = new VariableMap();
+ rootScope = new DummyScope(new Set());
+ seen = new Set();
+ _b.label = 1;
+ case 1:
+ _b.trys.push([1, 6, 7, 8]);
+ templates_1 = __values(templates), templates_1_1 = templates_1.next();
+ _b.label = 2;
+ case 2:
+ if (!!templates_1_1.done) return [3 /*break*/, 5];
+ template = templates_1_1.value;
+ return [4 /*yield*/, visit(template, rootScope)];
+ case 3:
+ _b.sent();
+ _b.label = 4;
+ case 4:
+ templates_1_1 = templates_1.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_2_1 = _b.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (templates_1_1 && !templates_1_1.done && (_a = templates_1.return)) _a.call(templates_1);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 8: return [2 /*return*/, {
+ variables: variables.asObject(),
+ globals: globals.asObject(),
+ locals: locals.asObject()
+ }];
+ }
+ });
+ }
+ /**
+ * Statically analyze a template and report variable usage.
+ */
+ function analyze(template, options) {
+ if (options === void 0) { options = {}; }
+ var opts = __assign(__assign({}, defaultStaticAnalysisOptions), options);
+ return toPromise(_analyze(template, opts.partials, false));
+ }
+ /**
+ * Statically analyze a template and report variable usage.
+ */
+ function analyzeSync(template, options) {
+ if (options === void 0) { options = {}; }
+ var opts = __assign(__assign({}, defaultStaticAnalysisOptions), options);
+ return toValueSync(_analyze(template, opts.partials, true));
+ }
+ /**
+ * A stack to manage scopes while traversing templates during static analysis.
+ */
+ var DummyScope = /** @class */ (function () {
+ function DummyScope(globals) {
+ this.stack = [{ names: globals, aliases: new Map() }];
+ }
+ /** Return true if `name` is in scope. */
+ DummyScope.prototype.has = function (name) {
+ var e_11, _a;
+ try {
+ for (var _b = __values(this.stack), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var scope = _c.value;
+ if (scope.names.has(name)) {
+ return true;
+ }
+ }
+ }
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_11) throw e_11.error; }
+ }
+ return false;
+ };
+ DummyScope.prototype.push = function (scope) {
+ this.stack.push({ names: scope, aliases: new Map() });
+ return this;
+ };
+ DummyScope.prototype.pop = function () {
+ var _a;
+ return (_a = this.stack.pop()) === null || _a === void 0 ? void 0 : _a.names;
+ };
+ // Add a name to the template scope.
+ DummyScope.prototype.add = function (name) {
+ this.stack[0].names.add(name);
+ };
+ /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */
+ DummyScope.prototype.alias = function (variable) {
+ var root = variable.segments[0];
+ if (!isString(root))
+ return undefined;
+ var alias = this.getAlias(root);
+ if (alias === undefined)
+ return undefined;
+ return new Variable(__spreadArray(__spreadArray([], __read(alias), false), __read(variable.segments.slice(1)), false), variable.location);
+ };
+ // TODO: `from` could be a path with multiple segments, like `include.x`.
+ DummyScope.prototype.setAlias = function (from, to) {
+ this.stack[this.stack.length - 1].aliases.set(from, to);
+ };
+ DummyScope.prototype.deleteAlias = function (name) {
+ this.stack[this.stack.length - 1].aliases.delete(name);
+ };
+ DummyScope.prototype.getAlias = function (name) {
+ var e_12, _a;
+ try {
+ for (var _b = __values(this.stack), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var scope = _c.value;
+ if (scope.aliases.has(name)) {
+ return scope.aliases.get(name);
+ }
+ // If a scope has defined `name`, then it masks aliases in parent scopes.
+ if (scope.names.has(name)) {
+ return undefined;
+ }
+ }
+ }
+ catch (e_12_1) { e_12 = { error: e_12_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_12) throw e_12.error; }
+ }
+ return undefined;
+ };
+ return DummyScope;
+ }());
+ function extractVariables(value) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!isValueToken(value)) return [3 /*break*/, 2];
+ return [5 /*yield**/, __values(extractValueTokenVariables(value))];
+ case 1:
+ _a.sent();
+ return [3 /*break*/, 4];
+ case 2:
+ if (!(value instanceof Value)) return [3 /*break*/, 4];
+ return [5 /*yield**/, __values(extractFilteredValueVariables(value))];
+ case 3:
+ _a.sent();
+ _a.label = 4;
+ case 4: return [2 /*return*/];
+ }
+ });
+ }
+ function extractFilteredValueVariables(value) {
+ var _a, _b, token, e_13_1, _c, _d, filter, _e, _f, arg, e_14_1, e_15_1;
+ var e_13, _g, e_15, _h, e_14, _j;
+ return __generator(this, function (_k) {
+ switch (_k.label) {
+ case 0:
+ _k.trys.push([0, 5, 6, 7]);
+ _a = __values(value.initial.postfix), _b = _a.next();
+ _k.label = 1;
+ case 1:
+ if (!!_b.done) return [3 /*break*/, 4];
+ token = _b.value;
+ if (!isValueToken(token)) return [3 /*break*/, 3];
+ return [5 /*yield**/, __values(extractValueTokenVariables(token))];
+ case 2:
+ _k.sent();
+ _k.label = 3;
+ case 3:
+ _b = _a.next();
+ return [3 /*break*/, 1];
+ case 4: return [3 /*break*/, 7];
+ case 5:
+ e_13_1 = _k.sent();
+ e_13 = { error: e_13_1 };
+ return [3 /*break*/, 7];
+ case 6:
+ try {
+ if (_b && !_b.done && (_g = _a.return)) _g.call(_a);
+ }
+ finally { if (e_13) throw e_13.error; }
+ return [7 /*endfinally*/];
+ case 7:
+ _k.trys.push([7, 20, 21, 22]);
+ _c = __values(value.filters), _d = _c.next();
+ _k.label = 8;
+ case 8:
+ if (!!_d.done) return [3 /*break*/, 19];
+ filter = _d.value;
+ _k.label = 9;
+ case 9:
+ _k.trys.push([9, 16, 17, 18]);
+ _e = (e_14 = void 0, __values(filter.args)), _f = _e.next();
+ _k.label = 10;
+ case 10:
+ if (!!_f.done) return [3 /*break*/, 15];
+ arg = _f.value;
+ if (!(isKeyValuePair(arg) && arg[1])) return [3 /*break*/, 12];
+ return [5 /*yield**/, __values(extractValueTokenVariables(arg[1]))];
+ case 11:
+ _k.sent();
+ return [3 /*break*/, 14];
+ case 12:
+ if (!isValueToken(arg)) return [3 /*break*/, 14];
+ return [5 /*yield**/, __values(extractValueTokenVariables(arg))];
+ case 13:
+ _k.sent();
+ _k.label = 14;
+ case 14:
+ _f = _e.next();
+ return [3 /*break*/, 10];
+ case 15: return [3 /*break*/, 18];
+ case 16:
+ e_14_1 = _k.sent();
+ e_14 = { error: e_14_1 };
+ return [3 /*break*/, 18];
+ case 17:
+ try {
+ if (_f && !_f.done && (_j = _e.return)) _j.call(_e);
+ }
+ finally { if (e_14) throw e_14.error; }
+ return [7 /*endfinally*/];
+ case 18:
+ _d = _c.next();
+ return [3 /*break*/, 8];
+ case 19: return [3 /*break*/, 22];
+ case 20:
+ e_15_1 = _k.sent();
+ e_15 = { error: e_15_1 };
+ return [3 /*break*/, 22];
+ case 21:
+ try {
+ if (_d && !_d.done && (_h = _c.return)) _h.call(_c);
+ }
+ finally { if (e_15) throw e_15.error; }
+ return [7 /*endfinally*/];
+ case 22: return [2 /*return*/];
+ }
+ });
+ }
+ function extractValueTokenVariables(token) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!isRangeToken(token)) return [3 /*break*/, 3];
+ return [5 /*yield**/, __values(extractValueTokenVariables(token.lhs))];
+ case 1:
+ _a.sent();
+ return [5 /*yield**/, __values(extractValueTokenVariables(token.rhs))];
+ case 2:
+ _a.sent();
+ return [3 /*break*/, 5];
+ case 3:
+ if (!isPropertyAccessToken(token)) return [3 /*break*/, 5];
+ return [4 /*yield*/, extractPropertyAccessVariable(token)];
+ case 4:
+ _a.sent();
+ _a.label = 5;
+ case 5: return [2 /*return*/];
+ }
+ });
+ }
+ function extractPropertyAccessVariable(token) {
+ var e_16, _a;
+ var segments = [];
+ // token is not guaranteed to have `file` set. We'll try to get it from a prop if not.
+ var file = token.file;
+ // Here we're flattening the first segment of a path if it is a nested path.
+ var root = token.props[0];
+ file = file || root.file;
+ if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) {
+ segments.push(root.content);
+ }
+ else if (isPropertyAccessToken(root)) {
+ // Flatten paths that start with a nested path.
+ segments.push.apply(segments, __spreadArray([], __read(extractPropertyAccessVariable(root).segments), false));
+ }
+ try {
+ for (var _b = __values(token.props.slice(1)), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var prop = _c.value;
+ file = file || prop.file;
+ if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) {
+ segments.push(prop.content);
+ }
+ else if (isPropertyAccessToken(prop)) {
+ segments.push(extractPropertyAccessVariable(prop));
+ }
+ }
+ }
+ catch (e_16_1) { e_16 = { error: e_16_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_16) throw e_16.error; }
+ }
+ var _d = __read(token.getPosition(), 2), row = _d[0], col = _d[1];
+ return new Variable(segments, {
+ row: row,
+ col: col,
+ file: file
+ });
+ }
+ // This is used to detect segments that can be represented with dot notation
+ // when creating a string representation of VariableSegments.
+ var RE_PROPERTY = /^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/;
+ /**
+ * Return a string representation of segments using dot notation where possible.
+ * @param segments - The property names and array indices that make up a path to a variable.
+ * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets.
+ */
+ function segmentsString(segments, bracketedRoot) {
+ var e_17, _a;
+ if (bracketedRoot === void 0) { bracketedRoot = false; }
+ var buf = [];
+ var root = segments[0];
+ if (isString(root)) {
+ if (!bracketedRoot || root.match(RE_PROPERTY)) {
+ buf.push("".concat(root));
+ }
+ else {
+ buf.push("['".concat(root, "']"));
+ }
+ }
+ try {
+ for (var _b = __values(segments.slice(1)), _c = _b.next(); !_c.done; _c = _b.next()) {
+ var segment = _c.value;
+ if (segment instanceof Variable) {
+ buf.push("[".concat(segmentsString(segment.segments), "]"));
+ }
+ else if (isString(segment)) {
+ if (segment.match(RE_PROPERTY)) {
+ buf.push(".".concat(segment));
+ }
+ else {
+ buf.push("['".concat(segment, "']"));
+ }
+ }
+ else {
+ buf.push("[".concat(segment, "]"));
+ }
+ }
+ }
+ catch (e_17_1) { e_17 = { error: e_17_1 }; }
+ finally {
+ try {
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+ }
+ finally { if (e_17) throw e_17.error; }
+ }
+ return buf.join('');
+ } + + var LookupType;
+ (function (LookupType) {
+ LookupType["Partials"] = "partials";
+ LookupType["Layouts"] = "layouts";
+ LookupType["Root"] = "root";
+ })(LookupType || (LookupType = {}));
+ var Loader = /** @class */ (function () {
+ function Loader(options) {
+ this.options = options;
+ if (options.relativeReference) {
+ var sep = options.fs.sep;
+ assert(sep, '`fs.sep` is required for relative reference');
+ var rRelativePath_1 = new RegExp(['.' + sep, '..' + sep, './', '../'].map(function (prefix) { return escapeRegex(prefix); }).join('|'));
+ this.shouldLoadRelative = function (referencedFile) { return rRelativePath_1.test(referencedFile); };
+ }
+ else {
+ this.shouldLoadRelative = function (_referencedFile) { return false; };
+ }
+ this.contains = this.options.fs.contains || (function () { return true; });
+ }
+ Loader.prototype.lookup = function (file, type, sync, currentFile) {
+ var fs, dirs, _a, _b, filepath, _c, e_1_1;
+ var e_1, _d;
+ return __generator(this, function (_e) {
+ switch (_e.label) {
+ case 0:
+ fs = this.options.fs;
+ dirs = this.options[type];
+ _e.label = 1;
+ case 1:
+ _e.trys.push([1, 8, 9, 10]);
+ _a = __values(this.candidates(file, dirs, currentFile, type !== LookupType.Root)), _b = _a.next();
+ _e.label = 2;
+ case 2:
+ if (!!_b.done) return [3 /*break*/, 7];
+ filepath = _b.value;
+ if (!sync) return [3 /*break*/, 3];
+ _c = fs.existsSync(filepath);
+ return [3 /*break*/, 5];
+ case 3: return [4 /*yield*/, fs.exists(filepath)];
+ case 4:
+ _c = _e.sent();
+ _e.label = 5;
+ case 5:
+ if (_c)
+ return [2 /*return*/, filepath];
+ _e.label = 6;
+ case 6:
+ _b = _a.next();
+ return [3 /*break*/, 2];
+ case 7: return [3 /*break*/, 10];
+ case 8:
+ e_1_1 = _e.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 10];
+ case 9:
+ try {
+ if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 10: throw this.lookupError(file, dirs);
+ }
+ });
+ };
+ Loader.prototype.candidates = function (file, dirs, currentFile, enforceRoot) {
+ var _a, fs, extname, referenced, dirs_1, dirs_1_1, dir, e_2_1, dirs_2, dirs_2_1, dir, referenced, e_3_1, filepath;
+ var e_2, _b, e_3, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ _a = this.options, fs = _a.fs, extname = _a.extname;
+ if (!(this.shouldLoadRelative(file) && currentFile)) return [3 /*break*/, 8];
+ referenced = fs.resolve(this.dirname(currentFile), file, extname);
+ _d.label = 1;
+ case 1:
+ _d.trys.push([1, 6, 7, 8]);
+ dirs_1 = __values(dirs), dirs_1_1 = dirs_1.next();
+ _d.label = 2;
+ case 2:
+ if (!!dirs_1_1.done) return [3 /*break*/, 5];
+ dir = dirs_1_1.value;
+ if (!(!enforceRoot || this.contains(dir, referenced))) return [3 /*break*/, 4];
+ // the relatively referenced file is within one of root dirs
+ return [4 /*yield*/, referenced];
+ case 3:
+ // the relatively referenced file is within one of root dirs
+ _d.sent();
+ return [3 /*break*/, 5];
+ case 4:
+ dirs_1_1 = dirs_1.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_2_1 = _d.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (dirs_1_1 && !dirs_1_1.done && (_b = dirs_1.return)) _b.call(dirs_1);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 8:
+ _d.trys.push([8, 13, 14, 15]);
+ dirs_2 = __values(dirs), dirs_2_1 = dirs_2.next();
+ _d.label = 9;
+ case 9:
+ if (!!dirs_2_1.done) return [3 /*break*/, 12];
+ dir = dirs_2_1.value;
+ referenced = fs.resolve(dir, file, extname);
+ if (!(!enforceRoot || this.contains(dir, referenced))) return [3 /*break*/, 11];
+ return [4 /*yield*/, referenced];
+ case 10:
+ _d.sent();
+ _d.label = 11;
+ case 11:
+ dirs_2_1 = dirs_2.next();
+ return [3 /*break*/, 9];
+ case 12: return [3 /*break*/, 15];
+ case 13:
+ e_3_1 = _d.sent();
+ e_3 = { error: e_3_1 };
+ return [3 /*break*/, 15];
+ case 14:
+ try {
+ if (dirs_2_1 && !dirs_2_1.done && (_c = dirs_2.return)) _c.call(dirs_2);
+ }
+ finally { if (e_3) throw e_3.error; }
+ return [7 /*endfinally*/];
+ case 15:
+ if (!(fs.fallback !== undefined)) return [3 /*break*/, 17];
+ filepath = fs.fallback(file);
+ if (!(filepath !== undefined)) return [3 /*break*/, 17];
+ return [4 /*yield*/, filepath];
+ case 16:
+ _d.sent();
+ _d.label = 17;
+ case 17: return [2 /*return*/];
+ }
+ });
+ };
+ Loader.prototype.dirname = function (path) {
+ var fs = this.options.fs;
+ assert(fs.dirname, '`fs.dirname` is required for relative reference');
+ return fs.dirname(path);
+ };
+ Loader.prototype.lookupError = function (file, roots) {
+ var err = new Error('ENOENT');
+ err.message = "ENOENT: Failed to lookup \"".concat(file, "\" in \"").concat(roots, "\"");
+ err.code = 'ENOENT';
+ return err;
+ };
+ return Loader;
+ }()); + + var Parser = /** @class */ (function () {
+ function Parser(liquid) {
+ this.liquid = liquid;
+ this.cache = this.liquid.options.cache;
+ this.fs = this.liquid.options.fs;
+ this.parseFile = this.cache ? this._parseFileCached : this._parseFile;
+ this.loader = new Loader(this.liquid.options);
+ this.parseLimit = new Limiter('parse length', liquid.options.parseLimit);
+ }
+ Parser.prototype.parse = function (html, filepath) {
+ html = String(html);
+ this.parseLimit.use(html.length);
+ var tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath);
+ var tokens = tokenizer.readTopLevelTokens(this.liquid.options);
+ return this.parseTokens(tokens);
+ };
+ Parser.prototype.parseTokens = function (tokens) {
+ var token;
+ var templates = [];
+ var errors = [];
+ while ((token = tokens.shift())) {
+ try {
+ templates.push(this.parseToken(token, tokens));
+ }
+ catch (err) {
+ if (this.liquid.options.catchAllErrors)
+ errors.push(err);
+ else
+ throw err;
+ }
+ }
+ if (errors.length)
+ throw new LiquidErrors(errors);
+ return templates;
+ };
+ Parser.prototype.parseToken = function (token, remainTokens) {
+ try {
+ if (isTagToken(token)) {
+ var TagClass = this.liquid.tags[token.name];
+ assert(TagClass, "tag \"".concat(token.name, "\" not found"));
+ return new TagClass(token, remainTokens, this.liquid, this);
+ }
+ if (isOutputToken(token)) {
+ return new Output(token, this.liquid);
+ }
+ return new HTML(token);
+ }
+ catch (e) {
+ if (LiquidError.is(e))
+ throw 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); });
+ };
+ Parser.prototype._parseFileCached = function (file, sync, type, currentFile) {
+ var cache, key, tpls, task, taskOrTpl, _a, err_1;
+ if (type === void 0) { type = LookupType.Root; }
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ cache = this.cache;
+ key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file;
+ return [4 /*yield*/, cache.read(key)];
+ case 1:
+ tpls = _b.sent();
+ if (tpls)
+ return [2 /*return*/, tpls];
+ task = this._parseFile(file, sync, type, currentFile);
+ if (!sync) return [3 /*break*/, 3];
+ return [4 /*yield*/, task];
+ case 2:
+ _a = _b.sent();
+ return [3 /*break*/, 4];
+ case 3:
+ _a = toPromise(task);
+ _b.label = 4;
+ case 4:
+ taskOrTpl = _a;
+ cache.write(key, taskOrTpl);
+ _b.label = 5;
+ case 5:
+ _b.trys.push([5, 7, , 8]);
+ return [4 /*yield*/, taskOrTpl];
+ case 6: return [2 /*return*/, _b.sent()];
+ case 7:
+ err_1 = _b.sent();
+ cache.remove(key);
+ throw err_1;
+ case 8: return [2 /*return*/];
+ }
+ });
+ };
+ Parser.prototype._parseFile = function (file, sync, type, currentFile) {
+ var filepath, _a, _b;
+ if (type === void 0) { type = LookupType.Root; }
+ return __generator(this, function (_c) {
+ switch (_c.label) {
+ case 0: return [4 /*yield*/, this.loader.lookup(file, type, sync, currentFile)];
+ case 1:
+ filepath = _c.sent();
+ _a = this.parse;
+ if (!sync) return [3 /*break*/, 2];
+ _b = this.fs.readFileSync(filepath);
+ return [3 /*break*/, 4];
+ case 2: return [4 /*yield*/, this.fs.readFile(filepath)];
+ case 3:
+ _b = _c.sent();
+ _c.label = 4;
+ case 4: return [2 /*return*/, _a.apply(this, [_b, filepath])];
+ }
+ });
+ };
+ return Parser;
+ }()); + + (function (TokenKind) {
+ TokenKind[TokenKind["Number"] = 1] = "Number";
+ TokenKind[TokenKind["Literal"] = 2] = "Literal";
+ TokenKind[TokenKind["Tag"] = 4] = "Tag";
+ TokenKind[TokenKind["Output"] = 8] = "Output";
+ TokenKind[TokenKind["HTML"] = 16] = "HTML";
+ TokenKind[TokenKind["Filter"] = 32] = "Filter";
+ TokenKind[TokenKind["Hash"] = 64] = "Hash";
+ TokenKind[TokenKind["PropertyAccess"] = 128] = "PropertyAccess";
+ TokenKind[TokenKind["Word"] = 256] = "Word";
+ TokenKind[TokenKind["Range"] = 512] = "Range";
+ TokenKind[TokenKind["Quoted"] = 1024] = "Quoted";
+ TokenKind[TokenKind["Operator"] = 2048] = "Operator";
+ TokenKind[TokenKind["FilteredValue"] = 4096] = "FilteredValue";
+ TokenKind[TokenKind["Delimited"] = 12] = "Delimited";
+ })(exports.TokenKind || (exports.TokenKind = {})); + + function isDelimitedToken(val) {
+ return !!(getKind(val) & exports.TokenKind.Delimited);
+ }
+ function isOperatorToken(val) {
+ return getKind(val) === exports.TokenKind.Operator;
+ }
+ function isHTMLToken(val) {
+ return getKind(val) === exports.TokenKind.HTML;
+ }
+ function isOutputToken(val) {
+ return getKind(val) === exports.TokenKind.Output;
+ }
+ function isTagToken(val) {
+ return getKind(val) === exports.TokenKind.Tag;
+ }
+ function isQuotedToken(val) {
+ return getKind(val) === exports.TokenKind.Quoted;
+ }
+ function isLiteralToken(val) {
+ return getKind(val) === exports.TokenKind.Literal;
+ }
+ function isNumberToken(val) {
+ return getKind(val) === exports.TokenKind.Number;
+ }
+ function isPropertyAccessToken(val) {
+ return getKind(val) === exports.TokenKind.PropertyAccess;
+ }
+ function isWordToken(val) {
+ return getKind(val) === exports.TokenKind.Word;
+ }
+ function isRangeToken(val) {
+ return getKind(val) === exports.TokenKind.Range;
+ }
+ function isValueToken(val) {
+ // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range
+ return (getKind(val) & 1667) > 0;
+ }
+ function getKind(val) {
+ return val ? val.kind : -1;
+ } + + var typeGuards = /*#__PURE__*/Object.freeze({ + __proto__: null, + isDelimitedToken: isDelimitedToken, + isOperatorToken: isOperatorToken, + isHTMLToken: isHTMLToken, + isOutputToken: isOutputToken, + isTagToken: isTagToken, + isQuotedToken: isQuotedToken, + isLiteralToken: isLiteralToken, + isNumberToken: isNumberToken, + isPropertyAccessToken: isPropertyAccessToken, + isWordToken: isWordToken, + isRangeToken: isRangeToken, + isValueToken: isValueToken + }); + + var Context = /** @class */ (function () {
+ function Context(env, opts, renderOptions, _a) {
+ if (env === void 0) { env = {}; }
+ if (opts === void 0) { opts = defaultOptions; }
+ if (renderOptions === void 0) { renderOptions = {}; }
+ var _b = _a === void 0 ? {} : _a, memoryLimit = _b.memoryLimit, renderLimit = _b.renderLimit;
+ var _c, _d, _e, _f, _g;
+ /**
+ * insert a Context-level empty scope,
+ * for tags like `{% capture %}` `{% assign %}` to operate
+ */
+ this.scopes = [{}];
+ this.registers = {};
+ this.breakCalled = false;
+ this.continueCalled = false;
+ this.sync = !!renderOptions.sync;
+ this.opts = opts;
+ this.globals = (_c = renderOptions.globals) !== null && _c !== void 0 ? _c : opts.globals;
+ this.environments = isObject(env) ? env : Object(env);
+ this.strictVariables = (_d = renderOptions.strictVariables) !== null && _d !== void 0 ? _d : this.opts.strictVariables;
+ this.ownPropertyOnly = (_e = renderOptions.ownPropertyOnly) !== null && _e !== void 0 ? _e : opts.ownPropertyOnly;
+ this.memoryLimit = memoryLimit !== null && memoryLimit !== void 0 ? memoryLimit : new Limiter('memory alloc', (_f = renderOptions.memoryLimit) !== null && _f !== void 0 ? _f : opts.memoryLimit);
+ this.renderLimit = renderLimit !== null && renderLimit !== void 0 ? renderLimit : new Limiter('template render', getPerformance().now() + ((_g = renderOptions.renderLimit) !== null && _g !== void 0 ? _g : opts.renderLimit));
+ }
+ Context.prototype.getRegister = function (key) {
+ return (this.registers[key] = this.registers[key] || {});
+ };
+ Context.prototype.setRegister = function (key, value) {
+ return (this.registers[key] = value);
+ };
+ Context.prototype.saveRegister = function () {
+ var _this = this;
+ var keys = [];
+ for (var _i = 0; _i < arguments.length; _i++) {
+ keys[_i] = arguments[_i];
+ }
+ return keys.map(function (key) { return [key, _this.getRegister(key)]; });
+ };
+ Context.prototype.restoreRegister = function (keyValues) {
+ var _this = this;
+ return keyValues.forEach(function (_a) {
+ var _b = __read(_a, 2), key = _b[0], value = _b[1];
+ return _this.setRegister(key, value);
+ });
+ };
+ Context.prototype.getAll = function () {
+ return __spreadArray([this.globals, this.environments], __read(this.scopes), false).reduce(function (ctx, val) { return __assign(ctx, val); }, {});
+ };
+ /**
+ * @deprecated use `_get()` or `getSync()` instead
+ */
+ Context.prototype.get = function (paths) {
+ return this.getSync(paths);
+ };
+ Context.prototype.getSync = function (paths) {
+ return toValueSync(this._get(paths));
+ };
+ Context.prototype._get = function (paths) {
+ var scope;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ scope = this.findScope(paths[0]) // first prop should always be a string
+ ;
+ return [4 /*yield*/, this._getFromScope(scope, paths)];
+ case 1: // first prop should always be a string
+ return [2 /*return*/, _a.sent()];
+ }
+ });
+ };
+ /**
+ * @deprecated use `_get()` instead
+ */
+ Context.prototype.getFromScope = function (scope, paths) {
+ return toValueSync(this._getFromScope(scope, paths));
+ };
+ Context.prototype._getFromScope = function (scope, paths, strictVariables) {
+ var i;
+ if (strictVariables === void 0) { strictVariables = this.strictVariables; }
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (isString(paths))
+ paths = paths.split('.');
+ i = 0;
+ _a.label = 1;
+ case 1:
+ if (!(i < paths.length)) return [3 /*break*/, 4];
+ return [4 /*yield*/, this.readProperty(scope, paths[i])];
+ case 2:
+ scope = _a.sent();
+ if (strictVariables && isUndefined(scope)) {
+ throw new InternalUndefinedVariableError(paths.slice(0, i + 1).join('.'));
+ }
+ _a.label = 3;
+ case 3:
+ i++;
+ return [3 /*break*/, 1];
+ case 4: return [2 /*return*/, scope];
+ }
+ });
+ };
+ Context.prototype.push = function (ctx) {
+ return this.scopes.push(ctx);
+ };
+ Context.prototype.pop = function () {
+ return this.scopes.pop();
+ };
+ Context.prototype.bottom = function () {
+ return this.scopes[0];
+ };
+ Context.prototype.spawn = function (scope) {
+ if (scope === void 0) { scope = {}; }
+ return new Context(scope, this.opts, {
+ sync: this.sync,
+ globals: this.globals,
+ strictVariables: this.strictVariables
+ }, {
+ renderLimit: this.renderLimit,
+ memoryLimit: this.memoryLimit
+ });
+ };
+ Context.prototype.findScope = function (key) {
+ for (var i = this.scopes.length - 1; i >= 0; i--) {
+ var candidate = this.scopes[i];
+ if (key in candidate)
+ return candidate;
+ }
+ if (key in this.environments)
+ return this.environments;
+ return this.globals;
+ };
+ Context.prototype.readProperty = function (obj, key) {
+ obj = toLiquid(obj);
+ key = toValue(key);
+ if (isNil(obj))
+ return obj;
+ if (isArray(obj) && key < 0)
+ return obj[obj.length + +key];
+ var value = readJSProperty(obj, key, this.ownPropertyOnly);
+ if (value === undefined && obj instanceof Drop)
+ return obj.liquidMethodMissing(key, this);
+ if (isFunction(value))
+ return value.call(obj);
+ if (key === 'size')
+ return readSize(obj);
+ else if (key === 'first')
+ return readFirst(obj);
+ else if (key === 'last')
+ return readLast(obj);
+ return value;
+ };
+ return Context;
+ }());
+ function readJSProperty(obj, key, ownPropertyOnly) {
+ if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop))
+ return undefined;
+ return obj[key];
+ }
+ function readFirst(obj) {
+ if (isArray(obj))
+ return obj[0];
+ return obj['first'];
+ }
+ function readLast(obj) {
+ if (isArray(obj))
+ return obj[obj.length - 1];
+ return obj['last'];
+ }
+ function readSize(obj) {
+ if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined)
+ return obj['size'];
+ if (isArray(obj) || isString(obj))
+ return obj.length;
+ if (typeof obj === 'object')
+ return Object.keys(obj).length;
+ } + + 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 abs = argumentsToNumber(Math.abs);
+ var at_least = argumentsToNumber(Math.max);
+ var at_most = argumentsToNumber(Math.min);
+ var ceil = argumentsToNumber(Math.ceil);
+ var divided_by = argumentsToNumber(function (dividend, divisor, integerArithmetic) {
+ if (integerArithmetic === void 0) { integerArithmetic = false; }
+ return integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor;
+ });
+ var floor = argumentsToNumber(Math.floor);
+ var minus = argumentsToNumber(function (v, arg) { return v - arg; });
+ var plus = argumentsToNumber(function (lhs, rhs) { return lhs + rhs; });
+ var modulo = argumentsToNumber(function (v, arg) { return v % arg; });
+ var times = argumentsToNumber(function (v, arg) { return v * arg; });
+ function round(v, arg) {
+ if (arg === void 0) { arg = 0; }
+ v = toNumber(v);
+ arg = toNumber(arg);
+ var amp = Math.pow(10, arg);
+ return Math.round(v * amp) / amp;
+ } + + var mathFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + abs: abs, + at_least: at_least, + at_most: at_most, + ceil: ceil, + divided_by: divided_by, + floor: floor, + minus: minus, + plus: plus, + modulo: modulo, + times: times, + round: round + }); + + var url_decode = function (x) { return decodeURIComponent(stringify(x)).replace(/\+/g, ' '); };
+ var url_encode = function (x) { return encodeURIComponent(stringify(x)).replace(/%20/g, '+'); };
+ var cgi_escape = function (x) { return encodeURIComponent(stringify(x))
+ .replace(/%20/g, '+')
+ .replace(/[!'()*]/g, function (c) { return '%' + c.charCodeAt(0).toString(16).toUpperCase(); }); };
+ var uri_escape = function (x) { return encodeURI(stringify(x))
+ .replace(/%5B/g, '[')
+ .replace(/%5D/g, ']'); };
+ var rSlugifyDefault = /[^\p{M}\p{L}\p{Nd}]+/ug;
+ var rSlugifyReplacers = {
+ 'raw': /\s+/g,
+ 'default': rSlugifyDefault,
+ 'pretty': /[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/ug,
+ 'ascii': /[^A-Za-z0-9]+/g,
+ 'latin': rSlugifyDefault,
+ 'none': null
+ };
+ function slugify(str, mode, cased) {
+ if (mode === void 0) { mode = 'default'; }
+ if (cased === void 0) { cased = false; }
+ str = stringify(str);
+ var replacer = rSlugifyReplacers[mode];
+ if (replacer) {
+ if (mode === 'latin')
+ str = removeAccents(str);
+ str = str.replace(replacer, '-').replace(/^-|-$/g, '');
+ }
+ return cased ? str : str.toLowerCase();
+ }
+ function removeAccents(str) {
+ return str.replace(/[àáâãäå]/g, 'a')
+ .replace(/[æ]/g, 'ae')
+ .replace(/[ç]/g, 'c')
+ .replace(/[èéêë]/g, 'e')
+ .replace(/[ìíîï]/g, 'i')
+ .replace(/[ð]/g, 'd')
+ .replace(/[ñ]/g, 'n')
+ .replace(/[òóôõöø]/g, 'o')
+ .replace(/[ùúûü]/g, 'u')
+ .replace(/[ýÿ]/g, 'y')
+ .replace(/[ß]/g, 'ss')
+ .replace(/[œ]/g, 'oe')
+ .replace(/[þ]/g, 'th')
+ .replace(/[ẞ]/g, 'SS')
+ .replace(/[Œ]/g, 'OE')
+ .replace(/[Þ]/g, 'TH');
+ } + + var urlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + url_decode: url_decode, + url_encode: url_encode, + cgi_escape: cgi_escape, + uri_escape: uri_escape, + slugify: slugify + }); + + var join = argumentsToValue(function (v, arg) {
+ var array = toArray(v);
+ var sep = isNil(arg) ? ' ' : stringify(arg);
+ var complexity = array.length * (1 + sep.length);
+ this.context.memoryLimit.use(complexity);
+ return array.join(sep);
+ });
+ var last$1 = argumentsToValue(function (v) { return isArrayLike(v) ? last(v) : ''; });
+ var first = argumentsToValue(function (v) { return isArrayLike(v) ? v[0] : ''; });
+ var reverse = argumentsToValue(function (v) {
+ var array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ return __spreadArray([], __read(array), false).reverse();
+ });
+ function sort(arr, property) {
+ var values, array, array_1, array_1_1, item, _a, _b, _c, _d, e_1_1;
+ var e_1, _e;
+ return __generator(this, function (_f) {
+ switch (_f.label) {
+ case 0:
+ values = [];
+ array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ _f.label = 1;
+ case 1:
+ _f.trys.push([1, 8, 9, 10]);
+ array_1 = __values(array), array_1_1 = array_1.next();
+ _f.label = 2;
+ case 2:
+ if (!!array_1_1.done) return [3 /*break*/, 7];
+ item = array_1_1.value;
+ _b = (_a = values).push;
+ _c = [item];
+ if (!property) return [3 /*break*/, 4];
+ return [4 /*yield*/, this.context._getFromScope(item, stringify(property).split('.'), false)];
+ case 3:
+ _d = _f.sent();
+ return [3 /*break*/, 5];
+ case 4:
+ _d = item;
+ _f.label = 5;
+ case 5:
+ _b.apply(_a, [_c.concat([
+ _d
+ ])]);
+ _f.label = 6;
+ case 6:
+ array_1_1 = array_1.next();
+ return [3 /*break*/, 2];
+ case 7: return [3 /*break*/, 10];
+ case 8:
+ e_1_1 = _f.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 10];
+ case 9:
+ try {
+ if (array_1_1 && !array_1_1.done && (_e = array_1.return)) _e.call(array_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 10: return [2 /*return*/, values.sort(function (lhs, rhs) {
+ var lvalue = lhs[1];
+ var rvalue = rhs[1];
+ return lvalue < rvalue ? -1 : (lvalue > rvalue ? 1 : 0);
+ }).map(function (tuple) { return tuple[0]; })];
+ }
+ });
+ }
+ function sort_natural(input, property) {
+ var propertyString = stringify(property);
+ var compare = property === undefined
+ ? caseInsensitiveCompare
+ : function (lhs, rhs) { return caseInsensitiveCompare(lhs[propertyString], rhs[propertyString]); };
+ var array = toArray(input);
+ this.context.memoryLimit.use(array.length);
+ return __spreadArray([], __read(array), false).sort(compare);
+ }
+ var size = function (v) { return (v && v.length) || 0; };
+ function map(arr, property) {
+ var results, array, array_2, array_2_1, item, _a, _b, e_2_1;
+ var e_2, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ results = [];
+ array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ _d.label = 1;
+ case 1:
+ _d.trys.push([1, 6, 7, 8]);
+ array_2 = __values(array), array_2_1 = array_2.next();
+ _d.label = 2;
+ case 2:
+ if (!!array_2_1.done) return [3 /*break*/, 5];
+ item = array_2_1.value;
+ _b = (_a = results).push;
+ return [4 /*yield*/, this.context._getFromScope(item, stringify(property), false)];
+ case 3:
+ _b.apply(_a, [_d.sent()]);
+ _d.label = 4;
+ case 4:
+ array_2_1 = array_2.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_2_1 = _d.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (array_2_1 && !array_2_1.done && (_c = array_2.return)) _c.call(array_2);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 8: return [2 /*return*/, results];
+ }
+ });
+ }
+ function sum(arr, property) {
+ var sum, array, array_3, array_3_1, item, data, _a, _b, e_3_1;
+ var e_3, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ sum = 0;
+ array = toArray(arr);
+ _d.label = 1;
+ case 1:
+ _d.trys.push([1, 8, 9, 10]);
+ array_3 = __values(array), array_3_1 = array_3.next();
+ _d.label = 2;
+ case 2:
+ if (!!array_3_1.done) return [3 /*break*/, 7];
+ item = array_3_1.value;
+ _a = Number;
+ if (!property) return [3 /*break*/, 4];
+ return [4 /*yield*/, this.context._getFromScope(item, stringify(property), false)];
+ case 3:
+ _b = _d.sent();
+ return [3 /*break*/, 5];
+ case 4:
+ _b = item;
+ _d.label = 5;
+ case 5:
+ data = _a.apply(void 0, [_b]);
+ sum += Number.isNaN(data) ? 0 : data;
+ _d.label = 6;
+ case 6:
+ array_3_1 = array_3.next();
+ return [3 /*break*/, 2];
+ case 7: return [3 /*break*/, 10];
+ case 8:
+ e_3_1 = _d.sent();
+ e_3 = { error: e_3_1 };
+ return [3 /*break*/, 10];
+ case 9:
+ try {
+ if (array_3_1 && !array_3_1.done && (_c = array_3.return)) _c.call(array_3);
+ }
+ finally { if (e_3) throw e_3.error; }
+ return [7 /*endfinally*/];
+ case 10: return [2 /*return*/, sum];
+ }
+ });
+ }
+ function compact(arr) {
+ var array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ return array.filter(function (x) { return !isNil(toValue(x)); });
+ }
+ function concat(v, arg) {
+ if (arg === void 0) { arg = []; }
+ var lhs = toArray(v);
+ var rhs = toArray(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return lhs.concat(rhs);
+ }
+ function push(v, arg) {
+ return concat.call(this, v, [arg]);
+ }
+ function unshift(v, arg) {
+ var array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ var clone = __spreadArray([], __read(array), false);
+ clone.unshift(arg);
+ return clone;
+ }
+ function pop(v) {
+ var clone = __spreadArray([], __read(toArray(v)), false);
+ clone.pop();
+ return clone;
+ }
+ function shift(v) {
+ var array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ var clone = __spreadArray([], __read(array), false);
+ clone.shift();
+ return clone;
+ }
+ function slice(v, begin, length) {
+ if (length === void 0) { length = 1; }
+ v = toValue(v);
+ if (isNil(v))
+ return [];
+ if (!isArray(v))
+ v = stringify(v);
+ begin = begin < 0 ? v.length + begin : begin;
+ this.context.memoryLimit.use(length);
+ return v.slice(begin, begin + length);
+ }
+ function expectedMatcher(expected) {
+ var _this = this;
+ if (this.context.opts.jekyllWhere) {
+ return function (v) { return EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected)); };
+ }
+ else if (expected === undefined) {
+ return function (v) { return isTruthy(v, _this.context); };
+ }
+ else {
+ return function (v) { return equals(v, expected); };
+ }
+ }
+ function filter(include, arr, property, expected) {
+ var values, token, arr_1, arr_1_1, item, _a, _b, e_4_1, matcher;
+ var e_4, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ values = [];
+ arr = toArray(arr);
+ this.context.memoryLimit.use(arr.length);
+ token = new Tokenizer(stringify(property)).readScopeValue();
+ _d.label = 1;
+ case 1:
+ _d.trys.push([1, 6, 7, 8]);
+ arr_1 = __values(arr), arr_1_1 = arr_1.next();
+ _d.label = 2;
+ case 2:
+ if (!!arr_1_1.done) return [3 /*break*/, 5];
+ item = arr_1_1.value;
+ _b = (_a = values).push;
+ return [4 /*yield*/, evalToken(token, this.context.spawn(item))];
+ case 3:
+ _b.apply(_a, [_d.sent()]);
+ _d.label = 4;
+ case 4:
+ arr_1_1 = arr_1.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_4_1 = _d.sent();
+ e_4 = { error: e_4_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (arr_1_1 && !arr_1_1.done && (_c = arr_1.return)) _c.call(arr_1);
+ }
+ finally { if (e_4) throw e_4.error; }
+ return [7 /*endfinally*/];
+ case 8:
+ matcher = expectedMatcher.call(this, expected);
+ return [2 /*return*/, arr.filter(function (_, i) { return matcher(values[i]) === include; })];
+ }
+ });
+ }
+ function filter_exp(include, arr, itemName, exp) {
+ var filtered, keyTemplate, array, array_4, array_4_1, item, value, e_5_1;
+ var e_5, _a, _b;
+ return __generator(this, function (_c) {
+ switch (_c.label) {
+ case 0:
+ filtered = [];
+ keyTemplate = new Value(stringify(exp), this.liquid);
+ array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ _c.label = 1;
+ case 1:
+ _c.trys.push([1, 6, 7, 8]);
+ array_4 = __values(array), array_4_1 = array_4.next();
+ _c.label = 2;
+ case 2:
+ if (!!array_4_1.done) return [3 /*break*/, 5];
+ item = array_4_1.value;
+ this.context.push((_b = {}, _b[itemName] = item, _b));
+ return [4 /*yield*/, keyTemplate.value(this.context)];
+ case 3:
+ value = _c.sent();
+ this.context.pop();
+ if (value === include)
+ filtered.push(item);
+ _c.label = 4;
+ case 4:
+ array_4_1 = array_4.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_5_1 = _c.sent();
+ e_5 = { error: e_5_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (array_4_1 && !array_4_1.done && (_a = array_4.return)) _a.call(array_4);
+ }
+ finally { if (e_5) throw e_5.error; }
+ return [7 /*endfinally*/];
+ case 8: return [2 /*return*/, filtered];
+ }
+ });
+ }
+ function where(arr, property, expected) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(filter.call(this, true, arr, property, expected))];
+ case 1: return [2 /*return*/, _a.sent()];
+ }
+ });
+ }
+ function reject(arr, property, expected) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(filter.call(this, false, arr, property, expected))];
+ case 1: return [2 /*return*/, _a.sent()];
+ }
+ });
+ }
+ function where_exp(arr, itemName, exp) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(filter_exp.call(this, true, arr, itemName, exp))];
+ case 1: return [2 /*return*/, _a.sent()];
+ }
+ });
+ }
+ function reject_exp(arr, itemName, exp) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(filter_exp.call(this, false, arr, itemName, exp))];
+ case 1: return [2 /*return*/, _a.sent()];
+ }
+ });
+ }
+ function group_by(arr, property) {
+ var map, token, arr_2, arr_2_1, item, key, e_6_1;
+ var e_6, _a;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ map = new Map();
+ arr = toEnumerable(arr);
+ token = new Tokenizer(stringify(property)).readScopeValue();
+ this.context.memoryLimit.use(arr.length);
+ _b.label = 1;
+ case 1:
+ _b.trys.push([1, 6, 7, 8]);
+ arr_2 = __values(arr), arr_2_1 = arr_2.next();
+ _b.label = 2;
+ case 2:
+ if (!!arr_2_1.done) return [3 /*break*/, 5];
+ item = arr_2_1.value;
+ return [4 /*yield*/, evalToken(token, this.context.spawn(item))];
+ case 3:
+ key = _b.sent();
+ if (!map.has(key))
+ map.set(key, []);
+ map.get(key).push(item);
+ _b.label = 4;
+ case 4:
+ arr_2_1 = arr_2.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_6_1 = _b.sent();
+ e_6 = { error: e_6_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (arr_2_1 && !arr_2_1.done && (_a = arr_2.return)) _a.call(arr_2);
+ }
+ finally { if (e_6) throw e_6.error; }
+ return [7 /*endfinally*/];
+ case 8: return [2 /*return*/, __spreadArray([], __read(map.entries()), false).map(function (_a) {
+ var _b = __read(_a, 2), name = _b[0], items = _b[1];
+ return ({ name: name, items: items });
+ })];
+ }
+ });
+ }
+ function group_by_exp(arr, itemName, exp) {
+ var map, keyTemplate, arr_3, arr_3_1, item, key, e_7_1;
+ var e_7, _a, _b;
+ return __generator(this, function (_c) {
+ switch (_c.label) {
+ case 0:
+ map = new Map();
+ keyTemplate = new Value(stringify(exp), this.liquid);
+ arr = toEnumerable(arr);
+ this.context.memoryLimit.use(arr.length);
+ _c.label = 1;
+ case 1:
+ _c.trys.push([1, 6, 7, 8]);
+ arr_3 = __values(arr), arr_3_1 = arr_3.next();
+ _c.label = 2;
+ case 2:
+ if (!!arr_3_1.done) return [3 /*break*/, 5];
+ item = arr_3_1.value;
+ this.context.push((_b = {}, _b[itemName] = item, _b));
+ return [4 /*yield*/, keyTemplate.value(this.context)];
+ case 3:
+ key = _c.sent();
+ this.context.pop();
+ if (!map.has(key))
+ map.set(key, []);
+ map.get(key).push(item);
+ _c.label = 4;
+ case 4:
+ arr_3_1 = arr_3.next();
+ return [3 /*break*/, 2];
+ case 5: return [3 /*break*/, 8];
+ case 6:
+ e_7_1 = _c.sent();
+ e_7 = { error: e_7_1 };
+ return [3 /*break*/, 8];
+ case 7:
+ try {
+ if (arr_3_1 && !arr_3_1.done && (_a = arr_3.return)) _a.call(arr_3);
+ }
+ finally { if (e_7) throw e_7.error; }
+ return [7 /*endfinally*/];
+ case 8: return [2 /*return*/, __spreadArray([], __read(map.entries()), false).map(function (_a) {
+ var _b = __read(_a, 2), name = _b[0], items = _b[1];
+ return ({ name: name, items: items });
+ })];
+ }
+ });
+ }
+ function search(arr, property, expected) {
+ var token, array, matcher, index, value;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ token = new Tokenizer(stringify(property)).readScopeValue();
+ array = toArray(arr);
+ matcher = expectedMatcher.call(this, expected);
+ index = 0;
+ _a.label = 1;
+ case 1:
+ if (!(index < array.length)) return [3 /*break*/, 4];
+ return [4 /*yield*/, evalToken(token, this.context.spawn(array[index]))];
+ case 2:
+ value = _a.sent();
+ if (matcher(value))
+ return [2 /*return*/, [index, array[index]]];
+ _a.label = 3;
+ case 3:
+ index++;
+ return [3 /*break*/, 1];
+ case 4: return [2 /*return*/];
+ }
+ });
+ }
+ function search_exp(arr, itemName, exp) {
+ var predicate, array, index, value;
+ var _a;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ predicate = new Value(stringify(exp), this.liquid);
+ array = toArray(arr);
+ index = 0;
+ _b.label = 1;
+ case 1:
+ if (!(index < array.length)) return [3 /*break*/, 4];
+ this.context.push((_a = {}, _a[itemName] = array[index], _a));
+ return [4 /*yield*/, predicate.value(this.context)];
+ case 2:
+ value = _b.sent();
+ this.context.pop();
+ if (value)
+ return [2 /*return*/, [index, array[index]]];
+ _b.label = 3;
+ case 3:
+ index++;
+ return [3 /*break*/, 1];
+ case 4: return [2 /*return*/];
+ }
+ });
+ }
+ function has(arr, property, expected) {
+ var result;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(search.call(this, arr, property, expected))];
+ case 1:
+ result = _a.sent();
+ return [2 /*return*/, !!result];
+ }
+ });
+ }
+ function has_exp(arr, itemName, exp) {
+ var result;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(search_exp.call(this, arr, itemName, exp))];
+ case 1:
+ result = _a.sent();
+ return [2 /*return*/, !!result];
+ }
+ });
+ }
+ function find_index(arr, property, expected) {
+ var result;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(search.call(this, arr, property, expected))];
+ case 1:
+ result = _a.sent();
+ return [2 /*return*/, result ? result[0] : undefined];
+ }
+ });
+ }
+ function find_index_exp(arr, itemName, exp) {
+ var result;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(search_exp.call(this, arr, itemName, exp))];
+ case 1:
+ result = _a.sent();
+ return [2 /*return*/, result ? result[0] : undefined];
+ }
+ });
+ }
+ function find(arr, property, expected) {
+ var result;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(search.call(this, arr, property, expected))];
+ case 1:
+ result = _a.sent();
+ return [2 /*return*/, result ? result[1] : undefined];
+ }
+ });
+ }
+ function find_exp(arr, itemName, exp) {
+ var result;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(search_exp.call(this, arr, itemName, exp))];
+ case 1:
+ result = _a.sent();
+ return [2 /*return*/, result ? result[1] : undefined];
+ }
+ });
+ }
+ function uniq(arr) {
+ arr = toArray(arr);
+ this.context.memoryLimit.use(arr.length);
+ return __spreadArray([], __read(new Set(arr)), false);
+ }
+ function sample(v, count) {
+ if (count === void 0) { count = 1; }
+ v = toValue(v);
+ if (isNil(v))
+ return [];
+ if (!isArray(v))
+ v = stringify(v);
+ this.context.memoryLimit.use(count);
+ var shuffled = __spreadArray([], __read(v), false).sort(function () { return Math.random() - 0.5; });
+ if (count === 1)
+ return shuffled[0];
+ return shuffled.slice(0, count);
+ } + + var arrayFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + join: join, + last: last$1, + first: first, + reverse: reverse, + sort: sort, + sort_natural: sort_natural, + size: size, + map: map, + sum: sum, + compact: compact, + concat: concat, + push: push, + unshift: unshift, + pop: pop, + shift: shift, + slice: slice, + where: where, + reject: reject, + where_exp: where_exp, + reject_exp: reject_exp, + group_by: group_by, + group_by_exp: group_by_exp, + has: has, + has_exp: has_exp, + find_index: find_index, + find_index_exp: find_index_exp, + find: find, + find_exp: find_exp, + uniq: uniq, + sample: sample + }); + + function date(v, format, timezoneOffset) {
+ var _a, _b, _c;
+ var size = ((_a = v === null || v === void 0 ? void 0 : v.length) !== null && _a !== void 0 ? _a : 0) + ((_b = format === null || format === void 0 ? void 0 : format.length) !== null && _b !== void 0 ? _b : 0) + ((_c = timezoneOffset === null || timezoneOffset === void 0 ? void 0 : timezoneOffset.length) !== null && _c !== void 0 ? _c : 0);
+ this.context.memoryLimit.use(size);
+ var date = parseDate(v, this.context.opts, timezoneOffset);
+ if (!date)
+ return v;
+ format = toValue(format);
+ format = isNil(format) ? this.context.opts.dateFormat : stringify(format);
+ return strftime(date, format);
+ }
+ function date_to_xmlschema(v) {
+ return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z');
+ }
+ function date_to_rfc822(v) {
+ return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z');
+ }
+ function date_to_string(v, type, style) {
+ return stringify_date.call(this, v, '%b', type, style);
+ }
+ function date_to_long_string(v, type, style) {
+ return stringify_date.call(this, v, '%B', type, style);
+ }
+ function stringify_date(v, month_type, type, style) {
+ var date = parseDate(v, this.context.opts);
+ if (!date)
+ return v;
+ if (type === 'ordinal') {
+ var d = date.getDate();
+ return style === 'US'
+ ? strftime(date, "".concat(month_type, " ").concat(d, "%q, %Y"))
+ : strftime(date, "".concat(d, "%q ").concat(month_type, " %Y"));
+ }
+ return strftime(date, "%d ".concat(month_type, " %Y"));
+ }
+ function parseDate(v, opts, timezoneOffset) {
+ var date;
+ var defaultTimezoneOffset = timezoneOffset !== null && timezoneOffset !== void 0 ? timezoneOffset : opts.timezoneOffset;
+ var locale = opts.locale;
+ v = toValue(v);
+ if (v === 'now' || v === 'today') {
+ date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset);
+ }
+ else if (isNumber(v)) {
+ date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset);
+ }
+ else if (isString(v)) {
+ if (/^\d+$/.test(v)) {
+ date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset);
+ }
+ else if (opts.preserveTimezones && timezoneOffset === undefined) {
+ date = LiquidDate.createDateFixedToTimezone(v, locale);
+ }
+ else {
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
+ }
+ }
+ else {
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
+ }
+ return date.valid() ? date : undefined;
+ } + + var dateFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + date: date, + date_to_xmlschema: date_to_xmlschema, + date_to_rfc822: date_to_rfc822, + date_to_string: date_to_string, + date_to_long_string: date_to_long_string + }); + + /**
+ * String related filters
+ *
+ * * prefer stringify() to String() since `undefined`, `null` should eval ''
+ */
+ var rCJKWord = /[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu;
+ // Word boundary followed by word characters (for detecting words)
+ var rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu;
+ function append(v, arg) {
+ assert(arguments.length === 2, 'append expect 2 arguments');
+ var lhs = stringify(v);
+ var rhs = stringify(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return lhs + rhs;
+ }
+ function prepend(v, arg) {
+ assert(arguments.length === 2, 'prepend expect 2 arguments');
+ var lhs = stringify(v);
+ var rhs = stringify(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return rhs + lhs;
+ }
+ function lstrip(v, chars) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str.replace(new RegExp("^[".concat(chars, "]+"), 'g'), '');
+ }
+ return str.replace(/^\s+/, '');
+ }
+ function downcase(v) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.toLowerCase();
+ }
+ function upcase(v) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return stringify(str).toUpperCase();
+ }
+ function remove(v, arg) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.split(stringify(arg)).join('');
+ }
+ function remove_first(v, l) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(stringify(l), '');
+ }
+ function remove_last(v, l) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ var pattern = stringify(l);
+ var index = str.lastIndexOf(pattern);
+ if (index === -1)
+ return str;
+ return str.substring(0, index) + str.substring(index + pattern.length);
+ }
+ function rstrip(str, chars) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str.replace(new RegExp("[".concat(chars, "]+$"), 'g'), '');
+ }
+ return str.replace(/\s+$/, '');
+ }
+ function split(v, arg) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ var arr = str.split(stringify(arg));
+ // align to ruby split, which is the behavior of shopify/liquid
+ // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split
+ while (arr.length && arr[arr.length - 1] === '')
+ arr.pop();
+ return arr;
+ }
+ function strip(v, chars) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str
+ .replace(new RegExp("^[".concat(chars, "]+"), 'g'), '')
+ .replace(new RegExp("[".concat(chars, "]+$"), 'g'), '');
+ }
+ return str.trim();
+ }
+ function strip_newlines(v) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\r?\n/gm, '');
+ }
+ function capitalize(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
+ }
+ function replace(v, pattern, replacement) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.split(stringify(pattern)).join(replacement);
+ }
+ function replace_first(v, arg1, arg2) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(stringify(arg1), arg2);
+ }
+ function replace_last(v, arg1, arg2) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ var pattern = stringify(arg1);
+ var index = str.lastIndexOf(pattern);
+ if (index === -1)
+ return str;
+ var replacement = stringify(arg2);
+ return str.substring(0, index) + replacement + str.substring(index + pattern.length);
+ }
+ function truncate(v, l, o) {
+ if (l === void 0) { l = 50; }
+ if (o === void 0) { o = '...'; }
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (str.length <= l)
+ return v;
+ return str.substring(0, l - o.length) + o;
+ }
+ function truncatewords(v, words, o) {
+ if (words === void 0) { words = 15; }
+ if (o === void 0) { o = '...'; }
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ var arr = str.split(/\s+/);
+ if (words <= 0)
+ words = 1;
+ var ret = arr.slice(0, words).join(' ');
+ if (arr.length >= words)
+ ret += o;
+ return ret;
+ }
+ function normalize_whitespace(v) {
+ var str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\s+/g, ' ');
+ }
+ function number_of_words(input, mode) {
+ var str = stringify(input);
+ this.context.memoryLimit.use(str.length);
+ input = str.trim();
+ if (!input)
+ return 0;
+ switch (mode) {
+ case 'cjk':
+ // Count CJK characters and words
+ return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length;
+ case 'auto':
+ // Count CJK characters, if none, count words
+ return rCJKWord.test(input)
+ ? input.match(rCJKWord).length + (input.match(rNonCJKWord) || []).length
+ : input.split(/\s+/).length;
+ default:
+ // Count words only
+ return input.split(/\s+/).length;
+ }
+ }
+ function array_to_sentence_string(array, connector) {
+ if (connector === void 0) { connector = 'and'; }
+ this.context.memoryLimit.use(array.length);
+ switch (array.length) {
+ case 0:
+ return '';
+ case 1:
+ return array[0];
+ case 2:
+ return "".concat(array[0], " ").concat(connector, " ").concat(array[1]);
+ default:
+ return "".concat(array.slice(0, -1).join(', '), ", ").concat(connector, " ").concat(array[array.length - 1]);
+ }
+ } + + var stringFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + append: append, + prepend: prepend, + lstrip: lstrip, + downcase: downcase, + upcase: upcase, + remove: remove, + remove_first: remove_first, + remove_last: remove_last, + rstrip: rstrip, + split: split, + strip: strip, + strip_newlines: strip_newlines, + capitalize: capitalize, + replace: replace, + replace_first: replace_first, + replace_last: replace_last, + truncate: truncate, + truncatewords: truncatewords, + normalize_whitespace: normalize_whitespace, + number_of_words: number_of_words, + array_to_sentence_string: array_to_sentence_string + }); + + var filters = __assign(__assign(__assign(__assign(__assign(__assign(__assign({}, htmlFilters), mathFilters), urlFilters), arrayFilters), dateFilters), stringFilters), misc); + + var default_1 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ _this.identifier = _this.tokenizer.readIdentifier();
+ _this.key = _this.identifier.content;
+ _this.tokenizer.assert(_this.key, 'expected variable name');
+ _this.tokenizer.skipBlank();
+ _this.tokenizer.assert(_this.tokenizer.peek() === '=', 'expected "="');
+ _this.tokenizer.advance();
+ _this.value = new Value(_this.tokenizer.readFilteredValue(), _this.liquid);
+ return _this;
+ }
+ default_1.prototype.render = function (ctx) {
+ var _a, _b;
+ return __generator(this, function (_c) {
+ switch (_c.label) {
+ case 0:
+ _a = ctx.bottom();
+ _b = this.key;
+ return [4 /*yield*/, this.value.value(ctx, this.liquid.options.lenientIf)];
+ case 1:
+ _a[_b] = _c.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.arguments = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.value];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.localScope = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.identifier];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ return default_1;
+ }(Tag)); + + var MODIFIERS = ['offset', 'limit', 'reversed'];
+ var default_1$1 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid, parser) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ var variable = _this.tokenizer.readIdentifier();
+ var inStr = _this.tokenizer.readIdentifier();
+ var collection = _this.tokenizer.readValue();
+ if (!variable.size() || inStr.content !== 'in' || !collection) {
+ throw new Error("illegal tag: ".concat(token.getText()));
+ }
+ _this.variable = variable.content;
+ _this.collection = collection;
+ _this.hash = new Hash(_this.tokenizer, liquid.options.keyValueSeparator);
+ _this.templates = [];
+ _this.elseTemplates = [];
+ var p;
+ var stream = parser.parseStream(remainTokens)
+ .on('start', function () { return (p = _this.templates); })
+ .on('tag:else', function (tag) { assertEmpty(tag.args); p = _this.elseTemplates; })
+ .on('tag:endfor', function (tag) { assertEmpty(tag.args); stream.stop(); })
+ .on('template', function (tpl) { return p.push(tpl); })
+ .on('end', function () { throw new Error("tag ".concat(token.getText(), " not closed")); });
+ stream.start();
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var r, collection, _a, continueKey, hash, modifiers, scope, collection_1, collection_1_1, item, e_1_1;
+ var e_1, _b;
+ return __generator(this, function (_c) {
+ switch (_c.label) {
+ case 0:
+ r = this.liquid.renderer;
+ _a = toEnumerable;
+ return [4 /*yield*/, evalToken(this.collection, ctx)];
+ case 1:
+ collection = _a.apply(void 0, [_c.sent()]);
+ if (!!collection.length) return [3 /*break*/, 3];
+ return [4 /*yield*/, r.renderTemplates(this.elseTemplates, ctx, emitter)];
+ case 2:
+ _c.sent();
+ return [2 /*return*/];
+ case 3:
+ continueKey = 'continue-' + this.variable + '-' + this.collection.getText();
+ ctx.push({ continue: ctx.getRegister(continueKey) });
+ return [4 /*yield*/, this.hash.render(ctx)];
+ case 4:
+ hash = _c.sent();
+ ctx.pop();
+ modifiers = this.liquid.options.orderedFilterParameters
+ ? Object.keys(hash).filter(function (x) { return MODIFIERS.includes(x); })
+ : MODIFIERS.filter(function (x) { return hash[x] !== undefined; });
+ collection = modifiers.reduce(function (collection, modifier) {
+ if (modifier === 'offset')
+ return offset(collection, hash['offset']);
+ if (modifier === 'limit')
+ return limit(collection, hash['limit']);
+ return reversed(collection);
+ }, collection);
+ ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length);
+ scope = { forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) };
+ ctx.push(scope);
+ _c.label = 5;
+ case 5:
+ _c.trys.push([5, 10, 11, 12]);
+ collection_1 = __values(collection), collection_1_1 = collection_1.next();
+ _c.label = 6;
+ case 6:
+ if (!!collection_1_1.done) return [3 /*break*/, 9];
+ item = collection_1_1.value;
+ scope[this.variable] = item;
+ ctx.continueCalled = ctx.breakCalled = false;
+ return [4 /*yield*/, r.renderTemplates(this.templates, ctx, emitter)];
+ case 7:
+ _c.sent();
+ if (ctx.breakCalled)
+ return [3 /*break*/, 9];
+ scope.forloop.next();
+ _c.label = 8;
+ case 8:
+ collection_1_1 = collection_1.next();
+ return [3 /*break*/, 6];
+ case 9: return [3 /*break*/, 12];
+ case 10:
+ e_1_1 = _c.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 12];
+ case 11:
+ try {
+ if (collection_1_1 && !collection_1_1.done && (_b = collection_1.return)) _b.call(collection_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 12:
+ ctx.continueCalled = ctx.breakCalled = false;
+ ctx.pop();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function () {
+ var templates;
+ return __generator(this, function (_a) {
+ templates = this.templates.slice();
+ if (this.elseTemplates) {
+ templates.push.apply(templates, __spreadArray([], __read(this.elseTemplates), false));
+ }
+ return [2 /*return*/, templates];
+ });
+ };
+ default_1.prototype.arguments = function () {
+ var _a, _b, v, e_2_1;
+ var e_2, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0: return [4 /*yield*/, this.collection];
+ case 1:
+ _d.sent();
+ _d.label = 2;
+ case 2:
+ _d.trys.push([2, 7, 8, 9]);
+ _a = __values(Object.values(this.hash.hash)), _b = _a.next();
+ _d.label = 3;
+ case 3:
+ if (!!_b.done) return [3 /*break*/, 6];
+ v = _b.value;
+ if (!isValueToken(v)) return [3 /*break*/, 5];
+ return [4 /*yield*/, v];
+ case 4:
+ _d.sent();
+ _d.label = 5;
+ case 5:
+ _b = _a.next();
+ return [3 /*break*/, 3];
+ case 6: return [3 /*break*/, 9];
+ case 7:
+ e_2_1 = _d.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 9];
+ case 8:
+ try {
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 9: return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.blockScope = function () {
+ return [this.variable, 'forloop'];
+ };
+ return default_1;
+ }(Tag));
+ function reversed(arr) {
+ return __spreadArray([], __read(arr), false).reverse();
+ }
+ function offset(arr, count) {
+ return arr.slice(count);
+ }
+ function limit(arr, count) {
+ return arr.slice(0, count);
+ } + + var default_1$2 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(tagToken, remainTokens, liquid, parser) {
+ var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
+ _this.templates = [];
+ _this.identifier = _this.readVariable();
+ _this.variable = _this.identifier.content;
+ while (remainTokens.length) {
+ var token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endcapture')
+ return _this;
+ _this.templates.push(parser.parseToken(token, remainTokens));
+ }
+ throw new Error("tag ".concat(tagToken.getText(), " not closed"));
+ }
+ default_1.prototype.readVariable = function () {
+ var ident = this.tokenizer.readIdentifier();
+ if (ident.content)
+ return ident;
+ ident = this.tokenizer.readQuoted();
+ if (ident)
+ return ident;
+ throw this.tokenizer.error('invalid capture name');
+ };
+ default_1.prototype.render = function (ctx) {
+ var r, html;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ r = this.liquid.renderer;
+ return [4 /*yield*/, r.renderTemplates(this.templates, ctx)];
+ case 1:
+ html = _a.sent();
+ ctx.bottom()[this.variable] = html;
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, this.templates];
+ });
+ };
+ default_1.prototype.localScope = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.identifier];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$3 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(tagToken, remainTokens, liquid, parser) {
+ var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
+ _this.branches = [];
+ _this.elseTemplates = [];
+ _this.value = new Value(_this.tokenizer.readFilteredValue(), _this.liquid);
+ _this.elseTemplates = [];
+ var p = [];
+ var elseCount = 0;
+ var stream = parser.parseStream(remainTokens)
+ .on('tag:when', function (token) {
+ if (elseCount > 0) {
+ return;
+ }
+ p = [];
+ var values = [];
+ while (!token.tokenizer.end()) {
+ values.push(token.tokenizer.readValueOrThrow());
+ token.tokenizer.skipBlank();
+ if (token.tokenizer.peek() === ',') {
+ token.tokenizer.readTo(',');
+ }
+ else {
+ token.tokenizer.readTo('or');
+ }
+ }
+ _this.branches.push({
+ values: values,
+ templates: p
+ });
+ })
+ .on('tag:else', function () {
+ elseCount++;
+ p = _this.elseTemplates;
+ })
+ .on('tag:endcase', function () { return stream.stop(); })
+ .on('template', function (tpl) {
+ if (p !== _this.elseTemplates || elseCount === 1) {
+ p.push(tpl);
+ }
+ })
+ .on('end', function () {
+ throw new Error("tag ".concat(tagToken.getText(), " not closed"));
+ });
+ stream.start();
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var r, target, _a, branchHit, _b, _c, branch, _d, _e, valueToken, value, e_1_1, e_2_1;
+ var e_2, _f, e_1, _g;
+ return __generator(this, function (_h) {
+ switch (_h.label) {
+ case 0:
+ r = this.liquid.renderer;
+ _a = toValue;
+ return [4 /*yield*/, this.value.value(ctx, ctx.opts.lenientIf)];
+ case 1:
+ target = _a.apply(void 0, [_h.sent()]);
+ branchHit = false;
+ _h.label = 2;
+ case 2:
+ _h.trys.push([2, 14, 15, 16]);
+ _b = __values(this.branches), _c = _b.next();
+ _h.label = 3;
+ case 3:
+ if (!!_c.done) return [3 /*break*/, 13];
+ branch = _c.value;
+ _h.label = 4;
+ case 4:
+ _h.trys.push([4, 10, 11, 12]);
+ _d = (e_1 = void 0, __values(branch.values)), _e = _d.next();
+ _h.label = 5;
+ case 5:
+ if (!!_e.done) return [3 /*break*/, 9];
+ valueToken = _e.value;
+ return [4 /*yield*/, evalToken(valueToken, ctx, ctx.opts.lenientIf)];
+ case 6:
+ value = _h.sent();
+ if (!equals(target, value)) return [3 /*break*/, 8];
+ return [4 /*yield*/, r.renderTemplates(branch.templates, ctx, emitter)];
+ case 7:
+ _h.sent();
+ branchHit = true;
+ return [3 /*break*/, 9];
+ case 8:
+ _e = _d.next();
+ return [3 /*break*/, 5];
+ case 9: return [3 /*break*/, 12];
+ case 10:
+ e_1_1 = _h.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 12];
+ case 11:
+ try {
+ if (_e && !_e.done && (_g = _d.return)) _g.call(_d);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 12:
+ _c = _b.next();
+ return [3 /*break*/, 3];
+ case 13: return [3 /*break*/, 16];
+ case 14:
+ e_2_1 = _h.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 16];
+ case 15:
+ try {
+ if (_c && !_c.done && (_f = _b.return)) _f.call(_b);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 16:
+ if (!!branchHit) return [3 /*break*/, 18];
+ return [4 /*yield*/, r.renderTemplates(this.elseTemplates, ctx, emitter)];
+ case 17:
+ _h.sent();
+ _h.label = 18;
+ case 18: return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.arguments = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.value];
+ case 1:
+ _a.sent();
+ return [5 /*yield**/, __values(this.branches.flatMap(function (b) { return b.values; }))];
+ case 2:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function () {
+ var templates;
+ return __generator(this, function (_a) {
+ templates = this.branches.flatMap(function (b) { return b.templates; });
+ if (this.elseTemplates) {
+ templates.push.apply(templates, __spreadArray([], __read(this.elseTemplates), false));
+ }
+ return [2 /*return*/, templates];
+ });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$4 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(tagToken, remainTokens, liquid) {
+ var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
+ while (remainTokens.length) {
+ var token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endcomment')
+ return _this;
+ }
+ throw new Error("tag ".concat(tagToken.getText(), " not closed"));
+ }
+ default_1.prototype.render = function () { };
+ return default_1;
+ }(Tag)); + + var default_1$5 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid, parser) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ var tokenizer = _this.tokenizer;
+ _this.file = parseFilePath(tokenizer, _this.liquid, parser);
+ _this.currentFile = token.file;
+ while (!tokenizer.end()) {
+ tokenizer.skipBlank();
+ var begin = tokenizer.p;
+ var keyword = tokenizer.readIdentifier();
+ if (keyword.content === 'with' || keyword.content === 'for') {
+ tokenizer.skipBlank();
+ // can be normal key/value pair, like "with: true"
+ if (tokenizer.peek() !== ':') {
+ var value = tokenizer.readValue();
+ // can be normal key, like "with,"
+ if (value) {
+ var beforeAs = tokenizer.p;
+ var asStr = tokenizer.readIdentifier();
+ var alias = void 0;
+ if (asStr.content === 'as')
+ alias = tokenizer.readIdentifier();
+ else
+ tokenizer.p = beforeAs;
+ _this[keyword.content] = { value: value, alias: alias && alias.content };
+ tokenizer.skipBlank();
+ if (tokenizer.peek() === ',')
+ tokenizer.advance();
+ continue; // matched!
+ }
+ }
+ }
+ /**
+ * restore cursor if with/for not matched
+ */
+ tokenizer.p = begin;
+ break;
+ }
+ _this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator);
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var _a, liquid, hash, filepath, childCtx, scope, _b, _c, _d, value, alias, _e, _f, _g, value, alias, collection, _h, collection_1, collection_1_1, item, templates, e_1_1, templates;
+ var e_1, _j;
+ return __generator(this, function (_k) {
+ switch (_k.label) {
+ case 0:
+ _a = this, liquid = _a.liquid, hash = _a.hash;
+ return [4 /*yield*/, renderFilePath(this['file'], ctx, liquid)];
+ case 1:
+ filepath = (_k.sent());
+ assert(filepath, function () { return "illegal file path \"".concat(filepath, "\""); });
+ childCtx = ctx.spawn();
+ scope = childCtx.bottom();
+ _b = __assign;
+ _c = [scope];
+ return [4 /*yield*/, hash.render(ctx)];
+ case 2:
+ _b.apply(void 0, _c.concat([_k.sent()]));
+ if (!this['with']) return [3 /*break*/, 4];
+ _d = this['with'], value = _d.value, alias = _d.alias;
+ _e = scope;
+ _f = alias || filepath;
+ return [4 /*yield*/, evalToken(value, ctx)];
+ case 3:
+ _e[_f] = _k.sent();
+ _k.label = 4;
+ case 4:
+ if (!this['for']) return [3 /*break*/, 15];
+ _g = this['for'], value = _g.value, alias = _g.alias;
+ _h = toEnumerable;
+ return [4 /*yield*/, evalToken(value, ctx)];
+ case 5:
+ collection = _h.apply(void 0, [_k.sent()]);
+ scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias);
+ _k.label = 6;
+ case 6:
+ _k.trys.push([6, 12, 13, 14]);
+ collection_1 = __values(collection), collection_1_1 = collection_1.next();
+ _k.label = 7;
+ case 7:
+ if (!!collection_1_1.done) return [3 /*break*/, 11];
+ item = collection_1_1.value;
+ scope[alias] = item;
+ return [4 /*yield*/, liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])];
+ case 8:
+ templates = (_k.sent());
+ return [4 /*yield*/, liquid.renderer.renderTemplates(templates, childCtx, emitter)];
+ case 9:
+ _k.sent();
+ scope['forloop'].next();
+ _k.label = 10;
+ case 10:
+ collection_1_1 = collection_1.next();
+ return [3 /*break*/, 7];
+ case 11: return [3 /*break*/, 14];
+ case 12:
+ e_1_1 = _k.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 14];
+ case 13:
+ try {
+ if (collection_1_1 && !collection_1_1.done && (_j = collection_1.return)) _j.call(collection_1);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 14: return [3 /*break*/, 18];
+ case 15: return [4 /*yield*/, liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])];
+ case 16:
+ templates = (_k.sent());
+ return [4 /*yield*/, liquid.renderer.renderTemplates(templates, childCtx, emitter)];
+ case 17:
+ _k.sent();
+ _k.label = 18;
+ case 18: return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function (partials, sync) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!(partials && isString(this['file']))) return [3 /*break*/, 2];
+ return [4 /*yield*/, this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])];
+ case 1: return [2 /*return*/, (_a.sent())];
+ case 2: return [2 /*return*/, []];
+ }
+ });
+ };
+ default_1.prototype.partialScope = function () {
+ if (isString(this['file'])) {
+ var names = Object.keys(this.hash.hash);
+ if (this['with']) {
+ var _a = this['with'], value = _a.value, alias = _a.alias;
+ if (isString(alias)) {
+ names.push([alias, value]);
+ }
+ else if (isString(this.file)) {
+ names.push([this.file, value]);
+ }
+ }
+ if (this['for']) {
+ var _b = this['for'], value = _b.value, alias = _b.alias;
+ if (isString(alias)) {
+ names.push([alias, value]);
+ }
+ else if (isString(this.file)) {
+ names.push([this.file, value]);
+ }
+ }
+ return { name: this['file'], isolated: true, scope: names };
+ }
+ };
+ default_1.prototype.arguments = function () {
+ var _a, _b, v, e_2_1, value, value;
+ var e_2, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ _d.trys.push([0, 5, 6, 7]);
+ _a = __values(Object.values(this.hash.hash)), _b = _a.next();
+ _d.label = 1;
+ case 1:
+ if (!!_b.done) return [3 /*break*/, 4];
+ v = _b.value;
+ if (!isValueToken(v)) return [3 /*break*/, 3];
+ return [4 /*yield*/, v];
+ case 2:
+ _d.sent();
+ _d.label = 3;
+ case 3:
+ _b = _a.next();
+ return [3 /*break*/, 1];
+ case 4: return [3 /*break*/, 7];
+ case 5:
+ e_2_1 = _d.sent();
+ e_2 = { error: e_2_1 };
+ return [3 /*break*/, 7];
+ case 6:
+ try {
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
+ }
+ finally { if (e_2) throw e_2.error; }
+ return [7 /*endfinally*/];
+ case 7:
+ if (!this['with']) return [3 /*break*/, 9];
+ value = this['with'].value;
+ if (!isValueToken(value)) return [3 /*break*/, 9];
+ return [4 /*yield*/, value];
+ case 8:
+ _d.sent();
+ _d.label = 9;
+ case 9:
+ if (!this['for']) return [3 /*break*/, 11];
+ value = this['for'].value;
+ if (!isValueToken(value)) return [3 /*break*/, 11];
+ return [4 /*yield*/, value];
+ case 10:
+ _d.sent();
+ _d.label = 11;
+ case 11: return [2 /*return*/];
+ }
+ });
+ };
+ return default_1;
+ }(Tag));
+ /**
+ * @return null for "none",
+ * @return Template[] for quoted with tags and/or filters
+ * @return Token for expression (not quoted)
+ * @throws TypeError if cannot read next token
+ */
+ function parseFilePath(tokenizer, liquid, parser) {
+ if (liquid.options.dynamicPartials) {
+ var file = tokenizer.readValue();
+ tokenizer.assert(file, 'illegal file path');
+ if (file.getText() === 'none')
+ return;
+ if (isQuotedToken(file)) {
+ // for filenames like "files/{{file}}", eval as liquid template
+ var templates_1 = parser.parse(evalQuotedToken(file));
+ return optimize(templates_1);
+ }
+ return file;
+ }
+ var tokens = __spreadArray([], __read(tokenizer.readFileNameTemplate(liquid.options)), false);
+ var templates = optimize(parser.parseTokens(tokens));
+ return templates === 'none' ? undefined : templates;
+ }
+ function optimize(templates) {
+ // for filenames like "files/file.liquid", extract the string directly
+ if (templates.length === 1 && isHTMLToken(templates[0].token))
+ return templates[0].token.getContent();
+ return templates;
+ }
+ function renderFilePath(file, ctx, liquid) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (typeof file === 'string')
+ return [2 /*return*/, file];
+ if (Array.isArray(file))
+ return [2 /*return*/, liquid.renderer.renderTemplates(file, ctx)];
+ return [4 /*yield*/, evalToken(file, ctx)];
+ case 1: return [2 /*return*/, _a.sent()];
+ }
+ });
+ } + + var default_1$6 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid, parser) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ var tokenizer = token.tokenizer;
+ _this['file'] = parseFilePath(tokenizer, _this.liquid, parser);
+ _this['currentFile'] = token.file;
+ var begin = tokenizer.p;
+ var withStr = tokenizer.readIdentifier();
+ if (withStr.content === 'with') {
+ tokenizer.skipBlank();
+ if (tokenizer.peek() !== ':') {
+ _this.withVar = tokenizer.readValue();
+ }
+ else
+ tokenizer.p = begin;
+ }
+ else
+ tokenizer.p = begin;
+ _this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator);
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var _a, liquid, hash, withVar, renderer, filepath, saved, scope, _b, _c, templates;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ _a = this, liquid = _a.liquid, hash = _a.hash, withVar = _a.withVar;
+ renderer = liquid.renderer;
+ return [4 /*yield*/, renderFilePath(this['file'], ctx, liquid)];
+ case 1:
+ filepath = (_d.sent());
+ assert(filepath, function () { return "illegal file path \"".concat(filepath, "\""); });
+ saved = ctx.saveRegister('blocks', 'blockMode');
+ ctx.setRegister('blocks', {});
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ return [4 /*yield*/, hash.render(ctx)];
+ case 2:
+ scope = (_d.sent());
+ if (!withVar) return [3 /*break*/, 4];
+ _b = scope;
+ _c = filepath;
+ return [4 /*yield*/, evalToken(withVar, ctx)];
+ case 3:
+ _b[_c] = _d.sent();
+ _d.label = 4;
+ case 4: return [4 /*yield*/, liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])];
+ case 5:
+ templates = (_d.sent());
+ ctx.push(ctx.opts.jekyllInclude ? { include: scope } : scope);
+ return [4 /*yield*/, renderer.renderTemplates(templates, ctx, emitter)];
+ case 6:
+ _d.sent();
+ ctx.pop();
+ ctx.restoreRegister(saved);
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function (partials, sync) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!(partials && isString(this['file']))) return [3 /*break*/, 2];
+ return [4 /*yield*/, this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])];
+ case 1: return [2 /*return*/, (_a.sent())];
+ case 2: return [2 /*return*/, []];
+ }
+ });
+ };
+ default_1.prototype.partialScope = function () {
+ if (isString(this['file'])) {
+ var names = void 0;
+ if (this.liquid.options.jekyllInclude) {
+ names = ['include'];
+ }
+ else {
+ names = Object.keys(this.hash.hash);
+ if (this.withVar) {
+ names.push([this['file'], this.withVar]);
+ }
+ }
+ return { name: this['file'], isolated: false, scope: names };
+ }
+ };
+ default_1.prototype.arguments = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(Object.values(this.hash.hash).filter(isValueToken))];
+ case 1:
+ _a.sent();
+ if (!isValueToken(this['file'])) return [3 /*break*/, 3];
+ return [4 /*yield*/, this['file']];
+ case 2:
+ _a.sent();
+ _a.label = 3;
+ case 3:
+ if (!isValueToken(this.withVar)) return [3 /*break*/, 5];
+ return [4 /*yield*/, this.withVar];
+ case 4:
+ _a.sent();
+ _a.label = 5;
+ case 5: return [2 /*return*/];
+ }
+ });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$7 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ _this.identifier = _this.tokenizer.readIdentifier();
+ _this.variable = _this.identifier.content;
+ return _this;
+ }
+ default_1.prototype.render = function (context, emitter) {
+ var scope = context.environments;
+ if (!isNumber(scope[this.variable])) {
+ scope[this.variable] = 0;
+ }
+ emitter.write(stringify(--scope[this.variable]));
+ };
+ default_1.prototype.localScope = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.identifier];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$8 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ _this.candidates = [];
+ var group = _this.tokenizer.readValue();
+ _this.tokenizer.skipBlank();
+ if (group) {
+ if (_this.tokenizer.peek() === ':') {
+ _this.group = group;
+ _this.tokenizer.advance();
+ }
+ else
+ _this.candidates.push(group);
+ }
+ while (!_this.tokenizer.end()) {
+ var value = _this.tokenizer.readValue();
+ if (value)
+ _this.candidates.push(value);
+ _this.tokenizer.readTo(',');
+ }
+ _this.tokenizer.assert(_this.candidates.length, function () { return "empty candidates: \"".concat(token.getText(), "\""); });
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var group, fingerprint, groups, idx, candidate;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, evalToken(this.group, ctx)];
+ case 1:
+ group = (_a.sent());
+ fingerprint = "cycle:".concat(group, ":") + this.candidates.join(',');
+ groups = ctx.getRegister('cycle');
+ idx = groups[fingerprint];
+ if (idx === undefined) {
+ idx = groups[fingerprint] = 0;
+ }
+ candidate = this.candidates[idx];
+ idx = (idx + 1) % this.candidates.length;
+ groups[fingerprint] = idx;
+ return [4 /*yield*/, evalToken(candidate, ctx)];
+ case 2: return [2 /*return*/, _a.sent()];
+ }
+ });
+ };
+ default_1.prototype.arguments = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [5 /*yield**/, __values(this.candidates)];
+ case 1:
+ _a.sent();
+ if (!this.group) return [3 /*break*/, 3];
+ return [4 /*yield*/, this.group];
+ case 2:
+ _a.sent();
+ _a.label = 3;
+ case 3: return [2 /*return*/];
+ }
+ });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$9 = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(tagToken, remainTokens, liquid, parser) {
+ var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
+ _this.branches = [];
+ var p = [];
+ parser.parseStream(remainTokens)
+ .on('start', function () { return _this.branches.push({
+ value: new Value(tagToken.tokenizer.readFilteredValue(), _this.liquid),
+ templates: (p = [])
+ }); })
+ .on('tag:elsif', function (token) {
+ assert(!_this.elseTemplates, 'unexpected elsif after else');
+ _this.branches.push({
+ value: new Value(token.tokenizer.readFilteredValue(), _this.liquid),
+ templates: (p = [])
+ });
+ })
+ .on('tag:else', function (tag) {
+ assertEmpty(tag.args);
+ assert(!_this.elseTemplates, 'duplicated else');
+ p = _this.elseTemplates = [];
+ })
+ .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); })
+ .on('template', function (tpl) { return p.push(tpl); })
+ .on('end', function () { throw new Error("tag ".concat(tagToken.getText(), " not closed")); })
+ .start();
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var r, _a, _b, _c, value, templates, v, e_1_1;
+ var e_1, _d;
+ return __generator(this, function (_e) {
+ switch (_e.label) {
+ case 0:
+ r = this.liquid.renderer;
+ _e.label = 1;
+ case 1:
+ _e.trys.push([1, 7, 8, 9]);
+ _a = __values(this.branches), _b = _a.next();
+ _e.label = 2;
+ case 2:
+ if (!!_b.done) return [3 /*break*/, 6];
+ _c = _b.value, value = _c.value, templates = _c.templates;
+ return [4 /*yield*/, value.value(ctx, ctx.opts.lenientIf)];
+ case 3:
+ v = _e.sent();
+ if (!isTruthy(v, ctx)) return [3 /*break*/, 5];
+ return [4 /*yield*/, r.renderTemplates(templates, ctx, emitter)];
+ case 4:
+ _e.sent();
+ return [2 /*return*/];
+ case 5:
+ _b = _a.next();
+ return [3 /*break*/, 2];
+ case 6: return [3 /*break*/, 9];
+ case 7:
+ e_1_1 = _e.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 9];
+ case 8:
+ try {
+ if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 9: return [4 /*yield*/, r.renderTemplates(this.elseTemplates || [], ctx, emitter)];
+ case 10:
+ _e.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function () {
+ var templates;
+ return __generator(this, function (_a) {
+ templates = this.branches.flatMap(function (b) { return b.templates; });
+ if (this.elseTemplates) {
+ templates.push.apply(templates, __spreadArray([], __read(this.elseTemplates), false));
+ }
+ return [2 /*return*/, templates];
+ });
+ };
+ default_1.prototype.arguments = function () {
+ return this.branches.map(function (b) { return b.value; });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$a = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ _this.identifier = _this.tokenizer.readIdentifier();
+ _this.variable = _this.identifier.content;
+ return _this;
+ }
+ default_1.prototype.render = function (context, emitter) {
+ var scope = context.environments;
+ if (!isNumber(scope[this.variable])) {
+ scope[this.variable] = 0;
+ }
+ var val = scope[this.variable];
+ scope[this.variable]++;
+ emitter.write(stringify(val));
+ };
+ default_1.prototype.localScope = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.identifier];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$b = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid, parser) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ _this.file = parseFilePath(_this.tokenizer, _this.liquid, parser);
+ _this['currentFile'] = token.file;
+ _this.args = new Hash(_this.tokenizer, liquid.options.keyValueSeparator);
+ _this.templates = parser.parseTokens(remainTokens);
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var _a, liquid, args, file, renderer, filepath, templates, html, blocks, _b, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ _a = this, liquid = _a.liquid, args = _a.args, file = _a.file;
+ renderer = liquid.renderer;
+ if (!(file === undefined)) return [3 /*break*/, 2];
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ return [4 /*yield*/, renderer.renderTemplates(this.templates, ctx, emitter)];
+ case 1:
+ _d.sent();
+ return [2 /*return*/];
+ case 2: return [4 /*yield*/, renderFilePath(this.file, ctx, liquid)];
+ case 3:
+ filepath = (_d.sent());
+ assert(filepath, function () { return "illegal file path \"".concat(filepath, "\""); });
+ return [4 /*yield*/, liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])];
+ case 4:
+ templates = (_d.sent());
+ // render remaining contents and store rendered results
+ ctx.setRegister('blockMode', BlockMode.STORE);
+ return [4 /*yield*/, renderer.renderTemplates(this.templates, ctx)];
+ case 5:
+ html = _d.sent();
+ blocks = ctx.getRegister('blocks');
+ // set whole content to anonymous block if anonymous doesn't specified
+ if (blocks[''] === undefined)
+ blocks[''] = function (parent, emitter) { return emitter.write(html); };
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ // render the layout file use stored blocks
+ _c = (_b = ctx).push;
+ return [4 /*yield*/, args.render(ctx)];
+ case 6:
+ // render the layout file use stored blocks
+ _c.apply(_b, [(_d.sent())]);
+ return [4 /*yield*/, renderer.renderTemplates(templates, ctx, emitter)];
+ case 7:
+ _d.sent();
+ ctx.pop();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function (partials) {
+ var templates, _a, _b, _c, _d;
+ return __generator(this, function (_e) {
+ switch (_e.label) {
+ case 0:
+ templates = this.templates.slice();
+ if (!(partials && isString(this.file))) return [3 /*break*/, 2];
+ _b = (_a = templates.push).apply;
+ _c = [templates];
+ _d = [[]];
+ return [4 /*yield*/, this.liquid._parsePartialFile(this.file, true, this['currentFile'])];
+ case 1:
+ _b.apply(_a, _c.concat([__spreadArray.apply(void 0, _d.concat([__read.apply(void 0, [(_e.sent())]), false]))]));
+ _e.label = 2;
+ case 2: return [2 /*return*/, templates];
+ }
+ });
+ };
+ default_1.prototype.arguments = function () {
+ var _a, _b, v, e_1_1;
+ var e_1, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0:
+ _d.trys.push([0, 5, 6, 7]);
+ _a = __values(Object.values(this.args.hash)), _b = _a.next();
+ _d.label = 1;
+ case 1:
+ if (!!_b.done) return [3 /*break*/, 4];
+ v = _b.value;
+ if (!isValueToken(v)) return [3 /*break*/, 3];
+ return [4 /*yield*/, v];
+ case 2:
+ _d.sent();
+ _d.label = 3;
+ case 3:
+ _b = _a.next();
+ return [3 /*break*/, 1];
+ case 4: return [3 /*break*/, 7];
+ case 5:
+ e_1_1 = _d.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 7];
+ case 6:
+ try {
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 7:
+ if (!isValueToken(this.file)) return [3 /*break*/, 9];
+ return [4 /*yield*/, this.file];
+ case 8:
+ _d.sent();
+ _d.label = 9;
+ case 9: return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.partialScope = function () {
+ if (isString(this.file)) {
+ return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) };
+ }
+ };
+ return default_1;
+ }(Tag)); + + var default_1$c = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid, parser) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ _this.templates = [];
+ var match = /\w+/.exec(token.args);
+ _this.block = match ? match[0] : '';
+ while (remainTokens.length) {
+ var token_1 = remainTokens.shift();
+ if (isTagToken(token_1) && token_1.name === 'endblock')
+ return _this;
+ var template = parser.parseToken(token_1, remainTokens);
+ _this.templates.push(template);
+ }
+ throw new Error("tag ".concat(token.getText(), " not closed"));
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var blockRender;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ blockRender = this.getBlockRender(ctx);
+ if (!(ctx.getRegister('blockMode') === BlockMode.STORE)) return [3 /*break*/, 1];
+ ctx.getRegister('blocks')[this.block] = blockRender;
+ return [3 /*break*/, 3];
+ case 1: return [4 /*yield*/, blockRender(new BlockDrop(), emitter)];
+ case 2:
+ _a.sent();
+ _a.label = 3;
+ case 3: return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.getBlockRender = function (ctx) {
+ var _a = this, liquid = _a.liquid, templates = _a.templates;
+ var renderChild = ctx.getRegister('blocks')[this.block];
+ var renderCurrent = function (superBlock, emitter) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ // add {{ block.super }} support when rendering
+ ctx.push({ block: superBlock });
+ return [4 /*yield*/, liquid.renderer.renderTemplates(templates, ctx, emitter)];
+ case 1:
+ _a.sent();
+ ctx.pop();
+ return [2 /*return*/];
+ }
+ });
+ };
+ return renderChild
+ ? function (superBlock, emitter) { return renderChild(new BlockDrop(function (emitter) { return renderCurrent(superBlock, emitter); }), emitter); }
+ : renderCurrent;
+ };
+ default_1.prototype.children = function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, this.templates];
+ });
+ };
+ default_1.prototype.blockScope = function () {
+ return ['block'];
+ };
+ return default_1;
+ }(Tag)); + + var default_1$d = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(tagToken, remainTokens, liquid) {
+ var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
+ _this.tokens = [];
+ while (remainTokens.length) {
+ var token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endraw')
+ return _this;
+ _this.tokens.push(token);
+ }
+ throw new Error("tag ".concat(tagToken.getText(), " not closed"));
+ }
+ default_1.prototype.render = function () {
+ return this.tokens.map(function (token) { return token.getText(); }).join('');
+ };
+ return default_1;
+ }(Tag)); + + var TablerowloopDrop = /** @class */ (function (_super) {
+ __extends(TablerowloopDrop, _super);
+ function TablerowloopDrop(length, cols, collection, variable) {
+ var _this = _super.call(this, length, collection, variable) || this;
+ _this.length = length;
+ _this.cols = cols;
+ return _this;
+ }
+ TablerowloopDrop.prototype.row = function () {
+ return Math.floor(this.i / this.cols) + 1;
+ };
+ TablerowloopDrop.prototype.col0 = function () {
+ return (this.i % this.cols);
+ };
+ TablerowloopDrop.prototype.col = function () {
+ return this.col0() + 1;
+ };
+ TablerowloopDrop.prototype.col_first = function () {
+ return this.col0() === 0;
+ };
+ TablerowloopDrop.prototype.col_last = function () {
+ return this.col() === this.cols;
+ };
+ return TablerowloopDrop;
+ }(ForloopDrop)); + + var default_1$e = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(tagToken, remainTokens, liquid, parser) {
+ var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
+ var variable = _this.tokenizer.readIdentifier();
+ _this.tokenizer.skipBlank();
+ var predicate = _this.tokenizer.readIdentifier();
+ var collectionToken = _this.tokenizer.readValue();
+ if (predicate.content !== 'in' || !collectionToken) {
+ throw new Error("illegal tag: ".concat(tagToken.getText()));
+ }
+ _this.variable = variable.content;
+ _this.collection = collectionToken;
+ _this.args = new Hash(_this.tokenizer, liquid.options.keyValueSeparator);
+ _this.templates = [];
+ var p;
+ var stream = 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 ".concat(tagToken.getText(), " not closed"));
+ });
+ stream.start();
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var collection, _a, args, offset, limit, cols, r, tablerowloop, scope, idx;
+ return __generator(this, function (_b) {
+ switch (_b.label) {
+ case 0:
+ _a = toEnumerable;
+ return [4 /*yield*/, evalToken(this.collection, ctx)];
+ case 1:
+ collection = _a.apply(void 0, [_b.sent()]);
+ return [4 /*yield*/, this.args.render(ctx)];
+ case 2:
+ args = (_b.sent());
+ offset = args.offset || 0;
+ limit = (args.limit === undefined) ? collection.length : args.limit;
+ collection = collection.slice(offset, offset + limit);
+ cols = args.cols || collection.length;
+ r = this.liquid.renderer;
+ tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable);
+ scope = { tablerowloop: tablerowloop };
+ ctx.push(scope);
+ idx = 0;
+ _b.label = 3;
+ case 3:
+ if (!(idx < collection.length)) return [3 /*break*/, 6];
+ scope[this.variable] = collection[idx];
+ if (tablerowloop.col0() === 0) {
+ if (tablerowloop.row() !== 1)
+ emitter.write('</tr>');
+ emitter.write("<tr class=\"row".concat(tablerowloop.row(), "\">"));
+ }
+ emitter.write("<td class=\"col".concat(tablerowloop.col(), "\">"));
+ return [4 /*yield*/, r.renderTemplates(this.templates, ctx, emitter)];
+ case 4:
+ _b.sent();
+ emitter.write('</td>');
+ _b.label = 5;
+ case 5:
+ idx++, tablerowloop.next();
+ return [3 /*break*/, 3];
+ case 6:
+ if (collection.length)
+ emitter.write('</tr>');
+ ctx.pop();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, this.templates];
+ });
+ };
+ default_1.prototype.arguments = function () {
+ var _a, _b, v, e_1_1;
+ var e_1, _c;
+ return __generator(this, function (_d) {
+ switch (_d.label) {
+ case 0: return [4 /*yield*/, this.collection];
+ case 1:
+ _d.sent();
+ _d.label = 2;
+ case 2:
+ _d.trys.push([2, 7, 8, 9]);
+ _a = __values(Object.values(this.args.hash)), _b = _a.next();
+ _d.label = 3;
+ case 3:
+ if (!!_b.done) return [3 /*break*/, 6];
+ v = _b.value;
+ if (!isValueToken(v)) return [3 /*break*/, 5];
+ return [4 /*yield*/, v];
+ case 4:
+ _d.sent();
+ _d.label = 5;
+ case 5:
+ _b = _a.next();
+ return [3 /*break*/, 3];
+ case 6: return [3 /*break*/, 9];
+ case 7:
+ e_1_1 = _d.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 9];
+ case 8:
+ try {
+ if (_b && !_b.done && (_c = _a.return)) _c.call(_a);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 9: return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.blockScope = function () {
+ return [this.variable, 'tablerowloop'];
+ };
+ return default_1;
+ }(Tag)); + + var default_1$f = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(tagToken, remainTokens, liquid, parser) {
+ var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
+ _this.branches = [];
+ _this.elseTemplates = [];
+ var p = [];
+ var elseCount = 0;
+ parser.parseStream(remainTokens)
+ .on('start', function () { return _this.branches.push({
+ value: new Value(tagToken.tokenizer.readFilteredValue(), _this.liquid),
+ test: isFalsy,
+ templates: (p = [])
+ }); })
+ .on('tag:elsif', function (token) {
+ if (elseCount > 0) {
+ p = [];
+ return;
+ }
+ _this.branches.push({
+ value: new Value(token.tokenizer.readFilteredValue(), _this.liquid),
+ test: isTruthy,
+ templates: (p = [])
+ });
+ })
+ .on('tag:else', function () {
+ elseCount++;
+ p = _this.elseTemplates;
+ })
+ .on('tag:endunless', function () { this.stop(); })
+ .on('template', function (tpl) {
+ if (p !== _this.elseTemplates || elseCount === 1) {
+ p.push(tpl);
+ }
+ })
+ .on('end', function () { throw new Error("tag ".concat(tagToken.getText(), " not closed")); })
+ .start();
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var r, _a, _b, _c, value, test_1, templates, v, e_1_1;
+ var e_1, _d;
+ return __generator(this, function (_e) {
+ switch (_e.label) {
+ case 0:
+ r = this.liquid.renderer;
+ _e.label = 1;
+ case 1:
+ _e.trys.push([1, 7, 8, 9]);
+ _a = __values(this.branches), _b = _a.next();
+ _e.label = 2;
+ case 2:
+ if (!!_b.done) return [3 /*break*/, 6];
+ _c = _b.value, value = _c.value, test_1 = _c.test, templates = _c.templates;
+ return [4 /*yield*/, value.value(ctx, ctx.opts.lenientIf)];
+ case 3:
+ v = _e.sent();
+ if (!test_1(v, ctx)) return [3 /*break*/, 5];
+ return [4 /*yield*/, r.renderTemplates(templates, ctx, emitter)];
+ case 4:
+ _e.sent();
+ return [2 /*return*/];
+ case 5:
+ _b = _a.next();
+ return [3 /*break*/, 2];
+ case 6: return [3 /*break*/, 9];
+ case 7:
+ e_1_1 = _e.sent();
+ e_1 = { error: e_1_1 };
+ return [3 /*break*/, 9];
+ case 8:
+ try {
+ if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
+ }
+ finally { if (e_1) throw e_1.error; }
+ return [7 /*endfinally*/];
+ case 9: return [4 /*yield*/, r.renderTemplates(this.elseTemplates, ctx, emitter)];
+ case 10:
+ _e.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function () {
+ var children;
+ return __generator(this, function (_a) {
+ children = this.branches.flatMap(function (b) { return b.templates; });
+ if (this.elseTemplates) {
+ children.push.apply(children, __spreadArray([], __read(this.elseTemplates), false));
+ }
+ return [2 /*return*/, children];
+ });
+ };
+ default_1.prototype.arguments = function () {
+ return this.branches.map(function (b) { return b.value; });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$g = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ default_1.prototype.render = function (ctx, _emitter) {
+ ctx.breakCalled = true;
+ };
+ return default_1;
+ }(Tag)); + + var default_1$h = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ default_1.prototype.render = function (ctx, _emitter) {
+ ctx.continueCalled = true;
+ };
+ return default_1;
+ }(Tag)); + + var default_1$i = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ _this.tokenizer.skipBlank();
+ if (!_this.tokenizer.end()) {
+ _this.value = new Value(_this.tokenizer.readFilteredValue(), _this.liquid);
+ }
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ var val;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!this.value)
+ return [2 /*return*/];
+ return [4 /*yield*/, this.value.value(ctx, false)];
+ case 1:
+ val = _a.sent();
+ emitter.write(val);
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.arguments = function () {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0:
+ if (!this.value) return [3 /*break*/, 2];
+ return [4 /*yield*/, this.value];
+ case 1:
+ _a.sent();
+ _a.label = 2;
+ case 2: return [2 /*return*/];
+ }
+ });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$j = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(token, remainTokens, liquid, parser) {
+ var _this = _super.call(this, token, remainTokens, liquid) || this;
+ var tokens = _this.tokenizer.readLiquidTagTokens(_this.liquid.options);
+ _this.templates = parser.parseTokens(tokens);
+ return _this;
+ }
+ default_1.prototype.render = function (ctx, emitter) {
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.liquid.renderer.renderTemplates(this.templates, ctx, emitter)];
+ case 1:
+ _a.sent();
+ return [2 /*return*/];
+ }
+ });
+ };
+ default_1.prototype.children = function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, this.templates];
+ });
+ };
+ return default_1;
+ }(Tag)); + + var default_1$k = /** @class */ (function (_super) {
+ __extends(default_1, _super);
+ function default_1(tagToken, remainTokens, liquid) {
+ var _this = _super.call(this, tagToken, remainTokens, liquid) || this;
+ if (tagToken.args.search(/\n\s*[^#\s]/g) !== -1) {
+ throw new Error('every line of an inline comment must start with a \'#\' character');
+ }
+ return _this;
+ }
+ default_1.prototype.render = function () { };
+ return default_1;
+ }(Tag)); + + var tags = {
+ assign: default_1,
+ 'for': default_1$1,
+ capture: default_1$2,
+ 'case': default_1$3,
+ comment: default_1$4,
+ include: default_1$6,
+ render: default_1$5,
+ decrement: default_1$7,
+ increment: default_1$a,
+ cycle: default_1$8,
+ 'if': default_1$9,
+ layout: default_1$b,
+ block: default_1$c,
+ raw: default_1$d,
+ tablerow: default_1$e,
+ unless: default_1$f,
+ 'break': default_1$g,
+ 'continue': default_1$h,
+ echo: default_1$i,
+ liquid: default_1$j,
+ '#': default_1$k
+ }; + + var Liquid = /** @class */ (function () {
+ function Liquid(opts) {
+ if (opts === void 0) { opts = {}; }
+ var _this = this;
+ this.renderer = new Render();
+ this.filters = {};
+ this.tags = {};
+ this.options = normalize(opts);
+ // eslint-disable-next-line deprecation/deprecation
+ this.parser = new Parser(this);
+ forOwn(tags, function (conf, name) { return _this.registerTag(name, conf); });
+ forOwn(filters, function (handler, name) { return _this.registerFilter(name, handler); });
+ }
+ Liquid.prototype.parse = function (html, filepath) {
+ var parser = new Parser(this);
+ return parser.parse(html, filepath);
+ };
+ Liquid.prototype._render = function (tpl, scope, renderOptions) {
+ var ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions);
+ return this.renderer.renderTemplates(tpl, ctx);
+ };
+ Liquid.prototype.render = function (tpl, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, toPromise(this._render(tpl, scope, __assign(__assign({}, renderOptions), { sync: false })))];
+ });
+ });
+ };
+ Liquid.prototype.renderSync = function (tpl, scope, renderOptions) {
+ return toValueSync(this._render(tpl, scope, __assign(__assign({}, renderOptions), { sync: true })));
+ };
+ Liquid.prototype.renderToNodeStream = function (tpl, scope, renderOptions) {
+ if (renderOptions === void 0) { renderOptions = {}; }
+ var ctx = new Context(scope, this.options, renderOptions);
+ return this.renderer.renderTemplatesToNodeStream(tpl, ctx);
+ };
+ Liquid.prototype._parseAndRender = function (html, scope, renderOptions) {
+ var tpl = this.parse(html);
+ return this._render(tpl, scope, renderOptions);
+ };
+ Liquid.prototype.parseAndRender = function (html, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, toPromise(this._parseAndRender(html, scope, __assign(__assign({}, renderOptions), { sync: false })))];
+ });
+ });
+ };
+ Liquid.prototype.parseAndRenderSync = function (html, scope, renderOptions) {
+ return toValueSync(this._parseAndRender(html, scope, __assign(__assign({}, renderOptions), { sync: true })));
+ };
+ Liquid.prototype._parsePartialFile = function (file, sync, currentFile) {
+ return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile);
+ };
+ Liquid.prototype._parseLayoutFile = function (file, sync, currentFile) {
+ return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile);
+ };
+ Liquid.prototype._parseFile = function (file, sync, lookupType, currentFile) {
+ return new Parser(this).parseFile(file, sync, lookupType, currentFile);
+ };
+ Liquid.prototype.parseFile = function (file, lookupType) {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, toPromise(new Parser(this).parseFile(file, false, lookupType))];
+ });
+ });
+ };
+ Liquid.prototype.parseFileSync = function (file, lookupType) {
+ return toValueSync(new Parser(this).parseFile(file, true, lookupType));
+ };
+ Liquid.prototype._renderFile = function (file, ctx, renderFileOptions) {
+ var templates;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)];
+ case 1:
+ templates = (_a.sent());
+ return [4 /*yield*/, this._render(templates, ctx, renderFileOptions)];
+ case 2: return [2 /*return*/, _a.sent()];
+ }
+ });
+ };
+ Liquid.prototype.renderFile = function (file, ctx, renderFileOptions) {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, toPromise(this._renderFile(file, ctx, __assign(__assign({}, renderFileOptions), { sync: false })))];
+ });
+ });
+ };
+ Liquid.prototype.renderFileSync = function (file, ctx, renderFileOptions) {
+ return toValueSync(this._renderFile(file, ctx, __assign(__assign({}, renderFileOptions), { sync: true })));
+ };
+ Liquid.prototype.renderFileToNodeStream = function (file, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function () {
+ var templates;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, this.parseFile(file)];
+ case 1:
+ templates = _a.sent();
+ return [2 /*return*/, this.renderToNodeStream(templates, scope, renderOptions)];
+ }
+ });
+ });
+ };
+ Liquid.prototype._evalValue = function (str, scope) {
+ var value = new Value(str, this);
+ var ctx = scope instanceof Context ? scope : new Context(scope, this.options);
+ return value.value(ctx);
+ };
+ Liquid.prototype.evalValue = function (str, scope) {
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, toPromise(this._evalValue(str, scope))];
+ });
+ });
+ };
+ Liquid.prototype.evalValueSync = function (str, scope) {
+ return toValueSync(this._evalValue(str, scope));
+ };
+ Liquid.prototype.registerFilter = function (name, filter) {
+ this.filters[name] = filter;
+ };
+ Liquid.prototype.registerTag = function (name, tag) {
+ this.tags[name] = isFunction(tag) ? tag : createTagClass(tag);
+ };
+ Liquid.prototype.plugin = function (plugin) {
+ return plugin.call(this, Liquid);
+ };
+ Liquid.prototype.express = function () {
+ var self = this; // eslint-disable-line
+ var firstCall = true;
+ return function (filePath, ctx, callback) {
+ var _a, _b, _c;
+ if (firstCall) {
+ firstCall = false;
+ var dirs = normalizeDirectoryList(this.root);
+ (_a = self.options.root).unshift.apply(_a, __spreadArray([], __read(dirs), false));
+ (_b = self.options.layouts).unshift.apply(_b, __spreadArray([], __read(dirs), false));
+ (_c = self.options.partials).unshift.apply(_c, __spreadArray([], __read(dirs), false));
+ }
+ self.renderFile(filePath, ctx).then(function (html) { return callback(null, html); }, callback);
+ };
+ };
+ Liquid.prototype.analyze = function (template, options) {
+ if (options === void 0) { options = {}; }
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, analyze(template, options)];
+ });
+ });
+ };
+ Liquid.prototype.analyzeSync = function (template, options) {
+ if (options === void 0) { options = {}; }
+ return analyzeSync(template, options);
+ };
+ Liquid.prototype.parseAndAnalyze = function (html, filename, options) {
+ if (options === void 0) { options = {}; }
+ return __awaiter(this, void 0, void 0, function () {
+ return __generator(this, function (_a) {
+ return [2 /*return*/, analyze(this.parse(html, filename), options)];
+ });
+ });
+ };
+ Liquid.prototype.parseAndAnalyzeSync = function (html, filename, options) {
+ if (options === void 0) { options = {}; }
+ return analyzeSync(this.parse(html, filename), options);
+ };
+ /** Return an array of all variables without their properties. */
+ Liquid.prototype.variables = function (template, options) {
+ if (options === void 0) { options = {}; }
+ return __awaiter(this, void 0, void 0, function () {
+ var analysis;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)];
+ case 1:
+ analysis = _a.sent();
+ return [2 /*return*/, Object.keys(analysis.variables)];
+ }
+ });
+ });
+ };
+ /** Return an array of all variables without their properties. */
+ Liquid.prototype.variablesSync = function (template, options) {
+ if (options === void 0) { options = {}; }
+ var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.variables);
+ };
+ /** Return an array of all variables including their properties/paths. */
+ Liquid.prototype.fullVariables = function (template, options) {
+ if (options === void 0) { options = {}; }
+ return __awaiter(this, void 0, void 0, function () {
+ var analysis;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)];
+ case 1:
+ analysis = _a.sent();
+ return [2 /*return*/, Array.from(new Set(Object.values(analysis.variables).flatMap(function (a) { return a.map(function (v) { return String(v); }); })))];
+ }
+ });
+ });
+ };
+ /** Return an array of all variables including their properties/paths. */
+ Liquid.prototype.fullVariablesSync = function (template, options) {
+ if (options === void 0) { options = {}; }
+ var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.variables).flatMap(function (a) { return a.map(function (v) { return String(v); }); })));
+ };
+ /** Return an array of all variables, each as an array of properties/segments. */
+ Liquid.prototype.variableSegments = function (template, options) {
+ if (options === void 0) { options = {}; }
+ return __awaiter(this, void 0, void 0, function () {
+ var analysis;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)];
+ case 1:
+ analysis = _a.sent();
+ return [2 /*return*/, Array.from(strictUniq(Object.values(analysis.variables).flatMap(function (a) { return a.map(function (v) { return v.toArray(); }); })))];
+ }
+ });
+ });
+ };
+ /** Return an array of all variables, each as an array of properties/segments. */
+ Liquid.prototype.variableSegmentsSync = function (template, options) {
+ if (options === void 0) { options = {}; }
+ var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.variables).flatMap(function (a) { return a.map(function (v) { return v.toArray(); }); })));
+ };
+ /** Return an array of all expected context variables without their properties. */
+ Liquid.prototype.globalVariables = function (template, options) {
+ if (options === void 0) { options = {}; }
+ return __awaiter(this, void 0, void 0, function () {
+ var analysis;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)];
+ case 1:
+ analysis = _a.sent();
+ return [2 /*return*/, Object.keys(analysis.globals)];
+ }
+ });
+ });
+ };
+ /** Return an array of all expected context variables without their properties. */
+ Liquid.prototype.globalVariablesSync = function (template, options) {
+ if (options === void 0) { options = {}; }
+ var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.globals);
+ };
+ /** Return an array of all expected context variables including their properties/paths. */
+ Liquid.prototype.globalFullVariables = function (template, options) {
+ if (options === void 0) { options = {}; }
+ return __awaiter(this, void 0, void 0, function () {
+ var analysis;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)];
+ case 1:
+ analysis = _a.sent();
+ return [2 /*return*/, Array.from(new Set(Object.values(analysis.globals).flatMap(function (a) { return a.map(function (v) { return String(v); }); })))];
+ }
+ });
+ });
+ };
+ /** Return an array of all expected context variables including their properties/paths. */
+ Liquid.prototype.globalFullVariablesSync = function (template, options) {
+ if (options === void 0) { options = {}; }
+ var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.globals).flatMap(function (a) { return a.map(function (v) { return String(v); }); })));
+ };
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ Liquid.prototype.globalVariableSegments = function (template, options) {
+ if (options === void 0) { options = {}; }
+ return __awaiter(this, void 0, void 0, function () {
+ var analysis;
+ return __generator(this, function (_a) {
+ switch (_a.label) {
+ case 0: return [4 /*yield*/, analyze(isString(template) ? this.parse(template) : template, options)];
+ case 1:
+ analysis = _a.sent();
+ return [2 /*return*/, Array.from(strictUniq(Object.values(analysis.globals).flatMap(function (a) { return a.map(function (v) { return v.toArray(); }); })))];
+ }
+ });
+ });
+ };
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ Liquid.prototype.globalVariableSegmentsSync = function (template, options) {
+ if (options === void 0) { options = {}; }
+ var analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.globals).flatMap(function (a) { return a.map(function (v) { return v.toArray(); }); })));
+ };
+ return Liquid;
+ }()); + + /* istanbul ignore file */
+ var version = '10.23.0'; + + exports.AssertionError = AssertionError; + exports.AssignTag = default_1; + exports.BlockTag = default_1$c; + exports.BreakTag = default_1$g; + exports.CaptureTag = default_1$2; + exports.CaseTag = default_1$3; + exports.CommentTag = default_1$4; + exports.Context = Context; + exports.ContinueTag = default_1$h; + exports.CycleTag = default_1$8; + exports.DecrementTag = default_1$7; + exports.Drop = Drop; + exports.EchoTag = default_1$i; + exports.Expression = Expression; + exports.Filter = Filter; + exports.ForTag = default_1$1; + exports.Hash = Hash; + exports.IfTag = default_1$9; + exports.IncludeTag = default_1$6; + exports.IncrementTag = default_1$a; + exports.InlineCommentTag = default_1$k; + exports.LayoutTag = default_1$b; + exports.Liquid = Liquid; + exports.LiquidError = LiquidError; + exports.LiquidTag = default_1$j; + exports.Output = Output; + exports.ParseError = ParseError; + exports.ParseStream = ParseStream; + exports.Parser = Parser; + exports.RawTag = default_1$d; + exports.RenderError = RenderError; + exports.RenderTag = default_1$5; + exports.TablerowTag = default_1$e; + exports.Tag = Tag; + exports.TagToken = TagToken; + exports.Token = Token; + exports.TokenizationError = TokenizationError; + exports.Tokenizer = Tokenizer; + exports.TypeGuards = typeGuards; + exports.UndefinedVariableError = UndefinedVariableError; + exports.UnlessTag = default_1$f; + exports.Value = Value; + exports.Variable = Variable; + exports.analyze = analyze; + exports.analyzeSync = analyzeSync; + exports.assert = assert; + exports.createTrie = createTrie; + exports.defaultOperators = defaultOperators; + exports.defaultOptions = defaultOptions; + exports.evalQuotedToken = evalQuotedToken; + exports.evalToken = evalToken; + exports.filters = filters; + exports.isFalsy = isFalsy; + exports.isTruthy = isTruthy; + exports.tags = tags; + exports.toPromise = toPromise; + exports.toValue = toValue; + exports.toValueSync = toValueSync; + exports.version = version; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=liquid.browser.umd.js.map diff --git a/node_modules/liquidjs/dist/liquid.browser.umd.js.map b/node_modules/liquidjs/dist/liquid.browser.umd.js.map new file mode 100644 index 0000000..84b6eda --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.browser.umd.js.map @@ -0,0 +1 @@ +{"version":3,"file":"liquid.browser.umd.js","sources":["../src/tokens/token.ts","../src/drop/drop.ts","../src/util/underscore.ts","../src/util/error.ts","../src/util/character.ts","../src/util/assert.ts","../src/drop/null-drop.ts","../src/drop/empty-drop.ts","../src/drop/blank-drop.ts","../src/drop/forloop-drop.ts","../src/emitters/simple-emitter.ts","../src/build/streamed-emitter-browser.ts","../src/emitters/keeping-type-emitter.ts","../src/drop/block-drop.ts","../src/drop/comparable.ts","../src/util/literal.ts","../src/util/operator-trie.ts","../src/util/async.ts","../src/util/strftime.ts","../src/util/intl.ts","../src/util/liquid-date.ts","../src/util/limiter.ts","../src/tokens/delimited-token.ts","../src/tokens/tag-token.ts","../src/tokens/output-token.ts","../src/tokens/html-token.ts","../src/tokens/number-token.ts","../src/tokens/identifier-token.ts","../src/tokens/literal-token.ts","../src/tokens/operator-token.ts","../src/tokens/property-access-token.ts","../src/tokens/filter-token.ts","../src/tokens/hash-token.ts","../src/render/string.ts","../src/tokens/quoted-token.ts","../src/tokens/range-token.ts","../src/tokens/liquid-tag-token.ts","../src/tokens/filtered-value-token.ts","../src/util/performance.ts","../src/render/render.ts","../src/render/expression.ts","../src/render/boolean.ts","../src/render/operator.ts","../src/cache/lru.ts","../src/build/fs-impl-browser.ts","../src/filters/misc.ts","../src/filters/html.ts","../src/fs/map-fs.ts","../src/liquid-options.ts","../src/parser/whitespace-ctrl.ts","../src/parser/tokenizer.ts","../src/parser/parse-stream.ts","../src/template/template-impl.ts","../src/template/tag.ts","../src/template/hash.ts","../src/template/tag-options-adapter.ts","../src/parser/filter-arg.ts","../src/template/filter.ts","../src/template/value.ts","../src/template/output.ts","../src/template/html.ts","../src/template/analysis.ts","../src/fs/loader.ts","../src/parser/parser.ts","../src/parser/token-kind.ts","../src/util/type-guards.ts","../src/context/context.ts","../src/context/block-mode.ts","../src/filters/math.ts","../src/filters/url.ts","../src/filters/array.ts","../src/filters/date.ts","../src/filters/string.ts","../src/filters/index.ts","../src/tags/assign.ts","../src/tags/for.ts","../src/tags/capture.ts","../src/tags/case.ts","../src/tags/comment.ts","../src/tags/render.ts","../src/tags/include.ts","../src/tags/decrement.ts","../src/tags/cycle.ts","../src/tags/if.ts","../src/tags/increment.ts","../src/tags/layout.ts","../src/tags/block.ts","../src/tags/raw.ts","../src/drop/tablerowloop-drop.ts","../src/tags/tablerow.ts","../src/tags/unless.ts","../src/tags/break.ts","../src/tags/continue.ts","../src/tags/echo.ts","../src/tags/liquid.ts","../src/tags/inline-comment.ts","../src/tags/index.ts","../src/liquid.ts","../src/index.ts"],"sourcesContent":["import { TokenKind } from '../parser'\n\nexport abstract class Token {\n public constructor (\n public kind: TokenKind,\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {}\n public getText () {\n return this.input.slice(this.begin, this.end)\n }\n public getPosition () {\n let [row, col] = [1, 1]\n for (let i = 0; i < this.begin; i++) {\n if (this.input[i] === '\\n') {\n row++\n col = 1\n } else col++\n }\n return [row, col]\n }\n public size () {\n return this.end - this.begin\n }\n}\n","import { Context } from '../context'\n\nexport abstract class Drop {\n public liquidMethodMissing (key: string | number, context: Context): Promise<any> | any {\n return undefined\n }\n}\n","import { Drop } from '../drop/drop'\n\nexport const toString = Object.prototype.toString\nconst toLowerCase = String.prototype.toLowerCase\n\nexport const hasOwnProperty = Object.hasOwnProperty\n\nexport function isString (value: any): value is string {\n return typeof value === 'string'\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isFunction (value: any): value is Function {\n return typeof value === 'function'\n}\n\nexport function isPromise<T> (val: any): val is Promise<T> {\n return val && isFunction(val.then)\n}\n\nexport function isIterator (val: any): val is IterableIterator<any> {\n return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return)\n}\n\nexport function escapeRegex (str: string) {\n return str.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n}\n\nexport function promisify<T1, T2> (fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise<T2>;\nexport function promisify<T1, T2, T3> (fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise<T3>;\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 value = toValue(value)\n if (isString(value)) return value\n if (isNil(value)) return ''\n if (isArray(value)) return value.map(x => stringify(x)).join('')\n return String(value)\n}\n\nexport function toEnumerable<T = unknown> (val: any): T[] {\n val = toValue(val)\n if (isArray(val)) return val\n if (isString(val) && val.length > 0) return [val] as unknown as T[]\n if (isIterable(val)) return Array.from(val)\n if (isObject(val)) return Object.keys(val).map((key) => [key, val[key]]) as unknown as T[]\n return []\n}\n\nexport function toArray (val: any) {\n val = toValue(val)\n if (isNil(val)) return []\n if (isArray(val)) return val\n return [ val ]\n}\n\nexport function toValue (value: any): any {\n return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value\n}\n\nexport function toNumber (value: any): number {\n return +toValue(value) || 0\n}\n\nexport function isNumber (value: any): value is number {\n return typeof value === 'number'\n}\n\nexport function toLiquid (value: any): any {\n if (value && isFunction(value.toLiquid)) return toLiquid(value.toLiquid())\n return value\n}\n\nexport function isNil (value: any): boolean {\n return value == null\n}\n\nexport function isUndefined (value: any): boolean {\n return value === undefined\n}\n\nexport function isArray (value: any): value is any[] {\n // be compatible with IE 8\n return toString.call(value) === '[object Array]'\n}\n\nexport function isArrayLike (value: any): value is any[] {\n return value && isNumber(value.length)\n}\n\nexport function isIterable (value: any): value is Iterable<any> {\n return isObject(value) && Symbol.iterator in value\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 <T> (\n obj: Record<string, T> | undefined,\n iteratee: ((val: T, key: string, obj: {[key: string]: T}) => boolean | void)\n) {\n obj = obj || {}\n for (const k in obj) {\n if (hasOwnProperty.call(obj, k)) {\n if (iteratee(obj[k], k, obj) === false) break\n }\n }\n return obj\n}\n\nexport function last <T>(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\nexport function range (start: number, stop: number, step = 1) {\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 = ' ') {\n return pad(str, length, ch, (str, ch) => ch + str)\n}\n\nexport function padEnd (str: any, length: number, ch = ' ') {\n return pad(str, length, ch, (str, ch) => str + ch)\n}\n\nexport function pad (str: any, length: number, ch: string, add: (str: string, ch: string) => string) {\n str = String(str)\n let n = length - str.length\n while (n-- > 0) str = add(str, ch)\n return str\n}\n\nexport function identify<T> (val: T): T {\n return val\n}\n\nexport function changeCase (str: string): string {\n const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z')\n return hasLowerCase ? str.toUpperCase() : str.toLowerCase()\n}\n\nexport function ellipsis (str: string, N: number): string {\n return str.length > N ? str.slice(0, N - 3) + '...' : str\n}\n\n// compare string in case-insensitive way, undefined values to the tail\nexport function caseInsensitiveCompare (a: any, b: any) {\n if (a == null && b == null) return 0\n if (a == null) return 1\n if (b == null) return -1\n a = toLowerCase.call(a)\n b = toLowerCase.call(b)\n if (a < b) return -1\n if (a > b) return 1\n return 0\n}\n\nexport function argumentsToValue<F extends (...args: any) => any, T> (fn: F) {\n return function (this: T, ...args: Parameters<F>) { return fn.call(this, ...args.map(toValue)) }\n}\n\nexport function argumentsToNumber<F extends (...args: any) => any, T> (fn: F) {\n return function (this: T, ...args: Parameters<F>) { return fn.call(this, ...args.map(toNumber)) }\n}\n\nexport function escapeRegExp (text: string) {\n return text.replace(/[-[\\]{}()*+?.,\\\\^$|#\\s]/g, '\\\\$&')\n}\n\n/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */\nexport function * strictUniq<T> (array: Array<T>): Generator<T> {\n const seen = new Set()\n\n for (const element of array) {\n const key = JSON.stringify(element)\n if (!seen.has(key)) {\n seen.add(key)\n yield element\n }\n }\n}\n","import * as _ from './underscore'\nimport { Token } from '../tokens/token'\nimport { Template } from '../template/template'\n\n/**\n * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes\n */\nconst TRAIT = '__liquidClass__'\n\nexport abstract class LiquidError extends Error {\n public token!: Token\n public context = ''\n public originalError?: Error\n public constructor (err: Error | string, token: Token) {\n /**\n * note: for ES5 targeting, `this` will be replaced by return value of Error(),\n * thus everything on `this` will be lost, avoid calling `LiquidError` methods here\n */\n super(typeof err === 'string' ? err : err.message)\n if (typeof err !== 'string') Object.defineProperty(this, 'originalError', { value: err, enumerable: false })\n Object.defineProperty(this, 'token', { value: token, enumerable: false })\n Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false })\n }\n protected update () {\n Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false })\n this.message = mkMessage(this.message, this.token)\n this.stack = this.message + '\\n' + this.context +\n '\\n' + this.stack\n if (this.originalError) this.stack += '\\nFrom ' + this.originalError.stack\n }\n static is (obj: unknown): obj is LiquidError {\n return obj?.[TRAIT] === 'LiquidError'\n }\n}\n\nexport class TokenizationError extends LiquidError {\n public constructor (message: string, token: Token) {\n super(message, token)\n this.name = 'TokenizationError'\n super.update()\n }\n}\n\nexport class ParseError extends LiquidError {\n public 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 public constructor (err: Error, tpl: Template) {\n super(err, tpl.token)\n this.name = 'RenderError'\n this.message = err.message\n super.update()\n }\n public static is (obj: any): obj is RenderError {\n return obj.name === 'RenderError'\n }\n}\n\nexport class LiquidErrors extends LiquidError {\n public constructor (public errors: RenderError[]) {\n super(errors[0], errors[0].token)\n this.name = 'LiquidErrors'\n const s = errors.length > 1 ? 's' : ''\n this.message = `${errors.length} error${s} found`\n super.update()\n }\n public static is (obj: any): obj is LiquidErrors {\n return obj.name === 'LiquidErrors'\n }\n}\n\nexport class UndefinedVariableError extends LiquidError {\n public constructor (err: Error, token: Token) {\n super(err, token)\n this.name = 'UndefinedVariableError'\n this.message = err.message\n super.update()\n }\n}\n\n// only used internally; raised where we don't have token information,\n// so it can't be an UndefinedVariableError.\nexport class InternalUndefinedVariableError extends Error {\n variableName: string\n\n public constructor (variableName: string) {\n super(`undefined variable: ${variableName}`)\n this.name = 'InternalUndefinedVariableError'\n this.variableName = variableName\n }\n}\n\nexport class AssertionError extends Error {\n public constructor (message: string) {\n super(message)\n this.name = 'AssertionError'\n this.message = message + ''\n }\n}\n\nfunction mkContext (token: Token) {\n const [line, col] = token.getPosition()\n const lines = token.input.split('\\n')\n const begin = Math.max(line - 2, 1)\n const end = Math.min(line + 3, lines.length)\n\n const context = _\n .range(begin, end + 1)\n .map(lineNumber => {\n const rowIndicator = (lineNumber === line) ? '>> ' : ' '\n const num = _.padStart(String(lineNumber), String(end).length)\n let text = `${rowIndicator}${num}| `\n\n const colIndicator = lineNumber === line\n ? '\\n' + _.padStart('^', col + text.length)\n : ''\n\n text += lines[lineNumber - 1]\n text += colIndicator\n return 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 const [line, col] = token.getPosition()\n msg += `, line:${line}, col:${col}`\n return msg\n}\n","// **DO NOT CHANGE THIS FILE**\n//\n// This file is generated by bin/character-gen.js\n// bitmask character types to boost performance\nexport const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]\nexport const WORD = 1\nexport const OPERATOR = 2\nexport const BLANK = 4\nexport const QUOTE = 8\nexport const INLINE_BLANK = 16\nexport const NUMBER = 32\nexport const SIGN = 64\nexport const PUNCTUATION = 128\n\nexport function isWord (char: string): boolean {\n const code = char.charCodeAt(0)\n return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD)\n}\nTYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK\nTYPES[8220] = TYPES[8221] = PUNCTUATION\n","import { AssertionError } from './error'\n\nexport function assert <T> (predicate: T | null | undefined, message?: string | (() => string)) {\n if (!predicate) {\n const msg = typeof message === 'function'\n ? message()\n : (message || `expect ${predicate} to be true`)\n throw new AssertionError(msg)\n }\n}\n\nexport function assertEmpty<T> (predicate: T | null | undefined, message = `unexpected ${JSON.stringify(predicate)}`) {\n assert(!predicate, message)\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isNil, toValue } from '../util'\n\nexport class NullDrop extends Drop implements Comparable {\n public equals (value: any) {\n return isNil(toValue(value))\n }\n public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return null\n }\n}\n","import { Drop } from './drop'\nimport { Comparable } from './comparable'\nimport { isObject, isString, isArray, toValue } from '../util'\n\nexport class EmptyDrop extends Drop implements Comparable {\n public equals (value: any) {\n if (value instanceof EmptyDrop) return false\n value = toValue(value)\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 public gt () {\n return false\n }\n public geq () {\n return false\n }\n public lt () {\n return false\n }\n public leq () {\n return false\n }\n public valueOf () {\n return ''\n }\n static is (value: unknown) {\n return value instanceof EmptyDrop\n }\n}\n","import { isNil, isString, toValue } from '../util'\nimport { EmptyDrop } from '../drop'\n\nexport class BlankDrop extends EmptyDrop {\n public equals (value: any) {\n if (value === false) return true\n if (isNil(toValue(value))) return true\n if (isString(value)) return /^\\s*$/.test(value)\n return super.equals(value)\n }\n static is (value: unknown) {\n return value instanceof BlankDrop\n }\n}\n","import { Drop } from './drop'\n\nexport class ForloopDrop extends Drop {\n protected i = 0\n public name: string\n public length: number\n public constructor (length: number, collection: string, variable: string) {\n super()\n this.length = length\n this.name = `${variable}-${collection}`\n }\n public next () {\n this.i++\n }\n public index0 () {\n return this.i\n }\n public index () {\n return this.i + 1\n }\n public first () {\n return this.i === 0\n }\n public last () {\n return this.i === this.length - 1\n }\n public rindex () {\n return this.length - this.i\n }\n public rindex0 () {\n return this.length - this.i - 1\n }\n public valueOf () {\n return JSON.stringify(this)\n }\n}\n","import { stringify } from '../util'\nimport { Emitter } from './emitter'\n\nexport class SimpleEmitter implements Emitter {\n public buffer = '';\n\n public write (html: any) {\n this.buffer += stringify(html)\n }\n}\n","import { Emitter } from '../emitters'\n\nexport class StreamedEmitter implements Emitter {\n public buffer = '';\n public stream: NodeJS.ReadableStream = null as any\n constructor () {\n throw new Error('streaming not supported in browser')\n }\n public write: (html: any) => void\n public error: (err: Error) => void\n public end: () => void\n}\n","import { stringify, toValue } from '../util'\nimport { Emitter } from './emitter'\n\nexport class KeepingTypeEmitter implements Emitter {\n public buffer: any = '';\n\n public write (html: any) {\n html = toValue(html)\n // This will only preserve the type if the value is isolated.\n // I.E:\n // {{ my-port }} -> 42\n // {{ my-host }}:{{ my-port }} -> 'host:42'\n if (typeof html !== 'string' && this.buffer === '') {\n this.buffer = html\n } else {\n this.buffer = stringify(this.buffer) + stringify(html)\n }\n }\n}\n","import { Emitter, SimpleEmitter } from '../emitters'\nimport { Drop } from './drop'\n\nexport class BlockDrop extends Drop {\n constructor (\n // the block render from layout template\n private superBlockRender: (emitter: Emitter) => IterableIterator<unknown> | string = () => ''\n ) {\n super()\n }\n /**\n * Provide parent access in child block by\n * {{ block.super }}\n */\n public * super (): IterableIterator<unknown> {\n const emitter = new SimpleEmitter()\n yield this.superBlockRender(emitter)\n return emitter.buffer\n }\n}\n","import { isFunction } from '../util'\n\nexport interface Comparable {\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 Comparable {\n return (\n arg &&\n isFunction(arg.equals) &&\n isFunction(arg.gt) &&\n isFunction(arg.geq) &&\n isFunction(arg.lt) &&\n isFunction(arg.leq)\n )\n}\n","import { BlankDrop, EmptyDrop, NullDrop } from '../drop'\n\nconst nil = new NullDrop()\nexport const literalValues = {\n 'true': true,\n 'false': false,\n 'nil': nil,\n 'null': nil,\n 'empty': new EmptyDrop(),\n 'blank': new BlankDrop()\n}\n\nexport type LiteralKey = keyof typeof literalValues\nexport type LiteralValue = typeof literalValues[LiteralKey]\n","import { isWord } from '../util/character'\n\ninterface TrieInput<T> {\n [key: string]: T\n}\n\ninterface TrieLeafNode<T> {\n data: T;\n end: true;\n needBoundary?: true;\n}\n\nexport interface Trie<T> {\n [key: string]: Trie<T> | TrieLeafNode<T>;\n}\n\nexport type TrieNode<T> = Trie<T> | TrieLeafNode<T>\n\nexport function createTrie<T = any> (input: TrieInput<T>): Trie<T> {\n const trie: Trie<T> = {}\n for (const [name, data] of Object.entries(input)) {\n let node: Trie<T> | TrieLeafNode<T> = trie\n\n for (let i = 0; i < name.length; i++) {\n const c = name[i]\n node[c] = node[c] || {}\n\n if (i === name.length - 1 && isWord(name[i])) {\n node[c].needBoundary = true\n }\n\n node = node[c]\n }\n\n node.data = data\n node.end = true\n }\n return trie\n}\n","import { isPromise, isIterator } from './underscore'\n\n// convert an async iterator to a Promise\nexport async function toPromise<T> (val: Generator<unknown, T, unknown> | Promise<T> | T): Promise<T> {\n if (!isIterator(val)) return val\n let value: unknown\n let done = false\n let next = 'next'\n do {\n const state = val[next](value)\n done = state.done\n value = state.value\n next = 'next'\n try {\n if (isIterator(value)) value = toPromise(value)\n if (isPromise(value)) value = await value\n } catch (err) {\n next = 'throw'\n value = err\n }\n } while (!done)\n return value as T\n}\n\n// convert an async iterator to a value in a synchronous manner\nexport function toValueSync<T> (val: Generator<unknown, T, unknown> | T): T {\n if (!isIterator(val)) return val\n let value: any\n let done = false\n let next = 'next'\n do {\n const state = val[next](value)\n done = state.done\n value = state.value\n next = 'next'\n if (isIterator(value)) {\n try {\n value = toValueSync(value)\n } catch (err) {\n next = 'throw'\n value = err\n }\n }\n } while (!done)\n return value\n}\n","import { changeCase, padStart, padEnd } from './underscore'\nimport { LiquidDate } from './liquid-date'\n\nconst rFormat = /%([-_0^#:]+)?(\\d+)?([EO])?(.)/\ninterface FormatOptions {\n flags: object;\n width?: string;\n modifier?: string;\n}\n\n// prototype extensions\nfunction daysInMonth (d: LiquidDate) {\n const feb = isLeapYear(d) ? 29 : 28\n return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]\n}\nfunction getDayOfYear (d: LiquidDate) {\n let num = 0\n for (let i = 0; i < d.getMonth(); ++i) {\n num += daysInMonth(d)[i]\n }\n return num + d.getDate()\n}\nfunction getWeekOfYear (d: LiquidDate, startDay: number) {\n // Skip to startDay of this week\n const now = 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 String(Math.floor((now - then) / 7) + 1)\n}\nfunction isLeapYear (d: LiquidDate) {\n const year = d.getFullYear()\n return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)))\n}\nfunction ordinal (d: LiquidDate) {\n const date = d.getDate()\n if ([11, 12, 13].includes(date)) return 'th'\n\n switch (date % 10) {\n case 1: return 'st'\n case 2: return 'nd'\n case 3: return 'rd'\n default: return 'th'\n }\n}\nfunction century (d: LiquidDate) {\n return parseInt(d.getFullYear().toString().substring(0, 2), 10)\n}\n\n// default to 0\nconst padWidths = {\n d: 2,\n e: 2,\n H: 2,\n I: 2,\n j: 3,\n k: 2,\n l: 2,\n L: 3,\n m: 2,\n M: 2,\n S: 2,\n U: 2,\n W: 2\n}\n\nconst padSpaceChars = new Set('aAbBceklpP')\n\nfunction getTimezoneOffset (d: LiquidDate, opts: FormatOptions) {\n const nOffset = Math.abs(d.getTimezoneOffset())\n const h = Math.floor(nOffset / 60)\n const m = nOffset % 60\n return (d.getTimezoneOffset() > 0 ? '-' : '+') +\n padStart(h, 2, '0') +\n (opts.flags[':'] ? ':' : '') +\n padStart(m, 2, '0')\n}\nconst formatCodes = {\n a: (d: LiquidDate) => d.getShortWeekdayName(),\n A: (d: LiquidDate) => d.getLongWeekdayName(),\n b: (d: LiquidDate) => d.getShortMonthName(),\n B: (d: LiquidDate) => d.getLongMonthName(),\n c: (d: LiquidDate) => d.toLocaleString(),\n C: (d: LiquidDate) => century(d),\n d: (d: LiquidDate) => d.getDate(),\n e: (d: LiquidDate) => d.getDate(),\n H: (d: LiquidDate) => d.getHours(),\n I: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n j: (d: LiquidDate) => getDayOfYear(d),\n k: (d: LiquidDate) => d.getHours(),\n l: (d: LiquidDate) => String(d.getHours() % 12 || 12),\n L: (d: LiquidDate) => d.getMilliseconds(),\n m: (d: LiquidDate) => d.getMonth() + 1,\n M: (d: LiquidDate) => d.getMinutes(),\n N: (d: LiquidDate, opts: FormatOptions) => {\n const width = Number(opts.width) || 9\n const str = String(d.getMilliseconds()).slice(0, width)\n return padEnd(str, width, '0')\n },\n p: (d: LiquidDate) => (d.getHours() < 12 ? 'AM' : 'PM'),\n P: (d: LiquidDate) => (d.getHours() < 12 ? 'am' : 'pm'),\n q: (d: LiquidDate) => ordinal(d),\n s: (d: LiquidDate) => Math.round(d.getTime() / 1000),\n S: (d: LiquidDate) => d.getSeconds(),\n u: (d: LiquidDate) => d.getDay() || 7,\n U: (d: LiquidDate) => getWeekOfYear(d, 0),\n w: (d: LiquidDate) => d.getDay(),\n W: (d: LiquidDate) => getWeekOfYear(d, 1),\n x: (d: LiquidDate) => d.toLocaleDateString(),\n X: (d: LiquidDate) => d.toLocaleTimeString(),\n y: (d: LiquidDate) => d.getFullYear().toString().slice(2, 4),\n Y: (d: LiquidDate) => d.getFullYear(),\n z: getTimezoneOffset,\n Z: (d: LiquidDate, opts: FormatOptions) => d.getTimeZoneName() || getTimezoneOffset(d, opts),\n 't': () => '\\t',\n 'n': () => '\\n',\n '%': () => '%'\n};\n(formatCodes as any).h = formatCodes.b\n\nexport function strftime (d: LiquidDate, formatStr: string) {\n let output = ''\n let remaining = formatStr\n let match\n while ((match = rFormat.exec(remaining))) {\n output += remaining.slice(0, match.index)\n remaining = remaining.slice(match.index + match[0].length)\n output += format(d, match)\n }\n return output + remaining\n}\n\nfunction format (d: LiquidDate, match: RegExpExecArray) {\n const [input, flagStr = '', width, modifier, conversion] = match\n const convert = formatCodes[conversion]\n if (!convert) return input\n const flags = {}\n for (const flag of flagStr) flags[flag] = true\n let ret = String(convert(d, { flags, width, modifier }))\n let padChar = padSpaceChars.has(conversion) ? ' ' : '0'\n let padWidth = width || padWidths[conversion] || 0\n if (flags['^']) ret = ret.toUpperCase()\n else if (flags['#']) ret = changeCase(ret)\n if (flags['_']) padChar = ' '\n else if (flags['0']) padChar = '0'\n if (flags['-']) padWidth = 0\n return padStart(ret, padWidth, padChar)\n}\n","export function getDateTimeFormat () {\n return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined)\n}\n","import { getDateTimeFormat } from './intl'\nimport { isString } from './underscore'\n\n// one minute in milliseconds\nconst OneMinute = 60000\n/**\n * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS\n * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3\n */\nconst TIMEZONE_PATTERN = /([zZ]|([+-])(\\d{2}):?(\\d{2}))$/\nconst monthNames = [\n 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December'\n]\nconst monthNamesShort = monthNames.map(name => name.slice(0, 3))\nconst dayNames = [\n 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'\n]\nconst dayNamesShort = dayNames.map(name => name.slice(0, 3))\n\n/**\n * A date implementation with timezone info, just like Ruby date\n *\n * Implementation:\n * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods\n * - rewrite getTimezoneOffset() to trick strftime\n */\nexport class LiquidDate {\n private timezoneOffset: number\n private timezoneName: string\n private date: Date\n private displayDate: Date\n private DateTimeFormat = getDateTimeFormat()\n public timezoneFixed: boolean\n constructor (\n init: string | number | Date,\n private locale: string,\n timezone?: number | string\n ) {\n this.date = new Date(init)\n this.timezoneFixed = timezone !== undefined\n if (timezone === undefined) {\n timezone = this.date.getTimezoneOffset()\n }\n this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone\n this.timezoneName = isString(timezone) ? timezone : ''\n\n const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute\n const time = this.date.getTime() + diff\n this.displayDate = new Date(time)\n }\n\n getTime () {\n return this.displayDate.getTime()\n }\n getMilliseconds () {\n return this.displayDate.getMilliseconds()\n }\n getSeconds () {\n return this.displayDate.getSeconds()\n }\n getMinutes () {\n return this.displayDate.getMinutes()\n }\n getHours () {\n return this.displayDate.getHours()\n }\n getDay () {\n return this.displayDate.getDay()\n }\n getDate () {\n return this.displayDate.getDate()\n }\n getMonth () {\n return this.displayDate.getMonth()\n }\n getFullYear () {\n return this.displayDate.getFullYear()\n }\n toLocaleString (locale?: string, init?: any) {\n if (init?.timeZone) {\n return this.date.toLocaleString(locale, init)\n }\n return this.displayDate.toLocaleString(locale, init)\n }\n toLocaleTimeString (locale?: string) {\n return this.displayDate.toLocaleTimeString(locale)\n }\n toLocaleDateString (locale?: string) {\n return this.displayDate.toLocaleDateString(locale)\n }\n getTimezoneOffset () {\n return this.timezoneOffset!\n }\n getTimeZoneName () {\n if (this.timezoneFixed) return this.timezoneName\n if (!this.DateTimeFormat) return\n return this.DateTimeFormat().resolvedOptions().timeZone\n }\n getLongMonthName () {\n return this.format({ month: 'long' }) ?? monthNames[this.getMonth()]\n }\n getShortMonthName () {\n return this.format({ month: 'short' }) ?? monthNamesShort[this.getMonth()]\n }\n getLongWeekdayName () {\n return this.format({ weekday: 'long' }) ?? dayNames[this.displayDate.getDay()]\n }\n getShortWeekdayName () {\n return this.format({ weekday: 'short' }) ?? dayNamesShort[this.displayDate.getDay()]\n }\n valid () {\n return !isNaN(this.getTime())\n }\n private format (options: Intl.DateTimeFormatOptions) {\n return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate)\n }\n\n /**\n * Create a Date object fixed to it's declared Timezone. Both\n * - 2021-08-06T02:29:00.000Z and\n * - 2021-08-06T02:29:00.000+08:00\n * will always be displayed as\n * - 2021-08-06 02:29:00\n * regardless timezoneOffset in JavaScript realm\n *\n * The implementation hack:\n * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,\n * we create a different Date to trick strftime, it's both simpler and more performant.\n * Given that a template is expected to be parsed fewer times than rendered.\n */\n static createDateFixedToTimezone (dateString: string, locale: string): LiquidDate {\n const m = dateString.match(TIMEZONE_PATTERN)\n // representing a UTC timestamp\n if (m && m[1] === 'Z') {\n return new LiquidDate(+new Date(dateString), locale, 0)\n }\n // has a timezone specified\n if (m && m[2] && m[3] && m[4]) {\n const [, , sign, hours, minutes] = m\n const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10))\n return new LiquidDate(+new Date(dateString), locale, offset)\n }\n return new LiquidDate(dateString, locale)\n }\n private static getTimezoneOffset (timezoneName: string, date: Date) {\n const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName })\n const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' })\n\n const localDate = new Date(localDateString)\n const utcDate = new Date(utcDateString)\n return (+utcDate - +localDate) / (60 * 1000)\n }\n}\n","import { assert } from './assert'\n\nexport class Limiter {\n private message: string\n private base = 0\n private limit: number\n constructor (resource: string, limit: number) {\n this.message = `${resource} limit exceeded`\n this.limit = limit\n }\n use (count: number) {\n count = +count || 0\n assert(this.base + count <= this.limit, this.message)\n this.base += count\n }\n check (count: number) {\n count = +count || 0\n assert(count <= this.limit, this.message)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { TYPES, BLANK } from '../util'\n\nexport abstract class DelimitedToken extends Token {\n public trimLeft = false\n public trimRight = false\n public contentRange: [number, number]\n public constructor (\n kind: TokenKind,\n [contentBegin, contentEnd]: [number, number],\n input: string,\n begin: number,\n end: number,\n trimLeft: boolean,\n trimRight: boolean,\n file?: string\n ) {\n super(kind, input, begin, end, file)\n const tl = input[contentBegin] === '-'\n const tr = input[contentEnd - 1] === '-'\n\n let l = tl ? contentBegin + 1 : contentBegin\n let r = tr ? contentEnd - 1 : contentEnd\n while (l < r && (TYPES[input.charCodeAt(l)] & BLANK)) l++\n while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK)) r--\n\n this.contentRange = [l, r]\n this.trimLeft = tl || trimLeft\n this.trimRight = tr || trimRight\n }\n get content () {\n return this.input.slice(this.contentRange[0], this.contentRange[1])\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { Tokenizer, TokenKind } from '../parser'\nimport type { NormalizedFullOptions } from '../liquid-options'\n\nexport class TagToken extends DelimitedToken {\n public name: string\n public tokenizer: Tokenizer\n public readonly args: string;\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options\n const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length]\n super(TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file)\n\n this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange)\n this.name = this.tokenizer.readTagName()\n this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`)\n this.tokenizer.skipBlank()\n this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1])\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { TokenKind } from '../parser'\n\nexport class OutputToken extends DelimitedToken {\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options\n const valueRange: [number, number] = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length]\n super(TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class HTMLToken extends Token {\n trimLeft = 0\n trimRight = 0\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.HTML, input, begin, end, file)\n }\n public getContent () {\n return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight)\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class NumberToken extends Token {\n public content: number\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Number, input, begin, end, file)\n this.content = Number(this.getText())\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport class IdentifierToken extends Token {\n public content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Word, input, begin, end, file)\n this.content = this.getText()\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { literalValues, LiteralValue } from '../util'\n\nexport class LiteralToken extends Token {\n public content: LiteralValue\n public literal: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Literal, input, begin, end, file)\n this.literal = this.getText()\n this.content = literalValues[this.literal]\n }\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\n\nexport const enum OperatorType {\n Binary,\n Unary\n}\n\nexport const operatorPrecedences = {\n '==': 2,\n '!=': 2,\n '>': 2,\n '<': 2,\n '>=': 2,\n '<=': 2,\n 'contains': 2,\n 'not': 1,\n 'and': 0,\n 'or': 0\n}\n\nexport const operatorTypes = {\n '==': OperatorType.Binary,\n '!=': OperatorType.Binary,\n '>': OperatorType.Binary,\n '<': OperatorType.Binary,\n '>=': OperatorType.Binary,\n '<=': OperatorType.Binary,\n 'contains': OperatorType.Binary,\n 'not': OperatorType.Unary,\n 'and': OperatorType.Binary,\n 'or': OperatorType.Binary\n}\n\nexport class OperatorToken extends Token {\n public operator: string\n public constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Operator, input, begin, end, file)\n this.operator = this.getText()\n }\n getPrecedence () {\n const key = this.getText()\n return key in operatorPrecedences ? operatorPrecedences[key] : 1\n }\n}\n","import { Token } from './token'\nimport { LiteralToken } from './literal-token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { NumberToken } from './number-token'\nimport { RangeToken } from './range-token'\nimport { QuotedToken } from './quoted-token'\nimport { TokenKind } from '../parser'\n\nexport class PropertyAccessToken extends Token {\n constructor (\n public variable: QuotedToken | RangeToken | LiteralToken | NumberToken | undefined,\n public props: (ValueToken | IdentifierToken)[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.PropertyAccess, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { FilterArg } from '../parser/filter-arg'\nimport { TokenKind } from '../parser'\n\nexport class FilterToken extends Token {\n public constructor (\n public name: string,\n public args: FilterArg[],\n input: string,\n begin: number,\n end: number,\n file?: string\n ) {\n super(TokenKind.Filter, input, begin, end, file)\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { IdentifierToken } from './identifier-token'\nimport { TokenKind } from '../parser'\n\nexport class HashToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public name: IdentifierToken,\n public value?: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Hash, input, begin, end, file)\n }\n}\n","const rHex = /[\\da-fA-F]/\nconst rOct = /[0-7]/\nconst escapeChar = {\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t',\n v: '\\x0B'\n}\n\nfunction hexVal (c: string) {\n const code = c.charCodeAt(0)\n if (code >= 97) return code - 87\n if (code >= 65) return code - 55\n return code - 48\n}\n\nexport function parseStringLiteral (str: string): string {\n let ret = ''\n for (let i = 1; i < str.length - 1; i++) {\n if (str[i] !== '\\\\') {\n ret += str[i]\n continue\n }\n if (escapeChar[str[i + 1]] !== undefined) {\n ret += escapeChar[str[++i]]\n } else if (str[i + 1] === 'u') {\n let val = 0\n let j = i + 2\n while (j <= i + 5 && rHex.test(str[j])) {\n val = val * 16 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n } else if (!rOct.test(str[i + 1])) {\n ret += str[++i]\n } else {\n let j = i + 1\n let val = 0\n while (j <= i + 3 && rOct.test(str[j])) {\n val = val * 8 + hexVal(str[j++])\n }\n i = j - 1\n ret += String.fromCharCode(val)\n }\n }\n return ret\n}\n","import { Token } from './token'\nimport { TokenKind } from '../parser'\nimport { parseStringLiteral } from '../render/string'\n\nexport class QuotedToken extends Token {\n public readonly content: string\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.Quoted, input, begin, end, file)\n this.content = parseStringLiteral(this.getText())\n }\n}\n","import { Token } from './token'\nimport { ValueToken } from './value-token'\nimport { TokenKind } from '../parser'\n\nexport class RangeToken extends Token {\n constructor (\n public input: string,\n public begin: number,\n public end: number,\n public lhs: ValueToken,\n public rhs: ValueToken,\n public file?: string\n ) {\n super(TokenKind.Range, input, begin, end, file)\n }\n}\n","import { DelimitedToken } from './delimited-token'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { Tokenizer, TokenKind } from '../parser'\n\n/**\n * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`\n */\nexport class LiquidTagToken extends DelimitedToken {\n public name: string\n public tokenizer: Tokenizer\n public constructor (\n input: string,\n begin: number,\n end: number,\n options: NormalizedFullOptions,\n file?: string\n ) {\n super(TokenKind.Tag, [begin, end], input, begin, end, false, false, file)\n this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange)\n this.name = this.tokenizer.readTagName()\n this.tokenizer.assert(this.name, 'illegal liquid tag syntax')\n this.tokenizer.skipBlank()\n }\n\n get args (): string {\n return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1])\n }\n}\n","import { Token } from './token'\nimport { FilterToken } from './filter-token'\nimport { TokenKind } from '../parser'\nimport { Expression } from '../render'\n\n/**\n * value expression with optional filters\n * e.g.\n * {% assign foo=\"bar\" | append: \"coo\" %}\n */\nexport class FilteredValueToken extends Token {\n constructor (\n public initial: Expression,\n public filters: FilterToken[],\n public input: string,\n public begin: number,\n public end: number,\n public file?: string\n ) {\n super(TokenKind.FilteredValue, input, begin, end, file)\n }\n}\n","interface LiquidPerformance {\n now: () => number\n}\n\nconst polyfill: LiquidPerformance = {\n now: () => Date.now()\n}\n\nexport function getPerformance (): LiquidPerformance {\n return (typeof global === 'object' && global.performance) ||\n (typeof window === 'object' && window.performance) ||\n polyfill\n}\n","import { getPerformance } from '../util/performance'\nimport { toPromise, RenderError, LiquidErrors, LiquidError } from '../util'\nimport { Context } from '../context'\nimport { Template } from '../template'\nimport { Emitter, KeepingTypeEmitter, StreamedEmitter, SimpleEmitter } from '../emitters'\n\nexport class Render {\n public renderTemplatesToNodeStream (templates: Template[], ctx: Context): NodeJS.ReadableStream {\n const emitter = new StreamedEmitter()\n Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter)))\n .then(() => emitter.end(), err => emitter.error(err))\n return emitter.stream\n }\n public * renderTemplates (templates: Template[], ctx: Context, emitter?: Emitter): IterableIterator<any> {\n if (!emitter) {\n emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter()\n }\n const errors = []\n for (const tpl of templates) {\n ctx.renderLimit.check(getPerformance().now())\n try {\n // if tpl.render supports emitter, it'll return empty `html`\n const html = yield tpl.render(ctx, emitter)\n // if not, it'll return an `html`, write to the emitter for it\n html && emitter.write(html)\n if (ctx.breakCalled || ctx.continueCalled) break\n } catch (e) {\n const err = LiquidError.is(e) ? e : new RenderError(e as Error, tpl)\n if (ctx.opts.catchAllErrors) errors.push(err)\n else throw err\n }\n }\n if (errors.length) {\n throw new LiquidErrors(errors)\n }\n return emitter.buffer\n }\n}\n","import { QuotedToken, RangeToken, OperatorToken, Token, PropertyAccessToken, OperatorType, operatorTypes } from '../tokens'\nimport { isRangeToken, isPropertyAccessToken, UndefinedVariableError, range, isOperatorToken, assert } from '../util'\nimport type { Context } from '../context'\nimport type { UnaryOperatorHandler } from '../render'\nimport { Drop } from '../drop'\n\nexport class Expression {\n readonly postfix: Token[]\n\n public constructor (tokens: IterableIterator<Token>) {\n this.postfix = [...toPostfix(tokens)]\n }\n public * evaluate (ctx: Context, lenient?: boolean): Generator<unknown, unknown, unknown> {\n assert(ctx, 'unable to evaluate: context not defined')\n const operands: any[] = []\n for (const token of this.postfix) {\n if (isOperatorToken(token)) {\n const r = operands.pop()\n let result\n if (operatorTypes[token.operator] === OperatorType.Unary) {\n result = yield (ctx.opts.operators[token.operator] as UnaryOperatorHandler)(r, ctx)\n } else {\n const l = operands.pop()\n result = yield ctx.opts.operators[token.operator](l, r, ctx)\n }\n operands.push(result)\n } else {\n operands.push(yield evalToken(token, ctx, lenient))\n }\n }\n return operands[0]\n }\n public valid () {\n return !!this.postfix.length\n }\n}\n\nexport function * evalToken (token: Token | undefined, ctx: Context, lenient = false): IterableIterator<unknown> {\n if (!token) return\n if ('content' in token) return token.content\n if (isPropertyAccessToken(token)) return yield evalPropertyAccessToken(token, ctx, lenient)\n if (isRangeToken(token)) return yield evalRangeToken(token, ctx)\n}\n\nfunction * evalPropertyAccessToken (token: PropertyAccessToken, ctx: Context, lenient: boolean): IterableIterator<unknown> {\n const props: (string | number | Drop)[] = []\n for (const prop of token.props) {\n props.push((yield evalToken(prop, ctx, false)) as unknown as string | number | Drop)\n }\n try {\n if (token.variable) {\n const variable = yield evalToken(token.variable, ctx, lenient)\n return yield ctx._getFromScope(variable, props)\n } else {\n return yield ctx._get(props)\n }\n } catch (e) {\n if (lenient && (e as Error).name === 'InternalUndefinedVariableError') return null\n throw (new UndefinedVariableError(e as Error, token))\n }\n}\n\nexport function evalQuotedToken (token: QuotedToken) {\n return token.content\n}\n\nfunction * evalRangeToken (token: RangeToken, ctx: Context) {\n const low: number = yield evalToken(token.lhs, ctx)\n const high: number = yield evalToken(token.rhs, ctx)\n ctx.memoryLimit.use(high - low + 1)\n return range(+low, +high + 1)\n}\n\nfunction * toPostfix (tokens: IterableIterator<Token>): IterableIterator<Token> {\n const ops: OperatorToken[] = []\n for (const token of tokens) {\n if (isOperatorToken(token)) {\n while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {\n yield ops.pop()!\n }\n ops.push(token)\n } else yield token\n }\n while (ops.length) {\n yield ops.pop()!\n }\n}\n","import { Context } from '../context/context'\nimport { toValue } from '../util'\n\nexport function isTruthy (val: any, ctx: Context): boolean {\n return !isFalsy(val, ctx)\n}\n\nexport function isFalsy (val: any, ctx: Context): boolean {\n val = toValue(val)\n\n if (ctx.opts.jsTruthy) {\n return !val\n } else {\n return val === false || undefined === val || val === null\n }\n}\n","import { isComparable } from '../drop/comparable'\nimport { Context } from '../context'\nimport { toValue } from '../util'\nimport { isFalsy, isTruthy } from '../render/boolean'\nimport { isArray, isFunction } from '../util/underscore'\n\nexport type UnaryOperatorHandler = (operand: any, ctx: Context) => boolean;\nexport type BinaryOperatorHandler = (lhs: any, rhs: any, ctx: Context) => boolean;\nexport type OperatorHandler = UnaryOperatorHandler | BinaryOperatorHandler;\nexport type Operators = Record<string, OperatorHandler>\n\nexport const defaultOperators: Operators = {\n '==': equals,\n '!=': (l: any, r: any) => !equals(l, r),\n '>': (l: any, r: any) => {\n if (isComparable(l)) return l.gt(r)\n if (isComparable(r)) return r.lt(l)\n return toValue(l) > toValue(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 toValue(l) < toValue(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 toValue(l) >= toValue(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 toValue(l) <= toValue(r)\n },\n 'contains': (l: any, r: any) => {\n l = toValue(l)\n if (isArray(l)) return l.some((i) => equals(i, r))\n if (isFunction(l?.indexOf)) return l.indexOf(toValue(r)) > -1\n return false\n },\n 'not': (v: any, ctx: Context) => isFalsy(toValue(v), ctx),\n 'and': (l: any, r: any, ctx: Context) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx),\n 'or': (l: any, r: any, ctx: Context) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx)\n}\n\nexport function equals (lhs: any, rhs: any): boolean {\n if (isComparable(lhs)) return lhs.equals(rhs)\n if (isComparable(rhs)) return rhs.equals(lhs)\n lhs = toValue(lhs)\n rhs = toValue(rhs)\n if (isArray(lhs)) {\n return isArray(rhs) && arrayEquals(lhs, rhs)\n }\n return lhs === rhs\n}\n\nfunction arrayEquals (lhs: any[], rhs: any[]): boolean {\n if (lhs.length !== rhs.length) return false\n return !lhs.some((value, i) => !equals(value, rhs[i]))\n}\n\nexport function arrayIncludes (arr: any[], item: any): boolean {\n return arr.some(value => equals(value, item))\n}\n","import { Cache } from './cache'\n\nclass Node<T> {\n constructor (\n public key: string,\n public value: T,\n public next: Node<T>,\n public prev: Node<T>\n ) {}\n}\n\nexport class LRU<T> implements Cache<T> {\n private cache: Record<string, Node<T>> = {}\n private head: Node<T>\n private tail: Node<T>\n\n constructor (\n public limit: number,\n public size = 0\n ) {\n this.head = new Node<T>('HEAD', null as any, null as any, null as any)\n this.tail = new Node<T>('TAIL', null as any, null as any, null as any)\n this.head.next = this.tail\n this.tail.prev = this.head\n }\n\n write (key: string, value: T) {\n if (this.cache[key]) {\n this.cache[key].value = value\n } else {\n const node = new Node(key, value, this.head.next, this.head)\n this.head.next.prev = node\n this.head.next = node\n\n this.cache[key] = node\n this.size++\n this.ensureLimit()\n }\n }\n\n read (key: string): T | undefined {\n if (!this.cache[key]) return\n const { value } = this.cache[key]\n this.remove(key)\n this.write(key, value)\n return value\n }\n\n remove (key: string) {\n const node = this.cache[key]\n node.prev.next = node.next\n node.next.prev = node.prev\n delete this.cache[key]\n this.size--\n }\n\n clear () {\n this.head.next = this.tail\n this.tail.prev = this.head\n this.size = 0\n this.cache = {}\n }\n\n private ensureLimit () {\n if (this.size > this.limit) this.remove(this.tail.prev.key)\n }\n}\n","import { last } from '../util'\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\nexport function 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\nexport async function readFile (url: string): Promise<string> {\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\nexport function readFileSync (url: string): string {\n const xhr = new XMLHttpRequest()\n xhr.open('GET', url, false)\n xhr.send()\n if (xhr.status < 200 || xhr.status >= 300) {\n throw new Error(xhr.statusText)\n }\n return xhr.responseText as string\n}\n\nexport async function exists (filepath: string) {\n return true\n}\n\nexport function existsSync (filepath: string) {\n return true\n}\n\nexport function dirname (filepath: string) {\n return domResolve(filepath, '.')\n}\n\nexport const sep = '/'\n","import { isFalsy } from '../render/boolean'\nimport { identify, isArray, isString, toValue } from '../util/underscore'\nimport { FilterImpl } from '../template'\n\nfunction defaultFilter<T1 extends boolean, T2> (this: FilterImpl, value: T1, defaultValue: T2, ...args: Array<[string, any]>): T1 | T2 {\n value = toValue(value)\n if (isArray(value) || isString(value)) return value.length ? value : defaultValue\n if (value === false && (new Map(args)).get('allow_false')) return false as T1\n return isFalsy(value, this.context) ? defaultValue : value\n}\n\nfunction json (value: any, space = 0) {\n return JSON.stringify(value, null, space)\n}\n\nfunction inspect (value: any, space = 0) {\n const ancestors: object[] = []\n return JSON.stringify(value, function (this: unknown, _key: unknown, value: any) {\n if (typeof value !== 'object' || value === null) return value\n // `this` is the object that value is contained in, i.e., its direct parent.\n while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) ancestors.pop()\n if (ancestors.includes(value)) return '[Circular]'\n ancestors.push(value)\n return value\n }, space)\n}\n\nfunction to_integer (value: any) {\n return Number(value)\n}\n\nconst raw = {\n raw: true,\n handler: identify\n}\n\nexport default {\n default: defaultFilter,\n raw,\n jsonify: json,\n to_integer,\n json,\n inspect\n}\n","import { FilterImpl } from '../template'\nimport { stringify } from '../util/underscore'\n\nconst escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": '''\n}\nconst unescapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '"': '\"',\n ''': \"'\"\n}\n\nexport function escape (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.replace(/&|<|>|\"|'/g, m => escapeMap[m])\n}\n\nexport function xml_escape (this: FilterImpl, str: string) {\n return escape.call(this, str)\n}\n\nfunction unescape (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m])\n}\n\nexport function escape_once (this: FilterImpl, str: string) {\n return escape.call(this, unescape.call(this, str))\n}\n\nexport function newline_to_br (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\r?\\n/gm, '<br />\\n')\n}\n\nexport function strip_html (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/<script[\\s\\S]*?<\\/script>|<style[\\s\\S]*?<\\/style>|<.*?>|<!--[\\s\\S]*?-->/g, '')\n}\n","import { isNil } from '../util'\n\nexport class MapFS {\n constructor (private mapping: {[key: string]: string}) {}\n\n public sep = '/'\n\n async exists (filepath: string) {\n return this.existsSync(filepath)\n }\n\n existsSync (filepath: string) {\n return !isNil(this.mapping[filepath])\n }\n\n async readFile (filepath: string) {\n return this.readFileSync(filepath)\n }\n\n readFileSync (filepath: string) {\n const content = this.mapping[filepath]\n if (isNil(content)) throw new Error(`ENOENT: ${filepath}`)\n return content\n }\n\n dirname (filepath: string) {\n const segments = filepath.split(this.sep)\n segments.pop()\n return segments.join(this.sep)\n }\n\n resolve (dir: string, file: string, ext: string) {\n file += ext\n if (dir === '.') return file\n const segments = dir.split(/\\/+/)\n for (const segment of file.split(this.sep)) {\n if (segment === '.' || segment === '') continue\n else if (segment === '..') {\n if (segments.length > 1 || segments[0] !== '') segments.pop()\n } else segments.push(segment)\n }\n return segments.join(this.sep)\n }\n}\n","import { assert, isArray, isString, isFunction } from './util'\nimport { getDateTimeFormat } from './util/intl'\nimport { LRU, LiquidCache } from './cache'\nimport { FS, LookupType } from './fs'\nimport * as fs from './fs/fs-impl'\nimport { defaultOperators, Operators } from './render'\nimport misc from './filters/misc'\nimport { escape } from './filters/html'\nimport { MapFS } from './fs/map-fs'\n\ntype OutputEscape = (value: any) => string\ntype OutputEscapeOption = 'escape' | 'json' | OutputEscape\n\nexport interface LiquidOptions {\n /** A directory or an array of directories from where to resolve layout and include templates, and the filename passed to `.renderFile()`. If it's an array, the files are looked up in the order they occur in the array. Defaults to `[\".\"]` */\n root?: string | string[];\n /** A directory or an array of directories from where to resolve included templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n partials?: string | string[];\n /** A directory or an array of directories from where to resolve layout templates. If it's an array, the files are looked up in the order they occur in the array. Defaults to `root` */\n layouts?: string | string[];\n /** Allow refer to layouts/partials by relative pathname. To avoid arbitrary filesystem read, paths been referenced also need to be within corresponding root, partials, layouts. Defaults to `true`. */\n relativeReference?: boolean;\n /** Use jekyll style include, pass parameters to `include` variable of current scope. Defaults to `false`. */\n jekyllInclude?: boolean;\n /** Use jekyll style where filter, enables array item match. Defaults to `false`. */\n jekyllWhere?: boolean;\n /** Add a extname (if filepath doesn't include one) before template file lookup. Eg: setting to `\".html\"` will allow including file by basename. Defaults to `\"\"`. */\n extname?: string;\n /** Whether or not to cache resolved templates. Defaults to `false`. */\n cache?: boolean | number | LiquidCache;\n /** Use JavaScript Truthiness. Defaults to `false`. */\n jsTruthy?: boolean;\n /** If set, treat the `filepath` parameter in `{%include filepath %}` and `{%layout filepath%}` as a variable, otherwise as a literal value. Defaults to `true`. */\n dynamicPartials?: boolean;\n /** Whether or not to assert filter existence. If set to `false`, undefined filters will be skipped. Otherwise, undefined filters will cause an exception. Defaults to `false`. */\n strictFilters?: boolean;\n /** Whether or not to assert variable existence. If set to `false`, undefined variables will be rendered as empty string. Otherwise, undefined variables will cause an exception. Defaults to `false`. */\n strictVariables?: boolean;\n /** Catch all errors instead of exit upon one. Please note that render errors won't be reached when parse fails. */\n catchAllErrors?: boolean;\n /** Hide scope variables from prototypes, useful when you're passing a not sanitized object into LiquidJS or need to hide prototypes from templates. */\n ownPropertyOnly?: boolean;\n /** Modifies the behavior of `strictVariables`. If set, a single undefined variable will *not* cause an exception in the context of the `if`/`elsif`/`unless` tag and the `default` filter. Instead, it will evaluate to `false` and `null`, respectively. Irrelevant if `strictVariables` is not set. Defaults to `false`. **/\n lenientIf?: boolean;\n /** JavaScript timezone name or timezoneOffset for `date` filter, default to local time. That means if you're in Australia (UTC+10), it'll default to `-600` or `Australia/Lindeman` */\n timezoneOffset?: number | string;\n /** Default date format to use if the date filter doesn't include a format. Defaults to `%A, %B %-e, %Y at %-l:%M %P %z`. */\n dateFormat?: string;\n /** Default locale, will be used by date filter. Defaults to system locale. */\n locale?: string;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of tags (`{% %}`) until `\\n` (inclusive). Defaults to `false`. */\n trimTagRight?: boolean;\n /** Similar to `trimTagRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimTagLeft?: boolean;\n /** Strip blank characters (including ` `, `\\t`, and `\\r`) from the right of values (`{{ }}`) until `\\n` (inclusive). Defaults to `false`. */\n trimOutputRight?: boolean;\n /** Similar to `trimOutputRight`, whereas the `\\n` is exclusive. Defaults to `false`. See Whitespace Control for details. */\n trimOutputLeft?: boolean;\n /** The left delimiter for liquid tags. **/\n tagDelimiterLeft?: string;\n /** The right delimiter for liquid tags. **/\n tagDelimiterRight?: string;\n /** The left delimiter for liquid outputs. **/\n outputDelimiterLeft?: string;\n /** The right delimiter for liquid outputs. **/\n outputDelimiterRight?: string;\n /** Whether input strings to date filter preserve the given timezone **/\n preserveTimezones?: boolean;\n /** Whether `trim*Left`/`trim*Right` is greedy. When set to `true`, all consecutive blank characters including `\\n` will be trimmed regardless of line breaks. Defaults to `true`. */\n greedy?: boolean;\n /** `fs` is used to override the default file-system module with a custom implementation. */\n fs?: FS;\n /** keyValue separator */\n keyValueSeparator?: string;\n /** Render from in-memory `templates` mapping instead of file system. File system related options like `fs`, 'root', and `relativeReference` will be ignored when `templates` is specified. */\n templates?: {[key: string]: string};\n /** the global scope passed down to all partial and layout templates, i.e. templates included by `include`, `layout` and `render` tags. */\n globals?: object;\n /** Whether or not to keep value type when writing the Output, not working for streamed rendering. Defaults to `false`. */\n keepOutputType?: boolean;\n /** Default escape filter applied to output values, when set, you'll have to add `| raw` for values don't need to be escaped. Defaults to `undefined`. */\n outputEscape?: OutputEscapeOption;\n /** An object of operators for conditional statements. Defaults to the regular Liquid operators. */\n operators?: Operators;\n /** Respect parameter order when using filters like \"for ... reversed limit\", Defaults to `false`. */\n orderedFilterParameters?: boolean;\n /** For DoS handling, limit total length of templates parsed in one `parse()` call. A typical PC can handle 1e8 (100M) characters without issues. */\n parseLimit?: number;\n /** For DoS handling, limit total time (in ms) for each `render()` call. */\n renderLimit?: number;\n /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue. */\n memoryLimit?: number;\n}\n\nexport interface RenderOptions {\n /**\n * This call is sync or async? It's used by Liquid internal methods, you'll not need this.\n */\n sync?: boolean;\n /**\n * Same as `globals` on LiquidOptions, but only for current render() call\n */\n globals?: object;\n /**\n * Same as `strictVariables` on LiquidOptions, but only for current render() call\n */\n strictVariables?: boolean;\n /**\n * Same as `ownPropertyOnly` on LiquidOptions, but only for current render() call\n */\n ownPropertyOnly?: boolean;\n /** For DoS handling, limit total renders of tag/HTML/output in one `render()` call. A typical PC can handle 1e5 renders of typical templates per second. */\n templateLimit?: number;\n /** For DoS handling, limit total time (in ms) for each `render()` call. */\n renderLimit?: number;\n /** For DoS handling, limit new objects creation, including array concat/join/strftime, etc. A typical PC can handle 1e9 (1G) memory without issue.. */\n memoryLimit?: number;\n}\n\nexport interface RenderFileOptions extends RenderOptions {\n lookupType?: LookupType;\n}\n\ninterface NormalizedOptions extends LiquidOptions {\n root?: string[];\n partials?: string[];\n layouts?: string[];\n cache?: LiquidCache;\n outputEscape?: OutputEscape;\n}\n\nexport interface NormalizedFullOptions extends NormalizedOptions {\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n jekyllInclude: boolean;\n extname: string;\n cache?: LiquidCache;\n jsTruthy: boolean;\n dynamicPartials: boolean;\n fs: FS;\n strictFilters: boolean;\n strictVariables: boolean;\n ownPropertyOnly: boolean;\n lenientIf: boolean;\n dateFormat: string;\n locale: string;\n trimTagRight: boolean;\n trimTagLeft: boolean;\n trimOutputRight: boolean;\n trimOutputLeft: boolean;\n tagDelimiterLeft: string;\n tagDelimiterRight: string;\n outputDelimiterLeft: string;\n outputDelimiterRight: string;\n preserveTimezones: boolean;\n greedy: boolean;\n globals: object;\n keepOutputType: boolean;\n operators: Operators;\n parseLimit: number;\n renderLimit: number;\n memoryLimit: number;\n}\n\nexport const defaultOptions: NormalizedFullOptions = {\n root: ['.'],\n layouts: ['.'],\n partials: ['.'],\n relativeReference: true,\n jekyllInclude: false,\n keyValueSeparator: ':',\n cache: undefined,\n extname: '',\n fs: fs,\n dynamicPartials: true,\n jsTruthy: false,\n dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',\n locale: '',\n trimTagRight: false,\n trimTagLeft: false,\n trimOutputRight: false,\n trimOutputLeft: false,\n greedy: true,\n tagDelimiterLeft: '{%',\n tagDelimiterRight: '%}',\n outputDelimiterLeft: '{{',\n outputDelimiterRight: '}}',\n preserveTimezones: false,\n strictFilters: false,\n strictVariables: false,\n ownPropertyOnly: true,\n lenientIf: false,\n globals: {},\n keepOutputType: false,\n operators: defaultOperators,\n memoryLimit: Infinity,\n parseLimit: Infinity,\n renderLimit: Infinity\n}\n\nexport function normalize (options: LiquidOptions): NormalizedFullOptions {\n if (options.hasOwnProperty('root')) {\n if (!options.hasOwnProperty('partials')) options.partials = options.root\n if (!options.hasOwnProperty('layouts')) options.layouts = options.root\n }\n if (options.hasOwnProperty('cache')) {\n let cache: LiquidCache | undefined\n if (typeof options.cache === 'number') cache = options.cache > 0 ? new LRU(options.cache) : undefined\n else if (typeof options.cache === 'object') cache = options.cache\n else cache = options.cache ? new LRU(1024) : undefined\n options.cache = cache\n }\n options = { ...defaultOptions, ...(options.jekyllInclude ? { dynamicPartials: false } : {}), ...options }\n if ((!options.fs!.dirname || !options.fs!.sep) && options.relativeReference) {\n console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning')\n options.relativeReference = false\n }\n options.root = normalizeDirectoryList(options.root)\n options.partials = normalizeDirectoryList(options.partials)\n options.layouts = normalizeDirectoryList(options.layouts)\n options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape)\n if (!options.locale) {\n options.locale = getDateTimeFormat()?.().resolvedOptions().locale ?? 'en-US'\n }\n if (options.templates) {\n options.fs = new MapFS(options.templates)\n options.relativeReference = true\n options.root = options.partials = options.layouts = '.'\n }\n return options as NormalizedFullOptions\n}\n\nfunction getOutputEscapeFunction (nameOrFunction: OutputEscapeOption): OutputEscape {\n if (nameOrFunction === 'escape') return escape\n if (nameOrFunction === 'json') return misc.json\n assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function')\n return nameOrFunction\n}\n\nexport function normalizeDirectoryList (value: any): string[] {\n let list: string[] = []\n if (isArray(value)) list = value\n if (isString(value)) list = [value]\n return list\n}\n","import { Token } from '../tokens'\nimport { NormalizedFullOptions } from '../liquid-options'\nimport { isTagToken, isHTMLToken, isDelimitedToken, TYPES, INLINE_BLANK, BLANK } from '../util'\n\nexport function whiteSpaceCtrl (tokens: Token[], options: NormalizedFullOptions) {\n let inRaw = false\n\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i]\n if (!isDelimitedToken(token)) continue\n if (!inRaw && token.trimLeft) {\n trimLeft(tokens[i - 1], options.greedy)\n }\n\n if (isTagToken(token)) {\n if (token.name === 'raw') inRaw = true\n else if (token.name === 'endraw') inRaw = false\n }\n\n if (!inRaw && token.trimRight) {\n trimRight(tokens[i + 1], options.greedy)\n }\n }\n}\n\nfunction trimLeft (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask) token.trimRight++\n}\n\nfunction trimRight (token: Token, greedy: boolean) {\n if (!token || !isHTMLToken(token)) return\n\n const mask = greedy ? BLANK : INLINE_BLANK\n while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask) token.trimLeft++\n if (token.input.charAt(token.begin + token.trimLeft) === '\\n') token.trimLeft++\n}\n","import { FilteredValueToken, TagToken, HTMLToken, HashToken, QuotedToken, LiquidTagToken, OutputToken, ValueToken, Token, RangeToken, FilterToken, TopLevelToken, PropertyAccessToken, OperatorToken, LiteralToken, IdentifierToken, NumberToken } from '../tokens'\nimport { OperatorHandler } from '../render/operator'\nimport { TrieNode, LiteralValue, Trie, createTrie, ellipsis, literalValues, TokenizationError, TYPES, QUOTE, BLANK, NUMBER, SIGN, isWord, isString } from '../util'\nimport { Operators, Expression } from '../render'\nimport { NormalizedFullOptions, defaultOptions } from '../liquid-options'\nimport { FilterArg } from './filter-arg'\nimport { whiteSpaceCtrl } from './whitespace-ctrl'\n\nexport class Tokenizer {\n p: number\n N: number\n private rawBeginAt = -1\n private opTrie: Trie<OperatorHandler>\n private literalTrie: Trie<LiteralValue>\n\n constructor (\n public input: string,\n operators: Operators = defaultOptions.operators,\n public file?: string,\n range?: [number, number]\n ) {\n this.p = range ? range[0] : 0\n this.N = range ? range[1] : input.length\n this.opTrie = createTrie(operators)\n this.literalTrie = createTrie(literalValues)\n }\n\n readExpression () {\n return new Expression(this.readExpressionTokens())\n }\n\n * readExpressionTokens (): IterableIterator<Token> {\n while (this.p < this.N) {\n const operator = this.readOperator()\n if (operator) {\n yield operator\n continue\n }\n const operand = this.readValue()\n if (operand) {\n yield operand\n continue\n }\n return\n }\n }\n readOperator (): OperatorToken | undefined {\n this.skipBlank()\n const end = this.matchTrie(this.opTrie)\n if (end === -1) return\n return new OperatorToken(this.input, this.p, (this.p = end), this.file)\n }\n matchTrie<T> (trie: Trie<T>) {\n let node: TrieNode<T> = trie\n let i = this.p\n let info\n while (node[this.input[i]] && i < this.N) {\n node = node[this.input[i++]]\n if (node['end']) info = node\n }\n if (!info) return -1\n if (info['needBoundary'] && isWord(this.peek(i - this.p))) return -1\n return i\n }\n readFilteredValue (): FilteredValueToken {\n const begin = this.p\n const initial = this.readExpression()\n this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`)\n const filters = this.readFilters()\n return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file)\n }\n readFilters (): FilterToken[] {\n const filters = []\n while (true) {\n const filter = this.readFilter()\n if (!filter) return filters\n filters.push(filter)\n }\n }\n readFilter (): FilterToken | null {\n this.skipBlank()\n if (this.end()) return null\n this.assert(this.read() === '|', `expected \"|\" before filter`)\n const name = this.readIdentifier()\n if (!name.size()) {\n this.assert(this.end(), `expected filter name`)\n return null\n }\n const args = []\n this.skipBlank()\n if (this.peek() === ':') {\n do {\n ++this.p\n const arg = this.readFilterArg()\n arg && args.push(arg)\n this.skipBlank()\n this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`)\n } while (this.peek() === ',')\n } else if (this.peek() === '|' || this.end()) {\n // do nothing\n } else {\n throw this.error('expected \":\" after filter name')\n }\n return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file)\n }\n\n readFilterArg (): FilterArg | undefined {\n const key = this.readValue()\n if (!key) return\n this.skipBlank()\n if (this.peek() !== ':') return key\n ++this.p\n const value = this.readValue()\n return [key.getText(), value]\n }\n\n readTopLevelTokens (options: NormalizedFullOptions = defaultOptions): TopLevelToken[] {\n const tokens: TopLevelToken[] = []\n while (this.p < this.N) {\n const token = this.readTopLevelToken(options)\n tokens.push(token)\n }\n whiteSpaceCtrl(tokens, options)\n return tokens\n }\n\n readTopLevelToken (options: NormalizedFullOptions): TopLevelToken {\n const { tagDelimiterLeft, outputDelimiterLeft } = options\n if (this.rawBeginAt > -1) return this.readEndrawOrRawContent(options)\n if (this.match(tagDelimiterLeft)) return this.readTagToken(options)\n if (this.match(outputDelimiterLeft)) return this.readOutputToken(options)\n return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft])\n }\n\n readHTMLToken (stopStrings: string[]): HTMLToken {\n const begin = this.p\n while (this.p < this.N) {\n if (stopStrings.some(str => this.match(str))) break\n ++this.p\n }\n return new HTMLToken(this.input, begin, this.p, this.file)\n }\n\n readTagToken (options: NormalizedFullOptions): TagToken {\n const { file, input } = this\n const begin = this.p\n if (this.readToDelimiter(options.tagDelimiterRight) === -1) {\n throw this.error(`tag ${this.snapshot(begin)} not closed`, begin)\n }\n const token = new TagToken(input, begin, this.p, options, file)\n if (token.name === 'raw') this.rawBeginAt = begin\n return token\n }\n\n readToDelimiter (delimiter: string, respectQuoted = false) {\n this.skipBlank()\n while (this.p < this.N) {\n if (respectQuoted && (this.peekType() & QUOTE)) {\n this.readQuoted()\n continue\n }\n ++this.p\n if (this.rmatch(delimiter)) return this.p\n }\n return -1\n }\n\n readOutputToken (options: NormalizedFullOptions = defaultOptions): OutputToken {\n const { file, input } = this\n const { outputDelimiterRight } = options\n const begin = this.p\n if (this.readToDelimiter(outputDelimiterRight, true) === -1) {\n throw this.error(`output ${this.snapshot(begin)} not closed`, begin)\n }\n return new OutputToken(input, begin, this.p, options, file)\n }\n\n readEndrawOrRawContent (options: NormalizedFullOptions): HTMLToken | TagToken {\n const { tagDelimiterLeft, tagDelimiterRight } = options\n const begin = this.p\n let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n while (this.p < this.N) {\n if (this.readIdentifier().getText() !== 'endraw') {\n leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length\n continue\n }\n while (this.p <= this.N) {\n if (this.rmatch(tagDelimiterRight)) {\n const end = this.p\n if (begin === leftPos) {\n this.rawBeginAt = -1\n return new TagToken(this.input, begin, end, options, this.file)\n } else {\n this.p = leftPos\n return new HTMLToken(this.input, begin, leftPos, this.file)\n }\n }\n if (this.rmatch(tagDelimiterLeft)) break\n this.p++\n }\n }\n throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin)\n }\n\n readLiquidTagTokens (options: NormalizedFullOptions = defaultOptions): LiquidTagToken[] {\n const tokens: LiquidTagToken[] = []\n while (this.p < this.N) {\n const token = this.readLiquidTagToken(options)\n token && tokens.push(token)\n }\n return tokens\n }\n\n readLiquidTagToken (options: NormalizedFullOptions): LiquidTagToken | undefined {\n this.skipBlank()\n if (this.end()) return\n\n const begin = this.p\n this.readToDelimiter('\\n')\n const end = this.p\n return new LiquidTagToken(this.input, begin, end, options, this.file)\n }\n\n error (msg: string, pos: number = this.p) {\n return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file))\n }\n\n assert (pred: unknown, msg: string | (() => string), pos?: number) {\n if (!pred) throw this.error(typeof msg === 'function' ? msg() : msg, pos)\n }\n\n snapshot (begin: number = this.p) {\n return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32))\n }\n\n /**\n * @deprecated use #readIdentifier instead\n */\n readWord () {\n return this.readIdentifier()\n }\n\n readIdentifier (): IdentifierToken {\n this.skipBlank()\n const begin = this.p\n while (!this.end() && isWord(this.peek())) ++this.p\n return new IdentifierToken(this.input, begin, this.p, this.file)\n }\n\n readNonEmptyIdentifier (): IdentifierToken | undefined {\n const id = this.readIdentifier()\n return id.size() ? id : undefined\n }\n\n readTagName (): string {\n this.skipBlank()\n // Handle inline comment tags\n if (this.input[this.p] === '#') return this.input.slice(this.p, ++this.p)\n return this.readIdentifier().getText()\n }\n\n readHashes (jekyllStyle?: boolean | string) {\n const hashes = []\n while (true) {\n const hash = this.readHash(jekyllStyle)\n if (!hash) return hashes\n hashes.push(hash)\n }\n }\n\n readHash (jekyllStyle?: boolean | string): HashToken | undefined {\n this.skipBlank()\n if (this.peek() === ',') ++this.p\n const begin = this.p\n const name = this.readNonEmptyIdentifier()\n if (!name) return\n let value\n\n this.skipBlank()\n const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':')\n if (this.peek() === sep) {\n ++this.p\n value = this.readValue()\n }\n return new HashToken(this.input, begin, this.p, name, value, this.file)\n }\n\n remaining () {\n return this.input.slice(this.p, this.N)\n }\n\n advance (step = 1) {\n this.p += step\n }\n\n end () {\n return this.p >= this.N\n }\n read () {\n return this.input[this.p++]\n }\n readTo (end: string): number {\n while (this.p < this.N) {\n ++this.p\n if (this.rmatch(end)) return this.p\n }\n return -1\n }\n\n readValue (): ValueToken | undefined {\n this.skipBlank()\n const begin = this.p\n const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber()\n const props = this.readProperties(!variable)\n if (!props.length) return variable\n return new PropertyAccessToken(variable, props, this.input, begin, this.p)\n }\n\n readScopeValue (): ValueToken | undefined {\n this.skipBlank()\n const begin = this.p\n const props = this.readProperties()\n if (!props.length) return undefined\n return new PropertyAccessToken(undefined, props, this.input, begin, this.p)\n }\n\n private readProperties (isBegin = true): (ValueToken | IdentifierToken)[] {\n const props: (ValueToken | IdentifierToken)[] = []\n while (true) {\n if (this.peek() === '[') {\n this.p++\n const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file)\n this.assert(this.readTo(']') !== -1, '[ not closed')\n props.push(prop)\n continue\n }\n if (isBegin && !props.length) {\n const prop = this.readNonEmptyIdentifier()\n if (prop) {\n props.push(prop)\n continue\n }\n }\n if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax\n this.p++\n const prop = this.readNonEmptyIdentifier()\n if (!prop) break\n props.push(prop)\n continue\n }\n break\n }\n return props\n }\n\n readNumber (): NumberToken | undefined {\n this.skipBlank()\n let decimalFound = false\n let digitFound = false\n let n = 0\n if (this.peekType() & SIGN) n++\n while (this.p + n <= this.N) {\n if (this.peekType(n) & NUMBER) {\n digitFound = true\n n++\n } else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') {\n if (decimalFound || !digitFound) return\n decimalFound = true\n n++\n } else break\n }\n if (digitFound && !isWord(this.peek(n))) {\n const num = new NumberToken(this.input, this.p, this.p + n, this.file)\n this.advance(n)\n return num\n }\n }\n\n readLiteral (): LiteralToken | undefined {\n this.skipBlank()\n const end = this.matchTrie(this.literalTrie)\n if (end === -1) return\n const literal = new LiteralToken(this.input, this.p, end, this.file)\n this.p = end\n return literal\n }\n\n readRange (): RangeToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (this.peek() !== '(') return\n ++this.p\n const lhs = this.readValueOrThrow()\n this.skipBlank()\n this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax')\n const rhs = this.readValueOrThrow()\n this.skipBlank()\n this.assert(this.read() === ')', 'invalid range syntax')\n return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file)\n }\n\n readValueOrThrow (): ValueToken {\n const value = this.readValue()\n this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`)\n return value!\n }\n\n readQuoted (): QuotedToken | undefined {\n this.skipBlank()\n const begin = this.p\n if (!(this.peekType() & QUOTE)) return\n ++this.p\n let escaped = false\n while (this.p < this.N) {\n ++this.p\n if (this.input[this.p - 1] === this.input[begin] && !escaped) break\n if (escaped) escaped = false\n else if (this.input[this.p - 1] === '\\\\') escaped = true\n }\n return new QuotedToken(this.input, begin, this.p, this.file)\n }\n\n * readFileNameTemplate (options: NormalizedFullOptions): IterableIterator<TopLevelToken> {\n const { outputDelimiterLeft } = options\n const htmlStopStrings = [',', ' ', outputDelimiterLeft]\n const htmlStopStringSet = new Set(htmlStopStrings)\n // break on ',' and ' ', outputDelimiterLeft only stops HTML token\n while (this.p < this.N && !htmlStopStringSet.has(this.peek())) {\n yield this.match(outputDelimiterLeft)\n ? this.readOutputToken(options)\n : this.readHTMLToken(htmlStopStrings)\n }\n }\n\n match (word: string) {\n for (let i = 0; i < word.length; i++) {\n if (word[i] !== this.input[this.p + i]) return false\n }\n return true\n }\n\n rmatch (pattern: string) {\n for (let i = 0; i < pattern.length; i++) {\n if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i]) return false\n }\n return true\n }\n\n peekType (n = 0) {\n return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)]\n }\n\n peek (n = 0): string {\n return this.p + n >= this.N ? '' : this.input[this.p + n]\n }\n\n skipBlank () {\n while (this.peekType() & BLANK) ++this.p\n }\n}\n","import { Token, TopLevelToken } from '../tokens'\nimport { Template } from '../template'\nimport { isTagToken } from '../util'\n\ntype ParseToken<T extends Token> = ((token: T, remainTokens: T[]) => Template)\n\nexport class ParseStream<T extends Token = TopLevelToken> {\n private tokens: T[]\n private handlers: Record<string, (arg: any) => void> = {}\n private stopRequested = false\n private parseToken: ParseToken<T>\n\n public constructor (tokens: T[], parseToken: ParseToken<T>) {\n this.tokens = tokens\n this.parseToken = parseToken\n }\n public on<T2 extends Template | T | undefined> (name: string, cb: (this: ParseStream, arg: T2) => void): ParseStream<T> {\n this.handlers[name] = cb\n return this\n }\n private trigger <T extends Token | Template> (event: string, arg?: T) {\n const h = this.handlers[event]\n return h ? (h.call(this, arg), true) : false\n }\n public start () {\n this.trigger('start')\n let token: T | undefined\n while (!this.stopRequested && (token = this.tokens.shift())) {\n if (this.trigger('token', token)) continue\n if (isTagToken(token) && 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 public stop () {\n this.stopRequested = true\n return this\n }\n}\n","export abstract class TemplateImpl<T> {\n public token: T;\n public constructor (token: T) {\n this.token = token\n }\n}\n","import { TemplateImpl } from './template-impl'\nimport type { Emitter } from '../emitters/emitter'\nimport type { Parser, Tokenizer } from '../parser'\nimport type { Context } from '../context/context'\nimport type { TopLevelToken, TagToken } from '../tokens'\nimport type { Template } from './template'\nimport type { Liquid } from '../liquid'\n\nexport type TagRenderReturn = Generator<unknown, unknown, unknown> | Promise<unknown> | unknown\n\nexport abstract class Tag extends TemplateImpl<TagToken> implements Template {\n public name: string\n public liquid: Liquid\n protected tokenizer: Tokenizer\n\n public constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token)\n this.name = token.name\n this.liquid = liquid\n this.tokenizer = token.tokenizer\n }\n public abstract render (ctx: Context, emitter: Emitter): TagRenderReturn;\n}\n\nexport interface TagClass {\n new(token: TagToken, tokens: TopLevelToken[], liquid: Liquid, parser: Parser): Tag\n}\n","import { evalToken } from '../render/expression'\nimport { Context } from '../context/context'\nimport { Tokenizer } from '../parser/tokenizer'\nimport { Token } from '../tokens/token'\n\ntype HashValueTokens = Record<string, Token | undefined>\n\n/**\n * Key-Value Pairs Representing Tag Arguments\n * Example:\n * For the markup `, foo:'bar', coo:2 reversed %}`,\n * hash['foo'] === 'bar'\n * hash['coo'] === 2\n * hash['reversed'] === undefined\n */\nexport class Hash {\n hash: HashValueTokens = {}\n\n constructor (input: string | Tokenizer, jekyllStyle?: boolean | string) {\n const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {})\n for (const hash of tokenizer.readHashes(jekyllStyle)) {\n this.hash[hash.name.content] = hash.value\n }\n }\n\n * render (ctx: Context): Generator<unknown, Record<string, any>, unknown> {\n const hash = {}\n for (const key of Object.keys(this.hash)) {\n hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx)\n }\n return hash\n }\n}\n","import { isFunction } from '../util'\nimport { Hash } from './hash'\nimport { Tag, TagClass, TagRenderReturn } from './tag'\nimport { TagToken, TopLevelToken } from '../tokens'\nimport { Emitter } from '../emitters'\nimport { Context } from '../context'\nimport type { Liquid } from '../liquid'\n\nexport interface TagImplOptions {\n [key: string]: any\n parse?: (this: Tag & TagImplOptions, token: TagToken, remainingTokens: TopLevelToken[]) => void;\n render: (this: Tag & TagImplOptions, ctx: Context, emitter: Emitter, hash: Record<string, any>) => TagRenderReturn;\n}\n\nexport function createTagClass (options: TagImplOptions): TagClass {\n return class extends Tag {\n constructor (token: TagToken, tokens: TopLevelToken[], liquid: Liquid) {\n super(token, tokens, liquid)\n if (isFunction(options.parse)) {\n options.parse.call(this, token, tokens)\n }\n }\n * render (ctx: Context, emitter: Emitter): TagRenderReturn {\n const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx)) as Record<string, any>\n return yield options.render.call(this, ctx, emitter, hash)\n }\n }\n}\n","import { isArray } from '../util/underscore'\nimport { ValueToken } from '../tokens/value-token'\n\ntype KeyValuePair = [string?, ValueToken?]\n\nexport type FilterArg = ValueToken | KeyValuePair\n\nexport function isKeyValuePair (arr: FilterArg): arr is KeyValuePair {\n return isArray(arr)\n}\n","import { evalToken } from '../render'\nimport { Context } from '../context'\nimport { identify, isFunction } from '../util/underscore'\nimport { FilterHandler, FilterImplOptions } from './filter-impl-options'\nimport { FilterArg, isKeyValuePair } from '../parser/filter-arg'\nimport { Liquid } from '../liquid'\nimport { FilterToken } from '../tokens'\n\nexport class Filter {\n public name: string\n public args: FilterArg[]\n public readonly raw: boolean\n private handler: FilterHandler\n private liquid: Liquid\n private token: FilterToken\n\n public constructor (token: FilterToken, options: FilterImplOptions | undefined, liquid: Liquid) {\n this.token = token\n this.name = token.name\n this.handler = isFunction(options)\n ? options\n : (isFunction(options?.handler) ? options!.handler : identify)\n this.raw = !isFunction(options) && !!options?.raw\n this.args = token.args\n this.liquid = liquid\n }\n public * render (value: any, context: Context): IterableIterator<unknown> {\n const argv: any[] = []\n for (const arg of this.args as FilterArg[]) {\n if (isKeyValuePair(arg)) argv.push([arg[0], yield evalToken(arg[1], context)])\n else argv.push(yield evalToken(arg, context))\n }\n return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv])\n }\n}\n","import { Filter } from './filter'\nimport { Expression } from '../render'\nimport { Tokenizer } from '../parser'\nimport { assert } from '../util'\nimport type { FilteredValueToken } from '../tokens'\nimport type { Liquid } from '../liquid'\nimport type { Context } from '../context'\n\nexport class Value {\n public readonly filters: Filter[] = []\n public readonly initial: Expression\n\n /**\n * @param str the value to be valuated, eg.: \"foobar\" | truncate: 3\n */\n public constructor (input: string | FilteredValueToken, liquid: Liquid) {\n const token: FilteredValueToken = typeof input === 'string'\n ? new Tokenizer(input, liquid.options.operators).readFilteredValue()\n : input\n this.initial = token.initial\n this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid))\n }\n\n public * value (ctx: Context, lenient?: boolean): Generator<unknown, unknown, unknown> {\n lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default')\n let val = yield this.initial.evaluate(ctx, lenient)\n\n for (const filter of this.filters) {\n val = yield filter.render(val, ctx)\n }\n return val\n }\n\n private getFilter (liquid: Liquid, name: string) {\n const impl = liquid.filters[name]\n assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`)\n return impl\n }\n}\n","import { Value } from './value'\nimport { Arguments, Template, TemplateImpl } from '../template'\nimport { Context } from '../context/context'\nimport { Emitter } from '../emitters/emitter'\nimport { OutputToken } from '../tokens/output-token'\nimport { Tokenizer } from '../parser'\nimport { Liquid } from '../liquid'\nimport { Filter } from './filter'\nimport { FilterToken } from '../tokens'\n\nexport class Output extends TemplateImpl<OutputToken> implements Template {\n value: Value\n public constructor (token: OutputToken, liquid: Liquid) {\n super(token)\n const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange)\n this.value = new Value(tokenizer.readFilteredValue(), liquid)\n const filters = this.value.filters\n const outputEscape = liquid.options.outputEscape\n if (!filters[filters.length - 1]?.raw && outputEscape) {\n const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0)\n filters.push(new Filter(token, outputEscape, liquid))\n }\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator<unknown> {\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n\n public * arguments (): Arguments {\n yield this.value\n }\n}\n","import { TemplateImpl, Template } from '../template'\nimport { HTMLToken } from '../tokens'\nimport { Context } from '../context'\nimport { Emitter } from '../emitters'\n\nexport class HTML extends TemplateImpl<HTMLToken> implements Template {\n private str: string\n public constructor (token: HTMLToken) {\n super(token)\n this.str = token.getContent()\n }\n public * render (ctx: Context, emitter: Emitter): IterableIterator<void> {\n emitter.write(this.str)\n }\n}\n","import { Argument, Template, Value } from '.'\nimport { isKeyValuePair } from '../parser/filter-arg'\nimport { PropertyAccessToken, ValueToken } from '../tokens'\nimport {\n isNumberToken,\n isPropertyAccessToken,\n isQuotedToken,\n isRangeToken,\n isString,\n isValueToken,\n isWordToken,\n toPromise,\n toValueSync\n} from '../util'\n\n/**\n * Row, column and file name where a variable was found.\n */\nexport interface VariableLocation {\n row: number;\n col: number;\n file?: string;\n}\n\n/**\n * A variable's segments as an array, possibly with nested arrays of segments.\n */\nexport type SegmentArray = Array<string | number | SegmentArray>\n\n/**\n * A variable's segments and location, which can be coerced to a string.\n */\nexport class Variable {\n constructor (\n readonly segments: Array<string | number | Variable>,\n readonly location: VariableLocation\n ) {}\n\n public toString (): string {\n return segmentsString(this.segments, true)\n }\n\n /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */\n public toArray (): SegmentArray {\n function * _visit (...segments: Array<string | number | Variable>): Generator<string | number | SegmentArray> {\n for (const segment of segments) {\n if (segment instanceof Variable) {\n yield Array.from(_visit(...segment.segments))\n } else {\n yield segment\n }\n }\n }\n return Array.from(_visit(...this.segments))\n }\n}\n\n/**\n * Property names and array indexes that make up a path to a variable.\n */\nexport type VariableSegments = Array<string | number | Variable>;\n\n/**\n * A mapping of variable names to an array of locations at which the variable was found.\n */\nexport type Variables = { [key: string]: Variable[] };\n\n/**\n * Group variables by the string representation of their root segment.\n */\nexport class VariableMap {\n private map: Map<string, Variable[]>\n\n constructor () {\n this.map = new Map()\n }\n\n public get (key: Variable): Variable[] {\n const k = segmentsString([key.segments[0]])\n if (!this.map.has(k)) {\n this.map.set(k, [])\n }\n return this.map.get(k) as Variable[]\n }\n\n public has (key: Variable): boolean {\n return this.map.has(segmentsString([key.segments[0]]))\n }\n\n public push (variable: Variable): void {\n this.get(variable).push(variable)\n }\n\n public asObject (): Variables {\n return Object.fromEntries(this.map)\n }\n}\n\n/**\n * The result of calling `analyze()` or `analyzeSync()`.\n */\nexport interface StaticAnalysis {\n /**\n * All variables, whether they are in scope or not. Including references to names\n * such as `forloop` from the `for` tag.\n */\n variables: Variables;\n\n /**\n * Variables that are not in scope. These could be a \"global\" variables that are\n * expected to be provided by the application developer, or possible mistakes\n * from the template author.\n *\n * If a variable is referenced before and after assignment, you should expect\n * that variable to be included in `globals`, `variables` and `locals`, each with\n * a different location.\n */\n globals: Variables;\n\n /**\n * Template variables that are added to the template local scope using tags like\n * `assign`, `capture` or `increment`.\n */\n locals: Variables;\n}\n\nexport interface StaticAnalysisOptions {\n /**\n * When `true` (the default), try to load partial templates and analyze them too.\n */\n partials?: boolean;\n}\n\nexport const defaultStaticAnalysisOptions: StaticAnalysisOptions = {\n partials: true\n}\n\nfunction * _analyze (templates: Template[], partials: boolean, sync: boolean): Generator<unknown, StaticAnalysis> {\n const variables = new VariableMap()\n const globals = new VariableMap()\n const locals = new VariableMap()\n\n const rootScope = new DummyScope(new Set())\n\n // Names of partial templates that we've already analyzed.\n const seen: Set<string | undefined> = new Set()\n\n function updateVariables (variable: Variable, scope: DummyScope) {\n variables.push(variable)\n const aliased = scope.alias(variable)\n\n if (aliased !== undefined) {\n const root = aliased.segments[0]\n // TODO: What if a a template renders a rendered template? Do we need scope.parent?\n if (isString(root) && !rootScope.has(root)) {\n globals.push(aliased)\n }\n } else {\n const root = variable.segments[0]\n if (isString(root) && !scope.has(root)) {\n globals.push(variable)\n }\n }\n\n // Recurse for nested Variables\n for (const segment of variable.segments) {\n if (segment instanceof Variable) {\n updateVariables(segment, scope)\n }\n }\n }\n\n function * visit (template: Template, scope: DummyScope): Generator<unknown, void> {\n if (template.arguments) {\n for (const arg of template.arguments()) {\n for (const variable of extractVariables(arg)) {\n updateVariables(variable, scope)\n }\n }\n }\n\n if (template.localScope) {\n for (const ident of template.localScope()) {\n scope.add(ident.content)\n scope.deleteAlias(ident.content)\n const [row, col] = ident.getPosition()\n locals.push(new Variable([ident.content], { row, col, file: ident.file }))\n }\n }\n\n if (template.children) {\n if (template.partialScope) {\n const partial = template.partialScope()\n\n if (partial === undefined) {\n // Layouts, for example, can have children that are not partials.\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, scope)\n }\n return\n }\n\n if (seen.has(partial.name)) return\n\n const partialScopeNames: Set<string> = new Set()\n const partialScope = partial.isolated\n ? new DummyScope(partialScopeNames)\n : scope.push(partialScopeNames)\n\n for (const name of partial.scope) {\n if (isString(name)) {\n partialScopeNames.add(name)\n } else {\n const [alias, argument] = name\n partialScopeNames.add(alias)\n const variables = Array.from(extractVariables(argument))\n if (variables.length) {\n partialScope.setAlias(alias, variables[0].segments)\n }\n }\n }\n\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, partialScope)\n seen.add(partial.name)\n }\n\n partialScope.pop()\n } else {\n if (template.blockScope) {\n scope.push(new Set(template.blockScope()))\n }\n\n for (const child of (yield template.children(partials, sync)) as Template[]) {\n yield visit(child, scope)\n }\n\n if (template.blockScope) {\n scope.pop()\n }\n }\n }\n }\n\n for (const template of templates) {\n yield visit(template, rootScope)\n }\n\n return {\n variables: variables.asObject(),\n globals: globals.asObject(),\n locals: locals.asObject()\n }\n}\n\n/**\n * Statically analyze a template and report variable usage.\n */\nexport function analyze (template: Template[], options: StaticAnalysisOptions = {}): Promise<StaticAnalysis> {\n const opts = { ...defaultStaticAnalysisOptions, ...options } as Required<StaticAnalysisOptions>\n return toPromise(_analyze(template, opts.partials, false))\n}\n\n/**\n * Statically analyze a template and report variable usage.\n */\nexport function analyzeSync (template: Template[], options: StaticAnalysisOptions = {}): StaticAnalysis {\n const opts = { ...defaultStaticAnalysisOptions, ...options } as Required<StaticAnalysisOptions>\n return toValueSync(_analyze(template, opts.partials, true))\n}\n\ninterface ScopeStackItem {\n names: Set<string>;\n aliases: Map<string, VariableSegments>;\n}\n\n/**\n * A stack to manage scopes while traversing templates during static analysis.\n */\nclass DummyScope {\n private stack: Array<ScopeStackItem>\n\n constructor (globals: Set<string>) {\n this.stack = [{ names: globals, aliases: new Map() }]\n }\n\n /** Return true if `name` is in scope. */\n public has (name: string): boolean {\n for (const scope of this.stack) {\n if (scope.names.has(name)) {\n return true\n }\n }\n return false\n }\n\n public push (scope: Set<string>): DummyScope {\n this.stack.push({ names: scope, aliases: new Map() })\n return this\n }\n\n public pop (): Set<string> | undefined {\n return this.stack.pop()?.names\n }\n\n // Add a name to the template scope.\n public add (name: string): void {\n this.stack[0].names.add(name)\n }\n\n /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */\n public alias (variable: Variable): Variable | undefined {\n const root = variable.segments[0]\n if (!isString(root)) return undefined\n const alias = this.getAlias(root)\n if (alias === undefined) return undefined\n return new Variable([...alias, ...variable.segments.slice(1)], variable.location)\n }\n\n // TODO: `from` could be a path with multiple segments, like `include.x`.\n public setAlias (from: string, to: VariableSegments): void {\n this.stack[this.stack.length - 1].aliases.set(from, to)\n }\n\n public deleteAlias (name: string): void {\n this.stack[this.stack.length - 1].aliases.delete(name)\n }\n\n private getAlias (name: string): VariableSegments | undefined {\n for (const scope of this.stack) {\n if (scope.aliases.has(name)) {\n return scope.aliases.get(name)\n }\n\n // If a scope has defined `name`, then it masks aliases in parent scopes.\n if (scope.names.has(name)) {\n return undefined\n }\n }\n return undefined\n }\n}\n\nfunction * extractVariables (value: Argument): Generator<Variable> {\n if (isValueToken(value)) {\n yield * extractValueTokenVariables(value)\n } else if (value instanceof Value) {\n yield * extractFilteredValueVariables(value)\n }\n}\n\nfunction * extractFilteredValueVariables (value: Value): Generator<Variable> {\n for (const token of value.initial.postfix) {\n if (isValueToken(token)) {\n yield * extractValueTokenVariables(token)\n }\n }\n\n for (const filter of value.filters) {\n for (const arg of filter.args) {\n if (isKeyValuePair(arg) && arg[1]) {\n yield * extractValueTokenVariables(arg[1])\n } else if (isValueToken(arg)) {\n yield * extractValueTokenVariables(arg)\n }\n }\n }\n}\n\nfunction * extractValueTokenVariables (token: ValueToken): Generator<Variable> {\n if (isRangeToken(token)) {\n yield * extractValueTokenVariables(token.lhs)\n yield * extractValueTokenVariables(token.rhs)\n } else if (isPropertyAccessToken(token)) {\n yield extractPropertyAccessVariable(token)\n }\n}\n\nfunction extractPropertyAccessVariable (token: PropertyAccessToken): Variable {\n const segments: VariableSegments = []\n\n // token is not guaranteed to have `file` set. We'll try to get it from a prop if not.\n let file: string | undefined = token.file\n\n // Here we're flattening the first segment of a path if it is a nested path.\n const root = token.props[0]\n file = file || root.file\n if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) {\n segments.push(root.content)\n } else if (isPropertyAccessToken(root)) {\n // Flatten paths that start with a nested path.\n segments.push(...extractPropertyAccessVariable(root).segments)\n }\n\n for (const prop of token.props.slice(1)) {\n file = file || prop.file\n if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) {\n segments.push(prop.content)\n } else if (isPropertyAccessToken(prop)) {\n segments.push(extractPropertyAccessVariable(prop))\n }\n }\n\n const [row, col] = token.getPosition()\n return new Variable(segments, {\n row,\n col,\n file\n })\n}\n\n// This is used to detect segments that can be represented with dot notation\n// when creating a string representation of VariableSegments.\nconst RE_PROPERTY = /^[\\u0080-\\uFFFFa-zA-Z_][\\u0080-\\uFFFFa-zA-Z0-9_-]*$/\n\n/**\n * Return a string representation of segments using dot notation where possible.\n * @param segments - The property names and array indices that make up a path to a variable.\n * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets.\n */\nfunction segmentsString (segments: VariableSegments, bracketedRoot = false): string {\n const buf: string[] = []\n\n const root = segments[0]\n if (isString(root)) {\n if (!bracketedRoot || root.match(RE_PROPERTY)) {\n buf.push(`${root}`)\n } else {\n buf.push(`['${root}']`)\n }\n }\n\n for (const segment of segments.slice(1)) {\n if (segment instanceof Variable) {\n buf.push(`[${segmentsString(segment.segments)}]`)\n } else if (isString(segment)) {\n if (segment.match(RE_PROPERTY)) {\n buf.push(`.${segment}`)\n } else {\n buf.push(`['${segment}']`)\n }\n } else {\n buf.push(`[${segment}]`)\n }\n }\n\n return buf.join('')\n}\n","import { FS } from './fs'\nimport { assert, escapeRegex } from '../util'\n\nexport interface LoaderOptions {\n fs: FS;\n extname: string;\n root: string[];\n partials: string[];\n layouts: string[];\n relativeReference: boolean;\n}\nexport enum LookupType {\n Partials = 'partials',\n Layouts = 'layouts',\n Root = 'root'\n}\nexport class Loader {\n public shouldLoadRelative: (referencedFile: string) => boolean\n private options: LoaderOptions\n private contains: (root: string, file: string) => boolean\n\n constructor (options: LoaderOptions) {\n this.options = options\n if (options.relativeReference) {\n const sep = options.fs.sep\n assert(sep, '`fs.sep` is required for relative reference')\n const rRelativePath = new RegExp(['.' + sep, '..' + sep, './', '../'].map(prefix => escapeRegex(prefix)).join('|'))\n this.shouldLoadRelative = (referencedFile: string) => rRelativePath.test(referencedFile)\n } else {\n this.shouldLoadRelative = (_referencedFile: string) => false\n }\n this.contains = this.options.fs.contains || (() => true)\n }\n\n public * lookup (file: string, type: LookupType, sync?: boolean, currentFile?: string): Generator<unknown, string, string> {\n const { fs } = this.options\n const dirs = this.options[type]\n for (const filepath of this.candidates(file, dirs, currentFile, type !== LookupType.Root)) {\n if (sync ? fs.existsSync(filepath) : yield fs.exists(filepath)) return filepath\n }\n throw this.lookupError(file, dirs)\n }\n\n public * candidates (file: string, dirs: string[], currentFile?: string, enforceRoot?: boolean) {\n const { fs, extname } = this.options\n if (this.shouldLoadRelative(file) && currentFile) {\n const referenced = fs.resolve(this.dirname(currentFile), file, extname)\n for (const dir of dirs) {\n if (!enforceRoot || this.contains(dir, referenced)) {\n // the relatively referenced file is within one of root dirs\n yield referenced\n break\n }\n }\n }\n for (const dir of dirs) {\n const referenced = fs.resolve(dir, file, extname)\n if (!enforceRoot || this.contains(dir, referenced)) {\n yield referenced\n }\n }\n if (fs.fallback !== undefined) {\n const filepath = fs.fallback(file)\n if (filepath !== undefined) yield filepath\n }\n }\n\n private dirname (path: string) {\n const fs = this.options.fs\n assert(fs.dirname, '`fs.dirname` is required for relative reference')\n return fs.dirname!(path)\n }\n\n private lookupError (file: string, roots: string[]) {\n const err = new Error('ENOENT') as any\n err.message = `ENOENT: Failed to lookup \"${file}\" in \"${roots}\"`\n err.code = 'ENOENT'\n return err\n }\n}\n","import { Limiter, toPromise, assert, isTagToken, isOutputToken, ParseError } from '../util'\nimport { Tokenizer } from './tokenizer'\nimport { ParseStream } from './parse-stream'\nimport { TopLevelToken, OutputToken } from '../tokens'\nimport { Template, Output, HTML } from '../template'\nimport { LiquidCache } from '../cache'\nimport { FS, Loader, LookupType } from '../fs'\nimport { LiquidError, LiquidErrors } from '../util/error'\nimport type { Liquid } from '../liquid'\n\nexport class Parser {\n public parseFile: (file: string, sync?: boolean, type?: LookupType, currentFile?: string) => Generator<unknown, Template[], Template[] | string>\n\n private liquid: Liquid\n private fs: FS\n private cache?: LiquidCache\n private loader: Loader\n private parseLimit: Limiter\n\n public constructor (liquid: Liquid) {\n this.liquid = liquid\n this.cache = this.liquid.options.cache\n this.fs = this.liquid.options.fs\n this.parseFile = this.cache ? this._parseFileCached : this._parseFile\n this.loader = new Loader(this.liquid.options)\n this.parseLimit = new Limiter('parse length', liquid.options.parseLimit)\n }\n public parse (html: string, filepath?: string): Template[] {\n html = String(html)\n this.parseLimit.use(html.length)\n const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath)\n const tokens = tokenizer.readTopLevelTokens(this.liquid.options)\n return this.parseTokens(tokens)\n }\n public parseTokens (tokens: TopLevelToken[]) {\n let token\n const templates: Template[] = []\n const errors: LiquidError[] = []\n while ((token = tokens.shift())) {\n try {\n templates.push(this.parseToken(token, tokens))\n } catch (err) {\n if (this.liquid.options.catchAllErrors) errors.push(err as LiquidError)\n else throw err\n }\n }\n if (errors.length) throw new LiquidErrors(errors)\n return templates\n }\n public parseToken (token: TopLevelToken, remainTokens: TopLevelToken[]) {\n try {\n if (isTagToken(token)) {\n const TagClass = this.liquid.tags[token.name]\n assert(TagClass, `tag \"${token.name}\" not found`)\n return new TagClass(token, remainTokens, this.liquid, this)\n }\n if (isOutputToken(token)) {\n return new Output(token as OutputToken, this.liquid)\n }\n return new HTML(token)\n } catch (e) {\n if (LiquidError.is(e)) throw e\n throw new ParseError(e as Error, token)\n }\n }\n public parseStream (tokens: TopLevelToken[]) {\n return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens))\n }\n private * _parseFileCached (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator<unknown, Template[], Template[]> {\n const cache = this.cache!\n const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file\n const tpls = yield cache.read(key)\n if (tpls) return tpls\n\n const task = this._parseFile(file, sync, type, currentFile)\n // sync mode: exec the task and cache the result\n // async mode: cache the task before exec\n const taskOrTpl = sync ? yield task : toPromise(task)\n cache.write(key, taskOrTpl as any)\n // note: concurrent tasks will be reused, cache for failed task is removed until its end\n try { return yield taskOrTpl } catch (err) { cache.remove(key); throw err }\n }\n private * _parseFile (file: string, sync?: boolean, type: LookupType = LookupType.Root, currentFile?: string): Generator<unknown, Template[], string> {\n const filepath = yield this.loader.lookup(file, type, sync, currentFile)\n return this.parse(sync ? this.fs.readFileSync(filepath) : yield this.fs.readFile(filepath), filepath)\n }\n}\n","export enum TokenKind {\n Number = 1,\n Literal = 2,\n Tag = 4,\n Output = 8,\n HTML = 16,\n Filter = 32,\n Hash = 64,\n PropertyAccess = 128,\n Word = 256,\n Range = 512,\n Quoted = 1024,\n Operator = 2048,\n FilteredValue = 4096,\n Delimited = Tag | Output\n}\n","import { RangeToken, NumberToken, QuotedToken, LiteralToken, PropertyAccessToken, OutputToken, HTMLToken, TagToken, IdentifierToken, DelimitedToken, OperatorToken, ValueToken } from '../tokens'\nimport { TokenKind } from '../parser'\n\nexport function isDelimitedToken (val: any): val is DelimitedToken {\n return !!(getKind(val) & TokenKind.Delimited)\n}\n\nexport function isOperatorToken (val: any): val is OperatorToken {\n return getKind(val) === TokenKind.Operator\n}\n\nexport function isHTMLToken (val: any): val is HTMLToken {\n return getKind(val) === TokenKind.HTML\n}\n\nexport function isOutputToken (val: any): val is OutputToken {\n return getKind(val) === TokenKind.Output\n}\n\nexport function isTagToken (val: any): val is TagToken {\n return getKind(val) === TokenKind.Tag\n}\n\nexport function isQuotedToken (val: any): val is QuotedToken {\n return getKind(val) === TokenKind.Quoted\n}\n\nexport function isLiteralToken (val: any): val is LiteralToken {\n return getKind(val) === TokenKind.Literal\n}\n\nexport function isNumberToken (val: any): val is NumberToken {\n return getKind(val) === TokenKind.Number\n}\n\nexport function isPropertyAccessToken (val: any): val is PropertyAccessToken {\n return getKind(val) === TokenKind.PropertyAccess\n}\n\nexport function isWordToken (val: any): val is IdentifierToken {\n return getKind(val) === TokenKind.Word\n}\n\nexport function isRangeToken (val: any): val is RangeToken {\n return getKind(val) === TokenKind.Range\n}\n\nexport function isValueToken (val: any): val is ValueToken {\n // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range\n return (getKind(val) & 1667) > 0\n}\n\nfunction getKind (val: any) {\n return val ? val.kind : -1\n}\n","import { getPerformance } from '../util/performance'\nimport { Drop } from '../drop/drop'\nimport { __assign } from 'tslib'\nimport { NormalizedFullOptions, defaultOptions, RenderOptions } from '../liquid-options'\nimport { Scope } from './scope'\nimport { hasOwnProperty, isArray, isNil, isUndefined, isString, isFunction, toLiquid, InternalUndefinedVariableError, toValueSync, isObject, Limiter, toValue } from '../util'\n\ntype PropertyKey = string | number;\n\nexport class Context {\n /**\n * insert a Context-level empty scope,\n * for tags like `{% capture %}` `{% assign %}` to operate\n */\n private scopes: Scope[] = [{}]\n private registers = {}\n /**\n * user passed in scope\n * `{% increment %}`, `{% decrement %}` changes this scope,\n * whereas `{% capture %}`, `{% assign %}` only hide this scope\n */\n public environments: Scope\n /**\n * global scope used as fallback for missing variables\n */\n public globals: Scope\n public sync: boolean\n public breakCalled = false\n public continueCalled = false\n /**\n * The normalized liquid options object\n */\n public opts: NormalizedFullOptions\n /**\n * Throw when accessing undefined variable?\n */\n public strictVariables: boolean;\n public ownPropertyOnly: boolean;\n public memoryLimit: Limiter;\n public renderLimit: Limiter;\n public constructor (env: object = {}, opts: NormalizedFullOptions = defaultOptions, renderOptions: RenderOptions = {}, { memoryLimit, renderLimit }: { [key: string]: Limiter } = {}) {\n this.sync = !!renderOptions.sync\n this.opts = opts\n this.globals = renderOptions.globals ?? opts.globals\n this.environments = isObject(env) ? env : Object(env)\n this.strictVariables = renderOptions.strictVariables ?? this.opts.strictVariables\n this.ownPropertyOnly = renderOptions.ownPropertyOnly ?? opts.ownPropertyOnly\n this.memoryLimit = memoryLimit ?? new Limiter('memory alloc', renderOptions.memoryLimit ?? opts.memoryLimit)\n this.renderLimit = renderLimit ?? new Limiter('template render', getPerformance().now() + (renderOptions.renderLimit ?? opts.renderLimit))\n }\n public getRegister (key: string) {\n return (this.registers[key] = this.registers[key] || {})\n }\n public setRegister (key: string, value: any) {\n return (this.registers[key] = value)\n }\n public saveRegister (...keys: string[]): [string, any][] {\n return keys.map(key => [key, this.getRegister(key)])\n }\n public restoreRegister (keyValues: [string, any][]) {\n return keyValues.forEach(([key, value]) => this.setRegister(key, value))\n }\n public getAll () {\n return [this.globals, this.environments, ...this.scopes]\n .reduce((ctx, val) => __assign(ctx, val), {})\n }\n /**\n * @deprecated use `_get()` or `getSync()` instead\n */\n public get (paths: PropertyKey[]): unknown {\n return this.getSync(paths)\n }\n public getSync (paths: PropertyKey[]): unknown {\n return toValueSync(this._get(paths))\n }\n public * _get (paths: (PropertyKey | Drop)[]): IterableIterator<unknown> {\n const scope = this.findScope(paths[0] as string) // first prop should always be a string\n return yield this._getFromScope(scope, paths)\n }\n /**\n * @deprecated use `_get()` instead\n */\n public getFromScope (scope: unknown, paths: PropertyKey[] | string): IterableIterator<unknown> {\n return toValueSync(this._getFromScope(scope, paths))\n }\n public * _getFromScope (scope: unknown, paths: (PropertyKey | Drop)[] | string, strictVariables = this.strictVariables): IterableIterator<unknown> {\n if (isString(paths)) paths = paths.split('.')\n for (let i = 0; i < paths.length; i++) {\n scope = yield this.readProperty(scope as object, paths[i])\n if (strictVariables && isUndefined(scope)) {\n throw new InternalUndefinedVariableError((paths as string[]).slice(0, i + 1).join!('.'))\n }\n }\n return scope\n }\n public push (ctx: object) {\n return this.scopes.push(ctx)\n }\n public pop () {\n return this.scopes.pop()\n }\n public bottom () {\n return this.scopes[0]\n }\n public spawn (scope = {}) {\n return new Context(scope, this.opts, {\n sync: this.sync,\n globals: this.globals,\n strictVariables: this.strictVariables\n }, {\n renderLimit: this.renderLimit,\n memoryLimit: this.memoryLimit\n })\n }\n private findScope (key: string | number) {\n for (let i = this.scopes.length - 1; i >= 0; i--) {\n const candidate = this.scopes[i]\n if (key in candidate) return candidate\n }\n if (key in this.environments) return this.environments\n return this.globals\n }\n readProperty (obj: Scope, key: (PropertyKey | Drop)) {\n obj = toLiquid(obj)\n key = toValue(key) as PropertyKey\n if (isNil(obj)) return obj\n if (isArray(obj) && (key as number) < 0) return obj[obj.length + +key]\n const value = readJSProperty(obj, key, this.ownPropertyOnly)\n if (value === undefined && obj instanceof Drop) return obj.liquidMethodMissing(key, this)\n if (isFunction(value)) return value.call(obj)\n if (key === 'size') return readSize(obj)\n else if (key === 'first') return readFirst(obj)\n else if (key === 'last') return readLast(obj)\n return value\n }\n}\n\nexport function readJSProperty (obj: Scope, key: PropertyKey, ownPropertyOnly: boolean) {\n if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop)) return undefined\n return obj[key]\n}\n\nfunction readFirst (obj: Scope) {\n if (isArray(obj)) return obj[0]\n return obj['first']\n}\n\nfunction readLast (obj: Scope) {\n if (isArray(obj)) return obj[obj.length - 1]\n return obj['last']\n}\n\nfunction readSize (obj: Scope) {\n if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined) return obj['size']\n if (isArray(obj) || isString(obj)) return obj.length\n if (typeof obj === 'object') return Object.keys(obj).length\n}\n","export enum BlockMode {\n /* store rendered html into blocks */\n OUTPUT,\n /* output rendered html directly */\n STORE\n}\n","import { toNumber, argumentsToNumber } from '../util/underscore'\n\nexport const abs = argumentsToNumber(Math.abs)\nexport const at_least = argumentsToNumber(Math.max)\nexport const at_most = argumentsToNumber(Math.min)\nexport const ceil = argumentsToNumber(Math.ceil)\nexport const divided_by = argumentsToNumber((dividend: number, divisor: number, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor)\nexport const floor = argumentsToNumber(Math.floor)\nexport const minus = argumentsToNumber((v: number, arg: number) => v - arg)\nexport const plus = argumentsToNumber((lhs: number, rhs: number) => lhs + rhs)\nexport const modulo = argumentsToNumber((v: number, arg: number) => v % arg)\nexport const times = argumentsToNumber((v: number, arg: number) => v * arg)\n\nexport function round (v: number, arg = 0) {\n v = toNumber(v)\n arg = toNumber(arg)\n const amp = Math.pow(10, arg)\n return Math.round(v * amp) / amp\n}\n","import { stringify } from '../util/underscore'\n\nexport const url_decode = (x: string) => decodeURIComponent(stringify(x)).replace(/\\+/g, ' ')\nexport const url_encode = (x: string) => encodeURIComponent(stringify(x)).replace(/%20/g, '+')\nexport const cgi_escape = (x: string) => encodeURIComponent(stringify(x))\n .replace(/%20/g, '+')\n .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase())\nexport const uri_escape = (x: string) => encodeURI(stringify(x))\n .replace(/%5B/g, '[')\n .replace(/%5D/g, ']')\n\nconst rSlugifyDefault = /[^\\p{M}\\p{L}\\p{Nd}]+/ug\nconst rSlugifyReplacers = {\n 'raw': /\\s+/g,\n 'default': rSlugifyDefault,\n 'pretty': /[^\\p{M}\\p{L}\\p{Nd}._~!$&'()+,;=@]+/ug,\n 'ascii': /[^A-Za-z0-9]+/g,\n 'latin': rSlugifyDefault,\n 'none': null\n}\n\nexport function slugify (str: string, mode: keyof typeof rSlugifyReplacers = 'default', cased = false): string {\n str = stringify(str)\n\n const replacer = rSlugifyReplacers[mode]\n if (replacer) {\n if (mode === 'latin') str = removeAccents(str)\n str = str.replace(replacer, '-').replace(/^-|-$/g, '')\n }\n\n return cased ? str : str.toLowerCase()\n}\n\nfunction removeAccents (str: string): string {\n return str.replace(/[àáâãäå]/g, 'a')\n .replace(/[æ]/g, 'ae')\n .replace(/[ç]/g, 'c')\n .replace(/[èéêë]/g, 'e')\n .replace(/[ìíîï]/g, 'i')\n .replace(/[ð]/g, 'd')\n .replace(/[ñ]/g, 'n')\n .replace(/[òóôõöø]/g, 'o')\n .replace(/[ùúûü]/g, 'u')\n .replace(/[ýÿ]/g, 'y')\n .replace(/[ß]/g, 'ss')\n .replace(/[œ]/g, 'oe')\n .replace(/[þ]/g, 'th')\n .replace(/[ẞ]/g, 'SS')\n .replace(/[Œ]/g, 'OE')\n .replace(/[Þ]/g, 'TH')\n}\n","import { toArray, argumentsToValue, toValue, stringify, caseInsensitiveCompare, isArray, isNil, last as arrayLast, isArrayLike, toEnumerable } from '../util'\nimport { arrayIncludes, equals, evalToken, isTruthy } from '../render'\nimport { Value, FilterImpl } from '../template'\nimport { Tokenizer } from '../parser'\nimport type { Scope } from '../context'\nimport { EmptyDrop } from '../drop'\n\nexport const join = argumentsToValue(function (this: FilterImpl, v: any[], arg: string) {\n const array = toArray(v)\n const sep = isNil(arg) ? ' ' : stringify(arg)\n const complexity = array.length * (1 + sep.length)\n this.context.memoryLimit.use(complexity)\n return array.join(sep)\n})\nexport const last = argumentsToValue((v: any) => isArrayLike(v) ? arrayLast(v) : '')\nexport const first = argumentsToValue((v: any) => isArrayLike(v) ? v[0] : '')\nexport const reverse = argumentsToValue(function (this: FilterImpl, v: any[]) {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n return [...array].reverse()\n})\n\nexport function * sort<T> (this: FilterImpl, arr: T[], property?: string): IterableIterator<unknown> {\n const values: [T, string | number][] = []\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n values.push([\n item,\n property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item\n ])\n }\n return values.sort((lhs, rhs) => {\n const lvalue = lhs[1]\n const rvalue = rhs[1]\n return lvalue < rvalue ? -1 : (lvalue > rvalue ? 1 : 0)\n }).map(tuple => tuple[0])\n}\n\nexport function sort_natural<T> (this: FilterImpl, input: T[], property?: string) {\n const propertyString = stringify(property)\n const compare = property === undefined\n ? caseInsensitiveCompare\n : (lhs: T, rhs: T) => caseInsensitiveCompare(lhs[propertyString], rhs[propertyString])\n const array = toArray(input)\n this.context.memoryLimit.use(array.length)\n return [...array].sort(compare)\n}\n\nexport const size = (v: string | any[]) => (v && v.length) || 0\n\nexport function * map (this: FilterImpl, arr: Scope[], property: string): IterableIterator<unknown> {\n const results = []\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n results.push(yield this.context._getFromScope(item, stringify(property), false))\n }\n return results\n}\n\nexport function * sum (this: FilterImpl, arr: Scope[], property?: string): IterableIterator<unknown> {\n let sum = 0\n const array = toArray(arr)\n for (const item of array) {\n const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item)\n sum += Number.isNaN(data) ? 0 : data\n }\n return sum\n}\n\nexport function compact<T> (this: FilterImpl, arr: T[]) {\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n return array.filter(x => !isNil(toValue(x)))\n}\n\nexport function concat<T1, T2> (this: FilterImpl, v: T1[], arg: T2[] = []): (T1 | T2)[] {\n const lhs = toArray(v)\n const rhs = toArray(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return lhs.concat(rhs)\n}\n\nexport function push<T> (this: FilterImpl, v: T[], arg: T): T[] {\n return concat.call(this, v, [arg]) as T[]\n}\n\nexport function unshift<T> (this: FilterImpl, v: T[], arg: T): T[] {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n const clone = [...array]\n clone.unshift(arg)\n return clone\n}\n\nexport function pop<T> (v: T[]): T[] {\n const clone = [...toArray(v)]\n clone.pop()\n return clone\n}\n\nexport function shift<T> (this: FilterImpl, v: T[]): T[] {\n const array = toArray(v)\n this.context.memoryLimit.use(array.length)\n const clone = [...array]\n clone.shift()\n return clone\n}\n\nexport function slice<T> (this: FilterImpl, v: T[] | string, begin: number, length = 1): T[] | string {\n v = toValue(v)\n if (isNil(v)) return []\n if (!isArray(v)) v = stringify(v)\n begin = begin < 0 ? v.length + begin : begin\n this.context.memoryLimit.use(length)\n return v.slice(begin, begin + length)\n}\n\nfunction expectedMatcher (this: FilterImpl, expected: any): (v: any) => boolean {\n if (this.context.opts.jekyllWhere) {\n return (v: any) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected))\n } else if (expected === undefined) {\n return (v: any) => isTruthy(v, this.context)\n } else {\n return (v: any) => equals(v, expected)\n }\n}\n\nfunction * filter<T extends object> (this: FilterImpl, include: boolean, arr: T[], property: string, expected: any): IterableIterator<unknown> {\n const values: unknown[] = []\n arr = toArray(arr)\n this.context.memoryLimit.use(arr.length)\n const token = new Tokenizer(stringify(property)).readScopeValue()\n for (const item of arr) {\n values.push(yield evalToken(token, this.context.spawn(item)))\n }\n const matcher = expectedMatcher.call(this, expected)\n return arr.filter((_, i) => matcher(values[i]) === include)\n}\n\nfunction * filter_exp<T extends object> (this: FilterImpl, include: boolean, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const filtered: unknown[] = []\n const keyTemplate = new Value(stringify(exp), this.liquid)\n const array = toArray(arr)\n this.context.memoryLimit.use(array.length)\n for (const item of array) {\n this.context.push({ [itemName]: item })\n const value = yield keyTemplate.value(this.context)\n this.context.pop()\n if (value === include) filtered.push(item)\n }\n return filtered\n}\n\nexport function * where<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n return yield * filter.call(this, true, arr, property, expected)\n}\n\nexport function * reject<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n return yield * filter.call(this, false, arr, property, expected)\n}\n\nexport function * where_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n return yield * filter_exp.call(this, true, arr, itemName, exp)\n}\n\nexport function * reject_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n return yield * filter_exp.call(this, false, arr, itemName, exp)\n}\n\nexport function * group_by<T extends object> (this: FilterImpl, arr: T[], property: string): IterableIterator<unknown> {\n const map = new Map()\n arr = toEnumerable(arr)\n const token = new Tokenizer(stringify(property)).readScopeValue()\n this.context.memoryLimit.use(arr.length)\n for (const item of arr) {\n const key = yield evalToken(token, this.context.spawn(item))\n if (!map.has(key)) map.set(key, [])\n map.get(key).push(item)\n }\n return [...map.entries()].map(([name, items]) => ({ name, items }))\n}\n\nexport function * group_by_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const map = new Map()\n const keyTemplate = new Value(stringify(exp), this.liquid)\n arr = toEnumerable(arr)\n this.context.memoryLimit.use(arr.length)\n for (const item of arr) {\n this.context.push({ [itemName]: item })\n const key = yield keyTemplate.value(this.context)\n this.context.pop()\n if (!map.has(key)) map.set(key, [])\n map.get(key).push(item)\n }\n return [...map.entries()].map(([name, items]) => ({ name, items }))\n}\n\nfunction * search<T extends object> (this: FilterImpl, arr: T[], property: string, expected: string): IterableIterator<unknown> {\n const token = new Tokenizer(stringify(property)).readScopeValue()\n const array = toArray(arr)\n const matcher = expectedMatcher.call(this, expected)\n for (let index = 0; index < array.length; index++) {\n const value = yield evalToken(token, this.context.spawn(array[index]))\n if (matcher(value)) return [index, array[index]]\n }\n}\n\nfunction * search_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const predicate = new Value(stringify(exp), this.liquid)\n const array = toArray(arr)\n for (let index = 0; index < array.length; index++) {\n this.context.push({ [itemName]: array[index] })\n const value = yield predicate.value(this.context)\n this.context.pop()\n if (value) return [index, array[index]]\n }\n}\n\nexport function * has<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n const result = yield * search.call(this, arr, property, expected)\n return !!result\n}\n\nexport function * has_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return !!result\n}\n\nexport function * find_index<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n const result = yield * search.call(this, arr, property, expected)\n return result ? result[0] : undefined\n}\n\nexport function * find_index_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return result ? result[0] : undefined\n}\n\nexport function * find<T extends object> (this: FilterImpl, arr: T[], property: string, expected?: any): IterableIterator<unknown> {\n const result = yield * search.call(this, arr, property, expected)\n return result ? result[1] : undefined\n}\n\nexport function * find_exp<T extends object> (this: FilterImpl, arr: T[], itemName: string, exp: string): IterableIterator<unknown> {\n const result = yield * search_exp.call(this, arr, itemName, exp)\n return result ? result[1] : undefined\n}\n\nexport function uniq<T> (this: FilterImpl, arr: T[]): T[] {\n arr = toArray(arr)\n this.context.memoryLimit.use(arr.length)\n return [...new Set(arr)]\n}\n\nexport function sample<T> (this: FilterImpl, v: T[] | string, count = 1): T | string | (T | string)[] {\n v = toValue(v)\n if (isNil(v)) return []\n if (!isArray(v)) v = stringify(v)\n this.context.memoryLimit.use(count)\n const shuffled = [...v].sort(() => Math.random() - 0.5)\n if (count === 1) return shuffled[0]\n return shuffled.slice(0, count)\n}\n","import { toValue, stringify, isString, isNumber, LiquidDate, strftime, isNil } from '../util'\nimport { FilterImpl } from '../template'\nimport { NormalizedFullOptions } from '../liquid-options'\n\nexport function date (this: FilterImpl, v: string | Date, format?: string, timezoneOffset?: number | string) {\n const size = ((v as string)?.length ?? 0) + (format?.length ?? 0) + ((timezoneOffset as string)?.length ?? 0)\n this.context.memoryLimit.use(size)\n const date = parseDate(v, this.context.opts, timezoneOffset)\n if (!date) return v\n format = toValue(format)\n format = isNil(format) ? this.context.opts.dateFormat : stringify(format)\n return strftime(date, format)\n}\n\nexport function date_to_xmlschema (this: FilterImpl, v: string | Date) {\n return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z')\n}\n\nexport function date_to_rfc822 (this: FilterImpl, v: string | Date) {\n return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z')\n}\n\nexport function date_to_string (this: FilterImpl, v: string | Date, type?: string, style?: string) {\n return stringify_date.call(this, v, '%b', type, style)\n}\n\nexport function date_to_long_string (this: FilterImpl, v: string | Date, type?: string, style?: string) {\n return stringify_date.call(this, v, '%B', type, style)\n}\n\nfunction stringify_date (this: FilterImpl, v: string | Date, month_type: string, type?: string, style?: string) {\n const date = parseDate(v, this.context.opts)\n if (!date) return v\n if (type === 'ordinal') {\n const d = date.getDate()\n return style === 'US'\n ? strftime(date, `${month_type} ${d}%q, %Y`)\n : strftime(date, `${d}%q ${month_type} %Y`)\n }\n return strftime(date, `%d ${month_type} %Y`)\n}\n\nfunction parseDate (v: string | Date, opts: NormalizedFullOptions, timezoneOffset?: number | string): LiquidDate | undefined {\n let date: LiquidDate | undefined\n const defaultTimezoneOffset = timezoneOffset ?? opts.timezoneOffset\n const locale = opts.locale\n v = toValue(v)\n if (v === 'now' || v === 'today') {\n date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset)\n } else if (isNumber(v)) {\n date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset)\n } else if (isString(v)) {\n if (/^\\d+$/.test(v)) {\n date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset)\n } else if (opts.preserveTimezones && timezoneOffset === undefined) {\n date = LiquidDate.createDateFixedToTimezone(v, locale)\n } else {\n date = new LiquidDate(v, locale, defaultTimezoneOffset)\n }\n } else {\n date = new LiquidDate(v, locale, defaultTimezoneOffset)\n }\n return date.valid() ? date : undefined\n}\n","/**\n * String related filters\n *\n * * prefer stringify() to String() since `undefined`, `null` should eval ''\n */\n\n// Han (Chinese) characters: \\u4E00-\\u9FFF\n// Additional Han characters: \\uF900-\\uFAFF (CJK Compatibility Ideographs)\n// Additional Han characters: \\u3400-\\u4DBF (CJK Unified Ideographs Extension A)\n// Katakana (Japanese): \\u30A0-\\u30FF\n// Hiragana (Japanese): \\u3040-\\u309F\n// Hangul (Korean): \\uAC00-\\uD7AF\nimport { FilterImpl } from '../template'\nimport { assert, escapeRegExp, stringify } from '../util'\n\nconst rCJKWord = /[\\u4E00-\\u9FFF\\uF900-\\uFAFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF]/gu\n\n// Word boundary followed by word characters (for detecting words)\nconst rNonCJKWord = /[^\\u4E00-\\u9FFF\\uF900-\\uFAFF\\u3400-\\u4DBF\\u3040-\\u309F\\u30A0-\\u30FF\\uAC00-\\uD7AF\\s]+/gu\n\nexport function append (this: FilterImpl, v: string, arg: string) {\n assert(arguments.length === 2, 'append expect 2 arguments')\n const lhs = stringify(v)\n const rhs = stringify(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return lhs + rhs\n}\n\nexport function prepend (this: FilterImpl, v: string, arg: string) {\n assert(arguments.length === 2, 'prepend expect 2 arguments')\n const lhs = stringify(v)\n const rhs = stringify(arg)\n this.context.memoryLimit.use(lhs.length + rhs.length)\n return rhs + lhs\n}\n\nexport function lstrip (this: FilterImpl, v: string, chars?: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = escapeRegExp(stringify(chars))\n return str.replace(new RegExp(`^[${chars}]+`, 'g'), '')\n }\n return str.replace(/^\\s+/, '')\n}\n\nexport function downcase (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.toLowerCase()\n}\n\nexport function upcase (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return stringify(str).toUpperCase()\n}\n\nexport function remove (this: FilterImpl, v: string, arg: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.split(stringify(arg)).join('')\n}\n\nexport function remove_first (this: FilterImpl, v: string, l: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(stringify(l), '')\n}\n\nexport function remove_last (this: FilterImpl, v: string, l: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const pattern = stringify(l)\n const index = str.lastIndexOf(pattern)\n if (index === -1) return str\n return str.substring(0, index) + str.substring(index + pattern.length)\n}\n\nexport function rstrip (this: FilterImpl, str: string, chars?: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = escapeRegExp(stringify(chars))\n return str.replace(new RegExp(`[${chars}]+$`, 'g'), '')\n }\n return str.replace(/\\s+$/, '')\n}\n\nexport function split (this: FilterImpl, v: string, arg: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const arr = str.split(stringify(arg))\n // align to ruby split, which is the behavior of shopify/liquid\n // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split\n while (arr.length && arr[arr.length - 1] === '') arr.pop()\n return arr\n}\n\nexport function strip (this: FilterImpl, v: string, chars?: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (chars) {\n chars = escapeRegExp(stringify(chars))\n return str\n .replace(new RegExp(`^[${chars}]+`, 'g'), '')\n .replace(new RegExp(`[${chars}]+$`, 'g'), '')\n }\n return str.trim()\n}\n\nexport function strip_newlines (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\r?\\n/gm, '')\n}\n\nexport function capitalize (this: FilterImpl, str: string) {\n str = stringify(str)\n this.context.memoryLimit.use(str.length)\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n\nexport function replace (this: FilterImpl, v: string, pattern: string, replacement: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.split(stringify(pattern)).join(replacement)\n}\n\nexport function replace_first (this: FilterImpl, v: string, arg1: string, arg2: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(stringify(arg1), arg2)\n}\n\nexport function replace_last (this: FilterImpl, v: string, arg1: string, arg2: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const pattern = stringify(arg1)\n const index = str.lastIndexOf(pattern)\n if (index === -1) return str\n const replacement = stringify(arg2)\n return str.substring(0, index) + replacement + str.substring(index + pattern.length)\n}\n\nexport function truncate (this: FilterImpl, v: string, l = 50, o = '...') {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n if (str.length <= l) return v\n return str.substring(0, l - o.length) + o\n}\n\nexport function truncatewords (this: FilterImpl, v: string, words = 15, o = '...') {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n const arr = str.split(/\\s+/)\n if (words <= 0) words = 1\n let ret = arr.slice(0, words).join(' ')\n if (arr.length >= words) ret += o\n return ret\n}\n\nexport function normalize_whitespace (this: FilterImpl, v: string) {\n const str = stringify(v)\n this.context.memoryLimit.use(str.length)\n return str.replace(/\\s+/g, ' ')\n}\n\nexport function number_of_words (this: FilterImpl, input: string, mode?: 'cjk' | 'auto') {\n const str = stringify(input)\n this.context.memoryLimit.use(str.length)\n input = str.trim()\n if (!input) return 0\n switch (mode) {\n case 'cjk':\n // Count CJK characters and words\n return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length\n case 'auto':\n // Count CJK characters, if none, count words\n return rCJKWord.test(input)\n ? input.match(rCJKWord)!.length + (input.match(rNonCJKWord) || []).length\n : input.split(/\\s+/).length\n default:\n // Count words only\n return input.split(/\\s+/).length\n }\n}\n\nexport function array_to_sentence_string (this: FilterImpl, array: unknown[], connector = 'and') {\n this.context.memoryLimit.use(array.length)\n switch (array.length) {\n case 0:\n return ''\n case 1:\n return array[0]\n case 2:\n return `${array[0]} ${connector} ${array[1]}`\n default:\n return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`\n }\n}\n","import * as htmlFilters from './html'\nimport * as mathFilters from './math'\nimport * as urlFilters from './url'\nimport * as arrayFilters from './array'\nimport * as dateFilters from './date'\nimport * as stringFilters from './string'\nimport misc from './misc'\nimport { FilterImplOptions } from '../template'\n\nexport const filters: Record<string, FilterImplOptions> = {\n ...htmlFilters,\n ...mathFilters,\n ...urlFilters,\n ...arrayFilters,\n ...dateFilters,\n ...stringFilters,\n ...misc\n}\n","import { Value, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\nimport { IdentifierToken } from '../tokens'\n\nexport default class extends Tag {\n private key: string\n private value: Value\n private identifier: IdentifierToken\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.key = this.identifier.content\n this.tokenizer.assert(this.key, 'expected variable name')\n\n this.tokenizer.skipBlank()\n this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected \"=\"')\n\n this.tokenizer.advance()\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n }\n * render (ctx: Context): Generator<unknown, void, unknown> {\n ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf)\n }\n\n public * arguments (): Arguments {\n yield this.value\n }\n\n public * localScope (): Iterable<IdentifierToken> {\n yield this.identifier\n }\n}\n","import { Hash, ValueToken, Liquid, Tag, evalToken, Emitter, TagToken, TopLevelToken, Context, Template, ParseStream } from '..'\nimport { assertEmpty, isValueToken, toEnumerable } from '../util'\nimport { ForloopDrop } from '../drop/forloop-drop'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nconst MODIFIERS = ['offset', 'limit', 'reversed']\n\ntype valueOf<T> = T[keyof T]\n\nexport default class extends Tag {\n variable: string\n collection: ValueToken\n hash: Hash\n templates: Template[]\n elseTemplates: Template[]\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const variable = this.tokenizer.readIdentifier()\n const inStr = this.tokenizer.readIdentifier()\n const collection = this.tokenizer.readValue()\n if (!variable.size() || inStr.content !== 'in' || !collection) {\n throw new Error(`illegal tag: ${token.getText()}`)\n }\n\n this.variable = variable.content\n this.collection = collection\n this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = []\n this.elseTemplates = []\n\n let p\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on<TagToken>('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates })\n .on<TagToken>('tag:endfor', tag => { assertEmpty(tag.args); stream.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${token.getText()} not closed`) })\n\n stream.start()\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void | string, Template[]> {\n const r = this.liquid.renderer\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n\n if (!collection.length) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n return\n }\n\n const continueKey = 'continue-' + this.variable + '-' + this.collection.getText()\n ctx.push({ continue: ctx.getRegister(continueKey) })\n const hash = yield this.hash.render(ctx)\n ctx.pop()\n\n const modifiers = this.liquid.options.orderedFilterParameters\n ? Object.keys(hash).filter(x => MODIFIERS.includes(x))\n : MODIFIERS.filter(x => hash[x] !== undefined)\n\n collection = modifiers.reduce((collection, modifier: valueOf<typeof MODIFIERS>) => {\n if (modifier === 'offset') return offset(collection, hash['offset'])\n if (modifier === 'limit') return limit(collection, hash['limit'])\n return reversed(collection)\n }, collection)\n\n ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length)\n const scope = { forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) }\n ctx.push(scope)\n for (const item of collection) {\n scope[this.variable] = item\n ctx.continueCalled = ctx.breakCalled = false\n yield r.renderTemplates(this.templates, ctx, emitter)\n if (ctx.breakCalled) break\n scope.forloop.next()\n }\n ctx.continueCalled = ctx.breakCalled = false\n ctx.pop()\n }\n\n public * children (): Generator<unknown, Template[]> {\n const templates = this.templates.slice()\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n\n public * arguments (): Arguments {\n yield this.collection\n\n for (const v of Object.values(this.hash.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n }\n\n public blockScope (): Iterable<string> {\n return [this.variable, 'forloop']\n }\n}\n\nfunction reversed<T> (arr: Array<T>) {\n return [...arr].reverse()\n}\n\nfunction offset<T> (arr: Array<T>, count: number) {\n return arr.slice(count)\n}\n\nfunction limit<T> (arr: Array<T>, count: number) {\n return arr.slice(0, count)\n}\n","import { Liquid, Tag, Template, Context, TagToken, TopLevelToken } from '..'\nimport { Parser } from '../parser'\nimport { IdentifierToken, QuotedToken } from '../tokens'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n identifier: IdentifierToken | QuotedToken\n variable: string\n templates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n this.identifier = this.readVariable()\n this.variable = this.identifier.content\n\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endcapture') return\n this.templates.push(parser.parseToken(token, remainTokens))\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n\n private readVariable (): IdentifierToken | QuotedToken {\n let ident: IdentifierToken | QuotedToken | undefined = this.tokenizer.readIdentifier()\n if (ident.content) return ident\n ident = this.tokenizer.readQuoted()\n if (ident) return ident\n throw this.tokenizer.error('invalid capture name')\n }\n\n * render (ctx: Context): Generator<unknown, void, string> {\n const r = this.liquid.renderer\n const html = yield r.renderTemplates(this.templates, ctx)\n ctx.bottom()[this.variable] = html\n }\n\n public * children (): Generator<unknown, Template[]> {\n return this.templates\n }\n\n public * localScope (): Iterable<string | IdentifierToken | QuotedToken> {\n yield this.identifier\n }\n}\n","import { ValueToken, Liquid, toValue, evalToken, Value, Emitter, TagToken, TopLevelToken, Context, Template, Tag, ParseStream } from '..'\nimport { Parser } from '../parser'\nimport { equals } from '../render'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n value: Value\n branches: { values: ValueToken[], templates: Template[] }[] = []\n elseTemplates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n this.elseTemplates = []\n\n let p: Template[] = []\n let elseCount = 0\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('tag:when', (token: TagToken) => {\n if (elseCount > 0) {\n return\n }\n\n p = []\n\n const values: ValueToken[] = []\n while (!token.tokenizer.end()) {\n values.push(token.tokenizer.readValueOrThrow())\n token.tokenizer.skipBlank()\n if (token.tokenizer.peek() === ',') {\n token.tokenizer.readTo(',')\n } else {\n token.tokenizer.readTo('or')\n }\n }\n this.branches.push({\n values,\n templates: p\n })\n })\n .on('tag:else', () => {\n elseCount++\n p = this.elseTemplates\n })\n .on('tag:endcase', () => stream.stop())\n .on('template', (tpl: Template) => {\n if (p !== this.elseTemplates || elseCount === 1) {\n p.push(tpl)\n }\n })\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const r = this.liquid.renderer\n const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf))\n let branchHit = false\n for (const branch of this.branches) {\n for (const valueToken of branch.values) {\n const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf)\n if (equals(target, value)) {\n yield r.renderTemplates(branch.templates, ctx, emitter)\n branchHit = true\n break\n }\n }\n }\n if (!branchHit) {\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n }\n\n public * arguments (): Arguments {\n yield this.value\n yield * this.branches.flatMap(b => b.values)\n }\n\n public * children (): Generator<unknown, Template[]> {\n const templates = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n}\n","import { Liquid, TopLevelToken, TagToken, Tag } from '..'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endcomment') return\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n render () {}\n}\n","import { __assign } from 'tslib'\nimport { ForloopDrop } from '../drop'\nimport { isString, isValueToken, toEnumerable } from '../util'\nimport { TopLevelToken, assert, Liquid, Token, Template, evalQuotedToken, TypeGuards, Tokenizer, evalToken, Hash, Emitter, TagToken, Context, Tag } from '..'\nimport { Parser } from '../parser'\nimport { Argument, Arguments, PartialScope } from '../template'\n\nexport type ParsedFileName = Template[] | Token | string | undefined\n\nexport default class extends Tag {\n private file: ParsedFileName\n private currentFile?: string\n private hash: Hash\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const tokenizer = this.tokenizer\n this.file = parseFilePath(tokenizer, this.liquid, parser)\n this.currentFile = token.file\n while (!tokenizer.end()) {\n tokenizer.skipBlank()\n const begin = tokenizer.p\n const keyword = tokenizer.readIdentifier()\n if (keyword.content === 'with' || keyword.content === 'for') {\n tokenizer.skipBlank()\n // can be normal key/value pair, like \"with: true\"\n if (tokenizer.peek() !== ':') {\n const value = tokenizer.readValue()\n // can be normal key, like \"with,\"\n if (value) {\n const beforeAs = tokenizer.p\n const asStr = tokenizer.readIdentifier()\n let alias\n if (asStr.content === 'as') alias = tokenizer.readIdentifier()\n else tokenizer.p = beforeAs\n\n this[keyword.content] = { value, alias: alias && alias.content }\n tokenizer.skipBlank()\n if (tokenizer.peek() === ',') tokenizer.advance()\n continue // matched!\n }\n }\n }\n /**\n * restore cursor if with/for not matched\n */\n tokenizer.p = begin\n break\n }\n this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator)\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const { liquid, hash } = this\n const filepath = (yield renderFilePath(this['file'], ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n\n const childCtx = ctx.spawn()\n const scope = childCtx.bottom()\n __assign(scope, yield hash.render(ctx))\n if (this['with']) {\n const { value, alias } = this['with']\n scope[alias || filepath] = yield evalToken(value, ctx)\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n const collection = toEnumerable(yield evalToken(value, ctx))\n scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias)\n for (const item of collection) {\n scope[alias] = item\n const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])) as Template[]\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n scope['forloop'].next()\n }\n } else {\n const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile'])) as Template[]\n yield liquid.renderer.renderTemplates(templates, childCtx, emitter)\n }\n }\n\n public * children (partials: boolean, sync: boolean): Generator<unknown, Template[]> {\n if (partials && isString(this['file'])) {\n return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])) as Template[]\n }\n return []\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this['file'])) {\n const names: Array<string | [string, Argument]> = Object.keys(this.hash.hash)\n\n if (this['with']) {\n const { value, alias } = this['with']\n if (isString(alias)) {\n names.push([alias, value])\n } else if (isString(this.file)) {\n names.push([this.file, value])\n }\n }\n\n if (this['for']) {\n const { value, alias } = this['for']\n if (isString(alias)) {\n names.push([alias, value])\n } else if (isString(this.file)) {\n names.push([this.file, value])\n }\n }\n\n return { name: this['file'], isolated: true, scope: names }\n }\n }\n\n public * arguments (): Arguments {\n for (const v of Object.values(this.hash.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n\n if (this['with']) {\n const { value } = this['with']\n if (isValueToken(value)) {\n yield value\n }\n }\n\n if (this['for']) {\n const { value } = this['for']\n if (isValueToken(value)) {\n yield value\n }\n }\n }\n}\n\n/**\n * @return null for \"none\",\n * @return Template[] for quoted with tags and/or filters\n * @return Token for expression (not quoted)\n * @throws TypeError if cannot read next token\n */\nexport function parseFilePath (tokenizer: Tokenizer, liquid: Liquid, parser: Parser): ParsedFileName {\n if (liquid.options.dynamicPartials) {\n const file = tokenizer.readValue()\n tokenizer.assert(file, 'illegal file path')\n if (file!.getText() === 'none') return\n if (TypeGuards.isQuotedToken(file)) {\n // for filenames like \"files/{{file}}\", eval as liquid template\n const templates = parser.parse(evalQuotedToken(file))\n return optimize(templates)\n }\n return file\n }\n const tokens = [...tokenizer.readFileNameTemplate(liquid.options)]\n const templates = optimize(parser.parseTokens(tokens))\n return templates === 'none' ? undefined : templates\n}\n\nfunction optimize (templates: Template[]): string | Template[] {\n // for filenames like \"files/file.liquid\", extract the string directly\n if (templates.length === 1 && TypeGuards.isHTMLToken(templates[0].token)) return templates[0].token.getContent()\n return templates\n}\n\nexport function * renderFilePath (file: ParsedFileName, ctx: Context, liquid: Liquid): IterableIterator<unknown> {\n if (typeof file === 'string') return file\n if (Array.isArray(file)) return liquid.renderer.renderTemplates(file, ctx)\n return yield evalToken(file, ctx)\n}\n","import { Template, ValueToken, TopLevelToken, Liquid, Tag, assert, evalToken, Hash, Emitter, TagToken, Context } from '..'\nimport { BlockMode, Scope } from '../context'\nimport { Parser } from '../parser'\nimport { Argument, Arguments, PartialScope } from '../template'\nimport { isString, isValueToken } from '../util'\nimport { parseFilePath, renderFilePath } from './render'\n\nexport default class extends Tag {\n private withVar?: ValueToken\n private hash: Hash\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const { tokenizer } = token\n this['file'] = parseFilePath(tokenizer, this.liquid, parser)\n this['currentFile'] = token.file\n\n const begin = tokenizer.p\n const withStr = tokenizer.readIdentifier()\n if (withStr.content === 'with') {\n tokenizer.skipBlank()\n if (tokenizer.peek() !== ':') {\n this.withVar = tokenizer.readValue()\n } else tokenizer.p = begin\n } else tokenizer.p = begin\n\n this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator)\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n const { liquid, hash, withVar } = this\n const { renderer } = liquid\n const filepath = (yield renderFilePath(this['file'], ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n\n const saved = ctx.saveRegister('blocks', 'blockMode')\n ctx.setRegister('blocks', {})\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n const scope = (yield hash.render(ctx)) as Scope\n if (withVar) scope[filepath] = yield evalToken(withVar, ctx)\n const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile'])) as Template[]\n ctx.push(ctx.opts.jekyllInclude ? { include: scope } : scope)\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n ctx.restoreRegister(saved)\n }\n\n public * children (partials: boolean, sync: boolean): Generator<unknown, Template[]> {\n if (partials && isString(this['file'])) {\n return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile'])) as Template[]\n }\n return []\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this['file'])) {\n let names: Array<string | [string, Argument]>\n\n if (this.liquid.options.jekyllInclude) {\n names = ['include']\n } else {\n names = Object.keys(this.hash.hash)\n if (this.withVar) {\n names.push([this['file'], this.withVar])\n }\n }\n\n return { name: this['file'], isolated: false, scope: names }\n }\n }\n\n public * arguments (): Arguments {\n yield * Object.values(this.hash.hash).filter(isValueToken)\n\n if (isValueToken(this['file'])) {\n yield this['file']\n }\n\n if (isValueToken(this.withVar)) {\n yield this.withVar\n }\n }\n}\n","import { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'\nimport { IdentifierToken } from '../tokens'\nimport { isNumber, stringify } from '../util'\n\nexport default class extends Tag {\n private identifier: IdentifierToken\n private variable: string\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.variable = this.identifier.content\n }\n render (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n emitter.write(stringify(--scope[this.variable]))\n }\n\n public * localScope (): Iterable<string | IdentifierToken> {\n yield this.identifier\n }\n}\n","import { TopLevelToken, Liquid, ValueToken, evalToken, Emitter, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n private candidates: ValueToken[] = []\n private group?: ValueToken\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n const group = this.tokenizer.readValue()\n this.tokenizer.skipBlank()\n\n if (group) {\n if (this.tokenizer.peek() === ':') {\n this.group = group\n this.tokenizer.advance()\n } else this.candidates.push(group)\n }\n\n while (!this.tokenizer.end()) {\n const value = this.tokenizer.readValue()\n if (value) this.candidates.push(value)\n this.tokenizer.readTo(',')\n }\n this.tokenizer.assert(this.candidates.length, () => `empty candidates: \"${token.getText()}\"`)\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown> {\n const group = (yield evalToken(this.group, ctx)) as ValueToken\n const fingerprint = `cycle:${group}:` + this.candidates.join(',')\n const groups = ctx.getRegister('cycle')\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 return yield evalToken(candidate, ctx)\n }\n\n public * arguments (): Arguments {\n yield * this.candidates\n\n if (this.group) {\n yield this.group\n }\n }\n}\n","import { Liquid, Tag, Value, Emitter, isTruthy, TagToken, TopLevelToken, Context, Template } from '..'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\nimport { assert, assertEmpty } from '../util'\n\nexport default class extends Tag {\n branches: { value: Value, templates: Template[] }[] = []\n elseTemplates: Template[] | undefined\n\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n let p: Template[] = []\n parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n assert(!this.elseTemplates, 'unexpected elsif after else')\n this.branches.push({\n value: new Value(token.tokenizer.readFilteredValue(), this.liquid),\n templates: (p = [])\n })\n })\n .on<TagToken>('tag:else', tag => {\n assertEmpty(tag.args)\n assert(!this.elseTemplates, 'duplicated else')\n p = this.elseTemplates = []\n })\n .on<TagToken>('tag:endif', function (tag) { assertEmpty(tag.args); this.stop() })\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, string> {\n const r = this.liquid.renderer\n\n for (const { value, templates } of this.branches) {\n const v = yield value.value(ctx, ctx.opts.lenientIf)\n if (isTruthy(v, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n yield r.renderTemplates(this.elseTemplates || [], ctx, emitter)\n }\n\n public * children (): Generator<unknown, Template[]> {\n const templates = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n templates.push(...this.elseTemplates)\n }\n return templates\n }\n\n public arguments (): Arguments {\n return this.branches.map(b => b.value)\n }\n}\n","import { isNumber, stringify } from '../util'\nimport { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..'\nimport { IdentifierToken } from '../tokens'\n\nexport default class extends Tag {\n private identifier: IdentifierToken\n private variable: string\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.identifier = this.tokenizer.readIdentifier()\n this.variable = this.identifier.content\n }\n render (context: Context, emitter: Emitter) {\n const scope = context.environments\n if (!isNumber(scope[this.variable])) {\n scope[this.variable] = 0\n }\n const val = scope[this.variable]\n scope[this.variable]++\n emitter.write(stringify(val))\n }\n\n public * localScope (): Iterable<string | IdentifierToken> {\n yield this.identifier\n }\n}\n","import { Scope, Template, Liquid, Tag, assert, Emitter, Hash, TagToken, TopLevelToken, Context } from '..'\nimport { BlockMode } from '../context'\nimport { parseFilePath, renderFilePath, ParsedFileName } from './render'\nimport { BlankDrop } from '../drop'\nimport { Parser } from '../parser'\nimport { Arguments, PartialScope } from '../template'\nimport { isString, isValueToken } from '../util'\n\nexport default class extends Tag {\n args: Hash\n templates: Template[]\n file?: ParsedFileName\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n this.file = parseFilePath(this.tokenizer, this.liquid, parser)\n this['currentFile'] = token.file\n this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = parser.parseTokens(remainTokens)\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown> {\n const { liquid, args, file } = this\n const { renderer } = liquid\n if (file === undefined) {\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n yield renderer.renderTemplates(this.templates, ctx, emitter)\n return\n }\n const filepath = (yield renderFilePath(this.file, ctx, liquid)) as string\n assert(filepath, () => `illegal file path \"${filepath}\"`)\n const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile'])) as Template[]\n\n // render remaining contents and store rendered results\n ctx.setRegister('blockMode', BlockMode.STORE)\n const html = yield renderer.renderTemplates(this.templates, ctx)\n const blocks = ctx.getRegister('blocks')\n\n // set whole content to anonymous block if anonymous doesn't specified\n if (blocks[''] === undefined) blocks[''] = (parent: BlankDrop, emitter: Emitter) => emitter.write(html)\n ctx.setRegister('blockMode', BlockMode.OUTPUT)\n\n // render the layout file use stored blocks\n ctx.push((yield args.render(ctx)) as Scope)\n yield renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n }\n\n public * children (partials: boolean): Generator<unknown, Template[]> {\n const templates = this.templates.slice()\n\n if (partials && isString(this.file)) {\n templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile'])) as Template[])\n }\n\n return templates\n }\n\n public * arguments (): Arguments {\n for (const v of Object.values(this.args.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n\n if (isValueToken(this.file)) {\n yield this.file\n }\n }\n\n public partialScope (): PartialScope | undefined {\n if (isString(this.file)) {\n return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) }\n }\n }\n}\n","import { BlockMode } from '../context'\nimport { isTagToken } from '../util'\nimport { BlockDrop } from '../drop'\nimport { Liquid, TagToken, TopLevelToken, Template, Context, Emitter, Tag } from '..'\nimport { Parser } from '../parser'\n\nexport default class extends Tag {\n block: string\n templates: Template[] = []\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const match = /\\w+/.exec(token.args)\n this.block = match ? match[0] : ''\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endblock') return\n const template = parser.parseToken(token, remainTokens)\n this.templates.push(template)\n }\n throw new Error(`tag ${token.getText()} not closed`)\n }\n\n * render (ctx: Context, emitter: Emitter) {\n const blockRender = this.getBlockRender(ctx)\n if (ctx.getRegister('blockMode') === BlockMode.STORE) {\n ctx.getRegister('blocks')[this.block] = blockRender\n } else {\n yield blockRender(new BlockDrop(), emitter)\n }\n }\n\n private getBlockRender (ctx: Context) {\n const { liquid, templates } = this\n const renderChild = ctx.getRegister('blocks')[this.block]\n const renderCurrent = function * (superBlock: BlockDrop, emitter: Emitter) {\n // add {{ block.super }} support when rendering\n ctx.push({ block: superBlock })\n yield liquid.renderer.renderTemplates(templates, ctx, emitter)\n ctx.pop()\n }\n return renderChild\n ? (superBlock: BlockDrop, emitter: Emitter) => renderChild(\n new BlockDrop(\n (emitter: Emitter) => renderCurrent(superBlock, emitter)\n ),\n emitter)\n : renderCurrent\n }\n\n public * children (): Generator<unknown, Template[]> {\n return this.templates\n }\n\n public blockScope (): Iterable<string> {\n return ['block']\n }\n}\n","import { Liquid, TagToken, TopLevelToken, Tag } from '..'\nimport { isTagToken } from '../util'\n\nexport default class extends Tag {\n private tokens: TopLevelToken[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n while (remainTokens.length) {\n const token = remainTokens.shift()!\n if (isTagToken(token) && token.name === 'endraw') return\n this.tokens.push(token)\n }\n throw new Error(`tag ${tagToken.getText()} not closed`)\n }\n render () {\n return this.tokens.map((token: TopLevelToken) => token.getText()).join('')\n }\n}\n","import { ForloopDrop } from './forloop-drop'\n\nexport class TablerowloopDrop extends ForloopDrop {\n private cols: number\n public constructor (length: number, cols: number, collection: string, variable: string) {\n super(length, collection, variable)\n this.length = length\n this.cols = cols\n }\n public row () {\n return Math.floor(this.i / this.cols) + 1\n }\n public col0 () {\n return (this.i % this.cols)\n }\n public col () {\n return this.col0() + 1\n }\n public col_first () { // eslint-disable-line\n return this.col0() === 0\n }\n public col_last () { // eslint-disable-line\n return this.col() === this.cols\n }\n}\n","import { isValueToken, toEnumerable } from '../util'\nimport { ValueToken, Liquid, Tag, evalToken, Emitter, Hash, TagToken, TopLevelToken, Context, Template, ParseStream } from '..'\nimport { TablerowloopDrop } from '../drop/tablerowloop-drop'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n variable: string\n args: Hash\n templates: Template[]\n collection: ValueToken\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n const variable = this.tokenizer.readIdentifier()\n this.tokenizer.skipBlank()\n\n const predicate = this.tokenizer.readIdentifier()\n const collectionToken = this.tokenizer.readValue()\n if (predicate.content !== 'in' || !collectionToken) {\n throw new Error(`illegal tag: ${tagToken.getText()}`)\n }\n\n this.variable = variable.content\n this.collection = collectionToken\n this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator)\n this.templates = []\n\n let p\n const stream: ParseStream = parser.parseStream(remainTokens)\n .on('start', () => (p = this.templates))\n .on('tag:endtablerow', () => stream.stop())\n .on('template', (tpl: Template) => p.push(tpl))\n .on('end', () => {\n throw new Error(`tag ${tagToken.getText()} not closed`)\n })\n\n stream.start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n let collection = toEnumerable(yield evalToken(this.collection, ctx))\n const args = (yield this.args.render(ctx)) as Record<string, any>\n const offset = args.offset || 0\n const limit = (args.limit === undefined) ? collection.length : args.limit\n\n collection = collection.slice(offset, offset + limit)\n const cols = args.cols || collection.length\n\n const r = this.liquid.renderer\n const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable)\n const scope = { tablerowloop }\n ctx.push(scope)\n\n for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) {\n scope[this.variable] = collection[idx]\n if (tablerowloop.col0() === 0) {\n if (tablerowloop.row() !== 1) emitter.write('</tr>')\n emitter.write(`<tr class=\"row${tablerowloop.row()}\">`)\n }\n emitter.write(`<td class=\"col${tablerowloop.col()}\">`)\n yield r.renderTemplates(this.templates, ctx, emitter)\n emitter.write('</td>')\n }\n if (collection.length) emitter.write('</tr>')\n ctx.pop()\n }\n\n public * children (): Generator<unknown, Template[]> {\n return this.templates\n }\n\n public * arguments (): Arguments {\n yield this.collection\n\n for (const v of Object.values(this.args.hash)) {\n if (isValueToken(v)) {\n yield v\n }\n }\n }\n\n public blockScope (): string[] {\n return [this.variable, 'tablerowloop']\n }\n}\n","import { Liquid, Tag, Value, TopLevelToken, Template, Emitter, isTruthy, isFalsy, Context, TagToken } from '..'\nimport { Parser } from '../parser'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n branches: { value: Value, test: (val: any, ctx: Context) => boolean, templates: Template[] }[] = []\n elseTemplates: Template[] = []\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(tagToken, remainTokens, liquid)\n let p: Template[] = []\n let elseCount = 0\n parser.parseStream(remainTokens)\n .on('start', () => this.branches.push({\n value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),\n test: isFalsy,\n templates: (p = [])\n }))\n .on('tag:elsif', (token: TagToken) => {\n if (elseCount > 0) {\n p = []\n return\n }\n this.branches.push({\n value: new Value(token.tokenizer.readFilteredValue(), this.liquid),\n test: isTruthy,\n templates: (p = [])\n })\n })\n .on('tag:else', () => {\n elseCount++\n p = this.elseTemplates\n })\n .on('tag:endunless', function () { this.stop() })\n .on('template', (tpl: Template) => {\n if (p !== this.elseTemplates || elseCount === 1) {\n p.push(tpl)\n }\n })\n .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`) })\n .start()\n }\n\n * render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown> {\n const r = this.liquid.renderer\n\n for (const { value, test, templates } of this.branches) {\n const v = yield value.value(ctx, ctx.opts.lenientIf)\n if (test(v, ctx)) {\n yield r.renderTemplates(templates, ctx, emitter)\n return\n }\n }\n\n yield r.renderTemplates(this.elseTemplates, ctx, emitter)\n }\n\n public * children (): Generator<unknown, Template[]> {\n const children = this.branches.flatMap(b => b.templates)\n if (this.elseTemplates) {\n children.push(...this.elseTemplates)\n }\n return children\n }\n\n public arguments (): Arguments {\n return this.branches.map(b => b.value)\n }\n}\n","import { Context, Emitter, Tag } from '..'\n\nexport default class extends Tag {\n render (ctx: Context, _emitter: Emitter) {\n ctx.breakCalled = true\n }\n}\n","import { Tag, Emitter, Context } from '..'\n\nexport default class extends Tag {\n render (ctx: Context, _emitter: Emitter) {\n ctx.continueCalled = true\n }\n}\n","import { Liquid, TopLevelToken, Emitter, Value, TagToken, Context, Tag } from '..'\nimport { Arguments } from '../template'\n\nexport default class extends Tag {\n private value?: Value\n\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(token, remainTokens, liquid)\n this.tokenizer.skipBlank()\n if (!this.tokenizer.end()) {\n this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid)\n }\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n if (!this.value) return\n const val = yield this.value.value(ctx, false)\n emitter.write(val)\n }\n\n public * arguments (): Arguments {\n if (this.value) {\n yield this.value\n }\n }\n}\n","import { Template, Emitter, Liquid, TopLevelToken, TagToken, Context, Tag } from '..'\nimport { Parser } from '../parser'\n\nexport default class extends Tag {\n templates: Template[]\n constructor (token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser) {\n super(token, remainTokens, liquid)\n const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options)\n this.templates = parser.parseTokens(tokens)\n }\n * render (ctx: Context, emitter: Emitter): Generator<unknown, void, unknown> {\n yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter)\n }\n\n public * children (): Generator<unknown, Template[]> {\n return this.templates\n }\n}\n","import { TagToken, Liquid, TopLevelToken, Tag } from '..'\n\nexport default class extends Tag {\n constructor (tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid) {\n super(tagToken, remainTokens, liquid)\n if (tagToken.args.search(/\\n\\s*[^#\\s]/g) !== -1) {\n throw new Error('every line of an inline comment must start with a \\'#\\' character')\n }\n }\n render () { }\n}\n","import AssignTag from './assign'\nimport ForTag from './for'\nimport CaptureTag from './capture'\nimport CaseTag from './case'\nimport CommentTag from './comment'\nimport IncludeTag from './include'\nimport RenderTag from './render'\nimport DecrementTag from './decrement'\nimport CycleTag from './cycle'\nimport IfTag from './if'\nimport IncrementTag from './increment'\nimport LayoutTag from './layout'\nimport BlockTag from './block'\nimport RawTag from './raw'\nimport TablerowTag from './tablerow'\nimport UnlessTag from './unless'\nimport BreakTag from './break'\nimport ContinueTag from './continue'\nimport EchoTag from './echo'\nimport LiquidTag from './liquid'\nimport InlineCommentTag from './inline-comment'\nimport type { TagClass } from '../template/tag'\n\nexport const tags: Record<string, TagClass> = {\n assign: AssignTag,\n 'for': ForTag,\n capture: CaptureTag,\n 'case': CaseTag,\n comment: CommentTag,\n include: IncludeTag,\n render: RenderTag,\n decrement: DecrementTag,\n increment: IncrementTag,\n cycle: CycleTag,\n 'if': IfTag,\n layout: LayoutTag,\n block: BlockTag,\n raw: RawTag,\n tablerow: TablerowTag,\n unless: UnlessTag,\n 'break': BreakTag,\n 'continue': ContinueTag,\n echo: EchoTag,\n liquid: LiquidTag,\n '#': InlineCommentTag\n}\n\nexport { AssignTag, ForTag, CaptureTag, CaseTag, CommentTag, IncludeTag, RenderTag, DecrementTag, IncrementTag, CycleTag, IfTag, LayoutTag, BlockTag, RawTag, TablerowTag, UnlessTag, BreakTag, ContinueTag, EchoTag, LiquidTag, InlineCommentTag }\n","import { Context } from './context'\nimport { toPromise, toValueSync, isFunction, forOwn, isString, strictUniq } from './util'\nimport { TagClass, createTagClass, TagImplOptions, FilterImplOptions, Template, Value, StaticAnalysisOptions, StaticAnalysis, analyze, analyzeSync, SegmentArray } from './template'\nimport { LookupType } from './fs/loader'\nimport { Render } from './render'\nimport { Parser } from './parser'\nimport { tags } from './tags'\nimport { filters } from './filters'\nimport { LiquidOptions, normalizeDirectoryList, NormalizedFullOptions, normalize, RenderOptions, RenderFileOptions } from './liquid-options'\n\nexport class Liquid {\n public readonly options: NormalizedFullOptions\n public readonly renderer = new Render()\n /**\n * @deprecated will be removed. In tags use `this.parser` instead\n */\n public readonly parser: Parser\n public readonly filters: Record<string, FilterImplOptions> = {}\n public readonly tags: Record<string, TagClass> = {}\n\n public constructor (opts: LiquidOptions = {}) {\n this.options = normalize(opts)\n // eslint-disable-next-line deprecation/deprecation\n this.parser = new Parser(this)\n forOwn(tags, (conf: TagClass, name: string) => this.registerTag(name, conf))\n forOwn(filters, (handler: FilterImplOptions, name: string) => this.registerFilter(name, handler))\n }\n public parse (html: string, filepath?: string): Template[] {\n const parser = new Parser(this)\n return parser.parse(html, filepath)\n }\n\n public _render (tpl: Template[], scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator<any> {\n const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplates(tpl, ctx)\n }\n public async render (tpl: Template[], scope?: object, renderOptions?: RenderOptions): Promise<any> {\n return toPromise(this._render(tpl, scope, { ...renderOptions, sync: false }))\n }\n public renderSync (tpl: Template[], scope?: object, renderOptions?: RenderOptions): any {\n return toValueSync(this._render(tpl, scope, { ...renderOptions, sync: true }))\n }\n public renderToNodeStream (tpl: Template[], scope?: object, renderOptions: RenderOptions = {}): NodeJS.ReadableStream {\n const ctx = new Context(scope, this.options, renderOptions)\n return this.renderer.renderTemplatesToNodeStream(tpl, ctx)\n }\n\n public _parseAndRender (html: string, scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator<any> {\n const tpl = this.parse(html)\n return this._render(tpl, scope, renderOptions)\n }\n public async parseAndRender (html: string, scope?: Context | object, renderOptions?: RenderOptions): Promise<any> {\n return toPromise(this._parseAndRender(html, scope, { ...renderOptions, sync: false }))\n }\n public parseAndRenderSync (html: string, scope?: Context | object, renderOptions?: RenderOptions): any {\n return toValueSync(this._parseAndRender(html, scope, { ...renderOptions, sync: true }))\n }\n\n public _parsePartialFile (file: string, sync?: boolean, currentFile?: string) {\n return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile)\n }\n public _parseLayoutFile (file: string, sync?: boolean, currentFile?: string) {\n return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile)\n }\n public _parseFile (file: string, sync?: boolean, lookupType?: LookupType, currentFile?: string): Generator<unknown, Template[]> {\n return new Parser(this).parseFile(file, sync, lookupType, currentFile)\n }\n public async parseFile (file: string, lookupType?: LookupType): Promise<Template[]> {\n return toPromise<Template[]>(new Parser(this).parseFile(file, false, lookupType))\n }\n public parseFileSync (file: string, lookupType?: LookupType): Template[] {\n return toValueSync<Template[]>(new Parser(this).parseFile(file, true, lookupType))\n }\n public * _renderFile (file: string, ctx: Context | object | undefined, renderFileOptions: RenderFileOptions): Generator<any> {\n const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType)) as Template[]\n return yield this._render(templates, ctx, renderFileOptions)\n }\n public async renderFile (file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions) {\n return toPromise(this._renderFile(file, ctx, { ...renderFileOptions, sync: false }))\n }\n public renderFileSync (file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions) {\n return toValueSync(this._renderFile(file, ctx, { ...renderFileOptions, sync: true }))\n }\n public async renderFileToNodeStream (file: string, scope?: object, renderOptions?: RenderOptions) {\n const templates = await this.parseFile(file)\n return this.renderToNodeStream(templates, scope, renderOptions)\n }\n\n public _evalValue (str: string, scope?: object | Context): IterableIterator<any> {\n const value = new Value(str, this)\n const ctx = scope instanceof Context ? scope : new Context(scope, this.options)\n return value.value(ctx)\n }\n public async evalValue (str: string, scope?: object | Context): Promise<any> {\n return toPromise(this._evalValue(str, scope))\n }\n public evalValueSync (str: string, scope?: object | Context): any {\n return toValueSync(this._evalValue(str, scope))\n }\n\n public registerFilter (name: string, filter: FilterImplOptions) {\n this.filters[name] = filter\n }\n public registerTag (name: string, tag: TagClass | TagImplOptions) {\n this.tags[name] = isFunction(tag) ? tag : createTagClass(tag)\n }\n public plugin (plugin: (this: Liquid, L: typeof Liquid) => void) {\n return plugin.call(this, Liquid)\n }\n public express () {\n const self = this // eslint-disable-line\n let firstCall = true\n\n return function (this: any, filePath: string, ctx: object, callback: (err: Error | null, rendered: string) => void) {\n if (firstCall) {\n firstCall = false\n const dirs = normalizeDirectoryList(this.root)\n self.options.root.unshift(...dirs)\n self.options.layouts.unshift(...dirs)\n self.options.partials.unshift(...dirs)\n }\n self.renderFile(filePath, ctx).then(html => callback(null, html) as any, callback as any)\n }\n }\n\n public async analyze (template: Template[], options: StaticAnalysisOptions = {}): Promise<StaticAnalysis> {\n return analyze(template, options)\n }\n\n public analyzeSync (template: Template[], options: StaticAnalysisOptions = {}): StaticAnalysis {\n return analyzeSync(template, options)\n }\n\n public async parseAndAnalyze (html: string, filename?: string, options: StaticAnalysisOptions = {}): Promise<StaticAnalysis> {\n return analyze(this.parse(html, filename), options)\n }\n\n public parseAndAnalyzeSync (html: string, filename?: string, options: StaticAnalysisOptions = {}): StaticAnalysis {\n return analyzeSync(this.parse(html, filename), options)\n }\n\n /** Return an array of all variables without their properties. */\n public async variables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<string[]> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.variables)\n }\n\n /** Return an array of all variables without their properties. */\n public variablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.variables)\n }\n\n /** Return an array of all variables including their properties/paths. */\n public async fullVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<string[]> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all variables including their properties/paths. */\n public fullVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all variables, each as an array of properties/segments. */\n public async variableSegments (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<Array<SegmentArray>> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all variables, each as an array of properties/segments. */\n public variableSegmentsSync (template: string | Template[], options: StaticAnalysisOptions = {}): Array<SegmentArray> {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all expected context variables without their properties. */\n public async globalVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<string[]> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.globals)\n }\n\n /** Return an array of all expected context variables without their properties. */\n public globalVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Object.keys(analysis.globals)\n }\n\n /** Return an array of all expected context variables including their properties/paths. */\n public async globalFullVariables (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<string[]> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all expected context variables including their properties/paths. */\n public globalFullVariablesSync (template: string | Template[], options: StaticAnalysisOptions = {}): string[] {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))))\n }\n\n /** Return an array of all expected context variables, each as an array of properties/segments. */\n public async globalVariableSegments (template: string | Template[], options: StaticAnalysisOptions = {}): Promise<Array<SegmentArray>> {\n const analysis = await analyze(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))))\n }\n\n /** Return an array of all expected context variables, each as an array of properties/segments. */\n public globalVariableSegmentsSync (template: string | Template[], options: StaticAnalysisOptions = {}): Array<SegmentArray> {\n const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options)\n return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))))\n }\n}\n","/* istanbul ignore file */\nexport const version = '[VI]{version}[/VI]'\nexport * as TypeGuards from './util/type-guards'\nexport { toValue, createTrie, Trie, toPromise, toValueSync, assert, LiquidError, ParseError, RenderError, UndefinedVariableError, TokenizationError, AssertionError } from './util'\nexport { Drop } from './drop'\nexport { Emitter } from './emitters'\nexport { defaultOperators, Operators, evalToken, evalQuotedToken, Expression, isFalsy, isTruthy } from './render'\nexport { Context, Scope } from './context'\nexport { Value, Hash, Template, FilterImplOptions, Tag, Filter, Output, Variable, VariableLocation, VariableSegments, Variables, StaticAnalysis, StaticAnalysisOptions, analyze, analyzeSync, Arguments, PartialScope } from './template'\nexport { Token, TopLevelToken, TagToken, ValueToken } from './tokens'\nexport type { RangeToken, LiteralToken, QuotedToken, PropertyAccessToken, NumberToken } from './tokens'\nexport { TokenKind, Tokenizer, ParseStream, Parser } from './parser'\nexport { filters } from './filters'\nexport * from './tags'\nexport { defaultOptions, LiquidOptions } from './liquid-options'\nexport { FS } from './fs'\nexport { Liquid } from './liquid'\n"],"names":["toString","_\r\n .range","_.padStart","TokenKind","last","arrayLast","TypeGuards.isQuotedToken","TypeGuards.isHTMLToken","AssignTag","ForTag","CaptureTag","CaseTag","CommentTag","IncludeTag","RenderTag","DecrementTag","IncrementTag","CycleTag","IfTag","LayoutTag","BlockTag","RawTag","TablerowTag","UnlessTag","BreakTag","ContinueTag","EchoTag","LiquidTag","InlineCommentTag"],"mappings":"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"}
\ No newline at end of file diff --git a/node_modules/liquidjs/dist/liquid.d.ts b/node_modules/liquidjs/dist/liquid.d.ts new file mode 100644 index 0000000..c703cd2 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.d.ts @@ -0,0 +1,70 @@ +/// <reference types="node" />
+import { Context } from './context';
+import { TagClass, TagImplOptions, FilterImplOptions, Template, StaticAnalysisOptions, StaticAnalysis, SegmentArray } from './template';
+import { LookupType } from './fs/loader';
+import { Render } from './render';
+import { Parser } from './parser';
+import { LiquidOptions, NormalizedFullOptions, RenderOptions, RenderFileOptions } from './liquid-options';
+export declare class Liquid {
+ readonly options: NormalizedFullOptions;
+ readonly renderer: Render;
+ /**
+ * @deprecated will be removed. In tags use `this.parser` instead
+ */
+ readonly parser: Parser;
+ readonly filters: Record<string, FilterImplOptions>;
+ readonly tags: Record<string, TagClass>;
+ constructor(opts?: LiquidOptions);
+ parse(html: string, filepath?: string): Template[];
+ _render(tpl: Template[], scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator<any>;
+ render(tpl: Template[], scope?: object, renderOptions?: RenderOptions): Promise<any>;
+ renderSync(tpl: Template[], scope?: object, renderOptions?: RenderOptions): any;
+ renderToNodeStream(tpl: Template[], scope?: object, renderOptions?: RenderOptions): NodeJS.ReadableStream;
+ _parseAndRender(html: string, scope: Context | object | undefined, renderOptions: RenderOptions): IterableIterator<any>;
+ parseAndRender(html: string, scope?: Context | object, renderOptions?: RenderOptions): Promise<any>;
+ parseAndRenderSync(html: string, scope?: Context | object, renderOptions?: RenderOptions): any;
+ _parsePartialFile(file: string, sync?: boolean, currentFile?: string): Generator<unknown, Template[], string | Template[]>;
+ _parseLayoutFile(file: string, sync?: boolean, currentFile?: string): Generator<unknown, Template[], string | Template[]>;
+ _parseFile(file: string, sync?: boolean, lookupType?: LookupType, currentFile?: string): Generator<unknown, Template[]>;
+ parseFile(file: string, lookupType?: LookupType): Promise<Template[]>;
+ parseFileSync(file: string, lookupType?: LookupType): Template[];
+ _renderFile(file: string, ctx: Context | object | undefined, renderFileOptions: RenderFileOptions): Generator<any>;
+ renderFile(file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions): Promise<any>;
+ renderFileSync(file: string, ctx?: Context | object, renderFileOptions?: RenderFileOptions): any;
+ renderFileToNodeStream(file: string, scope?: object, renderOptions?: RenderOptions): Promise<NodeJS.ReadableStream>;
+ _evalValue(str: string, scope?: object | Context): IterableIterator<any>;
+ evalValue(str: string, scope?: object | Context): Promise<any>;
+ evalValueSync(str: string, scope?: object | Context): any;
+ registerFilter(name: string, filter: FilterImplOptions): void;
+ registerTag(name: string, tag: TagClass | TagImplOptions): void;
+ plugin(plugin: (this: Liquid, L: typeof Liquid) => void): void;
+ express(): (this: any, filePath: string, ctx: object, callback: (err: Error | null, rendered: string) => void) => void;
+ analyze(template: Template[], options?: StaticAnalysisOptions): Promise<StaticAnalysis>;
+ analyzeSync(template: Template[], options?: StaticAnalysisOptions): StaticAnalysis;
+ parseAndAnalyze(html: string, filename?: string, options?: StaticAnalysisOptions): Promise<StaticAnalysis>;
+ parseAndAnalyzeSync(html: string, filename?: string, options?: StaticAnalysisOptions): StaticAnalysis;
+ /** Return an array of all variables without their properties. */
+ variables(template: string | Template[], options?: StaticAnalysisOptions): Promise<string[]>;
+ /** Return an array of all variables without their properties. */
+ variablesSync(template: string | Template[], options?: StaticAnalysisOptions): string[];
+ /** Return an array of all variables including their properties/paths. */
+ fullVariables(template: string | Template[], options?: StaticAnalysisOptions): Promise<string[]>;
+ /** Return an array of all variables including their properties/paths. */
+ fullVariablesSync(template: string | Template[], options?: StaticAnalysisOptions): string[];
+ /** Return an array of all variables, each as an array of properties/segments. */
+ variableSegments(template: string | Template[], options?: StaticAnalysisOptions): Promise<Array<SegmentArray>>;
+ /** Return an array of all variables, each as an array of properties/segments. */
+ variableSegmentsSync(template: string | Template[], options?: StaticAnalysisOptions): Array<SegmentArray>;
+ /** Return an array of all expected context variables without their properties. */
+ globalVariables(template: string | Template[], options?: StaticAnalysisOptions): Promise<string[]>;
+ /** Return an array of all expected context variables without their properties. */
+ globalVariablesSync(template: string | Template[], options?: StaticAnalysisOptions): string[];
+ /** Return an array of all expected context variables including their properties/paths. */
+ globalFullVariables(template: string | Template[], options?: StaticAnalysisOptions): Promise<string[]>;
+ /** Return an array of all expected context variables including their properties/paths. */
+ globalFullVariablesSync(template: string | Template[], options?: StaticAnalysisOptions): string[];
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ globalVariableSegments(template: string | Template[], options?: StaticAnalysisOptions): Promise<Array<SegmentArray>>;
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ globalVariableSegmentsSync(template: string | Template[], options?: StaticAnalysisOptions): Array<SegmentArray>;
+}
diff --git a/node_modules/liquidjs/dist/liquid.node.js b/node_modules/liquidjs/dist/liquid.node.js new file mode 100644 index 0000000..d7466d1 --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.node.js @@ -0,0 +1,4960 @@ +/* + * liquidjs@10.23.0, https://github.com/harttle/liquidjs + * (c) 2016-2025 harttle + * Released under the MIT License. + */ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var stream = require('stream'); +var path = require('path'); +var fs$1 = require('fs'); + +class Token {
+ constructor(kind, input, begin, end, file) {
+ this.kind = kind;
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ }
+ getText() {
+ return this.input.slice(this.begin, this.end);
+ }
+ getPosition() {
+ let [row, col] = [1, 1];
+ for (let i = 0; i < this.begin; i++) {
+ if (this.input[i] === '\n') {
+ row++;
+ col = 1;
+ }
+ else
+ col++;
+ }
+ return [row, col];
+ }
+ size() {
+ return this.end - this.begin;
+ }
+} + +class Drop {
+ liquidMethodMissing(key, context) {
+ return undefined;
+ }
+} + +const toString$1 = Object.prototype.toString;
+const toLowerCase = String.prototype.toLowerCase;
+const hasOwnProperty = Object.hasOwnProperty;
+function isString(value) {
+ return typeof value === 'string';
+}
+// eslint-disable-next-line @typescript-eslint/ban-types
+function isFunction(value) {
+ return typeof value === 'function';
+}
+function isPromise(val) {
+ return val && isFunction(val.then);
+}
+function isIterator(val) {
+ return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return);
+}
+function escapeRegex(str) {
+ return str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
+}
+function promisify(fn) {
+ return function (...args) {
+ return new Promise((resolve, reject) => {
+ fn(...args, (err, result) => {
+ err ? reject(err) : resolve(result);
+ });
+ });
+ };
+}
+function stringify(value) {
+ value = toValue(value);
+ if (isString(value))
+ return value;
+ if (isNil(value))
+ return '';
+ if (isArray(value))
+ return value.map(x => stringify(x)).join('');
+ return String(value);
+}
+function toEnumerable(val) {
+ val = toValue(val);
+ if (isArray(val))
+ return val;
+ if (isString(val) && val.length > 0)
+ return [val];
+ if (isIterable(val))
+ return Array.from(val);
+ if (isObject(val))
+ return Object.keys(val).map((key) => [key, val[key]]);
+ return [];
+}
+function toArray(val) {
+ val = toValue(val);
+ if (isNil(val))
+ return [];
+ if (isArray(val))
+ return val;
+ return [val];
+}
+function toValue(value) {
+ return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value;
+}
+function toNumber(value) {
+ return +toValue(value) || 0;
+}
+function isNumber(value) {
+ return typeof value === 'number';
+}
+function toLiquid(value) {
+ if (value && isFunction(value.toLiquid))
+ return toLiquid(value.toLiquid());
+ return value;
+}
+function isNil(value) {
+ return value == null;
+}
+function isUndefined(value) {
+ return value === undefined;
+}
+function isArray(value) {
+ // be compatible with IE 8
+ return toString$1.call(value) === '[object Array]';
+}
+function isArrayLike(value) {
+ return value && isNumber(value.length);
+}
+function isIterable(value) {
+ return isObject(value) && Symbol.iterator in value;
+}
+/*
+ * 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(obj, iteratee) {
+ obj = obj || {};
+ for (const k in obj) {
+ if (hasOwnProperty.call(obj, k)) {
+ if (iteratee(obj[k], k, obj) === false)
+ break;
+ }
+ }
+ return obj;
+}
+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) {
+ const type = typeof value;
+ return value !== null && (type === 'object' || type === 'function');
+}
+function range(start, stop, step = 1) {
+ const arr = [];
+ for (let i = start; i < stop; i += step) {
+ arr.push(i);
+ }
+ return arr;
+}
+function padStart(str, length, ch = ' ') {
+ return pad(str, length, ch, (str, ch) => ch + str);
+}
+function padEnd(str, length, ch = ' ') {
+ return pad(str, length, ch, (str, ch) => str + ch);
+}
+function pad(str, length, ch, add) {
+ str = String(str);
+ let n = length - str.length;
+ while (n-- > 0)
+ str = add(str, ch);
+ return str;
+}
+function identify(val) {
+ return val;
+}
+function changeCase(str) {
+ const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z');
+ return hasLowerCase ? str.toUpperCase() : str.toLowerCase();
+}
+function ellipsis(str, N) {
+ return str.length > N ? str.slice(0, N - 3) + '...' : str;
+}
+// compare string in case-insensitive way, undefined values to the tail
+function caseInsensitiveCompare(a, b) {
+ if (a == null && b == null)
+ return 0;
+ if (a == null)
+ return 1;
+ if (b == null)
+ return -1;
+ a = toLowerCase.call(a);
+ b = toLowerCase.call(b);
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+}
+function argumentsToValue(fn) {
+ return function (...args) { return fn.call(this, ...args.map(toValue)); };
+}
+function argumentsToNumber(fn) {
+ return function (...args) { return fn.call(this, ...args.map(toNumber)); };
+}
+function escapeRegExp(text) {
+ return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
+}
+/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */
+function* strictUniq(array) {
+ const seen = new Set();
+ for (const element of array) {
+ const key = JSON.stringify(element);
+ if (!seen.has(key)) {
+ seen.add(key);
+ yield element;
+ }
+ }
+} + +/**
+ * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes
+ */
+const TRAIT = '__liquidClass__';
+class LiquidError extends Error {
+ constructor(err, token) {
+ /**
+ * note: for ES5 targeting, `this` will be replaced by return value of Error(),
+ * thus everything on `this` will be lost, avoid calling `LiquidError` methods here
+ */
+ super(typeof err === 'string' ? err : err.message);
+ this.context = '';
+ if (typeof err !== 'string')
+ Object.defineProperty(this, 'originalError', { value: err, enumerable: false });
+ Object.defineProperty(this, 'token', { value: token, enumerable: false });
+ Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false });
+ }
+ update() {
+ Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false });
+ this.message = mkMessage(this.message, this.token);
+ this.stack = this.message + '\n' + this.context +
+ '\n' + this.stack;
+ if (this.originalError)
+ this.stack += '\nFrom ' + this.originalError.stack;
+ }
+ static is(obj) {
+ return obj?.[TRAIT] === 'LiquidError';
+ }
+}
+class TokenizationError extends LiquidError {
+ constructor(message, token) {
+ super(message, token);
+ this.name = 'TokenizationError';
+ super.update();
+ }
+}
+class ParseError extends LiquidError {
+ constructor(err, token) {
+ super(err, token);
+ this.name = 'ParseError';
+ this.message = err.message;
+ super.update();
+ }
+}
+class RenderError extends LiquidError {
+ constructor(err, tpl) {
+ super(err, tpl.token);
+ this.name = 'RenderError';
+ this.message = err.message;
+ super.update();
+ }
+ static is(obj) {
+ return obj.name === 'RenderError';
+ }
+}
+class LiquidErrors extends LiquidError {
+ constructor(errors) {
+ super(errors[0], errors[0].token);
+ this.errors = errors;
+ this.name = 'LiquidErrors';
+ const s = errors.length > 1 ? 's' : '';
+ this.message = `${errors.length} error${s} found`;
+ super.update();
+ }
+ static is(obj) {
+ return obj.name === 'LiquidErrors';
+ }
+}
+class UndefinedVariableError extends LiquidError {
+ constructor(err, token) {
+ super(err, token);
+ this.name = 'UndefinedVariableError';
+ this.message = err.message;
+ super.update();
+ }
+}
+// only used internally; raised where we don't have token information,
+// so it can't be an UndefinedVariableError.
+class InternalUndefinedVariableError extends Error {
+ constructor(variableName) {
+ super(`undefined variable: ${variableName}`);
+ this.name = 'InternalUndefinedVariableError';
+ this.variableName = variableName;
+ }
+}
+class AssertionError extends Error {
+ constructor(message) {
+ super(message);
+ this.name = 'AssertionError';
+ this.message = message + '';
+ }
+}
+function mkContext(token) {
+ const [line, col] = token.getPosition();
+ const lines = token.input.split('\n');
+ const begin = Math.max(line - 2, 1);
+ const end = Math.min(line + 3, lines.length);
+ const context = range(begin, end + 1)
+ .map(lineNumber => {
+ const rowIndicator = (lineNumber === line) ? '>> ' : ' ';
+ const num = padStart(String(lineNumber), String(end).length);
+ let text = `${rowIndicator}${num}| `;
+ const colIndicator = lineNumber === line
+ ? '\n' + padStart('^', col + text.length)
+ : '';
+ text += lines[lineNumber - 1];
+ text += colIndicator;
+ return text;
+ })
+ .join('\n');
+ return context;
+}
+function mkMessage(msg, token) {
+ if (token.file)
+ msg += `, file:${token.file}`;
+ const [line, col] = token.getPosition();
+ msg += `, line:${line}, col:${col}`;
+ return msg;
+} + +// **DO NOT CHANGE THIS FILE**
+//
+// This file is generated by bin/character-gen.js
+// bitmask character types to boost performance
+const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
+const WORD = 1;
+const BLANK = 4;
+const QUOTE = 8;
+const INLINE_BLANK = 16;
+const NUMBER = 32;
+const SIGN = 64;
+const PUNCTUATION = 128;
+function isWord(char) {
+ const code = char.charCodeAt(0);
+ return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD);
+}
+TYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK;
+TYPES[8220] = TYPES[8221] = PUNCTUATION; + +function assert(predicate, message) {
+ if (!predicate) {
+ const msg = typeof message === 'function'
+ ? message()
+ : (message || `expect ${predicate} to be true`);
+ throw new AssertionError(msg);
+ }
+}
+function assertEmpty(predicate, message = `unexpected ${JSON.stringify(predicate)}`) {
+ assert(!predicate, message);
+} + +class NullDrop extends Drop {
+ equals(value) {
+ return isNil(toValue(value));
+ }
+ gt() {
+ return false;
+ }
+ geq() {
+ return false;
+ }
+ lt() {
+ return false;
+ }
+ leq() {
+ return false;
+ }
+ valueOf() {
+ return null;
+ }
+} + +class EmptyDrop extends Drop {
+ equals(value) {
+ if (value instanceof EmptyDrop)
+ return false;
+ value = toValue(value);
+ if (isString(value) || isArray(value))
+ return value.length === 0;
+ if (isObject(value))
+ return Object.keys(value).length === 0;
+ return false;
+ }
+ gt() {
+ return false;
+ }
+ geq() {
+ return false;
+ }
+ lt() {
+ return false;
+ }
+ leq() {
+ return false;
+ }
+ valueOf() {
+ return '';
+ }
+ static is(value) {
+ return value instanceof EmptyDrop;
+ }
+} + +class BlankDrop extends EmptyDrop {
+ equals(value) {
+ if (value === false)
+ return true;
+ if (isNil(toValue(value)))
+ return true;
+ if (isString(value))
+ return /^\s*$/.test(value);
+ return super.equals(value);
+ }
+ static is(value) {
+ return value instanceof BlankDrop;
+ }
+} + +class ForloopDrop extends Drop {
+ constructor(length, collection, variable) {
+ super();
+ this.i = 0;
+ this.length = length;
+ this.name = `${variable}-${collection}`;
+ }
+ next() {
+ this.i++;
+ }
+ index0() {
+ return this.i;
+ }
+ index() {
+ return this.i + 1;
+ }
+ first() {
+ return this.i === 0;
+ }
+ last() {
+ return this.i === this.length - 1;
+ }
+ rindex() {
+ return this.length - this.i;
+ }
+ rindex0() {
+ return this.length - this.i - 1;
+ }
+ valueOf() {
+ return JSON.stringify(this);
+ }
+} + +class SimpleEmitter {
+ constructor() {
+ this.buffer = '';
+ }
+ write(html) {
+ this.buffer += stringify(html);
+ }
+} + +class StreamedEmitter {
+ constructor() {
+ this.buffer = '';
+ this.stream = new stream.PassThrough();
+ }
+ write(html) {
+ this.stream.write(stringify(html));
+ }
+ error(err) {
+ this.stream.emit('error', err);
+ }
+ end() {
+ this.stream.end();
+ }
+} + +class KeepingTypeEmitter {
+ constructor() {
+ this.buffer = '';
+ }
+ write(html) {
+ html = toValue(html);
+ // This will only preserve the type if the value is isolated.
+ // I.E:
+ // {{ my-port }} -> 42
+ // {{ my-host }}:{{ my-port }} -> 'host:42'
+ if (typeof html !== 'string' && this.buffer === '') {
+ this.buffer = html;
+ }
+ else {
+ this.buffer = stringify(this.buffer) + stringify(html);
+ }
+ }
+} + +class BlockDrop extends Drop {
+ constructor(
+ // the block render from layout template
+ superBlockRender = () => '') {
+ super();
+ this.superBlockRender = superBlockRender;
+ }
+ /**
+ * Provide parent access in child block by
+ * {{ block.super }}
+ */
+ *super() {
+ const emitter = new SimpleEmitter();
+ yield this.superBlockRender(emitter);
+ return emitter.buffer;
+ }
+} + +function isComparable(arg) {
+ return (arg &&
+ isFunction(arg.equals) &&
+ isFunction(arg.gt) &&
+ isFunction(arg.geq) &&
+ isFunction(arg.lt) &&
+ isFunction(arg.leq));
+} + +const nil = new NullDrop();
+const literalValues = {
+ 'true': true,
+ 'false': false,
+ 'nil': nil,
+ 'null': nil,
+ 'empty': new EmptyDrop(),
+ 'blank': new BlankDrop()
+}; + +function createTrie(input) {
+ const trie = {};
+ for (const [name, data] of Object.entries(input)) {
+ let node = trie;
+ for (let i = 0; i < name.length; i++) {
+ const c = name[i];
+ node[c] = node[c] || {};
+ if (i === name.length - 1 && isWord(name[i])) {
+ node[c].needBoundary = true;
+ }
+ node = node[c];
+ }
+ node.data = data;
+ node.end = true;
+ }
+ return trie;
+} + +// convert an async iterator to a Promise
+async function toPromise(val) {
+ if (!isIterator(val))
+ return val;
+ let value;
+ let done = false;
+ let next = 'next';
+ do {
+ const state = val[next](value);
+ done = state.done;
+ value = state.value;
+ next = 'next';
+ try {
+ if (isIterator(value))
+ value = toPromise(value);
+ if (isPromise(value))
+ value = await value;
+ }
+ catch (err) {
+ next = 'throw';
+ value = err;
+ }
+ } while (!done);
+ return value;
+}
+// convert an async iterator to a value in a synchronous manner
+function toValueSync(val) {
+ if (!isIterator(val))
+ return val;
+ let value;
+ let done = false;
+ let next = 'next';
+ do {
+ const state = val[next](value);
+ done = state.done;
+ value = state.value;
+ next = 'next';
+ if (isIterator(value)) {
+ try {
+ value = toValueSync(value);
+ }
+ catch (err) {
+ next = 'throw';
+ value = err;
+ }
+ }
+ } while (!done);
+ return value;
+} + +const rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/;
+// prototype extensions
+function daysInMonth(d) {
+ const feb = isLeapYear(d) ? 29 : 28;
+ return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+}
+function getDayOfYear(d) {
+ let num = 0;
+ for (let i = 0; i < d.getMonth(); ++i) {
+ num += daysInMonth(d)[i];
+ }
+ return num + d.getDate();
+}
+function getWeekOfYear(d, startDay) {
+ // Skip to startDay of this week
+ const now = getDayOfYear(d) + (startDay - d.getDay());
+ // Find the first startDay of the year
+ const jan1 = new Date(d.getFullYear(), 0, 1);
+ const then = (7 - jan1.getDay() + startDay);
+ return String(Math.floor((now - then) / 7) + 1);
+}
+function isLeapYear(d) {
+ const year = d.getFullYear();
+ return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)));
+}
+function ordinal(d) {
+ const date = d.getDate();
+ if ([11, 12, 13].includes(date))
+ return 'th';
+ switch (date % 10) {
+ case 1: return 'st';
+ case 2: return 'nd';
+ case 3: return 'rd';
+ default: return 'th';
+ }
+}
+function century(d) {
+ return parseInt(d.getFullYear().toString().substring(0, 2), 10);
+}
+// default to 0
+const padWidths = {
+ d: 2,
+ e: 2,
+ H: 2,
+ I: 2,
+ j: 3,
+ k: 2,
+ l: 2,
+ L: 3,
+ m: 2,
+ M: 2,
+ S: 2,
+ U: 2,
+ W: 2
+};
+const padSpaceChars = new Set('aAbBceklpP');
+function getTimezoneOffset(d, opts) {
+ const nOffset = Math.abs(d.getTimezoneOffset());
+ const h = Math.floor(nOffset / 60);
+ const m = nOffset % 60;
+ return (d.getTimezoneOffset() > 0 ? '-' : '+') +
+ padStart(h, 2, '0') +
+ (opts.flags[':'] ? ':' : '') +
+ padStart(m, 2, '0');
+}
+const formatCodes = {
+ a: (d) => d.getShortWeekdayName(),
+ A: (d) => d.getLongWeekdayName(),
+ b: (d) => d.getShortMonthName(),
+ B: (d) => d.getLongMonthName(),
+ c: (d) => d.toLocaleString(),
+ C: (d) => century(d),
+ d: (d) => d.getDate(),
+ e: (d) => d.getDate(),
+ H: (d) => d.getHours(),
+ I: (d) => String(d.getHours() % 12 || 12),
+ j: (d) => getDayOfYear(d),
+ k: (d) => d.getHours(),
+ l: (d) => String(d.getHours() % 12 || 12),
+ L: (d) => d.getMilliseconds(),
+ m: (d) => d.getMonth() + 1,
+ M: (d) => d.getMinutes(),
+ N: (d, opts) => {
+ const width = Number(opts.width) || 9;
+ const str = String(d.getMilliseconds()).slice(0, width);
+ return padEnd(str, width, '0');
+ },
+ p: (d) => (d.getHours() < 12 ? 'AM' : 'PM'),
+ P: (d) => (d.getHours() < 12 ? 'am' : 'pm'),
+ q: (d) => ordinal(d),
+ s: (d) => Math.round(d.getTime() / 1000),
+ S: (d) => d.getSeconds(),
+ u: (d) => d.getDay() || 7,
+ U: (d) => getWeekOfYear(d, 0),
+ w: (d) => d.getDay(),
+ W: (d) => getWeekOfYear(d, 1),
+ x: (d) => d.toLocaleDateString(),
+ X: (d) => d.toLocaleTimeString(),
+ y: (d) => d.getFullYear().toString().slice(2, 4),
+ Y: (d) => d.getFullYear(),
+ z: getTimezoneOffset,
+ Z: (d, opts) => d.getTimeZoneName() || getTimezoneOffset(d, opts),
+ 't': () => '\t',
+ 'n': () => '\n',
+ '%': () => '%'
+};
+formatCodes.h = formatCodes.b;
+function strftime(d, formatStr) {
+ let output = '';
+ let remaining = formatStr;
+ let match;
+ while ((match = rFormat.exec(remaining))) {
+ output += remaining.slice(0, match.index);
+ remaining = remaining.slice(match.index + match[0].length);
+ output += format(d, match);
+ }
+ return output + remaining;
+}
+function format(d, match) {
+ const [input, flagStr = '', width, modifier, conversion] = match;
+ const convert = formatCodes[conversion];
+ if (!convert)
+ return input;
+ const flags = {};
+ for (const flag of flagStr)
+ flags[flag] = true;
+ let ret = String(convert(d, { flags, width, modifier }));
+ let padChar = padSpaceChars.has(conversion) ? ' ' : '0';
+ let padWidth = width || padWidths[conversion] || 0;
+ if (flags['^'])
+ ret = ret.toUpperCase();
+ else if (flags['#'])
+ ret = changeCase(ret);
+ if (flags['_'])
+ padChar = ' ';
+ else if (flags['0'])
+ padChar = '0';
+ if (flags['-'])
+ padWidth = 0;
+ return padStart(ret, padWidth, padChar);
+} + +function getDateTimeFormat() {
+ return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined);
+} + +// one minute in milliseconds
+const OneMinute = 60000;
+/**
+ * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS
+ * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3
+ */
+const TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/;
+const monthNames = [
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
+ 'September', 'October', 'November', 'December'
+];
+const monthNamesShort = monthNames.map(name => name.slice(0, 3));
+const dayNames = [
+ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
+];
+const dayNamesShort = dayNames.map(name => name.slice(0, 3));
+/**
+ * A date implementation with timezone info, just like Ruby date
+ *
+ * Implementation:
+ * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods
+ * - rewrite getTimezoneOffset() to trick strftime
+ */
+class LiquidDate {
+ constructor(init, locale, timezone) {
+ this.locale = locale;
+ this.DateTimeFormat = getDateTimeFormat();
+ this.date = new Date(init);
+ this.timezoneFixed = timezone !== undefined;
+ if (timezone === undefined) {
+ timezone = this.date.getTimezoneOffset();
+ }
+ this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone;
+ this.timezoneName = isString(timezone) ? timezone : '';
+ const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute;
+ const time = this.date.getTime() + diff;
+ this.displayDate = new Date(time);
+ }
+ getTime() {
+ return this.displayDate.getTime();
+ }
+ getMilliseconds() {
+ return this.displayDate.getMilliseconds();
+ }
+ getSeconds() {
+ return this.displayDate.getSeconds();
+ }
+ getMinutes() {
+ return this.displayDate.getMinutes();
+ }
+ getHours() {
+ return this.displayDate.getHours();
+ }
+ getDay() {
+ return this.displayDate.getDay();
+ }
+ getDate() {
+ return this.displayDate.getDate();
+ }
+ getMonth() {
+ return this.displayDate.getMonth();
+ }
+ getFullYear() {
+ return this.displayDate.getFullYear();
+ }
+ toLocaleString(locale, init) {
+ if (init?.timeZone) {
+ return this.date.toLocaleString(locale, init);
+ }
+ return this.displayDate.toLocaleString(locale, init);
+ }
+ toLocaleTimeString(locale) {
+ return this.displayDate.toLocaleTimeString(locale);
+ }
+ toLocaleDateString(locale) {
+ return this.displayDate.toLocaleDateString(locale);
+ }
+ getTimezoneOffset() {
+ return this.timezoneOffset;
+ }
+ getTimeZoneName() {
+ if (this.timezoneFixed)
+ return this.timezoneName;
+ if (!this.DateTimeFormat)
+ return;
+ return this.DateTimeFormat().resolvedOptions().timeZone;
+ }
+ getLongMonthName() {
+ return this.format({ month: 'long' }) ?? monthNames[this.getMonth()];
+ }
+ getShortMonthName() {
+ return this.format({ month: 'short' }) ?? monthNamesShort[this.getMonth()];
+ }
+ getLongWeekdayName() {
+ return this.format({ weekday: 'long' }) ?? dayNames[this.displayDate.getDay()];
+ }
+ getShortWeekdayName() {
+ return this.format({ weekday: 'short' }) ?? dayNamesShort[this.displayDate.getDay()];
+ }
+ valid() {
+ return !isNaN(this.getTime());
+ }
+ format(options) {
+ return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate);
+ }
+ /**
+ * Create a Date object fixed to it's declared Timezone. Both
+ * - 2021-08-06T02:29:00.000Z and
+ * - 2021-08-06T02:29:00.000+08:00
+ * will always be displayed as
+ * - 2021-08-06 02:29:00
+ * regardless timezoneOffset in JavaScript realm
+ *
+ * The implementation hack:
+ * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,
+ * we create a different Date to trick strftime, it's both simpler and more performant.
+ * Given that a template is expected to be parsed fewer times than rendered.
+ */
+ static createDateFixedToTimezone(dateString, locale) {
+ const m = dateString.match(TIMEZONE_PATTERN);
+ // representing a UTC timestamp
+ if (m && m[1] === 'Z') {
+ return new LiquidDate(+new Date(dateString), locale, 0);
+ }
+ // has a timezone specified
+ if (m && m[2] && m[3] && m[4]) {
+ const [, , sign, hours, minutes] = m;
+ const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10));
+ return new LiquidDate(+new Date(dateString), locale, offset);
+ }
+ return new LiquidDate(dateString, locale);
+ }
+ static getTimezoneOffset(timezoneName, date) {
+ const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName });
+ const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' });
+ const localDate = new Date(localDateString);
+ const utcDate = new Date(utcDateString);
+ return (+utcDate - +localDate) / (60 * 1000);
+ }
+} + +class Limiter {
+ constructor(resource, limit) {
+ this.base = 0;
+ this.message = `${resource} limit exceeded`;
+ this.limit = limit;
+ }
+ use(count) {
+ count = +count || 0;
+ assert(this.base + count <= this.limit, this.message);
+ this.base += count;
+ }
+ check(count) {
+ count = +count || 0;
+ assert(count <= this.limit, this.message);
+ }
+} + +class DelimitedToken extends Token {
+ constructor(kind, [contentBegin, contentEnd], input, begin, end, trimLeft, trimRight, file) {
+ super(kind, input, begin, end, file);
+ this.trimLeft = false;
+ this.trimRight = false;
+ const tl = input[contentBegin] === '-';
+ const tr = input[contentEnd - 1] === '-';
+ let l = tl ? contentBegin + 1 : contentBegin;
+ let r = tr ? contentEnd - 1 : contentEnd;
+ while (l < r && (TYPES[input.charCodeAt(l)] & BLANK))
+ l++;
+ while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK))
+ r--;
+ this.contentRange = [l, r];
+ this.trimLeft = tl || trimLeft;
+ this.trimRight = tr || trimRight;
+ }
+ get content() {
+ return this.input.slice(this.contentRange[0], this.contentRange[1]);
+ }
+} + +class TagToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options;
+ const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length];
+ super(exports.TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file);
+ this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange);
+ this.name = this.tokenizer.readTagName();
+ this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`);
+ this.tokenizer.skipBlank();
+ this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]);
+ }
+} + +class OutputToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options;
+ const valueRange = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length];
+ super(exports.TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file);
+ }
+} + +class HTMLToken extends Token {
+ constructor(input, begin, end, file) {
+ super(exports.TokenKind.HTML, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.trimLeft = 0;
+ this.trimRight = 0;
+ }
+ getContent() {
+ return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight);
+ }
+} + +class NumberToken extends Token {
+ constructor(input, begin, end, file) {
+ super(exports.TokenKind.Number, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = Number(this.getText());
+ }
+} + +class IdentifierToken extends Token {
+ constructor(input, begin, end, file) {
+ super(exports.TokenKind.Word, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = this.getText();
+ }
+} + +class LiteralToken extends Token {
+ constructor(input, begin, end, file) {
+ super(exports.TokenKind.Literal, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.literal = this.getText();
+ this.content = literalValues[this.literal];
+ }
+} + +const operatorPrecedences = {
+ '==': 2,
+ '!=': 2,
+ '>': 2,
+ '<': 2,
+ '>=': 2,
+ '<=': 2,
+ 'contains': 2,
+ 'not': 1,
+ 'and': 0,
+ 'or': 0
+};
+const operatorTypes = {
+ '==': 0 /* OperatorType.Binary */,
+ '!=': 0 /* OperatorType.Binary */,
+ '>': 0 /* OperatorType.Binary */,
+ '<': 0 /* OperatorType.Binary */,
+ '>=': 0 /* OperatorType.Binary */,
+ '<=': 0 /* OperatorType.Binary */,
+ 'contains': 0 /* OperatorType.Binary */,
+ 'not': 1 /* OperatorType.Unary */,
+ 'and': 0 /* OperatorType.Binary */,
+ 'or': 0 /* OperatorType.Binary */
+};
+class OperatorToken extends Token {
+ constructor(input, begin, end, file) {
+ super(exports.TokenKind.Operator, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.operator = this.getText();
+ }
+ getPrecedence() {
+ const key = this.getText();
+ return key in operatorPrecedences ? operatorPrecedences[key] : 1;
+ }
+} + +class PropertyAccessToken extends Token {
+ constructor(variable, props, input, begin, end, file) {
+ super(exports.TokenKind.PropertyAccess, input, begin, end, file);
+ this.variable = variable;
+ this.props = props;
+ }
+} + +class FilterToken extends Token {
+ constructor(name, args, input, begin, end, file) {
+ super(exports.TokenKind.Filter, input, begin, end, file);
+ this.name = name;
+ this.args = args;
+ }
+} + +class HashToken extends Token {
+ constructor(input, begin, end, name, value, file) {
+ super(exports.TokenKind.Hash, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.name = name;
+ this.value = value;
+ this.file = file;
+ }
+} + +const rHex = /[\da-fA-F]/;
+const rOct = /[0-7]/;
+const escapeChar = {
+ b: '\b',
+ f: '\f',
+ n: '\n',
+ r: '\r',
+ t: '\t',
+ v: '\x0B'
+};
+function hexVal(c) {
+ const code = c.charCodeAt(0);
+ if (code >= 97)
+ return code - 87;
+ if (code >= 65)
+ return code - 55;
+ return code - 48;
+}
+function parseStringLiteral(str) {
+ let ret = '';
+ for (let i = 1; i < str.length - 1; i++) {
+ if (str[i] !== '\\') {
+ ret += str[i];
+ continue;
+ }
+ if (escapeChar[str[i + 1]] !== undefined) {
+ ret += escapeChar[str[++i]];
+ }
+ else if (str[i + 1] === 'u') {
+ let val = 0;
+ let j = i + 2;
+ while (j <= i + 5 && rHex.test(str[j])) {
+ val = val * 16 + hexVal(str[j++]);
+ }
+ i = j - 1;
+ ret += String.fromCharCode(val);
+ }
+ else if (!rOct.test(str[i + 1])) {
+ ret += str[++i];
+ }
+ else {
+ let j = i + 1;
+ let val = 0;
+ while (j <= i + 3 && rOct.test(str[j])) {
+ val = val * 8 + hexVal(str[j++]);
+ }
+ i = j - 1;
+ ret += String.fromCharCode(val);
+ }
+ }
+ return ret;
+} + +class QuotedToken extends Token {
+ constructor(input, begin, end, file) {
+ super(exports.TokenKind.Quoted, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = parseStringLiteral(this.getText());
+ }
+} + +class RangeToken extends Token {
+ constructor(input, begin, end, lhs, rhs, file) {
+ super(exports.TokenKind.Range, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.lhs = lhs;
+ this.rhs = rhs;
+ this.file = file;
+ }
+} + +/**
+ * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`
+ */
+class LiquidTagToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ super(exports.TokenKind.Tag, [begin, end], input, begin, end, false, false, file);
+ this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange);
+ this.name = this.tokenizer.readTagName();
+ this.tokenizer.assert(this.name, 'illegal liquid tag syntax');
+ this.tokenizer.skipBlank();
+ }
+ get args() {
+ return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]);
+ }
+} + +/**
+ * value expression with optional filters
+ * e.g.
+ * {% assign foo="bar" | append: "coo" %}
+ */
+class FilteredValueToken extends Token {
+ constructor(initial, filters, input, begin, end, file) {
+ super(exports.TokenKind.FilteredValue, input, begin, end, file);
+ this.initial = initial;
+ this.filters = filters;
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ }
+} + +const polyfill = {
+ now: () => Date.now()
+};
+function getPerformance() {
+ return (typeof global === 'object' && global.performance) ||
+ (typeof window === 'object' && window.performance) ||
+ polyfill;
+} + +class Render {
+ renderTemplatesToNodeStream(templates, ctx) {
+ const emitter = new StreamedEmitter();
+ Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter)))
+ .then(() => emitter.end(), err => emitter.error(err));
+ return emitter.stream;
+ }
+ *renderTemplates(templates, ctx, emitter) {
+ if (!emitter) {
+ emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter();
+ }
+ const errors = [];
+ for (const tpl of templates) {
+ ctx.renderLimit.check(getPerformance().now());
+ try {
+ // if tpl.render supports emitter, it'll return empty `html`
+ const html = yield tpl.render(ctx, emitter);
+ // if not, it'll return an `html`, write to the emitter for it
+ html && emitter.write(html);
+ if (ctx.breakCalled || ctx.continueCalled)
+ break;
+ }
+ catch (e) {
+ const err = LiquidError.is(e) ? e : new RenderError(e, tpl);
+ if (ctx.opts.catchAllErrors)
+ errors.push(err);
+ else
+ throw err;
+ }
+ }
+ if (errors.length) {
+ throw new LiquidErrors(errors);
+ }
+ return emitter.buffer;
+ }
+} + +class Expression {
+ constructor(tokens) {
+ this.postfix = [...toPostfix(tokens)];
+ }
+ *evaluate(ctx, lenient) {
+ assert(ctx, 'unable to evaluate: context not defined');
+ const operands = [];
+ for (const token of this.postfix) {
+ if (isOperatorToken(token)) {
+ const r = operands.pop();
+ let result;
+ if (operatorTypes[token.operator] === 1 /* OperatorType.Unary */) {
+ result = yield ctx.opts.operators[token.operator](r, ctx);
+ }
+ else {
+ const l = operands.pop();
+ result = yield ctx.opts.operators[token.operator](l, r, ctx);
+ }
+ operands.push(result);
+ }
+ else {
+ operands.push(yield evalToken(token, ctx, lenient));
+ }
+ }
+ return operands[0];
+ }
+ valid() {
+ return !!this.postfix.length;
+ }
+}
+function* evalToken(token, ctx, lenient = false) {
+ if (!token)
+ return;
+ if ('content' in token)
+ return token.content;
+ if (isPropertyAccessToken(token))
+ return yield evalPropertyAccessToken(token, ctx, lenient);
+ if (isRangeToken(token))
+ return yield evalRangeToken(token, ctx);
+}
+function* evalPropertyAccessToken(token, ctx, lenient) {
+ const props = [];
+ for (const prop of token.props) {
+ props.push((yield evalToken(prop, ctx, false)));
+ }
+ try {
+ if (token.variable) {
+ const variable = yield evalToken(token.variable, ctx, lenient);
+ return yield ctx._getFromScope(variable, props);
+ }
+ else {
+ return yield ctx._get(props);
+ }
+ }
+ catch (e) {
+ if (lenient && e.name === 'InternalUndefinedVariableError')
+ return null;
+ throw (new UndefinedVariableError(e, token));
+ }
+}
+function evalQuotedToken(token) {
+ return token.content;
+}
+function* evalRangeToken(token, ctx) {
+ const low = yield evalToken(token.lhs, ctx);
+ const high = yield evalToken(token.rhs, ctx);
+ ctx.memoryLimit.use(high - low + 1);
+ return range(+low, +high + 1);
+}
+function* toPostfix(tokens) {
+ const ops = [];
+ for (const token of tokens) {
+ if (isOperatorToken(token)) {
+ while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {
+ yield ops.pop();
+ }
+ ops.push(token);
+ }
+ else
+ yield token;
+ }
+ while (ops.length) {
+ yield ops.pop();
+ }
+} + +function isTruthy(val, ctx) {
+ return !isFalsy(val, ctx);
+}
+function isFalsy(val, ctx) {
+ val = toValue(val);
+ if (ctx.opts.jsTruthy) {
+ return !val;
+ }
+ else {
+ return val === false || undefined === val || val === null;
+ }
+} + +const defaultOperators = {
+ '==': equals,
+ '!=': (l, r) => !equals(l, r),
+ '>': (l, r) => {
+ if (isComparable(l))
+ return l.gt(r);
+ if (isComparable(r))
+ return r.lt(l);
+ return toValue(l) > toValue(r);
+ },
+ '<': (l, r) => {
+ if (isComparable(l))
+ return l.lt(r);
+ if (isComparable(r))
+ return r.gt(l);
+ return toValue(l) < toValue(r);
+ },
+ '>=': (l, r) => {
+ if (isComparable(l))
+ return l.geq(r);
+ if (isComparable(r))
+ return r.leq(l);
+ return toValue(l) >= toValue(r);
+ },
+ '<=': (l, r) => {
+ if (isComparable(l))
+ return l.leq(r);
+ if (isComparable(r))
+ return r.geq(l);
+ return toValue(l) <= toValue(r);
+ },
+ 'contains': (l, r) => {
+ l = toValue(l);
+ if (isArray(l))
+ return l.some((i) => equals(i, r));
+ if (isFunction(l?.indexOf))
+ return l.indexOf(toValue(r)) > -1;
+ return false;
+ },
+ 'not': (v, ctx) => isFalsy(toValue(v), ctx),
+ 'and': (l, r, ctx) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx),
+ 'or': (l, r, ctx) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx)
+};
+function equals(lhs, rhs) {
+ if (isComparable(lhs))
+ return lhs.equals(rhs);
+ if (isComparable(rhs))
+ return rhs.equals(lhs);
+ lhs = toValue(lhs);
+ rhs = toValue(rhs);
+ if (isArray(lhs)) {
+ return isArray(rhs) && arrayEquals(lhs, rhs);
+ }
+ return lhs === rhs;
+}
+function arrayEquals(lhs, rhs) {
+ if (lhs.length !== rhs.length)
+ return false;
+ return !lhs.some((value, i) => !equals(value, rhs[i]));
+}
+function arrayIncludes(arr, item) {
+ return arr.some(value => equals(value, item));
+} + +class Node {
+ constructor(key, value, next, prev) {
+ this.key = key;
+ this.value = value;
+ this.next = next;
+ this.prev = prev;
+ }
+}
+class LRU {
+ constructor(limit, size = 0) {
+ this.limit = limit;
+ this.size = size;
+ this.cache = {};
+ this.head = new Node('HEAD', null, null, null);
+ this.tail = new Node('TAIL', null, null, null);
+ this.head.next = this.tail;
+ this.tail.prev = this.head;
+ }
+ write(key, value) {
+ if (this.cache[key]) {
+ this.cache[key].value = value;
+ }
+ else {
+ const node = new Node(key, value, this.head.next, this.head);
+ this.head.next.prev = node;
+ this.head.next = node;
+ this.cache[key] = node;
+ this.size++;
+ this.ensureLimit();
+ }
+ }
+ read(key) {
+ if (!this.cache[key])
+ return;
+ const { value } = this.cache[key];
+ this.remove(key);
+ this.write(key, value);
+ return value;
+ }
+ remove(key) {
+ const node = this.cache[key];
+ node.prev.next = node.next;
+ node.next.prev = node.prev;
+ delete this.cache[key];
+ this.size--;
+ }
+ clear() {
+ this.head.next = this.tail;
+ this.tail.prev = this.head;
+ this.size = 0;
+ this.cache = {};
+ }
+ ensureLimit() {
+ if (this.size > this.limit)
+ this.remove(this.tail.prev.key);
+ }
+} + +const requireResolve = (partial) => require.resolve(partial, { paths: ['.'] }); + +const statAsync = promisify(fs$1.stat);
+const readFileAsync = promisify(fs$1.readFile);
+async function exists(filepath) {
+ try {
+ await statAsync(filepath);
+ return true;
+ }
+ catch (err) {
+ return false;
+ }
+}
+function readFile(filepath) {
+ return readFileAsync(filepath, 'utf8');
+}
+function existsSync(filepath) {
+ try {
+ fs$1.statSync(filepath);
+ return true;
+ }
+ catch (err) {
+ return false;
+ }
+}
+function readFileSync(filepath) {
+ return fs$1.readFileSync(filepath, 'utf8');
+}
+function resolve(root, file, ext) {
+ if (!path.extname(file))
+ file += ext;
+ return path.resolve(root, file);
+}
+function fallback(file) {
+ try {
+ return requireResolve(file);
+ }
+ catch (e) { }
+}
+function dirname(filepath) {
+ return path.dirname(filepath);
+}
+function contains(root, file) {
+ root = path.resolve(root);
+ root = root.endsWith(path.sep) ? root : root + path.sep;
+ return file.startsWith(root);
+} + +var fs = /*#__PURE__*/Object.freeze({ + __proto__: null, + exists: exists, + readFile: readFile, + existsSync: existsSync, + readFileSync: readFileSync, + resolve: resolve, + fallback: fallback, + dirname: dirname, + contains: contains, + sep: path.sep +}); + +function defaultFilter(value, defaultValue, ...args) {
+ value = toValue(value);
+ if (isArray(value) || isString(value))
+ return value.length ? value : defaultValue;
+ if (value === false && (new Map(args)).get('allow_false'))
+ return false;
+ return isFalsy(value, this.context) ? defaultValue : value;
+}
+function json(value, space = 0) {
+ return JSON.stringify(value, null, space);
+}
+function inspect(value, space = 0) {
+ const ancestors = [];
+ return JSON.stringify(value, function (_key, value) {
+ if (typeof value !== 'object' || value === null)
+ return value;
+ // `this` is the object that value is contained in, i.e., its direct parent.
+ while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this)
+ ancestors.pop();
+ if (ancestors.includes(value))
+ return '[Circular]';
+ ancestors.push(value);
+ return value;
+ }, space);
+}
+function to_integer(value) {
+ return Number(value);
+}
+const raw = {
+ raw: true,
+ handler: identify
+};
+var misc = {
+ default: defaultFilter,
+ raw,
+ jsonify: json,
+ to_integer,
+ json,
+ inspect
+}; + +const escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": '''
+};
+const unescapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ ''': "'"
+};
+function escape(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/&|<|>|"|'/g, m => escapeMap[m]);
+}
+function xml_escape(str) {
+ return escape.call(this, str);
+}
+function unescape(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]);
+}
+function escape_once(str) {
+ return escape.call(this, unescape.call(this, str));
+}
+function newline_to_br(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\r?\n/gm, '<br />\n');
+}
+function strip_html(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/<script[\s\S]*?<\/script>|<style[\s\S]*?<\/style>|<.*?>|<!--[\s\S]*?-->/g, '');
+} + +var htmlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + escape: escape, + xml_escape: xml_escape, + escape_once: escape_once, + newline_to_br: newline_to_br, + strip_html: strip_html +}); + +class MapFS {
+ constructor(mapping) {
+ this.mapping = mapping;
+ this.sep = '/';
+ }
+ async exists(filepath) {
+ return this.existsSync(filepath);
+ }
+ existsSync(filepath) {
+ return !isNil(this.mapping[filepath]);
+ }
+ async readFile(filepath) {
+ return this.readFileSync(filepath);
+ }
+ readFileSync(filepath) {
+ const content = this.mapping[filepath];
+ if (isNil(content))
+ throw new Error(`ENOENT: ${filepath}`);
+ return content;
+ }
+ dirname(filepath) {
+ const segments = filepath.split(this.sep);
+ segments.pop();
+ return segments.join(this.sep);
+ }
+ resolve(dir, file, ext) {
+ file += ext;
+ if (dir === '.')
+ return file;
+ const segments = dir.split(/\/+/);
+ for (const segment of file.split(this.sep)) {
+ if (segment === '.' || segment === '')
+ continue;
+ else if (segment === '..') {
+ if (segments.length > 1 || segments[0] !== '')
+ segments.pop();
+ }
+ else
+ segments.push(segment);
+ }
+ return segments.join(this.sep);
+ }
+} + +const defaultOptions = {
+ root: ['.'],
+ layouts: ['.'],
+ partials: ['.'],
+ relativeReference: true,
+ jekyllInclude: false,
+ keyValueSeparator: ':',
+ cache: undefined,
+ extname: '',
+ fs: fs,
+ dynamicPartials: true,
+ jsTruthy: false,
+ dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',
+ locale: '',
+ trimTagRight: false,
+ trimTagLeft: false,
+ trimOutputRight: false,
+ trimOutputLeft: false,
+ greedy: true,
+ tagDelimiterLeft: '{%',
+ tagDelimiterRight: '%}',
+ outputDelimiterLeft: '{{',
+ outputDelimiterRight: '}}',
+ preserveTimezones: false,
+ strictFilters: false,
+ strictVariables: false,
+ ownPropertyOnly: true,
+ lenientIf: false,
+ globals: {},
+ keepOutputType: false,
+ operators: defaultOperators,
+ memoryLimit: Infinity,
+ parseLimit: Infinity,
+ renderLimit: Infinity
+};
+function normalize(options) {
+ if (options.hasOwnProperty('root')) {
+ if (!options.hasOwnProperty('partials'))
+ options.partials = options.root;
+ if (!options.hasOwnProperty('layouts'))
+ options.layouts = options.root;
+ }
+ if (options.hasOwnProperty('cache')) {
+ let cache;
+ if (typeof options.cache === 'number')
+ cache = options.cache > 0 ? new LRU(options.cache) : undefined;
+ else if (typeof options.cache === 'object')
+ cache = options.cache;
+ else
+ cache = options.cache ? new LRU(1024) : undefined;
+ options.cache = cache;
+ }
+ options = { ...defaultOptions, ...(options.jekyllInclude ? { dynamicPartials: false } : {}), ...options };
+ if ((!options.fs.dirname || !options.fs.sep) && options.relativeReference) {
+ console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning');
+ options.relativeReference = false;
+ }
+ options.root = normalizeDirectoryList(options.root);
+ options.partials = normalizeDirectoryList(options.partials);
+ options.layouts = normalizeDirectoryList(options.layouts);
+ options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape);
+ if (!options.locale) {
+ options.locale = getDateTimeFormat()?.().resolvedOptions().locale ?? 'en-US';
+ }
+ if (options.templates) {
+ options.fs = new MapFS(options.templates);
+ options.relativeReference = true;
+ options.root = options.partials = options.layouts = '.';
+ }
+ return options;
+}
+function getOutputEscapeFunction(nameOrFunction) {
+ if (nameOrFunction === 'escape')
+ return escape;
+ if (nameOrFunction === 'json')
+ return misc.json;
+ assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function');
+ return nameOrFunction;
+}
+function normalizeDirectoryList(value) {
+ let list = [];
+ if (isArray(value))
+ list = value;
+ if (isString(value))
+ list = [value];
+ return list;
+} + +function whiteSpaceCtrl(tokens, options) {
+ let inRaw = false;
+ for (let i = 0; i < tokens.length; i++) {
+ const token = tokens[i];
+ if (!isDelimitedToken(token))
+ continue;
+ if (!inRaw && token.trimLeft) {
+ trimLeft(tokens[i - 1], options.greedy);
+ }
+ if (isTagToken(token)) {
+ if (token.name === 'raw')
+ inRaw = true;
+ else if (token.name === 'endraw')
+ inRaw = false;
+ }
+ if (!inRaw && token.trimRight) {
+ trimRight(tokens[i + 1], options.greedy);
+ }
+ }
+}
+function trimLeft(token, greedy) {
+ if (!token || !isHTMLToken(token))
+ return;
+ const mask = greedy ? BLANK : INLINE_BLANK;
+ while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask)
+ token.trimRight++;
+}
+function trimRight(token, greedy) {
+ if (!token || !isHTMLToken(token))
+ return;
+ const mask = greedy ? BLANK : INLINE_BLANK;
+ while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask)
+ token.trimLeft++;
+ if (token.input.charAt(token.begin + token.trimLeft) === '\n')
+ token.trimLeft++;
+} + +class Tokenizer {
+ constructor(input, operators = defaultOptions.operators, file, range) {
+ this.input = input;
+ this.file = file;
+ this.rawBeginAt = -1;
+ this.p = range ? range[0] : 0;
+ this.N = range ? range[1] : input.length;
+ this.opTrie = createTrie(operators);
+ this.literalTrie = createTrie(literalValues);
+ }
+ readExpression() {
+ return new Expression(this.readExpressionTokens());
+ }
+ *readExpressionTokens() {
+ while (this.p < this.N) {
+ const operator = this.readOperator();
+ if (operator) {
+ yield operator;
+ continue;
+ }
+ const operand = this.readValue();
+ if (operand) {
+ yield operand;
+ continue;
+ }
+ return;
+ }
+ }
+ readOperator() {
+ this.skipBlank();
+ const end = this.matchTrie(this.opTrie);
+ if (end === -1)
+ return;
+ return new OperatorToken(this.input, this.p, (this.p = end), this.file);
+ }
+ matchTrie(trie) {
+ let node = trie;
+ let i = this.p;
+ let info;
+ while (node[this.input[i]] && i < this.N) {
+ node = node[this.input[i++]];
+ if (node['end'])
+ info = node;
+ }
+ if (!info)
+ return -1;
+ if (info['needBoundary'] && isWord(this.peek(i - this.p)))
+ return -1;
+ return i;
+ }
+ readFilteredValue() {
+ const begin = this.p;
+ const initial = this.readExpression();
+ this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`);
+ const filters = this.readFilters();
+ return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file);
+ }
+ readFilters() {
+ const filters = [];
+ while (true) {
+ const filter = this.readFilter();
+ if (!filter)
+ return filters;
+ filters.push(filter);
+ }
+ }
+ readFilter() {
+ this.skipBlank();
+ if (this.end())
+ return null;
+ this.assert(this.read() === '|', `expected "|" before filter`);
+ const name = this.readIdentifier();
+ if (!name.size()) {
+ this.assert(this.end(), `expected filter name`);
+ return null;
+ }
+ const args = [];
+ this.skipBlank();
+ if (this.peek() === ':') {
+ do {
+ ++this.p;
+ const arg = this.readFilterArg();
+ arg && args.push(arg);
+ this.skipBlank();
+ this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`);
+ } while (this.peek() === ',');
+ }
+ else if (this.peek() === '|' || this.end()) ;
+ else {
+ throw this.error('expected ":" after filter name');
+ }
+ return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file);
+ }
+ readFilterArg() {
+ const key = this.readValue();
+ if (!key)
+ return;
+ this.skipBlank();
+ if (this.peek() !== ':')
+ return key;
+ ++this.p;
+ const value = this.readValue();
+ return [key.getText(), value];
+ }
+ readTopLevelTokens(options = defaultOptions) {
+ const tokens = [];
+ while (this.p < this.N) {
+ const token = this.readTopLevelToken(options);
+ tokens.push(token);
+ }
+ whiteSpaceCtrl(tokens, options);
+ return tokens;
+ }
+ readTopLevelToken(options) {
+ const { tagDelimiterLeft, outputDelimiterLeft } = options;
+ if (this.rawBeginAt > -1)
+ return this.readEndrawOrRawContent(options);
+ if (this.match(tagDelimiterLeft))
+ return this.readTagToken(options);
+ if (this.match(outputDelimiterLeft))
+ return this.readOutputToken(options);
+ return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft]);
+ }
+ readHTMLToken(stopStrings) {
+ const begin = this.p;
+ while (this.p < this.N) {
+ if (stopStrings.some(str => this.match(str)))
+ break;
+ ++this.p;
+ }
+ return new HTMLToken(this.input, begin, this.p, this.file);
+ }
+ readTagToken(options) {
+ const { file, input } = this;
+ const begin = this.p;
+ if (this.readToDelimiter(options.tagDelimiterRight) === -1) {
+ throw this.error(`tag ${this.snapshot(begin)} not closed`, begin);
+ }
+ const token = new TagToken(input, begin, this.p, options, file);
+ if (token.name === 'raw')
+ this.rawBeginAt = begin;
+ return token;
+ }
+ readToDelimiter(delimiter, respectQuoted = false) {
+ this.skipBlank();
+ while (this.p < this.N) {
+ if (respectQuoted && (this.peekType() & QUOTE)) {
+ this.readQuoted();
+ continue;
+ }
+ ++this.p;
+ if (this.rmatch(delimiter))
+ return this.p;
+ }
+ return -1;
+ }
+ readOutputToken(options = defaultOptions) {
+ const { file, input } = this;
+ const { outputDelimiterRight } = options;
+ const begin = this.p;
+ if (this.readToDelimiter(outputDelimiterRight, true) === -1) {
+ throw this.error(`output ${this.snapshot(begin)} not closed`, begin);
+ }
+ return new OutputToken(input, begin, this.p, options, file);
+ }
+ readEndrawOrRawContent(options) {
+ const { tagDelimiterLeft, tagDelimiterRight } = options;
+ const begin = this.p;
+ let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length;
+ while (this.p < this.N) {
+ if (this.readIdentifier().getText() !== 'endraw') {
+ leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length;
+ continue;
+ }
+ while (this.p <= this.N) {
+ if (this.rmatch(tagDelimiterRight)) {
+ const end = this.p;
+ if (begin === leftPos) {
+ this.rawBeginAt = -1;
+ return new TagToken(this.input, begin, end, options, this.file);
+ }
+ else {
+ this.p = leftPos;
+ return new HTMLToken(this.input, begin, leftPos, this.file);
+ }
+ }
+ if (this.rmatch(tagDelimiterLeft))
+ break;
+ this.p++;
+ }
+ }
+ throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin);
+ }
+ readLiquidTagTokens(options = defaultOptions) {
+ const tokens = [];
+ while (this.p < this.N) {
+ const token = this.readLiquidTagToken(options);
+ token && tokens.push(token);
+ }
+ return tokens;
+ }
+ readLiquidTagToken(options) {
+ this.skipBlank();
+ if (this.end())
+ return;
+ const begin = this.p;
+ this.readToDelimiter('\n');
+ const end = this.p;
+ return new LiquidTagToken(this.input, begin, end, options, this.file);
+ }
+ error(msg, pos = this.p) {
+ return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file));
+ }
+ assert(pred, msg, pos) {
+ if (!pred)
+ throw this.error(typeof msg === 'function' ? msg() : msg, pos);
+ }
+ snapshot(begin = this.p) {
+ return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32));
+ }
+ /**
+ * @deprecated use #readIdentifier instead
+ */
+ readWord() {
+ return this.readIdentifier();
+ }
+ readIdentifier() {
+ this.skipBlank();
+ const begin = this.p;
+ while (!this.end() && isWord(this.peek()))
+ ++this.p;
+ return new IdentifierToken(this.input, begin, this.p, this.file);
+ }
+ readNonEmptyIdentifier() {
+ const id = this.readIdentifier();
+ return id.size() ? id : undefined;
+ }
+ readTagName() {
+ this.skipBlank();
+ // Handle inline comment tags
+ if (this.input[this.p] === '#')
+ return this.input.slice(this.p, ++this.p);
+ return this.readIdentifier().getText();
+ }
+ readHashes(jekyllStyle) {
+ const hashes = [];
+ while (true) {
+ const hash = this.readHash(jekyllStyle);
+ if (!hash)
+ return hashes;
+ hashes.push(hash);
+ }
+ }
+ readHash(jekyllStyle) {
+ this.skipBlank();
+ if (this.peek() === ',')
+ ++this.p;
+ const begin = this.p;
+ const name = this.readNonEmptyIdentifier();
+ if (!name)
+ return;
+ let value;
+ this.skipBlank();
+ const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':');
+ if (this.peek() === sep) {
+ ++this.p;
+ value = this.readValue();
+ }
+ return new HashToken(this.input, begin, this.p, name, value, this.file);
+ }
+ remaining() {
+ return this.input.slice(this.p, this.N);
+ }
+ advance(step = 1) {
+ this.p += step;
+ }
+ end() {
+ return this.p >= this.N;
+ }
+ read() {
+ return this.input[this.p++];
+ }
+ readTo(end) {
+ while (this.p < this.N) {
+ ++this.p;
+ if (this.rmatch(end))
+ return this.p;
+ }
+ return -1;
+ }
+ readValue() {
+ this.skipBlank();
+ const begin = this.p;
+ const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber();
+ const props = this.readProperties(!variable);
+ if (!props.length)
+ return variable;
+ return new PropertyAccessToken(variable, props, this.input, begin, this.p);
+ }
+ readScopeValue() {
+ this.skipBlank();
+ const begin = this.p;
+ const props = this.readProperties();
+ if (!props.length)
+ return undefined;
+ return new PropertyAccessToken(undefined, props, this.input, begin, this.p);
+ }
+ readProperties(isBegin = true) {
+ const props = [];
+ while (true) {
+ if (this.peek() === '[') {
+ this.p++;
+ const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file);
+ this.assert(this.readTo(']') !== -1, '[ not closed');
+ props.push(prop);
+ continue;
+ }
+ if (isBegin && !props.length) {
+ const prop = this.readNonEmptyIdentifier();
+ if (prop) {
+ props.push(prop);
+ continue;
+ }
+ }
+ if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax
+ this.p++;
+ const prop = this.readNonEmptyIdentifier();
+ if (!prop)
+ break;
+ props.push(prop);
+ continue;
+ }
+ break;
+ }
+ return props;
+ }
+ readNumber() {
+ this.skipBlank();
+ let decimalFound = false;
+ let digitFound = false;
+ let n = 0;
+ if (this.peekType() & SIGN)
+ n++;
+ while (this.p + n <= this.N) {
+ if (this.peekType(n) & NUMBER) {
+ digitFound = true;
+ n++;
+ }
+ else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') {
+ if (decimalFound || !digitFound)
+ return;
+ decimalFound = true;
+ n++;
+ }
+ else
+ break;
+ }
+ if (digitFound && !isWord(this.peek(n))) {
+ const num = new NumberToken(this.input, this.p, this.p + n, this.file);
+ this.advance(n);
+ return num;
+ }
+ }
+ readLiteral() {
+ this.skipBlank();
+ const end = this.matchTrie(this.literalTrie);
+ if (end === -1)
+ return;
+ const literal = new LiteralToken(this.input, this.p, end, this.file);
+ this.p = end;
+ return literal;
+ }
+ readRange() {
+ this.skipBlank();
+ const begin = this.p;
+ if (this.peek() !== '(')
+ return;
+ ++this.p;
+ const lhs = this.readValueOrThrow();
+ this.skipBlank();
+ this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax');
+ const rhs = this.readValueOrThrow();
+ this.skipBlank();
+ this.assert(this.read() === ')', 'invalid range syntax');
+ return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file);
+ }
+ readValueOrThrow() {
+ const value = this.readValue();
+ this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`);
+ return value;
+ }
+ readQuoted() {
+ this.skipBlank();
+ const begin = this.p;
+ if (!(this.peekType() & QUOTE))
+ return;
+ ++this.p;
+ let escaped = false;
+ while (this.p < this.N) {
+ ++this.p;
+ if (this.input[this.p - 1] === this.input[begin] && !escaped)
+ break;
+ if (escaped)
+ escaped = false;
+ else if (this.input[this.p - 1] === '\\')
+ escaped = true;
+ }
+ return new QuotedToken(this.input, begin, this.p, this.file);
+ }
+ *readFileNameTemplate(options) {
+ const { outputDelimiterLeft } = options;
+ const htmlStopStrings = [',', ' ', outputDelimiterLeft];
+ const htmlStopStringSet = new Set(htmlStopStrings);
+ // break on ',' and ' ', outputDelimiterLeft only stops HTML token
+ while (this.p < this.N && !htmlStopStringSet.has(this.peek())) {
+ yield this.match(outputDelimiterLeft)
+ ? this.readOutputToken(options)
+ : this.readHTMLToken(htmlStopStrings);
+ }
+ }
+ match(word) {
+ for (let i = 0; i < word.length; i++) {
+ if (word[i] !== this.input[this.p + i])
+ return false;
+ }
+ return true;
+ }
+ rmatch(pattern) {
+ for (let i = 0; i < pattern.length; i++) {
+ if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i])
+ return false;
+ }
+ return true;
+ }
+ peekType(n = 0) {
+ return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)];
+ }
+ peek(n = 0) {
+ return this.p + n >= this.N ? '' : this.input[this.p + n];
+ }
+ skipBlank() {
+ while (this.peekType() & BLANK)
+ ++this.p;
+ }
+} + +class ParseStream {
+ constructor(tokens, parseToken) {
+ this.handlers = {};
+ this.stopRequested = false;
+ this.tokens = tokens;
+ this.parseToken = parseToken;
+ }
+ on(name, cb) {
+ this.handlers[name] = cb;
+ return this;
+ }
+ trigger(event, arg) {
+ const h = this.handlers[event];
+ return h ? (h.call(this, arg), true) : false;
+ }
+ start() {
+ this.trigger('start');
+ let token;
+ while (!this.stopRequested && (token = this.tokens.shift())) {
+ if (this.trigger('token', token))
+ continue;
+ if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) {
+ continue;
+ }
+ const template = this.parseToken(token, this.tokens);
+ this.trigger('template', template);
+ }
+ if (!this.stopRequested)
+ this.trigger('end');
+ return this;
+ }
+ stop() {
+ this.stopRequested = true;
+ return this;
+ }
+} + +class TemplateImpl {
+ constructor(token) {
+ this.token = token;
+ }
+} + +class Tag extends TemplateImpl {
+ constructor(token, remainTokens, liquid) {
+ super(token);
+ this.name = token.name;
+ this.liquid = liquid;
+ this.tokenizer = token.tokenizer;
+ }
+} + +/**
+ * Key-Value Pairs Representing Tag Arguments
+ * Example:
+ * For the markup `, foo:'bar', coo:2 reversed %}`,
+ * hash['foo'] === 'bar'
+ * hash['coo'] === 2
+ * hash['reversed'] === undefined
+ */
+class Hash {
+ constructor(input, jekyllStyle) {
+ this.hash = {};
+ const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {});
+ for (const hash of tokenizer.readHashes(jekyllStyle)) {
+ this.hash[hash.name.content] = hash.value;
+ }
+ }
+ *render(ctx) {
+ const hash = {};
+ for (const key of Object.keys(this.hash)) {
+ hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx);
+ }
+ return hash;
+ }
+} + +function createTagClass(options) {
+ return class extends Tag {
+ constructor(token, tokens, liquid) {
+ super(token, tokens, liquid);
+ if (isFunction(options.parse)) {
+ options.parse.call(this, token, tokens);
+ }
+ }
+ *render(ctx, emitter) {
+ const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx));
+ return yield options.render.call(this, ctx, emitter, hash);
+ }
+ };
+} + +function isKeyValuePair(arr) {
+ return isArray(arr);
+} + +class Filter {
+ constructor(token, options, liquid) {
+ this.token = token;
+ this.name = token.name;
+ this.handler = isFunction(options)
+ ? options
+ : (isFunction(options?.handler) ? options.handler : identify);
+ this.raw = !isFunction(options) && !!options?.raw;
+ this.args = token.args;
+ this.liquid = liquid;
+ }
+ *render(value, context) {
+ const argv = [];
+ for (const arg of this.args) {
+ if (isKeyValuePair(arg))
+ argv.push([arg[0], yield evalToken(arg[1], context)]);
+ else
+ argv.push(yield evalToken(arg, context));
+ }
+ return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv]);
+ }
+} + +class Value {
+ /**
+ * @param str the value to be valuated, eg.: "foobar" | truncate: 3
+ */
+ constructor(input, liquid) {
+ this.filters = [];
+ const token = typeof input === 'string'
+ ? new Tokenizer(input, liquid.options.operators).readFilteredValue()
+ : input;
+ this.initial = token.initial;
+ this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid));
+ }
+ *value(ctx, lenient) {
+ lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default');
+ let val = yield this.initial.evaluate(ctx, lenient);
+ for (const filter of this.filters) {
+ val = yield filter.render(val, ctx);
+ }
+ return val;
+ }
+ getFilter(liquid, name) {
+ const impl = liquid.filters[name];
+ assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`);
+ return impl;
+ }
+} + +class Output extends TemplateImpl {
+ constructor(token, liquid) {
+ super(token);
+ const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange);
+ this.value = new Value(tokenizer.readFilteredValue(), liquid);
+ const filters = this.value.filters;
+ const outputEscape = liquid.options.outputEscape;
+ if (!filters[filters.length - 1]?.raw && outputEscape) {
+ const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0);
+ filters.push(new Filter(token, outputEscape, liquid));
+ }
+ }
+ *render(ctx, emitter) {
+ const val = yield this.value.value(ctx, false);
+ emitter.write(val);
+ }
+ *arguments() {
+ yield this.value;
+ }
+} + +class HTML extends TemplateImpl {
+ constructor(token) {
+ super(token);
+ this.str = token.getContent();
+ }
+ *render(ctx, emitter) {
+ emitter.write(this.str);
+ }
+} + +/**
+ * A variable's segments and location, which can be coerced to a string.
+ */
+class Variable {
+ constructor(segments, location) {
+ this.segments = segments;
+ this.location = location;
+ }
+ toString() {
+ return segmentsString(this.segments, true);
+ }
+ /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */
+ toArray() {
+ function* _visit(...segments) {
+ for (const segment of segments) {
+ if (segment instanceof Variable) {
+ yield Array.from(_visit(...segment.segments));
+ }
+ else {
+ yield segment;
+ }
+ }
+ }
+ return Array.from(_visit(...this.segments));
+ }
+}
+/**
+ * Group variables by the string representation of their root segment.
+ */
+class VariableMap {
+ constructor() {
+ this.map = new Map();
+ }
+ get(key) {
+ const k = segmentsString([key.segments[0]]);
+ if (!this.map.has(k)) {
+ this.map.set(k, []);
+ }
+ return this.map.get(k);
+ }
+ has(key) {
+ return this.map.has(segmentsString([key.segments[0]]));
+ }
+ push(variable) {
+ this.get(variable).push(variable);
+ }
+ asObject() {
+ return Object.fromEntries(this.map);
+ }
+}
+const defaultStaticAnalysisOptions = {
+ partials: true
+};
+function* _analyze(templates, partials, sync) {
+ const variables = new VariableMap();
+ const globals = new VariableMap();
+ const locals = new VariableMap();
+ const rootScope = new DummyScope(new Set());
+ // Names of partial templates that we've already analyzed.
+ const seen = new Set();
+ function updateVariables(variable, scope) {
+ variables.push(variable);
+ const aliased = scope.alias(variable);
+ if (aliased !== undefined) {
+ const root = aliased.segments[0];
+ // TODO: What if a a template renders a rendered template? Do we need scope.parent?
+ if (isString(root) && !rootScope.has(root)) {
+ globals.push(aliased);
+ }
+ }
+ else {
+ const root = variable.segments[0];
+ if (isString(root) && !scope.has(root)) {
+ globals.push(variable);
+ }
+ }
+ // Recurse for nested Variables
+ for (const segment of variable.segments) {
+ if (segment instanceof Variable) {
+ updateVariables(segment, scope);
+ }
+ }
+ }
+ function* visit(template, scope) {
+ if (template.arguments) {
+ for (const arg of template.arguments()) {
+ for (const variable of extractVariables(arg)) {
+ updateVariables(variable, scope);
+ }
+ }
+ }
+ if (template.localScope) {
+ for (const ident of template.localScope()) {
+ scope.add(ident.content);
+ scope.deleteAlias(ident.content);
+ const [row, col] = ident.getPosition();
+ locals.push(new Variable([ident.content], { row, col, file: ident.file }));
+ }
+ }
+ if (template.children) {
+ if (template.partialScope) {
+ const partial = template.partialScope();
+ if (partial === undefined) {
+ // Layouts, for example, can have children that are not partials.
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, scope);
+ }
+ return;
+ }
+ if (seen.has(partial.name))
+ return;
+ const partialScopeNames = new Set();
+ const partialScope = partial.isolated
+ ? new DummyScope(partialScopeNames)
+ : scope.push(partialScopeNames);
+ for (const name of partial.scope) {
+ if (isString(name)) {
+ partialScopeNames.add(name);
+ }
+ else {
+ const [alias, argument] = name;
+ partialScopeNames.add(alias);
+ const variables = Array.from(extractVariables(argument));
+ if (variables.length) {
+ partialScope.setAlias(alias, variables[0].segments);
+ }
+ }
+ }
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, partialScope);
+ seen.add(partial.name);
+ }
+ partialScope.pop();
+ }
+ else {
+ if (template.blockScope) {
+ scope.push(new Set(template.blockScope()));
+ }
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, scope);
+ }
+ if (template.blockScope) {
+ scope.pop();
+ }
+ }
+ }
+ }
+ for (const template of templates) {
+ yield visit(template, rootScope);
+ }
+ return {
+ variables: variables.asObject(),
+ globals: globals.asObject(),
+ locals: locals.asObject()
+ };
+}
+/**
+ * Statically analyze a template and report variable usage.
+ */
+function analyze(template, options = {}) {
+ const opts = { ...defaultStaticAnalysisOptions, ...options };
+ return toPromise(_analyze(template, opts.partials, false));
+}
+/**
+ * Statically analyze a template and report variable usage.
+ */
+function analyzeSync(template, options = {}) {
+ const opts = { ...defaultStaticAnalysisOptions, ...options };
+ return toValueSync(_analyze(template, opts.partials, true));
+}
+/**
+ * A stack to manage scopes while traversing templates during static analysis.
+ */
+class DummyScope {
+ constructor(globals) {
+ this.stack = [{ names: globals, aliases: new Map() }];
+ }
+ /** Return true if `name` is in scope. */
+ has(name) {
+ for (const scope of this.stack) {
+ if (scope.names.has(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ push(scope) {
+ this.stack.push({ names: scope, aliases: new Map() });
+ return this;
+ }
+ pop() {
+ return this.stack.pop()?.names;
+ }
+ // Add a name to the template scope.
+ add(name) {
+ this.stack[0].names.add(name);
+ }
+ /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */
+ alias(variable) {
+ const root = variable.segments[0];
+ if (!isString(root))
+ return undefined;
+ const alias = this.getAlias(root);
+ if (alias === undefined)
+ return undefined;
+ return new Variable([...alias, ...variable.segments.slice(1)], variable.location);
+ }
+ // TODO: `from` could be a path with multiple segments, like `include.x`.
+ setAlias(from, to) {
+ this.stack[this.stack.length - 1].aliases.set(from, to);
+ }
+ deleteAlias(name) {
+ this.stack[this.stack.length - 1].aliases.delete(name);
+ }
+ getAlias(name) {
+ for (const scope of this.stack) {
+ if (scope.aliases.has(name)) {
+ return scope.aliases.get(name);
+ }
+ // If a scope has defined `name`, then it masks aliases in parent scopes.
+ if (scope.names.has(name)) {
+ return undefined;
+ }
+ }
+ return undefined;
+ }
+}
+function* extractVariables(value) {
+ if (isValueToken(value)) {
+ yield* extractValueTokenVariables(value);
+ }
+ else if (value instanceof Value) {
+ yield* extractFilteredValueVariables(value);
+ }
+}
+function* extractFilteredValueVariables(value) {
+ for (const token of value.initial.postfix) {
+ if (isValueToken(token)) {
+ yield* extractValueTokenVariables(token);
+ }
+ }
+ for (const filter of value.filters) {
+ for (const arg of filter.args) {
+ if (isKeyValuePair(arg) && arg[1]) {
+ yield* extractValueTokenVariables(arg[1]);
+ }
+ else if (isValueToken(arg)) {
+ yield* extractValueTokenVariables(arg);
+ }
+ }
+ }
+}
+function* extractValueTokenVariables(token) {
+ if (isRangeToken(token)) {
+ yield* extractValueTokenVariables(token.lhs);
+ yield* extractValueTokenVariables(token.rhs);
+ }
+ else if (isPropertyAccessToken(token)) {
+ yield extractPropertyAccessVariable(token);
+ }
+}
+function extractPropertyAccessVariable(token) {
+ const segments = [];
+ // token is not guaranteed to have `file` set. We'll try to get it from a prop if not.
+ let file = token.file;
+ // Here we're flattening the first segment of a path if it is a nested path.
+ const root = token.props[0];
+ file = file || root.file;
+ if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) {
+ segments.push(root.content);
+ }
+ else if (isPropertyAccessToken(root)) {
+ // Flatten paths that start with a nested path.
+ segments.push(...extractPropertyAccessVariable(root).segments);
+ }
+ for (const prop of token.props.slice(1)) {
+ file = file || prop.file;
+ if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) {
+ segments.push(prop.content);
+ }
+ else if (isPropertyAccessToken(prop)) {
+ segments.push(extractPropertyAccessVariable(prop));
+ }
+ }
+ const [row, col] = token.getPosition();
+ return new Variable(segments, {
+ row,
+ col,
+ file
+ });
+}
+// This is used to detect segments that can be represented with dot notation
+// when creating a string representation of VariableSegments.
+const RE_PROPERTY = /^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/;
+/**
+ * Return a string representation of segments using dot notation where possible.
+ * @param segments - The property names and array indices that make up a path to a variable.
+ * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets.
+ */
+function segmentsString(segments, bracketedRoot = false) {
+ const buf = [];
+ const root = segments[0];
+ if (isString(root)) {
+ if (!bracketedRoot || root.match(RE_PROPERTY)) {
+ buf.push(`${root}`);
+ }
+ else {
+ buf.push(`['${root}']`);
+ }
+ }
+ for (const segment of segments.slice(1)) {
+ if (segment instanceof Variable) {
+ buf.push(`[${segmentsString(segment.segments)}]`);
+ }
+ else if (isString(segment)) {
+ if (segment.match(RE_PROPERTY)) {
+ buf.push(`.${segment}`);
+ }
+ else {
+ buf.push(`['${segment}']`);
+ }
+ }
+ else {
+ buf.push(`[${segment}]`);
+ }
+ }
+ return buf.join('');
+} + +var LookupType;
+(function (LookupType) {
+ LookupType["Partials"] = "partials";
+ LookupType["Layouts"] = "layouts";
+ LookupType["Root"] = "root";
+})(LookupType || (LookupType = {}));
+class Loader {
+ constructor(options) {
+ this.options = options;
+ if (options.relativeReference) {
+ const sep = options.fs.sep;
+ assert(sep, '`fs.sep` is required for relative reference');
+ const rRelativePath = new RegExp(['.' + sep, '..' + sep, './', '../'].map(prefix => escapeRegex(prefix)).join('|'));
+ this.shouldLoadRelative = (referencedFile) => rRelativePath.test(referencedFile);
+ }
+ else {
+ this.shouldLoadRelative = (_referencedFile) => false;
+ }
+ this.contains = this.options.fs.contains || (() => true);
+ }
+ *lookup(file, type, sync, currentFile) {
+ const { fs } = this.options;
+ const dirs = this.options[type];
+ for (const filepath of this.candidates(file, dirs, currentFile, type !== LookupType.Root)) {
+ if (sync ? fs.existsSync(filepath) : yield fs.exists(filepath))
+ return filepath;
+ }
+ throw this.lookupError(file, dirs);
+ }
+ *candidates(file, dirs, currentFile, enforceRoot) {
+ const { fs, extname } = this.options;
+ if (this.shouldLoadRelative(file) && currentFile) {
+ const referenced = fs.resolve(this.dirname(currentFile), file, extname);
+ for (const dir of dirs) {
+ if (!enforceRoot || this.contains(dir, referenced)) {
+ // the relatively referenced file is within one of root dirs
+ yield referenced;
+ break;
+ }
+ }
+ }
+ for (const dir of dirs) {
+ const referenced = fs.resolve(dir, file, extname);
+ if (!enforceRoot || this.contains(dir, referenced)) {
+ yield referenced;
+ }
+ }
+ if (fs.fallback !== undefined) {
+ const filepath = fs.fallback(file);
+ if (filepath !== undefined)
+ yield filepath;
+ }
+ }
+ dirname(path) {
+ const fs = this.options.fs;
+ assert(fs.dirname, '`fs.dirname` is required for relative reference');
+ return fs.dirname(path);
+ }
+ lookupError(file, roots) {
+ const err = new Error('ENOENT');
+ err.message = `ENOENT: Failed to lookup "${file}" in "${roots}"`;
+ err.code = 'ENOENT';
+ return err;
+ }
+} + +class Parser {
+ constructor(liquid) {
+ this.liquid = liquid;
+ this.cache = this.liquid.options.cache;
+ this.fs = this.liquid.options.fs;
+ this.parseFile = this.cache ? this._parseFileCached : this._parseFile;
+ this.loader = new Loader(this.liquid.options);
+ this.parseLimit = new Limiter('parse length', liquid.options.parseLimit);
+ }
+ parse(html, filepath) {
+ html = String(html);
+ this.parseLimit.use(html.length);
+ const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath);
+ const tokens = tokenizer.readTopLevelTokens(this.liquid.options);
+ return this.parseTokens(tokens);
+ }
+ parseTokens(tokens) {
+ let token;
+ const templates = [];
+ const errors = [];
+ while ((token = tokens.shift())) {
+ try {
+ templates.push(this.parseToken(token, tokens));
+ }
+ catch (err) {
+ if (this.liquid.options.catchAllErrors)
+ errors.push(err);
+ else
+ throw err;
+ }
+ }
+ if (errors.length)
+ throw new LiquidErrors(errors);
+ return templates;
+ }
+ parseToken(token, remainTokens) {
+ try {
+ if (isTagToken(token)) {
+ const TagClass = this.liquid.tags[token.name];
+ assert(TagClass, `tag "${token.name}" not found`);
+ return new TagClass(token, remainTokens, this.liquid, this);
+ }
+ if (isOutputToken(token)) {
+ return new Output(token, this.liquid);
+ }
+ return new HTML(token);
+ }
+ catch (e) {
+ if (LiquidError.is(e))
+ throw e;
+ throw new ParseError(e, token);
+ }
+ }
+ parseStream(tokens) {
+ return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens));
+ }
+ *_parseFileCached(file, sync, type = LookupType.Root, currentFile) {
+ const cache = this.cache;
+ const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file;
+ const tpls = yield cache.read(key);
+ if (tpls)
+ return tpls;
+ const task = this._parseFile(file, sync, type, currentFile);
+ // sync mode: exec the task and cache the result
+ // async mode: cache the task before exec
+ const taskOrTpl = sync ? yield task : toPromise(task);
+ cache.write(key, taskOrTpl);
+ // note: concurrent tasks will be reused, cache for failed task is removed until its end
+ try {
+ return yield taskOrTpl;
+ }
+ catch (err) {
+ cache.remove(key);
+ throw err;
+ }
+ }
+ *_parseFile(file, sync, type = LookupType.Root, currentFile) {
+ const filepath = yield this.loader.lookup(file, type, sync, currentFile);
+ return this.parse(sync ? this.fs.readFileSync(filepath) : yield this.fs.readFile(filepath), filepath);
+ }
+} + +(function (TokenKind) {
+ TokenKind[TokenKind["Number"] = 1] = "Number";
+ TokenKind[TokenKind["Literal"] = 2] = "Literal";
+ TokenKind[TokenKind["Tag"] = 4] = "Tag";
+ TokenKind[TokenKind["Output"] = 8] = "Output";
+ TokenKind[TokenKind["HTML"] = 16] = "HTML";
+ TokenKind[TokenKind["Filter"] = 32] = "Filter";
+ TokenKind[TokenKind["Hash"] = 64] = "Hash";
+ TokenKind[TokenKind["PropertyAccess"] = 128] = "PropertyAccess";
+ TokenKind[TokenKind["Word"] = 256] = "Word";
+ TokenKind[TokenKind["Range"] = 512] = "Range";
+ TokenKind[TokenKind["Quoted"] = 1024] = "Quoted";
+ TokenKind[TokenKind["Operator"] = 2048] = "Operator";
+ TokenKind[TokenKind["FilteredValue"] = 4096] = "FilteredValue";
+ TokenKind[TokenKind["Delimited"] = 12] = "Delimited";
+})(exports.TokenKind || (exports.TokenKind = {})); + +function isDelimitedToken(val) {
+ return !!(getKind(val) & exports.TokenKind.Delimited);
+}
+function isOperatorToken(val) {
+ return getKind(val) === exports.TokenKind.Operator;
+}
+function isHTMLToken(val) {
+ return getKind(val) === exports.TokenKind.HTML;
+}
+function isOutputToken(val) {
+ return getKind(val) === exports.TokenKind.Output;
+}
+function isTagToken(val) {
+ return getKind(val) === exports.TokenKind.Tag;
+}
+function isQuotedToken(val) {
+ return getKind(val) === exports.TokenKind.Quoted;
+}
+function isLiteralToken(val) {
+ return getKind(val) === exports.TokenKind.Literal;
+}
+function isNumberToken(val) {
+ return getKind(val) === exports.TokenKind.Number;
+}
+function isPropertyAccessToken(val) {
+ return getKind(val) === exports.TokenKind.PropertyAccess;
+}
+function isWordToken(val) {
+ return getKind(val) === exports.TokenKind.Word;
+}
+function isRangeToken(val) {
+ return getKind(val) === exports.TokenKind.Range;
+}
+function isValueToken(val) {
+ // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range
+ return (getKind(val) & 1667) > 0;
+}
+function getKind(val) {
+ return val ? val.kind : -1;
+} + +var typeGuards = /*#__PURE__*/Object.freeze({ + __proto__: null, + isDelimitedToken: isDelimitedToken, + isOperatorToken: isOperatorToken, + isHTMLToken: isHTMLToken, + isOutputToken: isOutputToken, + isTagToken: isTagToken, + isQuotedToken: isQuotedToken, + isLiteralToken: isLiteralToken, + isNumberToken: isNumberToken, + isPropertyAccessToken: isPropertyAccessToken, + isWordToken: isWordToken, + isRangeToken: isRangeToken, + isValueToken: isValueToken +}); + +/******************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+
+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);
+}; + +class Context {
+ constructor(env = {}, opts = defaultOptions, renderOptions = {}, { memoryLimit, renderLimit } = {}) {
+ /**
+ * insert a Context-level empty scope,
+ * for tags like `{% capture %}` `{% assign %}` to operate
+ */
+ this.scopes = [{}];
+ this.registers = {};
+ this.breakCalled = false;
+ this.continueCalled = false;
+ this.sync = !!renderOptions.sync;
+ this.opts = opts;
+ this.globals = renderOptions.globals ?? opts.globals;
+ this.environments = isObject(env) ? env : Object(env);
+ this.strictVariables = renderOptions.strictVariables ?? this.opts.strictVariables;
+ this.ownPropertyOnly = renderOptions.ownPropertyOnly ?? opts.ownPropertyOnly;
+ this.memoryLimit = memoryLimit ?? new Limiter('memory alloc', renderOptions.memoryLimit ?? opts.memoryLimit);
+ this.renderLimit = renderLimit ?? new Limiter('template render', getPerformance().now() + (renderOptions.renderLimit ?? opts.renderLimit));
+ }
+ getRegister(key) {
+ return (this.registers[key] = this.registers[key] || {});
+ }
+ setRegister(key, value) {
+ return (this.registers[key] = value);
+ }
+ saveRegister(...keys) {
+ return keys.map(key => [key, this.getRegister(key)]);
+ }
+ restoreRegister(keyValues) {
+ return keyValues.forEach(([key, value]) => this.setRegister(key, value));
+ }
+ getAll() {
+ return [this.globals, this.environments, ...this.scopes]
+ .reduce((ctx, val) => __assign(ctx, val), {});
+ }
+ /**
+ * @deprecated use `_get()` or `getSync()` instead
+ */
+ get(paths) {
+ return this.getSync(paths);
+ }
+ getSync(paths) {
+ return toValueSync(this._get(paths));
+ }
+ *_get(paths) {
+ const scope = this.findScope(paths[0]); // first prop should always be a string
+ return yield this._getFromScope(scope, paths);
+ }
+ /**
+ * @deprecated use `_get()` instead
+ */
+ getFromScope(scope, paths) {
+ return toValueSync(this._getFromScope(scope, paths));
+ }
+ *_getFromScope(scope, paths, strictVariables = this.strictVariables) {
+ if (isString(paths))
+ paths = paths.split('.');
+ for (let i = 0; i < paths.length; i++) {
+ scope = yield this.readProperty(scope, paths[i]);
+ if (strictVariables && isUndefined(scope)) {
+ throw new InternalUndefinedVariableError(paths.slice(0, i + 1).join('.'));
+ }
+ }
+ return scope;
+ }
+ push(ctx) {
+ return this.scopes.push(ctx);
+ }
+ pop() {
+ return this.scopes.pop();
+ }
+ bottom() {
+ return this.scopes[0];
+ }
+ spawn(scope = {}) {
+ return new Context(scope, this.opts, {
+ sync: this.sync,
+ globals: this.globals,
+ strictVariables: this.strictVariables
+ }, {
+ renderLimit: this.renderLimit,
+ memoryLimit: this.memoryLimit
+ });
+ }
+ findScope(key) {
+ for (let i = this.scopes.length - 1; i >= 0; i--) {
+ const candidate = this.scopes[i];
+ if (key in candidate)
+ return candidate;
+ }
+ if (key in this.environments)
+ return this.environments;
+ return this.globals;
+ }
+ readProperty(obj, key) {
+ obj = toLiquid(obj);
+ key = toValue(key);
+ if (isNil(obj))
+ return obj;
+ if (isArray(obj) && key < 0)
+ return obj[obj.length + +key];
+ const value = readJSProperty(obj, key, this.ownPropertyOnly);
+ if (value === undefined && obj instanceof Drop)
+ return obj.liquidMethodMissing(key, this);
+ if (isFunction(value))
+ return value.call(obj);
+ if (key === 'size')
+ return readSize(obj);
+ else if (key === 'first')
+ return readFirst(obj);
+ else if (key === 'last')
+ return readLast(obj);
+ return value;
+ }
+}
+function readJSProperty(obj, key, ownPropertyOnly) {
+ if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop))
+ return undefined;
+ return obj[key];
+}
+function readFirst(obj) {
+ if (isArray(obj))
+ return obj[0];
+ return obj['first'];
+}
+function readLast(obj) {
+ if (isArray(obj))
+ return obj[obj.length - 1];
+ return obj['last'];
+}
+function readSize(obj) {
+ if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined)
+ return obj['size'];
+ if (isArray(obj) || isString(obj))
+ return obj.length;
+ if (typeof obj === 'object')
+ return Object.keys(obj).length;
+} + +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 = {})); + +const abs = argumentsToNumber(Math.abs);
+const at_least = argumentsToNumber(Math.max);
+const at_most = argumentsToNumber(Math.min);
+const ceil = argumentsToNumber(Math.ceil);
+const divided_by = argumentsToNumber((dividend, divisor, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor);
+const floor = argumentsToNumber(Math.floor);
+const minus = argumentsToNumber((v, arg) => v - arg);
+const plus = argumentsToNumber((lhs, rhs) => lhs + rhs);
+const modulo = argumentsToNumber((v, arg) => v % arg);
+const times = argumentsToNumber((v, arg) => v * arg);
+function round(v, arg = 0) {
+ v = toNumber(v);
+ arg = toNumber(arg);
+ const amp = Math.pow(10, arg);
+ return Math.round(v * amp) / amp;
+} + +var mathFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + abs: abs, + at_least: at_least, + at_most: at_most, + ceil: ceil, + divided_by: divided_by, + floor: floor, + minus: minus, + plus: plus, + modulo: modulo, + times: times, + round: round +}); + +const url_decode = (x) => decodeURIComponent(stringify(x)).replace(/\+/g, ' ');
+const url_encode = (x) => encodeURIComponent(stringify(x)).replace(/%20/g, '+');
+const cgi_escape = (x) => encodeURIComponent(stringify(x))
+ .replace(/%20/g, '+')
+ .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase());
+const uri_escape = (x) => encodeURI(stringify(x))
+ .replace(/%5B/g, '[')
+ .replace(/%5D/g, ']');
+const rSlugifyDefault = /[^\p{M}\p{L}\p{Nd}]+/ug;
+const rSlugifyReplacers = {
+ 'raw': /\s+/g,
+ 'default': rSlugifyDefault,
+ 'pretty': /[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/ug,
+ 'ascii': /[^A-Za-z0-9]+/g,
+ 'latin': rSlugifyDefault,
+ 'none': null
+};
+function slugify(str, mode = 'default', cased = false) {
+ str = stringify(str);
+ const replacer = rSlugifyReplacers[mode];
+ if (replacer) {
+ if (mode === 'latin')
+ str = removeAccents(str);
+ str = str.replace(replacer, '-').replace(/^-|-$/g, '');
+ }
+ return cased ? str : str.toLowerCase();
+}
+function removeAccents(str) {
+ return str.replace(/[àáâãäå]/g, 'a')
+ .replace(/[æ]/g, 'ae')
+ .replace(/[ç]/g, 'c')
+ .replace(/[èéêë]/g, 'e')
+ .replace(/[ìíîï]/g, 'i')
+ .replace(/[ð]/g, 'd')
+ .replace(/[ñ]/g, 'n')
+ .replace(/[òóôõöø]/g, 'o')
+ .replace(/[ùúûü]/g, 'u')
+ .replace(/[ýÿ]/g, 'y')
+ .replace(/[ß]/g, 'ss')
+ .replace(/[œ]/g, 'oe')
+ .replace(/[þ]/g, 'th')
+ .replace(/[ẞ]/g, 'SS')
+ .replace(/[Œ]/g, 'OE')
+ .replace(/[Þ]/g, 'TH');
+} + +var urlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + url_decode: url_decode, + url_encode: url_encode, + cgi_escape: cgi_escape, + uri_escape: uri_escape, + slugify: slugify +}); + +const join = argumentsToValue(function (v, arg) {
+ const array = toArray(v);
+ const sep = isNil(arg) ? ' ' : stringify(arg);
+ const complexity = array.length * (1 + sep.length);
+ this.context.memoryLimit.use(complexity);
+ return array.join(sep);
+});
+const last$1 = argumentsToValue((v) => isArrayLike(v) ? last(v) : '');
+const first = argumentsToValue((v) => isArrayLike(v) ? v[0] : '');
+const reverse = argumentsToValue(function (v) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ return [...array].reverse();
+});
+function* sort(arr, property) {
+ const values = [];
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ values.push([
+ item,
+ property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item
+ ]);
+ }
+ return values.sort((lhs, rhs) => {
+ const lvalue = lhs[1];
+ const rvalue = rhs[1];
+ return lvalue < rvalue ? -1 : (lvalue > rvalue ? 1 : 0);
+ }).map(tuple => tuple[0]);
+}
+function sort_natural(input, property) {
+ const propertyString = stringify(property);
+ const compare = property === undefined
+ ? caseInsensitiveCompare
+ : (lhs, rhs) => caseInsensitiveCompare(lhs[propertyString], rhs[propertyString]);
+ const array = toArray(input);
+ this.context.memoryLimit.use(array.length);
+ return [...array].sort(compare);
+}
+const size = (v) => (v && v.length) || 0;
+function* map(arr, property) {
+ const results = [];
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ results.push(yield this.context._getFromScope(item, stringify(property), false));
+ }
+ return results;
+}
+function* sum(arr, property) {
+ let sum = 0;
+ const array = toArray(arr);
+ for (const item of array) {
+ const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item);
+ sum += Number.isNaN(data) ? 0 : data;
+ }
+ return sum;
+}
+function compact(arr) {
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ return array.filter(x => !isNil(toValue(x)));
+}
+function concat(v, arg = []) {
+ const lhs = toArray(v);
+ const rhs = toArray(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return lhs.concat(rhs);
+}
+function push(v, arg) {
+ return concat.call(this, v, [arg]);
+}
+function unshift(v, arg) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ const clone = [...array];
+ clone.unshift(arg);
+ return clone;
+}
+function pop(v) {
+ const clone = [...toArray(v)];
+ clone.pop();
+ return clone;
+}
+function shift(v) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ const clone = [...array];
+ clone.shift();
+ return clone;
+}
+function slice(v, begin, length = 1) {
+ v = toValue(v);
+ if (isNil(v))
+ return [];
+ if (!isArray(v))
+ v = stringify(v);
+ begin = begin < 0 ? v.length + begin : begin;
+ this.context.memoryLimit.use(length);
+ return v.slice(begin, begin + length);
+}
+function expectedMatcher(expected) {
+ if (this.context.opts.jekyllWhere) {
+ return (v) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected));
+ }
+ else if (expected === undefined) {
+ return (v) => isTruthy(v, this.context);
+ }
+ else {
+ return (v) => equals(v, expected);
+ }
+}
+function* filter(include, arr, property, expected) {
+ const values = [];
+ arr = toArray(arr);
+ this.context.memoryLimit.use(arr.length);
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ for (const item of arr) {
+ values.push(yield evalToken(token, this.context.spawn(item)));
+ }
+ const matcher = expectedMatcher.call(this, expected);
+ return arr.filter((_, i) => matcher(values[i]) === include);
+}
+function* filter_exp(include, arr, itemName, exp) {
+ const filtered = [];
+ const keyTemplate = new Value(stringify(exp), this.liquid);
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ this.context.push({ [itemName]: item });
+ const value = yield keyTemplate.value(this.context);
+ this.context.pop();
+ if (value === include)
+ filtered.push(item);
+ }
+ return filtered;
+}
+function* where(arr, property, expected) {
+ return yield* filter.call(this, true, arr, property, expected);
+}
+function* reject(arr, property, expected) {
+ return yield* filter.call(this, false, arr, property, expected);
+}
+function* where_exp(arr, itemName, exp) {
+ return yield* filter_exp.call(this, true, arr, itemName, exp);
+}
+function* reject_exp(arr, itemName, exp) {
+ return yield* filter_exp.call(this, false, arr, itemName, exp);
+}
+function* group_by(arr, property) {
+ const map = new Map();
+ arr = toEnumerable(arr);
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ this.context.memoryLimit.use(arr.length);
+ for (const item of arr) {
+ const key = yield evalToken(token, this.context.spawn(item));
+ if (!map.has(key))
+ map.set(key, []);
+ map.get(key).push(item);
+ }
+ return [...map.entries()].map(([name, items]) => ({ name, items }));
+}
+function* group_by_exp(arr, itemName, exp) {
+ const map = new Map();
+ const keyTemplate = new Value(stringify(exp), this.liquid);
+ arr = toEnumerable(arr);
+ this.context.memoryLimit.use(arr.length);
+ for (const item of arr) {
+ this.context.push({ [itemName]: item });
+ const key = yield keyTemplate.value(this.context);
+ this.context.pop();
+ if (!map.has(key))
+ map.set(key, []);
+ map.get(key).push(item);
+ }
+ return [...map.entries()].map(([name, items]) => ({ name, items }));
+}
+function* search(arr, property, expected) {
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ const array = toArray(arr);
+ const matcher = expectedMatcher.call(this, expected);
+ for (let index = 0; index < array.length; index++) {
+ const value = yield evalToken(token, this.context.spawn(array[index]));
+ if (matcher(value))
+ return [index, array[index]];
+ }
+}
+function* search_exp(arr, itemName, exp) {
+ const predicate = new Value(stringify(exp), this.liquid);
+ const array = toArray(arr);
+ for (let index = 0; index < array.length; index++) {
+ this.context.push({ [itemName]: array[index] });
+ const value = yield predicate.value(this.context);
+ this.context.pop();
+ if (value)
+ return [index, array[index]];
+ }
+}
+function* has(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return !!result;
+}
+function* has_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return !!result;
+}
+function* find_index(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return result ? result[0] : undefined;
+}
+function* find_index_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return result ? result[0] : undefined;
+}
+function* find(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return result ? result[1] : undefined;
+}
+function* find_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return result ? result[1] : undefined;
+}
+function uniq(arr) {
+ arr = toArray(arr);
+ this.context.memoryLimit.use(arr.length);
+ return [...new Set(arr)];
+}
+function sample(v, count = 1) {
+ v = toValue(v);
+ if (isNil(v))
+ return [];
+ if (!isArray(v))
+ v = stringify(v);
+ this.context.memoryLimit.use(count);
+ const shuffled = [...v].sort(() => Math.random() - 0.5);
+ if (count === 1)
+ return shuffled[0];
+ return shuffled.slice(0, count);
+} + +var arrayFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + join: join, + last: last$1, + first: first, + reverse: reverse, + sort: sort, + sort_natural: sort_natural, + size: size, + map: map, + sum: sum, + compact: compact, + concat: concat, + push: push, + unshift: unshift, + pop: pop, + shift: shift, + slice: slice, + where: where, + reject: reject, + where_exp: where_exp, + reject_exp: reject_exp, + group_by: group_by, + group_by_exp: group_by_exp, + has: has, + has_exp: has_exp, + find_index: find_index, + find_index_exp: find_index_exp, + find: find, + find_exp: find_exp, + uniq: uniq, + sample: sample +}); + +function date(v, format, timezoneOffset) {
+ const size = (v?.length ?? 0) + (format?.length ?? 0) + (timezoneOffset?.length ?? 0);
+ this.context.memoryLimit.use(size);
+ const date = parseDate(v, this.context.opts, timezoneOffset);
+ if (!date)
+ return v;
+ format = toValue(format);
+ format = isNil(format) ? this.context.opts.dateFormat : stringify(format);
+ return strftime(date, format);
+}
+function date_to_xmlschema(v) {
+ return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z');
+}
+function date_to_rfc822(v) {
+ return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z');
+}
+function date_to_string(v, type, style) {
+ return stringify_date.call(this, v, '%b', type, style);
+}
+function date_to_long_string(v, type, style) {
+ return stringify_date.call(this, v, '%B', type, style);
+}
+function stringify_date(v, month_type, type, style) {
+ const date = parseDate(v, this.context.opts);
+ if (!date)
+ return v;
+ if (type === 'ordinal') {
+ const d = date.getDate();
+ return style === 'US'
+ ? strftime(date, `${month_type} ${d}%q, %Y`)
+ : strftime(date, `${d}%q ${month_type} %Y`);
+ }
+ return strftime(date, `%d ${month_type} %Y`);
+}
+function parseDate(v, opts, timezoneOffset) {
+ let date;
+ const defaultTimezoneOffset = timezoneOffset ?? opts.timezoneOffset;
+ const locale = opts.locale;
+ v = toValue(v);
+ if (v === 'now' || v === 'today') {
+ date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset);
+ }
+ else if (isNumber(v)) {
+ date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset);
+ }
+ else if (isString(v)) {
+ if (/^\d+$/.test(v)) {
+ date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset);
+ }
+ else if (opts.preserveTimezones && timezoneOffset === undefined) {
+ date = LiquidDate.createDateFixedToTimezone(v, locale);
+ }
+ else {
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
+ }
+ }
+ else {
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
+ }
+ return date.valid() ? date : undefined;
+} + +var dateFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + date: date, + date_to_xmlschema: date_to_xmlschema, + date_to_rfc822: date_to_rfc822, + date_to_string: date_to_string, + date_to_long_string: date_to_long_string +}); + +/**
+ * String related filters
+ *
+ * * prefer stringify() to String() since `undefined`, `null` should eval ''
+ */
+const rCJKWord = /[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu;
+// Word boundary followed by word characters (for detecting words)
+const rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu;
+function append(v, arg) {
+ assert(arguments.length === 2, 'append expect 2 arguments');
+ const lhs = stringify(v);
+ const rhs = stringify(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return lhs + rhs;
+}
+function prepend(v, arg) {
+ assert(arguments.length === 2, 'prepend expect 2 arguments');
+ const lhs = stringify(v);
+ const rhs = stringify(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return rhs + lhs;
+}
+function lstrip(v, chars) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str.replace(new RegExp(`^[${chars}]+`, 'g'), '');
+ }
+ return str.replace(/^\s+/, '');
+}
+function downcase(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.toLowerCase();
+}
+function upcase(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return stringify(str).toUpperCase();
+}
+function remove(v, arg) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.split(stringify(arg)).join('');
+}
+function remove_first(v, l) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(stringify(l), '');
+}
+function remove_last(v, l) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const pattern = stringify(l);
+ const index = str.lastIndexOf(pattern);
+ if (index === -1)
+ return str;
+ return str.substring(0, index) + str.substring(index + pattern.length);
+}
+function rstrip(str, chars) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str.replace(new RegExp(`[${chars}]+$`, 'g'), '');
+ }
+ return str.replace(/\s+$/, '');
+}
+function split(v, arg) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const arr = str.split(stringify(arg));
+ // align to ruby split, which is the behavior of shopify/liquid
+ // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split
+ while (arr.length && arr[arr.length - 1] === '')
+ arr.pop();
+ return arr;
+}
+function strip(v, chars) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str
+ .replace(new RegExp(`^[${chars}]+`, 'g'), '')
+ .replace(new RegExp(`[${chars}]+$`, 'g'), '');
+ }
+ return str.trim();
+}
+function strip_newlines(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\r?\n/gm, '');
+}
+function capitalize(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
+}
+function replace(v, pattern, replacement) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.split(stringify(pattern)).join(replacement);
+}
+function replace_first(v, arg1, arg2) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(stringify(arg1), arg2);
+}
+function replace_last(v, arg1, arg2) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const pattern = stringify(arg1);
+ const index = str.lastIndexOf(pattern);
+ if (index === -1)
+ return str;
+ const replacement = stringify(arg2);
+ return str.substring(0, index) + replacement + str.substring(index + pattern.length);
+}
+function truncate(v, l = 50, o = '...') {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (str.length <= l)
+ return v;
+ return str.substring(0, l - o.length) + o;
+}
+function truncatewords(v, words = 15, o = '...') {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const arr = str.split(/\s+/);
+ if (words <= 0)
+ words = 1;
+ let ret = arr.slice(0, words).join(' ');
+ if (arr.length >= words)
+ ret += o;
+ return ret;
+}
+function normalize_whitespace(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\s+/g, ' ');
+}
+function number_of_words(input, mode) {
+ const str = stringify(input);
+ this.context.memoryLimit.use(str.length);
+ input = str.trim();
+ if (!input)
+ return 0;
+ switch (mode) {
+ case 'cjk':
+ // Count CJK characters and words
+ return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length;
+ case 'auto':
+ // Count CJK characters, if none, count words
+ return rCJKWord.test(input)
+ ? input.match(rCJKWord).length + (input.match(rNonCJKWord) || []).length
+ : input.split(/\s+/).length;
+ default:
+ // Count words only
+ return input.split(/\s+/).length;
+ }
+}
+function array_to_sentence_string(array, connector = 'and') {
+ this.context.memoryLimit.use(array.length);
+ switch (array.length) {
+ case 0:
+ return '';
+ case 1:
+ return array[0];
+ case 2:
+ return `${array[0]} ${connector} ${array[1]}`;
+ default:
+ return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`;
+ }
+} + +var stringFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + append: append, + prepend: prepend, + lstrip: lstrip, + downcase: downcase, + upcase: upcase, + remove: remove, + remove_first: remove_first, + remove_last: remove_last, + rstrip: rstrip, + split: split, + strip: strip, + strip_newlines: strip_newlines, + capitalize: capitalize, + replace: replace, + replace_first: replace_first, + replace_last: replace_last, + truncate: truncate, + truncatewords: truncatewords, + normalize_whitespace: normalize_whitespace, + number_of_words: number_of_words, + array_to_sentence_string: array_to_sentence_string +}); + +const filters = {
+ ...htmlFilters,
+ ...mathFilters,
+ ...urlFilters,
+ ...arrayFilters,
+ ...dateFilters,
+ ...stringFilters,
+ ...misc
+}; + +class AssignTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.key = this.identifier.content;
+ this.tokenizer.assert(this.key, 'expected variable name');
+ this.tokenizer.skipBlank();
+ this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected "="');
+ this.tokenizer.advance();
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ }
+ *render(ctx) {
+ ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf);
+ }
+ *arguments() {
+ yield this.value;
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +const MODIFIERS = ['offset', 'limit', 'reversed'];
+class ForTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const variable = this.tokenizer.readIdentifier();
+ const inStr = this.tokenizer.readIdentifier();
+ const collection = this.tokenizer.readValue();
+ if (!variable.size() || inStr.content !== 'in' || !collection) {
+ throw new Error(`illegal tag: ${token.getText()}`);
+ }
+ this.variable = variable.content;
+ this.collection = collection;
+ this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = [];
+ this.elseTemplates = [];
+ let p;
+ const stream = parser.parseStream(remainTokens)
+ .on('start', () => (p = this.templates))
+ .on('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates; })
+ .on('tag:endfor', tag => { assertEmpty(tag.args); stream.stop(); })
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => { throw new Error(`tag ${token.getText()} not closed`); });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ let collection = toEnumerable(yield evalToken(this.collection, ctx));
+ if (!collection.length) {
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ return;
+ }
+ const continueKey = 'continue-' + this.variable + '-' + this.collection.getText();
+ ctx.push({ continue: ctx.getRegister(continueKey) });
+ const hash = yield this.hash.render(ctx);
+ ctx.pop();
+ const modifiers = this.liquid.options.orderedFilterParameters
+ ? Object.keys(hash).filter(x => MODIFIERS.includes(x))
+ : MODIFIERS.filter(x => hash[x] !== undefined);
+ collection = modifiers.reduce((collection, modifier) => {
+ if (modifier === 'offset')
+ return offset(collection, hash['offset']);
+ if (modifier === 'limit')
+ return limit(collection, hash['limit']);
+ return reversed(collection);
+ }, collection);
+ ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length);
+ const scope = { forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) };
+ ctx.push(scope);
+ for (const item of collection) {
+ scope[this.variable] = item;
+ ctx.continueCalled = ctx.breakCalled = false;
+ yield r.renderTemplates(this.templates, ctx, emitter);
+ if (ctx.breakCalled)
+ break;
+ scope.forloop.next();
+ }
+ ctx.continueCalled = ctx.breakCalled = false;
+ ctx.pop();
+ }
+ *children() {
+ const templates = this.templates.slice();
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+ *arguments() {
+ yield this.collection;
+ for (const v of Object.values(this.hash.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ }
+ blockScope() {
+ return [this.variable, 'forloop'];
+ }
+}
+function reversed(arr) {
+ return [...arr].reverse();
+}
+function offset(arr, count) {
+ return arr.slice(count);
+}
+function limit(arr, count) {
+ return arr.slice(0, count);
+} + +class CaptureTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.templates = [];
+ this.identifier = this.readVariable();
+ this.variable = this.identifier.content;
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endcapture')
+ return;
+ this.templates.push(parser.parseToken(token, remainTokens));
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ readVariable() {
+ let ident = this.tokenizer.readIdentifier();
+ if (ident.content)
+ return ident;
+ ident = this.tokenizer.readQuoted();
+ if (ident)
+ return ident;
+ throw this.tokenizer.error('invalid capture name');
+ }
+ *render(ctx) {
+ const r = this.liquid.renderer;
+ const html = yield r.renderTemplates(this.templates, ctx);
+ ctx.bottom()[this.variable] = html;
+ }
+ *children() {
+ return this.templates;
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class CaseTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ this.elseTemplates = [];
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ this.elseTemplates = [];
+ let p = [];
+ let elseCount = 0;
+ const stream = parser.parseStream(remainTokens)
+ .on('tag:when', (token) => {
+ if (elseCount > 0) {
+ return;
+ }
+ p = [];
+ const values = [];
+ while (!token.tokenizer.end()) {
+ values.push(token.tokenizer.readValueOrThrow());
+ token.tokenizer.skipBlank();
+ if (token.tokenizer.peek() === ',') {
+ token.tokenizer.readTo(',');
+ }
+ else {
+ token.tokenizer.readTo('or');
+ }
+ }
+ this.branches.push({
+ values,
+ templates: p
+ });
+ })
+ .on('tag:else', () => {
+ elseCount++;
+ p = this.elseTemplates;
+ })
+ .on('tag:endcase', () => stream.stop())
+ .on('template', (tpl) => {
+ if (p !== this.elseTemplates || elseCount === 1) {
+ p.push(tpl);
+ }
+ })
+ .on('end', () => {
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf));
+ let branchHit = false;
+ for (const branch of this.branches) {
+ for (const valueToken of branch.values) {
+ const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf);
+ if (equals(target, value)) {
+ yield r.renderTemplates(branch.templates, ctx, emitter);
+ branchHit = true;
+ break;
+ }
+ }
+ }
+ if (!branchHit) {
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ }
+ }
+ *arguments() {
+ yield this.value;
+ yield* this.branches.flatMap(b => b.values);
+ }
+ *children() {
+ const templates = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+} + +class CommentTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endcomment')
+ return;
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ render() { }
+} + +class RenderTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const tokenizer = this.tokenizer;
+ this.file = parseFilePath(tokenizer, this.liquid, parser);
+ this.currentFile = token.file;
+ while (!tokenizer.end()) {
+ tokenizer.skipBlank();
+ const begin = tokenizer.p;
+ const keyword = tokenizer.readIdentifier();
+ if (keyword.content === 'with' || keyword.content === 'for') {
+ tokenizer.skipBlank();
+ // can be normal key/value pair, like "with: true"
+ if (tokenizer.peek() !== ':') {
+ const value = tokenizer.readValue();
+ // can be normal key, like "with,"
+ if (value) {
+ const beforeAs = tokenizer.p;
+ const asStr = tokenizer.readIdentifier();
+ let alias;
+ if (asStr.content === 'as')
+ alias = tokenizer.readIdentifier();
+ else
+ tokenizer.p = beforeAs;
+ this[keyword.content] = { value, alias: alias && alias.content };
+ tokenizer.skipBlank();
+ if (tokenizer.peek() === ',')
+ tokenizer.advance();
+ continue; // matched!
+ }
+ }
+ }
+ /**
+ * restore cursor if with/for not matched
+ */
+ tokenizer.p = begin;
+ break;
+ }
+ this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator);
+ }
+ *render(ctx, emitter) {
+ const { liquid, hash } = this;
+ const filepath = (yield renderFilePath(this['file'], ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const childCtx = ctx.spawn();
+ const scope = childCtx.bottom();
+ __assign(scope, yield hash.render(ctx));
+ if (this['with']) {
+ const { value, alias } = this['with'];
+ scope[alias || filepath] = yield evalToken(value, ctx);
+ }
+ if (this['for']) {
+ const { value, alias } = this['for'];
+ const collection = toEnumerable(yield evalToken(value, ctx));
+ scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias);
+ for (const item of collection) {
+ scope[alias] = item;
+ const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile']));
+ yield liquid.renderer.renderTemplates(templates, childCtx, emitter);
+ scope['forloop'].next();
+ }
+ }
+ else {
+ const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile']));
+ yield liquid.renderer.renderTemplates(templates, childCtx, emitter);
+ }
+ }
+ *children(partials, sync) {
+ if (partials && isString(this['file'])) {
+ return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile']));
+ }
+ return [];
+ }
+ partialScope() {
+ if (isString(this['file'])) {
+ const names = Object.keys(this.hash.hash);
+ if (this['with']) {
+ const { value, alias } = this['with'];
+ if (isString(alias)) {
+ names.push([alias, value]);
+ }
+ else if (isString(this.file)) {
+ names.push([this.file, value]);
+ }
+ }
+ if (this['for']) {
+ const { value, alias } = this['for'];
+ if (isString(alias)) {
+ names.push([alias, value]);
+ }
+ else if (isString(this.file)) {
+ names.push([this.file, value]);
+ }
+ }
+ return { name: this['file'], isolated: true, scope: names };
+ }
+ }
+ *arguments() {
+ for (const v of Object.values(this.hash.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ if (this['with']) {
+ const { value } = this['with'];
+ if (isValueToken(value)) {
+ yield value;
+ }
+ }
+ if (this['for']) {
+ const { value } = this['for'];
+ if (isValueToken(value)) {
+ yield value;
+ }
+ }
+ }
+}
+/**
+ * @return null for "none",
+ * @return Template[] for quoted with tags and/or filters
+ * @return Token for expression (not quoted)
+ * @throws TypeError if cannot read next token
+ */
+function parseFilePath(tokenizer, liquid, parser) {
+ if (liquid.options.dynamicPartials) {
+ const file = tokenizer.readValue();
+ tokenizer.assert(file, 'illegal file path');
+ if (file.getText() === 'none')
+ return;
+ if (isQuotedToken(file)) {
+ // for filenames like "files/{{file}}", eval as liquid template
+ const templates = parser.parse(evalQuotedToken(file));
+ return optimize(templates);
+ }
+ return file;
+ }
+ const tokens = [...tokenizer.readFileNameTemplate(liquid.options)];
+ const templates = optimize(parser.parseTokens(tokens));
+ return templates === 'none' ? undefined : templates;
+}
+function optimize(templates) {
+ // for filenames like "files/file.liquid", extract the string directly
+ if (templates.length === 1 && isHTMLToken(templates[0].token))
+ return templates[0].token.getContent();
+ return templates;
+}
+function* renderFilePath(file, ctx, liquid) {
+ if (typeof file === 'string')
+ return file;
+ if (Array.isArray(file))
+ return liquid.renderer.renderTemplates(file, ctx);
+ return yield evalToken(file, ctx);
+} + +class IncludeTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const { tokenizer } = token;
+ this['file'] = parseFilePath(tokenizer, this.liquid, parser);
+ this['currentFile'] = token.file;
+ const begin = tokenizer.p;
+ const withStr = tokenizer.readIdentifier();
+ if (withStr.content === 'with') {
+ tokenizer.skipBlank();
+ if (tokenizer.peek() !== ':') {
+ this.withVar = tokenizer.readValue();
+ }
+ else
+ tokenizer.p = begin;
+ }
+ else
+ tokenizer.p = begin;
+ this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator);
+ }
+ *render(ctx, emitter) {
+ const { liquid, hash, withVar } = this;
+ const { renderer } = liquid;
+ const filepath = (yield renderFilePath(this['file'], ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const saved = ctx.saveRegister('blocks', 'blockMode');
+ ctx.setRegister('blocks', {});
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ const scope = (yield hash.render(ctx));
+ if (withVar)
+ scope[filepath] = yield evalToken(withVar, ctx);
+ const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile']));
+ ctx.push(ctx.opts.jekyllInclude ? { include: scope } : scope);
+ yield renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ ctx.restoreRegister(saved);
+ }
+ *children(partials, sync) {
+ if (partials && isString(this['file'])) {
+ return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile']));
+ }
+ return [];
+ }
+ partialScope() {
+ if (isString(this['file'])) {
+ let names;
+ if (this.liquid.options.jekyllInclude) {
+ names = ['include'];
+ }
+ else {
+ names = Object.keys(this.hash.hash);
+ if (this.withVar) {
+ names.push([this['file'], this.withVar]);
+ }
+ }
+ return { name: this['file'], isolated: false, scope: names };
+ }
+ }
+ *arguments() {
+ yield* Object.values(this.hash.hash).filter(isValueToken);
+ if (isValueToken(this['file'])) {
+ yield this['file'];
+ }
+ if (isValueToken(this.withVar)) {
+ yield this.withVar;
+ }
+ }
+} + +class DecrementTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.variable = this.identifier.content;
+ }
+ render(context, emitter) {
+ const scope = context.environments;
+ if (!isNumber(scope[this.variable])) {
+ scope[this.variable] = 0;
+ }
+ emitter.write(stringify(--scope[this.variable]));
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class CycleTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.candidates = [];
+ const group = this.tokenizer.readValue();
+ this.tokenizer.skipBlank();
+ if (group) {
+ if (this.tokenizer.peek() === ':') {
+ this.group = group;
+ this.tokenizer.advance();
+ }
+ else
+ this.candidates.push(group);
+ }
+ while (!this.tokenizer.end()) {
+ const value = this.tokenizer.readValue();
+ if (value)
+ this.candidates.push(value);
+ this.tokenizer.readTo(',');
+ }
+ this.tokenizer.assert(this.candidates.length, () => `empty candidates: "${token.getText()}"`);
+ }
+ *render(ctx, emitter) {
+ const group = (yield evalToken(this.group, ctx));
+ const fingerprint = `cycle:${group}:` + this.candidates.join(',');
+ const groups = ctx.getRegister('cycle');
+ let idx = groups[fingerprint];
+ if (idx === undefined) {
+ idx = groups[fingerprint] = 0;
+ }
+ const candidate = this.candidates[idx];
+ idx = (idx + 1) % this.candidates.length;
+ groups[fingerprint] = idx;
+ return yield evalToken(candidate, ctx);
+ }
+ *arguments() {
+ yield* this.candidates;
+ if (this.group) {
+ yield this.group;
+ }
+ }
+} + +class IfTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ let p = [];
+ parser.parseStream(remainTokens)
+ .on('start', () => this.branches.push({
+ value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),
+ templates: (p = [])
+ }))
+ .on('tag:elsif', (token) => {
+ assert(!this.elseTemplates, 'unexpected elsif after else');
+ this.branches.push({
+ value: new Value(token.tokenizer.readFilteredValue(), this.liquid),
+ templates: (p = [])
+ });
+ })
+ .on('tag:else', tag => {
+ assertEmpty(tag.args);
+ assert(!this.elseTemplates, 'duplicated else');
+ p = this.elseTemplates = [];
+ })
+ .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); })
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); })
+ .start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ for (const { value, templates } of this.branches) {
+ const v = yield value.value(ctx, ctx.opts.lenientIf);
+ if (isTruthy(v, ctx)) {
+ yield r.renderTemplates(templates, ctx, emitter);
+ return;
+ }
+ }
+ yield r.renderTemplates(this.elseTemplates || [], ctx, emitter);
+ }
+ *children() {
+ const templates = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+ arguments() {
+ return this.branches.map(b => b.value);
+ }
+} + +class IncrementTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.variable = this.identifier.content;
+ }
+ render(context, emitter) {
+ const scope = context.environments;
+ if (!isNumber(scope[this.variable])) {
+ scope[this.variable] = 0;
+ }
+ const val = scope[this.variable];
+ scope[this.variable]++;
+ emitter.write(stringify(val));
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class LayoutTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ this.file = parseFilePath(this.tokenizer, this.liquid, parser);
+ this['currentFile'] = token.file;
+ this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = parser.parseTokens(remainTokens);
+ }
+ *render(ctx, emitter) {
+ const { liquid, args, file } = this;
+ const { renderer } = liquid;
+ if (file === undefined) {
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ yield renderer.renderTemplates(this.templates, ctx, emitter);
+ return;
+ }
+ const filepath = (yield renderFilePath(this.file, ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile']));
+ // render remaining contents and store rendered results
+ ctx.setRegister('blockMode', BlockMode.STORE);
+ const html = yield renderer.renderTemplates(this.templates, ctx);
+ const blocks = ctx.getRegister('blocks');
+ // set whole content to anonymous block if anonymous doesn't specified
+ if (blocks[''] === undefined)
+ blocks[''] = (parent, emitter) => emitter.write(html);
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ // render the layout file use stored blocks
+ ctx.push((yield args.render(ctx)));
+ yield renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ }
+ *children(partials) {
+ const templates = this.templates.slice();
+ if (partials && isString(this.file)) {
+ templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile'])));
+ }
+ return templates;
+ }
+ *arguments() {
+ for (const v of Object.values(this.args.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ if (isValueToken(this.file)) {
+ yield this.file;
+ }
+ }
+ partialScope() {
+ if (isString(this.file)) {
+ return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) };
+ }
+ }
+} + +class BlockTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ this.templates = [];
+ const match = /\w+/.exec(token.args);
+ this.block = match ? match[0] : '';
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endblock')
+ return;
+ const template = parser.parseToken(token, remainTokens);
+ this.templates.push(template);
+ }
+ throw new Error(`tag ${token.getText()} not closed`);
+ }
+ *render(ctx, emitter) {
+ const blockRender = this.getBlockRender(ctx);
+ if (ctx.getRegister('blockMode') === BlockMode.STORE) {
+ ctx.getRegister('blocks')[this.block] = blockRender;
+ }
+ else {
+ yield blockRender(new BlockDrop(), emitter);
+ }
+ }
+ getBlockRender(ctx) {
+ const { liquid, templates } = this;
+ const renderChild = ctx.getRegister('blocks')[this.block];
+ const renderCurrent = function* (superBlock, emitter) {
+ // add {{ block.super }} support when rendering
+ ctx.push({ block: superBlock });
+ yield liquid.renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ };
+ return renderChild
+ ? (superBlock, emitter) => renderChild(new BlockDrop((emitter) => renderCurrent(superBlock, emitter)), emitter)
+ : renderCurrent;
+ }
+ *children() {
+ return this.templates;
+ }
+ blockScope() {
+ return ['block'];
+ }
+} + +class RawTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ this.tokens = [];
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endraw')
+ return;
+ this.tokens.push(token);
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ render() {
+ return this.tokens.map((token) => token.getText()).join('');
+ }
+} + +class TablerowloopDrop extends ForloopDrop {
+ constructor(length, cols, collection, variable) {
+ super(length, collection, variable);
+ this.length = length;
+ this.cols = cols;
+ }
+ row() {
+ return Math.floor(this.i / this.cols) + 1;
+ }
+ col0() {
+ return (this.i % this.cols);
+ }
+ col() {
+ return this.col0() + 1;
+ }
+ col_first() {
+ return this.col0() === 0;
+ }
+ col_last() {
+ return this.col() === this.cols;
+ }
+} + +class TablerowTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ const variable = this.tokenizer.readIdentifier();
+ this.tokenizer.skipBlank();
+ const predicate = this.tokenizer.readIdentifier();
+ const collectionToken = this.tokenizer.readValue();
+ if (predicate.content !== 'in' || !collectionToken) {
+ throw new Error(`illegal tag: ${tagToken.getText()}`);
+ }
+ this.variable = variable.content;
+ this.collection = collectionToken;
+ this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = [];
+ let p;
+ const stream = parser.parseStream(remainTokens)
+ .on('start', () => (p = this.templates))
+ .on('tag:endtablerow', () => stream.stop())
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => {
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ let collection = toEnumerable(yield evalToken(this.collection, ctx));
+ const args = (yield this.args.render(ctx));
+ const offset = args.offset || 0;
+ const limit = (args.limit === undefined) ? collection.length : args.limit;
+ collection = collection.slice(offset, offset + limit);
+ const cols = args.cols || collection.length;
+ const r = this.liquid.renderer;
+ const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable);
+ const scope = { tablerowloop };
+ ctx.push(scope);
+ for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) {
+ scope[this.variable] = collection[idx];
+ if (tablerowloop.col0() === 0) {
+ if (tablerowloop.row() !== 1)
+ emitter.write('</tr>');
+ emitter.write(`<tr class="row${tablerowloop.row()}">`);
+ }
+ emitter.write(`<td class="col${tablerowloop.col()}">`);
+ yield r.renderTemplates(this.templates, ctx, emitter);
+ emitter.write('</td>');
+ }
+ if (collection.length)
+ emitter.write('</tr>');
+ ctx.pop();
+ }
+ *children() {
+ return this.templates;
+ }
+ *arguments() {
+ yield this.collection;
+ for (const v of Object.values(this.args.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ }
+ blockScope() {
+ return [this.variable, 'tablerowloop'];
+ }
+} + +class UnlessTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ this.elseTemplates = [];
+ let p = [];
+ let elseCount = 0;
+ parser.parseStream(remainTokens)
+ .on('start', () => this.branches.push({
+ value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),
+ test: isFalsy,
+ templates: (p = [])
+ }))
+ .on('tag:elsif', (token) => {
+ if (elseCount > 0) {
+ p = [];
+ return;
+ }
+ this.branches.push({
+ value: new Value(token.tokenizer.readFilteredValue(), this.liquid),
+ test: isTruthy,
+ templates: (p = [])
+ });
+ })
+ .on('tag:else', () => {
+ elseCount++;
+ p = this.elseTemplates;
+ })
+ .on('tag:endunless', function () { this.stop(); })
+ .on('template', (tpl) => {
+ if (p !== this.elseTemplates || elseCount === 1) {
+ p.push(tpl);
+ }
+ })
+ .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); })
+ .start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ for (const { value, test, templates } of this.branches) {
+ const v = yield value.value(ctx, ctx.opts.lenientIf);
+ if (test(v, ctx)) {
+ yield r.renderTemplates(templates, ctx, emitter);
+ return;
+ }
+ }
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ }
+ *children() {
+ const children = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ children.push(...this.elseTemplates);
+ }
+ return children;
+ }
+ arguments() {
+ return this.branches.map(b => b.value);
+ }
+} + +class BreakTag extends Tag {
+ render(ctx, _emitter) {
+ ctx.breakCalled = true;
+ }
+} + +class ContinueTag extends Tag {
+ render(ctx, _emitter) {
+ ctx.continueCalled = true;
+ }
+} + +class EchoTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.tokenizer.skipBlank();
+ if (!this.tokenizer.end()) {
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ }
+ }
+ *render(ctx, emitter) {
+ if (!this.value)
+ return;
+ const val = yield this.value.value(ctx, false);
+ emitter.write(val);
+ }
+ *arguments() {
+ if (this.value) {
+ yield this.value;
+ }
+ }
+} + +class LiquidTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options);
+ this.templates = parser.parseTokens(tokens);
+ }
+ *render(ctx, emitter) {
+ yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter);
+ }
+ *children() {
+ return this.templates;
+ }
+} + +class InlineCommentTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ if (tagToken.args.search(/\n\s*[^#\s]/g) !== -1) {
+ throw new Error('every line of an inline comment must start with a \'#\' character');
+ }
+ }
+ render() { }
+} + +const tags = {
+ assign: AssignTag,
+ 'for': ForTag,
+ capture: CaptureTag,
+ 'case': CaseTag,
+ comment: CommentTag,
+ include: IncludeTag,
+ render: RenderTag,
+ decrement: DecrementTag,
+ increment: IncrementTag,
+ cycle: CycleTag,
+ 'if': IfTag,
+ layout: LayoutTag,
+ block: BlockTag,
+ raw: RawTag,
+ tablerow: TablerowTag,
+ unless: UnlessTag,
+ 'break': BreakTag,
+ 'continue': ContinueTag,
+ echo: EchoTag,
+ liquid: LiquidTag,
+ '#': InlineCommentTag
+}; + +class Liquid {
+ constructor(opts = {}) {
+ this.renderer = new Render();
+ this.filters = {};
+ this.tags = {};
+ this.options = normalize(opts);
+ // eslint-disable-next-line deprecation/deprecation
+ this.parser = new Parser(this);
+ forOwn(tags, (conf, name) => this.registerTag(name, conf));
+ forOwn(filters, (handler, name) => this.registerFilter(name, handler));
+ }
+ parse(html, filepath) {
+ const parser = new Parser(this);
+ return parser.parse(html, filepath);
+ }
+ _render(tpl, scope, renderOptions) {
+ const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions);
+ return this.renderer.renderTemplates(tpl, ctx);
+ }
+ async render(tpl, scope, renderOptions) {
+ return toPromise(this._render(tpl, scope, { ...renderOptions, sync: false }));
+ }
+ renderSync(tpl, scope, renderOptions) {
+ return toValueSync(this._render(tpl, scope, { ...renderOptions, sync: true }));
+ }
+ renderToNodeStream(tpl, scope, renderOptions = {}) {
+ const ctx = new Context(scope, this.options, renderOptions);
+ return this.renderer.renderTemplatesToNodeStream(tpl, ctx);
+ }
+ _parseAndRender(html, scope, renderOptions) {
+ const tpl = this.parse(html);
+ return this._render(tpl, scope, renderOptions);
+ }
+ async parseAndRender(html, scope, renderOptions) {
+ return toPromise(this._parseAndRender(html, scope, { ...renderOptions, sync: false }));
+ }
+ parseAndRenderSync(html, scope, renderOptions) {
+ return toValueSync(this._parseAndRender(html, scope, { ...renderOptions, sync: true }));
+ }
+ _parsePartialFile(file, sync, currentFile) {
+ return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile);
+ }
+ _parseLayoutFile(file, sync, currentFile) {
+ return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile);
+ }
+ _parseFile(file, sync, lookupType, currentFile) {
+ return new Parser(this).parseFile(file, sync, lookupType, currentFile);
+ }
+ async parseFile(file, lookupType) {
+ return toPromise(new Parser(this).parseFile(file, false, lookupType));
+ }
+ parseFileSync(file, lookupType) {
+ return toValueSync(new Parser(this).parseFile(file, true, lookupType));
+ }
+ *_renderFile(file, ctx, renderFileOptions) {
+ const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType));
+ return yield this._render(templates, ctx, renderFileOptions);
+ }
+ async renderFile(file, ctx, renderFileOptions) {
+ return toPromise(this._renderFile(file, ctx, { ...renderFileOptions, sync: false }));
+ }
+ renderFileSync(file, ctx, renderFileOptions) {
+ return toValueSync(this._renderFile(file, ctx, { ...renderFileOptions, sync: true }));
+ }
+ async renderFileToNodeStream(file, scope, renderOptions) {
+ const templates = await this.parseFile(file);
+ return this.renderToNodeStream(templates, scope, renderOptions);
+ }
+ _evalValue(str, scope) {
+ const value = new Value(str, this);
+ const ctx = scope instanceof Context ? scope : new Context(scope, this.options);
+ return value.value(ctx);
+ }
+ async evalValue(str, scope) {
+ return toPromise(this._evalValue(str, scope));
+ }
+ evalValueSync(str, scope) {
+ return toValueSync(this._evalValue(str, scope));
+ }
+ registerFilter(name, filter) {
+ this.filters[name] = filter;
+ }
+ registerTag(name, tag) {
+ this.tags[name] = isFunction(tag) ? tag : createTagClass(tag);
+ }
+ plugin(plugin) {
+ return plugin.call(this, Liquid);
+ }
+ express() {
+ const self = this; // eslint-disable-line
+ let firstCall = true;
+ return function (filePath, ctx, callback) {
+ if (firstCall) {
+ firstCall = false;
+ const dirs = normalizeDirectoryList(this.root);
+ self.options.root.unshift(...dirs);
+ self.options.layouts.unshift(...dirs);
+ self.options.partials.unshift(...dirs);
+ }
+ self.renderFile(filePath, ctx).then(html => callback(null, html), callback);
+ };
+ }
+ async analyze(template, options = {}) {
+ return analyze(template, options);
+ }
+ analyzeSync(template, options = {}) {
+ return analyzeSync(template, options);
+ }
+ async parseAndAnalyze(html, filename, options = {}) {
+ return analyze(this.parse(html, filename), options);
+ }
+ parseAndAnalyzeSync(html, filename, options = {}) {
+ return analyzeSync(this.parse(html, filename), options);
+ }
+ /** Return an array of all variables without their properties. */
+ async variables(template, options = {}) {
+ const analysis = await analyze(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.variables);
+ }
+ /** Return an array of all variables without their properties. */
+ variablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.variables);
+ }
+ /** Return an array of all variables including their properties/paths. */
+ async fullVariables(template, options = {}) {
+ const analysis = await analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))));
+ }
+ /** Return an array of all variables including their properties/paths. */
+ fullVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))));
+ }
+ /** Return an array of all variables, each as an array of properties/segments. */
+ async variableSegments(template, options = {}) {
+ const analysis = await analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))));
+ }
+ /** Return an array of all variables, each as an array of properties/segments. */
+ variableSegmentsSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))));
+ }
+ /** Return an array of all expected context variables without their properties. */
+ async globalVariables(template, options = {}) {
+ const analysis = await analyze(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.globals);
+ }
+ /** Return an array of all expected context variables without their properties. */
+ globalVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.globals);
+ }
+ /** Return an array of all expected context variables including their properties/paths. */
+ async globalFullVariables(template, options = {}) {
+ const analysis = await analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))));
+ }
+ /** Return an array of all expected context variables including their properties/paths. */
+ globalFullVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))));
+ }
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ async globalVariableSegments(template, options = {}) {
+ const analysis = await analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))));
+ }
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ globalVariableSegmentsSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))));
+ }
+} + +/* istanbul ignore file */
+const version = '10.23.0'; + +exports.AssertionError = AssertionError; +exports.AssignTag = AssignTag; +exports.BlockTag = BlockTag; +exports.BreakTag = BreakTag; +exports.CaptureTag = CaptureTag; +exports.CaseTag = CaseTag; +exports.CommentTag = CommentTag; +exports.Context = Context; +exports.ContinueTag = ContinueTag; +exports.CycleTag = CycleTag; +exports.DecrementTag = DecrementTag; +exports.Drop = Drop; +exports.EchoTag = EchoTag; +exports.Expression = Expression; +exports.Filter = Filter; +exports.ForTag = ForTag; +exports.Hash = Hash; +exports.IfTag = IfTag; +exports.IncludeTag = IncludeTag; +exports.IncrementTag = IncrementTag; +exports.InlineCommentTag = InlineCommentTag; +exports.LayoutTag = LayoutTag; +exports.Liquid = Liquid; +exports.LiquidError = LiquidError; +exports.LiquidTag = LiquidTag; +exports.Output = Output; +exports.ParseError = ParseError; +exports.ParseStream = ParseStream; +exports.Parser = Parser; +exports.RawTag = RawTag; +exports.RenderError = RenderError; +exports.RenderTag = RenderTag; +exports.TablerowTag = TablerowTag; +exports.Tag = Tag; +exports.TagToken = TagToken; +exports.Token = Token; +exports.TokenizationError = TokenizationError; +exports.Tokenizer = Tokenizer; +exports.TypeGuards = typeGuards; +exports.UndefinedVariableError = UndefinedVariableError; +exports.UnlessTag = UnlessTag; +exports.Value = Value; +exports.Variable = Variable; +exports.analyze = analyze; +exports.analyzeSync = analyzeSync; +exports.assert = assert; +exports.createTrie = createTrie; +exports.defaultOperators = defaultOperators; +exports.defaultOptions = defaultOptions; +exports.evalQuotedToken = evalQuotedToken; +exports.evalToken = evalToken; +exports.filters = filters; +exports.isFalsy = isFalsy; +exports.isTruthy = isTruthy; +exports.tags = tags; +exports.toPromise = toPromise; +exports.toValue = toValue; +exports.toValueSync = toValueSync; +exports.version = version; diff --git a/node_modules/liquidjs/dist/liquid.node.mjs b/node_modules/liquidjs/dist/liquid.node.mjs new file mode 100644 index 0000000..62d8fda --- /dev/null +++ b/node_modules/liquidjs/dist/liquid.node.mjs @@ -0,0 +1,4950 @@ +/* + * liquidjs@10.23.0, https://github.com/harttle/liquidjs + * (c) 2016-2025 harttle + * Released under the MIT License. + */ +import { PassThrough } from 'stream'; +import { sep, extname, resolve as resolve$1, dirname as dirname$1 } from 'path'; +import { statSync, readFileSync as readFileSync$1, stat, readFile as readFile$1 } from 'fs'; +import { createRequire } from 'module'; + +class Token {
+ constructor(kind, input, begin, end, file) {
+ this.kind = kind;
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ }
+ getText() {
+ return this.input.slice(this.begin, this.end);
+ }
+ getPosition() {
+ let [row, col] = [1, 1];
+ for (let i = 0; i < this.begin; i++) {
+ if (this.input[i] === '\n') {
+ row++;
+ col = 1;
+ }
+ else
+ col++;
+ }
+ return [row, col];
+ }
+ size() {
+ return this.end - this.begin;
+ }
+} + +class Drop {
+ liquidMethodMissing(key, context) {
+ return undefined;
+ }
+} + +const toString$1 = Object.prototype.toString;
+const toLowerCase = String.prototype.toLowerCase;
+const hasOwnProperty = Object.hasOwnProperty;
+function isString(value) {
+ return typeof value === 'string';
+}
+// eslint-disable-next-line @typescript-eslint/ban-types
+function isFunction(value) {
+ return typeof value === 'function';
+}
+function isPromise(val) {
+ return val && isFunction(val.then);
+}
+function isIterator(val) {
+ return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return);
+}
+function escapeRegex(str) {
+ return str.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
+}
+function promisify(fn) {
+ return function (...args) {
+ return new Promise((resolve, reject) => {
+ fn(...args, (err, result) => {
+ err ? reject(err) : resolve(result);
+ });
+ });
+ };
+}
+function stringify(value) {
+ value = toValue(value);
+ if (isString(value))
+ return value;
+ if (isNil(value))
+ return '';
+ if (isArray(value))
+ return value.map(x => stringify(x)).join('');
+ return String(value);
+}
+function toEnumerable(val) {
+ val = toValue(val);
+ if (isArray(val))
+ return val;
+ if (isString(val) && val.length > 0)
+ return [val];
+ if (isIterable(val))
+ return Array.from(val);
+ if (isObject(val))
+ return Object.keys(val).map((key) => [key, val[key]]);
+ return [];
+}
+function toArray(val) {
+ val = toValue(val);
+ if (isNil(val))
+ return [];
+ if (isArray(val))
+ return val;
+ return [val];
+}
+function toValue(value) {
+ return (value instanceof Drop && isFunction(value.valueOf)) ? value.valueOf() : value;
+}
+function toNumber(value) {
+ return +toValue(value) || 0;
+}
+function isNumber(value) {
+ return typeof value === 'number';
+}
+function toLiquid(value) {
+ if (value && isFunction(value.toLiquid))
+ return toLiquid(value.toLiquid());
+ return value;
+}
+function isNil(value) {
+ return value == null;
+}
+function isUndefined(value) {
+ return value === undefined;
+}
+function isArray(value) {
+ // be compatible with IE 8
+ return toString$1.call(value) === '[object Array]';
+}
+function isArrayLike(value) {
+ return value && isNumber(value.length);
+}
+function isIterable(value) {
+ return isObject(value) && Symbol.iterator in value;
+}
+/*
+ * 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(obj, iteratee) {
+ obj = obj || {};
+ for (const k in obj) {
+ if (hasOwnProperty.call(obj, k)) {
+ if (iteratee(obj[k], k, obj) === false)
+ break;
+ }
+ }
+ return obj;
+}
+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) {
+ const type = typeof value;
+ return value !== null && (type === 'object' || type === 'function');
+}
+function range(start, stop, step = 1) {
+ const arr = [];
+ for (let i = start; i < stop; i += step) {
+ arr.push(i);
+ }
+ return arr;
+}
+function padStart(str, length, ch = ' ') {
+ return pad(str, length, ch, (str, ch) => ch + str);
+}
+function padEnd(str, length, ch = ' ') {
+ return pad(str, length, ch, (str, ch) => str + ch);
+}
+function pad(str, length, ch, add) {
+ str = String(str);
+ let n = length - str.length;
+ while (n-- > 0)
+ str = add(str, ch);
+ return str;
+}
+function identify(val) {
+ return val;
+}
+function changeCase(str) {
+ const hasLowerCase = [...str].some(ch => ch >= 'a' && ch <= 'z');
+ return hasLowerCase ? str.toUpperCase() : str.toLowerCase();
+}
+function ellipsis(str, N) {
+ return str.length > N ? str.slice(0, N - 3) + '...' : str;
+}
+// compare string in case-insensitive way, undefined values to the tail
+function caseInsensitiveCompare(a, b) {
+ if (a == null && b == null)
+ return 0;
+ if (a == null)
+ return 1;
+ if (b == null)
+ return -1;
+ a = toLowerCase.call(a);
+ b = toLowerCase.call(b);
+ if (a < b)
+ return -1;
+ if (a > b)
+ return 1;
+ return 0;
+}
+function argumentsToValue(fn) {
+ return function (...args) { return fn.call(this, ...args.map(toValue)); };
+}
+function argumentsToNumber(fn) {
+ return function (...args) { return fn.call(this, ...args.map(toNumber)); };
+}
+function escapeRegExp(text) {
+ return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
+}
+/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */
+function* strictUniq(array) {
+ const seen = new Set();
+ for (const element of array) {
+ const key = JSON.stringify(element);
+ if (!seen.has(key)) {
+ seen.add(key);
+ yield element;
+ }
+ }
+} + +/**
+ * targeting ES5, extends Error won't create a proper prototype chain, need a trait to keep track of classes
+ */
+const TRAIT = '__liquidClass__';
+class LiquidError extends Error {
+ constructor(err, token) {
+ /**
+ * note: for ES5 targeting, `this` will be replaced by return value of Error(),
+ * thus everything on `this` will be lost, avoid calling `LiquidError` methods here
+ */
+ super(typeof err === 'string' ? err : err.message);
+ this.context = '';
+ if (typeof err !== 'string')
+ Object.defineProperty(this, 'originalError', { value: err, enumerable: false });
+ Object.defineProperty(this, 'token', { value: token, enumerable: false });
+ Object.defineProperty(this, TRAIT, { value: 'LiquidError', enumerable: false });
+ }
+ update() {
+ Object.defineProperty(this, 'context', { value: mkContext(this.token), enumerable: false });
+ this.message = mkMessage(this.message, this.token);
+ this.stack = this.message + '\n' + this.context +
+ '\n' + this.stack;
+ if (this.originalError)
+ this.stack += '\nFrom ' + this.originalError.stack;
+ }
+ static is(obj) {
+ return (obj === null || obj === void 0 ? void 0 : obj[TRAIT]) === 'LiquidError';
+ }
+}
+class TokenizationError extends LiquidError {
+ constructor(message, token) {
+ super(message, token);
+ this.name = 'TokenizationError';
+ super.update();
+ }
+}
+class ParseError extends LiquidError {
+ constructor(err, token) {
+ super(err, token);
+ this.name = 'ParseError';
+ this.message = err.message;
+ super.update();
+ }
+}
+class RenderError extends LiquidError {
+ constructor(err, tpl) {
+ super(err, tpl.token);
+ this.name = 'RenderError';
+ this.message = err.message;
+ super.update();
+ }
+ static is(obj) {
+ return obj.name === 'RenderError';
+ }
+}
+class LiquidErrors extends LiquidError {
+ constructor(errors) {
+ super(errors[0], errors[0].token);
+ this.errors = errors;
+ this.name = 'LiquidErrors';
+ const s = errors.length > 1 ? 's' : '';
+ this.message = `${errors.length} error${s} found`;
+ super.update();
+ }
+ static is(obj) {
+ return obj.name === 'LiquidErrors';
+ }
+}
+class UndefinedVariableError extends LiquidError {
+ constructor(err, token) {
+ super(err, token);
+ this.name = 'UndefinedVariableError';
+ this.message = err.message;
+ super.update();
+ }
+}
+// only used internally; raised where we don't have token information,
+// so it can't be an UndefinedVariableError.
+class InternalUndefinedVariableError extends Error {
+ constructor(variableName) {
+ super(`undefined variable: ${variableName}`);
+ this.name = 'InternalUndefinedVariableError';
+ this.variableName = variableName;
+ }
+}
+class AssertionError extends Error {
+ constructor(message) {
+ super(message);
+ this.name = 'AssertionError';
+ this.message = message + '';
+ }
+}
+function mkContext(token) {
+ const [line, col] = token.getPosition();
+ const lines = token.input.split('\n');
+ const begin = Math.max(line - 2, 1);
+ const end = Math.min(line + 3, lines.length);
+ const context = range(begin, end + 1)
+ .map(lineNumber => {
+ const rowIndicator = (lineNumber === line) ? '>> ' : ' ';
+ const num = padStart(String(lineNumber), String(end).length);
+ let text = `${rowIndicator}${num}| `;
+ const colIndicator = lineNumber === line
+ ? '\n' + padStart('^', col + text.length)
+ : '';
+ text += lines[lineNumber - 1];
+ text += colIndicator;
+ return text;
+ })
+ .join('\n');
+ return context;
+}
+function mkMessage(msg, token) {
+ if (token.file)
+ msg += `, file:${token.file}`;
+ const [line, col] = token.getPosition();
+ msg += `, line:${line}, col:${col}`;
+ return msg;
+} + +// **DO NOT CHANGE THIS FILE**
+//
+// This file is generated by bin/character-gen.js
+// bitmask character types to boost performance
+const TYPES = [0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 4, 4, 4, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 2, 8, 0, 0, 0, 0, 8, 0, 0, 0, 64, 0, 65, 0, 0, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 0, 0, 2, 2, 2, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
+const WORD = 1;
+const BLANK = 4;
+const QUOTE = 8;
+const INLINE_BLANK = 16;
+const NUMBER = 32;
+const SIGN = 64;
+const PUNCTUATION = 128;
+function isWord(char) {
+ const code = char.charCodeAt(0);
+ return code >= 128 ? !TYPES[code] : !!(TYPES[code] & WORD);
+}
+TYPES[160] = TYPES[5760] = TYPES[6158] = TYPES[8192] = TYPES[8193] = TYPES[8194] = TYPES[8195] = TYPES[8196] = TYPES[8197] = TYPES[8198] = TYPES[8199] = TYPES[8200] = TYPES[8201] = TYPES[8202] = TYPES[8232] = TYPES[8233] = TYPES[8239] = TYPES[8287] = TYPES[12288] = BLANK;
+TYPES[8220] = TYPES[8221] = PUNCTUATION; + +function assert(predicate, message) {
+ if (!predicate) {
+ const msg = typeof message === 'function'
+ ? message()
+ : (message || `expect ${predicate} to be true`);
+ throw new AssertionError(msg);
+ }
+}
+function assertEmpty(predicate, message = `unexpected ${JSON.stringify(predicate)}`) {
+ assert(!predicate, message);
+} + +class NullDrop extends Drop {
+ equals(value) {
+ return isNil(toValue(value));
+ }
+ gt() {
+ return false;
+ }
+ geq() {
+ return false;
+ }
+ lt() {
+ return false;
+ }
+ leq() {
+ return false;
+ }
+ valueOf() {
+ return null;
+ }
+} + +class EmptyDrop extends Drop {
+ equals(value) {
+ if (value instanceof EmptyDrop)
+ return false;
+ value = toValue(value);
+ if (isString(value) || isArray(value))
+ return value.length === 0;
+ if (isObject(value))
+ return Object.keys(value).length === 0;
+ return false;
+ }
+ gt() {
+ return false;
+ }
+ geq() {
+ return false;
+ }
+ lt() {
+ return false;
+ }
+ leq() {
+ return false;
+ }
+ valueOf() {
+ return '';
+ }
+ static is(value) {
+ return value instanceof EmptyDrop;
+ }
+} + +class BlankDrop extends EmptyDrop {
+ equals(value) {
+ if (value === false)
+ return true;
+ if (isNil(toValue(value)))
+ return true;
+ if (isString(value))
+ return /^\s*$/.test(value);
+ return super.equals(value);
+ }
+ static is(value) {
+ return value instanceof BlankDrop;
+ }
+} + +class ForloopDrop extends Drop {
+ constructor(length, collection, variable) {
+ super();
+ this.i = 0;
+ this.length = length;
+ this.name = `${variable}-${collection}`;
+ }
+ next() {
+ this.i++;
+ }
+ index0() {
+ return this.i;
+ }
+ index() {
+ return this.i + 1;
+ }
+ first() {
+ return this.i === 0;
+ }
+ last() {
+ return this.i === this.length - 1;
+ }
+ rindex() {
+ return this.length - this.i;
+ }
+ rindex0() {
+ return this.length - this.i - 1;
+ }
+ valueOf() {
+ return JSON.stringify(this);
+ }
+} + +class SimpleEmitter {
+ constructor() {
+ this.buffer = '';
+ }
+ write(html) {
+ this.buffer += stringify(html);
+ }
+} + +class StreamedEmitter {
+ constructor() {
+ this.buffer = '';
+ this.stream = new PassThrough();
+ }
+ write(html) {
+ this.stream.write(stringify(html));
+ }
+ error(err) {
+ this.stream.emit('error', err);
+ }
+ end() {
+ this.stream.end();
+ }
+} + +class KeepingTypeEmitter {
+ constructor() {
+ this.buffer = '';
+ }
+ write(html) {
+ html = toValue(html);
+ // This will only preserve the type if the value is isolated.
+ // I.E:
+ // {{ my-port }} -> 42
+ // {{ my-host }}:{{ my-port }} -> 'host:42'
+ if (typeof html !== 'string' && this.buffer === '') {
+ this.buffer = html;
+ }
+ else {
+ this.buffer = stringify(this.buffer) + stringify(html);
+ }
+ }
+} + +class BlockDrop extends Drop {
+ constructor(
+ // the block render from layout template
+ superBlockRender = () => '') {
+ super();
+ this.superBlockRender = superBlockRender;
+ }
+ /**
+ * Provide parent access in child block by
+ * {{ block.super }}
+ */
+ *super() {
+ const emitter = new SimpleEmitter();
+ yield this.superBlockRender(emitter);
+ return emitter.buffer;
+ }
+} + +function isComparable(arg) {
+ return (arg &&
+ isFunction(arg.equals) &&
+ isFunction(arg.gt) &&
+ isFunction(arg.geq) &&
+ isFunction(arg.lt) &&
+ isFunction(arg.leq));
+} + +const nil = new NullDrop();
+const literalValues = {
+ 'true': true,
+ 'false': false,
+ 'nil': nil,
+ 'null': nil,
+ 'empty': new EmptyDrop(),
+ 'blank': new BlankDrop()
+}; + +function createTrie(input) {
+ const trie = {};
+ for (const [name, data] of Object.entries(input)) {
+ let node = trie;
+ for (let i = 0; i < name.length; i++) {
+ const c = name[i];
+ node[c] = node[c] || {};
+ if (i === name.length - 1 && isWord(name[i])) {
+ node[c].needBoundary = true;
+ }
+ node = node[c];
+ }
+ node.data = data;
+ node.end = true;
+ }
+ return trie;
+} + +/******************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+
+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) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ 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) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+} + +// convert an async iterator to a Promise
+function toPromise(val) {
+ return __awaiter(this, void 0, void 0, function* () {
+ if (!isIterator(val))
+ return val;
+ let value;
+ let done = false;
+ let next = 'next';
+ do {
+ const state = val[next](value);
+ done = state.done;
+ value = state.value;
+ next = 'next';
+ try {
+ if (isIterator(value))
+ value = toPromise(value);
+ if (isPromise(value))
+ value = yield value;
+ }
+ catch (err) {
+ next = 'throw';
+ value = err;
+ }
+ } while (!done);
+ return value;
+ });
+}
+// convert an async iterator to a value in a synchronous manner
+function toValueSync(val) {
+ if (!isIterator(val))
+ return val;
+ let value;
+ let done = false;
+ let next = 'next';
+ do {
+ const state = val[next](value);
+ done = state.done;
+ value = state.value;
+ next = 'next';
+ if (isIterator(value)) {
+ try {
+ value = toValueSync(value);
+ }
+ catch (err) {
+ next = 'throw';
+ value = err;
+ }
+ }
+ } while (!done);
+ return value;
+} + +const rFormat = /%([-_0^#:]+)?(\d+)?([EO])?(.)/;
+// prototype extensions
+function daysInMonth(d) {
+ const feb = isLeapYear(d) ? 29 : 28;
+ return [31, feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
+}
+function getDayOfYear(d) {
+ let num = 0;
+ for (let i = 0; i < d.getMonth(); ++i) {
+ num += daysInMonth(d)[i];
+ }
+ return num + d.getDate();
+}
+function getWeekOfYear(d, startDay) {
+ // Skip to startDay of this week
+ const now = getDayOfYear(d) + (startDay - d.getDay());
+ // Find the first startDay of the year
+ const jan1 = new Date(d.getFullYear(), 0, 1);
+ const then = (7 - jan1.getDay() + startDay);
+ return String(Math.floor((now - then) / 7) + 1);
+}
+function isLeapYear(d) {
+ const year = d.getFullYear();
+ return !!((year & 3) === 0 && (year % 100 || (year % 400 === 0 && year)));
+}
+function ordinal(d) {
+ const date = d.getDate();
+ if ([11, 12, 13].includes(date))
+ return 'th';
+ switch (date % 10) {
+ case 1: return 'st';
+ case 2: return 'nd';
+ case 3: return 'rd';
+ default: return 'th';
+ }
+}
+function century(d) {
+ return parseInt(d.getFullYear().toString().substring(0, 2), 10);
+}
+// default to 0
+const padWidths = {
+ d: 2,
+ e: 2,
+ H: 2,
+ I: 2,
+ j: 3,
+ k: 2,
+ l: 2,
+ L: 3,
+ m: 2,
+ M: 2,
+ S: 2,
+ U: 2,
+ W: 2
+};
+const padSpaceChars = new Set('aAbBceklpP');
+function getTimezoneOffset(d, opts) {
+ const nOffset = Math.abs(d.getTimezoneOffset());
+ const h = Math.floor(nOffset / 60);
+ const m = nOffset % 60;
+ return (d.getTimezoneOffset() > 0 ? '-' : '+') +
+ padStart(h, 2, '0') +
+ (opts.flags[':'] ? ':' : '') +
+ padStart(m, 2, '0');
+}
+const formatCodes = {
+ a: (d) => d.getShortWeekdayName(),
+ A: (d) => d.getLongWeekdayName(),
+ b: (d) => d.getShortMonthName(),
+ B: (d) => d.getLongMonthName(),
+ c: (d) => d.toLocaleString(),
+ C: (d) => century(d),
+ d: (d) => d.getDate(),
+ e: (d) => d.getDate(),
+ H: (d) => d.getHours(),
+ I: (d) => String(d.getHours() % 12 || 12),
+ j: (d) => getDayOfYear(d),
+ k: (d) => d.getHours(),
+ l: (d) => String(d.getHours() % 12 || 12),
+ L: (d) => d.getMilliseconds(),
+ m: (d) => d.getMonth() + 1,
+ M: (d) => d.getMinutes(),
+ N: (d, opts) => {
+ const width = Number(opts.width) || 9;
+ const str = String(d.getMilliseconds()).slice(0, width);
+ return padEnd(str, width, '0');
+ },
+ p: (d) => (d.getHours() < 12 ? 'AM' : 'PM'),
+ P: (d) => (d.getHours() < 12 ? 'am' : 'pm'),
+ q: (d) => ordinal(d),
+ s: (d) => Math.round(d.getTime() / 1000),
+ S: (d) => d.getSeconds(),
+ u: (d) => d.getDay() || 7,
+ U: (d) => getWeekOfYear(d, 0),
+ w: (d) => d.getDay(),
+ W: (d) => getWeekOfYear(d, 1),
+ x: (d) => d.toLocaleDateString(),
+ X: (d) => d.toLocaleTimeString(),
+ y: (d) => d.getFullYear().toString().slice(2, 4),
+ Y: (d) => d.getFullYear(),
+ z: getTimezoneOffset,
+ Z: (d, opts) => d.getTimeZoneName() || getTimezoneOffset(d, opts),
+ 't': () => '\t',
+ 'n': () => '\n',
+ '%': () => '%'
+};
+formatCodes.h = formatCodes.b;
+function strftime(d, formatStr) {
+ let output = '';
+ let remaining = formatStr;
+ let match;
+ while ((match = rFormat.exec(remaining))) {
+ output += remaining.slice(0, match.index);
+ remaining = remaining.slice(match.index + match[0].length);
+ output += format(d, match);
+ }
+ return output + remaining;
+}
+function format(d, match) {
+ const [input, flagStr = '', width, modifier, conversion] = match;
+ const convert = formatCodes[conversion];
+ if (!convert)
+ return input;
+ const flags = {};
+ for (const flag of flagStr)
+ flags[flag] = true;
+ let ret = String(convert(d, { flags, width, modifier }));
+ let padChar = padSpaceChars.has(conversion) ? ' ' : '0';
+ let padWidth = width || padWidths[conversion] || 0;
+ if (flags['^'])
+ ret = ret.toUpperCase();
+ else if (flags['#'])
+ ret = changeCase(ret);
+ if (flags['_'])
+ padChar = ' ';
+ else if (flags['0'])
+ padChar = '0';
+ if (flags['-'])
+ padWidth = 0;
+ return padStart(ret, padWidth, padChar);
+} + +function getDateTimeFormat() {
+ return (typeof Intl !== 'undefined' ? Intl.DateTimeFormat : undefined);
+} + +// one minute in milliseconds
+const OneMinute = 60000;
+/**
+ * Need support both ISO8601 and RFC2822 as in major browsers & NodeJS
+ * RFC2822: https://datatracker.ietf.org/doc/html/rfc2822#section-3.3
+ */
+const TIMEZONE_PATTERN = /([zZ]|([+-])(\d{2}):?(\d{2}))$/;
+const monthNames = [
+ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August',
+ 'September', 'October', 'November', 'December'
+];
+const monthNamesShort = monthNames.map(name => name.slice(0, 3));
+const dayNames = [
+ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
+];
+const dayNamesShort = dayNames.map(name => name.slice(0, 3));
+/**
+ * A date implementation with timezone info, just like Ruby date
+ *
+ * Implementation:
+ * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods
+ * - rewrite getTimezoneOffset() to trick strftime
+ */
+class LiquidDate {
+ constructor(init, locale, timezone) {
+ this.locale = locale;
+ this.DateTimeFormat = getDateTimeFormat();
+ this.date = new Date(init);
+ this.timezoneFixed = timezone !== undefined;
+ if (timezone === undefined) {
+ timezone = this.date.getTimezoneOffset();
+ }
+ this.timezoneOffset = isString(timezone) ? LiquidDate.getTimezoneOffset(timezone, this.date) : timezone;
+ this.timezoneName = isString(timezone) ? timezone : '';
+ const diff = (this.date.getTimezoneOffset() - this.timezoneOffset) * OneMinute;
+ const time = this.date.getTime() + diff;
+ this.displayDate = new Date(time);
+ }
+ getTime() {
+ return this.displayDate.getTime();
+ }
+ getMilliseconds() {
+ return this.displayDate.getMilliseconds();
+ }
+ getSeconds() {
+ return this.displayDate.getSeconds();
+ }
+ getMinutes() {
+ return this.displayDate.getMinutes();
+ }
+ getHours() {
+ return this.displayDate.getHours();
+ }
+ getDay() {
+ return this.displayDate.getDay();
+ }
+ getDate() {
+ return this.displayDate.getDate();
+ }
+ getMonth() {
+ return this.displayDate.getMonth();
+ }
+ getFullYear() {
+ return this.displayDate.getFullYear();
+ }
+ toLocaleString(locale, init) {
+ if (init === null || init === void 0 ? void 0 : init.timeZone) {
+ return this.date.toLocaleString(locale, init);
+ }
+ return this.displayDate.toLocaleString(locale, init);
+ }
+ toLocaleTimeString(locale) {
+ return this.displayDate.toLocaleTimeString(locale);
+ }
+ toLocaleDateString(locale) {
+ return this.displayDate.toLocaleDateString(locale);
+ }
+ getTimezoneOffset() {
+ return this.timezoneOffset;
+ }
+ getTimeZoneName() {
+ if (this.timezoneFixed)
+ return this.timezoneName;
+ if (!this.DateTimeFormat)
+ return;
+ return this.DateTimeFormat().resolvedOptions().timeZone;
+ }
+ getLongMonthName() {
+ var _a;
+ return (_a = this.format({ month: 'long' })) !== null && _a !== void 0 ? _a : monthNames[this.getMonth()];
+ }
+ getShortMonthName() {
+ var _a;
+ return (_a = this.format({ month: 'short' })) !== null && _a !== void 0 ? _a : monthNamesShort[this.getMonth()];
+ }
+ getLongWeekdayName() {
+ var _a;
+ return (_a = this.format({ weekday: 'long' })) !== null && _a !== void 0 ? _a : dayNames[this.displayDate.getDay()];
+ }
+ getShortWeekdayName() {
+ var _a;
+ return (_a = this.format({ weekday: 'short' })) !== null && _a !== void 0 ? _a : dayNamesShort[this.displayDate.getDay()];
+ }
+ valid() {
+ return !isNaN(this.getTime());
+ }
+ format(options) {
+ return this.DateTimeFormat && this.DateTimeFormat(this.locale, options).format(this.displayDate);
+ }
+ /**
+ * Create a Date object fixed to it's declared Timezone. Both
+ * - 2021-08-06T02:29:00.000Z and
+ * - 2021-08-06T02:29:00.000+08:00
+ * will always be displayed as
+ * - 2021-08-06 02:29:00
+ * regardless timezoneOffset in JavaScript realm
+ *
+ * The implementation hack:
+ * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,
+ * we create a different Date to trick strftime, it's both simpler and more performant.
+ * Given that a template is expected to be parsed fewer times than rendered.
+ */
+ static createDateFixedToTimezone(dateString, locale) {
+ const m = dateString.match(TIMEZONE_PATTERN);
+ // representing a UTC timestamp
+ if (m && m[1] === 'Z') {
+ return new LiquidDate(+new Date(dateString), locale, 0);
+ }
+ // has a timezone specified
+ if (m && m[2] && m[3] && m[4]) {
+ const [, , sign, hours, minutes] = m;
+ const offset = (sign === '+' ? -1 : 1) * (parseInt(hours, 10) * 60 + parseInt(minutes, 10));
+ return new LiquidDate(+new Date(dateString), locale, offset);
+ }
+ return new LiquidDate(dateString, locale);
+ }
+ static getTimezoneOffset(timezoneName, date) {
+ const localDateString = date.toLocaleString('en-US', { timeZone: timezoneName });
+ const utcDateString = date.toLocaleString('en-US', { timeZone: 'UTC' });
+ const localDate = new Date(localDateString);
+ const utcDate = new Date(utcDateString);
+ return (+utcDate - +localDate) / (60 * 1000);
+ }
+} + +class Limiter {
+ constructor(resource, limit) {
+ this.base = 0;
+ this.message = `${resource} limit exceeded`;
+ this.limit = limit;
+ }
+ use(count) {
+ count = +count || 0;
+ assert(this.base + count <= this.limit, this.message);
+ this.base += count;
+ }
+ check(count) {
+ count = +count || 0;
+ assert(count <= this.limit, this.message);
+ }
+} + +class DelimitedToken extends Token {
+ constructor(kind, [contentBegin, contentEnd], input, begin, end, trimLeft, trimRight, file) {
+ super(kind, input, begin, end, file);
+ this.trimLeft = false;
+ this.trimRight = false;
+ const tl = input[contentBegin] === '-';
+ const tr = input[contentEnd - 1] === '-';
+ let l = tl ? contentBegin + 1 : contentBegin;
+ let r = tr ? contentEnd - 1 : contentEnd;
+ while (l < r && (TYPES[input.charCodeAt(l)] & BLANK))
+ l++;
+ while (r > l && (TYPES[input.charCodeAt(r - 1)] & BLANK))
+ r--;
+ this.contentRange = [l, r];
+ this.trimLeft = tl || trimLeft;
+ this.trimRight = tr || trimRight;
+ }
+ get content() {
+ return this.input.slice(this.contentRange[0], this.contentRange[1]);
+ }
+} + +class TagToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ const { trimTagLeft, trimTagRight, tagDelimiterLeft, tagDelimiterRight } = options;
+ const [valueBegin, valueEnd] = [begin + tagDelimiterLeft.length, end - tagDelimiterRight.length];
+ super(TokenKind.Tag, [valueBegin, valueEnd], input, begin, end, trimTagLeft, trimTagRight, file);
+ this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange);
+ this.name = this.tokenizer.readTagName();
+ this.tokenizer.assert(this.name, `illegal tag syntax, tag name expected`);
+ this.tokenizer.skipBlank();
+ this.args = this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]);
+ }
+} + +class OutputToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ const { trimOutputLeft, trimOutputRight, outputDelimiterLeft, outputDelimiterRight } = options;
+ const valueRange = [begin + outputDelimiterLeft.length, end - outputDelimiterRight.length];
+ super(TokenKind.Output, valueRange, input, begin, end, trimOutputLeft, trimOutputRight, file);
+ }
+} + +class HTMLToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.HTML, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.trimLeft = 0;
+ this.trimRight = 0;
+ }
+ getContent() {
+ return this.input.slice(this.begin + this.trimLeft, this.end - this.trimRight);
+ }
+} + +class NumberToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Number, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = Number(this.getText());
+ }
+} + +class IdentifierToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Word, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = this.getText();
+ }
+} + +class LiteralToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Literal, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.literal = this.getText();
+ this.content = literalValues[this.literal];
+ }
+} + +const operatorPrecedences = {
+ '==': 2,
+ '!=': 2,
+ '>': 2,
+ '<': 2,
+ '>=': 2,
+ '<=': 2,
+ 'contains': 2,
+ 'not': 1,
+ 'and': 0,
+ 'or': 0
+};
+const operatorTypes = {
+ '==': 0 /* OperatorType.Binary */,
+ '!=': 0 /* OperatorType.Binary */,
+ '>': 0 /* OperatorType.Binary */,
+ '<': 0 /* OperatorType.Binary */,
+ '>=': 0 /* OperatorType.Binary */,
+ '<=': 0 /* OperatorType.Binary */,
+ 'contains': 0 /* OperatorType.Binary */,
+ 'not': 1 /* OperatorType.Unary */,
+ 'and': 0 /* OperatorType.Binary */,
+ 'or': 0 /* OperatorType.Binary */
+};
+class OperatorToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Operator, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.operator = this.getText();
+ }
+ getPrecedence() {
+ const key = this.getText();
+ return key in operatorPrecedences ? operatorPrecedences[key] : 1;
+ }
+} + +class PropertyAccessToken extends Token {
+ constructor(variable, props, input, begin, end, file) {
+ super(TokenKind.PropertyAccess, input, begin, end, file);
+ this.variable = variable;
+ this.props = props;
+ }
+} + +class FilterToken extends Token {
+ constructor(name, args, input, begin, end, file) {
+ super(TokenKind.Filter, input, begin, end, file);
+ this.name = name;
+ this.args = args;
+ }
+} + +class HashToken extends Token {
+ constructor(input, begin, end, name, value, file) {
+ super(TokenKind.Hash, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.name = name;
+ this.value = value;
+ this.file = file;
+ }
+} + +const rHex = /[\da-fA-F]/;
+const rOct = /[0-7]/;
+const escapeChar = {
+ b: '\b',
+ f: '\f',
+ n: '\n',
+ r: '\r',
+ t: '\t',
+ v: '\x0B'
+};
+function hexVal(c) {
+ const code = c.charCodeAt(0);
+ if (code >= 97)
+ return code - 87;
+ if (code >= 65)
+ return code - 55;
+ return code - 48;
+}
+function parseStringLiteral(str) {
+ let ret = '';
+ for (let i = 1; i < str.length - 1; i++) {
+ if (str[i] !== '\\') {
+ ret += str[i];
+ continue;
+ }
+ if (escapeChar[str[i + 1]] !== undefined) {
+ ret += escapeChar[str[++i]];
+ }
+ else if (str[i + 1] === 'u') {
+ let val = 0;
+ let j = i + 2;
+ while (j <= i + 5 && rHex.test(str[j])) {
+ val = val * 16 + hexVal(str[j++]);
+ }
+ i = j - 1;
+ ret += String.fromCharCode(val);
+ }
+ else if (!rOct.test(str[i + 1])) {
+ ret += str[++i];
+ }
+ else {
+ let j = i + 1;
+ let val = 0;
+ while (j <= i + 3 && rOct.test(str[j])) {
+ val = val * 8 + hexVal(str[j++]);
+ }
+ i = j - 1;
+ ret += String.fromCharCode(val);
+ }
+ }
+ return ret;
+} + +class QuotedToken extends Token {
+ constructor(input, begin, end, file) {
+ super(TokenKind.Quoted, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ this.content = parseStringLiteral(this.getText());
+ }
+} + +class RangeToken extends Token {
+ constructor(input, begin, end, lhs, rhs, file) {
+ super(TokenKind.Range, input, begin, end, file);
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.lhs = lhs;
+ this.rhs = rhs;
+ this.file = file;
+ }
+} + +/**
+ * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`
+ */
+class LiquidTagToken extends DelimitedToken {
+ constructor(input, begin, end, options, file) {
+ super(TokenKind.Tag, [begin, end], input, begin, end, false, false, file);
+ this.tokenizer = new Tokenizer(input, options.operators, file, this.contentRange);
+ this.name = this.tokenizer.readTagName();
+ this.tokenizer.assert(this.name, 'illegal liquid tag syntax');
+ this.tokenizer.skipBlank();
+ }
+ get args() {
+ return this.tokenizer.input.slice(this.tokenizer.p, this.contentRange[1]);
+ }
+} + +/**
+ * value expression with optional filters
+ * e.g.
+ * {% assign foo="bar" | append: "coo" %}
+ */
+class FilteredValueToken extends Token {
+ constructor(initial, filters, input, begin, end, file) {
+ super(TokenKind.FilteredValue, input, begin, end, file);
+ this.initial = initial;
+ this.filters = filters;
+ this.input = input;
+ this.begin = begin;
+ this.end = end;
+ this.file = file;
+ }
+} + +const polyfill = {
+ now: () => Date.now()
+};
+function getPerformance() {
+ return (typeof global === 'object' && global.performance) ||
+ (typeof window === 'object' && window.performance) ||
+ polyfill;
+} + +class Render {
+ renderTemplatesToNodeStream(templates, ctx) {
+ const emitter = new StreamedEmitter();
+ Promise.resolve().then(() => toPromise(this.renderTemplates(templates, ctx, emitter)))
+ .then(() => emitter.end(), err => emitter.error(err));
+ return emitter.stream;
+ }
+ *renderTemplates(templates, ctx, emitter) {
+ if (!emitter) {
+ emitter = ctx.opts.keepOutputType ? new KeepingTypeEmitter() : new SimpleEmitter();
+ }
+ const errors = [];
+ for (const tpl of templates) {
+ ctx.renderLimit.check(getPerformance().now());
+ try {
+ // if tpl.render supports emitter, it'll return empty `html`
+ const html = yield tpl.render(ctx, emitter);
+ // if not, it'll return an `html`, write to the emitter for it
+ html && emitter.write(html);
+ if (ctx.breakCalled || ctx.continueCalled)
+ break;
+ }
+ catch (e) {
+ const err = LiquidError.is(e) ? e : new RenderError(e, tpl);
+ if (ctx.opts.catchAllErrors)
+ errors.push(err);
+ else
+ throw err;
+ }
+ }
+ if (errors.length) {
+ throw new LiquidErrors(errors);
+ }
+ return emitter.buffer;
+ }
+} + +class Expression {
+ constructor(tokens) {
+ this.postfix = [...toPostfix(tokens)];
+ }
+ *evaluate(ctx, lenient) {
+ assert(ctx, 'unable to evaluate: context not defined');
+ const operands = [];
+ for (const token of this.postfix) {
+ if (isOperatorToken(token)) {
+ const r = operands.pop();
+ let result;
+ if (operatorTypes[token.operator] === 1 /* OperatorType.Unary */) {
+ result = yield ctx.opts.operators[token.operator](r, ctx);
+ }
+ else {
+ const l = operands.pop();
+ result = yield ctx.opts.operators[token.operator](l, r, ctx);
+ }
+ operands.push(result);
+ }
+ else {
+ operands.push(yield evalToken(token, ctx, lenient));
+ }
+ }
+ return operands[0];
+ }
+ valid() {
+ return !!this.postfix.length;
+ }
+}
+function* evalToken(token, ctx, lenient = false) {
+ if (!token)
+ return;
+ if ('content' in token)
+ return token.content;
+ if (isPropertyAccessToken(token))
+ return yield evalPropertyAccessToken(token, ctx, lenient);
+ if (isRangeToken(token))
+ return yield evalRangeToken(token, ctx);
+}
+function* evalPropertyAccessToken(token, ctx, lenient) {
+ const props = [];
+ for (const prop of token.props) {
+ props.push((yield evalToken(prop, ctx, false)));
+ }
+ try {
+ if (token.variable) {
+ const variable = yield evalToken(token.variable, ctx, lenient);
+ return yield ctx._getFromScope(variable, props);
+ }
+ else {
+ return yield ctx._get(props);
+ }
+ }
+ catch (e) {
+ if (lenient && e.name === 'InternalUndefinedVariableError')
+ return null;
+ throw (new UndefinedVariableError(e, token));
+ }
+}
+function evalQuotedToken(token) {
+ return token.content;
+}
+function* evalRangeToken(token, ctx) {
+ const low = yield evalToken(token.lhs, ctx);
+ const high = yield evalToken(token.rhs, ctx);
+ ctx.memoryLimit.use(high - low + 1);
+ return range(+low, +high + 1);
+}
+function* toPostfix(tokens) {
+ const ops = [];
+ for (const token of tokens) {
+ if (isOperatorToken(token)) {
+ while (ops.length && ops[ops.length - 1].getPrecedence() > token.getPrecedence()) {
+ yield ops.pop();
+ }
+ ops.push(token);
+ }
+ else
+ yield token;
+ }
+ while (ops.length) {
+ yield ops.pop();
+ }
+} + +function isTruthy(val, ctx) {
+ return !isFalsy(val, ctx);
+}
+function isFalsy(val, ctx) {
+ val = toValue(val);
+ if (ctx.opts.jsTruthy) {
+ return !val;
+ }
+ else {
+ return val === false || undefined === val || val === null;
+ }
+} + +const defaultOperators = {
+ '==': equals,
+ '!=': (l, r) => !equals(l, r),
+ '>': (l, r) => {
+ if (isComparable(l))
+ return l.gt(r);
+ if (isComparable(r))
+ return r.lt(l);
+ return toValue(l) > toValue(r);
+ },
+ '<': (l, r) => {
+ if (isComparable(l))
+ return l.lt(r);
+ if (isComparable(r))
+ return r.gt(l);
+ return toValue(l) < toValue(r);
+ },
+ '>=': (l, r) => {
+ if (isComparable(l))
+ return l.geq(r);
+ if (isComparable(r))
+ return r.leq(l);
+ return toValue(l) >= toValue(r);
+ },
+ '<=': (l, r) => {
+ if (isComparable(l))
+ return l.leq(r);
+ if (isComparable(r))
+ return r.geq(l);
+ return toValue(l) <= toValue(r);
+ },
+ 'contains': (l, r) => {
+ l = toValue(l);
+ if (isArray(l))
+ return l.some((i) => equals(i, r));
+ if (isFunction(l === null || l === void 0 ? void 0 : l.indexOf))
+ return l.indexOf(toValue(r)) > -1;
+ return false;
+ },
+ 'not': (v, ctx) => isFalsy(toValue(v), ctx),
+ 'and': (l, r, ctx) => isTruthy(toValue(l), ctx) && isTruthy(toValue(r), ctx),
+ 'or': (l, r, ctx) => isTruthy(toValue(l), ctx) || isTruthy(toValue(r), ctx)
+};
+function equals(lhs, rhs) {
+ if (isComparable(lhs))
+ return lhs.equals(rhs);
+ if (isComparable(rhs))
+ return rhs.equals(lhs);
+ lhs = toValue(lhs);
+ rhs = toValue(rhs);
+ if (isArray(lhs)) {
+ return isArray(rhs) && arrayEquals(lhs, rhs);
+ }
+ return lhs === rhs;
+}
+function arrayEquals(lhs, rhs) {
+ if (lhs.length !== rhs.length)
+ return false;
+ return !lhs.some((value, i) => !equals(value, rhs[i]));
+}
+function arrayIncludes(arr, item) {
+ return arr.some(value => equals(value, item));
+} + +class Node {
+ constructor(key, value, next, prev) {
+ this.key = key;
+ this.value = value;
+ this.next = next;
+ this.prev = prev;
+ }
+}
+class LRU {
+ constructor(limit, size = 0) {
+ this.limit = limit;
+ this.size = size;
+ this.cache = {};
+ this.head = new Node('HEAD', null, null, null);
+ this.tail = new Node('TAIL', null, null, null);
+ this.head.next = this.tail;
+ this.tail.prev = this.head;
+ }
+ write(key, value) {
+ if (this.cache[key]) {
+ this.cache[key].value = value;
+ }
+ else {
+ const node = new Node(key, value, this.head.next, this.head);
+ this.head.next.prev = node;
+ this.head.next = node;
+ this.cache[key] = node;
+ this.size++;
+ this.ensureLimit();
+ }
+ }
+ read(key) {
+ if (!this.cache[key])
+ return;
+ const { value } = this.cache[key];
+ this.remove(key);
+ this.write(key, value);
+ return value;
+ }
+ remove(key) {
+ const node = this.cache[key];
+ node.prev.next = node.next;
+ node.next.prev = node.prev;
+ delete this.cache[key];
+ this.size--;
+ }
+ clear() {
+ this.head.next = this.tail;
+ this.tail.prev = this.head;
+ this.size = 0;
+ this.cache = {};
+ }
+ ensureLimit() {
+ if (this.size > this.limit)
+ this.remove(this.tail.prev.key);
+ }
+} + +function requireResolve (file) { + const require = createRequire(process.cwd() + '/'); + return require.resolve(file) +} + +const statAsync = promisify(stat);
+const readFileAsync = promisify(readFile$1);
+function exists(filepath) {
+ return __awaiter(this, void 0, void 0, function* () {
+ try {
+ yield statAsync(filepath);
+ return true;
+ }
+ catch (err) {
+ return false;
+ }
+ });
+}
+function readFile(filepath) {
+ return readFileAsync(filepath, 'utf8');
+}
+function existsSync(filepath) {
+ try {
+ statSync(filepath);
+ return true;
+ }
+ catch (err) {
+ return false;
+ }
+}
+function readFileSync(filepath) {
+ return readFileSync$1(filepath, 'utf8');
+}
+function resolve(root, file, ext) {
+ if (!extname(file))
+ file += ext;
+ return resolve$1(root, file);
+}
+function fallback(file) {
+ try {
+ return requireResolve(file);
+ }
+ catch (e) { }
+}
+function dirname(filepath) {
+ return dirname$1(filepath);
+}
+function contains(root, file) {
+ root = resolve$1(root);
+ root = root.endsWith(sep) ? root : root + sep;
+ return file.startsWith(root);
+} + +var fs = /*#__PURE__*/Object.freeze({ + __proto__: null, + exists: exists, + readFile: readFile, + existsSync: existsSync, + readFileSync: readFileSync, + resolve: resolve, + fallback: fallback, + dirname: dirname, + contains: contains, + sep: sep +}); + +function defaultFilter(value, defaultValue, ...args) {
+ value = toValue(value);
+ if (isArray(value) || isString(value))
+ return value.length ? value : defaultValue;
+ if (value === false && (new Map(args)).get('allow_false'))
+ return false;
+ return isFalsy(value, this.context) ? defaultValue : value;
+}
+function json(value, space = 0) {
+ return JSON.stringify(value, null, space);
+}
+function inspect(value, space = 0) {
+ const ancestors = [];
+ return JSON.stringify(value, function (_key, value) {
+ if (typeof value !== 'object' || value === null)
+ return value;
+ // `this` is the object that value is contained in, i.e., its direct parent.
+ while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this)
+ ancestors.pop();
+ if (ancestors.includes(value))
+ return '[Circular]';
+ ancestors.push(value);
+ return value;
+ }, space);
+}
+function to_integer(value) {
+ return Number(value);
+}
+const raw = {
+ raw: true,
+ handler: identify
+};
+var misc = {
+ default: defaultFilter,
+ raw,
+ jsonify: json,
+ to_integer,
+ json,
+ inspect
+}; + +const escapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ "'": '''
+};
+const unescapeMap = {
+ '&': '&',
+ '<': '<',
+ '>': '>',
+ '"': '"',
+ ''': "'"
+};
+function escape(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/&|<|>|"|'/g, m => escapeMap[m]);
+}
+function xml_escape(str) {
+ return escape.call(this, str);
+}
+function unescape(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/&(amp|lt|gt|#34|#39);/g, m => unescapeMap[m]);
+}
+function escape_once(str) {
+ return escape.call(this, unescape.call(this, str));
+}
+function newline_to_br(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\r?\n/gm, '<br />\n');
+}
+function strip_html(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/<script[\s\S]*?<\/script>|<style[\s\S]*?<\/style>|<.*?>|<!--[\s\S]*?-->/g, '');
+} + +var htmlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + escape: escape, + xml_escape: xml_escape, + escape_once: escape_once, + newline_to_br: newline_to_br, + strip_html: strip_html +}); + +class MapFS {
+ constructor(mapping) {
+ this.mapping = mapping;
+ this.sep = '/';
+ }
+ exists(filepath) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.existsSync(filepath);
+ });
+ }
+ existsSync(filepath) {
+ return !isNil(this.mapping[filepath]);
+ }
+ readFile(filepath) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return this.readFileSync(filepath);
+ });
+ }
+ readFileSync(filepath) {
+ const content = this.mapping[filepath];
+ if (isNil(content))
+ throw new Error(`ENOENT: ${filepath}`);
+ return content;
+ }
+ dirname(filepath) {
+ const segments = filepath.split(this.sep);
+ segments.pop();
+ return segments.join(this.sep);
+ }
+ resolve(dir, file, ext) {
+ file += ext;
+ if (dir === '.')
+ return file;
+ const segments = dir.split(/\/+/);
+ for (const segment of file.split(this.sep)) {
+ if (segment === '.' || segment === '')
+ continue;
+ else if (segment === '..') {
+ if (segments.length > 1 || segments[0] !== '')
+ segments.pop();
+ }
+ else
+ segments.push(segment);
+ }
+ return segments.join(this.sep);
+ }
+} + +const defaultOptions = {
+ root: ['.'],
+ layouts: ['.'],
+ partials: ['.'],
+ relativeReference: true,
+ jekyllInclude: false,
+ keyValueSeparator: ':',
+ cache: undefined,
+ extname: '',
+ fs: fs,
+ dynamicPartials: true,
+ jsTruthy: false,
+ dateFormat: '%A, %B %-e, %Y at %-l:%M %P %z',
+ locale: '',
+ trimTagRight: false,
+ trimTagLeft: false,
+ trimOutputRight: false,
+ trimOutputLeft: false,
+ greedy: true,
+ tagDelimiterLeft: '{%',
+ tagDelimiterRight: '%}',
+ outputDelimiterLeft: '{{',
+ outputDelimiterRight: '}}',
+ preserveTimezones: false,
+ strictFilters: false,
+ strictVariables: false,
+ ownPropertyOnly: true,
+ lenientIf: false,
+ globals: {},
+ keepOutputType: false,
+ operators: defaultOperators,
+ memoryLimit: Infinity,
+ parseLimit: Infinity,
+ renderLimit: Infinity
+};
+function normalize(options) {
+ var _a, _b;
+ if (options.hasOwnProperty('root')) {
+ if (!options.hasOwnProperty('partials'))
+ options.partials = options.root;
+ if (!options.hasOwnProperty('layouts'))
+ options.layouts = options.root;
+ }
+ if (options.hasOwnProperty('cache')) {
+ let cache;
+ if (typeof options.cache === 'number')
+ cache = options.cache > 0 ? new LRU(options.cache) : undefined;
+ else if (typeof options.cache === 'object')
+ cache = options.cache;
+ else
+ cache = options.cache ? new LRU(1024) : undefined;
+ options.cache = cache;
+ }
+ options = Object.assign(Object.assign(Object.assign({}, defaultOptions), (options.jekyllInclude ? { dynamicPartials: false } : {})), options);
+ if ((!options.fs.dirname || !options.fs.sep) && options.relativeReference) {
+ console.warn('[LiquidJS] `fs.dirname` and `fs.sep` are required for relativeReference, set relativeReference to `false` to suppress this warning');
+ options.relativeReference = false;
+ }
+ options.root = normalizeDirectoryList(options.root);
+ options.partials = normalizeDirectoryList(options.partials);
+ options.layouts = normalizeDirectoryList(options.layouts);
+ options.outputEscape = options.outputEscape && getOutputEscapeFunction(options.outputEscape);
+ if (!options.locale) {
+ options.locale = (_b = (_a = getDateTimeFormat()) === null || _a === void 0 ? void 0 : _a().resolvedOptions().locale) !== null && _b !== void 0 ? _b : 'en-US';
+ }
+ if (options.templates) {
+ options.fs = new MapFS(options.templates);
+ options.relativeReference = true;
+ options.root = options.partials = options.layouts = '.';
+ }
+ return options;
+}
+function getOutputEscapeFunction(nameOrFunction) {
+ if (nameOrFunction === 'escape')
+ return escape;
+ if (nameOrFunction === 'json')
+ return misc.json;
+ assert(isFunction(nameOrFunction), '`outputEscape` need to be of type string or function');
+ return nameOrFunction;
+}
+function normalizeDirectoryList(value) {
+ let list = [];
+ if (isArray(value))
+ list = value;
+ if (isString(value))
+ list = [value];
+ return list;
+} + +function whiteSpaceCtrl(tokens, options) {
+ let inRaw = false;
+ for (let i = 0; i < tokens.length; i++) {
+ const token = tokens[i];
+ if (!isDelimitedToken(token))
+ continue;
+ if (!inRaw && token.trimLeft) {
+ trimLeft(tokens[i - 1], options.greedy);
+ }
+ if (isTagToken(token)) {
+ if (token.name === 'raw')
+ inRaw = true;
+ else if (token.name === 'endraw')
+ inRaw = false;
+ }
+ if (!inRaw && token.trimRight) {
+ trimRight(tokens[i + 1], options.greedy);
+ }
+ }
+}
+function trimLeft(token, greedy) {
+ if (!token || !isHTMLToken(token))
+ return;
+ const mask = greedy ? BLANK : INLINE_BLANK;
+ while (TYPES[token.input.charCodeAt(token.end - 1 - token.trimRight)] & mask)
+ token.trimRight++;
+}
+function trimRight(token, greedy) {
+ if (!token || !isHTMLToken(token))
+ return;
+ const mask = greedy ? BLANK : INLINE_BLANK;
+ while (TYPES[token.input.charCodeAt(token.begin + token.trimLeft)] & mask)
+ token.trimLeft++;
+ if (token.input.charAt(token.begin + token.trimLeft) === '\n')
+ token.trimLeft++;
+} + +class Tokenizer {
+ constructor(input, operators = defaultOptions.operators, file, range) {
+ this.input = input;
+ this.file = file;
+ this.rawBeginAt = -1;
+ this.p = range ? range[0] : 0;
+ this.N = range ? range[1] : input.length;
+ this.opTrie = createTrie(operators);
+ this.literalTrie = createTrie(literalValues);
+ }
+ readExpression() {
+ return new Expression(this.readExpressionTokens());
+ }
+ *readExpressionTokens() {
+ while (this.p < this.N) {
+ const operator = this.readOperator();
+ if (operator) {
+ yield operator;
+ continue;
+ }
+ const operand = this.readValue();
+ if (operand) {
+ yield operand;
+ continue;
+ }
+ return;
+ }
+ }
+ readOperator() {
+ this.skipBlank();
+ const end = this.matchTrie(this.opTrie);
+ if (end === -1)
+ return;
+ return new OperatorToken(this.input, this.p, (this.p = end), this.file);
+ }
+ matchTrie(trie) {
+ let node = trie;
+ let i = this.p;
+ let info;
+ while (node[this.input[i]] && i < this.N) {
+ node = node[this.input[i++]];
+ if (node['end'])
+ info = node;
+ }
+ if (!info)
+ return -1;
+ if (info['needBoundary'] && isWord(this.peek(i - this.p)))
+ return -1;
+ return i;
+ }
+ readFilteredValue() {
+ const begin = this.p;
+ const initial = this.readExpression();
+ this.assert(initial.valid(), `invalid value expression: ${this.snapshot()}`);
+ const filters = this.readFilters();
+ return new FilteredValueToken(initial, filters, this.input, begin, this.p, this.file);
+ }
+ readFilters() {
+ const filters = [];
+ while (true) {
+ const filter = this.readFilter();
+ if (!filter)
+ return filters;
+ filters.push(filter);
+ }
+ }
+ readFilter() {
+ this.skipBlank();
+ if (this.end())
+ return null;
+ this.assert(this.read() === '|', `expected "|" before filter`);
+ const name = this.readIdentifier();
+ if (!name.size()) {
+ this.assert(this.end(), `expected filter name`);
+ return null;
+ }
+ const args = [];
+ this.skipBlank();
+ if (this.peek() === ':') {
+ do {
+ ++this.p;
+ const arg = this.readFilterArg();
+ arg && args.push(arg);
+ this.skipBlank();
+ this.assert(this.end() || this.peek() === ',' || this.peek() === '|', () => `unexpected character ${this.snapshot()}`);
+ } while (this.peek() === ',');
+ }
+ else if (this.peek() === '|' || this.end()) ;
+ else {
+ throw this.error('expected ":" after filter name');
+ }
+ return new FilterToken(name.getText(), args, this.input, name.begin, this.p, this.file);
+ }
+ readFilterArg() {
+ const key = this.readValue();
+ if (!key)
+ return;
+ this.skipBlank();
+ if (this.peek() !== ':')
+ return key;
+ ++this.p;
+ const value = this.readValue();
+ return [key.getText(), value];
+ }
+ readTopLevelTokens(options = defaultOptions) {
+ const tokens = [];
+ while (this.p < this.N) {
+ const token = this.readTopLevelToken(options);
+ tokens.push(token);
+ }
+ whiteSpaceCtrl(tokens, options);
+ return tokens;
+ }
+ readTopLevelToken(options) {
+ const { tagDelimiterLeft, outputDelimiterLeft } = options;
+ if (this.rawBeginAt > -1)
+ return this.readEndrawOrRawContent(options);
+ if (this.match(tagDelimiterLeft))
+ return this.readTagToken(options);
+ if (this.match(outputDelimiterLeft))
+ return this.readOutputToken(options);
+ return this.readHTMLToken([tagDelimiterLeft, outputDelimiterLeft]);
+ }
+ readHTMLToken(stopStrings) {
+ const begin = this.p;
+ while (this.p < this.N) {
+ if (stopStrings.some(str => this.match(str)))
+ break;
+ ++this.p;
+ }
+ return new HTMLToken(this.input, begin, this.p, this.file);
+ }
+ readTagToken(options) {
+ const { file, input } = this;
+ const begin = this.p;
+ if (this.readToDelimiter(options.tagDelimiterRight) === -1) {
+ throw this.error(`tag ${this.snapshot(begin)} not closed`, begin);
+ }
+ const token = new TagToken(input, begin, this.p, options, file);
+ if (token.name === 'raw')
+ this.rawBeginAt = begin;
+ return token;
+ }
+ readToDelimiter(delimiter, respectQuoted = false) {
+ this.skipBlank();
+ while (this.p < this.N) {
+ if (respectQuoted && (this.peekType() & QUOTE)) {
+ this.readQuoted();
+ continue;
+ }
+ ++this.p;
+ if (this.rmatch(delimiter))
+ return this.p;
+ }
+ return -1;
+ }
+ readOutputToken(options = defaultOptions) {
+ const { file, input } = this;
+ const { outputDelimiterRight } = options;
+ const begin = this.p;
+ if (this.readToDelimiter(outputDelimiterRight, true) === -1) {
+ throw this.error(`output ${this.snapshot(begin)} not closed`, begin);
+ }
+ return new OutputToken(input, begin, this.p, options, file);
+ }
+ readEndrawOrRawContent(options) {
+ const { tagDelimiterLeft, tagDelimiterRight } = options;
+ const begin = this.p;
+ let leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length;
+ while (this.p < this.N) {
+ if (this.readIdentifier().getText() !== 'endraw') {
+ leftPos = this.readTo(tagDelimiterLeft) - tagDelimiterLeft.length;
+ continue;
+ }
+ while (this.p <= this.N) {
+ if (this.rmatch(tagDelimiterRight)) {
+ const end = this.p;
+ if (begin === leftPos) {
+ this.rawBeginAt = -1;
+ return new TagToken(this.input, begin, end, options, this.file);
+ }
+ else {
+ this.p = leftPos;
+ return new HTMLToken(this.input, begin, leftPos, this.file);
+ }
+ }
+ if (this.rmatch(tagDelimiterLeft))
+ break;
+ this.p++;
+ }
+ }
+ throw this.error(`raw ${this.snapshot(this.rawBeginAt)} not closed`, begin);
+ }
+ readLiquidTagTokens(options = defaultOptions) {
+ const tokens = [];
+ while (this.p < this.N) {
+ const token = this.readLiquidTagToken(options);
+ token && tokens.push(token);
+ }
+ return tokens;
+ }
+ readLiquidTagToken(options) {
+ this.skipBlank();
+ if (this.end())
+ return;
+ const begin = this.p;
+ this.readToDelimiter('\n');
+ const end = this.p;
+ return new LiquidTagToken(this.input, begin, end, options, this.file);
+ }
+ error(msg, pos = this.p) {
+ return new TokenizationError(msg, new IdentifierToken(this.input, pos, this.N, this.file));
+ }
+ assert(pred, msg, pos) {
+ if (!pred)
+ throw this.error(typeof msg === 'function' ? msg() : msg, pos);
+ }
+ snapshot(begin = this.p) {
+ return JSON.stringify(ellipsis(this.input.slice(begin, this.N), 32));
+ }
+ /**
+ * @deprecated use #readIdentifier instead
+ */
+ readWord() {
+ return this.readIdentifier();
+ }
+ readIdentifier() {
+ this.skipBlank();
+ const begin = this.p;
+ while (!this.end() && isWord(this.peek()))
+ ++this.p;
+ return new IdentifierToken(this.input, begin, this.p, this.file);
+ }
+ readNonEmptyIdentifier() {
+ const id = this.readIdentifier();
+ return id.size() ? id : undefined;
+ }
+ readTagName() {
+ this.skipBlank();
+ // Handle inline comment tags
+ if (this.input[this.p] === '#')
+ return this.input.slice(this.p, ++this.p);
+ return this.readIdentifier().getText();
+ }
+ readHashes(jekyllStyle) {
+ const hashes = [];
+ while (true) {
+ const hash = this.readHash(jekyllStyle);
+ if (!hash)
+ return hashes;
+ hashes.push(hash);
+ }
+ }
+ readHash(jekyllStyle) {
+ this.skipBlank();
+ if (this.peek() === ',')
+ ++this.p;
+ const begin = this.p;
+ const name = this.readNonEmptyIdentifier();
+ if (!name)
+ return;
+ let value;
+ this.skipBlank();
+ const sep = isString(jekyllStyle) ? jekyllStyle : (jekyllStyle ? '=' : ':');
+ if (this.peek() === sep) {
+ ++this.p;
+ value = this.readValue();
+ }
+ return new HashToken(this.input, begin, this.p, name, value, this.file);
+ }
+ remaining() {
+ return this.input.slice(this.p, this.N);
+ }
+ advance(step = 1) {
+ this.p += step;
+ }
+ end() {
+ return this.p >= this.N;
+ }
+ read() {
+ return this.input[this.p++];
+ }
+ readTo(end) {
+ while (this.p < this.N) {
+ ++this.p;
+ if (this.rmatch(end))
+ return this.p;
+ }
+ return -1;
+ }
+ readValue() {
+ this.skipBlank();
+ const begin = this.p;
+ const variable = this.readLiteral() || this.readQuoted() || this.readRange() || this.readNumber();
+ const props = this.readProperties(!variable);
+ if (!props.length)
+ return variable;
+ return new PropertyAccessToken(variable, props, this.input, begin, this.p);
+ }
+ readScopeValue() {
+ this.skipBlank();
+ const begin = this.p;
+ const props = this.readProperties();
+ if (!props.length)
+ return undefined;
+ return new PropertyAccessToken(undefined, props, this.input, begin, this.p);
+ }
+ readProperties(isBegin = true) {
+ const props = [];
+ while (true) {
+ if (this.peek() === '[') {
+ this.p++;
+ const prop = this.readValue() || new IdentifierToken(this.input, this.p, this.p, this.file);
+ this.assert(this.readTo(']') !== -1, '[ not closed');
+ props.push(prop);
+ continue;
+ }
+ if (isBegin && !props.length) {
+ const prop = this.readNonEmptyIdentifier();
+ if (prop) {
+ props.push(prop);
+ continue;
+ }
+ }
+ if (this.peek() === '.' && this.peek(1) !== '.') { // skip range syntax
+ this.p++;
+ const prop = this.readNonEmptyIdentifier();
+ if (!prop)
+ break;
+ props.push(prop);
+ continue;
+ }
+ break;
+ }
+ return props;
+ }
+ readNumber() {
+ this.skipBlank();
+ let decimalFound = false;
+ let digitFound = false;
+ let n = 0;
+ if (this.peekType() & SIGN)
+ n++;
+ while (this.p + n <= this.N) {
+ if (this.peekType(n) & NUMBER) {
+ digitFound = true;
+ n++;
+ }
+ else if (this.peek(n) === '.' && this.peek(n + 1) !== '.') {
+ if (decimalFound || !digitFound)
+ return;
+ decimalFound = true;
+ n++;
+ }
+ else
+ break;
+ }
+ if (digitFound && !isWord(this.peek(n))) {
+ const num = new NumberToken(this.input, this.p, this.p + n, this.file);
+ this.advance(n);
+ return num;
+ }
+ }
+ readLiteral() {
+ this.skipBlank();
+ const end = this.matchTrie(this.literalTrie);
+ if (end === -1)
+ return;
+ const literal = new LiteralToken(this.input, this.p, end, this.file);
+ this.p = end;
+ return literal;
+ }
+ readRange() {
+ this.skipBlank();
+ const begin = this.p;
+ if (this.peek() !== '(')
+ return;
+ ++this.p;
+ const lhs = this.readValueOrThrow();
+ this.skipBlank();
+ this.assert(this.read() === '.' && this.read() === '.', 'invalid range syntax');
+ const rhs = this.readValueOrThrow();
+ this.skipBlank();
+ this.assert(this.read() === ')', 'invalid range syntax');
+ return new RangeToken(this.input, begin, this.p, lhs, rhs, this.file);
+ }
+ readValueOrThrow() {
+ const value = this.readValue();
+ this.assert(value, () => `unexpected token ${this.snapshot()}, value expected`);
+ return value;
+ }
+ readQuoted() {
+ this.skipBlank();
+ const begin = this.p;
+ if (!(this.peekType() & QUOTE))
+ return;
+ ++this.p;
+ let escaped = false;
+ while (this.p < this.N) {
+ ++this.p;
+ if (this.input[this.p - 1] === this.input[begin] && !escaped)
+ break;
+ if (escaped)
+ escaped = false;
+ else if (this.input[this.p - 1] === '\\')
+ escaped = true;
+ }
+ return new QuotedToken(this.input, begin, this.p, this.file);
+ }
+ *readFileNameTemplate(options) {
+ const { outputDelimiterLeft } = options;
+ const htmlStopStrings = [',', ' ', outputDelimiterLeft];
+ const htmlStopStringSet = new Set(htmlStopStrings);
+ // break on ',' and ' ', outputDelimiterLeft only stops HTML token
+ while (this.p < this.N && !htmlStopStringSet.has(this.peek())) {
+ yield this.match(outputDelimiterLeft)
+ ? this.readOutputToken(options)
+ : this.readHTMLToken(htmlStopStrings);
+ }
+ }
+ match(word) {
+ for (let i = 0; i < word.length; i++) {
+ if (word[i] !== this.input[this.p + i])
+ return false;
+ }
+ return true;
+ }
+ rmatch(pattern) {
+ for (let i = 0; i < pattern.length; i++) {
+ if (pattern[pattern.length - 1 - i] !== this.input[this.p - 1 - i])
+ return false;
+ }
+ return true;
+ }
+ peekType(n = 0) {
+ return this.p + n >= this.N ? 0 : TYPES[this.input.charCodeAt(this.p + n)];
+ }
+ peek(n = 0) {
+ return this.p + n >= this.N ? '' : this.input[this.p + n];
+ }
+ skipBlank() {
+ while (this.peekType() & BLANK)
+ ++this.p;
+ }
+} + +class ParseStream {
+ constructor(tokens, parseToken) {
+ this.handlers = {};
+ this.stopRequested = false;
+ this.tokens = tokens;
+ this.parseToken = parseToken;
+ }
+ on(name, cb) {
+ this.handlers[name] = cb;
+ return this;
+ }
+ trigger(event, arg) {
+ const h = this.handlers[event];
+ return h ? (h.call(this, arg), true) : false;
+ }
+ start() {
+ this.trigger('start');
+ let token;
+ while (!this.stopRequested && (token = this.tokens.shift())) {
+ if (this.trigger('token', token))
+ continue;
+ if (isTagToken(token) && this.trigger(`tag:${token.name}`, token)) {
+ continue;
+ }
+ const template = this.parseToken(token, this.tokens);
+ this.trigger('template', template);
+ }
+ if (!this.stopRequested)
+ this.trigger('end');
+ return this;
+ }
+ stop() {
+ this.stopRequested = true;
+ return this;
+ }
+} + +class TemplateImpl {
+ constructor(token) {
+ this.token = token;
+ }
+} + +class Tag extends TemplateImpl {
+ constructor(token, remainTokens, liquid) {
+ super(token);
+ this.name = token.name;
+ this.liquid = liquid;
+ this.tokenizer = token.tokenizer;
+ }
+} + +/**
+ * Key-Value Pairs Representing Tag Arguments
+ * Example:
+ * For the markup `, foo:'bar', coo:2 reversed %}`,
+ * hash['foo'] === 'bar'
+ * hash['coo'] === 2
+ * hash['reversed'] === undefined
+ */
+class Hash {
+ constructor(input, jekyllStyle) {
+ this.hash = {};
+ const tokenizer = input instanceof Tokenizer ? input : new Tokenizer(input, {});
+ for (const hash of tokenizer.readHashes(jekyllStyle)) {
+ this.hash[hash.name.content] = hash.value;
+ }
+ }
+ *render(ctx) {
+ const hash = {};
+ for (const key of Object.keys(this.hash)) {
+ hash[key] = this.hash[key] === undefined ? true : yield evalToken(this.hash[key], ctx);
+ }
+ return hash;
+ }
+} + +function createTagClass(options) {
+ return class extends Tag {
+ constructor(token, tokens, liquid) {
+ super(token, tokens, liquid);
+ if (isFunction(options.parse)) {
+ options.parse.call(this, token, tokens);
+ }
+ }
+ *render(ctx, emitter) {
+ const hash = (yield new Hash(this.token.args, ctx.opts.keyValueSeparator).render(ctx));
+ return yield options.render.call(this, ctx, emitter, hash);
+ }
+ };
+} + +function isKeyValuePair(arr) {
+ return isArray(arr);
+} + +class Filter {
+ constructor(token, options, liquid) {
+ this.token = token;
+ this.name = token.name;
+ this.handler = isFunction(options)
+ ? options
+ : (isFunction(options === null || options === void 0 ? void 0 : options.handler) ? options.handler : identify);
+ this.raw = !isFunction(options) && !!(options === null || options === void 0 ? void 0 : options.raw);
+ this.args = token.args;
+ this.liquid = liquid;
+ }
+ *render(value, context) {
+ const argv = [];
+ for (const arg of this.args) {
+ if (isKeyValuePair(arg))
+ argv.push([arg[0], yield evalToken(arg[1], context)]);
+ else
+ argv.push(yield evalToken(arg, context));
+ }
+ return yield this.handler.apply({ context, token: this.token, liquid: this.liquid }, [value, ...argv]);
+ }
+} + +class Value {
+ /**
+ * @param str the value to be valuated, eg.: "foobar" | truncate: 3
+ */
+ constructor(input, liquid) {
+ this.filters = [];
+ const token = typeof input === 'string'
+ ? new Tokenizer(input, liquid.options.operators).readFilteredValue()
+ : input;
+ this.initial = token.initial;
+ this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid));
+ }
+ *value(ctx, lenient) {
+ lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default');
+ let val = yield this.initial.evaluate(ctx, lenient);
+ for (const filter of this.filters) {
+ val = yield filter.render(val, ctx);
+ }
+ return val;
+ }
+ getFilter(liquid, name) {
+ const impl = liquid.filters[name];
+ assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`);
+ return impl;
+ }
+} + +class Output extends TemplateImpl {
+ constructor(token, liquid) {
+ var _a;
+ super(token);
+ const tokenizer = new Tokenizer(token.input, liquid.options.operators, token.file, token.contentRange);
+ this.value = new Value(tokenizer.readFilteredValue(), liquid);
+ const filters = this.value.filters;
+ const outputEscape = liquid.options.outputEscape;
+ if (!((_a = filters[filters.length - 1]) === null || _a === void 0 ? void 0 : _a.raw) && outputEscape) {
+ const token = new FilterToken(toString.call(outputEscape), [], '', 0, 0);
+ filters.push(new Filter(token, outputEscape, liquid));
+ }
+ }
+ *render(ctx, emitter) {
+ const val = yield this.value.value(ctx, false);
+ emitter.write(val);
+ }
+ *arguments() {
+ yield this.value;
+ }
+} + +class HTML extends TemplateImpl {
+ constructor(token) {
+ super(token);
+ this.str = token.getContent();
+ }
+ *render(ctx, emitter) {
+ emitter.write(this.str);
+ }
+} + +/**
+ * A variable's segments and location, which can be coerced to a string.
+ */
+class Variable {
+ constructor(segments, location) {
+ this.segments = segments;
+ this.location = location;
+ }
+ toString() {
+ return segmentsString(this.segments, true);
+ }
+ /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */
+ toArray() {
+ function* _visit(...segments) {
+ for (const segment of segments) {
+ if (segment instanceof Variable) {
+ yield Array.from(_visit(...segment.segments));
+ }
+ else {
+ yield segment;
+ }
+ }
+ }
+ return Array.from(_visit(...this.segments));
+ }
+}
+/**
+ * Group variables by the string representation of their root segment.
+ */
+class VariableMap {
+ constructor() {
+ this.map = new Map();
+ }
+ get(key) {
+ const k = segmentsString([key.segments[0]]);
+ if (!this.map.has(k)) {
+ this.map.set(k, []);
+ }
+ return this.map.get(k);
+ }
+ has(key) {
+ return this.map.has(segmentsString([key.segments[0]]));
+ }
+ push(variable) {
+ this.get(variable).push(variable);
+ }
+ asObject() {
+ return Object.fromEntries(this.map);
+ }
+}
+const defaultStaticAnalysisOptions = {
+ partials: true
+};
+function* _analyze(templates, partials, sync) {
+ const variables = new VariableMap();
+ const globals = new VariableMap();
+ const locals = new VariableMap();
+ const rootScope = new DummyScope(new Set());
+ // Names of partial templates that we've already analyzed.
+ const seen = new Set();
+ function updateVariables(variable, scope) {
+ variables.push(variable);
+ const aliased = scope.alias(variable);
+ if (aliased !== undefined) {
+ const root = aliased.segments[0];
+ // TODO: What if a a template renders a rendered template? Do we need scope.parent?
+ if (isString(root) && !rootScope.has(root)) {
+ globals.push(aliased);
+ }
+ }
+ else {
+ const root = variable.segments[0];
+ if (isString(root) && !scope.has(root)) {
+ globals.push(variable);
+ }
+ }
+ // Recurse for nested Variables
+ for (const segment of variable.segments) {
+ if (segment instanceof Variable) {
+ updateVariables(segment, scope);
+ }
+ }
+ }
+ function* visit(template, scope) {
+ if (template.arguments) {
+ for (const arg of template.arguments()) {
+ for (const variable of extractVariables(arg)) {
+ updateVariables(variable, scope);
+ }
+ }
+ }
+ if (template.localScope) {
+ for (const ident of template.localScope()) {
+ scope.add(ident.content);
+ scope.deleteAlias(ident.content);
+ const [row, col] = ident.getPosition();
+ locals.push(new Variable([ident.content], { row, col, file: ident.file }));
+ }
+ }
+ if (template.children) {
+ if (template.partialScope) {
+ const partial = template.partialScope();
+ if (partial === undefined) {
+ // Layouts, for example, can have children that are not partials.
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, scope);
+ }
+ return;
+ }
+ if (seen.has(partial.name))
+ return;
+ const partialScopeNames = new Set();
+ const partialScope = partial.isolated
+ ? new DummyScope(partialScopeNames)
+ : scope.push(partialScopeNames);
+ for (const name of partial.scope) {
+ if (isString(name)) {
+ partialScopeNames.add(name);
+ }
+ else {
+ const [alias, argument] = name;
+ partialScopeNames.add(alias);
+ const variables = Array.from(extractVariables(argument));
+ if (variables.length) {
+ partialScope.setAlias(alias, variables[0].segments);
+ }
+ }
+ }
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, partialScope);
+ seen.add(partial.name);
+ }
+ partialScope.pop();
+ }
+ else {
+ if (template.blockScope) {
+ scope.push(new Set(template.blockScope()));
+ }
+ for (const child of (yield template.children(partials, sync))) {
+ yield visit(child, scope);
+ }
+ if (template.blockScope) {
+ scope.pop();
+ }
+ }
+ }
+ }
+ for (const template of templates) {
+ yield visit(template, rootScope);
+ }
+ return {
+ variables: variables.asObject(),
+ globals: globals.asObject(),
+ locals: locals.asObject()
+ };
+}
+/**
+ * Statically analyze a template and report variable usage.
+ */
+function analyze(template, options = {}) {
+ const opts = Object.assign(Object.assign({}, defaultStaticAnalysisOptions), options);
+ return toPromise(_analyze(template, opts.partials, false));
+}
+/**
+ * Statically analyze a template and report variable usage.
+ */
+function analyzeSync(template, options = {}) {
+ const opts = Object.assign(Object.assign({}, defaultStaticAnalysisOptions), options);
+ return toValueSync(_analyze(template, opts.partials, true));
+}
+/**
+ * A stack to manage scopes while traversing templates during static analysis.
+ */
+class DummyScope {
+ constructor(globals) {
+ this.stack = [{ names: globals, aliases: new Map() }];
+ }
+ /** Return true if `name` is in scope. */
+ has(name) {
+ for (const scope of this.stack) {
+ if (scope.names.has(name)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ push(scope) {
+ this.stack.push({ names: scope, aliases: new Map() });
+ return this;
+ }
+ pop() {
+ var _a;
+ return (_a = this.stack.pop()) === null || _a === void 0 ? void 0 : _a.names;
+ }
+ // Add a name to the template scope.
+ add(name) {
+ this.stack[0].names.add(name);
+ }
+ /** Return the variable that `variable` aliases, or `variable` if it doesn't alias anything. */
+ alias(variable) {
+ const root = variable.segments[0];
+ if (!isString(root))
+ return undefined;
+ const alias = this.getAlias(root);
+ if (alias === undefined)
+ return undefined;
+ return new Variable([...alias, ...variable.segments.slice(1)], variable.location);
+ }
+ // TODO: `from` could be a path with multiple segments, like `include.x`.
+ setAlias(from, to) {
+ this.stack[this.stack.length - 1].aliases.set(from, to);
+ }
+ deleteAlias(name) {
+ this.stack[this.stack.length - 1].aliases.delete(name);
+ }
+ getAlias(name) {
+ for (const scope of this.stack) {
+ if (scope.aliases.has(name)) {
+ return scope.aliases.get(name);
+ }
+ // If a scope has defined `name`, then it masks aliases in parent scopes.
+ if (scope.names.has(name)) {
+ return undefined;
+ }
+ }
+ return undefined;
+ }
+}
+function* extractVariables(value) {
+ if (isValueToken(value)) {
+ yield* extractValueTokenVariables(value);
+ }
+ else if (value instanceof Value) {
+ yield* extractFilteredValueVariables(value);
+ }
+}
+function* extractFilteredValueVariables(value) {
+ for (const token of value.initial.postfix) {
+ if (isValueToken(token)) {
+ yield* extractValueTokenVariables(token);
+ }
+ }
+ for (const filter of value.filters) {
+ for (const arg of filter.args) {
+ if (isKeyValuePair(arg) && arg[1]) {
+ yield* extractValueTokenVariables(arg[1]);
+ }
+ else if (isValueToken(arg)) {
+ yield* extractValueTokenVariables(arg);
+ }
+ }
+ }
+}
+function* extractValueTokenVariables(token) {
+ if (isRangeToken(token)) {
+ yield* extractValueTokenVariables(token.lhs);
+ yield* extractValueTokenVariables(token.rhs);
+ }
+ else if (isPropertyAccessToken(token)) {
+ yield extractPropertyAccessVariable(token);
+ }
+}
+function extractPropertyAccessVariable(token) {
+ const segments = [];
+ // token is not guaranteed to have `file` set. We'll try to get it from a prop if not.
+ let file = token.file;
+ // Here we're flattening the first segment of a path if it is a nested path.
+ const root = token.props[0];
+ file = file || root.file;
+ if (isQuotedToken(root) || isNumberToken(root) || isWordToken(root)) {
+ segments.push(root.content);
+ }
+ else if (isPropertyAccessToken(root)) {
+ // Flatten paths that start with a nested path.
+ segments.push(...extractPropertyAccessVariable(root).segments);
+ }
+ for (const prop of token.props.slice(1)) {
+ file = file || prop.file;
+ if (isQuotedToken(prop) || isNumberToken(prop) || isWordToken(prop)) {
+ segments.push(prop.content);
+ }
+ else if (isPropertyAccessToken(prop)) {
+ segments.push(extractPropertyAccessVariable(prop));
+ }
+ }
+ const [row, col] = token.getPosition();
+ return new Variable(segments, {
+ row,
+ col,
+ file
+ });
+}
+// This is used to detect segments that can be represented with dot notation
+// when creating a string representation of VariableSegments.
+const RE_PROPERTY = /^[\u0080-\uFFFFa-zA-Z_][\u0080-\uFFFFa-zA-Z0-9_-]*$/;
+/**
+ * Return a string representation of segments using dot notation where possible.
+ * @param segments - The property names and array indices that make up a path to a variable.
+ * @param bracketedRoot - If false (the default), don't surround the root segment with square brackets.
+ */
+function segmentsString(segments, bracketedRoot = false) {
+ const buf = [];
+ const root = segments[0];
+ if (isString(root)) {
+ if (!bracketedRoot || root.match(RE_PROPERTY)) {
+ buf.push(`${root}`);
+ }
+ else {
+ buf.push(`['${root}']`);
+ }
+ }
+ for (const segment of segments.slice(1)) {
+ if (segment instanceof Variable) {
+ buf.push(`[${segmentsString(segment.segments)}]`);
+ }
+ else if (isString(segment)) {
+ if (segment.match(RE_PROPERTY)) {
+ buf.push(`.${segment}`);
+ }
+ else {
+ buf.push(`['${segment}']`);
+ }
+ }
+ else {
+ buf.push(`[${segment}]`);
+ }
+ }
+ return buf.join('');
+} + +var LookupType;
+(function (LookupType) {
+ LookupType["Partials"] = "partials";
+ LookupType["Layouts"] = "layouts";
+ LookupType["Root"] = "root";
+})(LookupType || (LookupType = {}));
+class Loader {
+ constructor(options) {
+ this.options = options;
+ if (options.relativeReference) {
+ const sep = options.fs.sep;
+ assert(sep, '`fs.sep` is required for relative reference');
+ const rRelativePath = new RegExp(['.' + sep, '..' + sep, './', '../'].map(prefix => escapeRegex(prefix)).join('|'));
+ this.shouldLoadRelative = (referencedFile) => rRelativePath.test(referencedFile);
+ }
+ else {
+ this.shouldLoadRelative = (_referencedFile) => false;
+ }
+ this.contains = this.options.fs.contains || (() => true);
+ }
+ *lookup(file, type, sync, currentFile) {
+ const { fs } = this.options;
+ const dirs = this.options[type];
+ for (const filepath of this.candidates(file, dirs, currentFile, type !== LookupType.Root)) {
+ if (sync ? fs.existsSync(filepath) : yield fs.exists(filepath))
+ return filepath;
+ }
+ throw this.lookupError(file, dirs);
+ }
+ *candidates(file, dirs, currentFile, enforceRoot) {
+ const { fs, extname } = this.options;
+ if (this.shouldLoadRelative(file) && currentFile) {
+ const referenced = fs.resolve(this.dirname(currentFile), file, extname);
+ for (const dir of dirs) {
+ if (!enforceRoot || this.contains(dir, referenced)) {
+ // the relatively referenced file is within one of root dirs
+ yield referenced;
+ break;
+ }
+ }
+ }
+ for (const dir of dirs) {
+ const referenced = fs.resolve(dir, file, extname);
+ if (!enforceRoot || this.contains(dir, referenced)) {
+ yield referenced;
+ }
+ }
+ if (fs.fallback !== undefined) {
+ const filepath = fs.fallback(file);
+ if (filepath !== undefined)
+ yield filepath;
+ }
+ }
+ dirname(path) {
+ const fs = this.options.fs;
+ assert(fs.dirname, '`fs.dirname` is required for relative reference');
+ return fs.dirname(path);
+ }
+ lookupError(file, roots) {
+ const err = new Error('ENOENT');
+ err.message = `ENOENT: Failed to lookup "${file}" in "${roots}"`;
+ err.code = 'ENOENT';
+ return err;
+ }
+} + +class Parser {
+ constructor(liquid) {
+ this.liquid = liquid;
+ this.cache = this.liquid.options.cache;
+ this.fs = this.liquid.options.fs;
+ this.parseFile = this.cache ? this._parseFileCached : this._parseFile;
+ this.loader = new Loader(this.liquid.options);
+ this.parseLimit = new Limiter('parse length', liquid.options.parseLimit);
+ }
+ parse(html, filepath) {
+ html = String(html);
+ this.parseLimit.use(html.length);
+ const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath);
+ const tokens = tokenizer.readTopLevelTokens(this.liquid.options);
+ return this.parseTokens(tokens);
+ }
+ parseTokens(tokens) {
+ let token;
+ const templates = [];
+ const errors = [];
+ while ((token = tokens.shift())) {
+ try {
+ templates.push(this.parseToken(token, tokens));
+ }
+ catch (err) {
+ if (this.liquid.options.catchAllErrors)
+ errors.push(err);
+ else
+ throw err;
+ }
+ }
+ if (errors.length)
+ throw new LiquidErrors(errors);
+ return templates;
+ }
+ parseToken(token, remainTokens) {
+ try {
+ if (isTagToken(token)) {
+ const TagClass = this.liquid.tags[token.name];
+ assert(TagClass, `tag "${token.name}" not found`);
+ return new TagClass(token, remainTokens, this.liquid, this);
+ }
+ if (isOutputToken(token)) {
+ return new Output(token, this.liquid);
+ }
+ return new HTML(token);
+ }
+ catch (e) {
+ if (LiquidError.is(e))
+ throw e;
+ throw new ParseError(e, token);
+ }
+ }
+ parseStream(tokens) {
+ return new ParseStream(tokens, (token, tokens) => this.parseToken(token, tokens));
+ }
+ *_parseFileCached(file, sync, type = LookupType.Root, currentFile) {
+ const cache = this.cache;
+ const key = this.loader.shouldLoadRelative(file) ? currentFile + ',' + file : type + ':' + file;
+ const tpls = yield cache.read(key);
+ if (tpls)
+ return tpls;
+ const task = this._parseFile(file, sync, type, currentFile);
+ // sync mode: exec the task and cache the result
+ // async mode: cache the task before exec
+ const taskOrTpl = sync ? yield task : toPromise(task);
+ cache.write(key, taskOrTpl);
+ // note: concurrent tasks will be reused, cache for failed task is removed until its end
+ try {
+ return yield taskOrTpl;
+ }
+ catch (err) {
+ cache.remove(key);
+ throw err;
+ }
+ }
+ *_parseFile(file, sync, type = LookupType.Root, currentFile) {
+ const filepath = yield this.loader.lookup(file, type, sync, currentFile);
+ return this.parse(sync ? this.fs.readFileSync(filepath) : yield this.fs.readFile(filepath), filepath);
+ }
+} + +var TokenKind;
+(function (TokenKind) {
+ TokenKind[TokenKind["Number"] = 1] = "Number";
+ TokenKind[TokenKind["Literal"] = 2] = "Literal";
+ TokenKind[TokenKind["Tag"] = 4] = "Tag";
+ TokenKind[TokenKind["Output"] = 8] = "Output";
+ TokenKind[TokenKind["HTML"] = 16] = "HTML";
+ TokenKind[TokenKind["Filter"] = 32] = "Filter";
+ TokenKind[TokenKind["Hash"] = 64] = "Hash";
+ TokenKind[TokenKind["PropertyAccess"] = 128] = "PropertyAccess";
+ TokenKind[TokenKind["Word"] = 256] = "Word";
+ TokenKind[TokenKind["Range"] = 512] = "Range";
+ TokenKind[TokenKind["Quoted"] = 1024] = "Quoted";
+ TokenKind[TokenKind["Operator"] = 2048] = "Operator";
+ TokenKind[TokenKind["FilteredValue"] = 4096] = "FilteredValue";
+ TokenKind[TokenKind["Delimited"] = 12] = "Delimited";
+})(TokenKind || (TokenKind = {})); + +function isDelimitedToken(val) {
+ return !!(getKind(val) & TokenKind.Delimited);
+}
+function isOperatorToken(val) {
+ return getKind(val) === TokenKind.Operator;
+}
+function isHTMLToken(val) {
+ return getKind(val) === TokenKind.HTML;
+}
+function isOutputToken(val) {
+ return getKind(val) === TokenKind.Output;
+}
+function isTagToken(val) {
+ return getKind(val) === TokenKind.Tag;
+}
+function isQuotedToken(val) {
+ return getKind(val) === TokenKind.Quoted;
+}
+function isLiteralToken(val) {
+ return getKind(val) === TokenKind.Literal;
+}
+function isNumberToken(val) {
+ return getKind(val) === TokenKind.Number;
+}
+function isPropertyAccessToken(val) {
+ return getKind(val) === TokenKind.PropertyAccess;
+}
+function isWordToken(val) {
+ return getKind(val) === TokenKind.Word;
+}
+function isRangeToken(val) {
+ return getKind(val) === TokenKind.Range;
+}
+function isValueToken(val) {
+ // valueTokenBitMask = TokenKind.Number | TokenKind.Literal | TokenKind.Quoted | TokenKind.PropertyAccess | TokenKind.Range
+ return (getKind(val) & 1667) > 0;
+}
+function getKind(val) {
+ return val ? val.kind : -1;
+} + +var typeGuards = /*#__PURE__*/Object.freeze({ + __proto__: null, + isDelimitedToken: isDelimitedToken, + isOperatorToken: isOperatorToken, + isHTMLToken: isHTMLToken, + isOutputToken: isOutputToken, + isTagToken: isTagToken, + isQuotedToken: isQuotedToken, + isLiteralToken: isLiteralToken, + isNumberToken: isNumberToken, + isPropertyAccessToken: isPropertyAccessToken, + isWordToken: isWordToken, + isRangeToken: isRangeToken, + isValueToken: isValueToken +}); + +class Context {
+ constructor(env = {}, opts = defaultOptions, renderOptions = {}, { memoryLimit, renderLimit } = {}) {
+ var _a, _b, _c, _d, _e;
+ /**
+ * insert a Context-level empty scope,
+ * for tags like `{% capture %}` `{% assign %}` to operate
+ */
+ this.scopes = [{}];
+ this.registers = {};
+ this.breakCalled = false;
+ this.continueCalled = false;
+ this.sync = !!renderOptions.sync;
+ this.opts = opts;
+ this.globals = (_a = renderOptions.globals) !== null && _a !== void 0 ? _a : opts.globals;
+ this.environments = isObject(env) ? env : Object(env);
+ this.strictVariables = (_b = renderOptions.strictVariables) !== null && _b !== void 0 ? _b : this.opts.strictVariables;
+ this.ownPropertyOnly = (_c = renderOptions.ownPropertyOnly) !== null && _c !== void 0 ? _c : opts.ownPropertyOnly;
+ this.memoryLimit = memoryLimit !== null && memoryLimit !== void 0 ? memoryLimit : new Limiter('memory alloc', (_d = renderOptions.memoryLimit) !== null && _d !== void 0 ? _d : opts.memoryLimit);
+ this.renderLimit = renderLimit !== null && renderLimit !== void 0 ? renderLimit : new Limiter('template render', getPerformance().now() + ((_e = renderOptions.renderLimit) !== null && _e !== void 0 ? _e : opts.renderLimit));
+ }
+ getRegister(key) {
+ return (this.registers[key] = this.registers[key] || {});
+ }
+ setRegister(key, value) {
+ return (this.registers[key] = value);
+ }
+ saveRegister(...keys) {
+ return keys.map(key => [key, this.getRegister(key)]);
+ }
+ restoreRegister(keyValues) {
+ return keyValues.forEach(([key, value]) => this.setRegister(key, value));
+ }
+ getAll() {
+ return [this.globals, this.environments, ...this.scopes]
+ .reduce((ctx, val) => __assign(ctx, val), {});
+ }
+ /**
+ * @deprecated use `_get()` or `getSync()` instead
+ */
+ get(paths) {
+ return this.getSync(paths);
+ }
+ getSync(paths) {
+ return toValueSync(this._get(paths));
+ }
+ *_get(paths) {
+ const scope = this.findScope(paths[0]); // first prop should always be a string
+ return yield this._getFromScope(scope, paths);
+ }
+ /**
+ * @deprecated use `_get()` instead
+ */
+ getFromScope(scope, paths) {
+ return toValueSync(this._getFromScope(scope, paths));
+ }
+ *_getFromScope(scope, paths, strictVariables = this.strictVariables) {
+ if (isString(paths))
+ paths = paths.split('.');
+ for (let i = 0; i < paths.length; i++) {
+ scope = yield this.readProperty(scope, paths[i]);
+ if (strictVariables && isUndefined(scope)) {
+ throw new InternalUndefinedVariableError(paths.slice(0, i + 1).join('.'));
+ }
+ }
+ return scope;
+ }
+ push(ctx) {
+ return this.scopes.push(ctx);
+ }
+ pop() {
+ return this.scopes.pop();
+ }
+ bottom() {
+ return this.scopes[0];
+ }
+ spawn(scope = {}) {
+ return new Context(scope, this.opts, {
+ sync: this.sync,
+ globals: this.globals,
+ strictVariables: this.strictVariables
+ }, {
+ renderLimit: this.renderLimit,
+ memoryLimit: this.memoryLimit
+ });
+ }
+ findScope(key) {
+ for (let i = this.scopes.length - 1; i >= 0; i--) {
+ const candidate = this.scopes[i];
+ if (key in candidate)
+ return candidate;
+ }
+ if (key in this.environments)
+ return this.environments;
+ return this.globals;
+ }
+ readProperty(obj, key) {
+ obj = toLiquid(obj);
+ key = toValue(key);
+ if (isNil(obj))
+ return obj;
+ if (isArray(obj) && key < 0)
+ return obj[obj.length + +key];
+ const value = readJSProperty(obj, key, this.ownPropertyOnly);
+ if (value === undefined && obj instanceof Drop)
+ return obj.liquidMethodMissing(key, this);
+ if (isFunction(value))
+ return value.call(obj);
+ if (key === 'size')
+ return readSize(obj);
+ else if (key === 'first')
+ return readFirst(obj);
+ else if (key === 'last')
+ return readLast(obj);
+ return value;
+ }
+}
+function readJSProperty(obj, key, ownPropertyOnly) {
+ if (ownPropertyOnly && !hasOwnProperty.call(obj, key) && !(obj instanceof Drop))
+ return undefined;
+ return obj[key];
+}
+function readFirst(obj) {
+ if (isArray(obj))
+ return obj[0];
+ return obj['first'];
+}
+function readLast(obj) {
+ if (isArray(obj))
+ return obj[obj.length - 1];
+ return obj['last'];
+}
+function readSize(obj) {
+ if (hasOwnProperty.call(obj, 'size') || obj['size'] !== undefined)
+ return obj['size'];
+ if (isArray(obj) || isString(obj))
+ return obj.length;
+ if (typeof obj === 'object')
+ return Object.keys(obj).length;
+} + +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 = {})); + +const abs = argumentsToNumber(Math.abs);
+const at_least = argumentsToNumber(Math.max);
+const at_most = argumentsToNumber(Math.min);
+const ceil = argumentsToNumber(Math.ceil);
+const divided_by = argumentsToNumber((dividend, divisor, integerArithmetic = false) => integerArithmetic ? Math.floor(dividend / divisor) : dividend / divisor);
+const floor = argumentsToNumber(Math.floor);
+const minus = argumentsToNumber((v, arg) => v - arg);
+const plus = argumentsToNumber((lhs, rhs) => lhs + rhs);
+const modulo = argumentsToNumber((v, arg) => v % arg);
+const times = argumentsToNumber((v, arg) => v * arg);
+function round(v, arg = 0) {
+ v = toNumber(v);
+ arg = toNumber(arg);
+ const amp = Math.pow(10, arg);
+ return Math.round(v * amp) / amp;
+} + +var mathFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + abs: abs, + at_least: at_least, + at_most: at_most, + ceil: ceil, + divided_by: divided_by, + floor: floor, + minus: minus, + plus: plus, + modulo: modulo, + times: times, + round: round +}); + +const url_decode = (x) => decodeURIComponent(stringify(x)).replace(/\+/g, ' ');
+const url_encode = (x) => encodeURIComponent(stringify(x)).replace(/%20/g, '+');
+const cgi_escape = (x) => encodeURIComponent(stringify(x))
+ .replace(/%20/g, '+')
+ .replace(/[!'()*]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase());
+const uri_escape = (x) => encodeURI(stringify(x))
+ .replace(/%5B/g, '[')
+ .replace(/%5D/g, ']');
+const rSlugifyDefault = /[^\p{M}\p{L}\p{Nd}]+/ug;
+const rSlugifyReplacers = {
+ 'raw': /\s+/g,
+ 'default': rSlugifyDefault,
+ 'pretty': /[^\p{M}\p{L}\p{Nd}._~!$&'()+,;=@]+/ug,
+ 'ascii': /[^A-Za-z0-9]+/g,
+ 'latin': rSlugifyDefault,
+ 'none': null
+};
+function slugify(str, mode = 'default', cased = false) {
+ str = stringify(str);
+ const replacer = rSlugifyReplacers[mode];
+ if (replacer) {
+ if (mode === 'latin')
+ str = removeAccents(str);
+ str = str.replace(replacer, '-').replace(/^-|-$/g, '');
+ }
+ return cased ? str : str.toLowerCase();
+}
+function removeAccents(str) {
+ return str.replace(/[àáâãäå]/g, 'a')
+ .replace(/[æ]/g, 'ae')
+ .replace(/[ç]/g, 'c')
+ .replace(/[èéêë]/g, 'e')
+ .replace(/[ìíîï]/g, 'i')
+ .replace(/[ð]/g, 'd')
+ .replace(/[ñ]/g, 'n')
+ .replace(/[òóôõöø]/g, 'o')
+ .replace(/[ùúûü]/g, 'u')
+ .replace(/[ýÿ]/g, 'y')
+ .replace(/[ß]/g, 'ss')
+ .replace(/[œ]/g, 'oe')
+ .replace(/[þ]/g, 'th')
+ .replace(/[ẞ]/g, 'SS')
+ .replace(/[Œ]/g, 'OE')
+ .replace(/[Þ]/g, 'TH');
+} + +var urlFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + url_decode: url_decode, + url_encode: url_encode, + cgi_escape: cgi_escape, + uri_escape: uri_escape, + slugify: slugify +}); + +const join = argumentsToValue(function (v, arg) {
+ const array = toArray(v);
+ const sep = isNil(arg) ? ' ' : stringify(arg);
+ const complexity = array.length * (1 + sep.length);
+ this.context.memoryLimit.use(complexity);
+ return array.join(sep);
+});
+const last$1 = argumentsToValue((v) => isArrayLike(v) ? last(v) : '');
+const first = argumentsToValue((v) => isArrayLike(v) ? v[0] : '');
+const reverse = argumentsToValue(function (v) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ return [...array].reverse();
+});
+function* sort(arr, property) {
+ const values = [];
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ values.push([
+ item,
+ property ? yield this.context._getFromScope(item, stringify(property).split('.'), false) : item
+ ]);
+ }
+ return values.sort((lhs, rhs) => {
+ const lvalue = lhs[1];
+ const rvalue = rhs[1];
+ return lvalue < rvalue ? -1 : (lvalue > rvalue ? 1 : 0);
+ }).map(tuple => tuple[0]);
+}
+function sort_natural(input, property) {
+ const propertyString = stringify(property);
+ const compare = property === undefined
+ ? caseInsensitiveCompare
+ : (lhs, rhs) => caseInsensitiveCompare(lhs[propertyString], rhs[propertyString]);
+ const array = toArray(input);
+ this.context.memoryLimit.use(array.length);
+ return [...array].sort(compare);
+}
+const size = (v) => (v && v.length) || 0;
+function* map(arr, property) {
+ const results = [];
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ results.push(yield this.context._getFromScope(item, stringify(property), false));
+ }
+ return results;
+}
+function* sum(arr, property) {
+ let sum = 0;
+ const array = toArray(arr);
+ for (const item of array) {
+ const data = Number(property ? yield this.context._getFromScope(item, stringify(property), false) : item);
+ sum += Number.isNaN(data) ? 0 : data;
+ }
+ return sum;
+}
+function compact(arr) {
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ return array.filter(x => !isNil(toValue(x)));
+}
+function concat(v, arg = []) {
+ const lhs = toArray(v);
+ const rhs = toArray(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return lhs.concat(rhs);
+}
+function push(v, arg) {
+ return concat.call(this, v, [arg]);
+}
+function unshift(v, arg) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ const clone = [...array];
+ clone.unshift(arg);
+ return clone;
+}
+function pop(v) {
+ const clone = [...toArray(v)];
+ clone.pop();
+ return clone;
+}
+function shift(v) {
+ const array = toArray(v);
+ this.context.memoryLimit.use(array.length);
+ const clone = [...array];
+ clone.shift();
+ return clone;
+}
+function slice(v, begin, length = 1) {
+ v = toValue(v);
+ if (isNil(v))
+ return [];
+ if (!isArray(v))
+ v = stringify(v);
+ begin = begin < 0 ? v.length + begin : begin;
+ this.context.memoryLimit.use(length);
+ return v.slice(begin, begin + length);
+}
+function expectedMatcher(expected) {
+ if (this.context.opts.jekyllWhere) {
+ return (v) => EmptyDrop.is(expected) ? equals(v, expected) : (isArray(v) ? arrayIncludes(v, expected) : equals(v, expected));
+ }
+ else if (expected === undefined) {
+ return (v) => isTruthy(v, this.context);
+ }
+ else {
+ return (v) => equals(v, expected);
+ }
+}
+function* filter(include, arr, property, expected) {
+ const values = [];
+ arr = toArray(arr);
+ this.context.memoryLimit.use(arr.length);
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ for (const item of arr) {
+ values.push(yield evalToken(token, this.context.spawn(item)));
+ }
+ const matcher = expectedMatcher.call(this, expected);
+ return arr.filter((_, i) => matcher(values[i]) === include);
+}
+function* filter_exp(include, arr, itemName, exp) {
+ const filtered = [];
+ const keyTemplate = new Value(stringify(exp), this.liquid);
+ const array = toArray(arr);
+ this.context.memoryLimit.use(array.length);
+ for (const item of array) {
+ this.context.push({ [itemName]: item });
+ const value = yield keyTemplate.value(this.context);
+ this.context.pop();
+ if (value === include)
+ filtered.push(item);
+ }
+ return filtered;
+}
+function* where(arr, property, expected) {
+ return yield* filter.call(this, true, arr, property, expected);
+}
+function* reject(arr, property, expected) {
+ return yield* filter.call(this, false, arr, property, expected);
+}
+function* where_exp(arr, itemName, exp) {
+ return yield* filter_exp.call(this, true, arr, itemName, exp);
+}
+function* reject_exp(arr, itemName, exp) {
+ return yield* filter_exp.call(this, false, arr, itemName, exp);
+}
+function* group_by(arr, property) {
+ const map = new Map();
+ arr = toEnumerable(arr);
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ this.context.memoryLimit.use(arr.length);
+ for (const item of arr) {
+ const key = yield evalToken(token, this.context.spawn(item));
+ if (!map.has(key))
+ map.set(key, []);
+ map.get(key).push(item);
+ }
+ return [...map.entries()].map(([name, items]) => ({ name, items }));
+}
+function* group_by_exp(arr, itemName, exp) {
+ const map = new Map();
+ const keyTemplate = new Value(stringify(exp), this.liquid);
+ arr = toEnumerable(arr);
+ this.context.memoryLimit.use(arr.length);
+ for (const item of arr) {
+ this.context.push({ [itemName]: item });
+ const key = yield keyTemplate.value(this.context);
+ this.context.pop();
+ if (!map.has(key))
+ map.set(key, []);
+ map.get(key).push(item);
+ }
+ return [...map.entries()].map(([name, items]) => ({ name, items }));
+}
+function* search(arr, property, expected) {
+ const token = new Tokenizer(stringify(property)).readScopeValue();
+ const array = toArray(arr);
+ const matcher = expectedMatcher.call(this, expected);
+ for (let index = 0; index < array.length; index++) {
+ const value = yield evalToken(token, this.context.spawn(array[index]));
+ if (matcher(value))
+ return [index, array[index]];
+ }
+}
+function* search_exp(arr, itemName, exp) {
+ const predicate = new Value(stringify(exp), this.liquid);
+ const array = toArray(arr);
+ for (let index = 0; index < array.length; index++) {
+ this.context.push({ [itemName]: array[index] });
+ const value = yield predicate.value(this.context);
+ this.context.pop();
+ if (value)
+ return [index, array[index]];
+ }
+}
+function* has(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return !!result;
+}
+function* has_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return !!result;
+}
+function* find_index(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return result ? result[0] : undefined;
+}
+function* find_index_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return result ? result[0] : undefined;
+}
+function* find(arr, property, expected) {
+ const result = yield* search.call(this, arr, property, expected);
+ return result ? result[1] : undefined;
+}
+function* find_exp(arr, itemName, exp) {
+ const result = yield* search_exp.call(this, arr, itemName, exp);
+ return result ? result[1] : undefined;
+}
+function uniq(arr) {
+ arr = toArray(arr);
+ this.context.memoryLimit.use(arr.length);
+ return [...new Set(arr)];
+}
+function sample(v, count = 1) {
+ v = toValue(v);
+ if (isNil(v))
+ return [];
+ if (!isArray(v))
+ v = stringify(v);
+ this.context.memoryLimit.use(count);
+ const shuffled = [...v].sort(() => Math.random() - 0.5);
+ if (count === 1)
+ return shuffled[0];
+ return shuffled.slice(0, count);
+} + +var arrayFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + join: join, + last: last$1, + first: first, + reverse: reverse, + sort: sort, + sort_natural: sort_natural, + size: size, + map: map, + sum: sum, + compact: compact, + concat: concat, + push: push, + unshift: unshift, + pop: pop, + shift: shift, + slice: slice, + where: where, + reject: reject, + where_exp: where_exp, + reject_exp: reject_exp, + group_by: group_by, + group_by_exp: group_by_exp, + has: has, + has_exp: has_exp, + find_index: find_index, + find_index_exp: find_index_exp, + find: find, + find_exp: find_exp, + uniq: uniq, + sample: sample +}); + +function date(v, format, timezoneOffset) {
+ var _a, _b, _c;
+ const size = ((_a = v === null || v === void 0 ? void 0 : v.length) !== null && _a !== void 0 ? _a : 0) + ((_b = format === null || format === void 0 ? void 0 : format.length) !== null && _b !== void 0 ? _b : 0) + ((_c = timezoneOffset === null || timezoneOffset === void 0 ? void 0 : timezoneOffset.length) !== null && _c !== void 0 ? _c : 0);
+ this.context.memoryLimit.use(size);
+ const date = parseDate(v, this.context.opts, timezoneOffset);
+ if (!date)
+ return v;
+ format = toValue(format);
+ format = isNil(format) ? this.context.opts.dateFormat : stringify(format);
+ return strftime(date, format);
+}
+function date_to_xmlschema(v) {
+ return date.call(this, v, '%Y-%m-%dT%H:%M:%S%:z');
+}
+function date_to_rfc822(v) {
+ return date.call(this, v, '%a, %d %b %Y %H:%M:%S %z');
+}
+function date_to_string(v, type, style) {
+ return stringify_date.call(this, v, '%b', type, style);
+}
+function date_to_long_string(v, type, style) {
+ return stringify_date.call(this, v, '%B', type, style);
+}
+function stringify_date(v, month_type, type, style) {
+ const date = parseDate(v, this.context.opts);
+ if (!date)
+ return v;
+ if (type === 'ordinal') {
+ const d = date.getDate();
+ return style === 'US'
+ ? strftime(date, `${month_type} ${d}%q, %Y`)
+ : strftime(date, `${d}%q ${month_type} %Y`);
+ }
+ return strftime(date, `%d ${month_type} %Y`);
+}
+function parseDate(v, opts, timezoneOffset) {
+ let date;
+ const defaultTimezoneOffset = timezoneOffset !== null && timezoneOffset !== void 0 ? timezoneOffset : opts.timezoneOffset;
+ const locale = opts.locale;
+ v = toValue(v);
+ if (v === 'now' || v === 'today') {
+ date = new LiquidDate(Date.now(), locale, defaultTimezoneOffset);
+ }
+ else if (isNumber(v)) {
+ date = new LiquidDate(v * 1000, locale, defaultTimezoneOffset);
+ }
+ else if (isString(v)) {
+ if (/^\d+$/.test(v)) {
+ date = new LiquidDate(+v * 1000, locale, defaultTimezoneOffset);
+ }
+ else if (opts.preserveTimezones && timezoneOffset === undefined) {
+ date = LiquidDate.createDateFixedToTimezone(v, locale);
+ }
+ else {
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
+ }
+ }
+ else {
+ date = new LiquidDate(v, locale, defaultTimezoneOffset);
+ }
+ return date.valid() ? date : undefined;
+} + +var dateFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + date: date, + date_to_xmlschema: date_to_xmlschema, + date_to_rfc822: date_to_rfc822, + date_to_string: date_to_string, + date_to_long_string: date_to_long_string +}); + +/**
+ * String related filters
+ *
+ * * prefer stringify() to String() since `undefined`, `null` should eval ''
+ */
+const rCJKWord = /[\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF]/gu;
+// Word boundary followed by word characters (for detecting words)
+const rNonCJKWord = /[^\u4E00-\u9FFF\uF900-\uFAFF\u3400-\u4DBF\u3040-\u309F\u30A0-\u30FF\uAC00-\uD7AF\s]+/gu;
+function append(v, arg) {
+ assert(arguments.length === 2, 'append expect 2 arguments');
+ const lhs = stringify(v);
+ const rhs = stringify(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return lhs + rhs;
+}
+function prepend(v, arg) {
+ assert(arguments.length === 2, 'prepend expect 2 arguments');
+ const lhs = stringify(v);
+ const rhs = stringify(arg);
+ this.context.memoryLimit.use(lhs.length + rhs.length);
+ return rhs + lhs;
+}
+function lstrip(v, chars) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str.replace(new RegExp(`^[${chars}]+`, 'g'), '');
+ }
+ return str.replace(/^\s+/, '');
+}
+function downcase(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.toLowerCase();
+}
+function upcase(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return stringify(str).toUpperCase();
+}
+function remove(v, arg) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.split(stringify(arg)).join('');
+}
+function remove_first(v, l) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(stringify(l), '');
+}
+function remove_last(v, l) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const pattern = stringify(l);
+ const index = str.lastIndexOf(pattern);
+ if (index === -1)
+ return str;
+ return str.substring(0, index) + str.substring(index + pattern.length);
+}
+function rstrip(str, chars) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str.replace(new RegExp(`[${chars}]+$`, 'g'), '');
+ }
+ return str.replace(/\s+$/, '');
+}
+function split(v, arg) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const arr = str.split(stringify(arg));
+ // align to ruby split, which is the behavior of shopify/liquid
+ // see: https://ruby-doc.org/core-2.4.0/String.html#method-i-split
+ while (arr.length && arr[arr.length - 1] === '')
+ arr.pop();
+ return arr;
+}
+function strip(v, chars) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (chars) {
+ chars = escapeRegExp(stringify(chars));
+ return str
+ .replace(new RegExp(`^[${chars}]+`, 'g'), '')
+ .replace(new RegExp(`[${chars}]+$`, 'g'), '');
+ }
+ return str.trim();
+}
+function strip_newlines(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\r?\n/gm, '');
+}
+function capitalize(str) {
+ str = stringify(str);
+ this.context.memoryLimit.use(str.length);
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
+}
+function replace(v, pattern, replacement) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.split(stringify(pattern)).join(replacement);
+}
+function replace_first(v, arg1, arg2) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(stringify(arg1), arg2);
+}
+function replace_last(v, arg1, arg2) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const pattern = stringify(arg1);
+ const index = str.lastIndexOf(pattern);
+ if (index === -1)
+ return str;
+ const replacement = stringify(arg2);
+ return str.substring(0, index) + replacement + str.substring(index + pattern.length);
+}
+function truncate(v, l = 50, o = '...') {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ if (str.length <= l)
+ return v;
+ return str.substring(0, l - o.length) + o;
+}
+function truncatewords(v, words = 15, o = '...') {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ const arr = str.split(/\s+/);
+ if (words <= 0)
+ words = 1;
+ let ret = arr.slice(0, words).join(' ');
+ if (arr.length >= words)
+ ret += o;
+ return ret;
+}
+function normalize_whitespace(v) {
+ const str = stringify(v);
+ this.context.memoryLimit.use(str.length);
+ return str.replace(/\s+/g, ' ');
+}
+function number_of_words(input, mode) {
+ const str = stringify(input);
+ this.context.memoryLimit.use(str.length);
+ input = str.trim();
+ if (!input)
+ return 0;
+ switch (mode) {
+ case 'cjk':
+ // Count CJK characters and words
+ return (input.match(rCJKWord) || []).length + (input.match(rNonCJKWord) || []).length;
+ case 'auto':
+ // Count CJK characters, if none, count words
+ return rCJKWord.test(input)
+ ? input.match(rCJKWord).length + (input.match(rNonCJKWord) || []).length
+ : input.split(/\s+/).length;
+ default:
+ // Count words only
+ return input.split(/\s+/).length;
+ }
+}
+function array_to_sentence_string(array, connector = 'and') {
+ this.context.memoryLimit.use(array.length);
+ switch (array.length) {
+ case 0:
+ return '';
+ case 1:
+ return array[0];
+ case 2:
+ return `${array[0]} ${connector} ${array[1]}`;
+ default:
+ return `${array.slice(0, -1).join(', ')}, ${connector} ${array[array.length - 1]}`;
+ }
+} + +var stringFilters = /*#__PURE__*/Object.freeze({ + __proto__: null, + append: append, + prepend: prepend, + lstrip: lstrip, + downcase: downcase, + upcase: upcase, + remove: remove, + remove_first: remove_first, + remove_last: remove_last, + rstrip: rstrip, + split: split, + strip: strip, + strip_newlines: strip_newlines, + capitalize: capitalize, + replace: replace, + replace_first: replace_first, + replace_last: replace_last, + truncate: truncate, + truncatewords: truncatewords, + normalize_whitespace: normalize_whitespace, + number_of_words: number_of_words, + array_to_sentence_string: array_to_sentence_string +}); + +const filters = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, htmlFilters), mathFilters), urlFilters), arrayFilters), dateFilters), stringFilters), misc); + +class AssignTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.key = this.identifier.content;
+ this.tokenizer.assert(this.key, 'expected variable name');
+ this.tokenizer.skipBlank();
+ this.tokenizer.assert(this.tokenizer.peek() === '=', 'expected "="');
+ this.tokenizer.advance();
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ }
+ *render(ctx) {
+ ctx.bottom()[this.key] = yield this.value.value(ctx, this.liquid.options.lenientIf);
+ }
+ *arguments() {
+ yield this.value;
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +const MODIFIERS = ['offset', 'limit', 'reversed'];
+class ForTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const variable = this.tokenizer.readIdentifier();
+ const inStr = this.tokenizer.readIdentifier();
+ const collection = this.tokenizer.readValue();
+ if (!variable.size() || inStr.content !== 'in' || !collection) {
+ throw new Error(`illegal tag: ${token.getText()}`);
+ }
+ this.variable = variable.content;
+ this.collection = collection;
+ this.hash = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = [];
+ this.elseTemplates = [];
+ let p;
+ const stream = parser.parseStream(remainTokens)
+ .on('start', () => (p = this.templates))
+ .on('tag:else', tag => { assertEmpty(tag.args); p = this.elseTemplates; })
+ .on('tag:endfor', tag => { assertEmpty(tag.args); stream.stop(); })
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => { throw new Error(`tag ${token.getText()} not closed`); });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ let collection = toEnumerable(yield evalToken(this.collection, ctx));
+ if (!collection.length) {
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ return;
+ }
+ const continueKey = 'continue-' + this.variable + '-' + this.collection.getText();
+ ctx.push({ continue: ctx.getRegister(continueKey) });
+ const hash = yield this.hash.render(ctx);
+ ctx.pop();
+ const modifiers = this.liquid.options.orderedFilterParameters
+ ? Object.keys(hash).filter(x => MODIFIERS.includes(x))
+ : MODIFIERS.filter(x => hash[x] !== undefined);
+ collection = modifiers.reduce((collection, modifier) => {
+ if (modifier === 'offset')
+ return offset(collection, hash['offset']);
+ if (modifier === 'limit')
+ return limit(collection, hash['limit']);
+ return reversed(collection);
+ }, collection);
+ ctx.setRegister(continueKey, (hash['offset'] || 0) + collection.length);
+ const scope = { forloop: new ForloopDrop(collection.length, this.collection.getText(), this.variable) };
+ ctx.push(scope);
+ for (const item of collection) {
+ scope[this.variable] = item;
+ ctx.continueCalled = ctx.breakCalled = false;
+ yield r.renderTemplates(this.templates, ctx, emitter);
+ if (ctx.breakCalled)
+ break;
+ scope.forloop.next();
+ }
+ ctx.continueCalled = ctx.breakCalled = false;
+ ctx.pop();
+ }
+ *children() {
+ const templates = this.templates.slice();
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+ *arguments() {
+ yield this.collection;
+ for (const v of Object.values(this.hash.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ }
+ blockScope() {
+ return [this.variable, 'forloop'];
+ }
+}
+function reversed(arr) {
+ return [...arr].reverse();
+}
+function offset(arr, count) {
+ return arr.slice(count);
+}
+function limit(arr, count) {
+ return arr.slice(0, count);
+} + +class CaptureTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.templates = [];
+ this.identifier = this.readVariable();
+ this.variable = this.identifier.content;
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endcapture')
+ return;
+ this.templates.push(parser.parseToken(token, remainTokens));
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ readVariable() {
+ let ident = this.tokenizer.readIdentifier();
+ if (ident.content)
+ return ident;
+ ident = this.tokenizer.readQuoted();
+ if (ident)
+ return ident;
+ throw this.tokenizer.error('invalid capture name');
+ }
+ *render(ctx) {
+ const r = this.liquid.renderer;
+ const html = yield r.renderTemplates(this.templates, ctx);
+ ctx.bottom()[this.variable] = html;
+ }
+ *children() {
+ return this.templates;
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class CaseTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ this.elseTemplates = [];
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ this.elseTemplates = [];
+ let p = [];
+ let elseCount = 0;
+ const stream = parser.parseStream(remainTokens)
+ .on('tag:when', (token) => {
+ if (elseCount > 0) {
+ return;
+ }
+ p = [];
+ const values = [];
+ while (!token.tokenizer.end()) {
+ values.push(token.tokenizer.readValueOrThrow());
+ token.tokenizer.skipBlank();
+ if (token.tokenizer.peek() === ',') {
+ token.tokenizer.readTo(',');
+ }
+ else {
+ token.tokenizer.readTo('or');
+ }
+ }
+ this.branches.push({
+ values,
+ templates: p
+ });
+ })
+ .on('tag:else', () => {
+ elseCount++;
+ p = this.elseTemplates;
+ })
+ .on('tag:endcase', () => stream.stop())
+ .on('template', (tpl) => {
+ if (p !== this.elseTemplates || elseCount === 1) {
+ p.push(tpl);
+ }
+ })
+ .on('end', () => {
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ const target = toValue(yield this.value.value(ctx, ctx.opts.lenientIf));
+ let branchHit = false;
+ for (const branch of this.branches) {
+ for (const valueToken of branch.values) {
+ const value = yield evalToken(valueToken, ctx, ctx.opts.lenientIf);
+ if (equals(target, value)) {
+ yield r.renderTemplates(branch.templates, ctx, emitter);
+ branchHit = true;
+ break;
+ }
+ }
+ }
+ if (!branchHit) {
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ }
+ }
+ *arguments() {
+ yield this.value;
+ yield* this.branches.flatMap(b => b.values);
+ }
+ *children() {
+ const templates = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+} + +class CommentTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endcomment')
+ return;
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ render() { }
+} + +class RenderTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const tokenizer = this.tokenizer;
+ this.file = parseFilePath(tokenizer, this.liquid, parser);
+ this.currentFile = token.file;
+ while (!tokenizer.end()) {
+ tokenizer.skipBlank();
+ const begin = tokenizer.p;
+ const keyword = tokenizer.readIdentifier();
+ if (keyword.content === 'with' || keyword.content === 'for') {
+ tokenizer.skipBlank();
+ // can be normal key/value pair, like "with: true"
+ if (tokenizer.peek() !== ':') {
+ const value = tokenizer.readValue();
+ // can be normal key, like "with,"
+ if (value) {
+ const beforeAs = tokenizer.p;
+ const asStr = tokenizer.readIdentifier();
+ let alias;
+ if (asStr.content === 'as')
+ alias = tokenizer.readIdentifier();
+ else
+ tokenizer.p = beforeAs;
+ this[keyword.content] = { value, alias: alias && alias.content };
+ tokenizer.skipBlank();
+ if (tokenizer.peek() === ',')
+ tokenizer.advance();
+ continue; // matched!
+ }
+ }
+ }
+ /**
+ * restore cursor if with/for not matched
+ */
+ tokenizer.p = begin;
+ break;
+ }
+ this.hash = new Hash(tokenizer, liquid.options.keyValueSeparator);
+ }
+ *render(ctx, emitter) {
+ const { liquid, hash } = this;
+ const filepath = (yield renderFilePath(this['file'], ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const childCtx = ctx.spawn();
+ const scope = childCtx.bottom();
+ __assign(scope, yield hash.render(ctx));
+ if (this['with']) {
+ const { value, alias } = this['with'];
+ scope[alias || filepath] = yield evalToken(value, ctx);
+ }
+ if (this['for']) {
+ const { value, alias } = this['for'];
+ const collection = toEnumerable(yield evalToken(value, ctx));
+ scope['forloop'] = new ForloopDrop(collection.length, value.getText(), alias);
+ for (const item of collection) {
+ scope[alias] = item;
+ const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile']));
+ yield liquid.renderer.renderTemplates(templates, childCtx, emitter);
+ scope['forloop'].next();
+ }
+ }
+ else {
+ const templates = (yield liquid._parsePartialFile(filepath, childCtx.sync, this['currentFile']));
+ yield liquid.renderer.renderTemplates(templates, childCtx, emitter);
+ }
+ }
+ *children(partials, sync) {
+ if (partials && isString(this['file'])) {
+ return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile']));
+ }
+ return [];
+ }
+ partialScope() {
+ if (isString(this['file'])) {
+ const names = Object.keys(this.hash.hash);
+ if (this['with']) {
+ const { value, alias } = this['with'];
+ if (isString(alias)) {
+ names.push([alias, value]);
+ }
+ else if (isString(this.file)) {
+ names.push([this.file, value]);
+ }
+ }
+ if (this['for']) {
+ const { value, alias } = this['for'];
+ if (isString(alias)) {
+ names.push([alias, value]);
+ }
+ else if (isString(this.file)) {
+ names.push([this.file, value]);
+ }
+ }
+ return { name: this['file'], isolated: true, scope: names };
+ }
+ }
+ *arguments() {
+ for (const v of Object.values(this.hash.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ if (this['with']) {
+ const { value } = this['with'];
+ if (isValueToken(value)) {
+ yield value;
+ }
+ }
+ if (this['for']) {
+ const { value } = this['for'];
+ if (isValueToken(value)) {
+ yield value;
+ }
+ }
+ }
+}
+/**
+ * @return null for "none",
+ * @return Template[] for quoted with tags and/or filters
+ * @return Token for expression (not quoted)
+ * @throws TypeError if cannot read next token
+ */
+function parseFilePath(tokenizer, liquid, parser) {
+ if (liquid.options.dynamicPartials) {
+ const file = tokenizer.readValue();
+ tokenizer.assert(file, 'illegal file path');
+ if (file.getText() === 'none')
+ return;
+ if (isQuotedToken(file)) {
+ // for filenames like "files/{{file}}", eval as liquid template
+ const templates = parser.parse(evalQuotedToken(file));
+ return optimize(templates);
+ }
+ return file;
+ }
+ const tokens = [...tokenizer.readFileNameTemplate(liquid.options)];
+ const templates = optimize(parser.parseTokens(tokens));
+ return templates === 'none' ? undefined : templates;
+}
+function optimize(templates) {
+ // for filenames like "files/file.liquid", extract the string directly
+ if (templates.length === 1 && isHTMLToken(templates[0].token))
+ return templates[0].token.getContent();
+ return templates;
+}
+function* renderFilePath(file, ctx, liquid) {
+ if (typeof file === 'string')
+ return file;
+ if (Array.isArray(file))
+ return liquid.renderer.renderTemplates(file, ctx);
+ return yield evalToken(file, ctx);
+} + +class IncludeTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const { tokenizer } = token;
+ this['file'] = parseFilePath(tokenizer, this.liquid, parser);
+ this['currentFile'] = token.file;
+ const begin = tokenizer.p;
+ const withStr = tokenizer.readIdentifier();
+ if (withStr.content === 'with') {
+ tokenizer.skipBlank();
+ if (tokenizer.peek() !== ':') {
+ this.withVar = tokenizer.readValue();
+ }
+ else
+ tokenizer.p = begin;
+ }
+ else
+ tokenizer.p = begin;
+ this.hash = new Hash(tokenizer, liquid.options.jekyllInclude || liquid.options.keyValueSeparator);
+ }
+ *render(ctx, emitter) {
+ const { liquid, hash, withVar } = this;
+ const { renderer } = liquid;
+ const filepath = (yield renderFilePath(this['file'], ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const saved = ctx.saveRegister('blocks', 'blockMode');
+ ctx.setRegister('blocks', {});
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ const scope = (yield hash.render(ctx));
+ if (withVar)
+ scope[filepath] = yield evalToken(withVar, ctx);
+ const templates = (yield liquid._parsePartialFile(filepath, ctx.sync, this['currentFile']));
+ ctx.push(ctx.opts.jekyllInclude ? { include: scope } : scope);
+ yield renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ ctx.restoreRegister(saved);
+ }
+ *children(partials, sync) {
+ if (partials && isString(this['file'])) {
+ return (yield this.liquid._parsePartialFile(this['file'], sync, this['currentFile']));
+ }
+ return [];
+ }
+ partialScope() {
+ if (isString(this['file'])) {
+ let names;
+ if (this.liquid.options.jekyllInclude) {
+ names = ['include'];
+ }
+ else {
+ names = Object.keys(this.hash.hash);
+ if (this.withVar) {
+ names.push([this['file'], this.withVar]);
+ }
+ }
+ return { name: this['file'], isolated: false, scope: names };
+ }
+ }
+ *arguments() {
+ yield* Object.values(this.hash.hash).filter(isValueToken);
+ if (isValueToken(this['file'])) {
+ yield this['file'];
+ }
+ if (isValueToken(this.withVar)) {
+ yield this.withVar;
+ }
+ }
+} + +class DecrementTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.variable = this.identifier.content;
+ }
+ render(context, emitter) {
+ const scope = context.environments;
+ if (!isNumber(scope[this.variable])) {
+ scope[this.variable] = 0;
+ }
+ emitter.write(stringify(--scope[this.variable]));
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class CycleTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.candidates = [];
+ const group = this.tokenizer.readValue();
+ this.tokenizer.skipBlank();
+ if (group) {
+ if (this.tokenizer.peek() === ':') {
+ this.group = group;
+ this.tokenizer.advance();
+ }
+ else
+ this.candidates.push(group);
+ }
+ while (!this.tokenizer.end()) {
+ const value = this.tokenizer.readValue();
+ if (value)
+ this.candidates.push(value);
+ this.tokenizer.readTo(',');
+ }
+ this.tokenizer.assert(this.candidates.length, () => `empty candidates: "${token.getText()}"`);
+ }
+ *render(ctx, emitter) {
+ const group = (yield evalToken(this.group, ctx));
+ const fingerprint = `cycle:${group}:` + this.candidates.join(',');
+ const groups = ctx.getRegister('cycle');
+ let idx = groups[fingerprint];
+ if (idx === undefined) {
+ idx = groups[fingerprint] = 0;
+ }
+ const candidate = this.candidates[idx];
+ idx = (idx + 1) % this.candidates.length;
+ groups[fingerprint] = idx;
+ return yield evalToken(candidate, ctx);
+ }
+ *arguments() {
+ yield* this.candidates;
+ if (this.group) {
+ yield this.group;
+ }
+ }
+} + +class IfTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ let p = [];
+ parser.parseStream(remainTokens)
+ .on('start', () => this.branches.push({
+ value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),
+ templates: (p = [])
+ }))
+ .on('tag:elsif', (token) => {
+ assert(!this.elseTemplates, 'unexpected elsif after else');
+ this.branches.push({
+ value: new Value(token.tokenizer.readFilteredValue(), this.liquid),
+ templates: (p = [])
+ });
+ })
+ .on('tag:else', tag => {
+ assertEmpty(tag.args);
+ assert(!this.elseTemplates, 'duplicated else');
+ p = this.elseTemplates = [];
+ })
+ .on('tag:endif', function (tag) { assertEmpty(tag.args); this.stop(); })
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); })
+ .start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ for (const { value, templates } of this.branches) {
+ const v = yield value.value(ctx, ctx.opts.lenientIf);
+ if (isTruthy(v, ctx)) {
+ yield r.renderTemplates(templates, ctx, emitter);
+ return;
+ }
+ }
+ yield r.renderTemplates(this.elseTemplates || [], ctx, emitter);
+ }
+ *children() {
+ const templates = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ templates.push(...this.elseTemplates);
+ }
+ return templates;
+ }
+ arguments() {
+ return this.branches.map(b => b.value);
+ }
+} + +class IncrementTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.identifier = this.tokenizer.readIdentifier();
+ this.variable = this.identifier.content;
+ }
+ render(context, emitter) {
+ const scope = context.environments;
+ if (!isNumber(scope[this.variable])) {
+ scope[this.variable] = 0;
+ }
+ const val = scope[this.variable];
+ scope[this.variable]++;
+ emitter.write(stringify(val));
+ }
+ *localScope() {
+ yield this.identifier;
+ }
+} + +class LayoutTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ this.file = parseFilePath(this.tokenizer, this.liquid, parser);
+ this['currentFile'] = token.file;
+ this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = parser.parseTokens(remainTokens);
+ }
+ *render(ctx, emitter) {
+ const { liquid, args, file } = this;
+ const { renderer } = liquid;
+ if (file === undefined) {
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ yield renderer.renderTemplates(this.templates, ctx, emitter);
+ return;
+ }
+ const filepath = (yield renderFilePath(this.file, ctx, liquid));
+ assert(filepath, () => `illegal file path "${filepath}"`);
+ const templates = (yield liquid._parseLayoutFile(filepath, ctx.sync, this['currentFile']));
+ // render remaining contents and store rendered results
+ ctx.setRegister('blockMode', BlockMode.STORE);
+ const html = yield renderer.renderTemplates(this.templates, ctx);
+ const blocks = ctx.getRegister('blocks');
+ // set whole content to anonymous block if anonymous doesn't specified
+ if (blocks[''] === undefined)
+ blocks[''] = (parent, emitter) => emitter.write(html);
+ ctx.setRegister('blockMode', BlockMode.OUTPUT);
+ // render the layout file use stored blocks
+ ctx.push((yield args.render(ctx)));
+ yield renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ }
+ *children(partials) {
+ const templates = this.templates.slice();
+ if (partials && isString(this.file)) {
+ templates.push(...(yield this.liquid._parsePartialFile(this.file, true, this['currentFile'])));
+ }
+ return templates;
+ }
+ *arguments() {
+ for (const v of Object.values(this.args.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ if (isValueToken(this.file)) {
+ yield this.file;
+ }
+ }
+ partialScope() {
+ if (isString(this.file)) {
+ return { name: this.file, isolated: false, scope: Object.keys(this.args.hash) };
+ }
+ }
+} + +class BlockTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ this.templates = [];
+ const match = /\w+/.exec(token.args);
+ this.block = match ? match[0] : '';
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endblock')
+ return;
+ const template = parser.parseToken(token, remainTokens);
+ this.templates.push(template);
+ }
+ throw new Error(`tag ${token.getText()} not closed`);
+ }
+ *render(ctx, emitter) {
+ const blockRender = this.getBlockRender(ctx);
+ if (ctx.getRegister('blockMode') === BlockMode.STORE) {
+ ctx.getRegister('blocks')[this.block] = blockRender;
+ }
+ else {
+ yield blockRender(new BlockDrop(), emitter);
+ }
+ }
+ getBlockRender(ctx) {
+ const { liquid, templates } = this;
+ const renderChild = ctx.getRegister('blocks')[this.block];
+ const renderCurrent = function* (superBlock, emitter) {
+ // add {{ block.super }} support when rendering
+ ctx.push({ block: superBlock });
+ yield liquid.renderer.renderTemplates(templates, ctx, emitter);
+ ctx.pop();
+ };
+ return renderChild
+ ? (superBlock, emitter) => renderChild(new BlockDrop((emitter) => renderCurrent(superBlock, emitter)), emitter)
+ : renderCurrent;
+ }
+ *children() {
+ return this.templates;
+ }
+ blockScope() {
+ return ['block'];
+ }
+} + +class RawTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ this.tokens = [];
+ while (remainTokens.length) {
+ const token = remainTokens.shift();
+ if (isTagToken(token) && token.name === 'endraw')
+ return;
+ this.tokens.push(token);
+ }
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ }
+ render() {
+ return this.tokens.map((token) => token.getText()).join('');
+ }
+} + +class TablerowloopDrop extends ForloopDrop {
+ constructor(length, cols, collection, variable) {
+ super(length, collection, variable);
+ this.length = length;
+ this.cols = cols;
+ }
+ row() {
+ return Math.floor(this.i / this.cols) + 1;
+ }
+ col0() {
+ return (this.i % this.cols);
+ }
+ col() {
+ return this.col0() + 1;
+ }
+ col_first() {
+ return this.col0() === 0;
+ }
+ col_last() {
+ return this.col() === this.cols;
+ }
+} + +class TablerowTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ const variable = this.tokenizer.readIdentifier();
+ this.tokenizer.skipBlank();
+ const predicate = this.tokenizer.readIdentifier();
+ const collectionToken = this.tokenizer.readValue();
+ if (predicate.content !== 'in' || !collectionToken) {
+ throw new Error(`illegal tag: ${tagToken.getText()}`);
+ }
+ this.variable = variable.content;
+ this.collection = collectionToken;
+ this.args = new Hash(this.tokenizer, liquid.options.keyValueSeparator);
+ this.templates = [];
+ let p;
+ const stream = parser.parseStream(remainTokens)
+ .on('start', () => (p = this.templates))
+ .on('tag:endtablerow', () => stream.stop())
+ .on('template', (tpl) => p.push(tpl))
+ .on('end', () => {
+ throw new Error(`tag ${tagToken.getText()} not closed`);
+ });
+ stream.start();
+ }
+ *render(ctx, emitter) {
+ let collection = toEnumerable(yield evalToken(this.collection, ctx));
+ const args = (yield this.args.render(ctx));
+ const offset = args.offset || 0;
+ const limit = (args.limit === undefined) ? collection.length : args.limit;
+ collection = collection.slice(offset, offset + limit);
+ const cols = args.cols || collection.length;
+ const r = this.liquid.renderer;
+ const tablerowloop = new TablerowloopDrop(collection.length, cols, this.collection.getText(), this.variable);
+ const scope = { tablerowloop };
+ ctx.push(scope);
+ for (let idx = 0; idx < collection.length; idx++, tablerowloop.next()) {
+ scope[this.variable] = collection[idx];
+ if (tablerowloop.col0() === 0) {
+ if (tablerowloop.row() !== 1)
+ emitter.write('</tr>');
+ emitter.write(`<tr class="row${tablerowloop.row()}">`);
+ }
+ emitter.write(`<td class="col${tablerowloop.col()}">`);
+ yield r.renderTemplates(this.templates, ctx, emitter);
+ emitter.write('</td>');
+ }
+ if (collection.length)
+ emitter.write('</tr>');
+ ctx.pop();
+ }
+ *children() {
+ return this.templates;
+ }
+ *arguments() {
+ yield this.collection;
+ for (const v of Object.values(this.args.hash)) {
+ if (isValueToken(v)) {
+ yield v;
+ }
+ }
+ }
+ blockScope() {
+ return [this.variable, 'tablerowloop'];
+ }
+} + +class UnlessTag extends Tag {
+ constructor(tagToken, remainTokens, liquid, parser) {
+ super(tagToken, remainTokens, liquid);
+ this.branches = [];
+ this.elseTemplates = [];
+ let p = [];
+ let elseCount = 0;
+ parser.parseStream(remainTokens)
+ .on('start', () => this.branches.push({
+ value: new Value(tagToken.tokenizer.readFilteredValue(), this.liquid),
+ test: isFalsy,
+ templates: (p = [])
+ }))
+ .on('tag:elsif', (token) => {
+ if (elseCount > 0) {
+ p = [];
+ return;
+ }
+ this.branches.push({
+ value: new Value(token.tokenizer.readFilteredValue(), this.liquid),
+ test: isTruthy,
+ templates: (p = [])
+ });
+ })
+ .on('tag:else', () => {
+ elseCount++;
+ p = this.elseTemplates;
+ })
+ .on('tag:endunless', function () { this.stop(); })
+ .on('template', (tpl) => {
+ if (p !== this.elseTemplates || elseCount === 1) {
+ p.push(tpl);
+ }
+ })
+ .on('end', () => { throw new Error(`tag ${tagToken.getText()} not closed`); })
+ .start();
+ }
+ *render(ctx, emitter) {
+ const r = this.liquid.renderer;
+ for (const { value, test, templates } of this.branches) {
+ const v = yield value.value(ctx, ctx.opts.lenientIf);
+ if (test(v, ctx)) {
+ yield r.renderTemplates(templates, ctx, emitter);
+ return;
+ }
+ }
+ yield r.renderTemplates(this.elseTemplates, ctx, emitter);
+ }
+ *children() {
+ const children = this.branches.flatMap(b => b.templates);
+ if (this.elseTemplates) {
+ children.push(...this.elseTemplates);
+ }
+ return children;
+ }
+ arguments() {
+ return this.branches.map(b => b.value);
+ }
+} + +class BreakTag extends Tag {
+ render(ctx, _emitter) {
+ ctx.breakCalled = true;
+ }
+} + +class ContinueTag extends Tag {
+ render(ctx, _emitter) {
+ ctx.continueCalled = true;
+ }
+} + +class EchoTag extends Tag {
+ constructor(token, remainTokens, liquid) {
+ super(token, remainTokens, liquid);
+ this.tokenizer.skipBlank();
+ if (!this.tokenizer.end()) {
+ this.value = new Value(this.tokenizer.readFilteredValue(), this.liquid);
+ }
+ }
+ *render(ctx, emitter) {
+ if (!this.value)
+ return;
+ const val = yield this.value.value(ctx, false);
+ emitter.write(val);
+ }
+ *arguments() {
+ if (this.value) {
+ yield this.value;
+ }
+ }
+} + +class LiquidTag extends Tag {
+ constructor(token, remainTokens, liquid, parser) {
+ super(token, remainTokens, liquid);
+ const tokens = this.tokenizer.readLiquidTagTokens(this.liquid.options);
+ this.templates = parser.parseTokens(tokens);
+ }
+ *render(ctx, emitter) {
+ yield this.liquid.renderer.renderTemplates(this.templates, ctx, emitter);
+ }
+ *children() {
+ return this.templates;
+ }
+} + +class InlineCommentTag extends Tag {
+ constructor(tagToken, remainTokens, liquid) {
+ super(tagToken, remainTokens, liquid);
+ if (tagToken.args.search(/\n\s*[^#\s]/g) !== -1) {
+ throw new Error('every line of an inline comment must start with a \'#\' character');
+ }
+ }
+ render() { }
+} + +const tags = {
+ assign: AssignTag,
+ 'for': ForTag,
+ capture: CaptureTag,
+ 'case': CaseTag,
+ comment: CommentTag,
+ include: IncludeTag,
+ render: RenderTag,
+ decrement: DecrementTag,
+ increment: IncrementTag,
+ cycle: CycleTag,
+ 'if': IfTag,
+ layout: LayoutTag,
+ block: BlockTag,
+ raw: RawTag,
+ tablerow: TablerowTag,
+ unless: UnlessTag,
+ 'break': BreakTag,
+ 'continue': ContinueTag,
+ echo: EchoTag,
+ liquid: LiquidTag,
+ '#': InlineCommentTag
+}; + +class Liquid {
+ constructor(opts = {}) {
+ this.renderer = new Render();
+ this.filters = {};
+ this.tags = {};
+ this.options = normalize(opts);
+ // eslint-disable-next-line deprecation/deprecation
+ this.parser = new Parser(this);
+ forOwn(tags, (conf, name) => this.registerTag(name, conf));
+ forOwn(filters, (handler, name) => this.registerFilter(name, handler));
+ }
+ parse(html, filepath) {
+ const parser = new Parser(this);
+ return parser.parse(html, filepath);
+ }
+ _render(tpl, scope, renderOptions) {
+ const ctx = scope instanceof Context ? scope : new Context(scope, this.options, renderOptions);
+ return this.renderer.renderTemplates(tpl, ctx);
+ }
+ render(tpl, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(this._render(tpl, scope, Object.assign(Object.assign({}, renderOptions), { sync: false })));
+ });
+ }
+ renderSync(tpl, scope, renderOptions) {
+ return toValueSync(this._render(tpl, scope, Object.assign(Object.assign({}, renderOptions), { sync: true })));
+ }
+ renderToNodeStream(tpl, scope, renderOptions = {}) {
+ const ctx = new Context(scope, this.options, renderOptions);
+ return this.renderer.renderTemplatesToNodeStream(tpl, ctx);
+ }
+ _parseAndRender(html, scope, renderOptions) {
+ const tpl = this.parse(html);
+ return this._render(tpl, scope, renderOptions);
+ }
+ parseAndRender(html, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(this._parseAndRender(html, scope, Object.assign(Object.assign({}, renderOptions), { sync: false })));
+ });
+ }
+ parseAndRenderSync(html, scope, renderOptions) {
+ return toValueSync(this._parseAndRender(html, scope, Object.assign(Object.assign({}, renderOptions), { sync: true })));
+ }
+ _parsePartialFile(file, sync, currentFile) {
+ return new Parser(this).parseFile(file, sync, LookupType.Partials, currentFile);
+ }
+ _parseLayoutFile(file, sync, currentFile) {
+ return new Parser(this).parseFile(file, sync, LookupType.Layouts, currentFile);
+ }
+ _parseFile(file, sync, lookupType, currentFile) {
+ return new Parser(this).parseFile(file, sync, lookupType, currentFile);
+ }
+ parseFile(file, lookupType) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(new Parser(this).parseFile(file, false, lookupType));
+ });
+ }
+ parseFileSync(file, lookupType) {
+ return toValueSync(new Parser(this).parseFile(file, true, lookupType));
+ }
+ *_renderFile(file, ctx, renderFileOptions) {
+ const templates = (yield this._parseFile(file, renderFileOptions.sync, renderFileOptions.lookupType));
+ return yield this._render(templates, ctx, renderFileOptions);
+ }
+ renderFile(file, ctx, renderFileOptions) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(this._renderFile(file, ctx, Object.assign(Object.assign({}, renderFileOptions), { sync: false })));
+ });
+ }
+ renderFileSync(file, ctx, renderFileOptions) {
+ return toValueSync(this._renderFile(file, ctx, Object.assign(Object.assign({}, renderFileOptions), { sync: true })));
+ }
+ renderFileToNodeStream(file, scope, renderOptions) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const templates = yield this.parseFile(file);
+ return this.renderToNodeStream(templates, scope, renderOptions);
+ });
+ }
+ _evalValue(str, scope) {
+ const value = new Value(str, this);
+ const ctx = scope instanceof Context ? scope : new Context(scope, this.options);
+ return value.value(ctx);
+ }
+ evalValue(str, scope) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return toPromise(this._evalValue(str, scope));
+ });
+ }
+ evalValueSync(str, scope) {
+ return toValueSync(this._evalValue(str, scope));
+ }
+ registerFilter(name, filter) {
+ this.filters[name] = filter;
+ }
+ registerTag(name, tag) {
+ this.tags[name] = isFunction(tag) ? tag : createTagClass(tag);
+ }
+ plugin(plugin) {
+ return plugin.call(this, Liquid);
+ }
+ express() {
+ const self = this; // eslint-disable-line
+ let firstCall = true;
+ return function (filePath, ctx, callback) {
+ if (firstCall) {
+ firstCall = false;
+ const dirs = normalizeDirectoryList(this.root);
+ self.options.root.unshift(...dirs);
+ self.options.layouts.unshift(...dirs);
+ self.options.partials.unshift(...dirs);
+ }
+ self.renderFile(filePath, ctx).then(html => callback(null, html), callback);
+ };
+ }
+ analyze(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return analyze(template, options);
+ });
+ }
+ analyzeSync(template, options = {}) {
+ return analyzeSync(template, options);
+ }
+ parseAndAnalyze(html, filename, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ return analyze(this.parse(html, filename), options);
+ });
+ }
+ parseAndAnalyzeSync(html, filename, options = {}) {
+ return analyzeSync(this.parse(html, filename), options);
+ }
+ /** Return an array of all variables without their properties. */
+ variables(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.variables);
+ });
+ }
+ /** Return an array of all variables without their properties. */
+ variablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.variables);
+ }
+ /** Return an array of all variables including their properties/paths. */
+ fullVariables(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))));
+ });
+ }
+ /** Return an array of all variables including their properties/paths. */
+ fullVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.variables).flatMap((a) => a.map((v) => String(v)))));
+ }
+ /** Return an array of all variables, each as an array of properties/segments. */
+ variableSegments(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))));
+ });
+ }
+ /** Return an array of all variables, each as an array of properties/segments. */
+ variableSegmentsSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.variables).flatMap((a) => a.map((v) => v.toArray()))));
+ }
+ /** Return an array of all expected context variables without their properties. */
+ globalVariables(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.globals);
+ });
+ }
+ /** Return an array of all expected context variables without their properties. */
+ globalVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Object.keys(analysis.globals);
+ }
+ /** Return an array of all expected context variables including their properties/paths. */
+ globalFullVariables(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))));
+ });
+ }
+ /** Return an array of all expected context variables including their properties/paths. */
+ globalFullVariablesSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(new Set(Object.values(analysis.globals).flatMap((a) => a.map((v) => String(v)))));
+ }
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ globalVariableSegments(template, options = {}) {
+ return __awaiter(this, void 0, void 0, function* () {
+ const analysis = yield analyze(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))));
+ });
+ }
+ /** Return an array of all expected context variables, each as an array of properties/segments. */
+ globalVariableSegmentsSync(template, options = {}) {
+ const analysis = analyzeSync(isString(template) ? this.parse(template) : template, options);
+ return Array.from(strictUniq(Object.values(analysis.globals).flatMap((a) => a.map((v) => v.toArray()))));
+ }
+} + +/* istanbul ignore file */
+const version = '[VI]{version}[/VI]'; + +export { AssertionError, AssignTag, BlockTag, BreakTag, CaptureTag, CaseTag, CommentTag, Context, ContinueTag, CycleTag, DecrementTag, Drop, EchoTag, Expression, Filter, ForTag, Hash, IfTag, IncludeTag, IncrementTag, InlineCommentTag, LayoutTag, Liquid, LiquidError, LiquidTag, Output, ParseError, ParseStream, Parser, RawTag, RenderError, RenderTag, TablerowTag, Tag, TagToken, Token, TokenKind, TokenizationError, Tokenizer, typeGuards as TypeGuards, UndefinedVariableError, UnlessTag, Value, Variable, analyze, analyzeSync, assert, createTrie, defaultOperators, defaultOptions, evalQuotedToken, evalToken, filters, isFalsy, isTruthy, tags, toPromise, toValue, toValueSync, version }; diff --git a/node_modules/liquidjs/dist/parser/filter-arg.d.ts b/node_modules/liquidjs/dist/parser/filter-arg.d.ts new file mode 100644 index 0000000..dfe7996 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/filter-arg.d.ts @@ -0,0 +1,5 @@ +import { ValueToken } from '../tokens/value-token';
+type KeyValuePair = [string?, ValueToken?];
+export type FilterArg = ValueToken | KeyValuePair;
+export declare function isKeyValuePair(arr: FilterArg): arr is KeyValuePair;
+export {};
diff --git a/node_modules/liquidjs/dist/parser/index.d.ts b/node_modules/liquidjs/dist/parser/index.d.ts new file mode 100644 index 0000000..931955e --- /dev/null +++ b/node_modules/liquidjs/dist/parser/index.d.ts @@ -0,0 +1,4 @@ +export * from './tokenizer';
+export * from './parser';
+export * from './parse-stream';
+export * from './token-kind';
diff --git a/node_modules/liquidjs/dist/parser/parse-stream.d.ts b/node_modules/liquidjs/dist/parser/parse-stream.d.ts new file mode 100644 index 0000000..83b97d7 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/parse-stream.d.ts @@ -0,0 +1,15 @@ +import { Token, TopLevelToken } from '../tokens';
+import { Template } from '../template';
+type ParseToken<T extends Token> = ((token: T, remainTokens: T[]) => Template);
+export declare class ParseStream<T extends Token = TopLevelToken> {
+ private tokens;
+ private handlers;
+ private stopRequested;
+ private parseToken;
+ constructor(tokens: T[], parseToken: ParseToken<T>);
+ on<T2 extends Template | T | undefined>(name: string, cb: (this: ParseStream, arg: T2) => void): ParseStream<T>;
+ private trigger;
+ start(): this;
+ stop(): this;
+}
+export {};
diff --git a/node_modules/liquidjs/dist/parser/parse-stream.spec.d.ts b/node_modules/liquidjs/dist/parser/parse-stream.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/parse-stream.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/parser/parser.d.ts b/node_modules/liquidjs/dist/parser/parser.d.ts new file mode 100644 index 0000000..ab60443 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/parser.d.ts @@ -0,0 +1,20 @@ +import { ParseStream } from './parse-stream';
+import { TopLevelToken } from '../tokens';
+import { Template, Output, HTML } from '../template';
+import { LookupType } from '../fs';
+import type { Liquid } from '../liquid';
+export declare class Parser {
+ parseFile: (file: string, sync?: boolean, type?: LookupType, currentFile?: string) => Generator<unknown, Template[], Template[] | string>;
+ private liquid;
+ private fs;
+ private cache?;
+ private loader;
+ private parseLimit;
+ constructor(liquid: Liquid);
+ parse(html: string, filepath?: string): Template[];
+ parseTokens(tokens: TopLevelToken[]): Template[];
+ parseToken(token: TopLevelToken, remainTokens: TopLevelToken[]): import("../template").Tag | Output | HTML;
+ parseStream(tokens: TopLevelToken[]): ParseStream<TopLevelToken>;
+ private _parseFileCached;
+ private _parseFile;
+}
diff --git a/node_modules/liquidjs/dist/parser/parser.spec.d.ts b/node_modules/liquidjs/dist/parser/parser.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/parser.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/parser/token-kind.d.ts b/node_modules/liquidjs/dist/parser/token-kind.d.ts new file mode 100644 index 0000000..47bec4f --- /dev/null +++ b/node_modules/liquidjs/dist/parser/token-kind.d.ts @@ -0,0 +1,16 @@ +export declare enum TokenKind {
+ Number = 1,
+ Literal = 2,
+ Tag = 4,
+ Output = 8,
+ HTML = 16,
+ Filter = 32,
+ Hash = 64,
+ PropertyAccess = 128,
+ Word = 256,
+ Range = 512,
+ Quoted = 1024,
+ Operator = 2048,
+ FilteredValue = 4096,
+ Delimited = 12
+}
diff --git a/node_modules/liquidjs/dist/parser/tokenizer.d.ts b/node_modules/liquidjs/dist/parser/tokenizer.d.ts new file mode 100644 index 0000000..6070291 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/tokenizer.d.ts @@ -0,0 +1,63 @@ +import { FilteredValueToken, TagToken, HTMLToken, HashToken, QuotedToken, LiquidTagToken, OutputToken, ValueToken, Token, RangeToken, FilterToken, TopLevelToken, OperatorToken, LiteralToken, IdentifierToken, NumberToken } from '../tokens';
+import { Trie, TokenizationError } from '../util';
+import { Operators, Expression } from '../render';
+import { NormalizedFullOptions } from '../liquid-options';
+import { FilterArg } from './filter-arg';
+export declare class Tokenizer {
+ input: string;
+ file?: string | undefined;
+ p: number;
+ N: number;
+ private rawBeginAt;
+ private opTrie;
+ private literalTrie;
+ constructor(input: string, operators?: Operators, file?: string | undefined, range?: [number, number]);
+ readExpression(): Expression;
+ readExpressionTokens(): IterableIterator<Token>;
+ readOperator(): OperatorToken | undefined;
+ matchTrie<T>(trie: Trie<T>): number;
+ readFilteredValue(): FilteredValueToken;
+ readFilters(): FilterToken[];
+ readFilter(): FilterToken | null;
+ readFilterArg(): FilterArg | undefined;
+ readTopLevelTokens(options?: NormalizedFullOptions): TopLevelToken[];
+ readTopLevelToken(options: NormalizedFullOptions): TopLevelToken;
+ readHTMLToken(stopStrings: string[]): HTMLToken;
+ readTagToken(options: NormalizedFullOptions): TagToken;
+ readToDelimiter(delimiter: string, respectQuoted?: boolean): number;
+ readOutputToken(options?: NormalizedFullOptions): OutputToken;
+ readEndrawOrRawContent(options: NormalizedFullOptions): HTMLToken | TagToken;
+ readLiquidTagTokens(options?: NormalizedFullOptions): LiquidTagToken[];
+ readLiquidTagToken(options: NormalizedFullOptions): LiquidTagToken | undefined;
+ error(msg: string, pos?: number): TokenizationError;
+ assert(pred: unknown, msg: string | (() => string), pos?: number): void;
+ snapshot(begin?: number): string;
+ /**
+ * @deprecated use #readIdentifier instead
+ */
+ readWord(): IdentifierToken;
+ readIdentifier(): IdentifierToken;
+ readNonEmptyIdentifier(): IdentifierToken | undefined;
+ readTagName(): string;
+ readHashes(jekyllStyle?: boolean | string): HashToken[];
+ readHash(jekyllStyle?: boolean | string): HashToken | undefined;
+ remaining(): string;
+ advance(step?: number): void;
+ end(): boolean;
+ read(): string;
+ readTo(end: string): number;
+ readValue(): ValueToken | undefined;
+ readScopeValue(): ValueToken | undefined;
+ private readProperties;
+ readNumber(): NumberToken | undefined;
+ readLiteral(): LiteralToken | undefined;
+ readRange(): RangeToken | undefined;
+ readValueOrThrow(): ValueToken;
+ readQuoted(): QuotedToken | undefined;
+ readFileNameTemplate(options: NormalizedFullOptions): IterableIterator<TopLevelToken>;
+ match(word: string): boolean;
+ rmatch(pattern: string): boolean;
+ peekType(n?: number): number;
+ peek(n?: number): string;
+ skipBlank(): void;
+}
diff --git a/node_modules/liquidjs/dist/parser/tokenizer.spec.d.ts b/node_modules/liquidjs/dist/parser/tokenizer.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/parser/tokenizer.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/parser/whitespace-ctrl.d.ts b/node_modules/liquidjs/dist/parser/whitespace-ctrl.d.ts new file mode 100644 index 0000000..a1cbdcd --- /dev/null +++ b/node_modules/liquidjs/dist/parser/whitespace-ctrl.d.ts @@ -0,0 +1,3 @@ +import { Token } from '../tokens';
+import { NormalizedFullOptions } from '../liquid-options';
+export declare function whiteSpaceCtrl(tokens: Token[], options: NormalizedFullOptions): void;
diff --git a/node_modules/liquidjs/dist/render/boolean.d.ts b/node_modules/liquidjs/dist/render/boolean.d.ts new file mode 100644 index 0000000..6354075 --- /dev/null +++ b/node_modules/liquidjs/dist/render/boolean.d.ts @@ -0,0 +1,3 @@ +import { Context } from '../context/context';
+export declare function isTruthy(val: any, ctx: Context): boolean;
+export declare function isFalsy(val: any, ctx: Context): boolean;
diff --git a/node_modules/liquidjs/dist/render/boolean.spec.d.ts b/node_modules/liquidjs/dist/render/boolean.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/render/boolean.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/render/expression.d.ts b/node_modules/liquidjs/dist/render/expression.d.ts new file mode 100644 index 0000000..a46d819 --- /dev/null +++ b/node_modules/liquidjs/dist/render/expression.d.ts @@ -0,0 +1,10 @@ +import { QuotedToken, Token } from '../tokens';
+import type { Context } from '../context';
+export declare class Expression {
+ readonly postfix: Token[];
+ constructor(tokens: IterableIterator<Token>);
+ evaluate(ctx: Context, lenient?: boolean): Generator<unknown, unknown, unknown>;
+ valid(): boolean;
+}
+export declare function evalToken(token: Token | undefined, ctx: Context, lenient?: boolean): IterableIterator<unknown>;
+export declare function evalQuotedToken(token: QuotedToken): string;
diff --git a/node_modules/liquidjs/dist/render/expression.spec.d.ts b/node_modules/liquidjs/dist/render/expression.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/render/expression.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/render/index.d.ts b/node_modules/liquidjs/dist/render/index.d.ts new file mode 100644 index 0000000..c0ed824 --- /dev/null +++ b/node_modules/liquidjs/dist/render/index.d.ts @@ -0,0 +1,4 @@ +export * from './render';
+export * from './expression';
+export * from './operator';
+export * from './boolean';
diff --git a/node_modules/liquidjs/dist/render/operator.d.ts b/node_modules/liquidjs/dist/render/operator.d.ts new file mode 100644 index 0000000..6a49663 --- /dev/null +++ b/node_modules/liquidjs/dist/render/operator.d.ts @@ -0,0 +1,8 @@ +import { Context } from '../context';
+export type UnaryOperatorHandler = (operand: any, ctx: Context) => boolean;
+export type BinaryOperatorHandler = (lhs: any, rhs: any, ctx: Context) => boolean;
+export type OperatorHandler = UnaryOperatorHandler | BinaryOperatorHandler;
+export type Operators = Record<string, OperatorHandler>;
+export declare const defaultOperators: Operators;
+export declare function equals(lhs: any, rhs: any): boolean;
+export declare function arrayIncludes(arr: any[], item: any): boolean;
diff --git a/node_modules/liquidjs/dist/render/render.d.ts b/node_modules/liquidjs/dist/render/render.d.ts new file mode 100644 index 0000000..e724c60 --- /dev/null +++ b/node_modules/liquidjs/dist/render/render.d.ts @@ -0,0 +1,8 @@ +/// <reference types="node" />
+import { Context } from '../context';
+import { Template } from '../template';
+import { Emitter } from '../emitters';
+export declare class Render {
+ renderTemplatesToNodeStream(templates: Template[], ctx: Context): NodeJS.ReadableStream;
+ renderTemplates(templates: Template[], ctx: Context, emitter?: Emitter): IterableIterator<any>;
+}
diff --git a/node_modules/liquidjs/dist/render/render.spec.d.ts b/node_modules/liquidjs/dist/render/render.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/render/render.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/render/string.d.ts b/node_modules/liquidjs/dist/render/string.d.ts new file mode 100644 index 0000000..ed1794b --- /dev/null +++ b/node_modules/liquidjs/dist/render/string.d.ts @@ -0,0 +1 @@ +export declare function parseStringLiteral(str: string): string;
diff --git a/node_modules/liquidjs/dist/render/string.spec.d.ts b/node_modules/liquidjs/dist/render/string.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/render/string.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/tags/assign.d.ts b/node_modules/liquidjs/dist/tags/assign.d.ts new file mode 100644 index 0000000..c13f8a6 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/assign.d.ts @@ -0,0 +1,12 @@ +import { Liquid, TopLevelToken, TagToken, Context, Tag } from '..';
+import { Arguments } from '../template';
+import { IdentifierToken } from '../tokens';
+export default class extends Tag {
+ private key;
+ private value;
+ private identifier;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ render(ctx: Context): Generator<unknown, void, unknown>;
+ arguments(): Arguments;
+ localScope(): Iterable<IdentifierToken>;
+}
diff --git a/node_modules/liquidjs/dist/tags/block.d.ts b/node_modules/liquidjs/dist/tags/block.d.ts new file mode 100644 index 0000000..d8f732e --- /dev/null +++ b/node_modules/liquidjs/dist/tags/block.d.ts @@ -0,0 +1,11 @@ +import { Liquid, TagToken, TopLevelToken, Template, Context, Emitter, Tag } from '..';
+import { Parser } from '../parser';
+export default class extends Tag {
+ block: string;
+ templates: Template[];
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<any, void, unknown>;
+ private getBlockRender;
+ children(): Generator<unknown, Template[]>;
+ blockScope(): Iterable<string>;
+}
diff --git a/node_modules/liquidjs/dist/tags/break.d.ts b/node_modules/liquidjs/dist/tags/break.d.ts new file mode 100644 index 0000000..f3d4225 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/break.d.ts @@ -0,0 +1,4 @@ +import { Context, Emitter, Tag } from '..';
+export default class extends Tag {
+ render(ctx: Context, _emitter: Emitter): void;
+}
diff --git a/node_modules/liquidjs/dist/tags/capture.d.ts b/node_modules/liquidjs/dist/tags/capture.d.ts new file mode 100644 index 0000000..fe4b32c --- /dev/null +++ b/node_modules/liquidjs/dist/tags/capture.d.ts @@ -0,0 +1,13 @@ +import { Liquid, Tag, Template, Context, TagToken, TopLevelToken } from '..';
+import { Parser } from '../parser';
+import { IdentifierToken, QuotedToken } from '../tokens';
+export default class extends Tag {
+ identifier: IdentifierToken | QuotedToken;
+ variable: string;
+ templates: Template[];
+ constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ private readVariable;
+ render(ctx: Context): Generator<unknown, void, string>;
+ children(): Generator<unknown, Template[]>;
+ localScope(): Iterable<string | IdentifierToken | QuotedToken>;
+}
diff --git a/node_modules/liquidjs/dist/tags/case.d.ts b/node_modules/liquidjs/dist/tags/case.d.ts new file mode 100644 index 0000000..7daf6f7 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/case.d.ts @@ -0,0 +1,15 @@ +import { ValueToken, Liquid, Value, Emitter, TagToken, TopLevelToken, Context, Template, Tag } from '..';
+import { Parser } from '../parser';
+import { Arguments } from '../template';
+export default class extends Tag {
+ value: Value;
+ branches: {
+ values: ValueToken[];
+ templates: Template[];
+ }[];
+ elseTemplates: Template[];
+ constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, void, unknown>;
+ arguments(): Arguments;
+ children(): Generator<unknown, Template[]>;
+}
diff --git a/node_modules/liquidjs/dist/tags/comment.d.ts b/node_modules/liquidjs/dist/tags/comment.d.ts new file mode 100644 index 0000000..2c0f4b9 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/comment.d.ts @@ -0,0 +1,5 @@ +import { Liquid, TopLevelToken, TagToken, Tag } from '..';
+export default class extends Tag {
+ constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ render(): void;
+}
diff --git a/node_modules/liquidjs/dist/tags/continue.d.ts b/node_modules/liquidjs/dist/tags/continue.d.ts new file mode 100644 index 0000000..ab3892b --- /dev/null +++ b/node_modules/liquidjs/dist/tags/continue.d.ts @@ -0,0 +1,4 @@ +import { Tag, Emitter, Context } from '..';
+export default class extends Tag {
+ render(ctx: Context, _emitter: Emitter): void;
+}
diff --git a/node_modules/liquidjs/dist/tags/cycle.d.ts b/node_modules/liquidjs/dist/tags/cycle.d.ts new file mode 100644 index 0000000..442c445 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/cycle.d.ts @@ -0,0 +1,9 @@ +import { TopLevelToken, Liquid, Emitter, TagToken, Context, Tag } from '..';
+import { Arguments } from '../template';
+export default class extends Tag {
+ private candidates;
+ private group?;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown>;
+ arguments(): Arguments;
+}
diff --git a/node_modules/liquidjs/dist/tags/decrement.d.ts b/node_modules/liquidjs/dist/tags/decrement.d.ts new file mode 100644 index 0000000..2aa08fb --- /dev/null +++ b/node_modules/liquidjs/dist/tags/decrement.d.ts @@ -0,0 +1,9 @@ +import { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..';
+import { IdentifierToken } from '../tokens';
+export default class extends Tag {
+ private identifier;
+ private variable;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ render(context: Context, emitter: Emitter): void;
+ localScope(): Iterable<string | IdentifierToken>;
+}
diff --git a/node_modules/liquidjs/dist/tags/echo.d.ts b/node_modules/liquidjs/dist/tags/echo.d.ts new file mode 100644 index 0000000..292da18 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/echo.d.ts @@ -0,0 +1,8 @@ +import { Liquid, TopLevelToken, Emitter, TagToken, Context, Tag } from '..';
+import { Arguments } from '../template';
+export default class extends Tag {
+ private value?;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, void, unknown>;
+ arguments(): Arguments;
+}
diff --git a/node_modules/liquidjs/dist/tags/for.d.ts b/node_modules/liquidjs/dist/tags/for.d.ts new file mode 100644 index 0000000..1f62a17 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/for.d.ts @@ -0,0 +1,15 @@ +import { Hash, ValueToken, Liquid, Tag, Emitter, TagToken, TopLevelToken, Context, Template } from '..';
+import { Parser } from '../parser';
+import { Arguments } from '../template';
+export default class extends Tag {
+ variable: string;
+ collection: ValueToken;
+ hash: Hash;
+ templates: Template[];
+ elseTemplates: Template[];
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, void | string, Template[]>;
+ children(): Generator<unknown, Template[]>;
+ arguments(): Arguments;
+ blockScope(): Iterable<string>;
+}
diff --git a/node_modules/liquidjs/dist/tags/if.d.ts b/node_modules/liquidjs/dist/tags/if.d.ts new file mode 100644 index 0000000..a82cf28 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/if.d.ts @@ -0,0 +1,14 @@ +import { Liquid, Tag, Value, Emitter, TagToken, TopLevelToken, Context, Template } from '..';
+import { Parser } from '../parser';
+import { Arguments } from '../template';
+export default class extends Tag {
+ branches: {
+ value: Value;
+ templates: Template[];
+ }[];
+ elseTemplates: Template[] | undefined;
+ constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, void, string>;
+ children(): Generator<unknown, Template[]>;
+ arguments(): Arguments;
+}
diff --git a/node_modules/liquidjs/dist/tags/include.d.ts b/node_modules/liquidjs/dist/tags/include.d.ts new file mode 100644 index 0000000..e073faa --- /dev/null +++ b/node_modules/liquidjs/dist/tags/include.d.ts @@ -0,0 +1,12 @@ +import { Template, TopLevelToken, Liquid, Tag, Emitter, TagToken, Context } from '..';
+import { Parser } from '../parser';
+import { Arguments, PartialScope } from '../template';
+export default class extends Tag {
+ private withVar?;
+ private hash;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, void, unknown>;
+ children(partials: boolean, sync: boolean): Generator<unknown, Template[]>;
+ partialScope(): PartialScope | undefined;
+ arguments(): Arguments;
+}
diff --git a/node_modules/liquidjs/dist/tags/increment.d.ts b/node_modules/liquidjs/dist/tags/increment.d.ts new file mode 100644 index 0000000..2aa08fb --- /dev/null +++ b/node_modules/liquidjs/dist/tags/increment.d.ts @@ -0,0 +1,9 @@ +import { Tag, Liquid, TopLevelToken, Emitter, TagToken, Context } from '..';
+import { IdentifierToken } from '../tokens';
+export default class extends Tag {
+ private identifier;
+ private variable;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ render(context: Context, emitter: Emitter): void;
+ localScope(): Iterable<string | IdentifierToken>;
+}
diff --git a/node_modules/liquidjs/dist/tags/index.d.ts b/node_modules/liquidjs/dist/tags/index.d.ts new file mode 100644 index 0000000..37852f9 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/index.d.ts @@ -0,0 +1,24 @@ +import AssignTag from './assign';
+import ForTag from './for';
+import CaptureTag from './capture';
+import CaseTag from './case';
+import CommentTag from './comment';
+import IncludeTag from './include';
+import RenderTag from './render';
+import DecrementTag from './decrement';
+import CycleTag from './cycle';
+import IfTag from './if';
+import IncrementTag from './increment';
+import LayoutTag from './layout';
+import BlockTag from './block';
+import RawTag from './raw';
+import TablerowTag from './tablerow';
+import UnlessTag from './unless';
+import BreakTag from './break';
+import ContinueTag from './continue';
+import EchoTag from './echo';
+import LiquidTag from './liquid';
+import InlineCommentTag from './inline-comment';
+import type { TagClass } from '../template/tag';
+export declare const tags: Record<string, TagClass>;
+export { AssignTag, ForTag, CaptureTag, CaseTag, CommentTag, IncludeTag, RenderTag, DecrementTag, IncrementTag, CycleTag, IfTag, LayoutTag, BlockTag, RawTag, TablerowTag, UnlessTag, BreakTag, ContinueTag, EchoTag, LiquidTag, InlineCommentTag };
diff --git a/node_modules/liquidjs/dist/tags/inline-comment.d.ts b/node_modules/liquidjs/dist/tags/inline-comment.d.ts new file mode 100644 index 0000000..98282ab --- /dev/null +++ b/node_modules/liquidjs/dist/tags/inline-comment.d.ts @@ -0,0 +1,5 @@ +import { TagToken, Liquid, TopLevelToken, Tag } from '..';
+export default class extends Tag {
+ constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ render(): void;
+}
diff --git a/node_modules/liquidjs/dist/tags/layout.d.ts b/node_modules/liquidjs/dist/tags/layout.d.ts new file mode 100644 index 0000000..8b84c5a --- /dev/null +++ b/node_modules/liquidjs/dist/tags/layout.d.ts @@ -0,0 +1,14 @@ +import { Template, Liquid, Tag, Emitter, Hash, TagToken, TopLevelToken, Context } from '..';
+import { ParsedFileName } from './render';
+import { Parser } from '../parser';
+import { Arguments, PartialScope } from '../template';
+export default class extends Tag {
+ args: Hash;
+ templates: Template[];
+ file?: ParsedFileName;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown>;
+ children(partials: boolean): Generator<unknown, Template[]>;
+ arguments(): Arguments;
+ partialScope(): PartialScope | undefined;
+}
diff --git a/node_modules/liquidjs/dist/tags/liquid.d.ts b/node_modules/liquidjs/dist/tags/liquid.d.ts new file mode 100644 index 0000000..59540be --- /dev/null +++ b/node_modules/liquidjs/dist/tags/liquid.d.ts @@ -0,0 +1,8 @@ +import { Template, Emitter, Liquid, TopLevelToken, TagToken, Context, Tag } from '..';
+import { Parser } from '../parser';
+export default class extends Tag {
+ templates: Template[];
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, void, unknown>;
+ children(): Generator<unknown, Template[]>;
+}
diff --git a/node_modules/liquidjs/dist/tags/raw.d.ts b/node_modules/liquidjs/dist/tags/raw.d.ts new file mode 100644 index 0000000..26e9e68 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/raw.d.ts @@ -0,0 +1,6 @@ +import { Liquid, TagToken, TopLevelToken, Tag } from '..';
+export default class extends Tag {
+ private tokens;
+ constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ render(): string;
+}
diff --git a/node_modules/liquidjs/dist/tags/render.d.ts b/node_modules/liquidjs/dist/tags/render.d.ts new file mode 100644 index 0000000..6b054ae --- /dev/null +++ b/node_modules/liquidjs/dist/tags/render.d.ts @@ -0,0 +1,22 @@ +import { TopLevelToken, Liquid, Token, Template, Tokenizer, Emitter, TagToken, Context, Tag } from '..';
+import { Parser } from '../parser';
+import { Arguments, PartialScope } from '../template';
+export type ParsedFileName = Template[] | Token | string | undefined;
+export default class extends Tag {
+ private file;
+ private currentFile?;
+ private hash;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, void, unknown>;
+ children(partials: boolean, sync: boolean): Generator<unknown, Template[]>;
+ partialScope(): PartialScope | undefined;
+ arguments(): Arguments;
+}
+/**
+ * @return null for "none",
+ * @return Template[] for quoted with tags and/or filters
+ * @return Token for expression (not quoted)
+ * @throws TypeError if cannot read next token
+ */
+export declare function parseFilePath(tokenizer: Tokenizer, liquid: Liquid, parser: Parser): ParsedFileName;
+export declare function renderFilePath(file: ParsedFileName, ctx: Context, liquid: Liquid): IterableIterator<unknown>;
diff --git a/node_modules/liquidjs/dist/tags/tablerow.d.ts b/node_modules/liquidjs/dist/tags/tablerow.d.ts new file mode 100644 index 0000000..809a224 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/tablerow.d.ts @@ -0,0 +1,14 @@ +import { ValueToken, Liquid, Tag, Emitter, Hash, TagToken, TopLevelToken, Context, Template } from '..';
+import { Parser } from '../parser';
+import { Arguments } from '../template';
+export default class extends Tag {
+ variable: string;
+ args: Hash;
+ templates: Template[];
+ collection: ValueToken;
+ constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, void, unknown>;
+ children(): Generator<unknown, Template[]>;
+ arguments(): Arguments;
+ blockScope(): string[];
+}
diff --git a/node_modules/liquidjs/dist/tags/unless.d.ts b/node_modules/liquidjs/dist/tags/unless.d.ts new file mode 100644 index 0000000..fd69953 --- /dev/null +++ b/node_modules/liquidjs/dist/tags/unless.d.ts @@ -0,0 +1,15 @@ +import { Liquid, Tag, Value, TopLevelToken, Template, Emitter, Context, TagToken } from '..';
+import { Parser } from '../parser';
+import { Arguments } from '../template';
+export default class extends Tag {
+ branches: {
+ value: Value;
+ test: (val: any, ctx: Context) => boolean;
+ templates: Template[];
+ }[];
+ elseTemplates: Template[];
+ constructor(tagToken: TagToken, remainTokens: TopLevelToken[], liquid: Liquid, parser: Parser);
+ render(ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown>;
+ children(): Generator<unknown, Template[]>;
+ arguments(): Arguments;
+}
diff --git a/node_modules/liquidjs/dist/template/analysis.d.ts b/node_modules/liquidjs/dist/template/analysis.d.ts new file mode 100644 index 0000000..4a0d647 --- /dev/null +++ b/node_modules/liquidjs/dist/template/analysis.d.ts @@ -0,0 +1,85 @@ +import { Template } from '.';
+/**
+ * Row, column and file name where a variable was found.
+ */
+export interface VariableLocation {
+ row: number;
+ col: number;
+ file?: string;
+}
+/**
+ * A variable's segments as an array, possibly with nested arrays of segments.
+ */
+export type SegmentArray = Array<string | number | SegmentArray>;
+/**
+ * A variable's segments and location, which can be coerced to a string.
+ */
+export declare class Variable {
+ readonly segments: Array<string | number | Variable>;
+ readonly location: VariableLocation;
+ constructor(segments: Array<string | number | Variable>, location: VariableLocation);
+ toString(): string;
+ /** Return this variable's segments as an array, possibly with nested arrays for nested paths. */
+ toArray(): SegmentArray;
+}
+/**
+ * Property names and array indexes that make up a path to a variable.
+ */
+export type VariableSegments = Array<string | number | Variable>;
+/**
+ * A mapping of variable names to an array of locations at which the variable was found.
+ */
+export type Variables = {
+ [key: string]: Variable[];
+};
+/**
+ * Group variables by the string representation of their root segment.
+ */
+export declare class VariableMap {
+ private map;
+ constructor();
+ get(key: Variable): Variable[];
+ has(key: Variable): boolean;
+ push(variable: Variable): void;
+ asObject(): Variables;
+}
+/**
+ * The result of calling `analyze()` or `analyzeSync()`.
+ */
+export interface StaticAnalysis {
+ /**
+ * All variables, whether they are in scope or not. Including references to names
+ * such as `forloop` from the `for` tag.
+ */
+ variables: Variables;
+ /**
+ * Variables that are not in scope. These could be a "global" variables that are
+ * expected to be provided by the application developer, or possible mistakes
+ * from the template author.
+ *
+ * If a variable is referenced before and after assignment, you should expect
+ * that variable to be included in `globals`, `variables` and `locals`, each with
+ * a different location.
+ */
+ globals: Variables;
+ /**
+ * Template variables that are added to the template local scope using tags like
+ * `assign`, `capture` or `increment`.
+ */
+ locals: Variables;
+}
+export interface StaticAnalysisOptions {
+ /**
+ * When `true` (the default), try to load partial templates and analyze them too.
+ */
+ partials?: boolean;
+}
+export declare const defaultStaticAnalysisOptions: StaticAnalysisOptions;
+/**
+ * Statically analyze a template and report variable usage.
+ */
+export declare function analyze(template: Template[], options?: StaticAnalysisOptions): Promise<StaticAnalysis>;
+/**
+ * Statically analyze a template and report variable usage.
+ */
+export declare function analyzeSync(template: Template[], options?: StaticAnalysisOptions): StaticAnalysis;
diff --git a/node_modules/liquidjs/dist/template/analysis.spec.d.ts b/node_modules/liquidjs/dist/template/analysis.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/analysis.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/template/filter-impl-options.d.ts b/node_modules/liquidjs/dist/template/filter-impl-options.d.ts new file mode 100644 index 0000000..fa303b0 --- /dev/null +++ b/node_modules/liquidjs/dist/template/filter-impl-options.d.ts @@ -0,0 +1,14 @@ +import type { Context } from '../context';
+import type { Liquid } from '../liquid';
+import type { FilterToken } from '../tokens';
+export interface FilterImpl {
+ context: Context;
+ token: FilterToken;
+ liquid: Liquid;
+}
+export type FilterHandler = (this: FilterImpl, value: any, ...args: any[]) => any;
+export interface FilterOptions {
+ handler: FilterHandler;
+ raw: boolean;
+}
+export type FilterImplOptions = FilterHandler | FilterOptions;
diff --git a/node_modules/liquidjs/dist/template/filter.d.ts b/node_modules/liquidjs/dist/template/filter.d.ts new file mode 100644 index 0000000..987abd4 --- /dev/null +++ b/node_modules/liquidjs/dist/template/filter.d.ts @@ -0,0 +1,15 @@ +import { Context } from '../context';
+import { FilterImplOptions } from './filter-impl-options';
+import { FilterArg } from '../parser/filter-arg';
+import { Liquid } from '../liquid';
+import { FilterToken } from '../tokens';
+export declare class Filter {
+ name: string;
+ args: FilterArg[];
+ readonly raw: boolean;
+ private handler;
+ private liquid;
+ private token;
+ constructor(token: FilterToken, options: FilterImplOptions | undefined, liquid: Liquid);
+ render(value: any, context: Context): IterableIterator<unknown>;
+}
diff --git a/node_modules/liquidjs/dist/template/filter.spec.d.ts b/node_modules/liquidjs/dist/template/filter.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/filter.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/template/hash.d.ts b/node_modules/liquidjs/dist/template/hash.d.ts new file mode 100644 index 0000000..b50e404 --- /dev/null +++ b/node_modules/liquidjs/dist/template/hash.d.ts @@ -0,0 +1,18 @@ +import { Context } from '../context/context';
+import { Tokenizer } from '../parser/tokenizer';
+import { Token } from '../tokens/token';
+type HashValueTokens = Record<string, Token | undefined>;
+/**
+ * Key-Value Pairs Representing Tag Arguments
+ * Example:
+ * For the markup `, foo:'bar', coo:2 reversed %}`,
+ * hash['foo'] === 'bar'
+ * hash['coo'] === 2
+ * hash['reversed'] === undefined
+ */
+export declare class Hash {
+ hash: HashValueTokens;
+ constructor(input: string | Tokenizer, jekyllStyle?: boolean | string);
+ render(ctx: Context): Generator<unknown, Record<string, any>, unknown>;
+}
+export {};
diff --git a/node_modules/liquidjs/dist/template/hash.spec.d.ts b/node_modules/liquidjs/dist/template/hash.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/hash.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/template/html.d.ts b/node_modules/liquidjs/dist/template/html.d.ts new file mode 100644 index 0000000..8b8136d --- /dev/null +++ b/node_modules/liquidjs/dist/template/html.d.ts @@ -0,0 +1,9 @@ +import { TemplateImpl, Template } from '../template';
+import { HTMLToken } from '../tokens';
+import { Context } from '../context';
+import { Emitter } from '../emitters';
+export declare class HTML extends TemplateImpl<HTMLToken> implements Template {
+ private str;
+ constructor(token: HTMLToken);
+ render(ctx: Context, emitter: Emitter): IterableIterator<void>;
+}
diff --git a/node_modules/liquidjs/dist/template/index.d.ts b/node_modules/liquidjs/dist/template/index.d.ts new file mode 100644 index 0000000..0c45314 --- /dev/null +++ b/node_modules/liquidjs/dist/template/index.d.ts @@ -0,0 +1,11 @@ +export * from './template';
+export * from './template-impl';
+export * from './tag';
+export * from './tag-options-adapter';
+export * from './filter';
+export * from './filter-impl-options';
+export * from './hash';
+export * from './value';
+export * from './output';
+export * from './html';
+export * from './analysis';
diff --git a/node_modules/liquidjs/dist/template/output.d.ts b/node_modules/liquidjs/dist/template/output.d.ts new file mode 100644 index 0000000..9191ad5 --- /dev/null +++ b/node_modules/liquidjs/dist/template/output.d.ts @@ -0,0 +1,12 @@ +import { Value } from './value';
+import { Arguments, Template, TemplateImpl } from '../template';
+import { Context } from '../context/context';
+import { Emitter } from '../emitters/emitter';
+import { OutputToken } from '../tokens/output-token';
+import { Liquid } from '../liquid';
+export declare class Output extends TemplateImpl<OutputToken> implements Template {
+ value: Value;
+ constructor(token: OutputToken, liquid: Liquid);
+ render(ctx: Context, emitter: Emitter): IterableIterator<unknown>;
+ arguments(): Arguments;
+}
diff --git a/node_modules/liquidjs/dist/template/output.spec.d.ts b/node_modules/liquidjs/dist/template/output.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/output.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/template/tag-options-adapter.d.ts b/node_modules/liquidjs/dist/template/tag-options-adapter.d.ts new file mode 100644 index 0000000..e4f85e4 --- /dev/null +++ b/node_modules/liquidjs/dist/template/tag-options-adapter.d.ts @@ -0,0 +1,10 @@ +import { Tag, TagClass, TagRenderReturn } from './tag';
+import { TagToken, TopLevelToken } from '../tokens';
+import { Emitter } from '../emitters';
+import { Context } from '../context';
+export interface TagImplOptions {
+ [key: string]: any;
+ parse?: (this: Tag & TagImplOptions, token: TagToken, remainingTokens: TopLevelToken[]) => void;
+ render: (this: Tag & TagImplOptions, ctx: Context, emitter: Emitter, hash: Record<string, any>) => TagRenderReturn;
+}
+export declare function createTagClass(options: TagImplOptions): TagClass;
diff --git a/node_modules/liquidjs/dist/template/tag.d.ts b/node_modules/liquidjs/dist/template/tag.d.ts new file mode 100644 index 0000000..b33245f --- /dev/null +++ b/node_modules/liquidjs/dist/template/tag.d.ts @@ -0,0 +1,18 @@ +import { TemplateImpl } from './template-impl';
+import type { Emitter } from '../emitters/emitter';
+import type { Parser, Tokenizer } from '../parser';
+import type { Context } from '../context/context';
+import type { TopLevelToken, TagToken } from '../tokens';
+import type { Template } from './template';
+import type { Liquid } from '../liquid';
+export type TagRenderReturn = Generator<unknown, unknown, unknown> | Promise<unknown> | unknown;
+export declare abstract class Tag extends TemplateImpl<TagToken> implements Template {
+ name: string;
+ liquid: Liquid;
+ protected tokenizer: Tokenizer;
+ constructor(token: TagToken, remainTokens: TopLevelToken[], liquid: Liquid);
+ abstract render(ctx: Context, emitter: Emitter): TagRenderReturn;
+}
+export interface TagClass {
+ new (token: TagToken, tokens: TopLevelToken[], liquid: Liquid, parser: Parser): Tag;
+}
diff --git a/node_modules/liquidjs/dist/template/template-impl.d.ts b/node_modules/liquidjs/dist/template/template-impl.d.ts new file mode 100644 index 0000000..99edd24 --- /dev/null +++ b/node_modules/liquidjs/dist/template/template-impl.d.ts @@ -0,0 +1,4 @@ +export declare abstract class TemplateImpl<T> {
+ token: T;
+ constructor(token: T);
+}
diff --git a/node_modules/liquidjs/dist/template/template.d.ts b/node_modules/liquidjs/dist/template/template.d.ts new file mode 100644 index 0000000..a1fba7d --- /dev/null +++ b/node_modules/liquidjs/dist/template/template.d.ts @@ -0,0 +1,36 @@ +import { Context } from '../context/context';
+import { Token } from '../tokens/token';
+import { Emitter } from '../emitters/emitter';
+import { IdentifierToken, QuotedToken, ValueToken } from '../tokens';
+import { Value } from './value';
+export type Argument = Value | ValueToken;
+export type Arguments = Iterable<Argument>;
+/** Scope information used when analyzing partial templates. */
+export interface PartialScope {
+ /**
+ * The name of the partial template. We need this to make sure we only analyze
+ * each template once.
+ * */
+ name: string;
+ /**
+ * If `true`, names in `scope` will be added to a new, isolated scope before
+ * analyzing any child templates, without access to the parent template's scope.
+ */
+ isolated: boolean;
+ /**
+ * A list of names that will be in scope for the child template.
+ *
+ * If an item is a [string, Argument] tuple, the string is considered an alias
+ * for the argument.
+ */
+ scope: Iterable<string | [string, Argument]>;
+}
+export interface Template {
+ token: Token;
+ render(ctx: Context, emitter: Emitter): any;
+ children?(partials: boolean, sync: boolean): Generator<unknown, Template[]>;
+ arguments?(): Arguments;
+ blockScope?(): Iterable<string>;
+ localScope?(): Iterable<IdentifierToken | QuotedToken>;
+ partialScope?(): PartialScope | undefined;
+}
diff --git a/node_modules/liquidjs/dist/template/value.d.ts b/node_modules/liquidjs/dist/template/value.d.ts new file mode 100644 index 0000000..05e2ff9 --- /dev/null +++ b/node_modules/liquidjs/dist/template/value.d.ts @@ -0,0 +1,15 @@ +import { Filter } from './filter';
+import { Expression } from '../render';
+import type { FilteredValueToken } from '../tokens';
+import type { Liquid } from '../liquid';
+import type { Context } from '../context';
+export declare class Value {
+ readonly filters: Filter[];
+ readonly initial: Expression;
+ /**
+ * @param str the value to be valuated, eg.: "foobar" | truncate: 3
+ */
+ constructor(input: string | FilteredValueToken, liquid: Liquid);
+ value(ctx: Context, lenient?: boolean): Generator<unknown, unknown, unknown>;
+ private getFilter;
+}
diff --git a/node_modules/liquidjs/dist/template/value.spec.d.ts b/node_modules/liquidjs/dist/template/value.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/template/value.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/tokens/delimited-token.d.ts b/node_modules/liquidjs/dist/tokens/delimited-token.d.ts new file mode 100644 index 0000000..523bda2 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/delimited-token.d.ts @@ -0,0 +1,9 @@ +import { Token } from './token';
+import { TokenKind } from '../parser';
+export declare abstract class DelimitedToken extends Token {
+ trimLeft: boolean;
+ trimRight: boolean;
+ contentRange: [number, number];
+ constructor(kind: TokenKind, [contentBegin, contentEnd]: [number, number], input: string, begin: number, end: number, trimLeft: boolean, trimRight: boolean, file?: string);
+ get content(): string;
+}
diff --git a/node_modules/liquidjs/dist/tokens/filter-token.d.ts b/node_modules/liquidjs/dist/tokens/filter-token.d.ts new file mode 100644 index 0000000..f298cc1 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/filter-token.d.ts @@ -0,0 +1,7 @@ +import { Token } from './token';
+import { FilterArg } from '../parser/filter-arg';
+export declare class FilterToken extends Token {
+ name: string;
+ args: FilterArg[];
+ constructor(name: string, args: FilterArg[], input: string, begin: number, end: number, file?: string);
+}
diff --git a/node_modules/liquidjs/dist/tokens/filtered-value-token.d.ts b/node_modules/liquidjs/dist/tokens/filtered-value-token.d.ts new file mode 100644 index 0000000..a535051 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/filtered-value-token.d.ts @@ -0,0 +1,17 @@ +import { Token } from './token';
+import { FilterToken } from './filter-token';
+import { Expression } from '../render';
+/**
+ * value expression with optional filters
+ * e.g.
+ * {% assign foo="bar" | append: "coo" %}
+ */
+export declare class FilteredValueToken extends Token {
+ initial: Expression;
+ filters: FilterToken[];
+ input: string;
+ begin: number;
+ end: number;
+ file?: string | undefined;
+ constructor(initial: Expression, filters: FilterToken[], input: string, begin: number, end: number, file?: string | undefined);
+}
diff --git a/node_modules/liquidjs/dist/tokens/hash-token.d.ts b/node_modules/liquidjs/dist/tokens/hash-token.d.ts new file mode 100644 index 0000000..68d0511 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/hash-token.d.ts @@ -0,0 +1,12 @@ +import { Token } from './token';
+import { ValueToken } from './value-token';
+import { IdentifierToken } from './identifier-token';
+export declare class HashToken extends Token {
+ input: string;
+ begin: number;
+ end: number;
+ name: IdentifierToken;
+ value?: ValueToken | undefined;
+ file?: string | undefined;
+ constructor(input: string, begin: number, end: number, name: IdentifierToken, value?: ValueToken | undefined, file?: string | undefined);
+}
diff --git a/node_modules/liquidjs/dist/tokens/html-token.d.ts b/node_modules/liquidjs/dist/tokens/html-token.d.ts new file mode 100644 index 0000000..298a200 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/html-token.d.ts @@ -0,0 +1,11 @@ +import { Token } from './token';
+export declare class HTMLToken extends Token {
+ input: string;
+ begin: number;
+ end: number;
+ file?: string | undefined;
+ trimLeft: number;
+ trimRight: number;
+ constructor(input: string, begin: number, end: number, file?: string | undefined);
+ getContent(): string;
+}
diff --git a/node_modules/liquidjs/dist/tokens/identifier-token.d.ts b/node_modules/liquidjs/dist/tokens/identifier-token.d.ts new file mode 100644 index 0000000..e40ebf3 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/identifier-token.d.ts @@ -0,0 +1,9 @@ +import { Token } from './token';
+export declare class IdentifierToken extends Token {
+ input: string;
+ begin: number;
+ end: number;
+ file?: string | undefined;
+ content: string;
+ constructor(input: string, begin: number, end: number, file?: string | undefined);
+}
diff --git a/node_modules/liquidjs/dist/tokens/index.d.ts b/node_modules/liquidjs/dist/tokens/index.d.ts new file mode 100644 index 0000000..f61c8c0 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/index.d.ts @@ -0,0 +1,18 @@ +export * from './top-level-token';
+export * from './tag-token';
+export * from './output-token';
+export * from './html-token';
+export * from './number-token';
+export * from './identifier-token';
+export * from './literal-token';
+export * from './operator-token';
+export * from './property-access-token';
+export * from './filter-token';
+export * from './hash-token';
+export * from './quoted-token';
+export * from './token';
+export * from './range-token';
+export * from './value-token';
+export * from './liquid-tag-token';
+export * from './delimited-token';
+export * from './filtered-value-token';
diff --git a/node_modules/liquidjs/dist/tokens/liquid-tag-token.d.ts b/node_modules/liquidjs/dist/tokens/liquid-tag-token.d.ts new file mode 100644 index 0000000..c6e29a8 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/liquid-tag-token.d.ts @@ -0,0 +1,12 @@ +import { DelimitedToken } from './delimited-token';
+import { NormalizedFullOptions } from '../liquid-options';
+import { Tokenizer } from '../parser';
+/**
+ * LiquidTagToken is different from TagToken by not having delimiters `{%` or `%}`
+ */
+export declare class LiquidTagToken extends DelimitedToken {
+ name: string;
+ tokenizer: Tokenizer;
+ constructor(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: string);
+ get args(): string;
+}
diff --git a/node_modules/liquidjs/dist/tokens/literal-token.d.ts b/node_modules/liquidjs/dist/tokens/literal-token.d.ts new file mode 100644 index 0000000..739076c --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/literal-token.d.ts @@ -0,0 +1,11 @@ +import { Token } from './token';
+import { LiteralValue } from '../util';
+export declare class LiteralToken extends Token {
+ input: string;
+ begin: number;
+ end: number;
+ file?: string | undefined;
+ content: LiteralValue;
+ literal: string;
+ constructor(input: string, begin: number, end: number, file?: string | undefined);
+}
diff --git a/node_modules/liquidjs/dist/tokens/number-token.d.ts b/node_modules/liquidjs/dist/tokens/number-token.d.ts new file mode 100644 index 0000000..2faf6f1 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/number-token.d.ts @@ -0,0 +1,9 @@ +import { Token } from './token';
+export declare class NumberToken extends Token {
+ input: string;
+ begin: number;
+ end: number;
+ file?: string | undefined;
+ content: number;
+ constructor(input: string, begin: number, end: number, file?: string | undefined);
+}
diff --git a/node_modules/liquidjs/dist/tokens/operator-token.d.ts b/node_modules/liquidjs/dist/tokens/operator-token.d.ts new file mode 100644 index 0000000..dac5180 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/operator-token.d.ts @@ -0,0 +1,38 @@ +import { Token } from './token';
+export declare const enum OperatorType {
+ Binary = 0,
+ Unary = 1
+}
+export declare const operatorPrecedences: {
+ '==': number;
+ '!=': number;
+ '>': number;
+ '<': number;
+ '>=': number;
+ '<=': number;
+ contains: number;
+ not: number;
+ and: number;
+ or: number;
+};
+export declare const operatorTypes: {
+ '==': OperatorType;
+ '!=': OperatorType;
+ '>': OperatorType;
+ '<': OperatorType;
+ '>=': OperatorType;
+ '<=': OperatorType;
+ contains: OperatorType;
+ not: OperatorType;
+ and: OperatorType;
+ or: OperatorType;
+};
+export declare class OperatorToken extends Token {
+ input: string;
+ begin: number;
+ end: number;
+ file?: string | undefined;
+ operator: string;
+ constructor(input: string, begin: number, end: number, file?: string | undefined);
+ getPrecedence(): any;
+}
diff --git a/node_modules/liquidjs/dist/tokens/output-token.d.ts b/node_modules/liquidjs/dist/tokens/output-token.d.ts new file mode 100644 index 0000000..33a7cb3 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/output-token.d.ts @@ -0,0 +1,5 @@ +import { DelimitedToken } from './delimited-token';
+import { NormalizedFullOptions } from '../liquid-options';
+export declare class OutputToken extends DelimitedToken {
+ constructor(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: string);
+}
diff --git a/node_modules/liquidjs/dist/tokens/property-access-token.d.ts b/node_modules/liquidjs/dist/tokens/property-access-token.d.ts new file mode 100644 index 0000000..1717801 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/property-access-token.d.ts @@ -0,0 +1,12 @@ +import { Token } from './token';
+import { LiteralToken } from './literal-token';
+import { ValueToken } from './value-token';
+import { IdentifierToken } from './identifier-token';
+import { NumberToken } from './number-token';
+import { RangeToken } from './range-token';
+import { QuotedToken } from './quoted-token';
+export declare class PropertyAccessToken extends Token {
+ variable: QuotedToken | RangeToken | LiteralToken | NumberToken | undefined;
+ props: (ValueToken | IdentifierToken)[];
+ constructor(variable: QuotedToken | RangeToken | LiteralToken | NumberToken | undefined, props: (ValueToken | IdentifierToken)[], input: string, begin: number, end: number, file?: string);
+}
diff --git a/node_modules/liquidjs/dist/tokens/quoted-token.d.ts b/node_modules/liquidjs/dist/tokens/quoted-token.d.ts new file mode 100644 index 0000000..7de7f0b --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/quoted-token.d.ts @@ -0,0 +1,9 @@ +import { Token } from './token';
+export declare class QuotedToken extends Token {
+ input: string;
+ begin: number;
+ end: number;
+ file?: string | undefined;
+ readonly content: string;
+ constructor(input: string, begin: number, end: number, file?: string | undefined);
+}
diff --git a/node_modules/liquidjs/dist/tokens/range-token.d.ts b/node_modules/liquidjs/dist/tokens/range-token.d.ts new file mode 100644 index 0000000..d2a4c40 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/range-token.d.ts @@ -0,0 +1,11 @@ +import { Token } from './token';
+import { ValueToken } from './value-token';
+export declare class RangeToken extends Token {
+ input: string;
+ begin: number;
+ end: number;
+ lhs: ValueToken;
+ rhs: ValueToken;
+ file?: string | undefined;
+ constructor(input: string, begin: number, end: number, lhs: ValueToken, rhs: ValueToken, file?: string | undefined);
+}
diff --git a/node_modules/liquidjs/dist/tokens/tag-token.d.ts b/node_modules/liquidjs/dist/tokens/tag-token.d.ts new file mode 100644 index 0000000..e51fefd --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/tag-token.d.ts @@ -0,0 +1,9 @@ +import { DelimitedToken } from './delimited-token';
+import { Tokenizer } from '../parser';
+import type { NormalizedFullOptions } from '../liquid-options';
+export declare class TagToken extends DelimitedToken {
+ name: string;
+ tokenizer: Tokenizer;
+ readonly args: string;
+ constructor(input: string, begin: number, end: number, options: NormalizedFullOptions, file?: string);
+}
diff --git a/node_modules/liquidjs/dist/tokens/token.d.ts b/node_modules/liquidjs/dist/tokens/token.d.ts new file mode 100644 index 0000000..b45a0c0 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/token.d.ts @@ -0,0 +1,12 @@ +import { TokenKind } from '../parser';
+export declare abstract class Token {
+ kind: TokenKind;
+ input: string;
+ begin: number;
+ end: number;
+ file?: string | undefined;
+ constructor(kind: TokenKind, input: string, begin: number, end: number, file?: string | undefined);
+ getText(): string;
+ getPosition(): number[];
+ size(): number;
+}
diff --git a/node_modules/liquidjs/dist/tokens/top-level-token.d.ts b/node_modules/liquidjs/dist/tokens/top-level-token.d.ts new file mode 100644 index 0000000..830d452 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/top-level-token.d.ts @@ -0,0 +1,4 @@ +import type { TagToken } from './tag-token';
+import type { HTMLToken } from './html-token';
+import type { OutputToken } from './output-token';
+export type TopLevelToken = TagToken | OutputToken | HTMLToken;
diff --git a/node_modules/liquidjs/dist/tokens/value-token.d.ts b/node_modules/liquidjs/dist/tokens/value-token.d.ts new file mode 100644 index 0000000..017bfc6 --- /dev/null +++ b/node_modules/liquidjs/dist/tokens/value-token.d.ts @@ -0,0 +1,6 @@ +import { RangeToken } from './range-token';
+import { LiteralToken } from './literal-token';
+import { NumberToken } from './number-token';
+import { QuotedToken } from './quoted-token';
+import { PropertyAccessToken } from './property-access-token';
+export type ValueToken = RangeToken | LiteralToken | QuotedToken | PropertyAccessToken | NumberToken;
diff --git a/node_modules/liquidjs/dist/util/assert.d.ts b/node_modules/liquidjs/dist/util/assert.d.ts new file mode 100644 index 0000000..230729e --- /dev/null +++ b/node_modules/liquidjs/dist/util/assert.d.ts @@ -0,0 +1,2 @@ +export declare function assert<T>(predicate: T | null | undefined, message?: string | (() => string)): void;
+export declare function assertEmpty<T>(predicate: T | null | undefined, message?: string): void;
diff --git a/node_modules/liquidjs/dist/util/assert.spec.d.ts b/node_modules/liquidjs/dist/util/assert.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/assert.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/util/async.d.ts b/node_modules/liquidjs/dist/util/async.d.ts new file mode 100644 index 0000000..9d75958 --- /dev/null +++ b/node_modules/liquidjs/dist/util/async.d.ts @@ -0,0 +1,2 @@ +export declare function toPromise<T>(val: Generator<unknown, T, unknown> | Promise<T> | T): Promise<T>;
+export declare function toValueSync<T>(val: Generator<unknown, T, unknown> | T): T;
diff --git a/node_modules/liquidjs/dist/util/async.spec.d.ts b/node_modules/liquidjs/dist/util/async.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/async.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/util/character.d.ts b/node_modules/liquidjs/dist/util/character.d.ts new file mode 100644 index 0000000..e41d432 --- /dev/null +++ b/node_modules/liquidjs/dist/util/character.d.ts @@ -0,0 +1,10 @@ +export declare const TYPES: number[];
+export declare const WORD = 1;
+export declare const OPERATOR = 2;
+export declare const BLANK = 4;
+export declare const QUOTE = 8;
+export declare const INLINE_BLANK = 16;
+export declare const NUMBER = 32;
+export declare const SIGN = 64;
+export declare const PUNCTUATION = 128;
+export declare function isWord(char: string): boolean;
diff --git a/node_modules/liquidjs/dist/util/error.d.ts b/node_modules/liquidjs/dist/util/error.d.ts new file mode 100644 index 0000000..215005d --- /dev/null +++ b/node_modules/liquidjs/dist/util/error.d.ts @@ -0,0 +1,35 @@ +import { Token } from '../tokens/token';
+import { Template } from '../template/template';
+export declare abstract class LiquidError extends Error {
+ token: Token;
+ context: string;
+ originalError?: Error;
+ constructor(err: Error | string, token: Token);
+ protected update(): void;
+ static is(obj: unknown): obj is LiquidError;
+}
+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: Template);
+ static is(obj: any): obj is RenderError;
+}
+export declare class LiquidErrors extends LiquidError {
+ errors: RenderError[];
+ constructor(errors: RenderError[]);
+ static is(obj: any): obj is LiquidErrors;
+}
+export declare class UndefinedVariableError extends LiquidError {
+ constructor(err: Error, token: Token);
+}
+export declare class InternalUndefinedVariableError extends Error {
+ variableName: string;
+ constructor(variableName: string);
+}
+export declare class AssertionError extends Error {
+ constructor(message: string);
+}
diff --git a/node_modules/liquidjs/dist/util/error.spec.d.ts b/node_modules/liquidjs/dist/util/error.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/error.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/util/index.d.ts b/node_modules/liquidjs/dist/util/index.d.ts new file mode 100644 index 0000000..fa6a79c --- /dev/null +++ b/node_modules/liquidjs/dist/util/index.d.ts @@ -0,0 +1,12 @@ +export * from './error';
+export * from './character';
+export * from './assert';
+export * from './literal';
+export * from './underscore';
+export * from './operator-trie';
+export * from './type-guards';
+export * from './async';
+export * from './strftime';
+export * from './liquid-date';
+export * from './limiter';
+export * from './intl';
diff --git a/node_modules/liquidjs/dist/util/intl.d.ts b/node_modules/liquidjs/dist/util/intl.d.ts new file mode 100644 index 0000000..4037931 --- /dev/null +++ b/node_modules/liquidjs/dist/util/intl.d.ts @@ -0,0 +1,6 @@ +export declare function getDateTimeFormat(): {
+ (locales?: string | string[] | undefined, options?: Intl.DateTimeFormatOptions | undefined): Intl.DateTimeFormat;
+ new (locales?: string | string[] | undefined, options?: Intl.DateTimeFormatOptions | undefined): Intl.DateTimeFormat;
+ supportedLocalesOf(locales: string | string[], options?: Intl.DateTimeFormatOptions | undefined): string[];
+ readonly prototype: Intl.DateTimeFormat;
+} | undefined;
diff --git a/node_modules/liquidjs/dist/util/limiter.d.ts b/node_modules/liquidjs/dist/util/limiter.d.ts new file mode 100644 index 0000000..75b025d --- /dev/null +++ b/node_modules/liquidjs/dist/util/limiter.d.ts @@ -0,0 +1,8 @@ +export declare class Limiter {
+ private message;
+ private base;
+ private limit;
+ constructor(resource: string, limit: number);
+ use(count: number): void;
+ check(count: number): void;
+}
diff --git a/node_modules/liquidjs/dist/util/liquid-date.d.ts b/node_modules/liquidjs/dist/util/liquid-date.d.ts new file mode 100644 index 0000000..88097e9 --- /dev/null +++ b/node_modules/liquidjs/dist/util/liquid-date.d.ts @@ -0,0 +1,52 @@ +/**
+ * A date implementation with timezone info, just like Ruby date
+ *
+ * Implementation:
+ * - create a Date offset by it's timezone difference, avoiding overriding a bunch of methods
+ * - rewrite getTimezoneOffset() to trick strftime
+ */
+export declare class LiquidDate {
+ private locale;
+ private timezoneOffset;
+ private timezoneName;
+ private date;
+ private displayDate;
+ private DateTimeFormat;
+ timezoneFixed: boolean;
+ constructor(init: string | number | Date, locale: string, timezone?: number | string);
+ getTime(): number;
+ getMilliseconds(): number;
+ getSeconds(): number;
+ getMinutes(): number;
+ getHours(): number;
+ getDay(): number;
+ getDate(): number;
+ getMonth(): number;
+ getFullYear(): number;
+ toLocaleString(locale?: string, init?: any): string;
+ toLocaleTimeString(locale?: string): string;
+ toLocaleDateString(locale?: string): string;
+ getTimezoneOffset(): number;
+ getTimeZoneName(): string | undefined;
+ getLongMonthName(): string;
+ getShortMonthName(): string;
+ getLongWeekdayName(): string;
+ getShortWeekdayName(): string;
+ valid(): boolean;
+ private format;
+ /**
+ * Create a Date object fixed to it's declared Timezone. Both
+ * - 2021-08-06T02:29:00.000Z and
+ * - 2021-08-06T02:29:00.000+08:00
+ * will always be displayed as
+ * - 2021-08-06 02:29:00
+ * regardless timezoneOffset in JavaScript realm
+ *
+ * The implementation hack:
+ * Instead of calling `.getMonth()`/`.getUTCMonth()` respect to `preserveTimezones`,
+ * we create a different Date to trick strftime, it's both simpler and more performant.
+ * Given that a template is expected to be parsed fewer times than rendered.
+ */
+ static createDateFixedToTimezone(dateString: string, locale: string): LiquidDate;
+ private static getTimezoneOffset;
+}
diff --git a/node_modules/liquidjs/dist/util/liquid-date.spec.d.ts b/node_modules/liquidjs/dist/util/liquid-date.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/liquid-date.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/util/literal.d.ts b/node_modules/liquidjs/dist/util/literal.d.ts new file mode 100644 index 0000000..bc1b406 --- /dev/null +++ b/node_modules/liquidjs/dist/util/literal.d.ts @@ -0,0 +1,11 @@ +import { BlankDrop, EmptyDrop, NullDrop } from '../drop';
+export declare const literalValues: {
+ true: boolean;
+ false: boolean;
+ nil: NullDrop;
+ null: NullDrop;
+ empty: EmptyDrop;
+ blank: BlankDrop;
+};
+export type LiteralKey = keyof typeof literalValues;
+export type LiteralValue = typeof literalValues[LiteralKey];
diff --git a/node_modules/liquidjs/dist/util/operator-trie.d.ts b/node_modules/liquidjs/dist/util/operator-trie.d.ts new file mode 100644 index 0000000..b21050e --- /dev/null +++ b/node_modules/liquidjs/dist/util/operator-trie.d.ts @@ -0,0 +1,14 @@ +interface TrieInput<T> {
+ [key: string]: T;
+}
+interface TrieLeafNode<T> {
+ data: T;
+ end: true;
+ needBoundary?: true;
+}
+export interface Trie<T> {
+ [key: string]: Trie<T> | TrieLeafNode<T>;
+}
+export type TrieNode<T> = Trie<T> | TrieLeafNode<T>;
+export declare function createTrie<T = any>(input: TrieInput<T>): Trie<T>;
+export {};
diff --git a/node_modules/liquidjs/dist/util/performance.d.ts b/node_modules/liquidjs/dist/util/performance.d.ts new file mode 100644 index 0000000..4dca49a --- /dev/null +++ b/node_modules/liquidjs/dist/util/performance.d.ts @@ -0,0 +1,5 @@ +interface LiquidPerformance {
+ now: () => number;
+}
+export declare function getPerformance(): LiquidPerformance;
+export {};
diff --git a/node_modules/liquidjs/dist/util/performance.spec.d.ts b/node_modules/liquidjs/dist/util/performance.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/performance.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/util/strftime.d.ts b/node_modules/liquidjs/dist/util/strftime.d.ts new file mode 100644 index 0000000..5e4aea5 --- /dev/null +++ b/node_modules/liquidjs/dist/util/strftime.d.ts @@ -0,0 +1,2 @@ +import { LiquidDate } from './liquid-date';
+export declare function strftime(d: LiquidDate, formatStr: string): string;
diff --git a/node_modules/liquidjs/dist/util/strftime.spec.d.ts b/node_modules/liquidjs/dist/util/strftime.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/strftime.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/util/type-guards.d.ts b/node_modules/liquidjs/dist/util/type-guards.d.ts new file mode 100644 index 0000000..b6ea5e7 --- /dev/null +++ b/node_modules/liquidjs/dist/util/type-guards.d.ts @@ -0,0 +1,13 @@ +import { RangeToken, NumberToken, QuotedToken, LiteralToken, PropertyAccessToken, OutputToken, HTMLToken, TagToken, IdentifierToken, DelimitedToken, OperatorToken, ValueToken } from '../tokens';
+export declare function isDelimitedToken(val: any): val is DelimitedToken;
+export declare function isOperatorToken(val: any): val is OperatorToken;
+export declare function isHTMLToken(val: any): val is HTMLToken;
+export declare function isOutputToken(val: any): val is OutputToken;
+export declare function isTagToken(val: any): val is TagToken;
+export declare function isQuotedToken(val: any): val is QuotedToken;
+export declare function isLiteralToken(val: any): val is LiteralToken;
+export declare function isNumberToken(val: any): val is NumberToken;
+export declare function isPropertyAccessToken(val: any): val is PropertyAccessToken;
+export declare function isWordToken(val: any): val is IdentifierToken;
+export declare function isRangeToken(val: any): val is RangeToken;
+export declare function isValueToken(val: any): val is ValueToken;
diff --git a/node_modules/liquidjs/dist/util/type-guards.spec.d.ts b/node_modules/liquidjs/dist/util/type-guards.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/type-guards.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/dist/util/underscore.d.ts b/node_modules/liquidjs/dist/util/underscore.d.ts new file mode 100644 index 0000000..c54f852 --- /dev/null +++ b/node_modules/liquidjs/dist/util/underscore.d.ts @@ -0,0 +1,40 @@ +export declare const toString: () => string;
+export declare const hasOwnProperty: (v: PropertyKey) => boolean;
+export declare function isString(value: any): value is string;
+export declare function isFunction(value: any): value is Function;
+export declare function isPromise<T>(val: any): val is Promise<T>;
+export declare function isIterator(val: any): val is IterableIterator<any>;
+export declare function escapeRegex(str: string): string;
+export declare function promisify<T1, T2>(fn: (arg1: T1, cb: (err: Error | null, result: T2) => void) => void): (arg1: T1) => Promise<T2>;
+export declare function promisify<T1, T2, T3>(fn: (arg1: T1, arg2: T2, cb: (err: Error | null, result: T3) => void) => void): (arg1: T1, arg2: T2) => Promise<T3>;
+export declare function stringify(value: any): string;
+export declare function toEnumerable<T = unknown>(val: any): T[];
+export declare function toArray(val: any): any[];
+export declare function toValue(value: any): any;
+export declare function toNumber(value: any): number;
+export declare function isNumber(value: any): value is number;
+export declare function toLiquid(value: any): any;
+export declare function isNil(value: any): boolean;
+export declare function isUndefined(value: any): boolean;
+export declare function isArray(value: any): value is any[];
+export declare function isArrayLike(value: any): value is any[];
+export declare function isIterable(value: any): value is Iterable<any>;
+export declare function forOwn<T>(obj: Record<string, T> | undefined, iteratee: ((val: T, key: string, obj: {
+ [key: string]: T;
+}) => boolean | void)): Record<string, T>;
+export declare function last<T>(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;
+export declare function padEnd(str: any, length: number, ch?: string): any;
+export declare function pad(str: any, length: number, ch: string, add: (str: string, ch: string) => string): any;
+export declare function identify<T>(val: T): T;
+export declare function changeCase(str: string): string;
+export declare function ellipsis(str: string, N: number): string;
+export declare function caseInsensitiveCompare(a: any, b: any): 0 | 1 | -1;
+export declare function argumentsToValue<F extends (...args: any) => any, T>(fn: F): (this: T, ...args: Parameters<F>) => any;
+export declare function argumentsToNumber<F extends (...args: any) => any, T>(fn: F): (this: T, ...args: Parameters<F>) => any;
+export declare function escapeRegExp(text: string): string;
+/** Return an array containing unique elements from _array_. Works with nested arrays and objects. */
+export declare function strictUniq<T>(array: Array<T>): Generator<T>;
diff --git a/node_modules/liquidjs/dist/util/underscore.spec.d.ts b/node_modules/liquidjs/dist/util/underscore.spec.d.ts new file mode 100644 index 0000000..509db18 --- /dev/null +++ b/node_modules/liquidjs/dist/util/underscore.spec.d.ts @@ -0,0 +1 @@ +export {};
diff --git a/node_modules/liquidjs/package.json b/node_modules/liquidjs/package.json new file mode 100644 index 0000000..b401d2d --- /dev/null +++ b/node_modules/liquidjs/package.json @@ -0,0 +1,165 @@ +{ + "name": "liquidjs", + "version": "10.23.0", + "sideEffects": false, + "description": "A simple, expressive and safe Shopify / Github Pages compatible template engine in pure JavaScript.", + "main": "dist/liquid.node.js", + "module": "dist/liquid.node.mjs", + "es2015": "dist/liquid.browser.mjs", + "browser": { + "./dist/liquid.node.js": "./dist/liquid.browser.umd.js", + "./dist/liquid.node.mjs": "./dist/liquid.browser.mjs" + }, + "types": "dist/index.d.ts", + "engines": { + "node": ">=16" + }, + "scripts": { + "lint": "eslint \"**/*.mjs\" \"**/*.ts\" .", + "check": "npm run build && npm run build:docs && npm test && npm run lint && npm run perf:diff", + "test": "jest", + "test:coverage": "jest --coverage src test/integration", + "test:e2e": "jest test/e2e", + "test:demo": "./test/demo/test.sh", + "perf:diff": "bin/perf-diff.sh", + "perf:engines": "cd benchmark && npm run engines", + "version": "npm run build && npm test", + "build": "rollup -c rollup.config.mjs", + "build:cjs": "BUNDLES=cjs rollup -c rollup.config.mjs", + "build:min": "BUNDLES=min rollup -c rollup.config.mjs", + "build:umd": "BUNDLES=umd rollup -c rollup.config.mjs", + "build:charmap": "./bin/character-gen.js > src/util/character.ts", + "build:docs": "bin/build-docs.sh" + }, + "bin": { + "liquidjs": "./bin/liquid.js", + "liquid": "./bin/liquid.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/harttle/liquidjs.git" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/liquidjs" + }, + "files": [ + "bin/liquid.js", + "dist", + "LICENSE", + "README.md" + ], + "keywords": [ + "liquid", + "template engine", + "express", + "jinja", + "shopify" + ], + "author": "Harttle", + "license": "MIT", + "bugs": { + "url": "https://github.com/harttle/liquidjs/issues" + }, + "homepage": "https://github.com/harttle/liquidjs#readme", + "devDependencies": { + "@commitlint/cli": "^12.1.4", + "@commitlint/config-conventional": "^8.2.0", + "@semantic-release/changelog": "^6.0.2", + "@semantic-release/commit-analyzer": "^9.0.2", + "@semantic-release/git": "^10.0.1", + "@semantic-release/npm": "^9.0.2", + "@semantic-release/release-notes-generator": "^10.0.3", + "@types/benchmark": "^1.0.31", + "@types/express": "^4.17.2", + "@types/jest": "^29.4.0", + "@types/jsdom": "^12.2.2", + "@types/node": "^22.3.0", + "@types/sinon": "^10.0.13", + "@types/supertest": "^2.0.7", + "@typescript-eslint/eslint-plugin": "^5.6.0", + "@typescript-eslint/parser": "^5.6.0", + "all-contributors-cli": "^6.24.0", + "benchmark": "^2.1.4", + "coveralls": "^3.0.2", + "cross-env": "^5.2.0", + "eslint": "^7.32.0", + "eslint-config-standard": "^12.0.0", + "eslint-plugin-deprecation": "^1.3.2", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-mocha": "^5.3.0", + "eslint-plugin-node": "^8.0.1", + "eslint-plugin-promise": "^4.0.1", + "eslint-plugin-standard": "^4.0.0", + "express": "^4.16.4", + "husky": "^4.2.5", + "jest": "^29.5.0", + "jsdom": "^16.5.0", + "rollup": "^1.26.3", + "rollup-plugin-replace": "^2.1.0", + "rollup-plugin-typescript2": "^0.31.1", + "rollup-plugin-uglify": "^6.0.4", + "rollup-plugin-version-injector": "^1.3.3", + "semantic-release": "^19.0.3", + "sinon": "^15.0.2", + "supertest": "^3.4.2", + "ts-jest": "^29.0.5", + "tslib": "^2.3.1", + "typedoc": "^0.26.5", + "typedoc-plugin-missing-exports": "^3.0.0", + "typescript": "^4.5.3" + }, + "dependencies": { + "commander": "^10.0.0" + }, + "release": { + "branch": "master", + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + "@semantic-release/npm", + [ + "@semantic-release/git", + { + "assets": [ + "package.json", + "package-lock.json", + "CHANGELOG.md" + ], + "message": "chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}" + } + ], + [ + "@semantic-release/github", + { + "assets": [ + { + "path": "dist/*.umd.js", + "label": "liquid.js" + }, + { + "path": "dist/*.min.js", + "label": "liquid.min.js" + }, + { + "path": "dist/*.min.js.map", + "label": "liquid.min.js.map" + } + ] + } + ] + ] + }, + "nyc": { + "extension": [ + ".ts" + ] + }, + "husky": { + "hooks": { + "pre-commit": "npm run check", + "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" + } + } +} |
