From 70192929caa00cc2d3243cf5b28ca06aa8fc4810 Mon Sep 17 00:00:00 2001 From: Gabe Farrell Date: Fri, 28 Oct 2022 19:11:10 -0400 Subject: [PATCH] first --- bucket-policy.json | 15 + src/index.js | 90 ++ src/node_modules/.package-lock.json | 19 + src/node_modules/squirrelly/LICENSE | 7 + src/node_modules/squirrelly/README.md | 140 ++ .../squirrelly/dist/browser/squirrelly.dev.js | 964 ++++++++++++++ .../dist/browser/squirrelly.dev.js.map | 1 + .../squirrelly/dist/browser/squirrelly.min.js | 2 + .../dist/browser/squirrelly.min.js.map | 1 + .../squirrelly/dist/squirrelly.cjs.js | 1172 +++++++++++++++++ .../squirrelly/dist/squirrelly.cjs.js.map | 1 + .../squirrelly/dist/squirrelly.es.js | 1154 ++++++++++++++++ .../squirrelly/dist/squirrelly.es.js.map | 1 + .../squirrelly/dist/types/browser.d.ts | 6 + .../squirrelly/dist/types/compile-string.d.ts | 5 + .../squirrelly/dist/types/compile.d.ts | 4 + .../squirrelly/dist/types/config.d.ts | 48 + .../dist/types/container-utils.d.ts | 8 + .../squirrelly/dist/types/containers.d.ts | 18 + .../squirrelly/dist/types/err.d.ts | 6 + .../squirrelly/dist/types/file-handlers.d.ts | 23 + .../squirrelly/dist/types/file-helpers.d.ts | 8 + .../squirrelly/dist/types/file-utils.d.ts | 16 + .../squirrelly/dist/types/index.d.ts | 8 + .../squirrelly/dist/types/parse.d.ts | 23 + .../squirrelly/dist/types/render.d.ts | 4 + .../squirrelly/dist/types/storage.d.ts | 13 + .../squirrelly/dist/types/utils.d.ts | 8 + .../squirrelly/examples/conditionals.ts | 20 + .../squirrelly/examples/filters.ts | 23 + .../squirrelly/examples/runkit.js | 5 + .../squirrelly/examples/trycatch.ts | 26 + src/node_modules/squirrelly/package.json | 151 +++ src/package-lock.json | 33 + src/package.json | 8 + template.yml | 157 +++ 36 files changed, 4188 insertions(+) create mode 100644 bucket-policy.json create mode 100644 src/index.js create mode 100644 src/node_modules/.package-lock.json create mode 100644 src/node_modules/squirrelly/LICENSE create mode 100644 src/node_modules/squirrelly/README.md create mode 100644 src/node_modules/squirrelly/dist/browser/squirrelly.dev.js create mode 100644 src/node_modules/squirrelly/dist/browser/squirrelly.dev.js.map create mode 100644 src/node_modules/squirrelly/dist/browser/squirrelly.min.js create mode 100644 src/node_modules/squirrelly/dist/browser/squirrelly.min.js.map create mode 100644 src/node_modules/squirrelly/dist/squirrelly.cjs.js create mode 100644 src/node_modules/squirrelly/dist/squirrelly.cjs.js.map create mode 100644 src/node_modules/squirrelly/dist/squirrelly.es.js create mode 100644 src/node_modules/squirrelly/dist/squirrelly.es.js.map create mode 100644 src/node_modules/squirrelly/dist/types/browser.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/compile-string.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/compile.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/config.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/container-utils.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/containers.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/err.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/file-handlers.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/file-helpers.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/file-utils.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/index.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/parse.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/render.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/storage.d.ts create mode 100644 src/node_modules/squirrelly/dist/types/utils.d.ts create mode 100644 src/node_modules/squirrelly/examples/conditionals.ts create mode 100644 src/node_modules/squirrelly/examples/filters.ts create mode 100644 src/node_modules/squirrelly/examples/runkit.js create mode 100644 src/node_modules/squirrelly/examples/trycatch.ts create mode 100644 src/node_modules/squirrelly/package.json create mode 100644 src/package-lock.json create mode 100644 src/package.json create mode 100644 template.yml diff --git a/bucket-policy.json b/bucket-policy.json new file mode 100644 index 0000000..d5de964 --- /dev/null +++ b/bucket-policy.json @@ -0,0 +1,15 @@ +{ + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "PublicRead", + "Effect": "Allow", + "Principal": "*", + "Action": [ + "s3:GetObject", + "s3:GetObjectVersion" + ], + "Resource": "arn:aws:s3:::group7-code-bucket-73h3fdsa/songs/*" + } + ] +} \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..1ce923d --- /dev/null +++ b/src/index.js @@ -0,0 +1,90 @@ +var sqrl = require('squirrelly') +const fs = require('fs') +const AWS = require('aws-sdk'); +const docClient = new AWS.DynamoDB.DocumentClient(); + +// let data = { +// songs: [ +// { +// Title: "Well Enough", +// Artist: "Future Teens", +// File: "this.mp3" +// }, +// { +// Title: "BYOB", +// Artist: "Future Teens", +// File: "that.mp3" +// }, +// ] +// } + +const params = { + TableName: 'MusicTable' +} + +exports.handler = async (e, ctx) => { + let scan = await docClient.scan(params).promise() + let data = { + songs: [] + } + do { + scan.Items.forEach((i) => data.songs.push(i)) + params.ExclusiveStartKey = scan.LastEvaluatedKey + } while (typeof scan.LastEvaluatedKey != 'undefined') + console.log(e) + return response(sqrl.render(template, data)) +} + +function response(html){ + return { + "statusCode": 200, + "body": html, + "headers": { + "Content-Type": "text/html", + } + } +} + +const template = ` + + + + + + + Test + + +
+

Illegal Music Site

+
+ + + +
+
+ {{@each(it.songs) => s, i}} +
+

{{s.Title}} - {{s.Artist}}

+ +
+ {{/each}} +
+
+ + + +` diff --git a/src/node_modules/.package-lock.json b/src/node_modules/.package-lock.json new file mode 100644 index 0000000..b04d1d5 --- /dev/null +++ b/src/node_modules/.package-lock.json @@ -0,0 +1,19 @@ +{ + "name": "musicserver", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "node_modules/squirrelly": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/squirrelly/-/squirrelly-8.0.8.tgz", + "integrity": "sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/squirrellyjs/squirrelly?sponsor=1" + } + } + } +} diff --git a/src/node_modules/squirrelly/LICENSE b/src/node_modules/squirrelly/LICENSE new file mode 100644 index 0000000..e30a7e4 --- /dev/null +++ b/src/node_modules/squirrelly/LICENSE @@ -0,0 +1,7 @@ +Copyright 2019 Ben Gubler + +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/src/node_modules/squirrelly/README.md b/src/node_modules/squirrelly/README.md new file mode 100644 index 0000000..e45a858 --- /dev/null +++ b/src/node_modules/squirrelly/README.md @@ -0,0 +1,140 @@ +Squirrel + +# squirrelly + +

+ Documentation - + Chat - + RunKit Demo - + Playground +

+ + +[logo]: https://img.shields.io/badge/all_contributors-5-orange.svg 'Number of contributors on All-Contributors' + + +![GitHub package.json version (master)](https://img.shields.io/github/package-json/v/squirrellyjs/squirrelly/master?label=current%20version) +[![Travis](https://img.shields.io/travis/com/squirrellyjs/squirrelly/master.svg)](https://travis-ci.com/squirrellyjs/squirrelly) +[![All Contributors][logo]](#contributors-) +[![Coveralls](https://img.shields.io/coveralls/squirrellyjs/squirrelly.svg)](https://coveralls.io/github/squirrellyjs/squirrelly) +[![Donate](https://img.shields.io/badge/donate-paypal-blue.svg)](https://paypal.me/bengubler) + +**Summary** + +Squirrelly is a modern, configurable, and blazing fast template engine implemented in JavaScript. It works out of the box with ExpressJS and the **full version** weighs only **~4KB gzipped**. + +**This is version 8** - a new, more powerful rewrite of Squirrelly. It adds multiple features (like filter parameters, whitespace control, partials, and template inheritance) to bring you a template engine with the power of Nunjucks, the simplicity of EJS, and the small bundle size of its earlier versions. + +Squirrelly v7 will continue to be maintained, and can be found at https://github.com/squirrellyjs/squirrelly/tree/v7. + +[Read about the changes](https://squirrelly.js.org/blog/squirrelly-version-8) + +_Looking for a [lightweight, faster, and more reliable](https://eta.js.org/docs/about/eta-vs-ejs) **alternative to EJS?** Check out Squirrelly's cousin, [Eta](https://eta.js.org)._ + +## Why Squirrelly? + +Simply put, Squirrelly is super lightweight, super fast, super powerful, and super simple. + +### 🌟 Features + +- 🔧 Helpers, filters +- 🔧 Great error reporting +- 📦 0 dependencies +- 🔨 Conditionals +- 🔧 Better quotes/comments support + - _ex. `{{someval + "name }}" }}`_ compiles correctly, while it fails with DoT or EJS +- ⚡️ Exports ES Modules as well as UMD +- 🔨 Loops +- 🔧 Custom delimeters +- 📝 Easy template syntax +- 🔧 Precompilation +- 🔨 Partials +- 🔧 Inline JavaScript +- 🔨 Comments +- 🔧 Caching +- 🚀 Super Fast + - Squirrelly [has been benchmarked](https://github.com/nebrelbug/squirrelly-benchmarks/tree/v8) against Marko, Pug, doT, Swig, Handlebars, Mustache, and Nunjucks. In each test, Squirrelly was fastest. +- ⚡️ Async support: async filters, helpers, partials +- 🔧 Template inheritance + +## 📜 Docs + +We know nobody reads through the long and boring documentation in the ReadMe anyway, so head over to the documentation website: + +📝 [https://squirrelly.js.org](https://squirrelly.js.org) + +## 📓 Examples + +### Simple Template + +``` +var myTemplate = "

My favorite kind of cake is: {{it.favoriteCake}}

" + +Sqrl.render(myTemplate, {favoriteCake: 'Chocolate!'}) +// Returns: '

My favorite kind of cake is: Chocolate!

+``` + +### Conditionals + +``` +{{@if(it.somevalue === 1)}} +Display this +{{#else}} +Display this +{{/if}} +``` + +### Loops + +``` +{{@each(it.somearray) => val, index}} +Display this +The current array element is {{val}} +The current index is {{index}} +{{/each}} +``` + +## ✔️ Tests + +Tests can be run with `npm test`. Multiple tests check that parsing, rendering, and compiling return expected results, formatting follows guidelines, and code coverage is at the expected level. + +## Resources + +To be added + +## Projects using `squirrelly` + +[Waiting for permissions] + +- [Cypress](https://www.cypress.io/): Fast, easy and reliable testing for anything that runs in a browser +- [txAdmin](https://github.com/tabarra/txAdmin): A **full featured** web panel to manage & monitor your FiveM Server remotely, used by over two thousand servers worldwide +- [Add yours!](https://github.com/squirrellyjs/squirrelly/edit/master/README.md) + +## Contributors + +Made with ❤ by [@nebrelbug](https://github.com/nebrelbug) and all these wonderful contributors ([emoji key](https://github.com/kentcdodds/all-contributors#emoji-key)): + + + + + + + + + + + + +

Ben Gubler

💻 💬 📖 ⚠️

Clite Tailor

🤔 💻

Ioan CHIRIAC

💻 🤔

Lucas Wilson

🐛 💻

Jon McLean

💻 ⚠️
+ + + + + +_Note: because we completely rewrote Version 8 and it has a separate Git history, this chart excludes the dozens of contributors to Version 7. Their contributions are deeply appreciated and many of their ideas and code contributions are being used in Squirrelly v8. Many of their contributions can be found in the [v7 branch commit history](https://github.com/squirrellyjs/squirrelly/commits/v7)._ + +This project follows the [all-contributors](https://github.com/kentcdodds/all-contributors) specification. Contributions of any kind are welcome! + +## Credits + +- Async support and file handling were added based on code from [EJS](https://github.com/mde/ejs), which is licensed under the Apache-2.0 license. Code was modified to throw informative errors and work with Squirrelly's API diff --git a/src/node_modules/squirrelly/dist/browser/squirrelly.dev.js b/src/node_modules/squirrelly/dist/browser/squirrelly.dev.js new file mode 100644 index 0000000..bdff7ed --- /dev/null +++ b/src/node_modules/squirrelly/dist/browser/squirrelly.dev.js @@ -0,0 +1,964 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Sqrl = {})); +}(this, (function (exports) { 'use strict'; + + function setPrototypeOf(obj, proto) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(obj, proto); + } + else { + obj.__proto__ = proto; + } + } + function SqrlErr(message) { + var err = new Error(message); + setPrototypeOf(err, SqrlErr.prototype); + return err; + } + SqrlErr.prototype = Object.create(Error.prototype, { + name: { value: 'Squirrelly Error', enumerable: false } + }); + // TODO: Class transpilation adds a lot to the bundle size + function ParseErr(message, str, indx) { + var whitespace = str.slice(0, indx).split(/\n/); + var lineNo = whitespace.length; + var colNo = whitespace[lineNo - 1].length + 1; + message += + ' at line ' + + lineNo + + ' col ' + + colNo + + ':\n\n' + + ' ' + + str.split(/\n/)[lineNo - 1] + + '\n' + + ' ' + + Array(colNo).join(' ') + + '^'; + throw SqrlErr(message); + } + + // TODO: allow '-' to trim up until newline. Use [^\S\n\r] instead of \s + // TODO: only include trimLeft polyfill if not in ES6 + /* END TYPES */ + var promiseImpl = new Function('return this')().Promise; + var asyncFunc = false; + try { + asyncFunc = new Function('return (async function(){}).constructor')(); + } + catch (e) { + // We shouldn't actually ever have any other errors, but... + if (!(e instanceof SyntaxError)) { + throw e; + } + } + function hasOwnProp(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); + } + function copyProps(toObj, fromObj, notConfig) { + for (var key in fromObj) { + if (hasOwnProp(fromObj, key)) { + if (fromObj[key] != null && + typeof fromObj[key] == 'object' && + (key === 'storage' || key === 'prefixes') && + !notConfig // not called from Cache.load + ) { + // plugins or storage + // Note: this doesn't merge from initial config! + // Deep clone instead of assigning + // TODO: run checks on this + toObj[key] = copyProps(/*toObj[key] ||*/ {}, fromObj[key]); + } + else { + toObj[key] = fromObj[key]; + } + } + } + return toObj; + } + function trimWS(str, env, wsLeft, wsRight) { + var leftTrim; + var rightTrim; + if (typeof env.autoTrim === 'string') { + leftTrim = rightTrim = env.autoTrim; + // Don't need to check if env.autoTrim is false + // Because leftTrim, rightTrim are initialized as falsy + } + else if (Array.isArray(env.autoTrim)) { + // kinda confusing + // but _}} will trim the left side of the following string + leftTrim = env.autoTrim[1]; + rightTrim = env.autoTrim[0]; + } + if (wsLeft || wsLeft === false) { + leftTrim = wsLeft; + } + if (wsRight || wsRight === false) { + rightTrim = wsRight; + } + if (leftTrim === 'slurp' && rightTrim === 'slurp') { + return str.trim(); + } + if (leftTrim === '_' || leftTrim === 'slurp') { + // console.log('trimming left' + leftTrim) + // full slurp + // eslint-disable-next-line no-extra-boolean-cast + if (!!String.prototype.trimLeft) { + str = str.trimLeft(); + } + else { + str = str.replace(/^[\s\uFEFF\xA0]+/, ''); + } + } + else if (leftTrim === '-' || leftTrim === 'nl') { + // console.log('trimming left nl' + leftTrim) + // nl trim + str = str.replace(/^(?:\n|\r|\r\n)/, ''); + } + if (rightTrim === '_' || rightTrim === 'slurp') { + // console.log('trimming right' + rightTrim) + // full slurp + // eslint-disable-next-line no-extra-boolean-cast + if (!!String.prototype.trimRight) { + str = str.trimRight(); + } + else { + str = str.replace(/[\s\uFEFF\xA0]+$/, ''); + } + } + else if (rightTrim === '-' || rightTrim === 'nl') { + // console.log('trimming right nl' + rightTrim) + // nl trim + str = str.replace(/(?:\n|\r|\r\n)$/, ''); // TODO: make sure this gets \r\n + } + return str; + } + + /* END TYPES */ + var asyncRegExp = /^async +/; + var templateLitReg = /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\${)[^\\`])*`/g; + var singleQuoteReg = /'(?:\\[\s\w"'\\`]|[^\n\r'\\])*?'/g; + var doubleQuoteReg = /"(?:\\[\s\w"'\\`]|[^\n\r"\\])*?"/g; + var specialCharsReg = /[.*+\-?^${}()|[\]\\]/g; + function escapeRegExp(string) { + // From MDN + return specialCharsReg.test(string) + ? string.replace(specialCharsReg, '\\$&') // $& means the whole matched string + : string; + } + function parse(str, env) { + /* Adding for EJS compatibility */ + if (env.rmWhitespace) { + // Code taken directly from EJS + // Have to use two separate replaces here as `^` and `$` operators don't + // work well with `\r` and empty lines don't work well with the `m` flag. + // Essentially, this replaces the whitespace at the beginning and end of + // each line and removes multiple newlines. + str = str.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, ''); + } + /* End rmWhitespace option */ + templateLitReg.lastIndex = 0; + singleQuoteReg.lastIndex = 0; + doubleQuoteReg.lastIndex = 0; + var envPrefixes = env.prefixes; + var prefixes = [ + envPrefixes.h, + envPrefixes.b, + envPrefixes.i, + envPrefixes.r, + envPrefixes.c, + envPrefixes.e + ].reduce(function (accumulator, prefix) { + if (accumulator && prefix) { + return accumulator + '|' + escapeRegExp(prefix); + } + else if (prefix) { + // accumulator is empty + return escapeRegExp(prefix); + } + else { + // prefix and accumulator are both empty strings + return accumulator; + } + }, ''); + var parseCloseReg = new RegExp('([|()]|=>)|' + // powerchars + '(\'|"|`|\\/\\*)|\\s*((\\/)?(-|_)?' + // comments, strings + escapeRegExp(env.tags[1]) + + ')', 'g'); + var tagOpenReg = new RegExp('([^]*?)' + escapeRegExp(env.tags[0]) + '(-|_)?\\s*(' + prefixes + ')?\\s*', 'g'); + var startInd = 0; + var trimNextLeftWs = false; + function parseTag(tagOpenIndex, currentType) { + var currentObj = { f: [] }; + var numParens = 0; + var currentAttribute = 'c'; // default - Valid values: 'c'=content, 'f'=filter, 'fp'=filter params, 'p'=param, 'n'=name + if (currentType === 'h' || currentType === 'b' || currentType === 'c') { + currentAttribute = 'n'; + } + else if (currentType === 'r') { + currentObj.raw = true; + currentType = 'i'; + } + function addAttrValue(indx) { + var valUnprocessed = str.slice(startInd, indx); + // console.log(valUnprocessed) + var val = valUnprocessed.trim(); + if (currentAttribute === 'f') { + if (val === 'safe') { + currentObj.raw = true; + } + else { + if (env.async && asyncRegExp.test(val)) { + val = val.replace(asyncRegExp, ''); + currentObj.f.push([val, '', true]); + } + else { + currentObj.f.push([val, '']); + } + } + } + else if (currentAttribute === 'fp') { + currentObj.f[currentObj.f.length - 1][1] += val; + } + else if (currentAttribute === 'err') { + if (val) { + var found = valUnprocessed.search(/\S/); + ParseErr('invalid syntax', str, startInd + found); + } + } + else { + // if (currentObj[currentAttribute]) { // TODO make sure no errs + // currentObj[currentAttribute] += val + // } else { + currentObj[currentAttribute] = val; + // } + } + startInd = indx + 1; + } + parseCloseReg.lastIndex = startInd; + var m; + // tslint:disable-next-line:no-conditional-assignment + while ((m = parseCloseReg.exec(str)) !== null) { + var char = m[1]; + var punctuator = m[2]; + var tagClose = m[3]; + var slash = m[4]; + var wsControl = m[5]; + var i = m.index; + if (char) { + // Power character + if (char === '(') { + if (numParens === 0) { + if (currentAttribute === 'n') { + addAttrValue(i); + currentAttribute = 'p'; + } + else if (currentAttribute === 'f') { + addAttrValue(i); + currentAttribute = 'fp'; + } + } + numParens++; + } + else if (char === ')') { + numParens--; + if (numParens === 0 && currentAttribute !== 'c') { + // Then it's closing a filter, block, or helper + addAttrValue(i); + currentAttribute = 'err'; // Reset the current attribute + } + } + else if (numParens === 0 && char === '|') { + addAttrValue(i); // this should actually always be whitespace or empty + currentAttribute = 'f'; + } + else if (char === '=>') { + addAttrValue(i); + startInd += 1; // this is 2 chars + currentAttribute = 'res'; + } + } + else if (punctuator) { + if (punctuator === '/*') { + var commentCloseInd = str.indexOf('*/', parseCloseReg.lastIndex); + if (commentCloseInd === -1) { + ParseErr('unclosed comment', str, m.index); + } + parseCloseReg.lastIndex = commentCloseInd + 2; // since */ is 2 characters, and we're using indexOf rather than a RegExp + } + else if (punctuator === "'") { + singleQuoteReg.lastIndex = m.index; + var singleQuoteMatch = singleQuoteReg.exec(str); + if (singleQuoteMatch) { + parseCloseReg.lastIndex = singleQuoteReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + else if (punctuator === '"') { + doubleQuoteReg.lastIndex = m.index; + var doubleQuoteMatch = doubleQuoteReg.exec(str); + if (doubleQuoteMatch) { + parseCloseReg.lastIndex = doubleQuoteReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + else if (punctuator === '`') { + templateLitReg.lastIndex = m.index; + var templateLitMatch = templateLitReg.exec(str); + if (templateLitMatch) { + parseCloseReg.lastIndex = templateLitReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + } + else if (tagClose) { + addAttrValue(i); + startInd = i + m[0].length; + tagOpenReg.lastIndex = startInd; + // console.log('tagClose: ' + startInd) + trimNextLeftWs = wsControl; + if (slash && currentType === 'h') { + currentType = 's'; + } // TODO throw err + currentObj.t = currentType; + return currentObj; + } + } + ParseErr('unclosed tag', str, tagOpenIndex); + return currentObj; // To prevent TypeScript from erroring + } + function parseContext(parentObj, firstParse) { + parentObj.b = []; // assume there will be blocks // TODO: perf optimize this + parentObj.d = []; + var lastBlock = false; + var buffer = []; + function pushString(strng, shouldTrimRightOfString) { + if (strng) { + // if string is truthy it must be of type 'string' + // TODO: benchmark replace( /(\\|')/g, '\\$1') + strng = trimWS(strng, env, trimNextLeftWs, // this will only be false on the first str, the next ones will be null or undefined + shouldTrimRightOfString); + if (strng) { + // replace \ with \\, ' with \' + strng = strng.replace(/\\|'/g, '\\$&').replace(/\r\n|\n|\r/g, '\\n'); + // we're going to convert all CRLF to LF so it doesn't take more than one replace + buffer.push(strng); + } + } + } + // Random TODO: parentObj.b doesn't need to have t: # + var tagOpenMatch; + // tslint:disable-next-line:no-conditional-assignment + while ((tagOpenMatch = tagOpenReg.exec(str)) !== null) { + var precedingString = tagOpenMatch[1]; + var shouldTrimRightPrecedingString = tagOpenMatch[2]; + var prefix = tagOpenMatch[3] || ''; + var prefixType; + for (var key in envPrefixes) { + if (envPrefixes[key] === prefix) { + prefixType = key; + break; + } + } + pushString(precedingString, shouldTrimRightPrecedingString); + startInd = tagOpenMatch.index + tagOpenMatch[0].length; + if (!prefixType) { + ParseErr('unrecognized tag type: ' + prefix, str, startInd); + } + var currentObj = parseTag(tagOpenMatch.index, prefixType); + // ===== NOW ADD THE OBJECT TO OUR BUFFER ===== + var currentType = currentObj.t; + if (currentType === 'h') { + var hName = currentObj.n || ''; + if (env.async && asyncRegExp.test(hName)) { + currentObj.a = true; + currentObj.n = hName.replace(asyncRegExp, ''); + } + currentObj = parseContext(currentObj); // currentObj is the parent object + buffer.push(currentObj); + } + else if (currentType === 'c') { + // tag close + if (parentObj.n === currentObj.n) { + if (lastBlock) { + // If there's a previous block + lastBlock.d = buffer; + parentObj.b.push(lastBlock); + } + else { + parentObj.d = buffer; + } + // console.log('parentObj: ' + JSON.stringify(parentObj)) + return parentObj; + } + else { + ParseErr("Helper start and end don't match", str, tagOpenMatch.index + tagOpenMatch[0].length); + } + } + else if (currentType === 'b') { + // block + // TODO: make sure async stuff inside blocks are recognized + if (lastBlock) { + // If there's a previous block + lastBlock.d = buffer; + parentObj.b.push(lastBlock); + } + else { + parentObj.d = buffer; + } + var blockName = currentObj.n || ''; + if (env.async && asyncRegExp.test(blockName)) { + currentObj.a = true; + currentObj.n = blockName.replace(asyncRegExp, ''); + } + lastBlock = currentObj; // Set the 'lastBlock' object to the value of the current block + buffer = []; + } + else if (currentType === 's') { + var selfClosingHName = currentObj.n || ''; + if (env.async && asyncRegExp.test(selfClosingHName)) { + currentObj.a = true; + currentObj.n = selfClosingHName.replace(asyncRegExp, ''); + } + buffer.push(currentObj); + } + else { + buffer.push(currentObj); + } + // ===== DONE ADDING OBJECT TO BUFFER ===== + } + if (firstParse) { + pushString(str.slice(startInd, str.length), false); + parentObj.d = buffer; + } + else { + throw SqrlErr('unclosed helper "' + parentObj.n + '"'); + // It should have returned by now + } + return parentObj; + } + var parseResult = parseContext({ f: [] }, true); + // console.log(JSON.stringify(parseResult)) + if (env.plugins) { + for (var i = 0; i < env.plugins.length; i++) { + var plugin = env.plugins[i]; + if (plugin.processAST) { + parseResult.d = plugin.processAST(parseResult.d, env); + } + } + } + return parseResult.d; // Parse the very outside context + } + + // import SqrlErr from './err' + /* END TYPES */ + function compileToString(str, env) { + var buffer = parse(str, env); + var res = "var tR='';" + + (env.useWith ? 'with(' + env.varName + '||{}){' : '') + + compileScope(buffer, env) + + 'if(cb){cb(null,tR)} return tR' + + (env.useWith ? '}' : ''); + if (env.plugins) { + for (var i = 0; i < env.plugins.length; i++) { + var plugin = env.plugins[i]; + if (plugin.processFnString) { + res = plugin.processFnString(res, env); + } + } + } + return res; + // TODO: is `return cb()` necessary, or could we just do `cb()` + } + function filter(str, filters) { + for (var i = 0; i < filters.length; i++) { + var name = filters[i][0]; + var params = filters[i][1]; + var isFilterAsync = filters[i][2]; + // if (isFilterAsync && !env.async) { + // throw SqrlErr("Async filter '" + name + "' in non-async env") + // } + // Let the JS compiler do this, compile() will catch it + str = (isFilterAsync ? 'await ' : '') + "c.l('F','" + name + "')(" + str; + if (params) { + str += ',' + params; + } + str += ')'; + } + return str; + } + // TODO: Use type intersections for TemplateObject, etc. + // so I don't have to make properties mandatory + function compileHelper(env, res, descendants, params, isAsync, name) { + var ret = '{exec:' + + (isAsync ? 'async ' : '') + + compileScopeIntoFunction(descendants, res, env) + + ',params:[' + + params + + ']'; + if (name) { + ret += ",name:'" + name + "'"; + } + if (isAsync) { + ret += ',async:true'; + } + ret += '}'; + return ret; + } + function compileBlocks(blocks, env) { + var ret = '['; + for (var i = 0; i < blocks.length; i++) { + var block = blocks[i]; + ret += compileHelper(env, block.res || '', block.d, block.p || '', block.a, block.n); + if (i < blocks.length) { + ret += ','; + } + } + ret += ']'; + return ret; + } + function compileScopeIntoFunction(buff, res, env) { + return 'function(' + res + "){var tR='';" + compileScope(buff, env) + 'return tR}'; + } + function compileScope(buff, env) { + var i = 0; + var buffLength = buff.length; + var returnStr = ''; + for (i; i < buffLength; i++) { + var currentBlock = buff[i]; + if (typeof currentBlock === 'string') { + var str = currentBlock; + // we know string exists + returnStr += "tR+='" + str + "';"; + } + else { + var type = currentBlock.t; // h, s, e, i + var content = currentBlock.c || ''; + var filters = currentBlock.f; + var name = currentBlock.n || ''; + var params = currentBlock.p || ''; + var res = currentBlock.res || ''; + var blocks = currentBlock.b; + var isAsync = !!currentBlock.a; // !! is to booleanize it + // if (isAsync && !env.async) { + // throw SqrlErr("Async block or helper '" + name + "' in non-async env") + // } + // Let compiler do this + if (type === 'i') { + if (env.defaultFilter) { + content = "c.l('F','" + env.defaultFilter + "')(" + content + ')'; + } + var filtered = filter(content, filters); + if (!currentBlock.raw && env.autoEscape) { + filtered = "c.l('F','e')(" + filtered + ')'; + } + returnStr += 'tR+=' + filtered + ';'; + // reference + } + else if (type === 'h') { + // helper + if (env.storage.nativeHelpers.get(name)) { + returnStr += env.storage.nativeHelpers.get(name)(currentBlock, env); + } + else { + var helperReturn = (isAsync ? 'await ' : '') + + "c.l('H','" + + name + + "')(" + + compileHelper(env, res, currentBlock.d, params, isAsync); + if (blocks) { + helperReturn += ',' + compileBlocks(blocks, env); + } + else { + helperReturn += ',[]'; + } + helperReturn += ',c)'; + returnStr += 'tR+=' + filter(helperReturn, filters) + ';'; + } + } + else if (type === 's') { + // self-closing helper + returnStr += + 'tR+=' + + filter((isAsync ? 'await ' : '') + "c.l('H','" + name + "')({params:[" + params + ']},[],c)', filters) + + ';'; + } + else if (type === 'e') { + // execute + returnStr += content + '\n'; + } + } + } + return returnStr; + } + + /* END TYPES */ + var Cacher = /** @class */ (function () { + function Cacher(cache) { + this.cache = cache; + } + Cacher.prototype.define = function (key, val) { + this.cache[key] = val; + }; + Cacher.prototype.get = function (key) { + // string | array. + // TODO: allow array of keys to look down + // TODO: create plugin to allow referencing helpers, filters with dot notation + return this.cache[key]; + }; + Cacher.prototype.remove = function (key) { + delete this.cache[key]; + }; + Cacher.prototype.reset = function () { + this.cache = {}; + }; + Cacher.prototype.load = function (cacheObj) { + // TODO: this will err with deep objects and `storage` or `plugins` keys. + // Update Feb 26: EDITED so it shouldn't err + copyProps(this.cache, cacheObj, true); + }; + return Cacher; + }()); + + function errWithBlocksOrFilters(name, blocks, // false means don't check + filters, native) { + if (blocks && blocks.length > 0) { + throw SqrlErr((native ? 'Native' : '') + "Helper '" + name + "' doesn't accept blocks"); + } + if (filters && filters.length > 0) { + throw SqrlErr((native ? 'Native' : '') + "Helper '" + name + "' doesn't accept filters"); + } + } + /* ASYNC LOOP FNs */ + function asyncArrLoop(arr, index, fn, res, cb) { + fn(arr[index], index).then(function (val) { + res += val; + if (index === arr.length - 1) { + cb(res); + } + else { + asyncArrLoop(arr, index + 1, fn, res, cb); + } + }); + } + function asyncObjLoop(obj, keys, index, fn, res, cb) { + fn(keys[index], obj[keys[index]]).then(function (val) { + res += val; + if (index === keys.length - 1) { + cb(res); + } + else { + asyncObjLoop(obj, keys, index + 1, fn, res, cb); + } + }); + } + var escMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + }; + function replaceChar(s) { + return escMap[s]; + } + function XMLEscape(str) { + // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized. + var newStr = String(str); + if (/[&<>"']/.test(newStr)) { + return newStr.replace(/[&<>"']/g, replaceChar); + } + else { + return newStr; + } + } + + /* END TYPES */ + var templates = new Cacher({}); + /* ASYNC LOOP FNs */ + var helpers = new Cacher({ + each: function (content, blocks) { + var res = ''; + var arr = content.params[0]; + errWithBlocksOrFilters('each', blocks, false); + if (content.async) { + return new Promise(function (resolve) { + asyncArrLoop(arr, 0, content.exec, res, resolve); + }); + } + else { + for (var i = 0; i < arr.length; i++) { + res += content.exec(arr[i], i); + } + return res; + } + }, + foreach: function (content, blocks) { + var obj = content.params[0]; + errWithBlocksOrFilters('foreach', blocks, false); + if (content.async) { + return new Promise(function (resolve) { + asyncObjLoop(obj, Object.keys(obj), 0, content.exec, '', resolve); + }); + } + else { + var res = ''; + for (var key in obj) { + if (!hasOwnProp(obj, key)) + continue; + res += content.exec(key, obj[key]); // todo: check on order + } + return res; + } + }, + include: function (content, blocks, config) { + errWithBlocksOrFilters('include', blocks, false); + var template = config.storage.templates.get(content.params[0]); + if (!template) { + throw SqrlErr('Could not fetch template "' + content.params[0] + '"'); + } + return template(content.params[1], config); + }, + extends: function (content, blocks, config) { + var data = content.params[1] || {}; + data.content = content.exec(); + for (var i = 0; i < blocks.length; i++) { + var currentBlock = blocks[i]; + data[currentBlock.name] = currentBlock.exec(); + } + var template = config.storage.templates.get(content.params[0]); + if (!template) { + throw SqrlErr('Could not fetch template "' + content.params[0] + '"'); + } + return template(data, config); + }, + useScope: function (content, blocks) { + errWithBlocksOrFilters('useScope', blocks, false); + return content.exec(content.params[0]); + } + }); + var nativeHelpers = new Cacher({ + if: function (buffer, env) { + errWithBlocksOrFilters('if', false, buffer.f, true); + var returnStr = 'if(' + buffer.p + '){' + compileScope(buffer.d, env) + '}'; + if (buffer.b) { + for (var i = 0; i < buffer.b.length; i++) { + var currentBlock = buffer.b[i]; + if (currentBlock.n === 'else') { + returnStr += 'else{' + compileScope(currentBlock.d, env) + '}'; + } + else if (currentBlock.n === 'elif') { + returnStr += 'else if(' + currentBlock.p + '){' + compileScope(currentBlock.d, env) + '}'; + } + } + } + return returnStr; + }, + try: function (buffer, env) { + errWithBlocksOrFilters('try', false, buffer.f, true); + if (!buffer.b || buffer.b.length !== 1 || buffer.b[0].n !== 'catch') { + throw SqrlErr("native helper 'try' only accepts 1 block, 'catch'"); + } + var returnStr = 'try{' + compileScope(buffer.d, env) + '}'; + var currentBlock = buffer.b[0]; + returnStr += + 'catch' + + (currentBlock.res ? '(' + currentBlock.res + ')' : '') + + '{' + + compileScope(currentBlock.d, env) + + '}'; + return returnStr; + }, + block: function (buffer, env) { + errWithBlocksOrFilters('block', buffer.b, buffer.f, true); + var returnStr = 'if(!' + + env.varName + + '[' + + buffer.p + + ']){tR+=(' + + compileScopeIntoFunction(buffer.d, '', env) + + ')()}else{tR+=' + + env.varName + + '[' + + buffer.p + + ']}'; + return returnStr; + } + }); + var filters = new Cacher({ e: XMLEscape }); + + /* END TYPES */ + var defaultConfig = { + varName: 'it', + autoTrim: [false, 'nl'], + autoEscape: true, + defaultFilter: false, + tags: ['{{', '}}'], + l: function (container, name) { + if (container === 'H') { + var hRet = this.storage.helpers.get(name); + if (hRet) { + return hRet; + } + else { + throw SqrlErr("Can't find helper '" + name + "'"); + } + } + else if (container === 'F') { + var fRet = this.storage.filters.get(name); + if (fRet) { + return fRet; + } + else { + throw SqrlErr("Can't find filter '" + name + "'"); + } + } + }, + async: false, + storage: { + helpers: helpers, + nativeHelpers: nativeHelpers, + filters: filters, + templates: templates + }, + prefixes: { + h: '@', + b: '#', + i: '', + r: '*', + c: '/', + e: '!' + }, + cache: false, + plugins: [], + useWith: false + }; + defaultConfig.l.bind(defaultConfig); + function getConfig(override, baseConfig) { + // TODO: run more tests on this + var res = {}; // Linked + copyProps(res, defaultConfig); // Creates deep clone of res, 1 layer deep + if (baseConfig) { + copyProps(res, baseConfig); + } + if (override) { + copyProps(res, override); + } + res.l.bind(res); + return res; + } + + /* END TYPES */ + function compile(str, env) { + var options = getConfig(env || {}); + var ctor = Function; // constructor + /* ASYNC HANDLING */ + // The below code is modified from mde/ejs. All credit should go to them. + if (options.async) { + // Have to use generated function for this, since in envs without support, + // it breaks in parsing + if (asyncFunc) { + ctor = asyncFunc; + } + else { + throw SqrlErr("This environment doesn't support async/await"); + } + } + /* END ASYNC HANDLING */ + try { + return new ctor(options.varName, 'c', // SqrlConfig + 'cb', // optional callback + compileToString(str, options)); // eslint-disable-line no-new-func + } + catch (e) { + if (e instanceof SyntaxError) { + throw SqrlErr('Bad template syntax\n\n' + + e.message + + '\n' + + Array(e.message.length + 1).join('=') + + '\n' + + compileToString(str, options)); + } + else { + throw e; + } + } + } + + /* END TYPES */ + function handleCache(template, options) { + var templateFunc; + if (options.cache && options.name && options.storage.templates.get(options.name)) { + return options.storage.templates.get(options.name); + } + if (typeof template === 'function') { + templateFunc = template; + } + else { + templateFunc = compile(template, options); + } + if (options.cache && options.name) { + options.storage.templates.define(options.name, templateFunc); + } + return templateFunc; + } + function render(template, data, env, cb) { + var options = getConfig(env || {}); + if (options.async) { + var result; + if (!cb) { + // No callback, try returning a promise + if (typeof promiseImpl === 'function') { + return new promiseImpl(function (resolve, reject) { + try { + result = handleCache(template, options)(data, options); + resolve(result); + } + catch (err) { + reject(err); + } + }); + } + else { + throw SqrlErr("Please provide a callback function, this env doesn't support Promises"); + } + } + else { + try { + handleCache(template, options)(data, options, cb); + } + catch (err) { + return cb(err); + } + } + } + else { + return handleCache(template, options)(data, options); + } + } + + exports.compile = compile; + exports.compileScope = compileScope; + exports.compileScopeIntoFunction = compileScopeIntoFunction; + exports.compileToString = compileToString; + exports.defaultConfig = defaultConfig; + exports.filters = filters; + exports.getConfig = getConfig; + exports.helpers = helpers; + exports.nativeHelpers = nativeHelpers; + exports.parse = parse; + exports.render = render; + exports.templates = templates; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=squirrelly.dev.js.map diff --git a/src/node_modules/squirrelly/dist/browser/squirrelly.dev.js.map b/src/node_modules/squirrelly/dist/browser/squirrelly.dev.js.map new file mode 100644 index 0000000..417e1d9 --- /dev/null +++ b/src/node_modules/squirrelly/dist/browser/squirrelly.dev.js.map @@ -0,0 +1 @@ +{"version":3,"file":"squirrelly.dev.js","sources":["../../src/err.ts","../../src/utils.ts","../../src/parse.ts","../../src/compile-string.ts","../../src/storage.ts","../../src/container-utils.ts","../../src/containers.ts","../../src/config.ts","../../src/compile.ts","../../src/render.ts"],"sourcesContent":["function setPrototypeOf (obj: any, proto: any) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(obj, proto)\n } else {\n obj.__proto__ = proto\n }\n}\n\nexport default function SqrlErr (message: string): Error {\n var err = new Error(message)\n setPrototypeOf(err, SqrlErr.prototype)\n return err\n}\n\nSqrlErr.prototype = Object.create(Error.prototype, {\n name: { value: 'Squirrelly Error', enumerable: false }\n})\n\n// TODO: Class transpilation adds a lot to the bundle size\n\nexport function ParseErr (message: string, str: string, indx: number) {\n var whitespace = str.slice(0, indx).split(/\\n/)\n\n var lineNo = whitespace.length\n var colNo = whitespace[lineNo - 1].length + 1\n message +=\n ' at line ' +\n lineNo +\n ' col ' +\n colNo +\n ':\\n\\n' +\n ' ' +\n str.split(/\\n/)[lineNo - 1] +\n '\\n' +\n ' ' +\n Array(colNo).join(' ') +\n '^'\n throw SqrlErr(message)\n}\n","// TODO: allow '-' to trim up until newline. Use [^\\S\\n\\r] instead of \\s\n// TODO: only include trimLeft polyfill if not in ES6\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\n\n/* END TYPES */\n\nexport var promiseImpl = new Function('return this')().Promise\n\nvar asyncFunc: FunctionConstructor | false = false\n\ntry {\n asyncFunc = new Function('return (async function(){}).constructor')()\n} catch (e) {\n // We shouldn't actually ever have any other errors, but...\n if (!(e instanceof SyntaxError)) {\n throw e\n }\n}\n\nexport { asyncFunc }\n\nexport function hasOwnProp (obj: object, prop: string) {\n return Object.prototype.hasOwnProperty.call(obj, prop)\n}\n\nexport function copyProps (toObj: T, fromObj: T, notConfig?: boolean) {\n for (var key in fromObj) {\n if (hasOwnProp((fromObj as unknown) as object, key)) {\n if (\n fromObj[key] != null &&\n typeof fromObj[key] == 'object' &&\n (key === 'storage' || key === 'prefixes') &&\n !notConfig // not called from Cache.load\n ) {\n // plugins or storage\n // Note: this doesn't merge from initial config!\n // Deep clone instead of assigning\n // TODO: run checks on this\n toObj[key] = copyProps(/*toObj[key] ||*/ {} as T[Extract], fromObj[key])\n } else {\n toObj[key] = fromObj[key]\n }\n }\n }\n return toObj\n}\n\nfunction trimWS (\n str: string,\n env: SqrlConfig,\n wsLeft: string | false,\n wsRight?: string | false\n): string {\n var leftTrim\n var rightTrim\n\n if (typeof env.autoTrim === 'string') {\n leftTrim = rightTrim = env.autoTrim\n // Don't need to check if env.autoTrim is false\n // Because leftTrim, rightTrim are initialized as falsy\n } else if (Array.isArray(env.autoTrim)) {\n // kinda confusing\n // but _}} will trim the left side of the following string\n leftTrim = env.autoTrim[1]\n rightTrim = env.autoTrim[0]\n }\n\n if (wsLeft || wsLeft === false) {\n leftTrim = wsLeft\n }\n\n if (wsRight || wsRight === false) {\n rightTrim = wsRight\n }\n\n if (leftTrim === 'slurp' && rightTrim === 'slurp') {\n return str.trim()\n }\n\n if (leftTrim === '_' || leftTrim === 'slurp') {\n // console.log('trimming left' + leftTrim)\n // full slurp\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!String.prototype.trimLeft) {\n str = str.trimLeft()\n } else {\n str = str.replace(/^[\\s\\uFEFF\\xA0]+/, '')\n }\n } else if (leftTrim === '-' || leftTrim === 'nl') {\n // console.log('trimming left nl' + leftTrim)\n // nl trim\n str = str.replace(/^(?:\\n|\\r|\\r\\n)/, '')\n }\n\n if (rightTrim === '_' || rightTrim === 'slurp') {\n // console.log('trimming right' + rightTrim)\n // full slurp\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!String.prototype.trimRight) {\n str = str.trimRight()\n } else {\n str = str.replace(/[\\s\\uFEFF\\xA0]+$/, '')\n }\n } else if (rightTrim === '-' || rightTrim === 'nl') {\n // console.log('trimming right nl' + rightTrim)\n // nl trim\n str = str.replace(/(?:\\n|\\r|\\r\\n)$/, '') // TODO: make sure this gets \\r\\n\n }\n\n return str\n}\n\nexport { trimWS }\n","import SqrlErr, { ParseErr } from './err'\nimport { trimWS } from './utils'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\n\nexport type TagType = 'h' | 'b' | 'i' | 'r' | 'c' | 'e' | 'q' | 's'\n// TODO: change to anagram \"QBIRCHES\"\nexport type TemplateAttribute = 'c' | 'f' | 'fp' | 'p' | 'n' | 'res' | 'err'\nexport type TemplateObjectAttribute = 'c' | 'p' | 'n' | 'res'\n\nexport type AstObject = string | TemplateObject\n\nexport type Filter = [string, string] | [string, string, true]\n// [name, params, async]\nexport interface TemplateObject {\n n?: string\n t?: 'h' | 'b' | 'i' | 'c' | 'q' | 'e' | 's'\n f: Array\n c?: string\n p?: string\n res?: string\n d?: Array\n raw?: boolean\n a?: boolean // async\n b?: Array\n}\n\nexport interface ParentTemplateObject extends TemplateObject {\n d: Array\n b: Array\n}\n\n/* END TYPES */\n\nvar asyncRegExp = /^async +/\n\nvar templateLitReg = /`(?:\\\\[\\s\\S]|\\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\\${)[^\\\\`])*`/g\n\nvar singleQuoteReg = /'(?:\\\\[\\s\\w\"'\\\\`]|[^\\n\\r'\\\\])*?'/g\n\nvar doubleQuoteReg = /\"(?:\\\\[\\s\\w\"'\\\\`]|[^\\n\\r\"\\\\])*?\"/g\n\nvar specialCharsReg = /[.*+\\-?^${}()|[\\]\\\\]/g\n\nfunction escapeRegExp (string: string) {\n // From MDN\n return specialCharsReg.test(string)\n ? string.replace(specialCharsReg, '\\\\$&') // $& means the whole matched string\n : string\n}\n\nexport default function parse (str: string, env: SqrlConfig): Array {\n /* Adding for EJS compatibility */\n if (env.rmWhitespace) {\n // Code taken directly from EJS\n // Have to use two separate replaces here as `^` and `$` operators don't\n // work well with `\\r` and empty lines don't work well with the `m` flag.\n // Essentially, this replaces the whitespace at the beginning and end of\n // each line and removes multiple newlines.\n str = str.replace(/[\\r\\n]+/g, '\\n').replace(/^\\s+|\\s+$/gm, '')\n }\n /* End rmWhitespace option */\n\n templateLitReg.lastIndex = 0\n singleQuoteReg.lastIndex = 0\n doubleQuoteReg.lastIndex = 0\n\n var envPrefixes = env.prefixes\n\n var prefixes = [\n envPrefixes.h,\n envPrefixes.b,\n envPrefixes.i,\n envPrefixes.r,\n envPrefixes.c,\n envPrefixes.e\n ].reduce(function (accumulator, prefix) {\n if (accumulator && prefix) {\n return accumulator + '|' + escapeRegExp(prefix)\n } else if (prefix) {\n // accumulator is empty\n return escapeRegExp(prefix)\n } else {\n // prefix and accumulator are both empty strings\n return accumulator\n }\n }, '')\n\n var parseCloseReg = new RegExp(\n '([|()]|=>)|' + // powerchars\n '(\\'|\"|`|\\\\/\\\\*)|\\\\s*((\\\\/)?(-|_)?' + // comments, strings\n escapeRegExp(env.tags[1]) +\n ')',\n 'g'\n )\n\n var tagOpenReg = new RegExp(\n '([^]*?)' + escapeRegExp(env.tags[0]) + '(-|_)?\\\\s*(' + prefixes + ')?\\\\s*',\n 'g'\n )\n\n var startInd = 0\n var trimNextLeftWs: string | false = false\n\n function parseTag (tagOpenIndex: number, currentType: TagType): TemplateObject {\n var currentObj: TemplateObject = { f: [] }\n var numParens = 0\n var currentAttribute: TemplateAttribute = 'c' // default - Valid values: 'c'=content, 'f'=filter, 'fp'=filter params, 'p'=param, 'n'=name\n\n if (currentType === 'h' || currentType === 'b' || currentType === 'c') {\n currentAttribute = 'n'\n } else if (currentType === 'r') {\n currentObj.raw = true\n currentType = 'i'\n }\n\n function addAttrValue (indx: number) {\n var valUnprocessed = str.slice(startInd, indx)\n // console.log(valUnprocessed)\n var val = valUnprocessed.trim()\n if (currentAttribute === 'f') {\n if (val === 'safe') {\n currentObj.raw = true\n } else {\n if (env.async && asyncRegExp.test(val)) {\n val = val.replace(asyncRegExp, '')\n currentObj.f.push([val, '', true])\n } else {\n currentObj.f.push([val, ''])\n }\n }\n } else if (currentAttribute === 'fp') {\n currentObj.f[currentObj.f.length - 1][1] += val\n } else if (currentAttribute === 'err') {\n if (val) {\n var found = valUnprocessed.search(/\\S/)\n ParseErr('invalid syntax', str, startInd + found)\n }\n } else {\n // if (currentObj[currentAttribute]) { // TODO make sure no errs\n // currentObj[currentAttribute] += val\n // } else {\n currentObj[currentAttribute] = val\n // }\n }\n startInd = indx + 1\n }\n\n parseCloseReg.lastIndex = startInd\n\n var m\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = parseCloseReg.exec(str)) !== null) {\n var char = m[1]\n var punctuator = m[2]\n var tagClose = m[3]\n var slash = m[4]\n var wsControl = m[5]\n var i = m.index\n\n if (char) {\n // Power character\n if (char === '(') {\n if (numParens === 0) {\n if (currentAttribute === 'n') {\n addAttrValue(i)\n currentAttribute = 'p'\n } else if (currentAttribute === 'f') {\n addAttrValue(i)\n currentAttribute = 'fp'\n }\n }\n numParens++\n } else if (char === ')') {\n numParens--\n if (numParens === 0 && currentAttribute !== 'c') {\n // Then it's closing a filter, block, or helper\n addAttrValue(i)\n\n currentAttribute = 'err' // Reset the current attribute\n }\n } else if (numParens === 0 && char === '|') {\n addAttrValue(i) // this should actually always be whitespace or empty\n currentAttribute = 'f'\n } else if (char === '=>') {\n addAttrValue(i)\n startInd += 1 // this is 2 chars\n currentAttribute = 'res'\n }\n } else if (punctuator) {\n if (punctuator === '/*') {\n var commentCloseInd = str.indexOf('*/', parseCloseReg.lastIndex)\n if (commentCloseInd === -1) {\n ParseErr('unclosed comment', str, m.index)\n }\n parseCloseReg.lastIndex = commentCloseInd + 2 // since */ is 2 characters, and we're using indexOf rather than a RegExp\n } else if (punctuator === \"'\") {\n singleQuoteReg.lastIndex = m.index\n\n var singleQuoteMatch = singleQuoteReg.exec(str)\n if (singleQuoteMatch) {\n parseCloseReg.lastIndex = singleQuoteReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n } else if (punctuator === '\"') {\n doubleQuoteReg.lastIndex = m.index\n var doubleQuoteMatch = doubleQuoteReg.exec(str)\n\n if (doubleQuoteMatch) {\n parseCloseReg.lastIndex = doubleQuoteReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n } else if (punctuator === '`') {\n templateLitReg.lastIndex = m.index\n var templateLitMatch = templateLitReg.exec(str)\n if (templateLitMatch) {\n parseCloseReg.lastIndex = templateLitReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n }\n } else if (tagClose) {\n addAttrValue(i)\n startInd = i + m[0].length\n tagOpenReg.lastIndex = startInd\n // console.log('tagClose: ' + startInd)\n trimNextLeftWs = wsControl\n if (slash && currentType === 'h') {\n currentType = 's'\n } // TODO throw err\n currentObj.t = currentType\n return currentObj\n }\n }\n ParseErr('unclosed tag', str, tagOpenIndex)\n return currentObj // To prevent TypeScript from erroring\n }\n\n function parseContext (parentObj: TemplateObject, firstParse?: boolean): ParentTemplateObject {\n parentObj.b = [] // assume there will be blocks // TODO: perf optimize this\n parentObj.d = []\n var lastBlock: ParentTemplateObject | false = false\n var buffer: Array = []\n\n function pushString (strng: string, shouldTrimRightOfString?: string | false) {\n if (strng) {\n // if string is truthy it must be of type 'string'\n\n // TODO: benchmark replace( /(\\\\|')/g, '\\\\$1')\n strng = trimWS(\n strng,\n env,\n trimNextLeftWs, // this will only be false on the first str, the next ones will be null or undefined\n shouldTrimRightOfString\n )\n\n if (strng) {\n // replace \\ with \\\\, ' with \\'\n\n strng = strng.replace(/\\\\|'/g, '\\\\$&').replace(/\\r\\n|\\n|\\r/g, '\\\\n')\n // we're going to convert all CRLF to LF so it doesn't take more than one replace\n\n buffer.push(strng)\n }\n }\n }\n\n // Random TODO: parentObj.b doesn't need to have t: #\n var tagOpenMatch\n // tslint:disable-next-line:no-conditional-assignment\n while ((tagOpenMatch = tagOpenReg.exec(str)) !== null) {\n var precedingString = tagOpenMatch[1]\n var shouldTrimRightPrecedingString = tagOpenMatch[2]\n var prefix = tagOpenMatch[3] || ''\n var prefixType: TagType | undefined\n\n for (var key in envPrefixes) {\n if (envPrefixes[key] === prefix) {\n prefixType = key as TagType\n break\n }\n }\n\n pushString(precedingString, shouldTrimRightPrecedingString)\n startInd = tagOpenMatch.index + tagOpenMatch[0].length\n\n if (!prefixType) {\n ParseErr('unrecognized tag type: ' + prefix, str, startInd)\n }\n\n var currentObj = parseTag(tagOpenMatch.index, prefixType as TagType)\n // ===== NOW ADD THE OBJECT TO OUR BUFFER =====\n\n var currentType = currentObj.t\n if (currentType === 'h') {\n var hName = currentObj.n || ''\n if (env.async && asyncRegExp.test(hName)) {\n currentObj.a = true\n currentObj.n = hName.replace(asyncRegExp, '')\n }\n currentObj = parseContext(currentObj) // currentObj is the parent object\n buffer.push(currentObj)\n } else if (currentType === 'c') {\n // tag close\n if (parentObj.n === currentObj.n) {\n if (lastBlock) {\n // If there's a previous block\n lastBlock.d = buffer\n parentObj.b.push(lastBlock)\n } else {\n parentObj.d = buffer\n }\n // console.log('parentObj: ' + JSON.stringify(parentObj))\n return parentObj as ParentTemplateObject\n } else {\n ParseErr(\n \"Helper start and end don't match\",\n str,\n tagOpenMatch.index + tagOpenMatch[0].length\n )\n }\n } else if (currentType === 'b') {\n // block\n // TODO: make sure async stuff inside blocks are recognized\n if (lastBlock) {\n // If there's a previous block\n lastBlock.d = buffer\n parentObj.b.push(lastBlock)\n } else {\n parentObj.d = buffer\n }\n\n var blockName = currentObj.n || ''\n if (env.async && asyncRegExp.test(blockName)) {\n currentObj.a = true\n currentObj.n = blockName.replace(asyncRegExp, '')\n }\n\n lastBlock = currentObj as ParentTemplateObject // Set the 'lastBlock' object to the value of the current block\n\n buffer = []\n } else if (currentType === 's') {\n var selfClosingHName = currentObj.n || ''\n if (env.async && asyncRegExp.test(selfClosingHName)) {\n currentObj.a = true\n currentObj.n = selfClosingHName.replace(asyncRegExp, '')\n }\n buffer.push(currentObj)\n } else {\n buffer.push(currentObj)\n }\n // ===== DONE ADDING OBJECT TO BUFFER =====\n }\n\n if (firstParse) {\n pushString(str.slice(startInd, str.length), false)\n parentObj.d = buffer\n } else {\n throw SqrlErr('unclosed helper \"' + parentObj.n + '\"')\n // It should have returned by now\n }\n\n return parentObj as ParentTemplateObject\n }\n\n var parseResult = parseContext({ f: [] }, true)\n // console.log(JSON.stringify(parseResult))\n if (env.plugins) {\n for (var i = 0; i < env.plugins.length; i++) {\n var plugin = env.plugins[i]\n if (plugin.processAST) {\n parseResult.d = plugin.processAST(parseResult.d, env)\n }\n }\n }\n return parseResult.d // Parse the very outside context\n}\n","import Parse from './parse'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { AstObject, Filter, ParentTemplateObject } from './parse'\ntype ParsedTagType = 'h' | 's' | 'e' | 'i'\n// import SqrlErr from './err'\n\n/* END TYPES */\n\nexport default function compileToString (str: string, env: SqrlConfig) {\n var buffer: Array = Parse(str, env)\n\n var res =\n \"var tR='';\" +\n (env.useWith ? 'with(' + env.varName + '||{}){' : '') +\n compileScope(buffer, env) +\n 'if(cb){cb(null,tR)} return tR' +\n (env.useWith ? '}' : '')\n\n if (env.plugins) {\n for (var i = 0; i < env.plugins.length; i++) {\n var plugin = env.plugins[i]\n if (plugin.processFnString) {\n res = plugin.processFnString(res, env)\n }\n }\n }\n\n return res\n\n // TODO: is `return cb()` necessary, or could we just do `cb()`\n}\n\nfunction filter (str: string, filters: Array) {\n for (var i = 0; i < filters.length; i++) {\n var name = filters[i][0]\n var params = filters[i][1]\n var isFilterAsync = filters[i][2]\n\n // if (isFilterAsync && !env.async) {\n // throw SqrlErr(\"Async filter '\" + name + \"' in non-async env\")\n // }\n // Let the JS compiler do this, compile() will catch it\n\n str = (isFilterAsync ? 'await ' : '') + \"c.l('F','\" + name + \"')(\" + str\n if (params) {\n str += ',' + params\n }\n str += ')'\n }\n return str\n}\n\n// TODO: Use type intersections for TemplateObject, etc.\n// so I don't have to make properties mandatory\n\nfunction compileHelper (\n env: SqrlConfig,\n res: string,\n descendants: Array,\n params: string,\n isAsync?: boolean,\n name?: string\n) {\n var ret =\n '{exec:' +\n (isAsync ? 'async ' : '') +\n compileScopeIntoFunction(descendants, res, env) +\n ',params:[' +\n params +\n ']'\n if (name) {\n ret += \",name:'\" + name + \"'\"\n }\n if (isAsync) {\n ret += ',async:true'\n }\n ret += '}'\n return ret\n}\n\nfunction compileBlocks (blocks: Array, env: SqrlConfig) {\n var ret = '['\n for (var i = 0; i < blocks.length; i++) {\n var block = blocks[i]\n ret += compileHelper(env, block.res || '', block.d, block.p || '', block.a, block.n)\n if (i < blocks.length) {\n ret += ','\n }\n }\n ret += ']'\n return ret\n}\n\nexport function compileScopeIntoFunction (buff: Array, res: string, env: SqrlConfig) {\n return 'function(' + res + \"){var tR='';\" + compileScope(buff, env) + 'return tR}'\n}\n\nexport function compileScope (buff: Array, env: SqrlConfig) {\n var i = 0\n var buffLength = buff.length\n var returnStr = ''\n\n for (i; i < buffLength; i++) {\n var currentBlock = buff[i]\n if (typeof currentBlock === 'string') {\n var str = currentBlock\n\n // we know string exists\n returnStr += \"tR+='\" + str + \"';\"\n } else {\n var type: ParsedTagType = currentBlock.t as ParsedTagType // h, s, e, i\n var content = currentBlock.c || ''\n var filters = currentBlock.f\n var name = currentBlock.n || ''\n var params = currentBlock.p || ''\n var res = currentBlock.res || ''\n var blocks = currentBlock.b\n var isAsync = !!currentBlock.a // !! is to booleanize it\n // if (isAsync && !env.async) {\n // throw SqrlErr(\"Async block or helper '\" + name + \"' in non-async env\")\n // }\n // Let compiler do this\n if (type === 'i') {\n if (env.defaultFilter) {\n content = \"c.l('F','\" + env.defaultFilter + \"')(\" + content + ')'\n }\n var filtered = filter(content, filters)\n if (!currentBlock.raw && env.autoEscape) {\n filtered = \"c.l('F','e')(\" + filtered + ')'\n }\n returnStr += 'tR+=' + filtered + ';'\n // reference\n } else if (type === 'h') {\n // helper\n if (env.storage.nativeHelpers.get(name)) {\n returnStr += env.storage.nativeHelpers.get(name)(currentBlock, env)\n } else {\n var helperReturn =\n (isAsync ? 'await ' : '') +\n \"c.l('H','\" +\n name +\n \"')(\" +\n compileHelper(env, res, (currentBlock as ParentTemplateObject).d, params, isAsync)\n if (blocks) {\n helperReturn += ',' + compileBlocks(blocks, env)\n } else {\n helperReturn += ',[]'\n }\n helperReturn += ',c)'\n\n returnStr += 'tR+=' + filter(helperReturn, filters) + ';'\n }\n } else if (type === 's') {\n // self-closing helper\n\n returnStr +=\n 'tR+=' +\n filter(\n (isAsync ? 'await ' : '') + \"c.l('H','\" + name + \"')({params:[\" + params + ']},[],c)',\n filters\n ) +\n ';'\n } else if (type === 'e') {\n // execute\n returnStr += content + '\\n'\n }\n }\n }\n\n return returnStr\n}\n","import { copyProps } from './utils'\n\n/* TYPES */\n\ninterface Dict {\n // Basically, an object where all keys point to a value of the same type\n [key: string]: T\n}\n\n/* END TYPES */\n\nclass Cacher {\n constructor (private cache: Dict) {}\n define (key: string, val: T) {\n this.cache[key] = val\n }\n get (key: string) {\n // string | array.\n // TODO: allow array of keys to look down\n // TODO: create plugin to allow referencing helpers, filters with dot notation\n return this.cache[key]\n }\n remove (key: string) {\n delete this.cache[key]\n }\n reset () {\n this.cache = {}\n }\n load (cacheObj: Dict) {\n // TODO: this will err with deep objects and `storage` or `plugins` keys.\n // Update Feb 26: EDITED so it shouldn't err\n copyProps(this.cache, cacheObj, true)\n }\n}\n\nexport { Cacher }\n","import SqrlErr from './err'\n\nexport function errWithBlocksOrFilters(\n name: string,\n blocks: Array | false, // false means don't check\n filters: Array | false,\n native?: boolean\n) {\n if (blocks && blocks.length > 0) {\n throw SqrlErr((native ? 'Native' : '') + \"Helper '\" + name + \"' doesn't accept blocks\")\n }\n if (filters && filters.length > 0) {\n throw SqrlErr((native ? 'Native' : '') + \"Helper '\" + name + \"' doesn't accept filters\")\n }\n}\n\n/* ASYNC LOOP FNs */\nexport function asyncArrLoop(\n arr: Array,\n index: number,\n fn: Function,\n res: string,\n cb: Function\n) {\n fn(arr[index], index).then(function (val: string) {\n res += val\n if (index === arr.length - 1) {\n cb(res)\n } else {\n asyncArrLoop(arr, index + 1, fn, res, cb)\n }\n })\n}\n\nexport function asyncObjLoop(\n obj: { [index: string]: any },\n keys: Array,\n index: number,\n fn: Function,\n res: string,\n cb: Function\n) {\n fn(keys[index], obj[keys[index]]).then(function (val: string) {\n res += val\n if (index === keys.length - 1) {\n cb(res)\n } else {\n asyncObjLoop(obj, keys, index + 1, fn, res, cb)\n }\n })\n}\n\nvar escMap: EscapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nexport function replaceChar(s: string): string {\n return escMap[s]\n}\n\nexport function XMLEscape(str: unknown) {\n // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized.\n var newStr = String(str)\n if (/[&<>\"']/.test(newStr)) {\n return newStr.replace(/[&<>\"']/g, replaceChar)\n } else {\n return newStr\n }\n}\n\n/* INTERFACES */\ninterface EscapeMap {\n '&': '&'\n '<': '<'\n '>': '>'\n '\"': '"'\n \"'\": '''\n [index: string]: string\n}\n","import { Cacher } from './storage'\nimport SqrlErr from './err'\nimport { compileScope, compileScopeIntoFunction } from './compile-string'\nimport { hasOwnProp } from './utils'\nimport { errWithBlocksOrFilters, asyncArrLoop, asyncObjLoop, XMLEscape } from './container-utils'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { TemplateFunction } from './compile'\nimport { ParentTemplateObject } from './parse'\n\nexport interface HelperContent {\n exec: Function\n params: Array\n async?: boolean\n}\n\nexport interface HelperBlock extends HelperContent {\n name: string\n}\n\nexport type HelperFunction = (\n content: HelperContent,\n blocks: Array,\n config: SqrlConfig\n) => string | Promise\n\nexport type FilterFunction = (...args: any[]) => any | Promise\n\ninterface IncludeHelperContent extends HelperContent {\n params: [string, object]\n}\n\ninterface GenericData {\n [index: string]: any\n}\n\n/* END TYPES */\n\nvar templates = new Cacher({})\n\n/* ASYNC LOOP FNs */\n\nvar helpers = new Cacher({\n each: function (content: HelperContent, blocks: Array) {\n var res = ''\n var arr = content.params[0]\n errWithBlocksOrFilters('each', blocks, false)\n\n if (content.async) {\n return new Promise(function (resolve) {\n asyncArrLoop(arr, 0, content.exec, res, resolve)\n })\n } else {\n for (var i = 0; i < arr.length; i++) {\n res += content.exec(arr[i], i)\n }\n return res\n }\n },\n foreach: function (content: HelperContent, blocks: Array) {\n var obj = content.params[0]\n errWithBlocksOrFilters('foreach', blocks, false)\n\n if (content.async) {\n return new Promise(function (resolve) {\n asyncObjLoop(obj, Object.keys(obj), 0, content.exec, '', resolve)\n })\n } else {\n var res = ''\n\n for (var key in obj) {\n if (!hasOwnProp(obj, key)) continue\n res += content.exec(key, obj[key]) // todo: check on order\n }\n return res\n }\n },\n include: function (\n content: IncludeHelperContent,\n blocks: Array,\n config: SqrlConfig\n ): string {\n errWithBlocksOrFilters('include', blocks, false)\n var template = config.storage.templates.get(content.params[0])\n if (!template) {\n throw SqrlErr('Could not fetch template \"' + content.params[0] + '\"')\n }\n return template(content.params[1], config)\n } as HelperFunction,\n extends: function (\n content: IncludeHelperContent,\n blocks: Array,\n config: SqrlConfig\n ): string {\n var data: GenericData = content.params[1] || {}\n data.content = content.exec()\n\n for (var i = 0; i < blocks.length; i++) {\n var currentBlock = blocks[i]\n data[currentBlock.name] = currentBlock.exec()\n }\n\n var template = config.storage.templates.get(content.params[0])\n if (!template) {\n throw SqrlErr('Could not fetch template \"' + content.params[0] + '\"')\n }\n return template(data, config)\n } as HelperFunction,\n useScope: function (content: HelperContent, blocks: Array): string {\n errWithBlocksOrFilters('useScope', blocks, false)\n\n return content.exec(content.params[0])\n } as HelperFunction\n})\n\nvar nativeHelpers = new Cacher({\n if: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('if', false, buffer.f, true)\n\n var returnStr = 'if(' + buffer.p + '){' + compileScope(buffer.d, env) + '}'\n if (buffer.b) {\n for (var i = 0; i < buffer.b.length; i++) {\n var currentBlock = buffer.b[i]\n if (currentBlock.n === 'else') {\n returnStr += 'else{' + compileScope(currentBlock.d, env) + '}'\n } else if (currentBlock.n === 'elif') {\n returnStr += 'else if(' + currentBlock.p + '){' + compileScope(currentBlock.d, env) + '}'\n }\n }\n }\n return returnStr\n },\n try: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('try', false, buffer.f, true)\n\n if (!buffer.b || buffer.b.length !== 1 || buffer.b[0].n !== 'catch') {\n throw SqrlErr(\"native helper 'try' only accepts 1 block, 'catch'\")\n }\n var returnStr = 'try{' + compileScope(buffer.d, env) + '}'\n\n var currentBlock = buffer.b[0]\n returnStr +=\n 'catch' +\n (currentBlock.res ? '(' + currentBlock.res + ')' : '') +\n '{' +\n compileScope(currentBlock.d, env) +\n '}'\n\n return returnStr\n },\n block: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('block', buffer.b, buffer.f, true)\n\n var returnStr =\n 'if(!' +\n env.varName +\n '[' +\n buffer.p +\n ']){tR+=(' +\n compileScopeIntoFunction(buffer.d, '', env) +\n ')()}else{tR+=' +\n env.varName +\n '[' +\n buffer.p +\n ']}'\n\n return returnStr\n }\n})\n\nvar filters = new Cacher({ e: XMLEscape })\n\nexport { templates, helpers, nativeHelpers, filters }\n","import { helpers, nativeHelpers, filters, templates } from './containers'\nimport SqrlErr from './err'\nimport { copyProps } from './utils'\n\n/* TYPES */\n\nexport type FetcherFunction = (container: 'H' | 'F', name: string) => Function | undefined\nimport { HelperFunction, FilterFunction } from './containers'\nimport { TemplateFunction } from './compile'\nimport { Cacher } from './storage'\n// import { TagType } from './parse'\n\ntype trimConfig = 'nl' | 'slurp' | false\n\nexport interface SqrlConfig {\n varName: string\n autoTrim: trimConfig | [trimConfig, trimConfig]\n rmWhitespace?: boolean\n autoEscape: boolean\n defaultFilter: false | string\n tags: [string, string]\n l: FetcherFunction\n plugins: Array<{ processFnString?: Function; processAST?: Function }>\n async: boolean\n storage: {\n helpers: Cacher\n nativeHelpers: Cacher\n filters: Cacher\n templates: Cacher\n }\n prefixes: {\n h: string\n b: string\n i: string\n r: string\n c: string\n e: string\n [index: string]: string\n }\n cache: boolean\n views?: string | Array\n root?: string\n filename?: string\n name?: string\n 'view cache'?: boolean\n useWith?: boolean\n [index: string]: any\n}\n\nexport type PartialConfig = {\n [P in keyof SqrlConfig]?: SqrlConfig[P]\n}\n\n/* END TYPES */\n\nvar defaultConfig: SqrlConfig = {\n varName: 'it',\n autoTrim: [false, 'nl'],\n autoEscape: true,\n defaultFilter: false,\n tags: ['{{', '}}'],\n l: function (container: 'H' | 'F', name: string): HelperFunction | FilterFunction | undefined {\n if (container === 'H') {\n var hRet = this.storage.helpers.get(name) as HelperFunction | undefined\n if (hRet) {\n return hRet\n } else {\n throw SqrlErr(\"Can't find helper '\" + name + \"'\")\n }\n } else if (container === 'F') {\n var fRet = this.storage.filters.get(name) as FilterFunction | undefined\n if (fRet) {\n return fRet\n } else {\n throw SqrlErr(\"Can't find filter '\" + name + \"'\")\n }\n }\n },\n async: false,\n storage: {\n helpers: helpers,\n nativeHelpers: nativeHelpers,\n filters: filters,\n templates: templates\n },\n prefixes: {\n h: '@',\n b: '#',\n i: '',\n r: '*',\n c: '/',\n e: '!'\n },\n cache: false,\n plugins: [],\n useWith: false\n}\n\ndefaultConfig.l.bind(defaultConfig)\n\nfunction getConfig (override: PartialConfig, baseConfig?: SqrlConfig): SqrlConfig {\n // TODO: run more tests on this\n\n var res: PartialConfig = {} // Linked\n copyProps(res, defaultConfig) // Creates deep clone of res, 1 layer deep\n\n if (baseConfig) {\n copyProps(res, baseConfig)\n }\n\n if (override) {\n copyProps(res, override)\n }\n\n ;(res as SqrlConfig).l.bind(res)\n\n return res as SqrlConfig\n}\n\nexport { defaultConfig, getConfig }\n","import compileToString from './compile-string'\nimport { getConfig } from './config'\nimport { asyncFunc } from './utils'\nimport SqrlErr from './err'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { CallbackFn } from './file-handlers'\nexport type TemplateFunction = (data: object, config: SqrlConfig, cb?: CallbackFn) => string\n\n/* END TYPES */\n\nexport default function compile (str: string, env?: PartialConfig): TemplateFunction {\n var options: SqrlConfig = getConfig(env || {})\n var ctor = Function // constructor\n\n /* ASYNC HANDLING */\n // The below code is modified from mde/ejs. All credit should go to them.\n if (options.async) {\n // Have to use generated function for this, since in envs without support,\n // it breaks in parsing\n if (asyncFunc) {\n ctor = asyncFunc\n } else {\n throw SqrlErr(\"This environment doesn't support async/await\")\n }\n }\n\n /* END ASYNC HANDLING */\n try {\n return new ctor(\n options.varName,\n 'c', // SqrlConfig\n 'cb', // optional callback\n compileToString(str, options)\n ) as TemplateFunction // eslint-disable-line no-new-func\n } catch (e) {\n if (e instanceof SyntaxError) {\n throw SqrlErr(\n 'Bad template syntax\\n\\n' +\n e.message +\n '\\n' +\n Array(e.message.length + 1).join('=') +\n '\\n' +\n compileToString(str, options)\n )\n } else {\n throw e\n }\n }\n}\n","import compile from './compile'\nimport { getConfig } from './config'\nimport { promiseImpl } from './utils'\nimport SqrlErr from './err'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { TemplateFunction } from './compile'\nimport { CallbackFn } from './file-handlers'\n\n/* END TYPES */\n\nfunction handleCache (template: string | TemplateFunction, options: SqrlConfig): TemplateFunction {\n var templateFunc\n\n if (options.cache && options.name && options.storage.templates.get(options.name)) {\n return options.storage.templates.get(options.name)\n }\n\n if (typeof template === 'function') {\n templateFunc = template\n } else {\n templateFunc = compile(template, options)\n }\n\n if (options.cache && options.name) {\n options.storage.templates.define(options.name, templateFunc)\n }\n\n return templateFunc\n}\n\nexport default function render (\n template: string | TemplateFunction,\n data: object,\n env?: PartialConfig,\n cb?: CallbackFn\n) {\n var options = getConfig(env || {})\n\n if (options.async) {\n var result\n if (!cb) {\n // No callback, try returning a promise\n if (typeof promiseImpl === 'function') {\n return new promiseImpl(function (resolve: Function, reject: Function) {\n try {\n result = handleCache(template, options)(data, options)\n resolve(result)\n } catch (err) {\n reject(err)\n }\n })\n } else {\n throw SqrlErr(\"Please provide a callback function, this env doesn't support Promises\")\n }\n } else {\n try {\n handleCache(template, options)(data, options, cb)\n } catch (err) {\n return cb(err)\n }\n }\n } else {\n return handleCache(template, options)(data, options)\n }\n}\n"],"names":["Parse"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/squirrelly/dist/browser/squirrelly.min.js b/src/node_modules/squirrelly/dist/browser/squirrelly.min.js new file mode 100644 index 0000000..452595e --- /dev/null +++ b/src/node_modules/squirrelly/dist/browser/squirrelly.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="undefined"!=typeof globalThis?globalThis:e||self).Sqrl={})}(this,(function(e){"use strict";function t(e){var n,r,a=new Error(e);return n=a,r=t.prototype,Object.setPrototypeOf?Object.setPrototypeOf(n,r):n.__proto__=r,a}function n(e,n,r){var a=n.slice(0,r).split(/\n/),i=a.length,s=a[i-1].length+1;throw t(e+=" at line "+i+" col "+s+":\n\n "+n.split(/\n/)[i-1]+"\n "+Array(s).join(" ")+"^")}t.prototype=Object.create(Error.prototype,{name:{value:"Squirrelly Error",enumerable:!1}});var r=new Function("return this")().Promise,a=!1;try{a=new Function("return (async function(){}).constructor")()}catch(e){if(!(e instanceof SyntaxError))throw e}function i(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function s(e,t,n){for(var r in t)i(t,r)&&(null==t[r]||"object"!=typeof t[r]||"storage"!==r&&"prefixes"!==r||n?e[r]=t[r]:e[r]=s({},t[r]));return e}var c=/^async +/,o=/`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\${)[^\\`])*`/g,l=/'(?:\\[\s\w"'\\`]|[^\n\r'\\])*?'/g,f=/"(?:\\[\s\w"'\\`]|[^\n\r"\\])*?"/g,u=/[.*+\-?^${}()|[\]\\]/g;function p(e){return u.test(e)?e.replace(u,"\\$&"):e}function h(e,r){r.rmWhitespace&&(e=e.replace(/[\r\n]+/g,"\n").replace(/^\s+|\s+$/gm,"")),o.lastIndex=0,l.lastIndex=0,f.lastIndex=0;var a=r.prefixes,i=[a.h,a.b,a.i,a.r,a.c,a.e].reduce((function(e,t){return e&&t?e+"|"+p(t):t?p(t):e}),""),s=new RegExp("([|()]|=>)|('|\"|`|\\/\\*)|\\s*((\\/)?(-|_)?"+p(r.tags[1])+")","g"),u=new RegExp("([^]*?)"+p(r.tags[0])+"(-|_)?\\s*("+i+")?\\s*","g"),h=0,d=!1;function g(t,a){var i,p={f:[]},g=0,v="c";function m(t){var a=e.slice(h,t),i=a.trim();if("f"===v)"safe"===i?p.raw=!0:r.async&&c.test(i)?(i=i.replace(c,""),p.f.push([i,"",!0])):p.f.push([i,""]);else if("fp"===v)p.f[p.f.length-1][1]+=i;else if("err"===v){if(i){var s=a.search(/\S/);n("invalid syntax",e,h+s)}}else p[v]=i;h=t+1}for("h"===a||"b"===a||"c"===a?v="n":"r"===a&&(p.raw=!0,a="i"),s.lastIndex=h;null!==(i=s.exec(e));){var y=i[1],x=i[2],b=i[3],w=i[4],F=i[5],S=i.index;if(y)"("===y?(0===g&&("n"===v?(m(S),v="p"):"f"===v&&(m(S),v="fp")),g++):")"===y?0===--g&&"c"!==v&&(m(S),v="err"):0===g&&"|"===y?(m(S),v="f"):"=>"===y&&(m(S),h+=1,v="res");else if(x){if("/*"===x){var I=e.indexOf("*/",s.lastIndex);-1===I&&n("unclosed comment",e,i.index),s.lastIndex=I+2}else if("'"===x){l.lastIndex=i.index,l.exec(e)?s.lastIndex=l.lastIndex:n("unclosed string",e,i.index)}else if('"'===x){f.lastIndex=i.index,f.exec(e)?s.lastIndex=f.lastIndex:n("unclosed string",e,i.index)}else if("`"===x){o.lastIndex=i.index,o.exec(e)?s.lastIndex=o.lastIndex:n("unclosed string",e,i.index)}}else if(b)return m(S),h=S+i[0].length,u.lastIndex=h,d=F,w&&"h"===a&&(a="s"),p.t=a,p}return n("unclosed tag",e,t),p}var v=function i(s,o){s.b=[],s.d=[];var l,f=!1,p=[];function v(e,t){e&&(e=function(e,t,n,r){var a,i;return"string"==typeof t.autoTrim?a=i=t.autoTrim:Array.isArray(t.autoTrim)&&(a=t.autoTrim[1],i=t.autoTrim[0]),(n||!1===n)&&(a=n),(r||!1===r)&&(i=r),"slurp"===a&&"slurp"===i?e.trim():("_"===a||"slurp"===a?e=String.prototype.trimLeft?e.trimLeft():e.replace(/^[\s\uFEFF\xA0]+/,""):"-"!==a&&"nl"!==a||(e=e.replace(/^(?:\n|\r|\r\n)/,"")),"_"===i||"slurp"===i?e=String.prototype.trimRight?e.trimRight():e.replace(/[\s\uFEFF\xA0]+$/,""):"-"!==i&&"nl"!==i||(e=e.replace(/(?:\n|\r|\r\n)$/,"")),e)}(e,r,d,t))&&(e=e.replace(/\\|'/g,"\\$&").replace(/\r\n|\n|\r/g,"\\n"),p.push(e))}for(;null!==(l=u.exec(e));){var m,y=l[1],x=l[2],b=l[3]||"";for(var w in a)if(a[w]===b){m=w;break}v(y,x),h=l.index+l[0].length,m||n("unrecognized tag type: "+b,e,h);var F=g(l.index,m),S=F.t;if("h"===S){var I=F.n||"";r.async&&c.test(I)&&(F.a=!0,F.n=I.replace(c,"")),F=i(F),p.push(F)}else if("c"===S){if(s.n===F.n)return f?(f.d=p,s.b.push(f)):s.d=p,s;n("Helper start and end don't match",e,l.index+l[0].length)}else if("b"===S){f?(f.d=p,s.b.push(f)):s.d=p;var R=F.n||"";r.async&&c.test(R)&&(F.a=!0,F.n=R.replace(c,"")),f=F,p=[]}else if("s"===S){var T=F.n||"";r.async&&c.test(T)&&(F.a=!0,F.n=T.replace(c,"")),p.push(F)}else p.push(F)}if(!o)throw t('unclosed helper "'+s.n+'"');return v(e.slice(h,e.length),!1),s.d=p,s}({f:[]},!0);if(r.plugins)for(var m=0;m0)throw t((a?"Native":"")+"Helper '"+e+"' doesn't accept blocks");if(r&&r.length>0)throw t((a?"Native":"")+"Helper '"+e+"' doesn't accept filters")}var F={"&":"&","<":"<",">":">",'"':""","'":"'"};function S(e){return F[e]}var I=new b({}),R=new b({each:function(e,t){var n="",r=e.params[0];if(w("each",t,!1),e.async)return new Promise((function(t){!function e(t,n,r,a,i){r(t[n],n).then((function(s){a+=s,n===t.length-1?i(a):e(t,n+1,r,a,i)}))}(r,0,e.exec,n,t)}));for(var a=0;a"']/.test(t)?t.replace(/[&<>"']/g,S):t}}),j={varName:"it",autoTrim:[!1,"nl"],autoEscape:!0,defaultFilter:!1,tags:["{{","}}"],l:function(e,n){if("H"===e){var r=this.storage.helpers.get(n);if(r)return r;throw t("Can't find helper '"+n+"'")}if("F"===e){var a=this.storage.filters.get(n);if(a)return a;throw t("Can't find filter '"+n+"'")}},async:!1,storage:{helpers:R,nativeHelpers:T,filters:E,templates:I},prefixes:{h:"@",b:"#",i:"",r:"*",c:"/",e:"!"},cache:!1,plugins:[],useWith:!1};function H(e,t){var n={};return s(n,j),t&&s(n,t),e&&s(n,e),n.l.bind(n),n}function O(e,n){var r=H(n||{}),i=Function;if(r.async){if(!a)throw t("This environment doesn't support async/await");i=a}try{return new i(r.varName,"c","cb",d(e,r))}catch(n){throw n instanceof SyntaxError?t("Bad template syntax\n\n"+n.message+"\n"+Array(n.message.length+1).join("=")+"\n"+d(e,r)):n}}function _(e,t){var n;return t.cache&&t.name&&t.storage.templates.get(t.name)?t.storage.templates.get(t.name):(n="function"==typeof e?e:O(e,t),t.cache&&t.name&&t.storage.templates.define(t.name,n),n)}j.l.bind(j),e.compile=O,e.compileScope=x,e.compileScopeIntoFunction=y,e.compileToString=d,e.defaultConfig=j,e.filters=E,e.getConfig=H,e.helpers=R,e.nativeHelpers=T,e.parse=h,e.render=function(e,n,a,i){var s=H(a||{});if(!s.async)return _(e,s)(n,s);if(!i){if("function"==typeof r)return new r((function(t,r){try{t(_(e,s)(n,s))}catch(e){r(e)}}));throw t("Please provide a callback function, this env doesn't support Promises")}try{_(e,s)(n,s,i)}catch(e){return i(e)}},e.templates=I,Object.defineProperty(e,"__esModule",{value:!0})})); +//# sourceMappingURL=squirrelly.min.js.map diff --git a/src/node_modules/squirrelly/dist/browser/squirrelly.min.js.map b/src/node_modules/squirrelly/dist/browser/squirrelly.min.js.map new file mode 100644 index 0000000..88067b5 --- /dev/null +++ b/src/node_modules/squirrelly/dist/browser/squirrelly.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"squirrelly.min.js","sources":["../../src/err.ts","../../src/utils.ts","../../src/parse.ts","../../src/compile-string.ts","../../src/storage.ts","../../src/container-utils.ts","../../src/containers.ts","../../src/config.ts","../../src/compile.ts","../../src/render.ts"],"sourcesContent":["function setPrototypeOf (obj: any, proto: any) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(obj, proto)\n } else {\n obj.__proto__ = proto\n }\n}\n\nexport default function SqrlErr (message: string): Error {\n var err = new Error(message)\n setPrototypeOf(err, SqrlErr.prototype)\n return err\n}\n\nSqrlErr.prototype = Object.create(Error.prototype, {\n name: { value: 'Squirrelly Error', enumerable: false }\n})\n\n// TODO: Class transpilation adds a lot to the bundle size\n\nexport function ParseErr (message: string, str: string, indx: number) {\n var whitespace = str.slice(0, indx).split(/\\n/)\n\n var lineNo = whitespace.length\n var colNo = whitespace[lineNo - 1].length + 1\n message +=\n ' at line ' +\n lineNo +\n ' col ' +\n colNo +\n ':\\n\\n' +\n ' ' +\n str.split(/\\n/)[lineNo - 1] +\n '\\n' +\n ' ' +\n Array(colNo).join(' ') +\n '^'\n throw SqrlErr(message)\n}\n","// TODO: allow '-' to trim up until newline. Use [^\\S\\n\\r] instead of \\s\n// TODO: only include trimLeft polyfill if not in ES6\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\n\n/* END TYPES */\n\nexport var promiseImpl = new Function('return this')().Promise\n\nvar asyncFunc: FunctionConstructor | false = false\n\ntry {\n asyncFunc = new Function('return (async function(){}).constructor')()\n} catch (e) {\n // We shouldn't actually ever have any other errors, but...\n if (!(e instanceof SyntaxError)) {\n throw e\n }\n}\n\nexport { asyncFunc }\n\nexport function hasOwnProp (obj: object, prop: string) {\n return Object.prototype.hasOwnProperty.call(obj, prop)\n}\n\nexport function copyProps (toObj: T, fromObj: T, notConfig?: boolean) {\n for (var key in fromObj) {\n if (hasOwnProp((fromObj as unknown) as object, key)) {\n if (\n fromObj[key] != null &&\n typeof fromObj[key] == 'object' &&\n (key === 'storage' || key === 'prefixes') &&\n !notConfig // not called from Cache.load\n ) {\n // plugins or storage\n // Note: this doesn't merge from initial config!\n // Deep clone instead of assigning\n // TODO: run checks on this\n toObj[key] = copyProps(/*toObj[key] ||*/ {} as T[Extract], fromObj[key])\n } else {\n toObj[key] = fromObj[key]\n }\n }\n }\n return toObj\n}\n\nfunction trimWS (\n str: string,\n env: SqrlConfig,\n wsLeft: string | false,\n wsRight?: string | false\n): string {\n var leftTrim\n var rightTrim\n\n if (typeof env.autoTrim === 'string') {\n leftTrim = rightTrim = env.autoTrim\n // Don't need to check if env.autoTrim is false\n // Because leftTrim, rightTrim are initialized as falsy\n } else if (Array.isArray(env.autoTrim)) {\n // kinda confusing\n // but _}} will trim the left side of the following string\n leftTrim = env.autoTrim[1]\n rightTrim = env.autoTrim[0]\n }\n\n if (wsLeft || wsLeft === false) {\n leftTrim = wsLeft\n }\n\n if (wsRight || wsRight === false) {\n rightTrim = wsRight\n }\n\n if (leftTrim === 'slurp' && rightTrim === 'slurp') {\n return str.trim()\n }\n\n if (leftTrim === '_' || leftTrim === 'slurp') {\n // console.log('trimming left' + leftTrim)\n // full slurp\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!String.prototype.trimLeft) {\n str = str.trimLeft()\n } else {\n str = str.replace(/^[\\s\\uFEFF\\xA0]+/, '')\n }\n } else if (leftTrim === '-' || leftTrim === 'nl') {\n // console.log('trimming left nl' + leftTrim)\n // nl trim\n str = str.replace(/^(?:\\n|\\r|\\r\\n)/, '')\n }\n\n if (rightTrim === '_' || rightTrim === 'slurp') {\n // console.log('trimming right' + rightTrim)\n // full slurp\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!String.prototype.trimRight) {\n str = str.trimRight()\n } else {\n str = str.replace(/[\\s\\uFEFF\\xA0]+$/, '')\n }\n } else if (rightTrim === '-' || rightTrim === 'nl') {\n // console.log('trimming right nl' + rightTrim)\n // nl trim\n str = str.replace(/(?:\\n|\\r|\\r\\n)$/, '') // TODO: make sure this gets \\r\\n\n }\n\n return str\n}\n\nexport { trimWS }\n","import SqrlErr, { ParseErr } from './err'\nimport { trimWS } from './utils'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\n\nexport type TagType = 'h' | 'b' | 'i' | 'r' | 'c' | 'e' | 'q' | 's'\n// TODO: change to anagram \"QBIRCHES\"\nexport type TemplateAttribute = 'c' | 'f' | 'fp' | 'p' | 'n' | 'res' | 'err'\nexport type TemplateObjectAttribute = 'c' | 'p' | 'n' | 'res'\n\nexport type AstObject = string | TemplateObject\n\nexport type Filter = [string, string] | [string, string, true]\n// [name, params, async]\nexport interface TemplateObject {\n n?: string\n t?: 'h' | 'b' | 'i' | 'c' | 'q' | 'e' | 's'\n f: Array\n c?: string\n p?: string\n res?: string\n d?: Array\n raw?: boolean\n a?: boolean // async\n b?: Array\n}\n\nexport interface ParentTemplateObject extends TemplateObject {\n d: Array\n b: Array\n}\n\n/* END TYPES */\n\nvar asyncRegExp = /^async +/\n\nvar templateLitReg = /`(?:\\\\[\\s\\S]|\\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\\${)[^\\\\`])*`/g\n\nvar singleQuoteReg = /'(?:\\\\[\\s\\w\"'\\\\`]|[^\\n\\r'\\\\])*?'/g\n\nvar doubleQuoteReg = /\"(?:\\\\[\\s\\w\"'\\\\`]|[^\\n\\r\"\\\\])*?\"/g\n\nvar specialCharsReg = /[.*+\\-?^${}()|[\\]\\\\]/g\n\nfunction escapeRegExp (string: string) {\n // From MDN\n return specialCharsReg.test(string)\n ? string.replace(specialCharsReg, '\\\\$&') // $& means the whole matched string\n : string\n}\n\nexport default function parse (str: string, env: SqrlConfig): Array {\n /* Adding for EJS compatibility */\n if (env.rmWhitespace) {\n // Code taken directly from EJS\n // Have to use two separate replaces here as `^` and `$` operators don't\n // work well with `\\r` and empty lines don't work well with the `m` flag.\n // Essentially, this replaces the whitespace at the beginning and end of\n // each line and removes multiple newlines.\n str = str.replace(/[\\r\\n]+/g, '\\n').replace(/^\\s+|\\s+$/gm, '')\n }\n /* End rmWhitespace option */\n\n templateLitReg.lastIndex = 0\n singleQuoteReg.lastIndex = 0\n doubleQuoteReg.lastIndex = 0\n\n var envPrefixes = env.prefixes\n\n var prefixes = [\n envPrefixes.h,\n envPrefixes.b,\n envPrefixes.i,\n envPrefixes.r,\n envPrefixes.c,\n envPrefixes.e\n ].reduce(function (accumulator, prefix) {\n if (accumulator && prefix) {\n return accumulator + '|' + escapeRegExp(prefix)\n } else if (prefix) {\n // accumulator is empty\n return escapeRegExp(prefix)\n } else {\n // prefix and accumulator are both empty strings\n return accumulator\n }\n }, '')\n\n var parseCloseReg = new RegExp(\n '([|()]|=>)|' + // powerchars\n '(\\'|\"|`|\\\\/\\\\*)|\\\\s*((\\\\/)?(-|_)?' + // comments, strings\n escapeRegExp(env.tags[1]) +\n ')',\n 'g'\n )\n\n var tagOpenReg = new RegExp(\n '([^]*?)' + escapeRegExp(env.tags[0]) + '(-|_)?\\\\s*(' + prefixes + ')?\\\\s*',\n 'g'\n )\n\n var startInd = 0\n var trimNextLeftWs: string | false = false\n\n function parseTag (tagOpenIndex: number, currentType: TagType): TemplateObject {\n var currentObj: TemplateObject = { f: [] }\n var numParens = 0\n var currentAttribute: TemplateAttribute = 'c' // default - Valid values: 'c'=content, 'f'=filter, 'fp'=filter params, 'p'=param, 'n'=name\n\n if (currentType === 'h' || currentType === 'b' || currentType === 'c') {\n currentAttribute = 'n'\n } else if (currentType === 'r') {\n currentObj.raw = true\n currentType = 'i'\n }\n\n function addAttrValue (indx: number) {\n var valUnprocessed = str.slice(startInd, indx)\n // console.log(valUnprocessed)\n var val = valUnprocessed.trim()\n if (currentAttribute === 'f') {\n if (val === 'safe') {\n currentObj.raw = true\n } else {\n if (env.async && asyncRegExp.test(val)) {\n val = val.replace(asyncRegExp, '')\n currentObj.f.push([val, '', true])\n } else {\n currentObj.f.push([val, ''])\n }\n }\n } else if (currentAttribute === 'fp') {\n currentObj.f[currentObj.f.length - 1][1] += val\n } else if (currentAttribute === 'err') {\n if (val) {\n var found = valUnprocessed.search(/\\S/)\n ParseErr('invalid syntax', str, startInd + found)\n }\n } else {\n // if (currentObj[currentAttribute]) { // TODO make sure no errs\n // currentObj[currentAttribute] += val\n // } else {\n currentObj[currentAttribute] = val\n // }\n }\n startInd = indx + 1\n }\n\n parseCloseReg.lastIndex = startInd\n\n var m\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = parseCloseReg.exec(str)) !== null) {\n var char = m[1]\n var punctuator = m[2]\n var tagClose = m[3]\n var slash = m[4]\n var wsControl = m[5]\n var i = m.index\n\n if (char) {\n // Power character\n if (char === '(') {\n if (numParens === 0) {\n if (currentAttribute === 'n') {\n addAttrValue(i)\n currentAttribute = 'p'\n } else if (currentAttribute === 'f') {\n addAttrValue(i)\n currentAttribute = 'fp'\n }\n }\n numParens++\n } else if (char === ')') {\n numParens--\n if (numParens === 0 && currentAttribute !== 'c') {\n // Then it's closing a filter, block, or helper\n addAttrValue(i)\n\n currentAttribute = 'err' // Reset the current attribute\n }\n } else if (numParens === 0 && char === '|') {\n addAttrValue(i) // this should actually always be whitespace or empty\n currentAttribute = 'f'\n } else if (char === '=>') {\n addAttrValue(i)\n startInd += 1 // this is 2 chars\n currentAttribute = 'res'\n }\n } else if (punctuator) {\n if (punctuator === '/*') {\n var commentCloseInd = str.indexOf('*/', parseCloseReg.lastIndex)\n if (commentCloseInd === -1) {\n ParseErr('unclosed comment', str, m.index)\n }\n parseCloseReg.lastIndex = commentCloseInd + 2 // since */ is 2 characters, and we're using indexOf rather than a RegExp\n } else if (punctuator === \"'\") {\n singleQuoteReg.lastIndex = m.index\n\n var singleQuoteMatch = singleQuoteReg.exec(str)\n if (singleQuoteMatch) {\n parseCloseReg.lastIndex = singleQuoteReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n } else if (punctuator === '\"') {\n doubleQuoteReg.lastIndex = m.index\n var doubleQuoteMatch = doubleQuoteReg.exec(str)\n\n if (doubleQuoteMatch) {\n parseCloseReg.lastIndex = doubleQuoteReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n } else if (punctuator === '`') {\n templateLitReg.lastIndex = m.index\n var templateLitMatch = templateLitReg.exec(str)\n if (templateLitMatch) {\n parseCloseReg.lastIndex = templateLitReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n }\n } else if (tagClose) {\n addAttrValue(i)\n startInd = i + m[0].length\n tagOpenReg.lastIndex = startInd\n // console.log('tagClose: ' + startInd)\n trimNextLeftWs = wsControl\n if (slash && currentType === 'h') {\n currentType = 's'\n } // TODO throw err\n currentObj.t = currentType\n return currentObj\n }\n }\n ParseErr('unclosed tag', str, tagOpenIndex)\n return currentObj // To prevent TypeScript from erroring\n }\n\n function parseContext (parentObj: TemplateObject, firstParse?: boolean): ParentTemplateObject {\n parentObj.b = [] // assume there will be blocks // TODO: perf optimize this\n parentObj.d = []\n var lastBlock: ParentTemplateObject | false = false\n var buffer: Array = []\n\n function pushString (strng: string, shouldTrimRightOfString?: string | false) {\n if (strng) {\n // if string is truthy it must be of type 'string'\n\n // TODO: benchmark replace( /(\\\\|')/g, '\\\\$1')\n strng = trimWS(\n strng,\n env,\n trimNextLeftWs, // this will only be false on the first str, the next ones will be null or undefined\n shouldTrimRightOfString\n )\n\n if (strng) {\n // replace \\ with \\\\, ' with \\'\n\n strng = strng.replace(/\\\\|'/g, '\\\\$&').replace(/\\r\\n|\\n|\\r/g, '\\\\n')\n // we're going to convert all CRLF to LF so it doesn't take more than one replace\n\n buffer.push(strng)\n }\n }\n }\n\n // Random TODO: parentObj.b doesn't need to have t: #\n var tagOpenMatch\n // tslint:disable-next-line:no-conditional-assignment\n while ((tagOpenMatch = tagOpenReg.exec(str)) !== null) {\n var precedingString = tagOpenMatch[1]\n var shouldTrimRightPrecedingString = tagOpenMatch[2]\n var prefix = tagOpenMatch[3] || ''\n var prefixType: TagType | undefined\n\n for (var key in envPrefixes) {\n if (envPrefixes[key] === prefix) {\n prefixType = key as TagType\n break\n }\n }\n\n pushString(precedingString, shouldTrimRightPrecedingString)\n startInd = tagOpenMatch.index + tagOpenMatch[0].length\n\n if (!prefixType) {\n ParseErr('unrecognized tag type: ' + prefix, str, startInd)\n }\n\n var currentObj = parseTag(tagOpenMatch.index, prefixType as TagType)\n // ===== NOW ADD THE OBJECT TO OUR BUFFER =====\n\n var currentType = currentObj.t\n if (currentType === 'h') {\n var hName = currentObj.n || ''\n if (env.async && asyncRegExp.test(hName)) {\n currentObj.a = true\n currentObj.n = hName.replace(asyncRegExp, '')\n }\n currentObj = parseContext(currentObj) // currentObj is the parent object\n buffer.push(currentObj)\n } else if (currentType === 'c') {\n // tag close\n if (parentObj.n === currentObj.n) {\n if (lastBlock) {\n // If there's a previous block\n lastBlock.d = buffer\n parentObj.b.push(lastBlock)\n } else {\n parentObj.d = buffer\n }\n // console.log('parentObj: ' + JSON.stringify(parentObj))\n return parentObj as ParentTemplateObject\n } else {\n ParseErr(\n \"Helper start and end don't match\",\n str,\n tagOpenMatch.index + tagOpenMatch[0].length\n )\n }\n } else if (currentType === 'b') {\n // block\n // TODO: make sure async stuff inside blocks are recognized\n if (lastBlock) {\n // If there's a previous block\n lastBlock.d = buffer\n parentObj.b.push(lastBlock)\n } else {\n parentObj.d = buffer\n }\n\n var blockName = currentObj.n || ''\n if (env.async && asyncRegExp.test(blockName)) {\n currentObj.a = true\n currentObj.n = blockName.replace(asyncRegExp, '')\n }\n\n lastBlock = currentObj as ParentTemplateObject // Set the 'lastBlock' object to the value of the current block\n\n buffer = []\n } else if (currentType === 's') {\n var selfClosingHName = currentObj.n || ''\n if (env.async && asyncRegExp.test(selfClosingHName)) {\n currentObj.a = true\n currentObj.n = selfClosingHName.replace(asyncRegExp, '')\n }\n buffer.push(currentObj)\n } else {\n buffer.push(currentObj)\n }\n // ===== DONE ADDING OBJECT TO BUFFER =====\n }\n\n if (firstParse) {\n pushString(str.slice(startInd, str.length), false)\n parentObj.d = buffer\n } else {\n throw SqrlErr('unclosed helper \"' + parentObj.n + '\"')\n // It should have returned by now\n }\n\n return parentObj as ParentTemplateObject\n }\n\n var parseResult = parseContext({ f: [] }, true)\n // console.log(JSON.stringify(parseResult))\n if (env.plugins) {\n for (var i = 0; i < env.plugins.length; i++) {\n var plugin = env.plugins[i]\n if (plugin.processAST) {\n parseResult.d = plugin.processAST(parseResult.d, env)\n }\n }\n }\n return parseResult.d // Parse the very outside context\n}\n","import Parse from './parse'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { AstObject, Filter, ParentTemplateObject } from './parse'\ntype ParsedTagType = 'h' | 's' | 'e' | 'i'\n// import SqrlErr from './err'\n\n/* END TYPES */\n\nexport default function compileToString (str: string, env: SqrlConfig) {\n var buffer: Array = Parse(str, env)\n\n var res =\n \"var tR='';\" +\n (env.useWith ? 'with(' + env.varName + '||{}){' : '') +\n compileScope(buffer, env) +\n 'if(cb){cb(null,tR)} return tR' +\n (env.useWith ? '}' : '')\n\n if (env.plugins) {\n for (var i = 0; i < env.plugins.length; i++) {\n var plugin = env.plugins[i]\n if (plugin.processFnString) {\n res = plugin.processFnString(res, env)\n }\n }\n }\n\n return res\n\n // TODO: is `return cb()` necessary, or could we just do `cb()`\n}\n\nfunction filter (str: string, filters: Array) {\n for (var i = 0; i < filters.length; i++) {\n var name = filters[i][0]\n var params = filters[i][1]\n var isFilterAsync = filters[i][2]\n\n // if (isFilterAsync && !env.async) {\n // throw SqrlErr(\"Async filter '\" + name + \"' in non-async env\")\n // }\n // Let the JS compiler do this, compile() will catch it\n\n str = (isFilterAsync ? 'await ' : '') + \"c.l('F','\" + name + \"')(\" + str\n if (params) {\n str += ',' + params\n }\n str += ')'\n }\n return str\n}\n\n// TODO: Use type intersections for TemplateObject, etc.\n// so I don't have to make properties mandatory\n\nfunction compileHelper (\n env: SqrlConfig,\n res: string,\n descendants: Array,\n params: string,\n isAsync?: boolean,\n name?: string\n) {\n var ret =\n '{exec:' +\n (isAsync ? 'async ' : '') +\n compileScopeIntoFunction(descendants, res, env) +\n ',params:[' +\n params +\n ']'\n if (name) {\n ret += \",name:'\" + name + \"'\"\n }\n if (isAsync) {\n ret += ',async:true'\n }\n ret += '}'\n return ret\n}\n\nfunction compileBlocks (blocks: Array, env: SqrlConfig) {\n var ret = '['\n for (var i = 0; i < blocks.length; i++) {\n var block = blocks[i]\n ret += compileHelper(env, block.res || '', block.d, block.p || '', block.a, block.n)\n if (i < blocks.length) {\n ret += ','\n }\n }\n ret += ']'\n return ret\n}\n\nexport function compileScopeIntoFunction (buff: Array, res: string, env: SqrlConfig) {\n return 'function(' + res + \"){var tR='';\" + compileScope(buff, env) + 'return tR}'\n}\n\nexport function compileScope (buff: Array, env: SqrlConfig) {\n var i = 0\n var buffLength = buff.length\n var returnStr = ''\n\n for (i; i < buffLength; i++) {\n var currentBlock = buff[i]\n if (typeof currentBlock === 'string') {\n var str = currentBlock\n\n // we know string exists\n returnStr += \"tR+='\" + str + \"';\"\n } else {\n var type: ParsedTagType = currentBlock.t as ParsedTagType // h, s, e, i\n var content = currentBlock.c || ''\n var filters = currentBlock.f\n var name = currentBlock.n || ''\n var params = currentBlock.p || ''\n var res = currentBlock.res || ''\n var blocks = currentBlock.b\n var isAsync = !!currentBlock.a // !! is to booleanize it\n // if (isAsync && !env.async) {\n // throw SqrlErr(\"Async block or helper '\" + name + \"' in non-async env\")\n // }\n // Let compiler do this\n if (type === 'i') {\n if (env.defaultFilter) {\n content = \"c.l('F','\" + env.defaultFilter + \"')(\" + content + ')'\n }\n var filtered = filter(content, filters)\n if (!currentBlock.raw && env.autoEscape) {\n filtered = \"c.l('F','e')(\" + filtered + ')'\n }\n returnStr += 'tR+=' + filtered + ';'\n // reference\n } else if (type === 'h') {\n // helper\n if (env.storage.nativeHelpers.get(name)) {\n returnStr += env.storage.nativeHelpers.get(name)(currentBlock, env)\n } else {\n var helperReturn =\n (isAsync ? 'await ' : '') +\n \"c.l('H','\" +\n name +\n \"')(\" +\n compileHelper(env, res, (currentBlock as ParentTemplateObject).d, params, isAsync)\n if (blocks) {\n helperReturn += ',' + compileBlocks(blocks, env)\n } else {\n helperReturn += ',[]'\n }\n helperReturn += ',c)'\n\n returnStr += 'tR+=' + filter(helperReturn, filters) + ';'\n }\n } else if (type === 's') {\n // self-closing helper\n\n returnStr +=\n 'tR+=' +\n filter(\n (isAsync ? 'await ' : '') + \"c.l('H','\" + name + \"')({params:[\" + params + ']},[],c)',\n filters\n ) +\n ';'\n } else if (type === 'e') {\n // execute\n returnStr += content + '\\n'\n }\n }\n }\n\n return returnStr\n}\n","import { copyProps } from './utils'\n\n/* TYPES */\n\ninterface Dict {\n // Basically, an object where all keys point to a value of the same type\n [key: string]: T\n}\n\n/* END TYPES */\n\nclass Cacher {\n constructor (private cache: Dict) {}\n define (key: string, val: T) {\n this.cache[key] = val\n }\n get (key: string) {\n // string | array.\n // TODO: allow array of keys to look down\n // TODO: create plugin to allow referencing helpers, filters with dot notation\n return this.cache[key]\n }\n remove (key: string) {\n delete this.cache[key]\n }\n reset () {\n this.cache = {}\n }\n load (cacheObj: Dict) {\n // TODO: this will err with deep objects and `storage` or `plugins` keys.\n // Update Feb 26: EDITED so it shouldn't err\n copyProps(this.cache, cacheObj, true)\n }\n}\n\nexport { Cacher }\n","import SqrlErr from './err'\n\nexport function errWithBlocksOrFilters(\n name: string,\n blocks: Array | false, // false means don't check\n filters: Array | false,\n native?: boolean\n) {\n if (blocks && blocks.length > 0) {\n throw SqrlErr((native ? 'Native' : '') + \"Helper '\" + name + \"' doesn't accept blocks\")\n }\n if (filters && filters.length > 0) {\n throw SqrlErr((native ? 'Native' : '') + \"Helper '\" + name + \"' doesn't accept filters\")\n }\n}\n\n/* ASYNC LOOP FNs */\nexport function asyncArrLoop(\n arr: Array,\n index: number,\n fn: Function,\n res: string,\n cb: Function\n) {\n fn(arr[index], index).then(function (val: string) {\n res += val\n if (index === arr.length - 1) {\n cb(res)\n } else {\n asyncArrLoop(arr, index + 1, fn, res, cb)\n }\n })\n}\n\nexport function asyncObjLoop(\n obj: { [index: string]: any },\n keys: Array,\n index: number,\n fn: Function,\n res: string,\n cb: Function\n) {\n fn(keys[index], obj[keys[index]]).then(function (val: string) {\n res += val\n if (index === keys.length - 1) {\n cb(res)\n } else {\n asyncObjLoop(obj, keys, index + 1, fn, res, cb)\n }\n })\n}\n\nvar escMap: EscapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nexport function replaceChar(s: string): string {\n return escMap[s]\n}\n\nexport function XMLEscape(str: unknown) {\n // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized.\n var newStr = String(str)\n if (/[&<>\"']/.test(newStr)) {\n return newStr.replace(/[&<>\"']/g, replaceChar)\n } else {\n return newStr\n }\n}\n\n/* INTERFACES */\ninterface EscapeMap {\n '&': '&'\n '<': '<'\n '>': '>'\n '\"': '"'\n \"'\": '''\n [index: string]: string\n}\n","import { Cacher } from './storage'\nimport SqrlErr from './err'\nimport { compileScope, compileScopeIntoFunction } from './compile-string'\nimport { hasOwnProp } from './utils'\nimport { errWithBlocksOrFilters, asyncArrLoop, asyncObjLoop, XMLEscape } from './container-utils'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { TemplateFunction } from './compile'\nimport { ParentTemplateObject } from './parse'\n\nexport interface HelperContent {\n exec: Function\n params: Array\n async?: boolean\n}\n\nexport interface HelperBlock extends HelperContent {\n name: string\n}\n\nexport type HelperFunction = (\n content: HelperContent,\n blocks: Array,\n config: SqrlConfig\n) => string | Promise\n\nexport type FilterFunction = (...args: any[]) => any | Promise\n\ninterface IncludeHelperContent extends HelperContent {\n params: [string, object]\n}\n\ninterface GenericData {\n [index: string]: any\n}\n\n/* END TYPES */\n\nvar templates = new Cacher({})\n\n/* ASYNC LOOP FNs */\n\nvar helpers = new Cacher({\n each: function (content: HelperContent, blocks: Array) {\n var res = ''\n var arr = content.params[0]\n errWithBlocksOrFilters('each', blocks, false)\n\n if (content.async) {\n return new Promise(function (resolve) {\n asyncArrLoop(arr, 0, content.exec, res, resolve)\n })\n } else {\n for (var i = 0; i < arr.length; i++) {\n res += content.exec(arr[i], i)\n }\n return res\n }\n },\n foreach: function (content: HelperContent, blocks: Array) {\n var obj = content.params[0]\n errWithBlocksOrFilters('foreach', blocks, false)\n\n if (content.async) {\n return new Promise(function (resolve) {\n asyncObjLoop(obj, Object.keys(obj), 0, content.exec, '', resolve)\n })\n } else {\n var res = ''\n\n for (var key in obj) {\n if (!hasOwnProp(obj, key)) continue\n res += content.exec(key, obj[key]) // todo: check on order\n }\n return res\n }\n },\n include: function (\n content: IncludeHelperContent,\n blocks: Array,\n config: SqrlConfig\n ): string {\n errWithBlocksOrFilters('include', blocks, false)\n var template = config.storage.templates.get(content.params[0])\n if (!template) {\n throw SqrlErr('Could not fetch template \"' + content.params[0] + '\"')\n }\n return template(content.params[1], config)\n } as HelperFunction,\n extends: function (\n content: IncludeHelperContent,\n blocks: Array,\n config: SqrlConfig\n ): string {\n var data: GenericData = content.params[1] || {}\n data.content = content.exec()\n\n for (var i = 0; i < blocks.length; i++) {\n var currentBlock = blocks[i]\n data[currentBlock.name] = currentBlock.exec()\n }\n\n var template = config.storage.templates.get(content.params[0])\n if (!template) {\n throw SqrlErr('Could not fetch template \"' + content.params[0] + '\"')\n }\n return template(data, config)\n } as HelperFunction,\n useScope: function (content: HelperContent, blocks: Array): string {\n errWithBlocksOrFilters('useScope', blocks, false)\n\n return content.exec(content.params[0])\n } as HelperFunction\n})\n\nvar nativeHelpers = new Cacher({\n if: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('if', false, buffer.f, true)\n\n var returnStr = 'if(' + buffer.p + '){' + compileScope(buffer.d, env) + '}'\n if (buffer.b) {\n for (var i = 0; i < buffer.b.length; i++) {\n var currentBlock = buffer.b[i]\n if (currentBlock.n === 'else') {\n returnStr += 'else{' + compileScope(currentBlock.d, env) + '}'\n } else if (currentBlock.n === 'elif') {\n returnStr += 'else if(' + currentBlock.p + '){' + compileScope(currentBlock.d, env) + '}'\n }\n }\n }\n return returnStr\n },\n try: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('try', false, buffer.f, true)\n\n if (!buffer.b || buffer.b.length !== 1 || buffer.b[0].n !== 'catch') {\n throw SqrlErr(\"native helper 'try' only accepts 1 block, 'catch'\")\n }\n var returnStr = 'try{' + compileScope(buffer.d, env) + '}'\n\n var currentBlock = buffer.b[0]\n returnStr +=\n 'catch' +\n (currentBlock.res ? '(' + currentBlock.res + ')' : '') +\n '{' +\n compileScope(currentBlock.d, env) +\n '}'\n\n return returnStr\n },\n block: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('block', buffer.b, buffer.f, true)\n\n var returnStr =\n 'if(!' +\n env.varName +\n '[' +\n buffer.p +\n ']){tR+=(' +\n compileScopeIntoFunction(buffer.d, '', env) +\n ')()}else{tR+=' +\n env.varName +\n '[' +\n buffer.p +\n ']}'\n\n return returnStr\n }\n})\n\nvar filters = new Cacher({ e: XMLEscape })\n\nexport { templates, helpers, nativeHelpers, filters }\n","import { helpers, nativeHelpers, filters, templates } from './containers'\nimport SqrlErr from './err'\nimport { copyProps } from './utils'\n\n/* TYPES */\n\nexport type FetcherFunction = (container: 'H' | 'F', name: string) => Function | undefined\nimport { HelperFunction, FilterFunction } from './containers'\nimport { TemplateFunction } from './compile'\nimport { Cacher } from './storage'\n// import { TagType } from './parse'\n\ntype trimConfig = 'nl' | 'slurp' | false\n\nexport interface SqrlConfig {\n varName: string\n autoTrim: trimConfig | [trimConfig, trimConfig]\n rmWhitespace?: boolean\n autoEscape: boolean\n defaultFilter: false | string\n tags: [string, string]\n l: FetcherFunction\n plugins: Array<{ processFnString?: Function; processAST?: Function }>\n async: boolean\n storage: {\n helpers: Cacher\n nativeHelpers: Cacher\n filters: Cacher\n templates: Cacher\n }\n prefixes: {\n h: string\n b: string\n i: string\n r: string\n c: string\n e: string\n [index: string]: string\n }\n cache: boolean\n views?: string | Array\n root?: string\n filename?: string\n name?: string\n 'view cache'?: boolean\n useWith?: boolean\n [index: string]: any\n}\n\nexport type PartialConfig = {\n [P in keyof SqrlConfig]?: SqrlConfig[P]\n}\n\n/* END TYPES */\n\nvar defaultConfig: SqrlConfig = {\n varName: 'it',\n autoTrim: [false, 'nl'],\n autoEscape: true,\n defaultFilter: false,\n tags: ['{{', '}}'],\n l: function (container: 'H' | 'F', name: string): HelperFunction | FilterFunction | undefined {\n if (container === 'H') {\n var hRet = this.storage.helpers.get(name) as HelperFunction | undefined\n if (hRet) {\n return hRet\n } else {\n throw SqrlErr(\"Can't find helper '\" + name + \"'\")\n }\n } else if (container === 'F') {\n var fRet = this.storage.filters.get(name) as FilterFunction | undefined\n if (fRet) {\n return fRet\n } else {\n throw SqrlErr(\"Can't find filter '\" + name + \"'\")\n }\n }\n },\n async: false,\n storage: {\n helpers: helpers,\n nativeHelpers: nativeHelpers,\n filters: filters,\n templates: templates\n },\n prefixes: {\n h: '@',\n b: '#',\n i: '',\n r: '*',\n c: '/',\n e: '!'\n },\n cache: false,\n plugins: [],\n useWith: false\n}\n\ndefaultConfig.l.bind(defaultConfig)\n\nfunction getConfig (override: PartialConfig, baseConfig?: SqrlConfig): SqrlConfig {\n // TODO: run more tests on this\n\n var res: PartialConfig = {} // Linked\n copyProps(res, defaultConfig) // Creates deep clone of res, 1 layer deep\n\n if (baseConfig) {\n copyProps(res, baseConfig)\n }\n\n if (override) {\n copyProps(res, override)\n }\n\n ;(res as SqrlConfig).l.bind(res)\n\n return res as SqrlConfig\n}\n\nexport { defaultConfig, getConfig }\n","import compileToString from './compile-string'\nimport { getConfig } from './config'\nimport { asyncFunc } from './utils'\nimport SqrlErr from './err'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { CallbackFn } from './file-handlers'\nexport type TemplateFunction = (data: object, config: SqrlConfig, cb?: CallbackFn) => string\n\n/* END TYPES */\n\nexport default function compile (str: string, env?: PartialConfig): TemplateFunction {\n var options: SqrlConfig = getConfig(env || {})\n var ctor = Function // constructor\n\n /* ASYNC HANDLING */\n // The below code is modified from mde/ejs. All credit should go to them.\n if (options.async) {\n // Have to use generated function for this, since in envs without support,\n // it breaks in parsing\n if (asyncFunc) {\n ctor = asyncFunc\n } else {\n throw SqrlErr(\"This environment doesn't support async/await\")\n }\n }\n\n /* END ASYNC HANDLING */\n try {\n return new ctor(\n options.varName,\n 'c', // SqrlConfig\n 'cb', // optional callback\n compileToString(str, options)\n ) as TemplateFunction // eslint-disable-line no-new-func\n } catch (e) {\n if (e instanceof SyntaxError) {\n throw SqrlErr(\n 'Bad template syntax\\n\\n' +\n e.message +\n '\\n' +\n Array(e.message.length + 1).join('=') +\n '\\n' +\n compileToString(str, options)\n )\n } else {\n throw e\n }\n }\n}\n","import compile from './compile'\nimport { getConfig } from './config'\nimport { promiseImpl } from './utils'\nimport SqrlErr from './err'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { TemplateFunction } from './compile'\nimport { CallbackFn } from './file-handlers'\n\n/* END TYPES */\n\nfunction handleCache (template: string | TemplateFunction, options: SqrlConfig): TemplateFunction {\n var templateFunc\n\n if (options.cache && options.name && options.storage.templates.get(options.name)) {\n return options.storage.templates.get(options.name)\n }\n\n if (typeof template === 'function') {\n templateFunc = template\n } else {\n templateFunc = compile(template, options)\n }\n\n if (options.cache && options.name) {\n options.storage.templates.define(options.name, templateFunc)\n }\n\n return templateFunc\n}\n\nexport default function render (\n template: string | TemplateFunction,\n data: object,\n env?: PartialConfig,\n cb?: CallbackFn\n) {\n var options = getConfig(env || {})\n\n if (options.async) {\n var result\n if (!cb) {\n // No callback, try returning a promise\n if (typeof promiseImpl === 'function') {\n return new promiseImpl(function (resolve: Function, reject: Function) {\n try {\n result = handleCache(template, options)(data, options)\n resolve(result)\n } catch (err) {\n reject(err)\n }\n })\n } else {\n throw SqrlErr(\"Please provide a callback function, this env doesn't support Promises\")\n }\n } else {\n try {\n handleCache(template, options)(data, options, cb)\n } catch (err) {\n return cb(err)\n }\n }\n } else {\n return handleCache(template, options)(data, options)\n }\n}\n"],"names":["SqrlErr","message","obj","proto","err","Error","prototype","Object","setPrototypeOf","__proto__","ParseErr","str","indx","whitespace","slice","split","lineNo","length","colNo","Array","join","create","name","value","enumerable","promiseImpl","Function","Promise","asyncFunc","e","SyntaxError","hasOwnProp","prop","hasOwnProperty","call","copyProps","toObj","fromObj","notConfig","key","asyncRegExp","templateLitReg","singleQuoteReg","doubleQuoteReg","specialCharsReg","escapeRegExp","string","test","replace","parse","env","rmWhitespace","lastIndex","envPrefixes","prefixes","h","b","i","r","c","reduce","accumulator","prefix","parseCloseReg","RegExp","tags","tagOpenReg","startInd","trimNextLeftWs","parseTag","tagOpenIndex","currentType","m","currentObj","f","numParens","currentAttribute","addAttrValue","valUnprocessed","val","trim","raw","async","push","found","search","exec","char","punctuator","tagClose","slash","wsControl","index","commentCloseInd","indexOf","t","parseResult","parseContext","parentObj","firstParse","d","tagOpenMatch","lastBlock","buffer","pushString","strng","shouldTrimRightOfString","wsLeft","wsRight","leftTrim","rightTrim","autoTrim","isArray","String","trimLeft","trimRight","trimWS","prefixType","precedingString","shouldTrimRightPrecedingString","hName","n","a","blockName","selfClosingHName","plugins","plugin","processAST","compileToString","Parse","res","useWith","varName","compileScope","processFnString","filter","filters","params","compileHelper","descendants","isAsync","ret","compileScopeIntoFunction","compileBlocks","blocks","block","p","buff","buffLength","returnStr","currentBlock","type","content","defaultFilter","filtered","autoEscape","storage","nativeHelpers","get","helperReturn","cache","this","Cacher","cacheObj","errWithBlocksOrFilters","native","escMap","&","<",">","\"","'","replaceChar","s","templates","helpers","each","arr","resolve","asyncArrLoop","fn","cb","then","foreach","asyncObjLoop","keys","include","config","template","extends","data","useScope","if","try","newStr","defaultConfig","l","container","hRet","fRet","getConfig","override","baseConfig","bind","compile","options","ctor","handleCache","templateFunc","define","reject"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/squirrelly/dist/squirrelly.cjs.js b/src/node_modules/squirrelly/dist/squirrelly.cjs.js new file mode 100644 index 0000000..4680ee7 --- /dev/null +++ b/src/node_modules/squirrelly/dist/squirrelly.cjs.js @@ -0,0 +1,1172 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +// TODO: allow '-' to trim up until newline. Use [^\S\n\r] instead of \s +// TODO: only include trimLeft polyfill if not in ES6 +/* END TYPES */ +var promiseImpl = new Function('return this')().Promise; +var asyncFunc = false; +try { + asyncFunc = new Function('return (async function(){}).constructor')(); +} +catch (e) { + // We shouldn't actually ever have any other errors, but... + if (!(e instanceof SyntaxError)) { + throw e; + } +} +function hasOwnProp(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} +function copyProps(toObj, fromObj, notConfig) { + for (var key in fromObj) { + if (hasOwnProp(fromObj, key)) { + if (fromObj[key] != null && + typeof fromObj[key] == 'object' && + (key === 'storage' || key === 'prefixes') && + !notConfig // not called from Cache.load + ) { + // plugins or storage + // Note: this doesn't merge from initial config! + // Deep clone instead of assigning + // TODO: run checks on this + toObj[key] = copyProps(/*toObj[key] ||*/ {}, fromObj[key]); + } + else { + toObj[key] = fromObj[key]; + } + } + } + return toObj; +} +function trimWS(str, env, wsLeft, wsRight) { + var leftTrim; + var rightTrim; + if (typeof env.autoTrim === 'string') { + leftTrim = rightTrim = env.autoTrim; + // Don't need to check if env.autoTrim is false + // Because leftTrim, rightTrim are initialized as falsy + } + else if (Array.isArray(env.autoTrim)) { + // kinda confusing + // but _}} will trim the left side of the following string + leftTrim = env.autoTrim[1]; + rightTrim = env.autoTrim[0]; + } + if (wsLeft || wsLeft === false) { + leftTrim = wsLeft; + } + if (wsRight || wsRight === false) { + rightTrim = wsRight; + } + if (leftTrim === 'slurp' && rightTrim === 'slurp') { + return str.trim(); + } + if (leftTrim === '_' || leftTrim === 'slurp') { + // console.log('trimming left' + leftTrim) + // full slurp + // eslint-disable-next-line no-extra-boolean-cast + if (!!String.prototype.trimLeft) { + str = str.trimLeft(); + } + else { + str = str.replace(/^[\s\uFEFF\xA0]+/, ''); + } + } + else if (leftTrim === '-' || leftTrim === 'nl') { + // console.log('trimming left nl' + leftTrim) + // nl trim + str = str.replace(/^(?:\n|\r|\r\n)/, ''); + } + if (rightTrim === '_' || rightTrim === 'slurp') { + // console.log('trimming right' + rightTrim) + // full slurp + // eslint-disable-next-line no-extra-boolean-cast + if (!!String.prototype.trimRight) { + str = str.trimRight(); + } + else { + str = str.replace(/[\s\uFEFF\xA0]+$/, ''); + } + } + else if (rightTrim === '-' || rightTrim === 'nl') { + // console.log('trimming right nl' + rightTrim) + // nl trim + str = str.replace(/(?:\n|\r|\r\n)$/, ''); // TODO: make sure this gets \r\n + } + return str; +} + +/* END TYPES */ +var Cacher = /** @class */ (function () { + function Cacher(cache) { + this.cache = cache; + } + Cacher.prototype.define = function (key, val) { + this.cache[key] = val; + }; + Cacher.prototype.get = function (key) { + // string | array. + // TODO: allow array of keys to look down + // TODO: create plugin to allow referencing helpers, filters with dot notation + return this.cache[key]; + }; + Cacher.prototype.remove = function (key) { + delete this.cache[key]; + }; + Cacher.prototype.reset = function () { + this.cache = {}; + }; + Cacher.prototype.load = function (cacheObj) { + // TODO: this will err with deep objects and `storage` or `plugins` keys. + // Update Feb 26: EDITED so it shouldn't err + copyProps(this.cache, cacheObj, true); + }; + return Cacher; +}()); + +function setPrototypeOf(obj, proto) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(obj, proto); + } + else { + obj.__proto__ = proto; + } +} +function SqrlErr(message) { + var err = new Error(message); + setPrototypeOf(err, SqrlErr.prototype); + return err; +} +SqrlErr.prototype = Object.create(Error.prototype, { + name: { value: 'Squirrelly Error', enumerable: false } +}); +// TODO: Class transpilation adds a lot to the bundle size +function ParseErr(message, str, indx) { + var whitespace = str.slice(0, indx).split(/\n/); + var lineNo = whitespace.length; + var colNo = whitespace[lineNo - 1].length + 1; + message += + ' at line ' + + lineNo + + ' col ' + + colNo + + ':\n\n' + + ' ' + + str.split(/\n/)[lineNo - 1] + + '\n' + + ' ' + + Array(colNo).join(' ') + + '^'; + throw SqrlErr(message); +} + +/* END TYPES */ +var asyncRegExp = /^async +/; +var templateLitReg = /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\${)[^\\`])*`/g; +var singleQuoteReg = /'(?:\\[\s\w"'\\`]|[^\n\r'\\])*?'/g; +var doubleQuoteReg = /"(?:\\[\s\w"'\\`]|[^\n\r"\\])*?"/g; +var specialCharsReg = /[.*+\-?^${}()|[\]\\]/g; +function escapeRegExp(string) { + // From MDN + return specialCharsReg.test(string) + ? string.replace(specialCharsReg, '\\$&') // $& means the whole matched string + : string; +} +function parse(str, env) { + /* Adding for EJS compatibility */ + if (env.rmWhitespace) { + // Code taken directly from EJS + // Have to use two separate replaces here as `^` and `$` operators don't + // work well with `\r` and empty lines don't work well with the `m` flag. + // Essentially, this replaces the whitespace at the beginning and end of + // each line and removes multiple newlines. + str = str.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, ''); + } + /* End rmWhitespace option */ + templateLitReg.lastIndex = 0; + singleQuoteReg.lastIndex = 0; + doubleQuoteReg.lastIndex = 0; + var envPrefixes = env.prefixes; + var prefixes = [ + envPrefixes.h, + envPrefixes.b, + envPrefixes.i, + envPrefixes.r, + envPrefixes.c, + envPrefixes.e + ].reduce(function (accumulator, prefix) { + if (accumulator && prefix) { + return accumulator + '|' + escapeRegExp(prefix); + } + else if (prefix) { + // accumulator is empty + return escapeRegExp(prefix); + } + else { + // prefix and accumulator are both empty strings + return accumulator; + } + }, ''); + var parseCloseReg = new RegExp('([|()]|=>)|' + // powerchars + '(\'|"|`|\\/\\*)|\\s*((\\/)?(-|_)?' + // comments, strings + escapeRegExp(env.tags[1]) + + ')', 'g'); + var tagOpenReg = new RegExp('([^]*?)' + escapeRegExp(env.tags[0]) + '(-|_)?\\s*(' + prefixes + ')?\\s*', 'g'); + var startInd = 0; + var trimNextLeftWs = false; + function parseTag(tagOpenIndex, currentType) { + var currentObj = { f: [] }; + var numParens = 0; + var currentAttribute = 'c'; // default - Valid values: 'c'=content, 'f'=filter, 'fp'=filter params, 'p'=param, 'n'=name + if (currentType === 'h' || currentType === 'b' || currentType === 'c') { + currentAttribute = 'n'; + } + else if (currentType === 'r') { + currentObj.raw = true; + currentType = 'i'; + } + function addAttrValue(indx) { + var valUnprocessed = str.slice(startInd, indx); + // console.log(valUnprocessed) + var val = valUnprocessed.trim(); + if (currentAttribute === 'f') { + if (val === 'safe') { + currentObj.raw = true; + } + else { + if (env.async && asyncRegExp.test(val)) { + val = val.replace(asyncRegExp, ''); + currentObj.f.push([val, '', true]); + } + else { + currentObj.f.push([val, '']); + } + } + } + else if (currentAttribute === 'fp') { + currentObj.f[currentObj.f.length - 1][1] += val; + } + else if (currentAttribute === 'err') { + if (val) { + var found = valUnprocessed.search(/\S/); + ParseErr('invalid syntax', str, startInd + found); + } + } + else { + // if (currentObj[currentAttribute]) { // TODO make sure no errs + // currentObj[currentAttribute] += val + // } else { + currentObj[currentAttribute] = val; + // } + } + startInd = indx + 1; + } + parseCloseReg.lastIndex = startInd; + var m; + // tslint:disable-next-line:no-conditional-assignment + while ((m = parseCloseReg.exec(str)) !== null) { + var char = m[1]; + var punctuator = m[2]; + var tagClose = m[3]; + var slash = m[4]; + var wsControl = m[5]; + var i = m.index; + if (char) { + // Power character + if (char === '(') { + if (numParens === 0) { + if (currentAttribute === 'n') { + addAttrValue(i); + currentAttribute = 'p'; + } + else if (currentAttribute === 'f') { + addAttrValue(i); + currentAttribute = 'fp'; + } + } + numParens++; + } + else if (char === ')') { + numParens--; + if (numParens === 0 && currentAttribute !== 'c') { + // Then it's closing a filter, block, or helper + addAttrValue(i); + currentAttribute = 'err'; // Reset the current attribute + } + } + else if (numParens === 0 && char === '|') { + addAttrValue(i); // this should actually always be whitespace or empty + currentAttribute = 'f'; + } + else if (char === '=>') { + addAttrValue(i); + startInd += 1; // this is 2 chars + currentAttribute = 'res'; + } + } + else if (punctuator) { + if (punctuator === '/*') { + var commentCloseInd = str.indexOf('*/', parseCloseReg.lastIndex); + if (commentCloseInd === -1) { + ParseErr('unclosed comment', str, m.index); + } + parseCloseReg.lastIndex = commentCloseInd + 2; // since */ is 2 characters, and we're using indexOf rather than a RegExp + } + else if (punctuator === "'") { + singleQuoteReg.lastIndex = m.index; + var singleQuoteMatch = singleQuoteReg.exec(str); + if (singleQuoteMatch) { + parseCloseReg.lastIndex = singleQuoteReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + else if (punctuator === '"') { + doubleQuoteReg.lastIndex = m.index; + var doubleQuoteMatch = doubleQuoteReg.exec(str); + if (doubleQuoteMatch) { + parseCloseReg.lastIndex = doubleQuoteReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + else if (punctuator === '`') { + templateLitReg.lastIndex = m.index; + var templateLitMatch = templateLitReg.exec(str); + if (templateLitMatch) { + parseCloseReg.lastIndex = templateLitReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + } + else if (tagClose) { + addAttrValue(i); + startInd = i + m[0].length; + tagOpenReg.lastIndex = startInd; + // console.log('tagClose: ' + startInd) + trimNextLeftWs = wsControl; + if (slash && currentType === 'h') { + currentType = 's'; + } // TODO throw err + currentObj.t = currentType; + return currentObj; + } + } + ParseErr('unclosed tag', str, tagOpenIndex); + return currentObj; // To prevent TypeScript from erroring + } + function parseContext(parentObj, firstParse) { + parentObj.b = []; // assume there will be blocks // TODO: perf optimize this + parentObj.d = []; + var lastBlock = false; + var buffer = []; + function pushString(strng, shouldTrimRightOfString) { + if (strng) { + // if string is truthy it must be of type 'string' + // TODO: benchmark replace( /(\\|')/g, '\\$1') + strng = trimWS(strng, env, trimNextLeftWs, // this will only be false on the first str, the next ones will be null or undefined + shouldTrimRightOfString); + if (strng) { + // replace \ with \\, ' with \' + strng = strng.replace(/\\|'/g, '\\$&').replace(/\r\n|\n|\r/g, '\\n'); + // we're going to convert all CRLF to LF so it doesn't take more than one replace + buffer.push(strng); + } + } + } + // Random TODO: parentObj.b doesn't need to have t: # + var tagOpenMatch; + // tslint:disable-next-line:no-conditional-assignment + while ((tagOpenMatch = tagOpenReg.exec(str)) !== null) { + var precedingString = tagOpenMatch[1]; + var shouldTrimRightPrecedingString = tagOpenMatch[2]; + var prefix = tagOpenMatch[3] || ''; + var prefixType; + for (var key in envPrefixes) { + if (envPrefixes[key] === prefix) { + prefixType = key; + break; + } + } + pushString(precedingString, shouldTrimRightPrecedingString); + startInd = tagOpenMatch.index + tagOpenMatch[0].length; + if (!prefixType) { + ParseErr('unrecognized tag type: ' + prefix, str, startInd); + } + var currentObj = parseTag(tagOpenMatch.index, prefixType); + // ===== NOW ADD THE OBJECT TO OUR BUFFER ===== + var currentType = currentObj.t; + if (currentType === 'h') { + var hName = currentObj.n || ''; + if (env.async && asyncRegExp.test(hName)) { + currentObj.a = true; + currentObj.n = hName.replace(asyncRegExp, ''); + } + currentObj = parseContext(currentObj); // currentObj is the parent object + buffer.push(currentObj); + } + else if (currentType === 'c') { + // tag close + if (parentObj.n === currentObj.n) { + if (lastBlock) { + // If there's a previous block + lastBlock.d = buffer; + parentObj.b.push(lastBlock); + } + else { + parentObj.d = buffer; + } + // console.log('parentObj: ' + JSON.stringify(parentObj)) + return parentObj; + } + else { + ParseErr("Helper start and end don't match", str, tagOpenMatch.index + tagOpenMatch[0].length); + } + } + else if (currentType === 'b') { + // block + // TODO: make sure async stuff inside blocks are recognized + if (lastBlock) { + // If there's a previous block + lastBlock.d = buffer; + parentObj.b.push(lastBlock); + } + else { + parentObj.d = buffer; + } + var blockName = currentObj.n || ''; + if (env.async && asyncRegExp.test(blockName)) { + currentObj.a = true; + currentObj.n = blockName.replace(asyncRegExp, ''); + } + lastBlock = currentObj; // Set the 'lastBlock' object to the value of the current block + buffer = []; + } + else if (currentType === 's') { + var selfClosingHName = currentObj.n || ''; + if (env.async && asyncRegExp.test(selfClosingHName)) { + currentObj.a = true; + currentObj.n = selfClosingHName.replace(asyncRegExp, ''); + } + buffer.push(currentObj); + } + else { + buffer.push(currentObj); + } + // ===== DONE ADDING OBJECT TO BUFFER ===== + } + if (firstParse) { + pushString(str.slice(startInd, str.length), false); + parentObj.d = buffer; + } + else { + throw SqrlErr('unclosed helper "' + parentObj.n + '"'); + // It should have returned by now + } + return parentObj; + } + var parseResult = parseContext({ f: [] }, true); + // console.log(JSON.stringify(parseResult)) + if (env.plugins) { + for (var i = 0; i < env.plugins.length; i++) { + var plugin = env.plugins[i]; + if (plugin.processAST) { + parseResult.d = plugin.processAST(parseResult.d, env); + } + } + } + return parseResult.d; // Parse the very outside context +} + +// import SqrlErr from './err' +/* END TYPES */ +function compileToString(str, env) { + var buffer = parse(str, env); + var res = "var tR='';" + + (env.useWith ? 'with(' + env.varName + '||{}){' : '') + + compileScope(buffer, env) + + 'if(cb){cb(null,tR)} return tR' + + (env.useWith ? '}' : ''); + if (env.plugins) { + for (var i = 0; i < env.plugins.length; i++) { + var plugin = env.plugins[i]; + if (plugin.processFnString) { + res = plugin.processFnString(res, env); + } + } + } + return res; + // TODO: is `return cb()` necessary, or could we just do `cb()` +} +function filter(str, filters) { + for (var i = 0; i < filters.length; i++) { + var name = filters[i][0]; + var params = filters[i][1]; + var isFilterAsync = filters[i][2]; + // if (isFilterAsync && !env.async) { + // throw SqrlErr("Async filter '" + name + "' in non-async env") + // } + // Let the JS compiler do this, compile() will catch it + str = (isFilterAsync ? 'await ' : '') + "c.l('F','" + name + "')(" + str; + if (params) { + str += ',' + params; + } + str += ')'; + } + return str; +} +// TODO: Use type intersections for TemplateObject, etc. +// so I don't have to make properties mandatory +function compileHelper(env, res, descendants, params, isAsync, name) { + var ret = '{exec:' + + (isAsync ? 'async ' : '') + + compileScopeIntoFunction(descendants, res, env) + + ',params:[' + + params + + ']'; + if (name) { + ret += ",name:'" + name + "'"; + } + if (isAsync) { + ret += ',async:true'; + } + ret += '}'; + return ret; +} +function compileBlocks(blocks, env) { + var ret = '['; + for (var i = 0; i < blocks.length; i++) { + var block = blocks[i]; + ret += compileHelper(env, block.res || '', block.d, block.p || '', block.a, block.n); + if (i < blocks.length) { + ret += ','; + } + } + ret += ']'; + return ret; +} +function compileScopeIntoFunction(buff, res, env) { + return 'function(' + res + "){var tR='';" + compileScope(buff, env) + 'return tR}'; +} +function compileScope(buff, env) { + var i = 0; + var buffLength = buff.length; + var returnStr = ''; + for (i; i < buffLength; i++) { + var currentBlock = buff[i]; + if (typeof currentBlock === 'string') { + var str = currentBlock; + // we know string exists + returnStr += "tR+='" + str + "';"; + } + else { + var type = currentBlock.t; // h, s, e, i + var content = currentBlock.c || ''; + var filters = currentBlock.f; + var name = currentBlock.n || ''; + var params = currentBlock.p || ''; + var res = currentBlock.res || ''; + var blocks = currentBlock.b; + var isAsync = !!currentBlock.a; // !! is to booleanize it + // if (isAsync && !env.async) { + // throw SqrlErr("Async block or helper '" + name + "' in non-async env") + // } + // Let compiler do this + if (type === 'i') { + if (env.defaultFilter) { + content = "c.l('F','" + env.defaultFilter + "')(" + content + ')'; + } + var filtered = filter(content, filters); + if (!currentBlock.raw && env.autoEscape) { + filtered = "c.l('F','e')(" + filtered + ')'; + } + returnStr += 'tR+=' + filtered + ';'; + // reference + } + else if (type === 'h') { + // helper + if (env.storage.nativeHelpers.get(name)) { + returnStr += env.storage.nativeHelpers.get(name)(currentBlock, env); + } + else { + var helperReturn = (isAsync ? 'await ' : '') + + "c.l('H','" + + name + + "')(" + + compileHelper(env, res, currentBlock.d, params, isAsync); + if (blocks) { + helperReturn += ',' + compileBlocks(blocks, env); + } + else { + helperReturn += ',[]'; + } + helperReturn += ',c)'; + returnStr += 'tR+=' + filter(helperReturn, filters) + ';'; + } + } + else if (type === 's') { + // self-closing helper + returnStr += + 'tR+=' + + filter((isAsync ? 'await ' : '') + "c.l('H','" + name + "')({params:[" + params + ']},[],c)', filters) + + ';'; + } + else if (type === 'e') { + // execute + returnStr += content + '\n'; + } + } + } + return returnStr; +} + +function errWithBlocksOrFilters(name, blocks, // false means don't check +filters, native) { + if (blocks && blocks.length > 0) { + throw SqrlErr((native ? 'Native' : '') + "Helper '" + name + "' doesn't accept blocks"); + } + if (filters && filters.length > 0) { + throw SqrlErr((native ? 'Native' : '') + "Helper '" + name + "' doesn't accept filters"); + } +} +/* ASYNC LOOP FNs */ +function asyncArrLoop(arr, index, fn, res, cb) { + fn(arr[index], index).then(function (val) { + res += val; + if (index === arr.length - 1) { + cb(res); + } + else { + asyncArrLoop(arr, index + 1, fn, res, cb); + } + }); +} +function asyncObjLoop(obj, keys, index, fn, res, cb) { + fn(keys[index], obj[keys[index]]).then(function (val) { + res += val; + if (index === keys.length - 1) { + cb(res); + } + else { + asyncObjLoop(obj, keys, index + 1, fn, res, cb); + } + }); +} +var escMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', +}; +function replaceChar(s) { + return escMap[s]; +} +function XMLEscape(str) { + // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized. + var newStr = String(str); + if (/[&<>"']/.test(newStr)) { + return newStr.replace(/[&<>"']/g, replaceChar); + } + else { + return newStr; + } +} + +/* END TYPES */ +var templates = new Cacher({}); +/* ASYNC LOOP FNs */ +var helpers = new Cacher({ + each: function (content, blocks) { + var res = ''; + var arr = content.params[0]; + errWithBlocksOrFilters('each', blocks, false); + if (content.async) { + return new Promise(function (resolve) { + asyncArrLoop(arr, 0, content.exec, res, resolve); + }); + } + else { + for (var i = 0; i < arr.length; i++) { + res += content.exec(arr[i], i); + } + return res; + } + }, + foreach: function (content, blocks) { + var obj = content.params[0]; + errWithBlocksOrFilters('foreach', blocks, false); + if (content.async) { + return new Promise(function (resolve) { + asyncObjLoop(obj, Object.keys(obj), 0, content.exec, '', resolve); + }); + } + else { + var res = ''; + for (var key in obj) { + if (!hasOwnProp(obj, key)) + continue; + res += content.exec(key, obj[key]); // todo: check on order + } + return res; + } + }, + include: function (content, blocks, config) { + errWithBlocksOrFilters('include', blocks, false); + var template = config.storage.templates.get(content.params[0]); + if (!template) { + throw SqrlErr('Could not fetch template "' + content.params[0] + '"'); + } + return template(content.params[1], config); + }, + extends: function (content, blocks, config) { + var data = content.params[1] || {}; + data.content = content.exec(); + for (var i = 0; i < blocks.length; i++) { + var currentBlock = blocks[i]; + data[currentBlock.name] = currentBlock.exec(); + } + var template = config.storage.templates.get(content.params[0]); + if (!template) { + throw SqrlErr('Could not fetch template "' + content.params[0] + '"'); + } + return template(data, config); + }, + useScope: function (content, blocks) { + errWithBlocksOrFilters('useScope', blocks, false); + return content.exec(content.params[0]); + } +}); +var nativeHelpers = new Cacher({ + if: function (buffer, env) { + errWithBlocksOrFilters('if', false, buffer.f, true); + var returnStr = 'if(' + buffer.p + '){' + compileScope(buffer.d, env) + '}'; + if (buffer.b) { + for (var i = 0; i < buffer.b.length; i++) { + var currentBlock = buffer.b[i]; + if (currentBlock.n === 'else') { + returnStr += 'else{' + compileScope(currentBlock.d, env) + '}'; + } + else if (currentBlock.n === 'elif') { + returnStr += 'else if(' + currentBlock.p + '){' + compileScope(currentBlock.d, env) + '}'; + } + } + } + return returnStr; + }, + try: function (buffer, env) { + errWithBlocksOrFilters('try', false, buffer.f, true); + if (!buffer.b || buffer.b.length !== 1 || buffer.b[0].n !== 'catch') { + throw SqrlErr("native helper 'try' only accepts 1 block, 'catch'"); + } + var returnStr = 'try{' + compileScope(buffer.d, env) + '}'; + var currentBlock = buffer.b[0]; + returnStr += + 'catch' + + (currentBlock.res ? '(' + currentBlock.res + ')' : '') + + '{' + + compileScope(currentBlock.d, env) + + '}'; + return returnStr; + }, + block: function (buffer, env) { + errWithBlocksOrFilters('block', buffer.b, buffer.f, true); + var returnStr = 'if(!' + + env.varName + + '[' + + buffer.p + + ']){tR+=(' + + compileScopeIntoFunction(buffer.d, '', env) + + ')()}else{tR+=' + + env.varName + + '[' + + buffer.p + + ']}'; + return returnStr; + } +}); +var filters = new Cacher({ e: XMLEscape }); + +/* END TYPES */ +var defaultConfig = { + varName: 'it', + autoTrim: [false, 'nl'], + autoEscape: true, + defaultFilter: false, + tags: ['{{', '}}'], + l: function (container, name) { + if (container === 'H') { + var hRet = this.storage.helpers.get(name); + if (hRet) { + return hRet; + } + else { + throw SqrlErr("Can't find helper '" + name + "'"); + } + } + else if (container === 'F') { + var fRet = this.storage.filters.get(name); + if (fRet) { + return fRet; + } + else { + throw SqrlErr("Can't find filter '" + name + "'"); + } + } + }, + async: false, + storage: { + helpers: helpers, + nativeHelpers: nativeHelpers, + filters: filters, + templates: templates + }, + prefixes: { + h: '@', + b: '#', + i: '', + r: '*', + c: '/', + e: '!' + }, + cache: false, + plugins: [], + useWith: false +}; +defaultConfig.l.bind(defaultConfig); +function getConfig(override, baseConfig) { + // TODO: run more tests on this + var res = {}; // Linked + copyProps(res, defaultConfig); // Creates deep clone of res, 1 layer deep + if (baseConfig) { + copyProps(res, baseConfig); + } + if (override) { + copyProps(res, override); + } + res.l.bind(res); + return res; +} + +/* END TYPES */ +function compile(str, env) { + var options = getConfig(env || {}); + var ctor = Function; // constructor + /* ASYNC HANDLING */ + // The below code is modified from mde/ejs. All credit should go to them. + if (options.async) { + // Have to use generated function for this, since in envs without support, + // it breaks in parsing + if (asyncFunc) { + ctor = asyncFunc; + } + else { + throw SqrlErr("This environment doesn't support async/await"); + } + } + /* END ASYNC HANDLING */ + try { + return new ctor(options.varName, 'c', // SqrlConfig + 'cb', // optional callback + compileToString(str, options)); // eslint-disable-line no-new-func + } + catch (e) { + if (e instanceof SyntaxError) { + throw SqrlErr('Bad template syntax\n\n' + + e.message + + '\n' + + Array(e.message.length + 1).join('=') + + '\n' + + compileToString(str, options)); + } + else { + throw e; + } + } +} + +var fs = require('fs'); +var path = require('path'); +var _BOM = /^\uFEFF/; +/* END TYPES */ +/** + * Get the path to the included file from the parent file path and the + * specified path. + * + * @param {String} name specified path + * @param {String} parentfile parent file path + * @param {Boolean} [isDir=false] whether parent file path is a directory + * @return {String} + */ +function getWholeFilePath(name, parentfile, isDirectory) { + var includePath = path.resolve(isDirectory ? parentfile : path.dirname(parentfile), // returns directory the parent file is in + name // file + ); + var ext = path.extname(name); + if (!ext) { + includePath += '.sqrl'; + } + return includePath; +} +/** + * Get the path to the included file by Options + * + * @param {String} path specified path + * @param {Options} options compilation options + * @return {String} + */ +function getPath(path, options) { + var includePath; + var filePath; + var views = options.views; + var match = /^[A-Za-z]+:\\|^\//.exec(path); + // Abs path + if (match && match.length) { + includePath = getWholeFilePath(path.replace(/^\/*/, ''), options.root || '/', true); + } + else { + // Relative paths + // Look relative to a passed filename first + if (options.filename) { + filePath = getWholeFilePath(path, options.filename); + if (fs.existsSync(filePath)) { + includePath = filePath; + } + } + // Then look in any views directories + if (!includePath) { + if (Array.isArray(views) && + views.some(function (v) { + filePath = getWholeFilePath(path, v, true); + return fs.existsSync(filePath); + })) { + includePath = filePath; + } + } + if (!includePath) { + throw SqrlErr('Could not find the include file "' + path + '"'); + } + } + return includePath; +} +function readFile(filePath) { + return fs + .readFileSync(filePath) + .toString() + .replace(_BOM, ''); // TODO: is replacing BOM's necessary? +} +function loadFile(filePath, options) { + var config = getConfig(options); + var template = readFile(filePath); + try { + var compiledTemplate = compile(template, config); + config.storage.templates.define(config.filename, compiledTemplate); + return compiledTemplate; + } + catch (e) { + throw SqrlErr('Loading file: ' + filePath + ' failed'); + } +} + +// express is set like: app.engine('html', require('squirrelly').renderFile) +/* END TYPES */ +/** + * Get the template from a string or a file, either compiled on-the-fly or + * read from cache (if enabled), and cache the template if needed. + * + * If `options.cache` is true, this function reads the file from + * `options.filename` so it must be set prior to calling this function. + * + * @param {Options} options compilation options + * @param {String} [template] template source + * @return {(TemplateFunction|ClientFunction)} + * Depending on the value of `options.client`, either type might be returned. + * @static + */ +function handleCache(options) { + var filename = options.filename; + if (options.cache) { + var func = options.storage.templates.get(filename); + if (func) { + return func; + } + else { + return loadFile(filename, options); + } + } + return compile(readFile(filename), options); +} +/** + * Try calling handleCache with the given options and data and call the + * callback with the result. If an error occurs, call the callback with + * the error. Used by renderFile(). + * + * @param {Options} options compilation options + * @param {Object} data template data + * @param {RenderFileCallback} cb callback + * @static + */ +function tryHandleCache(options, data, cb) { + var result; + if (!cb) { + // No callback, try returning a promise + if (typeof promiseImpl === 'function') { + return new promiseImpl(function (resolve, reject) { + try { + result = handleCache(options)(data, options); + resolve(result); + } + catch (err) { + reject(err); + } + }); + } + else { + throw SqrlErr("Please provide a callback function, this env doesn't support Promises"); + } + } + else { + try { + handleCache(options)(data, options, cb); + } + catch (err) { + return cb(err); + } + } +} +/** + * Get the template function. + * + * If `options.cache` is `true`, then the template is cached. + * + * @param {String} path path for the specified file + * @param {Options} options compilation options + * @return {(TemplateFunction|ClientFunction)} + * Depending on the value of `options.client`, either type might be returned + * @static + */ +function includeFile(path, options) { + // the below creates a new options object, using the parent filepath of the old options object and the path + var newFileOptions = getConfig({ filename: getPath(path, options) }, options); + // TODO: make sure properties are currectly copied over + return handleCache(newFileOptions); +} +function renderFile(filename, data, cb) { + data = data || {}; + var Config = getConfig(data); + // TODO: make sure above doesn't error. We do set filename down below + if (data.settings) { + // Pull a few things from known locations + if (data.settings.views) { + Config.views = data.settings.views; + } + if (data.settings['view cache']) { + Config.cache = true; + } + // Undocumented after Express 2, but still usable, esp. for + // items that are unsafe to be passed along with data, like `root` + var viewOpts = data.settings['view options']; + if (viewOpts) { + copyProps(Config, viewOpts); + } + } + Config.filename = filename; // Make sure filename is right + return tryHandleCache(Config, data, cb); +} + +/* END TYPES */ +function includeFileHelper(content, blocks, config) { + if (blocks && blocks.length > 0) { + throw SqrlErr("Helper 'includeFile' doesn't accept blocks"); + } + return includeFile(content.params[0], config)(content.params[1], config); +} +function extendsFileHelper(content, blocks, config) { + var data = content.params[1] || {}; + data.content = content.exec(); + for (var i = 0; i < blocks.length; i++) { + var currentBlock = blocks[i]; + data[currentBlock.name] = currentBlock.exec(); + } + return includeFile(content.params[0], config)(data, config); +} + +/* END TYPES */ +function handleCache$1(template, options) { + var templateFunc; + if (options.cache && options.name && options.storage.templates.get(options.name)) { + return options.storage.templates.get(options.name); + } + if (typeof template === 'function') { + templateFunc = template; + } + else { + templateFunc = compile(template, options); + } + if (options.cache && options.name) { + options.storage.templates.define(options.name, templateFunc); + } + return templateFunc; +} +function render(template, data, env, cb) { + var options = getConfig(env || {}); + if (options.async) { + var result; + if (!cb) { + // No callback, try returning a promise + if (typeof promiseImpl === 'function') { + return new promiseImpl(function (resolve, reject) { + try { + result = handleCache$1(template, options)(data, options); + resolve(result); + } + catch (err) { + reject(err); + } + }); + } + else { + throw SqrlErr("Please provide a callback function, this env doesn't support Promises"); + } + } + else { + try { + handleCache$1(template, options)(data, options, cb); + } + catch (err) { + return cb(err); + } + } + } + else { + return handleCache$1(template, options)(data, options); + } +} + +/* Export file stuff */ +/* END TYPES */ +helpers.define('includeFile', includeFileHelper); +helpers.define('extendsFile', extendsFileHelper); + +exports.__express = renderFile; +exports.compile = compile; +exports.compileScope = compileScope; +exports.compileScopeIntoFunction = compileScopeIntoFunction; +exports.compileToString = compileToString; +exports.defaultConfig = defaultConfig; +exports.filters = filters; +exports.getConfig = getConfig; +exports.helpers = helpers; +exports.loadFile = loadFile; +exports.nativeHelpers = nativeHelpers; +exports.parse = parse; +exports.render = render; +exports.renderFile = renderFile; +exports.templates = templates; +//# sourceMappingURL=squirrelly.cjs.js.map diff --git a/src/node_modules/squirrelly/dist/squirrelly.cjs.js.map b/src/node_modules/squirrelly/dist/squirrelly.cjs.js.map new file mode 100644 index 0000000..ce60bc7 --- /dev/null +++ b/src/node_modules/squirrelly/dist/squirrelly.cjs.js.map @@ -0,0 +1 @@ +{"version":3,"file":"squirrelly.cjs.js","sources":["../src/utils.ts","../src/storage.ts","../src/err.ts","../src/parse.ts","../src/compile-string.ts","../src/container-utils.ts","../src/containers.ts","../src/config.ts","../src/compile.ts","../src/file-utils.ts","../src/file-handlers.ts","../src/file-helpers.ts","../src/render.ts","../src/index.ts"],"sourcesContent":["// TODO: allow '-' to trim up until newline. Use [^\\S\\n\\r] instead of \\s\n// TODO: only include trimLeft polyfill if not in ES6\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\n\n/* END TYPES */\n\nexport var promiseImpl = new Function('return this')().Promise\n\nvar asyncFunc: FunctionConstructor | false = false\n\ntry {\n asyncFunc = new Function('return (async function(){}).constructor')()\n} catch (e) {\n // We shouldn't actually ever have any other errors, but...\n if (!(e instanceof SyntaxError)) {\n throw e\n }\n}\n\nexport { asyncFunc }\n\nexport function hasOwnProp (obj: object, prop: string) {\n return Object.prototype.hasOwnProperty.call(obj, prop)\n}\n\nexport function copyProps (toObj: T, fromObj: T, notConfig?: boolean) {\n for (var key in fromObj) {\n if (hasOwnProp((fromObj as unknown) as object, key)) {\n if (\n fromObj[key] != null &&\n typeof fromObj[key] == 'object' &&\n (key === 'storage' || key === 'prefixes') &&\n !notConfig // not called from Cache.load\n ) {\n // plugins or storage\n // Note: this doesn't merge from initial config!\n // Deep clone instead of assigning\n // TODO: run checks on this\n toObj[key] = copyProps(/*toObj[key] ||*/ {} as T[Extract], fromObj[key])\n } else {\n toObj[key] = fromObj[key]\n }\n }\n }\n return toObj\n}\n\nfunction trimWS (\n str: string,\n env: SqrlConfig,\n wsLeft: string | false,\n wsRight?: string | false\n): string {\n var leftTrim\n var rightTrim\n\n if (typeof env.autoTrim === 'string') {\n leftTrim = rightTrim = env.autoTrim\n // Don't need to check if env.autoTrim is false\n // Because leftTrim, rightTrim are initialized as falsy\n } else if (Array.isArray(env.autoTrim)) {\n // kinda confusing\n // but _}} will trim the left side of the following string\n leftTrim = env.autoTrim[1]\n rightTrim = env.autoTrim[0]\n }\n\n if (wsLeft || wsLeft === false) {\n leftTrim = wsLeft\n }\n\n if (wsRight || wsRight === false) {\n rightTrim = wsRight\n }\n\n if (leftTrim === 'slurp' && rightTrim === 'slurp') {\n return str.trim()\n }\n\n if (leftTrim === '_' || leftTrim === 'slurp') {\n // console.log('trimming left' + leftTrim)\n // full slurp\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!String.prototype.trimLeft) {\n str = str.trimLeft()\n } else {\n str = str.replace(/^[\\s\\uFEFF\\xA0]+/, '')\n }\n } else if (leftTrim === '-' || leftTrim === 'nl') {\n // console.log('trimming left nl' + leftTrim)\n // nl trim\n str = str.replace(/^(?:\\n|\\r|\\r\\n)/, '')\n }\n\n if (rightTrim === '_' || rightTrim === 'slurp') {\n // console.log('trimming right' + rightTrim)\n // full slurp\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!String.prototype.trimRight) {\n str = str.trimRight()\n } else {\n str = str.replace(/[\\s\\uFEFF\\xA0]+$/, '')\n }\n } else if (rightTrim === '-' || rightTrim === 'nl') {\n // console.log('trimming right nl' + rightTrim)\n // nl trim\n str = str.replace(/(?:\\n|\\r|\\r\\n)$/, '') // TODO: make sure this gets \\r\\n\n }\n\n return str\n}\n\nexport { trimWS }\n","import { copyProps } from './utils'\n\n/* TYPES */\n\ninterface Dict {\n // Basically, an object where all keys point to a value of the same type\n [key: string]: T\n}\n\n/* END TYPES */\n\nclass Cacher {\n constructor (private cache: Dict) {}\n define (key: string, val: T) {\n this.cache[key] = val\n }\n get (key: string) {\n // string | array.\n // TODO: allow array of keys to look down\n // TODO: create plugin to allow referencing helpers, filters with dot notation\n return this.cache[key]\n }\n remove (key: string) {\n delete this.cache[key]\n }\n reset () {\n this.cache = {}\n }\n load (cacheObj: Dict) {\n // TODO: this will err with deep objects and `storage` or `plugins` keys.\n // Update Feb 26: EDITED so it shouldn't err\n copyProps(this.cache, cacheObj, true)\n }\n}\n\nexport { Cacher }\n","function setPrototypeOf (obj: any, proto: any) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(obj, proto)\n } else {\n obj.__proto__ = proto\n }\n}\n\nexport default function SqrlErr (message: string): Error {\n var err = new Error(message)\n setPrototypeOf(err, SqrlErr.prototype)\n return err\n}\n\nSqrlErr.prototype = Object.create(Error.prototype, {\n name: { value: 'Squirrelly Error', enumerable: false }\n})\n\n// TODO: Class transpilation adds a lot to the bundle size\n\nexport function ParseErr (message: string, str: string, indx: number) {\n var whitespace = str.slice(0, indx).split(/\\n/)\n\n var lineNo = whitespace.length\n var colNo = whitespace[lineNo - 1].length + 1\n message +=\n ' at line ' +\n lineNo +\n ' col ' +\n colNo +\n ':\\n\\n' +\n ' ' +\n str.split(/\\n/)[lineNo - 1] +\n '\\n' +\n ' ' +\n Array(colNo).join(' ') +\n '^'\n throw SqrlErr(message)\n}\n","import SqrlErr, { ParseErr } from './err'\nimport { trimWS } from './utils'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\n\nexport type TagType = 'h' | 'b' | 'i' | 'r' | 'c' | 'e' | 'q' | 's'\n// TODO: change to anagram \"QBIRCHES\"\nexport type TemplateAttribute = 'c' | 'f' | 'fp' | 'p' | 'n' | 'res' | 'err'\nexport type TemplateObjectAttribute = 'c' | 'p' | 'n' | 'res'\n\nexport type AstObject = string | TemplateObject\n\nexport type Filter = [string, string] | [string, string, true]\n// [name, params, async]\nexport interface TemplateObject {\n n?: string\n t?: 'h' | 'b' | 'i' | 'c' | 'q' | 'e' | 's'\n f: Array\n c?: string\n p?: string\n res?: string\n d?: Array\n raw?: boolean\n a?: boolean // async\n b?: Array\n}\n\nexport interface ParentTemplateObject extends TemplateObject {\n d: Array\n b: Array\n}\n\n/* END TYPES */\n\nvar asyncRegExp = /^async +/\n\nvar templateLitReg = /`(?:\\\\[\\s\\S]|\\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\\${)[^\\\\`])*`/g\n\nvar singleQuoteReg = /'(?:\\\\[\\s\\w\"'\\\\`]|[^\\n\\r'\\\\])*?'/g\n\nvar doubleQuoteReg = /\"(?:\\\\[\\s\\w\"'\\\\`]|[^\\n\\r\"\\\\])*?\"/g\n\nvar specialCharsReg = /[.*+\\-?^${}()|[\\]\\\\]/g\n\nfunction escapeRegExp (string: string) {\n // From MDN\n return specialCharsReg.test(string)\n ? string.replace(specialCharsReg, '\\\\$&') // $& means the whole matched string\n : string\n}\n\nexport default function parse (str: string, env: SqrlConfig): Array {\n /* Adding for EJS compatibility */\n if (env.rmWhitespace) {\n // Code taken directly from EJS\n // Have to use two separate replaces here as `^` and `$` operators don't\n // work well with `\\r` and empty lines don't work well with the `m` flag.\n // Essentially, this replaces the whitespace at the beginning and end of\n // each line and removes multiple newlines.\n str = str.replace(/[\\r\\n]+/g, '\\n').replace(/^\\s+|\\s+$/gm, '')\n }\n /* End rmWhitespace option */\n\n templateLitReg.lastIndex = 0\n singleQuoteReg.lastIndex = 0\n doubleQuoteReg.lastIndex = 0\n\n var envPrefixes = env.prefixes\n\n var prefixes = [\n envPrefixes.h,\n envPrefixes.b,\n envPrefixes.i,\n envPrefixes.r,\n envPrefixes.c,\n envPrefixes.e\n ].reduce(function (accumulator, prefix) {\n if (accumulator && prefix) {\n return accumulator + '|' + escapeRegExp(prefix)\n } else if (prefix) {\n // accumulator is empty\n return escapeRegExp(prefix)\n } else {\n // prefix and accumulator are both empty strings\n return accumulator\n }\n }, '')\n\n var parseCloseReg = new RegExp(\n '([|()]|=>)|' + // powerchars\n '(\\'|\"|`|\\\\/\\\\*)|\\\\s*((\\\\/)?(-|_)?' + // comments, strings\n escapeRegExp(env.tags[1]) +\n ')',\n 'g'\n )\n\n var tagOpenReg = new RegExp(\n '([^]*?)' + escapeRegExp(env.tags[0]) + '(-|_)?\\\\s*(' + prefixes + ')?\\\\s*',\n 'g'\n )\n\n var startInd = 0\n var trimNextLeftWs: string | false = false\n\n function parseTag (tagOpenIndex: number, currentType: TagType): TemplateObject {\n var currentObj: TemplateObject = { f: [] }\n var numParens = 0\n var currentAttribute: TemplateAttribute = 'c' // default - Valid values: 'c'=content, 'f'=filter, 'fp'=filter params, 'p'=param, 'n'=name\n\n if (currentType === 'h' || currentType === 'b' || currentType === 'c') {\n currentAttribute = 'n'\n } else if (currentType === 'r') {\n currentObj.raw = true\n currentType = 'i'\n }\n\n function addAttrValue (indx: number) {\n var valUnprocessed = str.slice(startInd, indx)\n // console.log(valUnprocessed)\n var val = valUnprocessed.trim()\n if (currentAttribute === 'f') {\n if (val === 'safe') {\n currentObj.raw = true\n } else {\n if (env.async && asyncRegExp.test(val)) {\n val = val.replace(asyncRegExp, '')\n currentObj.f.push([val, '', true])\n } else {\n currentObj.f.push([val, ''])\n }\n }\n } else if (currentAttribute === 'fp') {\n currentObj.f[currentObj.f.length - 1][1] += val\n } else if (currentAttribute === 'err') {\n if (val) {\n var found = valUnprocessed.search(/\\S/)\n ParseErr('invalid syntax', str, startInd + found)\n }\n } else {\n // if (currentObj[currentAttribute]) { // TODO make sure no errs\n // currentObj[currentAttribute] += val\n // } else {\n currentObj[currentAttribute] = val\n // }\n }\n startInd = indx + 1\n }\n\n parseCloseReg.lastIndex = startInd\n\n var m\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = parseCloseReg.exec(str)) !== null) {\n var char = m[1]\n var punctuator = m[2]\n var tagClose = m[3]\n var slash = m[4]\n var wsControl = m[5]\n var i = m.index\n\n if (char) {\n // Power character\n if (char === '(') {\n if (numParens === 0) {\n if (currentAttribute === 'n') {\n addAttrValue(i)\n currentAttribute = 'p'\n } else if (currentAttribute === 'f') {\n addAttrValue(i)\n currentAttribute = 'fp'\n }\n }\n numParens++\n } else if (char === ')') {\n numParens--\n if (numParens === 0 && currentAttribute !== 'c') {\n // Then it's closing a filter, block, or helper\n addAttrValue(i)\n\n currentAttribute = 'err' // Reset the current attribute\n }\n } else if (numParens === 0 && char === '|') {\n addAttrValue(i) // this should actually always be whitespace or empty\n currentAttribute = 'f'\n } else if (char === '=>') {\n addAttrValue(i)\n startInd += 1 // this is 2 chars\n currentAttribute = 'res'\n }\n } else if (punctuator) {\n if (punctuator === '/*') {\n var commentCloseInd = str.indexOf('*/', parseCloseReg.lastIndex)\n if (commentCloseInd === -1) {\n ParseErr('unclosed comment', str, m.index)\n }\n parseCloseReg.lastIndex = commentCloseInd + 2 // since */ is 2 characters, and we're using indexOf rather than a RegExp\n } else if (punctuator === \"'\") {\n singleQuoteReg.lastIndex = m.index\n\n var singleQuoteMatch = singleQuoteReg.exec(str)\n if (singleQuoteMatch) {\n parseCloseReg.lastIndex = singleQuoteReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n } else if (punctuator === '\"') {\n doubleQuoteReg.lastIndex = m.index\n var doubleQuoteMatch = doubleQuoteReg.exec(str)\n\n if (doubleQuoteMatch) {\n parseCloseReg.lastIndex = doubleQuoteReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n } else if (punctuator === '`') {\n templateLitReg.lastIndex = m.index\n var templateLitMatch = templateLitReg.exec(str)\n if (templateLitMatch) {\n parseCloseReg.lastIndex = templateLitReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n }\n } else if (tagClose) {\n addAttrValue(i)\n startInd = i + m[0].length\n tagOpenReg.lastIndex = startInd\n // console.log('tagClose: ' + startInd)\n trimNextLeftWs = wsControl\n if (slash && currentType === 'h') {\n currentType = 's'\n } // TODO throw err\n currentObj.t = currentType\n return currentObj\n }\n }\n ParseErr('unclosed tag', str, tagOpenIndex)\n return currentObj // To prevent TypeScript from erroring\n }\n\n function parseContext (parentObj: TemplateObject, firstParse?: boolean): ParentTemplateObject {\n parentObj.b = [] // assume there will be blocks // TODO: perf optimize this\n parentObj.d = []\n var lastBlock: ParentTemplateObject | false = false\n var buffer: Array = []\n\n function pushString (strng: string, shouldTrimRightOfString?: string | false) {\n if (strng) {\n // if string is truthy it must be of type 'string'\n\n // TODO: benchmark replace( /(\\\\|')/g, '\\\\$1')\n strng = trimWS(\n strng,\n env,\n trimNextLeftWs, // this will only be false on the first str, the next ones will be null or undefined\n shouldTrimRightOfString\n )\n\n if (strng) {\n // replace \\ with \\\\, ' with \\'\n\n strng = strng.replace(/\\\\|'/g, '\\\\$&').replace(/\\r\\n|\\n|\\r/g, '\\\\n')\n // we're going to convert all CRLF to LF so it doesn't take more than one replace\n\n buffer.push(strng)\n }\n }\n }\n\n // Random TODO: parentObj.b doesn't need to have t: #\n var tagOpenMatch\n // tslint:disable-next-line:no-conditional-assignment\n while ((tagOpenMatch = tagOpenReg.exec(str)) !== null) {\n var precedingString = tagOpenMatch[1]\n var shouldTrimRightPrecedingString = tagOpenMatch[2]\n var prefix = tagOpenMatch[3] || ''\n var prefixType: TagType | undefined\n\n for (var key in envPrefixes) {\n if (envPrefixes[key] === prefix) {\n prefixType = key as TagType\n break\n }\n }\n\n pushString(precedingString, shouldTrimRightPrecedingString)\n startInd = tagOpenMatch.index + tagOpenMatch[0].length\n\n if (!prefixType) {\n ParseErr('unrecognized tag type: ' + prefix, str, startInd)\n }\n\n var currentObj = parseTag(tagOpenMatch.index, prefixType as TagType)\n // ===== NOW ADD THE OBJECT TO OUR BUFFER =====\n\n var currentType = currentObj.t\n if (currentType === 'h') {\n var hName = currentObj.n || ''\n if (env.async && asyncRegExp.test(hName)) {\n currentObj.a = true\n currentObj.n = hName.replace(asyncRegExp, '')\n }\n currentObj = parseContext(currentObj) // currentObj is the parent object\n buffer.push(currentObj)\n } else if (currentType === 'c') {\n // tag close\n if (parentObj.n === currentObj.n) {\n if (lastBlock) {\n // If there's a previous block\n lastBlock.d = buffer\n parentObj.b.push(lastBlock)\n } else {\n parentObj.d = buffer\n }\n // console.log('parentObj: ' + JSON.stringify(parentObj))\n return parentObj as ParentTemplateObject\n } else {\n ParseErr(\n \"Helper start and end don't match\",\n str,\n tagOpenMatch.index + tagOpenMatch[0].length\n )\n }\n } else if (currentType === 'b') {\n // block\n // TODO: make sure async stuff inside blocks are recognized\n if (lastBlock) {\n // If there's a previous block\n lastBlock.d = buffer\n parentObj.b.push(lastBlock)\n } else {\n parentObj.d = buffer\n }\n\n var blockName = currentObj.n || ''\n if (env.async && asyncRegExp.test(blockName)) {\n currentObj.a = true\n currentObj.n = blockName.replace(asyncRegExp, '')\n }\n\n lastBlock = currentObj as ParentTemplateObject // Set the 'lastBlock' object to the value of the current block\n\n buffer = []\n } else if (currentType === 's') {\n var selfClosingHName = currentObj.n || ''\n if (env.async && asyncRegExp.test(selfClosingHName)) {\n currentObj.a = true\n currentObj.n = selfClosingHName.replace(asyncRegExp, '')\n }\n buffer.push(currentObj)\n } else {\n buffer.push(currentObj)\n }\n // ===== DONE ADDING OBJECT TO BUFFER =====\n }\n\n if (firstParse) {\n pushString(str.slice(startInd, str.length), false)\n parentObj.d = buffer\n } else {\n throw SqrlErr('unclosed helper \"' + parentObj.n + '\"')\n // It should have returned by now\n }\n\n return parentObj as ParentTemplateObject\n }\n\n var parseResult = parseContext({ f: [] }, true)\n // console.log(JSON.stringify(parseResult))\n if (env.plugins) {\n for (var i = 0; i < env.plugins.length; i++) {\n var plugin = env.plugins[i]\n if (plugin.processAST) {\n parseResult.d = plugin.processAST(parseResult.d, env)\n }\n }\n }\n return parseResult.d // Parse the very outside context\n}\n","import Parse from './parse'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { AstObject, Filter, ParentTemplateObject } from './parse'\ntype ParsedTagType = 'h' | 's' | 'e' | 'i'\n// import SqrlErr from './err'\n\n/* END TYPES */\n\nexport default function compileToString (str: string, env: SqrlConfig) {\n var buffer: Array = Parse(str, env)\n\n var res =\n \"var tR='';\" +\n (env.useWith ? 'with(' + env.varName + '||{}){' : '') +\n compileScope(buffer, env) +\n 'if(cb){cb(null,tR)} return tR' +\n (env.useWith ? '}' : '')\n\n if (env.plugins) {\n for (var i = 0; i < env.plugins.length; i++) {\n var plugin = env.plugins[i]\n if (plugin.processFnString) {\n res = plugin.processFnString(res, env)\n }\n }\n }\n\n return res\n\n // TODO: is `return cb()` necessary, or could we just do `cb()`\n}\n\nfunction filter (str: string, filters: Array) {\n for (var i = 0; i < filters.length; i++) {\n var name = filters[i][0]\n var params = filters[i][1]\n var isFilterAsync = filters[i][2]\n\n // if (isFilterAsync && !env.async) {\n // throw SqrlErr(\"Async filter '\" + name + \"' in non-async env\")\n // }\n // Let the JS compiler do this, compile() will catch it\n\n str = (isFilterAsync ? 'await ' : '') + \"c.l('F','\" + name + \"')(\" + str\n if (params) {\n str += ',' + params\n }\n str += ')'\n }\n return str\n}\n\n// TODO: Use type intersections for TemplateObject, etc.\n// so I don't have to make properties mandatory\n\nfunction compileHelper (\n env: SqrlConfig,\n res: string,\n descendants: Array,\n params: string,\n isAsync?: boolean,\n name?: string\n) {\n var ret =\n '{exec:' +\n (isAsync ? 'async ' : '') +\n compileScopeIntoFunction(descendants, res, env) +\n ',params:[' +\n params +\n ']'\n if (name) {\n ret += \",name:'\" + name + \"'\"\n }\n if (isAsync) {\n ret += ',async:true'\n }\n ret += '}'\n return ret\n}\n\nfunction compileBlocks (blocks: Array, env: SqrlConfig) {\n var ret = '['\n for (var i = 0; i < blocks.length; i++) {\n var block = blocks[i]\n ret += compileHelper(env, block.res || '', block.d, block.p || '', block.a, block.n)\n if (i < blocks.length) {\n ret += ','\n }\n }\n ret += ']'\n return ret\n}\n\nexport function compileScopeIntoFunction (buff: Array, res: string, env: SqrlConfig) {\n return 'function(' + res + \"){var tR='';\" + compileScope(buff, env) + 'return tR}'\n}\n\nexport function compileScope (buff: Array, env: SqrlConfig) {\n var i = 0\n var buffLength = buff.length\n var returnStr = ''\n\n for (i; i < buffLength; i++) {\n var currentBlock = buff[i]\n if (typeof currentBlock === 'string') {\n var str = currentBlock\n\n // we know string exists\n returnStr += \"tR+='\" + str + \"';\"\n } else {\n var type: ParsedTagType = currentBlock.t as ParsedTagType // h, s, e, i\n var content = currentBlock.c || ''\n var filters = currentBlock.f\n var name = currentBlock.n || ''\n var params = currentBlock.p || ''\n var res = currentBlock.res || ''\n var blocks = currentBlock.b\n var isAsync = !!currentBlock.a // !! is to booleanize it\n // if (isAsync && !env.async) {\n // throw SqrlErr(\"Async block or helper '\" + name + \"' in non-async env\")\n // }\n // Let compiler do this\n if (type === 'i') {\n if (env.defaultFilter) {\n content = \"c.l('F','\" + env.defaultFilter + \"')(\" + content + ')'\n }\n var filtered = filter(content, filters)\n if (!currentBlock.raw && env.autoEscape) {\n filtered = \"c.l('F','e')(\" + filtered + ')'\n }\n returnStr += 'tR+=' + filtered + ';'\n // reference\n } else if (type === 'h') {\n // helper\n if (env.storage.nativeHelpers.get(name)) {\n returnStr += env.storage.nativeHelpers.get(name)(currentBlock, env)\n } else {\n var helperReturn =\n (isAsync ? 'await ' : '') +\n \"c.l('H','\" +\n name +\n \"')(\" +\n compileHelper(env, res, (currentBlock as ParentTemplateObject).d, params, isAsync)\n if (blocks) {\n helperReturn += ',' + compileBlocks(blocks, env)\n } else {\n helperReturn += ',[]'\n }\n helperReturn += ',c)'\n\n returnStr += 'tR+=' + filter(helperReturn, filters) + ';'\n }\n } else if (type === 's') {\n // self-closing helper\n\n returnStr +=\n 'tR+=' +\n filter(\n (isAsync ? 'await ' : '') + \"c.l('H','\" + name + \"')({params:[\" + params + ']},[],c)',\n filters\n ) +\n ';'\n } else if (type === 'e') {\n // execute\n returnStr += content + '\\n'\n }\n }\n }\n\n return returnStr\n}\n","import SqrlErr from './err'\n\nexport function errWithBlocksOrFilters(\n name: string,\n blocks: Array | false, // false means don't check\n filters: Array | false,\n native?: boolean\n) {\n if (blocks && blocks.length > 0) {\n throw SqrlErr((native ? 'Native' : '') + \"Helper '\" + name + \"' doesn't accept blocks\")\n }\n if (filters && filters.length > 0) {\n throw SqrlErr((native ? 'Native' : '') + \"Helper '\" + name + \"' doesn't accept filters\")\n }\n}\n\n/* ASYNC LOOP FNs */\nexport function asyncArrLoop(\n arr: Array,\n index: number,\n fn: Function,\n res: string,\n cb: Function\n) {\n fn(arr[index], index).then(function (val: string) {\n res += val\n if (index === arr.length - 1) {\n cb(res)\n } else {\n asyncArrLoop(arr, index + 1, fn, res, cb)\n }\n })\n}\n\nexport function asyncObjLoop(\n obj: { [index: string]: any },\n keys: Array,\n index: number,\n fn: Function,\n res: string,\n cb: Function\n) {\n fn(keys[index], obj[keys[index]]).then(function (val: string) {\n res += val\n if (index === keys.length - 1) {\n cb(res)\n } else {\n asyncObjLoop(obj, keys, index + 1, fn, res, cb)\n }\n })\n}\n\nvar escMap: EscapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nexport function replaceChar(s: string): string {\n return escMap[s]\n}\n\nexport function XMLEscape(str: unknown) {\n // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized.\n var newStr = String(str)\n if (/[&<>\"']/.test(newStr)) {\n return newStr.replace(/[&<>\"']/g, replaceChar)\n } else {\n return newStr\n }\n}\n\n/* INTERFACES */\ninterface EscapeMap {\n '&': '&'\n '<': '<'\n '>': '>'\n '\"': '"'\n \"'\": '''\n [index: string]: string\n}\n","import { Cacher } from './storage'\nimport SqrlErr from './err'\nimport { compileScope, compileScopeIntoFunction } from './compile-string'\nimport { hasOwnProp } from './utils'\nimport { errWithBlocksOrFilters, asyncArrLoop, asyncObjLoop, XMLEscape } from './container-utils'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { TemplateFunction } from './compile'\nimport { ParentTemplateObject } from './parse'\n\nexport interface HelperContent {\n exec: Function\n params: Array\n async?: boolean\n}\n\nexport interface HelperBlock extends HelperContent {\n name: string\n}\n\nexport type HelperFunction = (\n content: HelperContent,\n blocks: Array,\n config: SqrlConfig\n) => string | Promise\n\nexport type FilterFunction = (...args: any[]) => any | Promise\n\ninterface IncludeHelperContent extends HelperContent {\n params: [string, object]\n}\n\ninterface GenericData {\n [index: string]: any\n}\n\n/* END TYPES */\n\nvar templates = new Cacher({})\n\n/* ASYNC LOOP FNs */\n\nvar helpers = new Cacher({\n each: function (content: HelperContent, blocks: Array) {\n var res = ''\n var arr = content.params[0]\n errWithBlocksOrFilters('each', blocks, false)\n\n if (content.async) {\n return new Promise(function (resolve) {\n asyncArrLoop(arr, 0, content.exec, res, resolve)\n })\n } else {\n for (var i = 0; i < arr.length; i++) {\n res += content.exec(arr[i], i)\n }\n return res\n }\n },\n foreach: function (content: HelperContent, blocks: Array) {\n var obj = content.params[0]\n errWithBlocksOrFilters('foreach', blocks, false)\n\n if (content.async) {\n return new Promise(function (resolve) {\n asyncObjLoop(obj, Object.keys(obj), 0, content.exec, '', resolve)\n })\n } else {\n var res = ''\n\n for (var key in obj) {\n if (!hasOwnProp(obj, key)) continue\n res += content.exec(key, obj[key]) // todo: check on order\n }\n return res\n }\n },\n include: function (\n content: IncludeHelperContent,\n blocks: Array,\n config: SqrlConfig\n ): string {\n errWithBlocksOrFilters('include', blocks, false)\n var template = config.storage.templates.get(content.params[0])\n if (!template) {\n throw SqrlErr('Could not fetch template \"' + content.params[0] + '\"')\n }\n return template(content.params[1], config)\n } as HelperFunction,\n extends: function (\n content: IncludeHelperContent,\n blocks: Array,\n config: SqrlConfig\n ): string {\n var data: GenericData = content.params[1] || {}\n data.content = content.exec()\n\n for (var i = 0; i < blocks.length; i++) {\n var currentBlock = blocks[i]\n data[currentBlock.name] = currentBlock.exec()\n }\n\n var template = config.storage.templates.get(content.params[0])\n if (!template) {\n throw SqrlErr('Could not fetch template \"' + content.params[0] + '\"')\n }\n return template(data, config)\n } as HelperFunction,\n useScope: function (content: HelperContent, blocks: Array): string {\n errWithBlocksOrFilters('useScope', blocks, false)\n\n return content.exec(content.params[0])\n } as HelperFunction\n})\n\nvar nativeHelpers = new Cacher({\n if: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('if', false, buffer.f, true)\n\n var returnStr = 'if(' + buffer.p + '){' + compileScope(buffer.d, env) + '}'\n if (buffer.b) {\n for (var i = 0; i < buffer.b.length; i++) {\n var currentBlock = buffer.b[i]\n if (currentBlock.n === 'else') {\n returnStr += 'else{' + compileScope(currentBlock.d, env) + '}'\n } else if (currentBlock.n === 'elif') {\n returnStr += 'else if(' + currentBlock.p + '){' + compileScope(currentBlock.d, env) + '}'\n }\n }\n }\n return returnStr\n },\n try: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('try', false, buffer.f, true)\n\n if (!buffer.b || buffer.b.length !== 1 || buffer.b[0].n !== 'catch') {\n throw SqrlErr(\"native helper 'try' only accepts 1 block, 'catch'\")\n }\n var returnStr = 'try{' + compileScope(buffer.d, env) + '}'\n\n var currentBlock = buffer.b[0]\n returnStr +=\n 'catch' +\n (currentBlock.res ? '(' + currentBlock.res + ')' : '') +\n '{' +\n compileScope(currentBlock.d, env) +\n '}'\n\n return returnStr\n },\n block: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('block', buffer.b, buffer.f, true)\n\n var returnStr =\n 'if(!' +\n env.varName +\n '[' +\n buffer.p +\n ']){tR+=(' +\n compileScopeIntoFunction(buffer.d, '', env) +\n ')()}else{tR+=' +\n env.varName +\n '[' +\n buffer.p +\n ']}'\n\n return returnStr\n }\n})\n\nvar filters = new Cacher({ e: XMLEscape })\n\nexport { templates, helpers, nativeHelpers, filters }\n","import { helpers, nativeHelpers, filters, templates } from './containers'\nimport SqrlErr from './err'\nimport { copyProps } from './utils'\n\n/* TYPES */\n\nexport type FetcherFunction = (container: 'H' | 'F', name: string) => Function | undefined\nimport { HelperFunction, FilterFunction } from './containers'\nimport { TemplateFunction } from './compile'\nimport { Cacher } from './storage'\n// import { TagType } from './parse'\n\ntype trimConfig = 'nl' | 'slurp' | false\n\nexport interface SqrlConfig {\n varName: string\n autoTrim: trimConfig | [trimConfig, trimConfig]\n rmWhitespace?: boolean\n autoEscape: boolean\n defaultFilter: false | string\n tags: [string, string]\n l: FetcherFunction\n plugins: Array<{ processFnString?: Function; processAST?: Function }>\n async: boolean\n storage: {\n helpers: Cacher\n nativeHelpers: Cacher\n filters: Cacher\n templates: Cacher\n }\n prefixes: {\n h: string\n b: string\n i: string\n r: string\n c: string\n e: string\n [index: string]: string\n }\n cache: boolean\n views?: string | Array\n root?: string\n filename?: string\n name?: string\n 'view cache'?: boolean\n useWith?: boolean\n [index: string]: any\n}\n\nexport type PartialConfig = {\n [P in keyof SqrlConfig]?: SqrlConfig[P]\n}\n\n/* END TYPES */\n\nvar defaultConfig: SqrlConfig = {\n varName: 'it',\n autoTrim: [false, 'nl'],\n autoEscape: true,\n defaultFilter: false,\n tags: ['{{', '}}'],\n l: function (container: 'H' | 'F', name: string): HelperFunction | FilterFunction | undefined {\n if (container === 'H') {\n var hRet = this.storage.helpers.get(name) as HelperFunction | undefined\n if (hRet) {\n return hRet\n } else {\n throw SqrlErr(\"Can't find helper '\" + name + \"'\")\n }\n } else if (container === 'F') {\n var fRet = this.storage.filters.get(name) as FilterFunction | undefined\n if (fRet) {\n return fRet\n } else {\n throw SqrlErr(\"Can't find filter '\" + name + \"'\")\n }\n }\n },\n async: false,\n storage: {\n helpers: helpers,\n nativeHelpers: nativeHelpers,\n filters: filters,\n templates: templates\n },\n prefixes: {\n h: '@',\n b: '#',\n i: '',\n r: '*',\n c: '/',\n e: '!'\n },\n cache: false,\n plugins: [],\n useWith: false\n}\n\ndefaultConfig.l.bind(defaultConfig)\n\nfunction getConfig (override: PartialConfig, baseConfig?: SqrlConfig): SqrlConfig {\n // TODO: run more tests on this\n\n var res: PartialConfig = {} // Linked\n copyProps(res, defaultConfig) // Creates deep clone of res, 1 layer deep\n\n if (baseConfig) {\n copyProps(res, baseConfig)\n }\n\n if (override) {\n copyProps(res, override)\n }\n\n ;(res as SqrlConfig).l.bind(res)\n\n return res as SqrlConfig\n}\n\nexport { defaultConfig, getConfig }\n","import compileToString from './compile-string'\nimport { getConfig } from './config'\nimport { asyncFunc } from './utils'\nimport SqrlErr from './err'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { CallbackFn } from './file-handlers'\nexport type TemplateFunction = (data: object, config: SqrlConfig, cb?: CallbackFn) => string\n\n/* END TYPES */\n\nexport default function compile (str: string, env?: PartialConfig): TemplateFunction {\n var options: SqrlConfig = getConfig(env || {})\n var ctor = Function // constructor\n\n /* ASYNC HANDLING */\n // The below code is modified from mde/ejs. All credit should go to them.\n if (options.async) {\n // Have to use generated function for this, since in envs without support,\n // it breaks in parsing\n if (asyncFunc) {\n ctor = asyncFunc\n } else {\n throw SqrlErr(\"This environment doesn't support async/await\")\n }\n }\n\n /* END ASYNC HANDLING */\n try {\n return new ctor(\n options.varName,\n 'c', // SqrlConfig\n 'cb', // optional callback\n compileToString(str, options)\n ) as TemplateFunction // eslint-disable-line no-new-func\n } catch (e) {\n if (e instanceof SyntaxError) {\n throw SqrlErr(\n 'Bad template syntax\\n\\n' +\n e.message +\n '\\n' +\n Array(e.message.length + 1).join('=') +\n '\\n' +\n compileToString(str, options)\n )\n } else {\n throw e\n }\n }\n}\n","var fs = require('fs')\nvar path = require('path')\nvar _BOM = /^\\uFEFF/\n\n// express is set like: app.engine('html', require('squirrelly').renderFile)\n\nimport SqrlErr from './err'\nimport Compile from './compile'\nimport { getConfig } from './config'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { TemplateFunction } from './compile'\n\ninterface PartialFileConfig extends PartialConfig {\n filename: string\n}\n\ninterface FileConfig extends SqrlConfig {\n filename: string\n}\n\n/* END TYPES */\n\n/**\n * Get the path to the included file from the parent file path and the\n * specified path.\n *\n * @param {String} name specified path\n * @param {String} parentfile parent file path\n * @param {Boolean} [isDir=false] whether parent file path is a directory\n * @return {String}\n */\n\nfunction getWholeFilePath (name: string, parentfile: string, isDirectory?: boolean) {\n var includePath = path.resolve(\n isDirectory ? parentfile : path.dirname(parentfile), // returns directory the parent file is in\n name // file\n )\n var ext = path.extname(name)\n if (!ext) {\n includePath += '.sqrl'\n }\n return includePath\n}\n\n/**\n * Get the path to the included file by Options\n *\n * @param {String} path specified path\n * @param {Options} options compilation options\n * @return {String}\n */\n\nfunction getPath (path: string, options: SqrlConfig) {\n var includePath\n var filePath\n var views = options.views\n var match = /^[A-Za-z]+:\\\\|^\\//.exec(path)\n\n // Abs path\n if (match && match.length) {\n includePath = getWholeFilePath(path.replace(/^\\/*/, ''), options.root || '/', true)\n } else {\n // Relative paths\n // Look relative to a passed filename first\n if (options.filename) {\n filePath = getWholeFilePath(path, options.filename)\n if (fs.existsSync(filePath)) {\n includePath = filePath\n }\n }\n // Then look in any views directories\n if (!includePath) {\n if (\n Array.isArray(views) &&\n views.some(function (v) {\n filePath = getWholeFilePath(path, v, true)\n return fs.existsSync(filePath)\n })\n ) {\n includePath = filePath\n }\n }\n if (!includePath) {\n throw SqrlErr('Could not find the include file \"' + path + '\"')\n }\n }\n return includePath\n}\n\nfunction readFile (filePath: string) {\n return fs\n .readFileSync(filePath)\n .toString()\n .replace(_BOM, '') // TODO: is replacing BOM's necessary?\n}\n\nfunction loadFile (filePath: string, options: PartialFileConfig): TemplateFunction {\n var config = getConfig(options)\n var template = readFile(filePath)\n try {\n var compiledTemplate = Compile(template, config)\n config.storage.templates.define((config as FileConfig).filename, compiledTemplate)\n return compiledTemplate\n } catch (e) {\n throw SqrlErr('Loading file: ' + filePath + ' failed')\n }\n}\n\nexport { getPath, readFile, loadFile }\n","// express is set like: app.engine('html', require('squirrelly').renderFile)\n\nimport SqrlErr from './err'\nimport compile from './compile'\nimport { getConfig } from './config'\nimport { getPath, readFile, loadFile } from './file-utils'\nimport { promiseImpl, copyProps } from './utils'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { TemplateFunction } from './compile'\n\nexport type CallbackFn = (err: Error | null, str?: string) => void\n\ninterface FileOptions extends SqrlConfig {\n filename: string\n}\n\ninterface DataObj {\n settings?: {\n [key: string]: any\n }\n [key: string]: any\n}\n\n/* END TYPES */\n\n/**\n * Get the template from a string or a file, either compiled on-the-fly or\n * read from cache (if enabled), and cache the template if needed.\n *\n * If `options.cache` is true, this function reads the file from\n * `options.filename` so it must be set prior to calling this function.\n *\n * @param {Options} options compilation options\n * @param {String} [template] template source\n * @return {(TemplateFunction|ClientFunction)}\n * Depending on the value of `options.client`, either type might be returned.\n * @static\n */\n\nfunction handleCache (options: FileOptions): TemplateFunction {\n var filename = options.filename\n\n if (options.cache) {\n var func = options.storage.templates.get(filename)\n if (func) {\n return func\n } else {\n return loadFile(filename, options)\n }\n }\n\n return compile(readFile(filename), options)\n}\n\n/**\n * Try calling handleCache with the given options and data and call the\n * callback with the result. If an error occurs, call the callback with\n * the error. Used by renderFile().\n *\n * @param {Options} options compilation options\n * @param {Object} data template data\n * @param {RenderFileCallback} cb callback\n * @static\n */\n\nfunction tryHandleCache (options: FileOptions, data: object, cb: CallbackFn) {\n var result\n if (!cb) {\n // No callback, try returning a promise\n if (typeof promiseImpl === 'function') {\n return new promiseImpl(function (resolve: Function, reject: Function) {\n try {\n result = handleCache(options)(data, options)\n resolve(result)\n } catch (err) {\n reject(err)\n }\n })\n } else {\n throw SqrlErr(\"Please provide a callback function, this env doesn't support Promises\")\n }\n } else {\n try {\n handleCache(options)(data, options, cb)\n } catch (err) {\n return cb(err)\n }\n }\n}\n\n/**\n * Get the template function.\n *\n * If `options.cache` is `true`, then the template is cached.\n *\n * @param {String} path path for the specified file\n * @param {Options} options compilation options\n * @return {(TemplateFunction|ClientFunction)}\n * Depending on the value of `options.client`, either type might be returned\n * @static\n */\n\nfunction includeFile (path: string, options: SqrlConfig) {\n // the below creates a new options object, using the parent filepath of the old options object and the path\n var newFileOptions = getConfig({ filename: getPath(path, options) }, options)\n // TODO: make sure properties are currectly copied over\n return handleCache(newFileOptions as FileOptions)\n}\n\nfunction renderFile (filename: string, data: DataObj, cb?: CallbackFn) {\n data = data || {}\n var Config: FileOptions = getConfig((data as PartialConfig)) as FileOptions\n // TODO: make sure above doesn't error. We do set filename down below\n\n if (data.settings) {\n // Pull a few things from known locations\n if (data.settings.views) {\n Config.views = data.settings.views\n }\n if (data.settings['view cache']) {\n Config.cache = true\n }\n // Undocumented after Express 2, but still usable, esp. for\n // items that are unsafe to be passed along with data, like `root`\n var viewOpts = data.settings['view options']\n\n if (viewOpts) {\n copyProps(Config, viewOpts)\n }\n }\n\n Config.filename = filename // Make sure filename is right\n\n return tryHandleCache(Config, data, cb as CallbackFn)\n}\n\nexport { includeFile, renderFile }\n","import SqrlErr from './err'\nimport { includeFile } from './file-handlers'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { HelperBlock } from './containers'\n\ninterface IncludeHelperBlock extends HelperBlock {\n params: [string, object]\n}\n\ninterface GenericData {\n [index: string]: any\n}\n\n/* END TYPES */\n\nexport function includeFileHelper (\n content: IncludeHelperBlock,\n blocks: Array,\n config: SqrlConfig\n): string {\n if (blocks && blocks.length > 0) {\n throw SqrlErr(\"Helper 'includeFile' doesn't accept blocks\")\n }\n return includeFile(content.params[0], config)(content.params[1], config)\n}\n\nexport function extendsFileHelper (\n content: IncludeHelperBlock,\n blocks: Array,\n config: SqrlConfig\n): string {\n var data: GenericData = content.params[1] || {}\n\n data.content = content.exec()\n for (var i = 0; i < blocks.length; i++) {\n var currentBlock = blocks[i]\n data[currentBlock.name] = currentBlock.exec()\n }\n\n return includeFile(content.params[0], config)(data, config)\n}\n","import compile from './compile'\nimport { getConfig } from './config'\nimport { promiseImpl } from './utils'\nimport SqrlErr from './err'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { TemplateFunction } from './compile'\nimport { CallbackFn } from './file-handlers'\n\n/* END TYPES */\n\nfunction handleCache (template: string | TemplateFunction, options: SqrlConfig): TemplateFunction {\n var templateFunc\n\n if (options.cache && options.name && options.storage.templates.get(options.name)) {\n return options.storage.templates.get(options.name)\n }\n\n if (typeof template === 'function') {\n templateFunc = template\n } else {\n templateFunc = compile(template, options)\n }\n\n if (options.cache && options.name) {\n options.storage.templates.define(options.name, templateFunc)\n }\n\n return templateFunc\n}\n\nexport default function render (\n template: string | TemplateFunction,\n data: object,\n env?: PartialConfig,\n cb?: CallbackFn\n) {\n var options = getConfig(env || {})\n\n if (options.async) {\n var result\n if (!cb) {\n // No callback, try returning a promise\n if (typeof promiseImpl === 'function') {\n return new promiseImpl(function (resolve: Function, reject: Function) {\n try {\n result = handleCache(template, options)(data, options)\n resolve(result)\n } catch (err) {\n reject(err)\n }\n })\n } else {\n throw SqrlErr(\"Please provide a callback function, this env doesn't support Promises\")\n }\n } else {\n try {\n handleCache(template, options)(data, options, cb)\n } catch (err) {\n return cb(err)\n }\n }\n } else {\n return handleCache(template, options)(data, options)\n }\n}\n","/* Export file stuff */\nimport { helpers } from './containers'\nimport { includeFileHelper, extendsFileHelper } from './file-helpers'\n\n/* TYPES */\n\nimport { HelperFunction } from './containers'\n\n/* END TYPES */\n\nhelpers.define('includeFile', includeFileHelper as HelperFunction)\nhelpers.define('extendsFile', extendsFileHelper as HelperFunction)\n\nexport { renderFile, renderFile as __express } from './file-handlers'\nexport { loadFile } from './file-utils'\n\n/* End file stuff */\n\nexport {\n default as compileToString,\n compileScope,\n compileScopeIntoFunction\n} from './compile-string'\nexport { default as compile } from './compile'\nexport { default as parse } from './parse'\nexport { default as render } from './render'\nexport { helpers, nativeHelpers, filters, templates } from './containers'\nexport { defaultConfig, getConfig } from './config'\n"],"names":["Parse","Compile","handleCache"],"mappings":";;;;AAAA;AACA;AAMA;AAEO,IAAI,WAAW,GAAG,IAAI,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAA;AAE9D,IAAI,SAAS,GAAgC,KAAK,CAAA;AAElD,IAAI;IACF,SAAS,GAAG,IAAI,QAAQ,CAAC,yCAAyC,CAAC,EAAE,CAAA;CACtE;AAAC,OAAO,CAAC,EAAE;;IAEV,IAAI,EAAE,CAAC,YAAY,WAAW,CAAC,EAAE;QAC/B,MAAM,CAAC,CAAA;KACR;CACF;SAIe,UAAU,CAAE,GAAW,EAAE,IAAY;IACnD,OAAO,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACxD,CAAC;SAEe,SAAS,CAAK,KAAQ,EAAE,OAAU,EAAE,SAAmB;IACrE,KAAK,IAAI,GAAG,IAAI,OAAO,EAAE;QACvB,IAAI,UAAU,CAAE,OAA6B,EAAE,GAAG,CAAC,EAAE;YACnD,IACE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI;gBACpB,OAAO,OAAO,CAAC,GAAG,CAAC,IAAI,QAAQ;iBAC9B,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,UAAU,CAAC;gBACzC,CAAC,SAAS;cACV;;;;;gBAKA,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,mBAAmB,EAAiC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;aAC1F;iBAAM;gBACL,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAA;aAC1B;SACF;KACF;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,MAAM,CACb,GAAW,EACX,GAAe,EACf,MAAsB,EACtB,OAAwB;IAExB,IAAI,QAAQ,CAAA;IACZ,IAAI,SAAS,CAAA;IAEb,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE;QACpC,QAAQ,GAAG,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAA;;;KAGpC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;;;QAGtC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC1B,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;KAC5B;IAED,IAAI,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE;QAC9B,QAAQ,GAAG,MAAM,CAAA;KAClB;IAED,IAAI,OAAO,IAAI,OAAO,KAAK,KAAK,EAAE;QAChC,SAAS,GAAG,OAAO,CAAA;KACpB;IAED,IAAI,QAAQ,KAAK,OAAO,IAAI,SAAS,KAAK,OAAO,EAAE;QACjD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAA;KAClB;IAED,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,OAAO,EAAE;;;;QAI5C,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;YAC/B,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAA;SACrB;aAAM;YACL,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;SAC1C;KACF;SAAM,IAAI,QAAQ,KAAK,GAAG,IAAI,QAAQ,KAAK,IAAI,EAAE;;;QAGhD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;KACzC;IAED,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,OAAO,EAAE;;;;QAI9C,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE;YAChC,GAAG,GAAG,GAAG,CAAC,SAAS,EAAE,CAAA;SACtB;aAAM;YACL,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;SAC1C;KACF;SAAM,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,IAAI,EAAE;;;QAGlD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAA;KACzC;IAED,OAAO,GAAG,CAAA;AACZ;;ACxGA;AAEA;IACE,gBAAqB,KAAc;QAAd,UAAK,GAAL,KAAK,CAAS;KAAI;IACvC,uBAAM,GAAN,UAAQ,GAAW,EAAE,GAAM;QACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAA;KACtB;IACD,oBAAG,GAAH,UAAK,GAAW;;;;QAId,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KACvB;IACD,uBAAM,GAAN,UAAQ,GAAW;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;KACvB;IACD,sBAAK,GAAL;QACE,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;KAChB;IACD,qBAAI,GAAJ,UAAM,QAAiB;;;QAGrB,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAA;KACtC;IACH,aAAC;AAAD,CAAC;;ACjCD,SAAS,cAAc,CAAE,GAAQ,EAAE,KAAU;IAC3C,IAAI,MAAM,CAAC,cAAc,EAAE;QACzB,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;KAClC;SAAM;QACL,GAAG,CAAC,SAAS,GAAG,KAAK,CAAA;KACtB;AACH,CAAC;SAEuB,OAAO,CAAE,OAAe;IAC9C,IAAI,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,CAAA;IAC5B,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IACtC,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE;IACjD,IAAI,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,KAAK,EAAE;CACvD,CAAC,CAAA;AAEF;SAEgB,QAAQ,CAAE,OAAe,EAAE,GAAW,EAAE,IAAY;IAClE,IAAI,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAE/C,IAAI,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IAC9B,IAAI,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IAC7C,OAAO;QACL,WAAW;YACX,MAAM;YACN,OAAO;YACP,KAAK;YACL,OAAO;YACP,IAAI;YACJ,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;YAC3B,IAAI;YACJ,IAAI;YACJ,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YACtB,GAAG,CAAA;IACL,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;AACxB;;ACJA;AAEA,IAAI,WAAW,GAAG,UAAU,CAAA;AAE5B,IAAI,cAAc,GAAG,oEAAoE,CAAA;AAEzF,IAAI,cAAc,GAAG,mCAAmC,CAAA;AAExD,IAAI,cAAc,GAAG,mCAAmC,CAAA;AAExD,IAAI,eAAe,GAAG,uBAAuB,CAAA;AAE7C,SAAS,YAAY,CAAE,MAAc;;IAEnC,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC;UAC/B,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,MAAM,CAAC;UACvC,MAAM,CAAA;AACZ,CAAC;SAEuB,KAAK,CAAE,GAAW,EAAE,GAAe;;IAEzD,IAAI,GAAG,CAAC,YAAY,EAAE;;;;;;QAMpB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAA;KAC/D;;IAGD,cAAc,CAAC,SAAS,GAAG,CAAC,CAAA;IAC5B,cAAc,CAAC,SAAS,GAAG,CAAC,CAAA;IAC5B,cAAc,CAAC,SAAS,GAAG,CAAC,CAAA;IAE5B,IAAI,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAA;IAE9B,IAAI,QAAQ,GAAG;QACb,WAAW,CAAC,CAAC;QACb,WAAW,CAAC,CAAC;QACb,WAAW,CAAC,CAAC;QACb,WAAW,CAAC,CAAC;QACb,WAAW,CAAC,CAAC;QACb,WAAW,CAAC,CAAC;KACd,CAAC,MAAM,CAAC,UAAU,WAAW,EAAE,MAAM;QACpC,IAAI,WAAW,IAAI,MAAM,EAAE;YACzB,OAAO,WAAW,GAAG,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC,CAAA;SAChD;aAAM,IAAI,MAAM,EAAE;;YAEjB,OAAO,YAAY,CAAC,MAAM,CAAC,CAAA;SAC5B;aAAM;;YAEL,OAAO,WAAW,CAAA;SACnB;KACF,EAAE,EAAE,CAAC,CAAA;IAEN,IAAI,aAAa,GAAG,IAAI,MAAM,CAC5B,aAAa;QACb,mCAAmC;QACjC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,GAAG,EACL,GAAG,CACJ,CAAA;IAED,IAAI,UAAU,GAAG,IAAI,MAAM,CACzB,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,GAAG,QAAQ,GAAG,QAAQ,EAC3E,GAAG,CACJ,CAAA;IAED,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,IAAI,cAAc,GAAmB,KAAK,CAAA;IAE1C,SAAS,QAAQ,CAAE,YAAoB,EAAE,WAAoB;QAC3D,IAAI,UAAU,GAAmB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAA;QAC1C,IAAI,SAAS,GAAG,CAAC,CAAA;QACjB,IAAI,gBAAgB,GAAsB,GAAG,CAAA;QAE7C,IAAI,WAAW,KAAK,GAAG,IAAI,WAAW,KAAK,GAAG,IAAI,WAAW,KAAK,GAAG,EAAE;YACrE,gBAAgB,GAAG,GAAG,CAAA;SACvB;aAAM,IAAI,WAAW,KAAK,GAAG,EAAE;YAC9B,UAAU,CAAC,GAAG,GAAG,IAAI,CAAA;YACrB,WAAW,GAAG,GAAG,CAAA;SAClB;QAED,SAAS,YAAY,CAAE,IAAY;YACjC,IAAI,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;;YAE9C,IAAI,GAAG,GAAG,cAAc,CAAC,IAAI,EAAE,CAAA;YAC/B,IAAI,gBAAgB,KAAK,GAAG,EAAE;gBAC5B,IAAI,GAAG,KAAK,MAAM,EAAE;oBAClB,UAAU,CAAC,GAAG,GAAG,IAAI,CAAA;iBACtB;qBAAM;oBACL,IAAI,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;wBACtC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;wBAClC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC,CAAA;qBACnC;yBAAM;wBACL,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAA;qBAC7B;iBACF;aACF;iBAAM,IAAI,gBAAgB,KAAK,IAAI,EAAE;gBACpC,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAA;aAChD;iBAAM,IAAI,gBAAgB,KAAK,KAAK,EAAE;gBACrC,IAAI,GAAG,EAAE;oBACP,IAAI,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;oBACvC,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,QAAQ,GAAG,KAAK,CAAC,CAAA;iBAClD;aACF;iBAAM;;;;gBAIL,UAAU,CAAC,gBAAgB,CAAC,GAAG,GAAG,CAAA;;aAEnC;YACD,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAA;SACpB;QAED,aAAa,CAAC,SAAS,GAAG,QAAQ,CAAA;QAElC,IAAI,CAAC,CAAA;;QAEL,OAAO,CAAC,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE;YAC7C,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACf,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACrB,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACnB,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YAChB,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;YACpB,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAA;YAEf,IAAI,IAAI,EAAE;;gBAER,IAAI,IAAI,KAAK,GAAG,EAAE;oBAChB,IAAI,SAAS,KAAK,CAAC,EAAE;wBACnB,IAAI,gBAAgB,KAAK,GAAG,EAAE;4BAC5B,YAAY,CAAC,CAAC,CAAC,CAAA;4BACf,gBAAgB,GAAG,GAAG,CAAA;yBACvB;6BAAM,IAAI,gBAAgB,KAAK,GAAG,EAAE;4BACnC,YAAY,CAAC,CAAC,CAAC,CAAA;4BACf,gBAAgB,GAAG,IAAI,CAAA;yBACxB;qBACF;oBACD,SAAS,EAAE,CAAA;iBACZ;qBAAM,IAAI,IAAI,KAAK,GAAG,EAAE;oBACvB,SAAS,EAAE,CAAA;oBACX,IAAI,SAAS,KAAK,CAAC,IAAI,gBAAgB,KAAK,GAAG,EAAE;;wBAE/C,YAAY,CAAC,CAAC,CAAC,CAAA;wBAEf,gBAAgB,GAAG,KAAK,CAAA;qBACzB;iBACF;qBAAM,IAAI,SAAS,KAAK,CAAC,IAAI,IAAI,KAAK,GAAG,EAAE;oBAC1C,YAAY,CAAC,CAAC,CAAC,CAAA;oBACf,gBAAgB,GAAG,GAAG,CAAA;iBACvB;qBAAM,IAAI,IAAI,KAAK,IAAI,EAAE;oBACxB,YAAY,CAAC,CAAC,CAAC,CAAA;oBACf,QAAQ,IAAI,CAAC,CAAA;oBACb,gBAAgB,GAAG,KAAK,CAAA;iBACzB;aACF;iBAAM,IAAI,UAAU,EAAE;gBACrB,IAAI,UAAU,KAAK,IAAI,EAAE;oBACvB,IAAI,eAAe,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;oBAChE,IAAI,eAAe,KAAK,CAAC,CAAC,EAAE;wBAC1B,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;qBAC3C;oBACD,aAAa,CAAC,SAAS,GAAG,eAAe,GAAG,CAAC,CAAA;iBAC9C;qBAAM,IAAI,UAAU,KAAK,GAAG,EAAE;oBAC7B,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAA;oBAElC,IAAI,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAC/C,IAAI,gBAAgB,EAAE;wBACpB,aAAa,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAA;qBACnD;yBAAM;wBACL,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;qBAC1C;iBACF;qBAAM,IAAI,UAAU,KAAK,GAAG,EAAE;oBAC7B,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAA;oBAClC,IAAI,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAE/C,IAAI,gBAAgB,EAAE;wBACpB,aAAa,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAA;qBACnD;yBAAM;wBACL,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;qBAC1C;iBACF;qBAAM,IAAI,UAAU,KAAK,GAAG,EAAE;oBAC7B,cAAc,CAAC,SAAS,GAAG,CAAC,CAAC,KAAK,CAAA;oBAClC,IAAI,gBAAgB,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;oBAC/C,IAAI,gBAAgB,EAAE;wBACpB,aAAa,CAAC,SAAS,GAAG,cAAc,CAAC,SAAS,CAAA;qBACnD;yBAAM;wBACL,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;qBAC1C;iBACF;aACF;iBAAM,IAAI,QAAQ,EAAE;gBACnB,YAAY,CAAC,CAAC,CAAC,CAAA;gBACf,QAAQ,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;gBAC1B,UAAU,CAAC,SAAS,GAAG,QAAQ,CAAA;;gBAE/B,cAAc,GAAG,SAAS,CAAA;gBAC1B,IAAI,KAAK,IAAI,WAAW,KAAK,GAAG,EAAE;oBAChC,WAAW,GAAG,GAAG,CAAA;iBAClB;gBACD,UAAU,CAAC,CAAC,GAAG,WAAW,CAAA;gBAC1B,OAAO,UAAU,CAAA;aAClB;SACF;QACD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,YAAY,CAAC,CAAA;QAC3C,OAAO,UAAU,CAAA;KAClB;IAED,SAAS,YAAY,CAAE,SAAyB,EAAE,UAAoB;QACpE,SAAS,CAAC,CAAC,GAAG,EAAE,CAAA;QAChB,SAAS,CAAC,CAAC,GAAG,EAAE,CAAA;QAChB,IAAI,SAAS,GAAiC,KAAK,CAAA;QACnD,IAAI,MAAM,GAAqB,EAAE,CAAA;QAEjC,SAAS,UAAU,CAAE,KAAa,EAAE,uBAAwC;YAC1E,IAAI,KAAK,EAAE;;;gBAIT,KAAK,GAAG,MAAM,CACZ,KAAK,EACL,GAAG,EACH,cAAc;gBACd,uBAAuB,CACxB,CAAA;gBAED,IAAI,KAAK,EAAE;;oBAGT,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,CAAA;;oBAGpE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;iBACnB;aACF;SACF;;QAGD,IAAI,YAAY,CAAA;;QAEhB,OAAO,CAAC,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE;YACrD,IAAI,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;YACrC,IAAI,8BAA8B,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;YACpD,IAAI,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YAClC,IAAI,UAA+B,CAAA;YAEnC,KAAK,IAAI,GAAG,IAAI,WAAW,EAAE;gBAC3B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,MAAM,EAAE;oBAC/B,UAAU,GAAG,GAAc,CAAA;oBAC3B,MAAK;iBACN;aACF;YAED,UAAU,CAAC,eAAe,EAAE,8BAA8B,CAAC,CAAA;YAC3D,QAAQ,GAAG,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;YAEtD,IAAI,CAAC,UAAU,EAAE;gBACf,QAAQ,CAAC,yBAAyB,GAAG,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAA;aAC5D;YAED,IAAI,UAAU,GAAG,QAAQ,CAAC,YAAY,CAAC,KAAK,EAAE,UAAqB,CAAC,CAAA;;YAGpE,IAAI,WAAW,GAAG,UAAU,CAAC,CAAC,CAAA;YAC9B,IAAI,WAAW,KAAK,GAAG,EAAE;gBACvB,IAAI,KAAK,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC9B,IAAI,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBACxC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAA;oBACnB,UAAU,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;iBAC9C;gBACD,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,CAAA;gBACrC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;aACxB;iBAAM,IAAI,WAAW,KAAK,GAAG,EAAE;;gBAE9B,IAAI,SAAS,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE;oBAChC,IAAI,SAAS,EAAE;;wBAEb,SAAS,CAAC,CAAC,GAAG,MAAM,CAAA;wBACpB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;qBAC5B;yBAAM;wBACL,SAAS,CAAC,CAAC,GAAG,MAAM,CAAA;qBACrB;;oBAED,OAAO,SAAiC,CAAA;iBACzC;qBAAM;oBACL,QAAQ,CACN,kCAAkC,EAClC,GAAG,EACH,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,MAAM,CAC5C,CAAA;iBACF;aACF;iBAAM,IAAI,WAAW,KAAK,GAAG,EAAE;;;gBAG9B,IAAI,SAAS,EAAE;;oBAEb,SAAS,CAAC,CAAC,GAAG,MAAM,CAAA;oBACpB,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;iBAC5B;qBAAM;oBACL,SAAS,CAAC,CAAC,GAAG,MAAM,CAAA;iBACrB;gBAED,IAAI,SAAS,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;gBAClC,IAAI,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;oBAC5C,UAAU,CAAC,CAAC,GAAG,IAAI,CAAA;oBACnB,UAAU,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;iBAClD;gBAED,SAAS,GAAG,UAAkC,CAAA;gBAE9C,MAAM,GAAG,EAAE,CAAA;aACZ;iBAAM,IAAI,WAAW,KAAK,GAAG,EAAE;gBAC9B,IAAI,gBAAgB,GAAG,UAAU,CAAC,CAAC,IAAI,EAAE,CAAA;gBACzC,IAAI,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE;oBACnD,UAAU,CAAC,CAAC,GAAG,IAAI,CAAA;oBACnB,UAAU,CAAC,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;iBACzD;gBACD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;aACxB;iBAAM;gBACL,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;aACxB;;SAEF;QAED,IAAI,UAAU,EAAE;YACd,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAA;YAClD,SAAS,CAAC,CAAC,GAAG,MAAM,CAAA;SACrB;aAAM;YACL,MAAM,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;;SAEvD;QAED,OAAO,SAAiC,CAAA;KACzC;IAED,IAAI,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAA;;IAE/C,IAAI,GAAG,CAAC,OAAO,EAAE;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC3B,IAAI,MAAM,CAAC,UAAU,EAAE;gBACrB,WAAW,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;aACtD;SACF;KACF;IACD,OAAO,WAAW,CAAC,CAAC,CAAA;AACtB;;ACrXA;AAEA;SAEwB,eAAe,CAAE,GAAW,EAAE,GAAe;IACnE,IAAI,MAAM,GAAqBA,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IAE9C,IAAI,GAAG,GACL,YAAY;SACX,GAAG,CAAC,OAAO,GAAG,OAAO,GAAG,GAAG,CAAC,OAAO,GAAG,QAAQ,GAAG,EAAE,CAAC;QACrD,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC;QACzB,+BAA+B;SAC9B,GAAG,CAAC,OAAO,GAAG,GAAG,GAAG,EAAE,CAAC,CAAA;IAE1B,IAAI,GAAG,CAAC,OAAO,EAAE;QACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC3C,IAAI,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;YAC3B,IAAI,MAAM,CAAC,eAAe,EAAE;gBAC1B,GAAG,GAAG,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;aACvC;SACF;KACF;IAED,OAAO,GAAG,CAAA;;AAGZ,CAAC;AAED,SAAS,MAAM,CAAE,GAAW,EAAE,OAAsB;IAClD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACvC,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACxB,IAAI,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,aAAa,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;;;;;QAOjC,GAAG,GAAG,CAAC,aAAa,GAAG,QAAQ,GAAG,EAAE,IAAI,WAAW,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG,CAAA;QACxE,IAAI,MAAM,EAAE;YACV,GAAG,IAAI,GAAG,GAAG,MAAM,CAAA;SACpB;QACD,GAAG,IAAI,GAAG,CAAA;KACX;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED;AACA;AAEA,SAAS,aAAa,CACpB,GAAe,EACf,GAAW,EACX,WAA6B,EAC7B,MAAc,EACd,OAAiB,EACjB,IAAa;IAEb,IAAI,GAAG,GACL,QAAQ;SACP,OAAO,GAAG,QAAQ,GAAG,EAAE,CAAC;QACzB,wBAAwB,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC;QAC/C,WAAW;QACX,MAAM;QACN,GAAG,CAAA;IACL,IAAI,IAAI,EAAE;QACR,GAAG,IAAI,SAAS,GAAG,IAAI,GAAG,GAAG,CAAA;KAC9B;IACD,IAAI,OAAO,EAAE;QACX,GAAG,IAAI,aAAa,CAAA;KACrB;IACD,GAAG,IAAI,GAAG,CAAA;IACV,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,SAAS,aAAa,CAAE,MAAmC,EAAE,GAAe;IAC1E,IAAI,GAAG,GAAG,GAAG,CAAA;IACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACrB,GAAG,IAAI,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAA;QACpF,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE;YACrB,GAAG,IAAI,GAAG,CAAA;SACX;KACF;IACD,GAAG,IAAI,GAAG,CAAA;IACV,OAAO,GAAG,CAAA;AACZ,CAAC;SAEe,wBAAwB,CAAE,IAAsB,EAAE,GAAW,EAAE,GAAe;IAC5F,OAAO,WAAW,GAAG,GAAG,GAAG,cAAc,GAAG,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,YAAY,CAAA;AACpF,CAAC;SAEe,YAAY,CAAE,IAAsB,EAAE,GAAe;IACnE,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,IAAI,UAAU,GAAG,IAAI,CAAC,MAAM,CAAA;IAC5B,IAAI,SAAS,GAAG,EAAE,CAAA;IAElB,KAAK,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE;QAC3B,IAAI,YAAY,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAC1B,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;YACpC,IAAI,GAAG,GAAG,YAAY,CAAA;;YAGtB,SAAS,IAAI,OAAO,GAAG,GAAG,GAAG,IAAI,CAAA;SAClC;aAAM;YACL,IAAI,IAAI,GAAkB,YAAY,CAAC,CAAkB,CAAA;YACzD,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,CAAA;YAClC,IAAI,OAAO,GAAG,YAAY,CAAC,CAAC,CAAA;YAC5B,IAAI,IAAI,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,CAAA;YAC/B,IAAI,MAAM,GAAG,YAAY,CAAC,CAAC,IAAI,EAAE,CAAA;YACjC,IAAI,GAAG,GAAG,YAAY,CAAC,GAAG,IAAI,EAAE,CAAA;YAChC,IAAI,MAAM,GAAG,YAAY,CAAC,CAAC,CAAA;YAC3B,IAAI,OAAO,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;;;;;YAK9B,IAAI,IAAI,KAAK,GAAG,EAAE;gBAChB,IAAI,GAAG,CAAC,aAAa,EAAE;oBACrB,OAAO,GAAG,WAAW,GAAG,GAAG,CAAC,aAAa,GAAG,KAAK,GAAG,OAAO,GAAG,GAAG,CAAA;iBAClE;gBACD,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBACvC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,EAAE;oBACvC,QAAQ,GAAG,eAAe,GAAG,QAAQ,GAAG,GAAG,CAAA;iBAC5C;gBACD,SAAS,IAAI,MAAM,GAAG,QAAQ,GAAG,GAAG,CAAA;;aAErC;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE;;gBAEvB,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;oBACvC,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;iBACpE;qBAAM;oBACL,IAAI,YAAY,GACd,CAAC,OAAO,GAAG,QAAQ,GAAG,EAAE;wBACxB,WAAW;wBACX,IAAI;wBACJ,KAAK;wBACL,aAAa,CAAC,GAAG,EAAE,GAAG,EAAG,YAAqC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;oBACpF,IAAI,MAAM,EAAE;wBACV,YAAY,IAAI,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;qBACjD;yBAAM;wBACL,YAAY,IAAI,KAAK,CAAA;qBACtB;oBACD,YAAY,IAAI,KAAK,CAAA;oBAErB,SAAS,IAAI,MAAM,GAAG,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,GAAG,GAAG,CAAA;iBAC1D;aACF;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE;;gBAGvB,SAAS;oBACP,MAAM;wBACN,MAAM,CACJ,CAAC,OAAO,GAAG,QAAQ,GAAG,EAAE,IAAI,WAAW,GAAG,IAAI,GAAG,cAAc,GAAG,MAAM,GAAG,UAAU,EACrF,OAAO,CACR;wBACD,GAAG,CAAA;aACN;iBAAM,IAAI,IAAI,KAAK,GAAG,EAAE;;gBAEvB,SAAS,IAAI,OAAO,GAAG,IAAI,CAAA;aAC5B;SACF;KACF;IAED,OAAO,SAAS,CAAA;AAClB;;SC3KgB,sBAAsB,CACpC,IAAY,EACZ,MAA0B;AAC1B,OAA2B,EAC3B,MAAgB;IAEhB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,MAAM,OAAO,CAAC,CAAC,MAAM,GAAG,QAAQ,GAAG,EAAE,IAAI,UAAU,GAAG,IAAI,GAAG,yBAAyB,CAAC,CAAA;KACxF;IACD,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QACjC,MAAM,OAAO,CAAC,CAAC,MAAM,GAAG,QAAQ,GAAG,EAAE,IAAI,UAAU,GAAG,IAAI,GAAG,0BAA0B,CAAC,CAAA;KACzF;AACH,CAAC;AAED;SACgB,YAAY,CAC1B,GAAe,EACf,KAAa,EACb,EAAY,EACZ,GAAW,EACX,EAAY;IAEZ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,UAAU,GAAW;QAC9C,GAAG,IAAI,GAAG,CAAA;QACV,IAAI,KAAK,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE;YAC5B,EAAE,CAAC,GAAG,CAAC,CAAA;SACR;aAAM;YACL,YAAY,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;SAC1C;KACF,CAAC,CAAA;AACJ,CAAC;SAEe,YAAY,CAC1B,GAA6B,EAC7B,IAAmB,EACnB,KAAa,EACb,EAAY,EACZ,GAAW,EACX,EAAY;IAEZ,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,GAAW;QAC1D,GAAG,IAAI,GAAG,CAAA;QACV,IAAI,KAAK,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YAC7B,EAAE,CAAC,GAAG,CAAC,CAAA;SACR;aAAM;YACL,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;SAChD;KACF,CAAC,CAAA;AACJ,CAAC;AAED,IAAI,MAAM,GAAc;IACtB,GAAG,EAAE,OAAO;IACZ,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,QAAQ;IACb,GAAG,EAAE,OAAO;CACb,CAAA;SAEe,WAAW,CAAC,CAAS;IACnC,OAAO,MAAM,CAAC,CAAC,CAAC,CAAA;AAClB,CAAC;SAEe,SAAS,CAAC,GAAY;;IAEpC,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA;IACxB,IAAI,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE;QAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,WAAW,CAAC,CAAA;KAC/C;SAAM;QACL,OAAO,MAAM,CAAA;KACd;AACH;;AClCA;IAEI,SAAS,GAAG,IAAI,MAAM,CAAmB,EAAE,EAAC;AAEhD;IAEI,OAAO,GAAG,IAAI,MAAM,CAAiB;IACvC,IAAI,EAAE,UAAU,OAAsB,EAAE,MAA0B;QAChE,IAAI,GAAG,GAAG,EAAE,CAAA;QACZ,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC3B,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QAE7C,IAAI,OAAO,CAAC,KAAK,EAAE;YACjB,OAAO,IAAI,OAAO,CAAC,UAAU,OAAO;gBAClC,YAAY,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;aACjD,CAAC,CAAA;SACH;aAAM;YACL,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;aAC/B;YACD,OAAO,GAAG,CAAA;SACX;KACF;IACD,OAAO,EAAE,UAAU,OAAsB,EAAE,MAA0B;QACnE,IAAI,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC3B,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QAEhD,IAAI,OAAO,CAAC,KAAK,EAAE;YACjB,OAAO,IAAI,OAAO,CAAC,UAAU,OAAO;gBAClC,YAAY,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;aAClE,CAAC,CAAA;SACH;aAAM;YACL,IAAI,GAAG,GAAG,EAAE,CAAA;YAEZ,KAAK,IAAI,GAAG,IAAI,GAAG,EAAE;gBACnB,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;oBAAE,SAAQ;gBACnC,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;aACnC;YACD,OAAO,GAAG,CAAA;SACX;KACF;IACD,OAAO,EAAE,UACP,OAA6B,EAC7B,MAA0B,EAC1B,MAAkB;QAElB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QAChD,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,OAAO,CAAC,4BAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;SACtE;QACD,OAAO,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;KACzB;IACnB,OAAO,EAAE,UACP,OAA6B,EAC7B,MAA0B,EAC1B,MAAkB;QAElB,IAAI,IAAI,GAAgB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;QAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,IAAI,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,CAAA;SAC9C;QAED,IAAI,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,OAAO,CAAC,4BAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAA;SACtE;QACD,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;KACZ;IACnB,QAAQ,EAAE,UAAU,OAAsB,EAAE,MAA0B;QACpE,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QAEjD,OAAO,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;KACrB;CACpB,EAAC;IAEE,aAAa,GAAG,IAAI,MAAM,CAAW;IACvC,EAAE,EAAE,UAAU,MAA4B,EAAE,GAAe;QACzD,sBAAsB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAEnD,IAAI,SAAS,GAAG,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;QAC3E,IAAI,MAAM,CAAC,CAAC,EAAE;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACxC,IAAI,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;gBAC9B,IAAI,YAAY,CAAC,CAAC,KAAK,MAAM,EAAE;oBAC7B,SAAS,IAAI,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;iBAC/D;qBAAM,IAAI,YAAY,CAAC,CAAC,KAAK,MAAM,EAAE;oBACpC,SAAS,IAAI,UAAU,GAAG,YAAY,CAAC,CAAC,GAAG,IAAI,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;iBAC1F;aACF;SACF;QACD,OAAO,SAAS,CAAA;KACjB;IACD,GAAG,EAAE,UAAU,MAA4B,EAAE,GAAe;QAC1D,sBAAsB,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAEpD,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE;YACnE,MAAM,OAAO,CAAC,mDAAmD,CAAC,CAAA;SACnE;QACD,IAAI,SAAS,GAAG,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,GAAG,CAAA;QAE1D,IAAI,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9B,SAAS;YACP,OAAO;iBACN,YAAY,CAAC,GAAG,GAAG,GAAG,GAAG,YAAY,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;gBACtD,GAAG;gBACH,YAAY,CAAC,YAAY,CAAC,CAAC,EAAE,GAAG,CAAC;gBACjC,GAAG,CAAA;QAEL,OAAO,SAAS,CAAA;KACjB;IACD,KAAK,EAAE,UAAU,MAA4B,EAAE,GAAe;QAC5D,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAEzD,IAAI,SAAS,GACX,MAAM;YACN,GAAG,CAAC,OAAO;YACX,GAAG;YACH,MAAM,CAAC,CAAC;YACR,UAAU;YACV,wBAAwB,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC;YAC3C,eAAe;YACf,GAAG,CAAC,OAAO;YACX,GAAG;YACH,MAAM,CAAC,CAAC;YACR,IAAI,CAAA;QAEN,OAAO,SAAS,CAAA;KACjB;CACF,EAAC;IAEE,OAAO,GAAG,IAAI,MAAM,CAAiB,EAAE,CAAC,EAAE,SAAS,EAAE;;ACvHzD;IAEI,aAAa,GAAe;IAC9B,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;IACvB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,KAAK;IACpB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;IAClB,CAAC,EAAE,UAAU,SAAoB,EAAE,IAAY;QAC7C,IAAI,SAAS,KAAK,GAAG,EAAE;YACrB,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAA+B,CAAA;YACvE,IAAI,IAAI,EAAE;gBACR,OAAO,IAAI,CAAA;aACZ;iBAAM;gBACL,MAAM,OAAO,CAAC,qBAAqB,GAAG,IAAI,GAAG,GAAG,CAAC,CAAA;aAClD;SACF;aAAM,IAAI,SAAS,KAAK,GAAG,EAAE;YAC5B,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAA+B,CAAA;YACvE,IAAI,IAAI,EAAE;gBACR,OAAO,IAAI,CAAA;aACZ;iBAAM;gBACL,MAAM,OAAO,CAAC,qBAAqB,GAAG,IAAI,GAAG,GAAG,CAAC,CAAA;aAClD;SACF;KACF;IACD,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE;QACP,OAAO,EAAE,OAAO;QAChB,aAAa,EAAE,aAAa;QAC5B,OAAO,EAAE,OAAO;QAChB,SAAS,EAAE,SAAS;KACrB;IACD,QAAQ,EAAE;QACR,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,EAAE;QACL,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;QACN,CAAC,EAAE,GAAG;KACP;IACD,KAAK,EAAE,KAAK;IACZ,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,KAAK;EACf;AAED,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;AAEnC,SAAS,SAAS,CAAE,QAAuB,EAAE,UAAuB;;IAGlE,IAAI,GAAG,GAAkB,EAAE,CAAA;IAC3B,SAAS,CAAC,GAAG,EAAE,aAAa,CAAC,CAAA;IAE7B,IAAI,UAAU,EAAE;QACd,SAAS,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;KAC3B;IAED,IAAI,QAAQ,EAAE;QACZ,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;KACzB;IAEC,GAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEhC,OAAO,GAAiB,CAAA;AAC1B;;AC1GA;SAEwB,OAAO,CAAE,GAAW,EAAE,GAAmB;IAC/D,IAAI,OAAO,GAAe,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;IAC9C,IAAI,IAAI,GAAG,QAAQ,CAAA;;;IAInB,IAAI,OAAO,CAAC,KAAK,EAAE;;;QAGjB,IAAI,SAAS,EAAE;YACb,IAAI,GAAG,SAAS,CAAA;SACjB;aAAM;YACL,MAAM,OAAO,CAAC,8CAA8C,CAAC,CAAA;SAC9D;KACF;;IAGD,IAAI;QACF,OAAO,IAAI,IAAI,CACb,OAAO,CAAC,OAAO,EACf,GAAG;QACH,IAAI;QACJ,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CACV,CAAA;KACtB;IAAC,OAAO,CAAC,EAAE;QACV,IAAI,CAAC,YAAY,WAAW,EAAE;YAC5B,MAAM,OAAO,CACX,yBAAyB;gBACvB,CAAC,CAAC,OAAO;gBACT,IAAI;gBACJ,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACrC,IAAI;gBACJ,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAChC,CAAA;SACF;aAAM;YACL,MAAM,CAAC,CAAA;SACR;KACF;AACH;;ACnDA,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AACtB,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AAC1B,IAAI,IAAI,GAAG,SAAS,CAAA;AAqBpB;AAEA;;;;;;;;;AAUA,SAAS,gBAAgB,CAAE,IAAY,EAAE,UAAkB,EAAE,WAAqB;IAChF,IAAI,WAAW,GAAG,IAAI,CAAC,OAAO,CAC5B,WAAW,GAAG,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;IACnD,IAAI;KACL,CAAA;IACD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,CAAC,GAAG,EAAE;QACR,WAAW,IAAI,OAAO,CAAA;KACvB;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED;;;;;;;AAQA,SAAS,OAAO,CAAE,IAAY,EAAE,OAAmB;IACjD,IAAI,WAAW,CAAA;IACf,IAAI,QAAQ,CAAA;IACZ,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IACzB,IAAI,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;;IAG1C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE;QACzB,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,CAAC,CAAA;KACpF;SAAM;;;QAGL,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAA;YACnD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;gBAC3B,WAAW,GAAG,QAAQ,CAAA;aACvB;SACF;;QAED,IAAI,CAAC,WAAW,EAAE;YAChB,IACE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpB,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;oBACpB,QAAQ,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAA;oBAC1C,OAAO,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;iBAC/B,CAAC,EACF;gBACA,WAAW,GAAG,QAAQ,CAAA;aACvB;SACF;QACD,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,OAAO,CAAC,mCAAmC,GAAG,IAAI,GAAG,GAAG,CAAC,CAAA;SAChE;KACF;IACD,OAAO,WAAW,CAAA;AACpB,CAAC;AAED,SAAS,QAAQ,CAAE,QAAgB;IACjC,OAAO,EAAE;SACN,YAAY,CAAC,QAAQ,CAAC;SACtB,QAAQ,EAAE;SACV,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AACtB,CAAC;AAED,SAAS,QAAQ,CAAE,QAAgB,EAAE,OAA0B;IAC7D,IAAI,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAA;IAC/B,IAAI,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACjC,IAAI;QACF,IAAI,gBAAgB,GAAGC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;QAChD,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAE,MAAqB,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAA;QAClF,OAAO,gBAAgB,CAAA;KACxB;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,OAAO,CAAC,gBAAgB,GAAG,QAAQ,GAAG,SAAS,CAAC,CAAA;KACvD;AACH;;AC7GA;AA0BA;AAEA;;;;;;;;;;;;;AAcA,SAAS,WAAW,CAAE,OAAoB;IACxC,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAA;IAE/B,IAAI,OAAO,CAAC,KAAK,EAAE;QACjB,IAAI,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAClD,IAAI,IAAI,EAAE;YACR,OAAO,IAAI,CAAA;SACZ;aAAM;YACL,OAAO,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;SACnC;KACF;IAED,OAAO,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAA;AAC7C,CAAC;AAED;;;;;;;;;;AAWA,SAAS,cAAc,CAAE,OAAoB,EAAE,IAAY,EAAE,EAAc;IACzE,IAAI,MAAM,CAAA;IACV,IAAI,CAAC,EAAE,EAAE;;QAEP,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE;YACrC,OAAO,IAAI,WAAW,CAAC,UAAU,OAAiB,EAAE,MAAgB;gBAClE,IAAI;oBACF,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;oBAC5C,OAAO,CAAC,MAAM,CAAC,CAAA;iBAChB;gBAAC,OAAO,GAAG,EAAE;oBACZ,MAAM,CAAC,GAAG,CAAC,CAAA;iBACZ;aACF,CAAC,CAAA;SACH;aAAM;YACL,MAAM,OAAO,CAAC,uEAAuE,CAAC,CAAA;SACvF;KACF;SAAM;QACL,IAAI;YACF,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;SACxC;QAAC,OAAO,GAAG,EAAE;YACZ,OAAO,EAAE,CAAC,GAAG,CAAC,CAAA;SACf;KACF;AACH,CAAC;AAED;;;;;;;;;;;AAYA,SAAS,WAAW,CAAE,IAAY,EAAE,OAAmB;;IAErD,IAAI,cAAc,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;;IAE7E,OAAO,WAAW,CAAC,cAA6B,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,UAAU,CAAE,QAAgB,EAAE,IAAa,EAAE,EAAe;IACnE,IAAI,GAAG,IAAI,IAAI,EAAE,CAAA;IACjB,IAAI,MAAM,GAAgB,SAAS,CAAE,IAAsB,CAAgB,CAAA;;IAG3E,IAAI,IAAI,CAAC,QAAQ,EAAE;;QAEjB,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE;YACvB,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAA;SACnC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE;YAC/B,MAAM,CAAC,KAAK,GAAG,IAAI,CAAA;SACpB;;;QAGD,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAA;QAE5C,IAAI,QAAQ,EAAE;YACZ,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;SAC5B;KACF;IAED,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAE1B,OAAO,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,EAAgB,CAAC,CAAA;AACvD;;ACzHA;SAEgB,iBAAiB,CAC/B,OAA2B,EAC3B,MAA0B,EAC1B,MAAkB;IAElB,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,MAAM,OAAO,CAAC,4CAA4C,CAAC,CAAA;KAC5D;IACD,OAAO,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AAC1E,CAAC;SAEe,iBAAiB,CAC/B,OAA2B,EAC3B,MAA0B,EAC1B,MAAkB;IAElB,IAAI,IAAI,GAAgB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAE/C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACtC,IAAI,YAAY,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QAC5B,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,EAAE,CAAA;KAC9C;IAED,OAAO,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC7D;;AChCA;AAEA,SAASC,aAAW,CAAE,QAAmC,EAAE,OAAmB;IAC5E,IAAI,YAAY,CAAA;IAEhB,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAChF,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;KACnD;IAED,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;QAClC,YAAY,GAAG,QAAQ,CAAA;KACxB;SAAM;QACL,YAAY,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;KAC1C;IAED,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE;QACjC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,CAAA;KAC7D;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;SAEuB,MAAM,CAC5B,QAAmC,EACnC,IAAY,EACZ,GAAmB,EACnB,EAAe;IAEf,IAAI,OAAO,GAAG,SAAS,CAAC,GAAG,IAAI,EAAE,CAAC,CAAA;IAElC,IAAI,OAAO,CAAC,KAAK,EAAE;QACjB,IAAI,MAAM,CAAA;QACV,IAAI,CAAC,EAAE,EAAE;;YAEP,IAAI,OAAO,WAAW,KAAK,UAAU,EAAE;gBACrC,OAAO,IAAI,WAAW,CAAC,UAAU,OAAiB,EAAE,MAAgB;oBAClE,IAAI;wBACF,MAAM,GAAGA,aAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;wBACtD,OAAO,CAAC,MAAM,CAAC,CAAA;qBAChB;oBAAC,OAAO,GAAG,EAAE;wBACZ,MAAM,CAAC,GAAG,CAAC,CAAA;qBACZ;iBACF,CAAC,CAAA;aACH;iBAAM;gBACL,MAAM,OAAO,CAAC,uEAAuE,CAAC,CAAA;aACvF;SACF;aAAM;YACL,IAAI;gBACFA,aAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAA;aAClD;YAAC,OAAO,GAAG,EAAE;gBACZ,OAAO,EAAE,CAAC,GAAG,CAAC,CAAA;aACf;SACF;KACF;SAAM;QACL,OAAOA,aAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;KACrD;AACH;;ACnEA;AAQA;AAEA,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAmC,CAAC,CAAA;AAClE,OAAO,CAAC,MAAM,CAAC,aAAa,EAAE,iBAAmC,CAAC;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/src/node_modules/squirrelly/dist/squirrelly.es.js b/src/node_modules/squirrelly/dist/squirrelly.es.js new file mode 100644 index 0000000..e783826 --- /dev/null +++ b/src/node_modules/squirrelly/dist/squirrelly.es.js @@ -0,0 +1,1154 @@ +// TODO: allow '-' to trim up until newline. Use [^\S\n\r] instead of \s +// TODO: only include trimLeft polyfill if not in ES6 +/* END TYPES */ +var promiseImpl = new Function('return this')().Promise; +var asyncFunc = false; +try { + asyncFunc = new Function('return (async function(){}).constructor')(); +} +catch (e) { + // We shouldn't actually ever have any other errors, but... + if (!(e instanceof SyntaxError)) { + throw e; + } +} +function hasOwnProp(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} +function copyProps(toObj, fromObj, notConfig) { + for (var key in fromObj) { + if (hasOwnProp(fromObj, key)) { + if (fromObj[key] != null && + typeof fromObj[key] == 'object' && + (key === 'storage' || key === 'prefixes') && + !notConfig // not called from Cache.load + ) { + // plugins or storage + // Note: this doesn't merge from initial config! + // Deep clone instead of assigning + // TODO: run checks on this + toObj[key] = copyProps(/*toObj[key] ||*/ {}, fromObj[key]); + } + else { + toObj[key] = fromObj[key]; + } + } + } + return toObj; +} +function trimWS(str, env, wsLeft, wsRight) { + var leftTrim; + var rightTrim; + if (typeof env.autoTrim === 'string') { + leftTrim = rightTrim = env.autoTrim; + // Don't need to check if env.autoTrim is false + // Because leftTrim, rightTrim are initialized as falsy + } + else if (Array.isArray(env.autoTrim)) { + // kinda confusing + // but _}} will trim the left side of the following string + leftTrim = env.autoTrim[1]; + rightTrim = env.autoTrim[0]; + } + if (wsLeft || wsLeft === false) { + leftTrim = wsLeft; + } + if (wsRight || wsRight === false) { + rightTrim = wsRight; + } + if (leftTrim === 'slurp' && rightTrim === 'slurp') { + return str.trim(); + } + if (leftTrim === '_' || leftTrim === 'slurp') { + // console.log('trimming left' + leftTrim) + // full slurp + // eslint-disable-next-line no-extra-boolean-cast + if (!!String.prototype.trimLeft) { + str = str.trimLeft(); + } + else { + str = str.replace(/^[\s\uFEFF\xA0]+/, ''); + } + } + else if (leftTrim === '-' || leftTrim === 'nl') { + // console.log('trimming left nl' + leftTrim) + // nl trim + str = str.replace(/^(?:\n|\r|\r\n)/, ''); + } + if (rightTrim === '_' || rightTrim === 'slurp') { + // console.log('trimming right' + rightTrim) + // full slurp + // eslint-disable-next-line no-extra-boolean-cast + if (!!String.prototype.trimRight) { + str = str.trimRight(); + } + else { + str = str.replace(/[\s\uFEFF\xA0]+$/, ''); + } + } + else if (rightTrim === '-' || rightTrim === 'nl') { + // console.log('trimming right nl' + rightTrim) + // nl trim + str = str.replace(/(?:\n|\r|\r\n)$/, ''); // TODO: make sure this gets \r\n + } + return str; +} + +/* END TYPES */ +var Cacher = /** @class */ (function () { + function Cacher(cache) { + this.cache = cache; + } + Cacher.prototype.define = function (key, val) { + this.cache[key] = val; + }; + Cacher.prototype.get = function (key) { + // string | array. + // TODO: allow array of keys to look down + // TODO: create plugin to allow referencing helpers, filters with dot notation + return this.cache[key]; + }; + Cacher.prototype.remove = function (key) { + delete this.cache[key]; + }; + Cacher.prototype.reset = function () { + this.cache = {}; + }; + Cacher.prototype.load = function (cacheObj) { + // TODO: this will err with deep objects and `storage` or `plugins` keys. + // Update Feb 26: EDITED so it shouldn't err + copyProps(this.cache, cacheObj, true); + }; + return Cacher; +}()); + +function setPrototypeOf(obj, proto) { + if (Object.setPrototypeOf) { + Object.setPrototypeOf(obj, proto); + } + else { + obj.__proto__ = proto; + } +} +function SqrlErr(message) { + var err = new Error(message); + setPrototypeOf(err, SqrlErr.prototype); + return err; +} +SqrlErr.prototype = Object.create(Error.prototype, { + name: { value: 'Squirrelly Error', enumerable: false } +}); +// TODO: Class transpilation adds a lot to the bundle size +function ParseErr(message, str, indx) { + var whitespace = str.slice(0, indx).split(/\n/); + var lineNo = whitespace.length; + var colNo = whitespace[lineNo - 1].length + 1; + message += + ' at line ' + + lineNo + + ' col ' + + colNo + + ':\n\n' + + ' ' + + str.split(/\n/)[lineNo - 1] + + '\n' + + ' ' + + Array(colNo).join(' ') + + '^'; + throw SqrlErr(message); +} + +/* END TYPES */ +var asyncRegExp = /^async +/; +var templateLitReg = /`(?:\\[\s\S]|\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\${)[^\\`])*`/g; +var singleQuoteReg = /'(?:\\[\s\w"'\\`]|[^\n\r'\\])*?'/g; +var doubleQuoteReg = /"(?:\\[\s\w"'\\`]|[^\n\r"\\])*?"/g; +var specialCharsReg = /[.*+\-?^${}()|[\]\\]/g; +function escapeRegExp(string) { + // From MDN + return specialCharsReg.test(string) + ? string.replace(specialCharsReg, '\\$&') // $& means the whole matched string + : string; +} +function parse(str, env) { + /* Adding for EJS compatibility */ + if (env.rmWhitespace) { + // Code taken directly from EJS + // Have to use two separate replaces here as `^` and `$` operators don't + // work well with `\r` and empty lines don't work well with the `m` flag. + // Essentially, this replaces the whitespace at the beginning and end of + // each line and removes multiple newlines. + str = str.replace(/[\r\n]+/g, '\n').replace(/^\s+|\s+$/gm, ''); + } + /* End rmWhitespace option */ + templateLitReg.lastIndex = 0; + singleQuoteReg.lastIndex = 0; + doubleQuoteReg.lastIndex = 0; + var envPrefixes = env.prefixes; + var prefixes = [ + envPrefixes.h, + envPrefixes.b, + envPrefixes.i, + envPrefixes.r, + envPrefixes.c, + envPrefixes.e + ].reduce(function (accumulator, prefix) { + if (accumulator && prefix) { + return accumulator + '|' + escapeRegExp(prefix); + } + else if (prefix) { + // accumulator is empty + return escapeRegExp(prefix); + } + else { + // prefix and accumulator are both empty strings + return accumulator; + } + }, ''); + var parseCloseReg = new RegExp('([|()]|=>)|' + // powerchars + '(\'|"|`|\\/\\*)|\\s*((\\/)?(-|_)?' + // comments, strings + escapeRegExp(env.tags[1]) + + ')', 'g'); + var tagOpenReg = new RegExp('([^]*?)' + escapeRegExp(env.tags[0]) + '(-|_)?\\s*(' + prefixes + ')?\\s*', 'g'); + var startInd = 0; + var trimNextLeftWs = false; + function parseTag(tagOpenIndex, currentType) { + var currentObj = { f: [] }; + var numParens = 0; + var currentAttribute = 'c'; // default - Valid values: 'c'=content, 'f'=filter, 'fp'=filter params, 'p'=param, 'n'=name + if (currentType === 'h' || currentType === 'b' || currentType === 'c') { + currentAttribute = 'n'; + } + else if (currentType === 'r') { + currentObj.raw = true; + currentType = 'i'; + } + function addAttrValue(indx) { + var valUnprocessed = str.slice(startInd, indx); + // console.log(valUnprocessed) + var val = valUnprocessed.trim(); + if (currentAttribute === 'f') { + if (val === 'safe') { + currentObj.raw = true; + } + else { + if (env.async && asyncRegExp.test(val)) { + val = val.replace(asyncRegExp, ''); + currentObj.f.push([val, '', true]); + } + else { + currentObj.f.push([val, '']); + } + } + } + else if (currentAttribute === 'fp') { + currentObj.f[currentObj.f.length - 1][1] += val; + } + else if (currentAttribute === 'err') { + if (val) { + var found = valUnprocessed.search(/\S/); + ParseErr('invalid syntax', str, startInd + found); + } + } + else { + // if (currentObj[currentAttribute]) { // TODO make sure no errs + // currentObj[currentAttribute] += val + // } else { + currentObj[currentAttribute] = val; + // } + } + startInd = indx + 1; + } + parseCloseReg.lastIndex = startInd; + var m; + // tslint:disable-next-line:no-conditional-assignment + while ((m = parseCloseReg.exec(str)) !== null) { + var char = m[1]; + var punctuator = m[2]; + var tagClose = m[3]; + var slash = m[4]; + var wsControl = m[5]; + var i = m.index; + if (char) { + // Power character + if (char === '(') { + if (numParens === 0) { + if (currentAttribute === 'n') { + addAttrValue(i); + currentAttribute = 'p'; + } + else if (currentAttribute === 'f') { + addAttrValue(i); + currentAttribute = 'fp'; + } + } + numParens++; + } + else if (char === ')') { + numParens--; + if (numParens === 0 && currentAttribute !== 'c') { + // Then it's closing a filter, block, or helper + addAttrValue(i); + currentAttribute = 'err'; // Reset the current attribute + } + } + else if (numParens === 0 && char === '|') { + addAttrValue(i); // this should actually always be whitespace or empty + currentAttribute = 'f'; + } + else if (char === '=>') { + addAttrValue(i); + startInd += 1; // this is 2 chars + currentAttribute = 'res'; + } + } + else if (punctuator) { + if (punctuator === '/*') { + var commentCloseInd = str.indexOf('*/', parseCloseReg.lastIndex); + if (commentCloseInd === -1) { + ParseErr('unclosed comment', str, m.index); + } + parseCloseReg.lastIndex = commentCloseInd + 2; // since */ is 2 characters, and we're using indexOf rather than a RegExp + } + else if (punctuator === "'") { + singleQuoteReg.lastIndex = m.index; + var singleQuoteMatch = singleQuoteReg.exec(str); + if (singleQuoteMatch) { + parseCloseReg.lastIndex = singleQuoteReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + else if (punctuator === '"') { + doubleQuoteReg.lastIndex = m.index; + var doubleQuoteMatch = doubleQuoteReg.exec(str); + if (doubleQuoteMatch) { + parseCloseReg.lastIndex = doubleQuoteReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + else if (punctuator === '`') { + templateLitReg.lastIndex = m.index; + var templateLitMatch = templateLitReg.exec(str); + if (templateLitMatch) { + parseCloseReg.lastIndex = templateLitReg.lastIndex; + } + else { + ParseErr('unclosed string', str, m.index); + } + } + } + else if (tagClose) { + addAttrValue(i); + startInd = i + m[0].length; + tagOpenReg.lastIndex = startInd; + // console.log('tagClose: ' + startInd) + trimNextLeftWs = wsControl; + if (slash && currentType === 'h') { + currentType = 's'; + } // TODO throw err + currentObj.t = currentType; + return currentObj; + } + } + ParseErr('unclosed tag', str, tagOpenIndex); + return currentObj; // To prevent TypeScript from erroring + } + function parseContext(parentObj, firstParse) { + parentObj.b = []; // assume there will be blocks // TODO: perf optimize this + parentObj.d = []; + var lastBlock = false; + var buffer = []; + function pushString(strng, shouldTrimRightOfString) { + if (strng) { + // if string is truthy it must be of type 'string' + // TODO: benchmark replace( /(\\|')/g, '\\$1') + strng = trimWS(strng, env, trimNextLeftWs, // this will only be false on the first str, the next ones will be null or undefined + shouldTrimRightOfString); + if (strng) { + // replace \ with \\, ' with \' + strng = strng.replace(/\\|'/g, '\\$&').replace(/\r\n|\n|\r/g, '\\n'); + // we're going to convert all CRLF to LF so it doesn't take more than one replace + buffer.push(strng); + } + } + } + // Random TODO: parentObj.b doesn't need to have t: # + var tagOpenMatch; + // tslint:disable-next-line:no-conditional-assignment + while ((tagOpenMatch = tagOpenReg.exec(str)) !== null) { + var precedingString = tagOpenMatch[1]; + var shouldTrimRightPrecedingString = tagOpenMatch[2]; + var prefix = tagOpenMatch[3] || ''; + var prefixType; + for (var key in envPrefixes) { + if (envPrefixes[key] === prefix) { + prefixType = key; + break; + } + } + pushString(precedingString, shouldTrimRightPrecedingString); + startInd = tagOpenMatch.index + tagOpenMatch[0].length; + if (!prefixType) { + ParseErr('unrecognized tag type: ' + prefix, str, startInd); + } + var currentObj = parseTag(tagOpenMatch.index, prefixType); + // ===== NOW ADD THE OBJECT TO OUR BUFFER ===== + var currentType = currentObj.t; + if (currentType === 'h') { + var hName = currentObj.n || ''; + if (env.async && asyncRegExp.test(hName)) { + currentObj.a = true; + currentObj.n = hName.replace(asyncRegExp, ''); + } + currentObj = parseContext(currentObj); // currentObj is the parent object + buffer.push(currentObj); + } + else if (currentType === 'c') { + // tag close + if (parentObj.n === currentObj.n) { + if (lastBlock) { + // If there's a previous block + lastBlock.d = buffer; + parentObj.b.push(lastBlock); + } + else { + parentObj.d = buffer; + } + // console.log('parentObj: ' + JSON.stringify(parentObj)) + return parentObj; + } + else { + ParseErr("Helper start and end don't match", str, tagOpenMatch.index + tagOpenMatch[0].length); + } + } + else if (currentType === 'b') { + // block + // TODO: make sure async stuff inside blocks are recognized + if (lastBlock) { + // If there's a previous block + lastBlock.d = buffer; + parentObj.b.push(lastBlock); + } + else { + parentObj.d = buffer; + } + var blockName = currentObj.n || ''; + if (env.async && asyncRegExp.test(blockName)) { + currentObj.a = true; + currentObj.n = blockName.replace(asyncRegExp, ''); + } + lastBlock = currentObj; // Set the 'lastBlock' object to the value of the current block + buffer = []; + } + else if (currentType === 's') { + var selfClosingHName = currentObj.n || ''; + if (env.async && asyncRegExp.test(selfClosingHName)) { + currentObj.a = true; + currentObj.n = selfClosingHName.replace(asyncRegExp, ''); + } + buffer.push(currentObj); + } + else { + buffer.push(currentObj); + } + // ===== DONE ADDING OBJECT TO BUFFER ===== + } + if (firstParse) { + pushString(str.slice(startInd, str.length), false); + parentObj.d = buffer; + } + else { + throw SqrlErr('unclosed helper "' + parentObj.n + '"'); + // It should have returned by now + } + return parentObj; + } + var parseResult = parseContext({ f: [] }, true); + // console.log(JSON.stringify(parseResult)) + if (env.plugins) { + for (var i = 0; i < env.plugins.length; i++) { + var plugin = env.plugins[i]; + if (plugin.processAST) { + parseResult.d = plugin.processAST(parseResult.d, env); + } + } + } + return parseResult.d; // Parse the very outside context +} + +// import SqrlErr from './err' +/* END TYPES */ +function compileToString(str, env) { + var buffer = parse(str, env); + var res = "var tR='';" + + (env.useWith ? 'with(' + env.varName + '||{}){' : '') + + compileScope(buffer, env) + + 'if(cb){cb(null,tR)} return tR' + + (env.useWith ? '}' : ''); + if (env.plugins) { + for (var i = 0; i < env.plugins.length; i++) { + var plugin = env.plugins[i]; + if (plugin.processFnString) { + res = plugin.processFnString(res, env); + } + } + } + return res; + // TODO: is `return cb()` necessary, or could we just do `cb()` +} +function filter(str, filters) { + for (var i = 0; i < filters.length; i++) { + var name = filters[i][0]; + var params = filters[i][1]; + var isFilterAsync = filters[i][2]; + // if (isFilterAsync && !env.async) { + // throw SqrlErr("Async filter '" + name + "' in non-async env") + // } + // Let the JS compiler do this, compile() will catch it + str = (isFilterAsync ? 'await ' : '') + "c.l('F','" + name + "')(" + str; + if (params) { + str += ',' + params; + } + str += ')'; + } + return str; +} +// TODO: Use type intersections for TemplateObject, etc. +// so I don't have to make properties mandatory +function compileHelper(env, res, descendants, params, isAsync, name) { + var ret = '{exec:' + + (isAsync ? 'async ' : '') + + compileScopeIntoFunction(descendants, res, env) + + ',params:[' + + params + + ']'; + if (name) { + ret += ",name:'" + name + "'"; + } + if (isAsync) { + ret += ',async:true'; + } + ret += '}'; + return ret; +} +function compileBlocks(blocks, env) { + var ret = '['; + for (var i = 0; i < blocks.length; i++) { + var block = blocks[i]; + ret += compileHelper(env, block.res || '', block.d, block.p || '', block.a, block.n); + if (i < blocks.length) { + ret += ','; + } + } + ret += ']'; + return ret; +} +function compileScopeIntoFunction(buff, res, env) { + return 'function(' + res + "){var tR='';" + compileScope(buff, env) + 'return tR}'; +} +function compileScope(buff, env) { + var i = 0; + var buffLength = buff.length; + var returnStr = ''; + for (i; i < buffLength; i++) { + var currentBlock = buff[i]; + if (typeof currentBlock === 'string') { + var str = currentBlock; + // we know string exists + returnStr += "tR+='" + str + "';"; + } + else { + var type = currentBlock.t; // h, s, e, i + var content = currentBlock.c || ''; + var filters = currentBlock.f; + var name = currentBlock.n || ''; + var params = currentBlock.p || ''; + var res = currentBlock.res || ''; + var blocks = currentBlock.b; + var isAsync = !!currentBlock.a; // !! is to booleanize it + // if (isAsync && !env.async) { + // throw SqrlErr("Async block or helper '" + name + "' in non-async env") + // } + // Let compiler do this + if (type === 'i') { + if (env.defaultFilter) { + content = "c.l('F','" + env.defaultFilter + "')(" + content + ')'; + } + var filtered = filter(content, filters); + if (!currentBlock.raw && env.autoEscape) { + filtered = "c.l('F','e')(" + filtered + ')'; + } + returnStr += 'tR+=' + filtered + ';'; + // reference + } + else if (type === 'h') { + // helper + if (env.storage.nativeHelpers.get(name)) { + returnStr += env.storage.nativeHelpers.get(name)(currentBlock, env); + } + else { + var helperReturn = (isAsync ? 'await ' : '') + + "c.l('H','" + + name + + "')(" + + compileHelper(env, res, currentBlock.d, params, isAsync); + if (blocks) { + helperReturn += ',' + compileBlocks(blocks, env); + } + else { + helperReturn += ',[]'; + } + helperReturn += ',c)'; + returnStr += 'tR+=' + filter(helperReturn, filters) + ';'; + } + } + else if (type === 's') { + // self-closing helper + returnStr += + 'tR+=' + + filter((isAsync ? 'await ' : '') + "c.l('H','" + name + "')({params:[" + params + ']},[],c)', filters) + + ';'; + } + else if (type === 'e') { + // execute + returnStr += content + '\n'; + } + } + } + return returnStr; +} + +function errWithBlocksOrFilters(name, blocks, // false means don't check +filters, native) { + if (blocks && blocks.length > 0) { + throw SqrlErr((native ? 'Native' : '') + "Helper '" + name + "' doesn't accept blocks"); + } + if (filters && filters.length > 0) { + throw SqrlErr((native ? 'Native' : '') + "Helper '" + name + "' doesn't accept filters"); + } +} +/* ASYNC LOOP FNs */ +function asyncArrLoop(arr, index, fn, res, cb) { + fn(arr[index], index).then(function (val) { + res += val; + if (index === arr.length - 1) { + cb(res); + } + else { + asyncArrLoop(arr, index + 1, fn, res, cb); + } + }); +} +function asyncObjLoop(obj, keys, index, fn, res, cb) { + fn(keys[index], obj[keys[index]]).then(function (val) { + res += val; + if (index === keys.length - 1) { + cb(res); + } + else { + asyncObjLoop(obj, keys, index + 1, fn, res, cb); + } + }); +} +var escMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', +}; +function replaceChar(s) { + return escMap[s]; +} +function XMLEscape(str) { + // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized. + var newStr = String(str); + if (/[&<>"']/.test(newStr)) { + return newStr.replace(/[&<>"']/g, replaceChar); + } + else { + return newStr; + } +} + +/* END TYPES */ +var templates = new Cacher({}); +/* ASYNC LOOP FNs */ +var helpers = new Cacher({ + each: function (content, blocks) { + var res = ''; + var arr = content.params[0]; + errWithBlocksOrFilters('each', blocks, false); + if (content.async) { + return new Promise(function (resolve) { + asyncArrLoop(arr, 0, content.exec, res, resolve); + }); + } + else { + for (var i = 0; i < arr.length; i++) { + res += content.exec(arr[i], i); + } + return res; + } + }, + foreach: function (content, blocks) { + var obj = content.params[0]; + errWithBlocksOrFilters('foreach', blocks, false); + if (content.async) { + return new Promise(function (resolve) { + asyncObjLoop(obj, Object.keys(obj), 0, content.exec, '', resolve); + }); + } + else { + var res = ''; + for (var key in obj) { + if (!hasOwnProp(obj, key)) + continue; + res += content.exec(key, obj[key]); // todo: check on order + } + return res; + } + }, + include: function (content, blocks, config) { + errWithBlocksOrFilters('include', blocks, false); + var template = config.storage.templates.get(content.params[0]); + if (!template) { + throw SqrlErr('Could not fetch template "' + content.params[0] + '"'); + } + return template(content.params[1], config); + }, + extends: function (content, blocks, config) { + var data = content.params[1] || {}; + data.content = content.exec(); + for (var i = 0; i < blocks.length; i++) { + var currentBlock = blocks[i]; + data[currentBlock.name] = currentBlock.exec(); + } + var template = config.storage.templates.get(content.params[0]); + if (!template) { + throw SqrlErr('Could not fetch template "' + content.params[0] + '"'); + } + return template(data, config); + }, + useScope: function (content, blocks) { + errWithBlocksOrFilters('useScope', blocks, false); + return content.exec(content.params[0]); + } +}); +var nativeHelpers = new Cacher({ + if: function (buffer, env) { + errWithBlocksOrFilters('if', false, buffer.f, true); + var returnStr = 'if(' + buffer.p + '){' + compileScope(buffer.d, env) + '}'; + if (buffer.b) { + for (var i = 0; i < buffer.b.length; i++) { + var currentBlock = buffer.b[i]; + if (currentBlock.n === 'else') { + returnStr += 'else{' + compileScope(currentBlock.d, env) + '}'; + } + else if (currentBlock.n === 'elif') { + returnStr += 'else if(' + currentBlock.p + '){' + compileScope(currentBlock.d, env) + '}'; + } + } + } + return returnStr; + }, + try: function (buffer, env) { + errWithBlocksOrFilters('try', false, buffer.f, true); + if (!buffer.b || buffer.b.length !== 1 || buffer.b[0].n !== 'catch') { + throw SqrlErr("native helper 'try' only accepts 1 block, 'catch'"); + } + var returnStr = 'try{' + compileScope(buffer.d, env) + '}'; + var currentBlock = buffer.b[0]; + returnStr += + 'catch' + + (currentBlock.res ? '(' + currentBlock.res + ')' : '') + + '{' + + compileScope(currentBlock.d, env) + + '}'; + return returnStr; + }, + block: function (buffer, env) { + errWithBlocksOrFilters('block', buffer.b, buffer.f, true); + var returnStr = 'if(!' + + env.varName + + '[' + + buffer.p + + ']){tR+=(' + + compileScopeIntoFunction(buffer.d, '', env) + + ')()}else{tR+=' + + env.varName + + '[' + + buffer.p + + ']}'; + return returnStr; + } +}); +var filters = new Cacher({ e: XMLEscape }); + +/* END TYPES */ +var defaultConfig = { + varName: 'it', + autoTrim: [false, 'nl'], + autoEscape: true, + defaultFilter: false, + tags: ['{{', '}}'], + l: function (container, name) { + if (container === 'H') { + var hRet = this.storage.helpers.get(name); + if (hRet) { + return hRet; + } + else { + throw SqrlErr("Can't find helper '" + name + "'"); + } + } + else if (container === 'F') { + var fRet = this.storage.filters.get(name); + if (fRet) { + return fRet; + } + else { + throw SqrlErr("Can't find filter '" + name + "'"); + } + } + }, + async: false, + storage: { + helpers: helpers, + nativeHelpers: nativeHelpers, + filters: filters, + templates: templates + }, + prefixes: { + h: '@', + b: '#', + i: '', + r: '*', + c: '/', + e: '!' + }, + cache: false, + plugins: [], + useWith: false +}; +defaultConfig.l.bind(defaultConfig); +function getConfig(override, baseConfig) { + // TODO: run more tests on this + var res = {}; // Linked + copyProps(res, defaultConfig); // Creates deep clone of res, 1 layer deep + if (baseConfig) { + copyProps(res, baseConfig); + } + if (override) { + copyProps(res, override); + } + res.l.bind(res); + return res; +} + +/* END TYPES */ +function compile(str, env) { + var options = getConfig(env || {}); + var ctor = Function; // constructor + /* ASYNC HANDLING */ + // The below code is modified from mde/ejs. All credit should go to them. + if (options.async) { + // Have to use generated function for this, since in envs without support, + // it breaks in parsing + if (asyncFunc) { + ctor = asyncFunc; + } + else { + throw SqrlErr("This environment doesn't support async/await"); + } + } + /* END ASYNC HANDLING */ + try { + return new ctor(options.varName, 'c', // SqrlConfig + 'cb', // optional callback + compileToString(str, options)); // eslint-disable-line no-new-func + } + catch (e) { + if (e instanceof SyntaxError) { + throw SqrlErr('Bad template syntax\n\n' + + e.message + + '\n' + + Array(e.message.length + 1).join('=') + + '\n' + + compileToString(str, options)); + } + else { + throw e; + } + } +} + +var fs = require('fs'); +var path = require('path'); +var _BOM = /^\uFEFF/; +/* END TYPES */ +/** + * Get the path to the included file from the parent file path and the + * specified path. + * + * @param {String} name specified path + * @param {String} parentfile parent file path + * @param {Boolean} [isDir=false] whether parent file path is a directory + * @return {String} + */ +function getWholeFilePath(name, parentfile, isDirectory) { + var includePath = path.resolve(isDirectory ? parentfile : path.dirname(parentfile), // returns directory the parent file is in + name // file + ); + var ext = path.extname(name); + if (!ext) { + includePath += '.sqrl'; + } + return includePath; +} +/** + * Get the path to the included file by Options + * + * @param {String} path specified path + * @param {Options} options compilation options + * @return {String} + */ +function getPath(path, options) { + var includePath; + var filePath; + var views = options.views; + var match = /^[A-Za-z]+:\\|^\//.exec(path); + // Abs path + if (match && match.length) { + includePath = getWholeFilePath(path.replace(/^\/*/, ''), options.root || '/', true); + } + else { + // Relative paths + // Look relative to a passed filename first + if (options.filename) { + filePath = getWholeFilePath(path, options.filename); + if (fs.existsSync(filePath)) { + includePath = filePath; + } + } + // Then look in any views directories + if (!includePath) { + if (Array.isArray(views) && + views.some(function (v) { + filePath = getWholeFilePath(path, v, true); + return fs.existsSync(filePath); + })) { + includePath = filePath; + } + } + if (!includePath) { + throw SqrlErr('Could not find the include file "' + path + '"'); + } + } + return includePath; +} +function readFile(filePath) { + return fs + .readFileSync(filePath) + .toString() + .replace(_BOM, ''); // TODO: is replacing BOM's necessary? +} +function loadFile(filePath, options) { + var config = getConfig(options); + var template = readFile(filePath); + try { + var compiledTemplate = compile(template, config); + config.storage.templates.define(config.filename, compiledTemplate); + return compiledTemplate; + } + catch (e) { + throw SqrlErr('Loading file: ' + filePath + ' failed'); + } +} + +// express is set like: app.engine('html', require('squirrelly').renderFile) +/* END TYPES */ +/** + * Get the template from a string or a file, either compiled on-the-fly or + * read from cache (if enabled), and cache the template if needed. + * + * If `options.cache` is true, this function reads the file from + * `options.filename` so it must be set prior to calling this function. + * + * @param {Options} options compilation options + * @param {String} [template] template source + * @return {(TemplateFunction|ClientFunction)} + * Depending on the value of `options.client`, either type might be returned. + * @static + */ +function handleCache(options) { + var filename = options.filename; + if (options.cache) { + var func = options.storage.templates.get(filename); + if (func) { + return func; + } + else { + return loadFile(filename, options); + } + } + return compile(readFile(filename), options); +} +/** + * Try calling handleCache with the given options and data and call the + * callback with the result. If an error occurs, call the callback with + * the error. Used by renderFile(). + * + * @param {Options} options compilation options + * @param {Object} data template data + * @param {RenderFileCallback} cb callback + * @static + */ +function tryHandleCache(options, data, cb) { + var result; + if (!cb) { + // No callback, try returning a promise + if (typeof promiseImpl === 'function') { + return new promiseImpl(function (resolve, reject) { + try { + result = handleCache(options)(data, options); + resolve(result); + } + catch (err) { + reject(err); + } + }); + } + else { + throw SqrlErr("Please provide a callback function, this env doesn't support Promises"); + } + } + else { + try { + handleCache(options)(data, options, cb); + } + catch (err) { + return cb(err); + } + } +} +/** + * Get the template function. + * + * If `options.cache` is `true`, then the template is cached. + * + * @param {String} path path for the specified file + * @param {Options} options compilation options + * @return {(TemplateFunction|ClientFunction)} + * Depending on the value of `options.client`, either type might be returned + * @static + */ +function includeFile(path, options) { + // the below creates a new options object, using the parent filepath of the old options object and the path + var newFileOptions = getConfig({ filename: getPath(path, options) }, options); + // TODO: make sure properties are currectly copied over + return handleCache(newFileOptions); +} +function renderFile(filename, data, cb) { + data = data || {}; + var Config = getConfig(data); + // TODO: make sure above doesn't error. We do set filename down below + if (data.settings) { + // Pull a few things from known locations + if (data.settings.views) { + Config.views = data.settings.views; + } + if (data.settings['view cache']) { + Config.cache = true; + } + // Undocumented after Express 2, but still usable, esp. for + // items that are unsafe to be passed along with data, like `root` + var viewOpts = data.settings['view options']; + if (viewOpts) { + copyProps(Config, viewOpts); + } + } + Config.filename = filename; // Make sure filename is right + return tryHandleCache(Config, data, cb); +} + +/* END TYPES */ +function includeFileHelper(content, blocks, config) { + if (blocks && blocks.length > 0) { + throw SqrlErr("Helper 'includeFile' doesn't accept blocks"); + } + return includeFile(content.params[0], config)(content.params[1], config); +} +function extendsFileHelper(content, blocks, config) { + var data = content.params[1] || {}; + data.content = content.exec(); + for (var i = 0; i < blocks.length; i++) { + var currentBlock = blocks[i]; + data[currentBlock.name] = currentBlock.exec(); + } + return includeFile(content.params[0], config)(data, config); +} + +/* END TYPES */ +function handleCache$1(template, options) { + var templateFunc; + if (options.cache && options.name && options.storage.templates.get(options.name)) { + return options.storage.templates.get(options.name); + } + if (typeof template === 'function') { + templateFunc = template; + } + else { + templateFunc = compile(template, options); + } + if (options.cache && options.name) { + options.storage.templates.define(options.name, templateFunc); + } + return templateFunc; +} +function render(template, data, env, cb) { + var options = getConfig(env || {}); + if (options.async) { + var result; + if (!cb) { + // No callback, try returning a promise + if (typeof promiseImpl === 'function') { + return new promiseImpl(function (resolve, reject) { + try { + result = handleCache$1(template, options)(data, options); + resolve(result); + } + catch (err) { + reject(err); + } + }); + } + else { + throw SqrlErr("Please provide a callback function, this env doesn't support Promises"); + } + } + else { + try { + handleCache$1(template, options)(data, options, cb); + } + catch (err) { + return cb(err); + } + } + } + else { + return handleCache$1(template, options)(data, options); + } +} + +/* Export file stuff */ +/* END TYPES */ +helpers.define('includeFile', includeFileHelper); +helpers.define('extendsFile', extendsFileHelper); + +export { renderFile as __express, compile, compileScope, compileScopeIntoFunction, compileToString, defaultConfig, filters, getConfig, helpers, loadFile, nativeHelpers, parse, render, renderFile, templates }; +//# sourceMappingURL=squirrelly.es.js.map diff --git a/src/node_modules/squirrelly/dist/squirrelly.es.js.map b/src/node_modules/squirrelly/dist/squirrelly.es.js.map new file mode 100644 index 0000000..2365aca --- /dev/null +++ b/src/node_modules/squirrelly/dist/squirrelly.es.js.map @@ -0,0 +1 @@ +{"version":3,"file":"squirrelly.es.js","sources":["../src/utils.ts","../src/storage.ts","../src/err.ts","../src/parse.ts","../src/compile-string.ts","../src/container-utils.ts","../src/containers.ts","../src/config.ts","../src/compile.ts","../src/file-utils.ts","../src/file-handlers.ts","../src/file-helpers.ts","../src/render.ts","../src/index.ts"],"sourcesContent":["// TODO: allow '-' to trim up until newline. Use [^\\S\\n\\r] instead of \\s\n// TODO: only include trimLeft polyfill if not in ES6\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\n\n/* END TYPES */\n\nexport var promiseImpl = new Function('return this')().Promise\n\nvar asyncFunc: FunctionConstructor | false = false\n\ntry {\n asyncFunc = new Function('return (async function(){}).constructor')()\n} catch (e) {\n // We shouldn't actually ever have any other errors, but...\n if (!(e instanceof SyntaxError)) {\n throw e\n }\n}\n\nexport { asyncFunc }\n\nexport function hasOwnProp (obj: object, prop: string) {\n return Object.prototype.hasOwnProperty.call(obj, prop)\n}\n\nexport function copyProps (toObj: T, fromObj: T, notConfig?: boolean) {\n for (var key in fromObj) {\n if (hasOwnProp((fromObj as unknown) as object, key)) {\n if (\n fromObj[key] != null &&\n typeof fromObj[key] == 'object' &&\n (key === 'storage' || key === 'prefixes') &&\n !notConfig // not called from Cache.load\n ) {\n // plugins or storage\n // Note: this doesn't merge from initial config!\n // Deep clone instead of assigning\n // TODO: run checks on this\n toObj[key] = copyProps(/*toObj[key] ||*/ {} as T[Extract], fromObj[key])\n } else {\n toObj[key] = fromObj[key]\n }\n }\n }\n return toObj\n}\n\nfunction trimWS (\n str: string,\n env: SqrlConfig,\n wsLeft: string | false,\n wsRight?: string | false\n): string {\n var leftTrim\n var rightTrim\n\n if (typeof env.autoTrim === 'string') {\n leftTrim = rightTrim = env.autoTrim\n // Don't need to check if env.autoTrim is false\n // Because leftTrim, rightTrim are initialized as falsy\n } else if (Array.isArray(env.autoTrim)) {\n // kinda confusing\n // but _}} will trim the left side of the following string\n leftTrim = env.autoTrim[1]\n rightTrim = env.autoTrim[0]\n }\n\n if (wsLeft || wsLeft === false) {\n leftTrim = wsLeft\n }\n\n if (wsRight || wsRight === false) {\n rightTrim = wsRight\n }\n\n if (leftTrim === 'slurp' && rightTrim === 'slurp') {\n return str.trim()\n }\n\n if (leftTrim === '_' || leftTrim === 'slurp') {\n // console.log('trimming left' + leftTrim)\n // full slurp\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!String.prototype.trimLeft) {\n str = str.trimLeft()\n } else {\n str = str.replace(/^[\\s\\uFEFF\\xA0]+/, '')\n }\n } else if (leftTrim === '-' || leftTrim === 'nl') {\n // console.log('trimming left nl' + leftTrim)\n // nl trim\n str = str.replace(/^(?:\\n|\\r|\\r\\n)/, '')\n }\n\n if (rightTrim === '_' || rightTrim === 'slurp') {\n // console.log('trimming right' + rightTrim)\n // full slurp\n // eslint-disable-next-line no-extra-boolean-cast\n if (!!String.prototype.trimRight) {\n str = str.trimRight()\n } else {\n str = str.replace(/[\\s\\uFEFF\\xA0]+$/, '')\n }\n } else if (rightTrim === '-' || rightTrim === 'nl') {\n // console.log('trimming right nl' + rightTrim)\n // nl trim\n str = str.replace(/(?:\\n|\\r|\\r\\n)$/, '') // TODO: make sure this gets \\r\\n\n }\n\n return str\n}\n\nexport { trimWS }\n","import { copyProps } from './utils'\n\n/* TYPES */\n\ninterface Dict {\n // Basically, an object where all keys point to a value of the same type\n [key: string]: T\n}\n\n/* END TYPES */\n\nclass Cacher {\n constructor (private cache: Dict) {}\n define (key: string, val: T) {\n this.cache[key] = val\n }\n get (key: string) {\n // string | array.\n // TODO: allow array of keys to look down\n // TODO: create plugin to allow referencing helpers, filters with dot notation\n return this.cache[key]\n }\n remove (key: string) {\n delete this.cache[key]\n }\n reset () {\n this.cache = {}\n }\n load (cacheObj: Dict) {\n // TODO: this will err with deep objects and `storage` or `plugins` keys.\n // Update Feb 26: EDITED so it shouldn't err\n copyProps(this.cache, cacheObj, true)\n }\n}\n\nexport { Cacher }\n","function setPrototypeOf (obj: any, proto: any) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(obj, proto)\n } else {\n obj.__proto__ = proto\n }\n}\n\nexport default function SqrlErr (message: string): Error {\n var err = new Error(message)\n setPrototypeOf(err, SqrlErr.prototype)\n return err\n}\n\nSqrlErr.prototype = Object.create(Error.prototype, {\n name: { value: 'Squirrelly Error', enumerable: false }\n})\n\n// TODO: Class transpilation adds a lot to the bundle size\n\nexport function ParseErr (message: string, str: string, indx: number) {\n var whitespace = str.slice(0, indx).split(/\\n/)\n\n var lineNo = whitespace.length\n var colNo = whitespace[lineNo - 1].length + 1\n message +=\n ' at line ' +\n lineNo +\n ' col ' +\n colNo +\n ':\\n\\n' +\n ' ' +\n str.split(/\\n/)[lineNo - 1] +\n '\\n' +\n ' ' +\n Array(colNo).join(' ') +\n '^'\n throw SqrlErr(message)\n}\n","import SqrlErr, { ParseErr } from './err'\nimport { trimWS } from './utils'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\n\nexport type TagType = 'h' | 'b' | 'i' | 'r' | 'c' | 'e' | 'q' | 's'\n// TODO: change to anagram \"QBIRCHES\"\nexport type TemplateAttribute = 'c' | 'f' | 'fp' | 'p' | 'n' | 'res' | 'err'\nexport type TemplateObjectAttribute = 'c' | 'p' | 'n' | 'res'\n\nexport type AstObject = string | TemplateObject\n\nexport type Filter = [string, string] | [string, string, true]\n// [name, params, async]\nexport interface TemplateObject {\n n?: string\n t?: 'h' | 'b' | 'i' | 'c' | 'q' | 'e' | 's'\n f: Array\n c?: string\n p?: string\n res?: string\n d?: Array\n raw?: boolean\n a?: boolean // async\n b?: Array\n}\n\nexport interface ParentTemplateObject extends TemplateObject {\n d: Array\n b: Array\n}\n\n/* END TYPES */\n\nvar asyncRegExp = /^async +/\n\nvar templateLitReg = /`(?:\\\\[\\s\\S]|\\${(?:[^{}]|{(?:[^{}]|{[^}]*})*})*}|(?!\\${)[^\\\\`])*`/g\n\nvar singleQuoteReg = /'(?:\\\\[\\s\\w\"'\\\\`]|[^\\n\\r'\\\\])*?'/g\n\nvar doubleQuoteReg = /\"(?:\\\\[\\s\\w\"'\\\\`]|[^\\n\\r\"\\\\])*?\"/g\n\nvar specialCharsReg = /[.*+\\-?^${}()|[\\]\\\\]/g\n\nfunction escapeRegExp (string: string) {\n // From MDN\n return specialCharsReg.test(string)\n ? string.replace(specialCharsReg, '\\\\$&') // $& means the whole matched string\n : string\n}\n\nexport default function parse (str: string, env: SqrlConfig): Array {\n /* Adding for EJS compatibility */\n if (env.rmWhitespace) {\n // Code taken directly from EJS\n // Have to use two separate replaces here as `^` and `$` operators don't\n // work well with `\\r` and empty lines don't work well with the `m` flag.\n // Essentially, this replaces the whitespace at the beginning and end of\n // each line and removes multiple newlines.\n str = str.replace(/[\\r\\n]+/g, '\\n').replace(/^\\s+|\\s+$/gm, '')\n }\n /* End rmWhitespace option */\n\n templateLitReg.lastIndex = 0\n singleQuoteReg.lastIndex = 0\n doubleQuoteReg.lastIndex = 0\n\n var envPrefixes = env.prefixes\n\n var prefixes = [\n envPrefixes.h,\n envPrefixes.b,\n envPrefixes.i,\n envPrefixes.r,\n envPrefixes.c,\n envPrefixes.e\n ].reduce(function (accumulator, prefix) {\n if (accumulator && prefix) {\n return accumulator + '|' + escapeRegExp(prefix)\n } else if (prefix) {\n // accumulator is empty\n return escapeRegExp(prefix)\n } else {\n // prefix and accumulator are both empty strings\n return accumulator\n }\n }, '')\n\n var parseCloseReg = new RegExp(\n '([|()]|=>)|' + // powerchars\n '(\\'|\"|`|\\\\/\\\\*)|\\\\s*((\\\\/)?(-|_)?' + // comments, strings\n escapeRegExp(env.tags[1]) +\n ')',\n 'g'\n )\n\n var tagOpenReg = new RegExp(\n '([^]*?)' + escapeRegExp(env.tags[0]) + '(-|_)?\\\\s*(' + prefixes + ')?\\\\s*',\n 'g'\n )\n\n var startInd = 0\n var trimNextLeftWs: string | false = false\n\n function parseTag (tagOpenIndex: number, currentType: TagType): TemplateObject {\n var currentObj: TemplateObject = { f: [] }\n var numParens = 0\n var currentAttribute: TemplateAttribute = 'c' // default - Valid values: 'c'=content, 'f'=filter, 'fp'=filter params, 'p'=param, 'n'=name\n\n if (currentType === 'h' || currentType === 'b' || currentType === 'c') {\n currentAttribute = 'n'\n } else if (currentType === 'r') {\n currentObj.raw = true\n currentType = 'i'\n }\n\n function addAttrValue (indx: number) {\n var valUnprocessed = str.slice(startInd, indx)\n // console.log(valUnprocessed)\n var val = valUnprocessed.trim()\n if (currentAttribute === 'f') {\n if (val === 'safe') {\n currentObj.raw = true\n } else {\n if (env.async && asyncRegExp.test(val)) {\n val = val.replace(asyncRegExp, '')\n currentObj.f.push([val, '', true])\n } else {\n currentObj.f.push([val, ''])\n }\n }\n } else if (currentAttribute === 'fp') {\n currentObj.f[currentObj.f.length - 1][1] += val\n } else if (currentAttribute === 'err') {\n if (val) {\n var found = valUnprocessed.search(/\\S/)\n ParseErr('invalid syntax', str, startInd + found)\n }\n } else {\n // if (currentObj[currentAttribute]) { // TODO make sure no errs\n // currentObj[currentAttribute] += val\n // } else {\n currentObj[currentAttribute] = val\n // }\n }\n startInd = indx + 1\n }\n\n parseCloseReg.lastIndex = startInd\n\n var m\n // tslint:disable-next-line:no-conditional-assignment\n while ((m = parseCloseReg.exec(str)) !== null) {\n var char = m[1]\n var punctuator = m[2]\n var tagClose = m[3]\n var slash = m[4]\n var wsControl = m[5]\n var i = m.index\n\n if (char) {\n // Power character\n if (char === '(') {\n if (numParens === 0) {\n if (currentAttribute === 'n') {\n addAttrValue(i)\n currentAttribute = 'p'\n } else if (currentAttribute === 'f') {\n addAttrValue(i)\n currentAttribute = 'fp'\n }\n }\n numParens++\n } else if (char === ')') {\n numParens--\n if (numParens === 0 && currentAttribute !== 'c') {\n // Then it's closing a filter, block, or helper\n addAttrValue(i)\n\n currentAttribute = 'err' // Reset the current attribute\n }\n } else if (numParens === 0 && char === '|') {\n addAttrValue(i) // this should actually always be whitespace or empty\n currentAttribute = 'f'\n } else if (char === '=>') {\n addAttrValue(i)\n startInd += 1 // this is 2 chars\n currentAttribute = 'res'\n }\n } else if (punctuator) {\n if (punctuator === '/*') {\n var commentCloseInd = str.indexOf('*/', parseCloseReg.lastIndex)\n if (commentCloseInd === -1) {\n ParseErr('unclosed comment', str, m.index)\n }\n parseCloseReg.lastIndex = commentCloseInd + 2 // since */ is 2 characters, and we're using indexOf rather than a RegExp\n } else if (punctuator === \"'\") {\n singleQuoteReg.lastIndex = m.index\n\n var singleQuoteMatch = singleQuoteReg.exec(str)\n if (singleQuoteMatch) {\n parseCloseReg.lastIndex = singleQuoteReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n } else if (punctuator === '\"') {\n doubleQuoteReg.lastIndex = m.index\n var doubleQuoteMatch = doubleQuoteReg.exec(str)\n\n if (doubleQuoteMatch) {\n parseCloseReg.lastIndex = doubleQuoteReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n } else if (punctuator === '`') {\n templateLitReg.lastIndex = m.index\n var templateLitMatch = templateLitReg.exec(str)\n if (templateLitMatch) {\n parseCloseReg.lastIndex = templateLitReg.lastIndex\n } else {\n ParseErr('unclosed string', str, m.index)\n }\n }\n } else if (tagClose) {\n addAttrValue(i)\n startInd = i + m[0].length\n tagOpenReg.lastIndex = startInd\n // console.log('tagClose: ' + startInd)\n trimNextLeftWs = wsControl\n if (slash && currentType === 'h') {\n currentType = 's'\n } // TODO throw err\n currentObj.t = currentType\n return currentObj\n }\n }\n ParseErr('unclosed tag', str, tagOpenIndex)\n return currentObj // To prevent TypeScript from erroring\n }\n\n function parseContext (parentObj: TemplateObject, firstParse?: boolean): ParentTemplateObject {\n parentObj.b = [] // assume there will be blocks // TODO: perf optimize this\n parentObj.d = []\n var lastBlock: ParentTemplateObject | false = false\n var buffer: Array = []\n\n function pushString (strng: string, shouldTrimRightOfString?: string | false) {\n if (strng) {\n // if string is truthy it must be of type 'string'\n\n // TODO: benchmark replace( /(\\\\|')/g, '\\\\$1')\n strng = trimWS(\n strng,\n env,\n trimNextLeftWs, // this will only be false on the first str, the next ones will be null or undefined\n shouldTrimRightOfString\n )\n\n if (strng) {\n // replace \\ with \\\\, ' with \\'\n\n strng = strng.replace(/\\\\|'/g, '\\\\$&').replace(/\\r\\n|\\n|\\r/g, '\\\\n')\n // we're going to convert all CRLF to LF so it doesn't take more than one replace\n\n buffer.push(strng)\n }\n }\n }\n\n // Random TODO: parentObj.b doesn't need to have t: #\n var tagOpenMatch\n // tslint:disable-next-line:no-conditional-assignment\n while ((tagOpenMatch = tagOpenReg.exec(str)) !== null) {\n var precedingString = tagOpenMatch[1]\n var shouldTrimRightPrecedingString = tagOpenMatch[2]\n var prefix = tagOpenMatch[3] || ''\n var prefixType: TagType | undefined\n\n for (var key in envPrefixes) {\n if (envPrefixes[key] === prefix) {\n prefixType = key as TagType\n break\n }\n }\n\n pushString(precedingString, shouldTrimRightPrecedingString)\n startInd = tagOpenMatch.index + tagOpenMatch[0].length\n\n if (!prefixType) {\n ParseErr('unrecognized tag type: ' + prefix, str, startInd)\n }\n\n var currentObj = parseTag(tagOpenMatch.index, prefixType as TagType)\n // ===== NOW ADD THE OBJECT TO OUR BUFFER =====\n\n var currentType = currentObj.t\n if (currentType === 'h') {\n var hName = currentObj.n || ''\n if (env.async && asyncRegExp.test(hName)) {\n currentObj.a = true\n currentObj.n = hName.replace(asyncRegExp, '')\n }\n currentObj = parseContext(currentObj) // currentObj is the parent object\n buffer.push(currentObj)\n } else if (currentType === 'c') {\n // tag close\n if (parentObj.n === currentObj.n) {\n if (lastBlock) {\n // If there's a previous block\n lastBlock.d = buffer\n parentObj.b.push(lastBlock)\n } else {\n parentObj.d = buffer\n }\n // console.log('parentObj: ' + JSON.stringify(parentObj))\n return parentObj as ParentTemplateObject\n } else {\n ParseErr(\n \"Helper start and end don't match\",\n str,\n tagOpenMatch.index + tagOpenMatch[0].length\n )\n }\n } else if (currentType === 'b') {\n // block\n // TODO: make sure async stuff inside blocks are recognized\n if (lastBlock) {\n // If there's a previous block\n lastBlock.d = buffer\n parentObj.b.push(lastBlock)\n } else {\n parentObj.d = buffer\n }\n\n var blockName = currentObj.n || ''\n if (env.async && asyncRegExp.test(blockName)) {\n currentObj.a = true\n currentObj.n = blockName.replace(asyncRegExp, '')\n }\n\n lastBlock = currentObj as ParentTemplateObject // Set the 'lastBlock' object to the value of the current block\n\n buffer = []\n } else if (currentType === 's') {\n var selfClosingHName = currentObj.n || ''\n if (env.async && asyncRegExp.test(selfClosingHName)) {\n currentObj.a = true\n currentObj.n = selfClosingHName.replace(asyncRegExp, '')\n }\n buffer.push(currentObj)\n } else {\n buffer.push(currentObj)\n }\n // ===== DONE ADDING OBJECT TO BUFFER =====\n }\n\n if (firstParse) {\n pushString(str.slice(startInd, str.length), false)\n parentObj.d = buffer\n } else {\n throw SqrlErr('unclosed helper \"' + parentObj.n + '\"')\n // It should have returned by now\n }\n\n return parentObj as ParentTemplateObject\n }\n\n var parseResult = parseContext({ f: [] }, true)\n // console.log(JSON.stringify(parseResult))\n if (env.plugins) {\n for (var i = 0; i < env.plugins.length; i++) {\n var plugin = env.plugins[i]\n if (plugin.processAST) {\n parseResult.d = plugin.processAST(parseResult.d, env)\n }\n }\n }\n return parseResult.d // Parse the very outside context\n}\n","import Parse from './parse'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { AstObject, Filter, ParentTemplateObject } from './parse'\ntype ParsedTagType = 'h' | 's' | 'e' | 'i'\n// import SqrlErr from './err'\n\n/* END TYPES */\n\nexport default function compileToString (str: string, env: SqrlConfig) {\n var buffer: Array = Parse(str, env)\n\n var res =\n \"var tR='';\" +\n (env.useWith ? 'with(' + env.varName + '||{}){' : '') +\n compileScope(buffer, env) +\n 'if(cb){cb(null,tR)} return tR' +\n (env.useWith ? '}' : '')\n\n if (env.plugins) {\n for (var i = 0; i < env.plugins.length; i++) {\n var plugin = env.plugins[i]\n if (plugin.processFnString) {\n res = plugin.processFnString(res, env)\n }\n }\n }\n\n return res\n\n // TODO: is `return cb()` necessary, or could we just do `cb()`\n}\n\nfunction filter (str: string, filters: Array) {\n for (var i = 0; i < filters.length; i++) {\n var name = filters[i][0]\n var params = filters[i][1]\n var isFilterAsync = filters[i][2]\n\n // if (isFilterAsync && !env.async) {\n // throw SqrlErr(\"Async filter '\" + name + \"' in non-async env\")\n // }\n // Let the JS compiler do this, compile() will catch it\n\n str = (isFilterAsync ? 'await ' : '') + \"c.l('F','\" + name + \"')(\" + str\n if (params) {\n str += ',' + params\n }\n str += ')'\n }\n return str\n}\n\n// TODO: Use type intersections for TemplateObject, etc.\n// so I don't have to make properties mandatory\n\nfunction compileHelper (\n env: SqrlConfig,\n res: string,\n descendants: Array,\n params: string,\n isAsync?: boolean,\n name?: string\n) {\n var ret =\n '{exec:' +\n (isAsync ? 'async ' : '') +\n compileScopeIntoFunction(descendants, res, env) +\n ',params:[' +\n params +\n ']'\n if (name) {\n ret += \",name:'\" + name + \"'\"\n }\n if (isAsync) {\n ret += ',async:true'\n }\n ret += '}'\n return ret\n}\n\nfunction compileBlocks (blocks: Array, env: SqrlConfig) {\n var ret = '['\n for (var i = 0; i < blocks.length; i++) {\n var block = blocks[i]\n ret += compileHelper(env, block.res || '', block.d, block.p || '', block.a, block.n)\n if (i < blocks.length) {\n ret += ','\n }\n }\n ret += ']'\n return ret\n}\n\nexport function compileScopeIntoFunction (buff: Array, res: string, env: SqrlConfig) {\n return 'function(' + res + \"){var tR='';\" + compileScope(buff, env) + 'return tR}'\n}\n\nexport function compileScope (buff: Array, env: SqrlConfig) {\n var i = 0\n var buffLength = buff.length\n var returnStr = ''\n\n for (i; i < buffLength; i++) {\n var currentBlock = buff[i]\n if (typeof currentBlock === 'string') {\n var str = currentBlock\n\n // we know string exists\n returnStr += \"tR+='\" + str + \"';\"\n } else {\n var type: ParsedTagType = currentBlock.t as ParsedTagType // h, s, e, i\n var content = currentBlock.c || ''\n var filters = currentBlock.f\n var name = currentBlock.n || ''\n var params = currentBlock.p || ''\n var res = currentBlock.res || ''\n var blocks = currentBlock.b\n var isAsync = !!currentBlock.a // !! is to booleanize it\n // if (isAsync && !env.async) {\n // throw SqrlErr(\"Async block or helper '\" + name + \"' in non-async env\")\n // }\n // Let compiler do this\n if (type === 'i') {\n if (env.defaultFilter) {\n content = \"c.l('F','\" + env.defaultFilter + \"')(\" + content + ')'\n }\n var filtered = filter(content, filters)\n if (!currentBlock.raw && env.autoEscape) {\n filtered = \"c.l('F','e')(\" + filtered + ')'\n }\n returnStr += 'tR+=' + filtered + ';'\n // reference\n } else if (type === 'h') {\n // helper\n if (env.storage.nativeHelpers.get(name)) {\n returnStr += env.storage.nativeHelpers.get(name)(currentBlock, env)\n } else {\n var helperReturn =\n (isAsync ? 'await ' : '') +\n \"c.l('H','\" +\n name +\n \"')(\" +\n compileHelper(env, res, (currentBlock as ParentTemplateObject).d, params, isAsync)\n if (blocks) {\n helperReturn += ',' + compileBlocks(blocks, env)\n } else {\n helperReturn += ',[]'\n }\n helperReturn += ',c)'\n\n returnStr += 'tR+=' + filter(helperReturn, filters) + ';'\n }\n } else if (type === 's') {\n // self-closing helper\n\n returnStr +=\n 'tR+=' +\n filter(\n (isAsync ? 'await ' : '') + \"c.l('H','\" + name + \"')({params:[\" + params + ']},[],c)',\n filters\n ) +\n ';'\n } else if (type === 'e') {\n // execute\n returnStr += content + '\\n'\n }\n }\n }\n\n return returnStr\n}\n","import SqrlErr from './err'\n\nexport function errWithBlocksOrFilters(\n name: string,\n blocks: Array | false, // false means don't check\n filters: Array | false,\n native?: boolean\n) {\n if (blocks && blocks.length > 0) {\n throw SqrlErr((native ? 'Native' : '') + \"Helper '\" + name + \"' doesn't accept blocks\")\n }\n if (filters && filters.length > 0) {\n throw SqrlErr((native ? 'Native' : '') + \"Helper '\" + name + \"' doesn't accept filters\")\n }\n}\n\n/* ASYNC LOOP FNs */\nexport function asyncArrLoop(\n arr: Array,\n index: number,\n fn: Function,\n res: string,\n cb: Function\n) {\n fn(arr[index], index).then(function (val: string) {\n res += val\n if (index === arr.length - 1) {\n cb(res)\n } else {\n asyncArrLoop(arr, index + 1, fn, res, cb)\n }\n })\n}\n\nexport function asyncObjLoop(\n obj: { [index: string]: any },\n keys: Array,\n index: number,\n fn: Function,\n res: string,\n cb: Function\n) {\n fn(keys[index], obj[keys[index]]).then(function (val: string) {\n res += val\n if (index === keys.length - 1) {\n cb(res)\n } else {\n asyncObjLoop(obj, keys, index + 1, fn, res, cb)\n }\n })\n}\n\nvar escMap: EscapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n}\n\nexport function replaceChar(s: string): string {\n return escMap[s]\n}\n\nexport function XMLEscape(str: unknown) {\n // To deal with XSS. Based on Escape implementations of Mustache.JS and Marko, then customized.\n var newStr = String(str)\n if (/[&<>\"']/.test(newStr)) {\n return newStr.replace(/[&<>\"']/g, replaceChar)\n } else {\n return newStr\n }\n}\n\n/* INTERFACES */\ninterface EscapeMap {\n '&': '&'\n '<': '<'\n '>': '>'\n '\"': '"'\n \"'\": '''\n [index: string]: string\n}\n","import { Cacher } from './storage'\nimport SqrlErr from './err'\nimport { compileScope, compileScopeIntoFunction } from './compile-string'\nimport { hasOwnProp } from './utils'\nimport { errWithBlocksOrFilters, asyncArrLoop, asyncObjLoop, XMLEscape } from './container-utils'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { TemplateFunction } from './compile'\nimport { ParentTemplateObject } from './parse'\n\nexport interface HelperContent {\n exec: Function\n params: Array\n async?: boolean\n}\n\nexport interface HelperBlock extends HelperContent {\n name: string\n}\n\nexport type HelperFunction = (\n content: HelperContent,\n blocks: Array,\n config: SqrlConfig\n) => string | Promise\n\nexport type FilterFunction = (...args: any[]) => any | Promise\n\ninterface IncludeHelperContent extends HelperContent {\n params: [string, object]\n}\n\ninterface GenericData {\n [index: string]: any\n}\n\n/* END TYPES */\n\nvar templates = new Cacher({})\n\n/* ASYNC LOOP FNs */\n\nvar helpers = new Cacher({\n each: function (content: HelperContent, blocks: Array) {\n var res = ''\n var arr = content.params[0]\n errWithBlocksOrFilters('each', blocks, false)\n\n if (content.async) {\n return new Promise(function (resolve) {\n asyncArrLoop(arr, 0, content.exec, res, resolve)\n })\n } else {\n for (var i = 0; i < arr.length; i++) {\n res += content.exec(arr[i], i)\n }\n return res\n }\n },\n foreach: function (content: HelperContent, blocks: Array) {\n var obj = content.params[0]\n errWithBlocksOrFilters('foreach', blocks, false)\n\n if (content.async) {\n return new Promise(function (resolve) {\n asyncObjLoop(obj, Object.keys(obj), 0, content.exec, '', resolve)\n })\n } else {\n var res = ''\n\n for (var key in obj) {\n if (!hasOwnProp(obj, key)) continue\n res += content.exec(key, obj[key]) // todo: check on order\n }\n return res\n }\n },\n include: function (\n content: IncludeHelperContent,\n blocks: Array,\n config: SqrlConfig\n ): string {\n errWithBlocksOrFilters('include', blocks, false)\n var template = config.storage.templates.get(content.params[0])\n if (!template) {\n throw SqrlErr('Could not fetch template \"' + content.params[0] + '\"')\n }\n return template(content.params[1], config)\n } as HelperFunction,\n extends: function (\n content: IncludeHelperContent,\n blocks: Array,\n config: SqrlConfig\n ): string {\n var data: GenericData = content.params[1] || {}\n data.content = content.exec()\n\n for (var i = 0; i < blocks.length; i++) {\n var currentBlock = blocks[i]\n data[currentBlock.name] = currentBlock.exec()\n }\n\n var template = config.storage.templates.get(content.params[0])\n if (!template) {\n throw SqrlErr('Could not fetch template \"' + content.params[0] + '\"')\n }\n return template(data, config)\n } as HelperFunction,\n useScope: function (content: HelperContent, blocks: Array): string {\n errWithBlocksOrFilters('useScope', blocks, false)\n\n return content.exec(content.params[0])\n } as HelperFunction\n})\n\nvar nativeHelpers = new Cacher({\n if: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('if', false, buffer.f, true)\n\n var returnStr = 'if(' + buffer.p + '){' + compileScope(buffer.d, env) + '}'\n if (buffer.b) {\n for (var i = 0; i < buffer.b.length; i++) {\n var currentBlock = buffer.b[i]\n if (currentBlock.n === 'else') {\n returnStr += 'else{' + compileScope(currentBlock.d, env) + '}'\n } else if (currentBlock.n === 'elif') {\n returnStr += 'else if(' + currentBlock.p + '){' + compileScope(currentBlock.d, env) + '}'\n }\n }\n }\n return returnStr\n },\n try: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('try', false, buffer.f, true)\n\n if (!buffer.b || buffer.b.length !== 1 || buffer.b[0].n !== 'catch') {\n throw SqrlErr(\"native helper 'try' only accepts 1 block, 'catch'\")\n }\n var returnStr = 'try{' + compileScope(buffer.d, env) + '}'\n\n var currentBlock = buffer.b[0]\n returnStr +=\n 'catch' +\n (currentBlock.res ? '(' + currentBlock.res + ')' : '') +\n '{' +\n compileScope(currentBlock.d, env) +\n '}'\n\n return returnStr\n },\n block: function (buffer: ParentTemplateObject, env: SqrlConfig) {\n errWithBlocksOrFilters('block', buffer.b, buffer.f, true)\n\n var returnStr =\n 'if(!' +\n env.varName +\n '[' +\n buffer.p +\n ']){tR+=(' +\n compileScopeIntoFunction(buffer.d, '', env) +\n ')()}else{tR+=' +\n env.varName +\n '[' +\n buffer.p +\n ']}'\n\n return returnStr\n }\n})\n\nvar filters = new Cacher({ e: XMLEscape })\n\nexport { templates, helpers, nativeHelpers, filters }\n","import { helpers, nativeHelpers, filters, templates } from './containers'\nimport SqrlErr from './err'\nimport { copyProps } from './utils'\n\n/* TYPES */\n\nexport type FetcherFunction = (container: 'H' | 'F', name: string) => Function | undefined\nimport { HelperFunction, FilterFunction } from './containers'\nimport { TemplateFunction } from './compile'\nimport { Cacher } from './storage'\n// import { TagType } from './parse'\n\ntype trimConfig = 'nl' | 'slurp' | false\n\nexport interface SqrlConfig {\n varName: string\n autoTrim: trimConfig | [trimConfig, trimConfig]\n rmWhitespace?: boolean\n autoEscape: boolean\n defaultFilter: false | string\n tags: [string, string]\n l: FetcherFunction\n plugins: Array<{ processFnString?: Function; processAST?: Function }>\n async: boolean\n storage: {\n helpers: Cacher\n nativeHelpers: Cacher\n filters: Cacher\n templates: Cacher\n }\n prefixes: {\n h: string\n b: string\n i: string\n r: string\n c: string\n e: string\n [index: string]: string\n }\n cache: boolean\n views?: string | Array\n root?: string\n filename?: string\n name?: string\n 'view cache'?: boolean\n useWith?: boolean\n [index: string]: any\n}\n\nexport type PartialConfig = {\n [P in keyof SqrlConfig]?: SqrlConfig[P]\n}\n\n/* END TYPES */\n\nvar defaultConfig: SqrlConfig = {\n varName: 'it',\n autoTrim: [false, 'nl'],\n autoEscape: true,\n defaultFilter: false,\n tags: ['{{', '}}'],\n l: function (container: 'H' | 'F', name: string): HelperFunction | FilterFunction | undefined {\n if (container === 'H') {\n var hRet = this.storage.helpers.get(name) as HelperFunction | undefined\n if (hRet) {\n return hRet\n } else {\n throw SqrlErr(\"Can't find helper '\" + name + \"'\")\n }\n } else if (container === 'F') {\n var fRet = this.storage.filters.get(name) as FilterFunction | undefined\n if (fRet) {\n return fRet\n } else {\n throw SqrlErr(\"Can't find filter '\" + name + \"'\")\n }\n }\n },\n async: false,\n storage: {\n helpers: helpers,\n nativeHelpers: nativeHelpers,\n filters: filters,\n templates: templates\n },\n prefixes: {\n h: '@',\n b: '#',\n i: '',\n r: '*',\n c: '/',\n e: '!'\n },\n cache: false,\n plugins: [],\n useWith: false\n}\n\ndefaultConfig.l.bind(defaultConfig)\n\nfunction getConfig (override: PartialConfig, baseConfig?: SqrlConfig): SqrlConfig {\n // TODO: run more tests on this\n\n var res: PartialConfig = {} // Linked\n copyProps(res, defaultConfig) // Creates deep clone of res, 1 layer deep\n\n if (baseConfig) {\n copyProps(res, baseConfig)\n }\n\n if (override) {\n copyProps(res, override)\n }\n\n ;(res as SqrlConfig).l.bind(res)\n\n return res as SqrlConfig\n}\n\nexport { defaultConfig, getConfig }\n","import compileToString from './compile-string'\nimport { getConfig } from './config'\nimport { asyncFunc } from './utils'\nimport SqrlErr from './err'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { CallbackFn } from './file-handlers'\nexport type TemplateFunction = (data: object, config: SqrlConfig, cb?: CallbackFn) => string\n\n/* END TYPES */\n\nexport default function compile (str: string, env?: PartialConfig): TemplateFunction {\n var options: SqrlConfig = getConfig(env || {})\n var ctor = Function // constructor\n\n /* ASYNC HANDLING */\n // The below code is modified from mde/ejs. All credit should go to them.\n if (options.async) {\n // Have to use generated function for this, since in envs without support,\n // it breaks in parsing\n if (asyncFunc) {\n ctor = asyncFunc\n } else {\n throw SqrlErr(\"This environment doesn't support async/await\")\n }\n }\n\n /* END ASYNC HANDLING */\n try {\n return new ctor(\n options.varName,\n 'c', // SqrlConfig\n 'cb', // optional callback\n compileToString(str, options)\n ) as TemplateFunction // eslint-disable-line no-new-func\n } catch (e) {\n if (e instanceof SyntaxError) {\n throw SqrlErr(\n 'Bad template syntax\\n\\n' +\n e.message +\n '\\n' +\n Array(e.message.length + 1).join('=') +\n '\\n' +\n compileToString(str, options)\n )\n } else {\n throw e\n }\n }\n}\n","var fs = require('fs')\nvar path = require('path')\nvar _BOM = /^\\uFEFF/\n\n// express is set like: app.engine('html', require('squirrelly').renderFile)\n\nimport SqrlErr from './err'\nimport Compile from './compile'\nimport { getConfig } from './config'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { TemplateFunction } from './compile'\n\ninterface PartialFileConfig extends PartialConfig {\n filename: string\n}\n\ninterface FileConfig extends SqrlConfig {\n filename: string\n}\n\n/* END TYPES */\n\n/**\n * Get the path to the included file from the parent file path and the\n * specified path.\n *\n * @param {String} name specified path\n * @param {String} parentfile parent file path\n * @param {Boolean} [isDir=false] whether parent file path is a directory\n * @return {String}\n */\n\nfunction getWholeFilePath (name: string, parentfile: string, isDirectory?: boolean) {\n var includePath = path.resolve(\n isDirectory ? parentfile : path.dirname(parentfile), // returns directory the parent file is in\n name // file\n )\n var ext = path.extname(name)\n if (!ext) {\n includePath += '.sqrl'\n }\n return includePath\n}\n\n/**\n * Get the path to the included file by Options\n *\n * @param {String} path specified path\n * @param {Options} options compilation options\n * @return {String}\n */\n\nfunction getPath (path: string, options: SqrlConfig) {\n var includePath\n var filePath\n var views = options.views\n var match = /^[A-Za-z]+:\\\\|^\\//.exec(path)\n\n // Abs path\n if (match && match.length) {\n includePath = getWholeFilePath(path.replace(/^\\/*/, ''), options.root || '/', true)\n } else {\n // Relative paths\n // Look relative to a passed filename first\n if (options.filename) {\n filePath = getWholeFilePath(path, options.filename)\n if (fs.existsSync(filePath)) {\n includePath = filePath\n }\n }\n // Then look in any views directories\n if (!includePath) {\n if (\n Array.isArray(views) &&\n views.some(function (v) {\n filePath = getWholeFilePath(path, v, true)\n return fs.existsSync(filePath)\n })\n ) {\n includePath = filePath\n }\n }\n if (!includePath) {\n throw SqrlErr('Could not find the include file \"' + path + '\"')\n }\n }\n return includePath\n}\n\nfunction readFile (filePath: string) {\n return fs\n .readFileSync(filePath)\n .toString()\n .replace(_BOM, '') // TODO: is replacing BOM's necessary?\n}\n\nfunction loadFile (filePath: string, options: PartialFileConfig): TemplateFunction {\n var config = getConfig(options)\n var template = readFile(filePath)\n try {\n var compiledTemplate = Compile(template, config)\n config.storage.templates.define((config as FileConfig).filename, compiledTemplate)\n return compiledTemplate\n } catch (e) {\n throw SqrlErr('Loading file: ' + filePath + ' failed')\n }\n}\n\nexport { getPath, readFile, loadFile }\n","// express is set like: app.engine('html', require('squirrelly').renderFile)\n\nimport SqrlErr from './err'\nimport compile from './compile'\nimport { getConfig } from './config'\nimport { getPath, readFile, loadFile } from './file-utils'\nimport { promiseImpl, copyProps } from './utils'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { TemplateFunction } from './compile'\n\nexport type CallbackFn = (err: Error | null, str?: string) => void\n\ninterface FileOptions extends SqrlConfig {\n filename: string\n}\n\ninterface DataObj {\n settings?: {\n [key: string]: any\n }\n [key: string]: any\n}\n\n/* END TYPES */\n\n/**\n * Get the template from a string or a file, either compiled on-the-fly or\n * read from cache (if enabled), and cache the template if needed.\n *\n * If `options.cache` is true, this function reads the file from\n * `options.filename` so it must be set prior to calling this function.\n *\n * @param {Options} options compilation options\n * @param {String} [template] template source\n * @return {(TemplateFunction|ClientFunction)}\n * Depending on the value of `options.client`, either type might be returned.\n * @static\n */\n\nfunction handleCache (options: FileOptions): TemplateFunction {\n var filename = options.filename\n\n if (options.cache) {\n var func = options.storage.templates.get(filename)\n if (func) {\n return func\n } else {\n return loadFile(filename, options)\n }\n }\n\n return compile(readFile(filename), options)\n}\n\n/**\n * Try calling handleCache with the given options and data and call the\n * callback with the result. If an error occurs, call the callback with\n * the error. Used by renderFile().\n *\n * @param {Options} options compilation options\n * @param {Object} data template data\n * @param {RenderFileCallback} cb callback\n * @static\n */\n\nfunction tryHandleCache (options: FileOptions, data: object, cb: CallbackFn) {\n var result\n if (!cb) {\n // No callback, try returning a promise\n if (typeof promiseImpl === 'function') {\n return new promiseImpl(function (resolve: Function, reject: Function) {\n try {\n result = handleCache(options)(data, options)\n resolve(result)\n } catch (err) {\n reject(err)\n }\n })\n } else {\n throw SqrlErr(\"Please provide a callback function, this env doesn't support Promises\")\n }\n } else {\n try {\n handleCache(options)(data, options, cb)\n } catch (err) {\n return cb(err)\n }\n }\n}\n\n/**\n * Get the template function.\n *\n * If `options.cache` is `true`, then the template is cached.\n *\n * @param {String} path path for the specified file\n * @param {Options} options compilation options\n * @return {(TemplateFunction|ClientFunction)}\n * Depending on the value of `options.client`, either type might be returned\n * @static\n */\n\nfunction includeFile (path: string, options: SqrlConfig) {\n // the below creates a new options object, using the parent filepath of the old options object and the path\n var newFileOptions = getConfig({ filename: getPath(path, options) }, options)\n // TODO: make sure properties are currectly copied over\n return handleCache(newFileOptions as FileOptions)\n}\n\nfunction renderFile (filename: string, data: DataObj, cb?: CallbackFn) {\n data = data || {}\n var Config: FileOptions = getConfig((data as PartialConfig)) as FileOptions\n // TODO: make sure above doesn't error. We do set filename down below\n\n if (data.settings) {\n // Pull a few things from known locations\n if (data.settings.views) {\n Config.views = data.settings.views\n }\n if (data.settings['view cache']) {\n Config.cache = true\n }\n // Undocumented after Express 2, but still usable, esp. for\n // items that are unsafe to be passed along with data, like `root`\n var viewOpts = data.settings['view options']\n\n if (viewOpts) {\n copyProps(Config, viewOpts)\n }\n }\n\n Config.filename = filename // Make sure filename is right\n\n return tryHandleCache(Config, data, cb as CallbackFn)\n}\n\nexport { includeFile, renderFile }\n","import SqrlErr from './err'\nimport { includeFile } from './file-handlers'\n\n/* TYPES */\n\nimport { SqrlConfig } from './config'\nimport { HelperBlock } from './containers'\n\ninterface IncludeHelperBlock extends HelperBlock {\n params: [string, object]\n}\n\ninterface GenericData {\n [index: string]: any\n}\n\n/* END TYPES */\n\nexport function includeFileHelper (\n content: IncludeHelperBlock,\n blocks: Array,\n config: SqrlConfig\n): string {\n if (blocks && blocks.length > 0) {\n throw SqrlErr(\"Helper 'includeFile' doesn't accept blocks\")\n }\n return includeFile(content.params[0], config)(content.params[1], config)\n}\n\nexport function extendsFileHelper (\n content: IncludeHelperBlock,\n blocks: Array,\n config: SqrlConfig\n): string {\n var data: GenericData = content.params[1] || {}\n\n data.content = content.exec()\n for (var i = 0; i < blocks.length; i++) {\n var currentBlock = blocks[i]\n data[currentBlock.name] = currentBlock.exec()\n }\n\n return includeFile(content.params[0], config)(data, config)\n}\n","import compile from './compile'\nimport { getConfig } from './config'\nimport { promiseImpl } from './utils'\nimport SqrlErr from './err'\n\n/* TYPES */\n\nimport { SqrlConfig, PartialConfig } from './config'\nimport { TemplateFunction } from './compile'\nimport { CallbackFn } from './file-handlers'\n\n/* END TYPES */\n\nfunction handleCache (template: string | TemplateFunction, options: SqrlConfig): TemplateFunction {\n var templateFunc\n\n if (options.cache && options.name && options.storage.templates.get(options.name)) {\n return options.storage.templates.get(options.name)\n }\n\n if (typeof template === 'function') {\n templateFunc = template\n } else {\n templateFunc = compile(template, options)\n }\n\n if (options.cache && options.name) {\n options.storage.templates.define(options.name, templateFunc)\n }\n\n return templateFunc\n}\n\nexport default function render (\n template: string | TemplateFunction,\n data: object,\n env?: PartialConfig,\n cb?: CallbackFn\n) {\n var options = getConfig(env || {})\n\n if (options.async) {\n var result\n if (!cb) {\n // No callback, try returning a promise\n if (typeof promiseImpl === 'function') {\n return new promiseImpl(function (resolve: Function, reject: Function) {\n try {\n result = handleCache(template, options)(data, options)\n resolve(result)\n } catch (err) {\n reject(err)\n }\n })\n } else {\n throw SqrlErr(\"Please provide a callback function, this env doesn't support Promises\")\n }\n } else {\n try {\n handleCache(template, options)(data, options, cb)\n } catch (err) {\n return cb(err)\n }\n }\n } else {\n return handleCache(template, options)(data, options)\n }\n}\n","/* Export file stuff */\nimport { helpers } from './containers'\nimport { includeFileHelper, extendsFileHelper } from './file-helpers'\n\n/* TYPES */\n\nimport { HelperFunction } from './containers'\n\n/* END TYPES */\n\nhelpers.define('includeFile', includeFileHelper as HelperFunction)\nhelpers.define('extendsFile', extendsFileHelper as HelperFunction)\n\nexport { renderFile, renderFile as __express } from './file-handlers'\nexport { loadFile } from './file-utils'\n\n/* End file stuff */\n\nexport {\n default as compileToString,\n compileScope,\n compileScopeIntoFunction\n} from './compile-string'\nexport { default as compile } from './compile'\nexport { default as parse } from './parse'\nexport { default as render } from './render'\nexport { helpers, nativeHelpers, filters, templates } from './containers'\nexport { defaultConfig, getConfig } from './config'\n"],"names":["Parse","Compile","handleCache"],"mappings":"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"} \ No newline at end of file diff --git a/src/node_modules/squirrelly/dist/types/browser.d.ts b/src/node_modules/squirrelly/dist/types/browser.d.ts new file mode 100644 index 0000000..003d2b5 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/browser.d.ts @@ -0,0 +1,6 @@ +export { default as compileToString, compileScope, compileScopeIntoFunction } from './compile-string'; +export { default as compile } from './compile'; +export { default as parse } from './parse'; +export { default as render } from './render'; +export { helpers, nativeHelpers, filters, templates } from './containers'; +export { defaultConfig, getConfig } from './config'; diff --git a/src/node_modules/squirrelly/dist/types/compile-string.d.ts b/src/node_modules/squirrelly/dist/types/compile-string.d.ts new file mode 100644 index 0000000..be476e3 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/compile-string.d.ts @@ -0,0 +1,5 @@ +import { SqrlConfig } from './config'; +import { AstObject } from './parse'; +export default function compileToString(str: string, env: SqrlConfig): string; +export declare function compileScopeIntoFunction(buff: Array, res: string, env: SqrlConfig): string; +export declare function compileScope(buff: Array, env: SqrlConfig): string; diff --git a/src/node_modules/squirrelly/dist/types/compile.d.ts b/src/node_modules/squirrelly/dist/types/compile.d.ts new file mode 100644 index 0000000..4138b6f --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/compile.d.ts @@ -0,0 +1,4 @@ +import { SqrlConfig, PartialConfig } from './config'; +import { CallbackFn } from './file-handlers'; +export declare type TemplateFunction = (data: object, config: SqrlConfig, cb?: CallbackFn) => string; +export default function compile(str: string, env?: PartialConfig): TemplateFunction; diff --git a/src/node_modules/squirrelly/dist/types/config.d.ts b/src/node_modules/squirrelly/dist/types/config.d.ts new file mode 100644 index 0000000..d8f383f --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/config.d.ts @@ -0,0 +1,48 @@ +export declare type FetcherFunction = (container: 'H' | 'F', name: string) => Function | undefined; +import { HelperFunction, FilterFunction } from './containers'; +import { TemplateFunction } from './compile'; +import { Cacher } from './storage'; +declare type trimConfig = 'nl' | 'slurp' | false; +export interface SqrlConfig { + varName: string; + autoTrim: trimConfig | [trimConfig, trimConfig]; + rmWhitespace?: boolean; + autoEscape: boolean; + defaultFilter: false | string; + tags: [string, string]; + l: FetcherFunction; + plugins: Array<{ + processFnString?: Function; + processAST?: Function; + }>; + async: boolean; + storage: { + helpers: Cacher; + nativeHelpers: Cacher; + filters: Cacher; + templates: Cacher; + }; + prefixes: { + h: string; + b: string; + i: string; + r: string; + c: string; + e: string; + [index: string]: string; + }; + cache: boolean; + views?: string | Array; + root?: string; + filename?: string; + name?: string; + 'view cache'?: boolean; + useWith?: boolean; + [index: string]: any; +} +export declare type PartialConfig = { + [P in keyof SqrlConfig]?: SqrlConfig[P]; +}; +declare var defaultConfig: SqrlConfig; +declare function getConfig(override: PartialConfig, baseConfig?: SqrlConfig): SqrlConfig; +export { defaultConfig, getConfig }; diff --git a/src/node_modules/squirrelly/dist/types/container-utils.d.ts b/src/node_modules/squirrelly/dist/types/container-utils.d.ts new file mode 100644 index 0000000..2bfc2a1 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/container-utils.d.ts @@ -0,0 +1,8 @@ +export declare function errWithBlocksOrFilters(name: string, blocks: Array | false, // false means don't check +filters: Array | false, native?: boolean): void; +export declare function asyncArrLoop(arr: Array, index: number, fn: Function, res: string, cb: Function): void; +export declare function asyncObjLoop(obj: { + [index: string]: any; +}, keys: Array, index: number, fn: Function, res: string, cb: Function): void; +export declare function replaceChar(s: string): string; +export declare function XMLEscape(str: unknown): string; diff --git a/src/node_modules/squirrelly/dist/types/containers.d.ts b/src/node_modules/squirrelly/dist/types/containers.d.ts new file mode 100644 index 0000000..a7f0980 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/containers.d.ts @@ -0,0 +1,18 @@ +import { Cacher } from './storage'; +import { SqrlConfig } from './config'; +import { TemplateFunction } from './compile'; +export interface HelperContent { + exec: Function; + params: Array; + async?: boolean; +} +export interface HelperBlock extends HelperContent { + name: string; +} +export declare type HelperFunction = (content: HelperContent, blocks: Array, config: SqrlConfig) => string | Promise; +export declare type FilterFunction = (...args: any[]) => any | Promise; +declare var templates: Cacher; +declare var helpers: Cacher; +declare var nativeHelpers: Cacher; +declare var filters: Cacher; +export { templates, helpers, nativeHelpers, filters }; diff --git a/src/node_modules/squirrelly/dist/types/err.d.ts b/src/node_modules/squirrelly/dist/types/err.d.ts new file mode 100644 index 0000000..529c492 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/err.d.ts @@ -0,0 +1,6 @@ +declare function SqrlErr(message: string): Error; +declare namespace SqrlErr { + var prototype: any; +} +export default SqrlErr; +export declare function ParseErr(message: string, str: string, indx: number): void; diff --git a/src/node_modules/squirrelly/dist/types/file-handlers.d.ts b/src/node_modules/squirrelly/dist/types/file-handlers.d.ts new file mode 100644 index 0000000..1a6a502 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/file-handlers.d.ts @@ -0,0 +1,23 @@ +import { SqrlConfig } from './config'; +import { TemplateFunction } from './compile'; +export declare type CallbackFn = (err: Error | null, str?: string) => void; +interface DataObj { + settings?: { + [key: string]: any; + }; + [key: string]: any; +} +/** + * Get the template function. + * + * If `options.cache` is `true`, then the template is cached. + * + * @param {String} path path for the specified file + * @param {Options} options compilation options + * @return {(TemplateFunction|ClientFunction)} + * Depending on the value of `options.client`, either type might be returned + * @static + */ +declare function includeFile(path: string, options: SqrlConfig): TemplateFunction; +declare function renderFile(filename: string, data: DataObj, cb?: CallbackFn): any; +export { includeFile, renderFile }; diff --git a/src/node_modules/squirrelly/dist/types/file-helpers.d.ts b/src/node_modules/squirrelly/dist/types/file-helpers.d.ts new file mode 100644 index 0000000..674af81 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/file-helpers.d.ts @@ -0,0 +1,8 @@ +import { SqrlConfig } from './config'; +import { HelperBlock } from './containers'; +interface IncludeHelperBlock extends HelperBlock { + params: [string, object]; +} +export declare function includeFileHelper(content: IncludeHelperBlock, blocks: Array, config: SqrlConfig): string; +export declare function extendsFileHelper(content: IncludeHelperBlock, blocks: Array, config: SqrlConfig): string; +export {}; diff --git a/src/node_modules/squirrelly/dist/types/file-utils.d.ts b/src/node_modules/squirrelly/dist/types/file-utils.d.ts new file mode 100644 index 0000000..4f31660 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/file-utils.d.ts @@ -0,0 +1,16 @@ +import { SqrlConfig, PartialConfig } from './config'; +import { TemplateFunction } from './compile'; +interface PartialFileConfig extends PartialConfig { + filename: string; +} +/** + * Get the path to the included file by Options + * + * @param {String} path specified path + * @param {Options} options compilation options + * @return {String} + */ +declare function getPath(path: string, options: SqrlConfig): any; +declare function readFile(filePath: string): any; +declare function loadFile(filePath: string, options: PartialFileConfig): TemplateFunction; +export { getPath, readFile, loadFile }; diff --git a/src/node_modules/squirrelly/dist/types/index.d.ts b/src/node_modules/squirrelly/dist/types/index.d.ts new file mode 100644 index 0000000..6ee5988 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/index.d.ts @@ -0,0 +1,8 @@ +export { renderFile, renderFile as __express } from './file-handlers'; +export { loadFile } from './file-utils'; +export { default as compileToString, compileScope, compileScopeIntoFunction } from './compile-string'; +export { default as compile } from './compile'; +export { default as parse } from './parse'; +export { default as render } from './render'; +export { helpers, nativeHelpers, filters, templates } from './containers'; +export { defaultConfig, getConfig } from './config'; diff --git a/src/node_modules/squirrelly/dist/types/parse.d.ts b/src/node_modules/squirrelly/dist/types/parse.d.ts new file mode 100644 index 0000000..57313fd --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/parse.d.ts @@ -0,0 +1,23 @@ +import { SqrlConfig } from './config'; +export declare type TagType = 'h' | 'b' | 'i' | 'r' | 'c' | 'e' | 'q' | 's'; +export declare type TemplateAttribute = 'c' | 'f' | 'fp' | 'p' | 'n' | 'res' | 'err'; +export declare type TemplateObjectAttribute = 'c' | 'p' | 'n' | 'res'; +export declare type AstObject = string | TemplateObject; +export declare type Filter = [string, string] | [string, string, true]; +export interface TemplateObject { + n?: string; + t?: 'h' | 'b' | 'i' | 'c' | 'q' | 'e' | 's'; + f: Array; + c?: string; + p?: string; + res?: string; + d?: Array; + raw?: boolean; + a?: boolean; + b?: Array; +} +export interface ParentTemplateObject extends TemplateObject { + d: Array; + b: Array; +} +export default function parse(str: string, env: SqrlConfig): Array; diff --git a/src/node_modules/squirrelly/dist/types/render.d.ts b/src/node_modules/squirrelly/dist/types/render.d.ts new file mode 100644 index 0000000..e201ee7 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/render.d.ts @@ -0,0 +1,4 @@ +import { PartialConfig } from './config'; +import { TemplateFunction } from './compile'; +import { CallbackFn } from './file-handlers'; +export default function render(template: string | TemplateFunction, data: object, env?: PartialConfig, cb?: CallbackFn): any; diff --git a/src/node_modules/squirrelly/dist/types/storage.d.ts b/src/node_modules/squirrelly/dist/types/storage.d.ts new file mode 100644 index 0000000..8e58d32 --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/storage.d.ts @@ -0,0 +1,13 @@ +interface Dict { + [key: string]: T; +} +declare class Cacher { + private cache; + constructor(cache: Dict); + define(key: string, val: T): void; + get(key: string): T; + remove(key: string): void; + reset(): void; + load(cacheObj: Dict): void; +} +export { Cacher }; diff --git a/src/node_modules/squirrelly/dist/types/utils.d.ts b/src/node_modules/squirrelly/dist/types/utils.d.ts new file mode 100644 index 0000000..39a434f --- /dev/null +++ b/src/node_modules/squirrelly/dist/types/utils.d.ts @@ -0,0 +1,8 @@ +import { SqrlConfig } from './config'; +export declare var promiseImpl: any; +declare var asyncFunc: FunctionConstructor | false; +export { asyncFunc }; +export declare function hasOwnProp(obj: object, prop: string): boolean; +export declare function copyProps(toObj: T, fromObj: T, notConfig?: boolean): T; +declare function trimWS(str: string, env: SqrlConfig, wsLeft: string | false, wsRight?: string | false): string; +export { trimWS }; diff --git a/src/node_modules/squirrelly/examples/conditionals.ts b/src/node_modules/squirrelly/examples/conditionals.ts new file mode 100644 index 0000000..0d039ad --- /dev/null +++ b/src/node_modules/squirrelly/examples/conditionals.ts @@ -0,0 +1,20 @@ +var Sqrl = require('../dist/squirrelly.cjs') +var template = ` +The Daugherty's have 8 kids. Their names are: +{{@each (it.kids) => val, index}} +{{@if(index < it.kids.length - 1_}} + {{val}}, +{{_#else_}} + and {{val}} +{{_/if}} +{{_/each}} +` +Sqrl.filters.define('capitalize', function (str) { + return str.toUpperCase() +}) + +console.log(Sqrl.parse(template, Sqrl.defaultConfig)) +console.log('===========================') +console.log(Sqrl.compile(template).toString()) +console.log('===========================') +console.log(Sqrl.render(template, { kids: ['Ben', 'Polly', 'Joel', 'Phronsie', 'Davie'] })) diff --git a/src/node_modules/squirrelly/examples/filters.ts b/src/node_modules/squirrelly/examples/filters.ts new file mode 100644 index 0000000..59d765d --- /dev/null +++ b/src/node_modules/squirrelly/examples/filters.ts @@ -0,0 +1,23 @@ +var Sqrl = require('../dist/squirrelly.cjs') +var template = ` +{{it.value}} + +{{" hi "}} + +{{it.value | safe}} +{{!/*this is a comment */}} + +{{it.value | safe | capitalize}} + +{{it.value | capitalize | safe}} + +` +Sqrl.filters.define('capitalize', function (str) { + return str.toUpperCase() +}) + +console.log(Sqrl.parse(template, Sqrl.defaultConfig)) +console.log('===========================') +console.log(Sqrl.compile(template).toString()) +console.log('===========================') +console.log(Sqrl.render(template, { value: 'Something' })) diff --git a/src/node_modules/squirrelly/examples/runkit.js b/src/node_modules/squirrelly/examples/runkit.js new file mode 100644 index 0000000..e21578a --- /dev/null +++ b/src/node_modules/squirrelly/examples/runkit.js @@ -0,0 +1,5 @@ +var Sqrl = require('squirrelly') + +var template = 'Hi {{it.user}}!' + +Sqrl.render(template, { user: 'cool person' }) diff --git a/src/node_modules/squirrelly/examples/trycatch.ts b/src/node_modules/squirrelly/examples/trycatch.ts new file mode 100644 index 0000000..c06412a --- /dev/null +++ b/src/node_modules/squirrelly/examples/trycatch.ts @@ -0,0 +1,26 @@ +var Sqrl = require('../dist/squirrelly.cjs') +var template = ` +{{@try}} +This won't work: {{ *it.hi | validate}} +{{#catch => err}} +Uh-oh, error! Message was '{{err.message}}' +{{/try}} +` + +// the above is auto unescaped because otherwise it automatically converts it to a string + +Sqrl.filters.define('validate', function (str) { + console.log('str is ' + str + 'and its type is ' + typeof str) + if (typeof str !== 'string') { + console.log('gonna error') + throw new Error('str does not fit expected format') + } else { + return str + } +}) + +console.log(Sqrl.parse(template, Sqrl.defaultConfig)) +console.log('===========================') +console.log(Sqrl.compile(template).toString()) +console.log('===========================') +console.log(Sqrl.render(template, { riceKids: ['Ben', 'Polly', 'Joel', 'Phronsie', 'Davie'] })) diff --git a/src/node_modules/squirrelly/package.json b/src/node_modules/squirrelly/package.json new file mode 100644 index 0000000..11d23e6 --- /dev/null +++ b/src/node_modules/squirrelly/package.json @@ -0,0 +1,151 @@ +{ + "name": "squirrelly", + "version": "8.0.8", + "description": "Lightweight, fast, and powerful JS template engine. Supports helpers, filters, template inheritance", + "keywords": [ + "squirrelly", + "helpers", + "template inheritance", + "handlebars", + "ejs", + "template engine", + "typescript types" + ], + "homepage": "https://squirrelly.js.org", + "main": "dist/squirrelly.cjs.js", + "browser": "dist/browser/squirrelly.min.js", + "module": "dist/squirrelly.es.js", + "typings": "dist/types/index.d.ts", + "jsdelivr": "dist/browser/squirrelly.min.js", + "unpkg": "dist/browser/squirrelly.min.js", + "runkitExampleFilename": "examples/runkit.js", + "sideEffects": false, + "files": [ + "dist", + "examples" + ], + "author": "Ben Gubler ", + "funding": "https://github.com/squirrellyjs/squirrelly?sponsor=1", + "repository": { + "type": "git", + "url": "git+https://github.com/squirrellyjs/squirrelly.git" + }, + "bugs": { + "url": "https://github.com/squirrellyjs/squirrelly/issues" + }, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "scripts": { + "lint": "eslint src/*.ts test/*.spec.ts examples/* --ext .js,.ts", + "prebuild": "rimraf dist", + "build": "tsc --module es6 && rollup -c rollup.config.ts && typedoc --out docs --target es6 --mode modules src", + "start": "rollup -c rollup.config.ts -w", + "test": "jest --coverage", + "test:watch": "jest --coverage --watch", + "test:prod": "npm run lint && npm run test -- --no-cache", + "deploy-docs": "ts-node tools/gh-pages-publish", + "report-coverage": "cat ./coverage/lcov.info | coveralls", + "commit": "git-cz", + "travis-deploy-once": "travis-deploy-once --pro", + "format": "prettier-standard --format '{src,test}/**/*.ts'" + }, + "lint-staged": { + "{src,test}/**/*.ts": [ + "eslint" + ] + }, + "config": { + "commitizen": { + "path": "node_modules/cz-conventional-changelog" + } + }, + "jest": { + "transform": { + ".(ts)": "ts-jest" + }, + "testEnvironment": "node", + "testRegex": "(/test/.*|\\.(test|spec))\\.(ts|js)$", + "moduleFileExtensions": [ + "ts", + "js" + ], + "coveragePathIgnorePatterns": [ + "/node_modules/", + "/test/" + ], + "coverageThreshold": { + "global": { + "branches": 80, + "functions": 95, + "lines": 95, + "statements": 95 + } + }, + "collectCoverageFrom": [ + "src/{!(browser),}.ts" + ] + }, + "standard": { + "ignore": [ + "dist" + ] + }, + "prettier": { + "semi": false, + "singleQuote": true + }, + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ] + }, + "devDependencies": { + "@commitlint/cli": "^9.1.2", + "@commitlint/config-conventional": "^9.1.2", + "@types/jest": "^26.0.12", + "@types/node": "^14.6.2", + "@typescript-eslint/eslint-plugin": "4", + "@typescript-eslint/parser": "^4.0.1", + "colors": "^1.4.0", + "commitizen": "^4.2.1", + "coveralls": "^3.1.0", + "cross-env": "^7.0.2", + "cz-conventional-changelog": "^3.3.0", + "eslint": "^7.8.0", + "eslint-config-prettier": "^6.11.0", + "eslint-config-standard-with-typescript": "^18.0.2", + "eslint-plugin-import": "2", + "eslint-plugin-node": "11", + "eslint-plugin-promise": "4", + "eslint-plugin-standard": "4", + "husky": "^4.2.5", + "jest": "^26.4.2", + "jest-config": "^26.4.2", + "lint-staged": "^10.2.13", + "prettier-standard": "^16.4.1", + "prompt": "^1.0.0", + "replace-in-file": "^6.1.0", + "rimraf": "^3.0.2", + "rollup": "^2.26.8", + "rollup-plugin-commonjs": "^10.1.0", + "rollup-plugin-json": "^4.0.0", + "rollup-plugin-node-resolve": "^5.2.0", + "rollup-plugin-prettier": "^2.1.0", + "rollup-plugin-size-snapshot": "^0.12.0", + "rollup-plugin-terser": "^7.0.1", + "rollup-plugin-typescript2": "^0.27.2", + "shelljs": "^0.8.4", + "travis-deploy-once": "^5.0.11", + "ts-jest": "^26.3.0", + "ts-node": "^9.0.0", + "typedoc": "^0.19.0", + "typescript": "^4.0.2" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + } +} diff --git a/src/package-lock.json b/src/package-lock.json new file mode 100644 index 0000000..9f87efc --- /dev/null +++ b/src/package-lock.json @@ -0,0 +1,33 @@ +{ + "name": "musicserver", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "musicserver", + "version": "1.0.0", + "dependencies": { + "squirrelly": "^8.0.8" + } + }, + "node_modules/squirrelly": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/squirrelly/-/squirrelly-8.0.8.tgz", + "integrity": "sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/squirrellyjs/squirrelly?sponsor=1" + } + } + }, + "dependencies": { + "squirrelly": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/squirrelly/-/squirrelly-8.0.8.tgz", + "integrity": "sha512-7dyZJ9Gw86MmH0dYLiESsjGOTj6KG8IWToTaqBuB6LwPI+hyNb6mbQaZwrfnAQ4cMDnSWMUvX/zAYDLTSWLk/w==" + } + } +} diff --git a/src/package.json b/src/package.json new file mode 100644 index 0000000..4cac4c8 --- /dev/null +++ b/src/package.json @@ -0,0 +1,8 @@ +{ + "name": "musicserver", + "version": "1.0.0", + "author": "Group 7", + "dependencies": { + "squirrelly": "^8.0.8" + } +} diff --git a/template.yml b/template.yml new file mode 100644 index 0000000..ea0abe8 --- /dev/null +++ b/template.yml @@ -0,0 +1,157 @@ +AWSTemplateFormatVersion: 2010-09-09 +Metadata: + 'AWS::CloudFormation::Designer': + 6892b949-4601-47eb-af8d-f584c12bc81b: + size: + width: 60 + height: 60 + position: + x: 82 + 'y': 299 + z: 0 + embeds: [] + 80500ba5-1749-47bc-8cfa-3e9a0f0d0572: + size: + width: 60 + height: 60 + position: + x: 200 + 'y': 300 + z: 0 + embeds: [] + 13c58f7b-60f4-4942-8731-d2b12e056e39: + size: + width: 60 + height: 60 + position: + x: 340 + 'y': 180 + z: 0 + embeds: [] + isassociatedwith: + - d6f4bd86-a7e4-46c2-abab-2fd987e6a4f1 + - 792d4352-869b-4732-a0d2-d4bcc40a6b96 + dependson: + - d6f4bd86-a7e4-46c2-abab-2fd987e6a4f1 + - 13c58f7b-60f4-4942-8731-d2b12e056e39 + 792d4352-869b-4732-a0d2-d4bcc40a6b96: + size: + width: 60 + height: 60 + position: + x: 460 + 'y': 180 + z: 0 + embeds: [] + dependson: + - 13c58f7b-60f4-4942-8731-d2b12e056e39 + 3cf5efd5-85be-4593-b08b-bc3d4a6091b4: + size: + width: 60 + height: 60 + position: + x: 340 + 'y': 350 + z: 0 + embeds: [] + 161bd476-b869-4c2e-968b-05cd0b73052f: + size: + width: 60 + height: 60 + position: + x: 80 + 'y': 220 + z: 0 + embeds: [] + isassociatedwith: + - 80500ba5-1749-47bc-8cfa-3e9a0f0d0572 +Resources: + URL: + Type: 'AWS::Lambda::Url' + Properties: + AuthType: NONE + TargetFunctionArn: !GetAtt + - Server + - Arn + Metadata: + 'AWS::CloudFormation::Designer': + id: 6892b949-4601-47eb-af8d-f584c12bc81b + DependsOn: + - Server + Server: + Type: 'AWS::Lambda::Function' + Properties: + FunctionName: Server + Handler: index.handler + Runtime: nodejs16.x + Code: + S3Bucket: ${bucketname} + S3Key: index.zip + Role: !GetAtt SiteRole.Arn + Metadata: + 'AWS::CloudFormation::Designer': + id: 80500ba5-1749-47bc-8cfa-3e9a0f0d0572 + DependsOn: + - SiteRole + SiteRole: + Type: 'AWS::IAM::Role' + Properties: + AssumeRolePolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Principal: + Service: + - lambda.amazonaws.com + Action: 'sts:AssumeRole' + ManagedPolicyArns: + - 'arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess' + RoleName: SiteRole + Metadata: + 'AWS::CloudFormation::Designer': + id: 13c58f7b-60f4-4942-8731-d2b12e056e39 + ExecPolicy: + Type: 'AWS::IAM::Policy' + Properties: + PolicyName: LambdaExcecutionPolicy + PolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Action: + - 'logs:CreateLogGroup' + - 'logs:CreateLogStream' + - 'logs:PutLogEvents' + Resource: '*' + Roles: + - !Ref SiteRole + Metadata: + 'AWS::CloudFormation::Designer': + id: 792d4352-869b-4732-a0d2-d4bcc40a6b96 + DependsOn: + - SiteRole + MusicTable: + Type: 'AWS::DynamoDB::Table' + Properties: + KeySchema: + - AttributeName: id + KeyType: HASH + AttributeDefinitions: + - AttributeName: id + AttributeType: S + BillingMode: PAY_PER_REQUEST + TableName: MusicTable + Metadata: + 'AWS::CloudFormation::Designer': + id: 3cf5efd5-85be-4593-b08b-bc3d4a6091b4 + Permission: + Type: 'AWS::Lambda::Permission' + Properties: + Action: 'lambda:invokeFunctionUrl' + FunctionUrlAuthType: 'NONE' + FunctionName: !Ref Server + Principal: '*' + Metadata: + 'AWS::CloudFormation::Designer': + id: 161bd476-b869-4c2e-968b-05cd0b73052f +