@jaredwray/fumanchu 4.6.1 → 4.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -26
- package/dist/index.browser.cjs +3 -0
- package/dist/index.browser.d.cts +109 -0
- package/dist/index.browser.d.mts +109 -0
- package/dist/index.browser.mjs +3 -0
- package/dist/{index.cjs → index.node.cjs} +433 -284
- package/dist/{index.d.cts → index.node.d.cts} +21 -20
- package/dist/{index.d.mts → index.node.d.mts} +29 -28
- package/dist/{index.mjs → index.node.mjs} +424 -270
- package/package.json +58 -49
package/README.md
CHANGED
|
@@ -10,36 +10,40 @@ Handlebars + Helpers Together
|
|
|
10
10
|
[
|
|
11
11
|
](https://github.com/jaredwray/fumanchu/blob/main/LICENSE)
|
|
12
12
|
[](https://npmjs.com/package/@jaredwray/fumanchu)
|
|
13
|
+
[](https://www.jsdelivr.com/package/npm/@jaredwray/fumanchu)
|
|
13
14
|
|
|
14
|
-
[Handlebars](https://github.com/handlebars-lang/handlebars.js) + [Handlebars-helpers](https://github.com/helpers/handlebars-helpers) (helpers are now maintained in this project) combined into a single package.
|
|
15
|
+
[Handlebars](https://github.com/handlebars-lang/handlebars.js) + [Handlebars-helpers](https://github.com/helpers/handlebars-helpers) (helpers are now maintained in this project) combined into a single package. In addition this project has **drastically** reduced the number of dependencies.
|
|
16
|
+
|
|
17
|
+
Easily use it as a drop in replacement when using handlebars directly. More than 160 Handlebars helpers in ~20 categories. Helpers can be used with Assemble, Generate, Verb, Ghost, gulp-handlebars, grunt-handlebars, consolidate, or any node.js/Handlebars project. Currently **189 helpers** in **20 categories**! 🎉
|
|
15
18
|
|
|
16
19
|
# Table of Contents
|
|
17
|
-
* [Using in Nodejs](#
|
|
20
|
+
* [Using in Nodejs](#usage-nodejs)
|
|
21
|
+
* [Using in the Browser](#usage-in-the-browser)
|
|
18
22
|
* [Just using Handlebar Helpers](#using-handlebars-helpers)
|
|
19
|
-
* [Migrating from v2 to v3](https://fumanchu.org/docs/v2-to-v3/)
|
|
20
|
-
* [Migrating from v3 to v4](https://fumanchu.org/docs/v3-to-v4/)
|
|
21
|
-
* [Helpers](https://fumanchu.org/docs/)
|
|
22
|
-
* [array](https://fumanchu.org/docs/array/)
|
|
23
|
-
* [code](https://fumanchu.org/docs/code/)
|
|
24
|
-
* [comparison](https://fumanchu.org/docs/comparison/)
|
|
25
|
-
* [collection](https://fumanchu.org/docs/collection/)
|
|
26
|
-
* [date](https://fumanchu.org/docs/date/)
|
|
27
|
-
* [fs](https://fumanchu.org/docs/fs/)
|
|
28
|
-
* [html](https://fumanchu.org/docs/html/)
|
|
29
|
-
* [i18n](https://fumanchu.org/docs/i18n/)
|
|
30
|
-
* [inflection](https://fumanchu.org/docs/inflection/)
|
|
31
|
-
* [logging](https://
|
|
32
|
-
* [markdown](https://fumanchu.org/docs/markdown/)
|
|
33
|
-
* [match](https://fumanchu.org/docs/match/)
|
|
34
|
-
* [math](https://fumanchu.org/docs/math/)
|
|
35
|
-
* [misc](https://fumanchu.org/docs/misc/)
|
|
36
|
-
* [number](https://fumanchu.org/docs/number/)
|
|
37
|
-
* [object](https://fumanchu.org/docs/object/)
|
|
38
|
-
* [path](https://fumanchu.org/docs/path/)
|
|
39
|
-
* [regex](https://fumanchu.org/docs/regex/)
|
|
40
|
-
* [string](https://fumanchu.org/docs/string/)
|
|
41
|
-
* [url](https://fumanchu.org/docs/url/)
|
|
42
|
-
* [utils](https://fumanchu.org/docs/utils/)
|
|
23
|
+
* [Migrating from v2 to v3](https://fumanchu.org/docs/migration/v2-to-v3/)
|
|
24
|
+
* [Migrating from v3 to v4](https://fumanchu.org/docs/migration/v3-to-v4/)
|
|
25
|
+
* [Helpers](https://fumanchu.org/docs/helpers/)
|
|
26
|
+
* [array](https://fumanchu.org/docs/helpers/array/)
|
|
27
|
+
* [code](https://fumanchu.org/docs/helpers/code/)
|
|
28
|
+
* [comparison](https://fumanchu.org/docs/helpers/comparison/)
|
|
29
|
+
* [collection](https://fumanchu.org/docs/helpers/collection/)
|
|
30
|
+
* [date](https://fumanchu.org/docs/helpers/date/)
|
|
31
|
+
* [fs](https://fumanchu.org/docs/helpers/fs/)
|
|
32
|
+
* [html](https://fumanchu.org/docs/helpers/html/)
|
|
33
|
+
* [i18n](https://fumanchu.org/docs/helpers/i18n/)
|
|
34
|
+
* [inflection](https://fumanchu.org/docs/helpers/inflection/)
|
|
35
|
+
* [logging](https://fumanchu.org/docs/helpers/logging/)
|
|
36
|
+
* [markdown](https://fumanchu.org/docs/helpers/markdown/)
|
|
37
|
+
* [match](https://fumanchu.org/docs/helpers/match/)
|
|
38
|
+
* [math](https://fumanchu.org/docs/helpers/math/)
|
|
39
|
+
* [misc](https://fumanchu.org/docs/helpers/misc/)
|
|
40
|
+
* [number](https://fumanchu.org/docs/helpers/number/)
|
|
41
|
+
* [object](https://fumanchu.org/docs/helpers/object/)
|
|
42
|
+
* [path](https://fumanchu.org/docs/helpers/path/)
|
|
43
|
+
* [regex](https://fumanchu.org/docs/helpers/regex/)
|
|
44
|
+
* [string](https://fumanchu.org/docs/helpers/string/)
|
|
45
|
+
* [url](https://fumanchu.org/docs/helpers/url/)
|
|
46
|
+
* [utils](https://fumanchu.org/docs/helpers/utils/)
|
|
43
47
|
* [Caching](#caching)
|
|
44
48
|
* [How to Contribute](#how-to-contribute)
|
|
45
49
|
* [License and Copyright](#license-and-copyright)
|
|
@@ -62,6 +66,29 @@ console.log(html); // <p>Foo is bar</p>
|
|
|
62
66
|
|
|
63
67
|
It's just that easy! No need to add Handlebars to your project, it's already included.
|
|
64
68
|
|
|
69
|
+
# Usage in the Browser
|
|
70
|
+
|
|
71
|
+
Fumanchu ships a browser-safe build that excludes Node-only helpers (`fs`, `path`, `logging`, `embed`, `css`, `js`, `escape`, `urlResolve`, `urlParse`, `stripProtocol`). Import it directly via the `/browser` subpath:
|
|
72
|
+
|
|
73
|
+
```javascript
|
|
74
|
+
import { fumanchu } from '@jaredwray/fumanchu/browser';
|
|
75
|
+
const handlebars = fumanchu();
|
|
76
|
+
const template = handlebars.compile('{{uppercase name}}');
|
|
77
|
+
console.log(template({ name: 'hello' })); // HELLO
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
The package also sets the `browser` export condition on the main entry, so webpack, Vite, esbuild, Rollup, and other browser-aware bundlers automatically pick up the browser build when you `import '@jaredwray/fumanchu'` from a browser target — no code change required. The public API (`fumanchu`, `helpers`, `HelperRegistry`) is identical to Node; only the set of registered helpers differs.
|
|
81
|
+
|
|
82
|
+
You can also load the browser build directly from a CDN such as [jsDelivr](https://www.jsdelivr.com/package/npm/@jaredwray/fumanchu) — no bundler required:
|
|
83
|
+
|
|
84
|
+
```html
|
|
85
|
+
<script type="module">
|
|
86
|
+
import { fumanchu } from 'https://cdn.jsdelivr.net/npm/@jaredwray/fumanchu/dist/index.browser.mjs';
|
|
87
|
+
const handlebars = fumanchu();
|
|
88
|
+
document.body.textContent = handlebars.compile('{{uppercase name}}')({ name: 'hello' });
|
|
89
|
+
</script>
|
|
90
|
+
```
|
|
91
|
+
|
|
65
92
|
# Using Handlebars Helpers
|
|
66
93
|
|
|
67
94
|
If you only want to use handlebar helpers you can easily do that by doing the following:
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));let c=require("@cacheable/memory"),l=require("handlebars");l=s(l,1);let u=require("chrono-node"),d=require("dayjs");d=s(d,1);let f=require("dayjs/plugin/isBetween.js");f=s(f,1);let p=require("dayjs/plugin/relativeTime.js");p=s(p,1);let m=require("dayjs/plugin/timezone.js");m=s(m,1);let h=require("dayjs/plugin/utc.js");h=s(h,1);let g=require("micromatch");g=s(g,1);let _=require("markdown-it");_=s(_,1);var ee=class{_helpers=[];constructor(){this.init()}get helpers(){return this._helpers}init(){}register(e){return this.has(e.name)?!1:(this._helpers.push(e),!0)}registerHelpers(e){for(let t of e)this.register(t)}has(e){return this._helpers.some(t=>t.name===e)}filter(e){let t=this._helpers;if(e.names){let n=e.names;t=t.filter(e=>n.includes(e.name))}if(e.categories){let n=e.categories;t=t.filter(e=>n.includes(e.category))}if(e.compatibility){let n=e.compatibility;t=t.filter(e=>e.compatibility?.some(e=>n.includes(e)))}return t}load(e,t){let n=this._helpers;t&&(n=this.filter(t));for(let t of n)e.registerHelper(t.name,t.fn)}swap(e){for(let t of this._helpers)e.registerHelper(t.name,t.fn)}};const te=(e,t)=>Array.isArray(e)?e.slice(t):[],ne=(e,t)=>Array.isArray(e)?e.slice(0,-t):[],v=e=>e==null?[]:Array.isArray(e)?e:[e],re=(e,t)=>{if(Array.isArray(e))return typeof t==`number`?e.slice(0,t):e[0]},ie=(e,t)=>{if(!Array.isArray(e)&&typeof e!=`string`)return;if(typeof t!=`number`){let t=e;return t[t.length-1]}let n=Math.abs(t);return e.slice(-n)},y=e=>e&&typeof e==`object`&&!Array.isArray(e)?Object.keys(e).length:typeof e==`string`||Array.isArray(e)?e.length:0,ae=[{name:`after`,category:`array`,compatibility:[`browser`,`nodejs`],fn:te},{name:`before`,category:`array`,compatibility:[`browser`,`nodejs`],fn:ne},{name:`arrayify`,category:`array`,compatibility:[`browser`,`nodejs`],fn:v},{name:`first`,category:`array`,compatibility:[`browser`,`nodejs`],fn:re},{name:`last`,category:`array`,compatibility:[`browser`,`nodejs`],fn:ie},{name:`length`,category:`array`,compatibility:[`browser`,`nodejs`],fn:y},{name:`join`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t=`, `)=>typeof e==`string`?e:Array.isArray(e)?e.join(t):``},{name:`forEach`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t){if(!Array.isArray(e)||!t||typeof t.fn!=`function`)return t?.inverse?t.inverse(this)??``:``;if(e.length===0)return t.inverse?t.inverse(this)??``:``;let n=e.length,r=t.hash??{},i=t.data?{...t.data}:void 0,a=``;for(let o=0;o<n;o++){let s=e[o],c={index:o,total:n,isFirst:o===0,isLast:o===n-1},l={...i?{...i}:{},...r,...c},u;u=typeof s==`object`&&s?{...s,...r,...c}:{value:s,...r,...c},a+=t.fn(u,{data:l})}return a}},{name:`inArray`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||!n)return``;let r=e.includes(t);return r&&n.fn?n.fn(this):!r&&n.inverse?n.inverse(this):``}},{name:`isArray`,category:`array`,compatibility:[`browser`,`nodejs`],fn:e=>Array.isArray(e)},{name:`itemAt`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{if(Array.isArray(e))return e[t]}},{name:`equalsLength`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){let r=y(e)===t;return n&&(n.fn||n.inverse)?r&&n.fn?n.fn(this):!r&&n.inverse?n.inverse(this):``:r}},{name:`some`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||typeof t!=`function`||!n)return n?.inverse?n.inverse(this)??``:``;let r=e.some(t);return r&&n.fn?n.fn(this):!r&&n.inverse?n.inverse(this):``}},{name:`eachIndex`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t){if(!Array.isArray(e)||!t||typeof t.fn!=`function`)return t?.inverse?t.inverse(this)??``:``;if(e.length===0)return t.inverse?t.inverse(this)??``:``;let n=``;for(let r=0;r<e.length;r++){let i={item:e[r],index:r};n+=t.fn(i)}return n}},{name:`withAfter`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||!n||typeof n.fn!=`function`)return``;let r=e.slice(t+1);if(r.length===0)return n.inverse?n.inverse(this)??``:``;let i=``;for(let e of r)i+=n.fn(e);return i}},{name:`withBefore`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||!n||typeof n.fn!=`function`)return``;let r=e.slice(0,t);if(r.length===0)return n.inverse?n.inverse(this)??``:``;let i=``;for(let e of r)i+=n.fn(e);return i}},{name:`withFirst`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){let r=1,i=n;if(typeof t==`object`&&t&&!Array.isArray(t)?i=t:typeof t==`number`&&(r=t),!Array.isArray(e)||!i||typeof i.fn!=`function`)return``;if(e.length===0)return i.inverse?i.inverse(this)??``:``;let a=e.slice(0,r),o=``;for(let e of a)o+=i.fn(e);return o}},{name:`withLast`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){let r=1,i=n;if(typeof t==`object`&&t&&!Array.isArray(t)?i=t:typeof t==`number`&&(r=t),!Array.isArray(e)||!i||typeof i.fn!=`function`)return``;if(e.length===0)return i.inverse?i.inverse(this)??``:``;let a=e.slice(-r),o=``;for(let e of a)o+=i.fn(e);return o}},{name:`withGroup`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||typeof t!=`number`||t<=0||!n||typeof n.fn!=`function`)return``;if(e.length===0)return n.inverse?n.inverse(this)??``:``;let r=``,i=[];for(let n=0;n<e.length;n+=t)i.push(e.slice(n,n+t));for(let e of i)r+=n.fn(e);return r}},{name:`withSort`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){let r,i=n;if(typeof t==`object`&&t&&!Array.isArray(t)?i=t:typeof t==`string`&&(r=t),!Array.isArray(e)||!i||typeof i.fn!=`function`)return``;if(e.length===0)return i.inverse?i.inverse(this)??``:``;let a=[...e];r?a.sort((e,t)=>{let n=e?.[r],i=t?.[r];return n===i?0:n==null?1:i==null?-1:typeof n==`string`&&typeof i==`string`?n.localeCompare(i):n<i?-1:1}):a.sort((e,t)=>e===t?0:e==null?1:t==null?-1:typeof e==`string`&&typeof t==`string`?e.localeCompare(t):e<t?-1:1),(i.hash?.reverse===!0||i.hash?.reverse===`true`)&&a.reverse();let o=``;for(let e of a)o+=i.fn(e);return o}},{name:`filter`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||!n)return n?.inverse?n.inverse(this)??``:``;let r=e.filter(e=>e===t);return r.length>0&&n.fn?n.fn(this):r.length===0&&n.inverse?n.inverse(this):``}},{name:`map`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>!Array.isArray(e)||typeof t!=`function`?[]:e.map(t)},{name:`pluck`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>!Array.isArray(e)||typeof t!=`string`?[]:e.map(e=>{if(typeof e!=`object`||!e)return;let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r})},{name:`reverse`,category:`array`,compatibility:[`browser`,`nodejs`],fn:e=>{if(typeof e==`string`)return e.split(``).reverse().join(``);if(Array.isArray(e))return[...e].reverse()}},{name:`sort`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{if(!Array.isArray(e))return[];let n=[...e];return typeof t==`function`?n.sort(t):typeof t==`string`?n.sort((e,n)=>{let r=e?.[t],i=n?.[t];return r===i?0:r==null?1:i==null?-1:typeof r==`string`&&typeof i==`string`?r.localeCompare(i):r<i?-1:1}):n.sort((e,t)=>e===t?0:e==null?1:t==null?-1:typeof e==`string`&&typeof t==`string`?e.localeCompare(t):e<t?-1:1),n}},{name:`sortBy`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,...t)=>{if(!Array.isArray(e)||t.length===0)return[];let n=[...e];return n.sort((e,n)=>{for(let r of t){let t=e?.[r],i=n?.[r];if(t!==i){if(t==null)return 1;if(i==null)return-1;if(typeof t==`string`&&typeof i==`string`){let e=t.localeCompare(i);if(e!==0)return e}else return t<i?-1:1}}return 0}),n}},{name:`unique`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t){if(!Array.isArray(e))return t?t.inverse?t.inverse(this)??``:``:[];let n=[...new Set(e)];if(!t)return n;if(n.length===0&&t.inverse)return t.inverse(this);if(n.length>0&&t.fn){let e=``;for(let r of n)e+=t.fn(r);return e}return``}}],oe=e=>e!==void 0&&(e===`/`||e===`!`||e===`?`||/[a-zA-Z]/.test(e)),se=e=>{let t=``,n=!1,r=!1,i=null;for(let a=0;a<e.length;a++){let o=e[a];if(r){o===`-`&&e[a+1]===`-`&&e[a+2]===`>`&&(r=!1,a+=2);continue}if(n){i?o===i&&(i=null):o===`"`||o===`'`?i=o:o===`>`&&(n=!1);continue}if(o===`<`){if(e[a+1]===`!`&&e[a+2]===`-`&&e[a+3]===`-`){r=!0,a+=3;continue}if(oe(e[a+1])){n=!0;continue}}t+=o}return t},ce=new Set([`area`,`base`,`br`,`col`,`command`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`meta`,`param`,`source`,`track`,`wbr`,`circle`,`ellipse`,`line`,`path`,`polygon`,`polyline`,`rect`,`stop`,`use`]),b=(e,t={},n=``)=>{let r=`<${e}`;for(let[e,n]of Object.entries(t))n===!0?r+=` ${e}`:(typeof n==`string`||typeof n==`number`)&&(r+=` ${e}="${le(String(n))}"`);return ce.has(e.toLowerCase())?`${r}>`:`${r}>${ue(n)}</${e}>`},le=e=>e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`).replace(/>/g,`>`),ue=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`),x=(e={})=>Object.keys(e).map(t=>`${t}="${String(e[t]).replace(/^['"]|["']$/g,``)}"`).join(` `),de=[{name:`attr`,category:`html`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=x(e?.hash??{});return t.trim()?` ${t}`:``}},{name:`sanitize`,category:`html`,compatibility:[`browser`,`nodejs`],fn:e=>typeof e==`string`?se(e).trim():``},{name:`ul`,category:`html`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=x(t.hash??{}),r=e.map(e=>typeof e==`string`?e:t.fn(e));return`${n?`<ul ${n}>`:`<ul>`}${r.map(e=>`<li>${e}</li>`).join(`
|
|
2
|
+
`)}</ul>`}},{name:`ol`,category:`html`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=x(t.hash??{}),r=e.map(e=>typeof e==`string`?e:t.fn(e));return`${n?`<ol ${n}>`:`<ol>`}${r.map(e=>`<li>${e}</li>`).join(`
|
|
3
|
+
`)}</ol>`}},{name:`thumbnailImage`,category:`html`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=``,n=``,r=e.full||!1,i={alt:e.alt,src:e.thumbnail,width:e.size.width,height:e.size.height},a={id:`image-${e.id}`},o={href:r,rel:`thumbnail`};return e.classes&&(e.classes.image&&(i.class=e.classes.image.join(` `)),e.classes.figure&&(a.class=e.classes.figure.join(` `)),e.classes.link&&(o.class=e.classes.link.join(` `))),t+=`<figure ${x(a)}>\n`,n+=`<img ${x(i)}>\n`,r?t+=`<a ${x(o)}>\n${n}</a>\n`:t+=n,e.caption&&(t+=`<figcaption>${e.caption}</figcaption>\n`),t+=`</figure>`,t}}],fe=[{name:`gist`,category:`code`,compatibility:[`browser`,`nodejs`],fn:e=>b(`script`,{src:`https://gist.github.com/${e}.js`})},{name:`jsfiddle`,category:`code`,compatibility:[`browser`,`nodejs`],fn:e=>{if(!e?.id)throw Error("jsfiddle helper expects an `id`");let{id:t,width:n=`100%`,height:r=`300`,skin:i=`/presentation/`,tabs:a=`result,js,html,css`,allowfullscreen:o=`allowfullscreen`,frameborder:s=`0`}=e;return b(`iframe`,{width:n,height:r,src:`http://jsfiddle.net/${t}/embedded/${a}${i}`,allowfullscreen:o,frameborder:s})}}],pe=[{name:`isEmpty`,category:`collection`,compatibility:[`browser`,`nodejs`],fn:e=>e==null?!0:Array.isArray(e)?e.length===0:typeof e==`object`?Object.keys(e).length===0:!1},{name:`iterate`,category:`collection`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{if(Array.isArray(e)){let n=``;for(let r=0;r<e.length;r++)n+=t(e[r],r);return n}if(e&&typeof e==`object`){let n=``;for(let r of Object.keys(e))n+=t(e[r],r);return n}return n?n():``}}],me=(...e)=>e.every(Boolean),he=(e,t,n)=>{switch(t){case`==`:return e==n;case`===`:return e===n;case`!=`:return e!=n;case`!==`:return e!==n;case`<`:return e<n;case`>`:return e>n;case`<=`:return e<=n;case`>=`:return e>=n;case`typeof`:return typeof e===n;default:throw Error(`helper {{compare}}: invalid operator: '${t}'`)}},ge=(e,t,n=0)=>e==null?!1:typeof e==`string`||Array.isArray(e)?e.indexOf(t,n)>-1:typeof e==`object`?t in e:!1,_e=(...e)=>{for(let t of e)if(t!=null)return t;return``},ve=(e,t)=>e===t,ye=(e,t)=>e>t,be=(e,t)=>e>=t,xe=(e,t)=>e==null||t==null?!1:Array.isArray(e)||typeof e==`string`?e.indexOf(t)>-1:typeof e==`object`?t in e:!1,S=(e,t)=>{if(!e)return!0;let n=Array.isArray(t)?t:t==null?[`0`,`false`,`nada`,`nil`,`nay`,`nah`,`negative`,`no`,`none`,`nope`,`nul`,`null`,`nix`,`nyet`,`uh-uh`,`veto`,`zero`]:[t],r=typeof e==`string`?e.toLowerCase():null;for(let t of n)if(t===e||r!=null&&t===r)return!0;return!1},Se=[{name:`and`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:me},{name:`compare`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:he},{name:`contains`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:ge},{name:`default`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:_e},{name:`eq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:ve},{name:`gt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:ye},{name:`gte`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:be},{name:`has`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:xe},{name:`isFalsey`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>S(e)},{name:`isTruthy`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>!S(e)},{name:`ifEven`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>typeof e==`number`&&e%2==0},{name:`ifNth`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>typeof e==`number`&&typeof t==`number`&&t%e===0},{name:`ifOdd`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>typeof e==`number`&&Math.abs(e%2)===1},{name:`is`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e==t},{name:`isnt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e!=t},{name:`lt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e<t},{name:`lte`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e<=t},{name:`neither`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>!e&&!t},{name:`not`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>!e},{name:`or`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(...e)=>e.some(Boolean)},{name:`unlessEq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e!==t},{name:`unlessGt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e<=t},{name:`unlessLt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e>=t},{name:`unlessGteq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e<t},{name:`unlessLteq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e>t}];d.default.extend(p.default),d.default.extend(f.default),d.default.extend(h.default),d.default.extend(m.default);const C=e=>{if(!e)return(0,d.default)();if(typeof e==`string`){let t=(0,u.parseDate)(e);return t?(0,d.default)(t):(0,d.default)(e)}return(0,d.default)(e)},Ce=()=>new Date().getFullYear().toString(),w=e=>e.replace(/yyyy/g,`YYYY`).replace(/yy/g,`YY`).replace(/dd/g,`DD`).replace(/mm/g,`MM`).replace(/hh/g,`HH`),T=(e,t)=>{let n=t||`YYYY-MM-DD`,r=C(e);if(!r.isValid())throw Error(`Unable to parse date: ${e}`);let i=w(n);return r.format(i)},we=()=>Date.now().toString(),Te=e=>{let t=w(e||`YYYY-MM-DD HH:mm:ss`);return(0,d.default)().format(t)},E=e=>{let t=C(e);if(!t.isValid())throw Error(`Unable to parse date: ${e}`);return t.fromNow()},Ee=[{name:`year`,category:`date`,compatibility:[`browser`,`nodejs`],fn:Ce},{name:`date`,category:`date`,compatibility:[`browser`,`nodejs`],fn:T},{name:`moment`,category:`date`,compatibility:[`browser`,`nodejs`],fn:T},{name:`timestamp`,category:`date`,compatibility:[`browser`,`nodejs`],fn:we},{name:`now`,category:`date`,compatibility:[`browser`,`nodejs`],fn:Te},{name:`fromNow`,category:`date`,compatibility:[`browser`,`nodejs`],fn:E},{name:`toNow`,category:`date`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=C(e);if(!t.isValid())throw Error(`Unable to parse date: ${e}`);return t.toNow()}},{name:`ago`,category:`date`,compatibility:[`browser`,`nodejs`],fn:e=>E(e)},{name:`dateAdd`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=C(e);if(!r.isValid())throw Error(`Unable to parse date: ${e}`);return r.add(t,n).format(`YYYY-MM-DD HH:mm:ss`)}},{name:`dateSubtract`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=C(e);if(!r.isValid())throw Error(`Unable to parse date: ${e}`);return r.subtract(t,n).format(`YYYY-MM-DD HH:mm:ss`)}},{name:`startOf`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=C(e);if(!n.isValid())throw Error(`Unable to parse date: ${e}`);return n.startOf(t).format(`YYYY-MM-DD HH:mm:ss`)}},{name:`endOf`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=C(e);if(!n.isValid())throw Error(`Unable to parse date: ${e}`);return n.endOf(t).format(`YYYY-MM-DD HH:mm:ss`)}},{name:`isBefore`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=C(e),r=C(t);if(!n.isValid()||!r.isValid())throw Error(`Unable to parse dates: ${e}, ${t}`);return n.isBefore(r)}},{name:`isAfter`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=C(e),r=C(t);if(!n.isValid()||!r.isValid())throw Error(`Unable to parse dates: ${e}, ${t}`);return n.isAfter(r)}},{name:`isSame`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=C(e),i=C(t);if(!r.isValid()||!i.isValid())throw Error(`Unable to parse dates: ${e}, ${t}`);return r.isSame(i,n)}},{name:`isBetween`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=C(e),i=C(t),a=C(n);if(!r.isValid()||!i.isValid()||!a.isValid())throw Error(`Unable to parse dates: ${e}, ${t}, ${n}`);return r.isBetween(i,a,null,`[]`)}},{name:`diff`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=C(e),i=C(t);if(!r.isValid()||!i.isValid())throw Error(`Unable to parse dates: ${e}, ${t}`);return r.diff(i,n)}},{name:`toISOString`,category:`date`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=C(e);if(!t.isValid())throw Error(`Unable to parse date: ${e}`);return t.toISOString()}},{name:`dateTimezone`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=w(n||`YYYY-MM-DD HH:mm:ss`),i=C(e);if(!i.isValid())throw Error(`Unable to parse date: ${e}`);return i.tz(t).format(r)}},{name:`dateLocale`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=w(n||`YYYY-MM-DD HH:mm:ss`),i=C(e);if(!i.isValid())throw Error(`Unable to parse date: ${e}`);return i.locale(t).format(r)}}],D=(e,t)=>{if(!e||typeof e!=`object`)return;let n=Array.isArray(t)?t:t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r},O=(e,t)=>{if(!e||typeof e!=`object`)return;let n=Array.isArray(t)?t:t.split(`.`);if(n.length===0)return;let r=e;for(let e=0;e<n.length-1;e++){if(typeof r!=`object`||!r)return;r=r[n[e]]}let i=n[n.length-1];if(!(typeof r!=`object`||!r||!(i in r)))return{[i]:r[i]}},k=(e,t,n)=>{let r={};return e&&typeof e==`object`&&e.options&&Object.assign(r,e.options),t&&typeof t==`object`&&(`hash`in t?Object.assign(r,t.hash):Object.assign(r,t)),n&&typeof n==`object`&&(`hash`in n?Object.assign(r,n.hash):Object.assign(r,n)),r},De=[{name:`i18n`,category:`i18n`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(t&&typeof t==`object`&&`hash`in t&&n===void 0&&(n=t,t={}),typeof e!=`string`)throw Error(`{{i18n}} helper expected "key" to be a string`);let r={...this,...t,...n?.hash??{}},i=r.language||r.lang;if(typeof i!=`string`)throw TypeError(`{{i18n}} helper expected "language" to be a string`);let a=r[i];if(a===void 0)throw Error(`{{i18n}} helper cannot find language "${i}"`);let o=D(a,e);if(o===void 0)throw Error(`{{i18n}} helper cannot find property "`+String(e)+`" for language "`+i+`"`);return String(o)}}],Oe=[{name:`inflect`,category:`inflection`,compatibility:[`browser`,`nodejs`],fn:(e,t,n,r)=>{let i=e>1||e===0?n:t;return r?`${e} ${i}`:i}},{name:`ordinalize`,category:`inflection`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=Math.abs(Math.round(Number(e))),n=String(e),r=t%100;if([11,12,13].includes(r))return`${n}th`;switch(t%10){case 1:return`${n}st`;case 2:return`${n}nd`;case 3:return`${n}rd`;default:return`${n}th`}}}],A=(e,t,n)=>{let r=typeof t==`string`?t.split(/, */):t;return(0,g.default)(typeof e==`string`?[e]:e,r,n)},ke=[{name:`match`,category:`match`,compatibility:[`browser`,`nodejs`],fn:A},{name:`isMatch`,category:`match`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>g.default.isMatch(e,t,n)},{name:`mm`,category:`match`,compatibility:[`browser`,`nodejs`],fn:(...e)=>(console.log(`the {{mm}} helper is depcrecated and will be removed`),console.log(`in handlebars-helpers v1.0.0, please use the {{match}}`),console.log(`helper instead.`),A(...e))}],j=e=>typeof e==`number`&&!Number.isNaN(e)||typeof e==`string`&&e.trim()!==``&&!Number.isNaN(Number(e)),M=(e,t=`expected a number`)=>{if(j(e))return Number(e);throw TypeError(t)},Ae=e=>{let t=M(e);return Math.abs(t)},je=(e,t)=>j(e)&&j(t)?Number(e)+Number(t):``,Me=(...e)=>{let t=e.flat().map(e=>Number(e));return P(t)/t.length},Ne=e=>{let t=M(e);return Math.ceil(t)},Pe=(e,t)=>M(e,`expected the first argument to be a number`)/M(t,`expected the second argument to be a number`),Fe=e=>{let t=M(e);return Math.floor(t)},Ie=(e,t)=>M(e,`expected the first argument to be a number`)-M(t,`expected the second argument to be a number`),Le=(e,t)=>M(e,`expected the first argument to be a number`)%M(t,`expected the second argument to be a number`),N=(e,t)=>M(e,`expected the first argument to be a number`)*M(t,`expected the second argument to be a number`),Re=(e,t)=>M(e,`expected the first argument to be a number`)+M(t,`expected the second argument to be a number`),ze=(e,t)=>{let n=M(e,`expected minimum to be a number`),r=M(t,`expected maximum to be a number`);return n+Math.floor(Math.random()*(r-n+1))},Be=(e,t)=>e%t,Ve=e=>{let t=M(e);return Math.round(t)},He=(e,t)=>M(e,`expected the first argument to be a number`)-M(t,`expected the second argument to be a number`),P=(...e)=>{let t=e.flat(),n=0;for(let e of t)j(e)&&(n+=Number(e));return n},Ue=[{name:`abs`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ae},{name:`add`,category:`math`,compatibility:[`browser`,`nodejs`],fn:je},{name:`avg`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Me},{name:`ceil`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ne},{name:`divide`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Pe},{name:`floor`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Fe},{name:`minus`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ie},{name:`modulo`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Le},{name:`multiply`,category:`math`,compatibility:[`browser`,`nodejs`],fn:N},{name:`plus`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Re},{name:`random`,category:`math`,compatibility:[`browser`,`nodejs`],fn:ze},{name:`remainder`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Be},{name:`round`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ve},{name:`subtract`,category:`math`,compatibility:[`browser`,`nodejs`],fn:He},{name:`sum`,category:`math`,compatibility:[`browser`,`nodejs`],fn:P},{name:`times`,category:`math`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>N(e,t)}],We=new _.default({breaks:!0,html:!0,langPrefix:`lang-`,typographer:!1,xhtmlOut:!1});function Ge(e){return new l.default.SafeString(We.render(e))}const F=function(e,t){return typeof e==`object`&&e&&`fn`in e&&typeof e.fn==`function`?e=e.fn(this):typeof e!=`string`&&(e=``),Ge(e)},Ke=[{name:`md`,category:`markdown`,compatibility:[`browser`,`nodejs`],fn:F},{name:`markdown`,category:`markdown`,compatibility:[`browser`,`nodejs`],fn:F}],I=Object.prototype.toString;function L(e){return typeof e.constructor==`function`?e.constructor.name:null}function qe(e){return L(e)===`GeneratorFunction`}function Je(e){return typeof e.throw==`function`&&typeof e.return==`function`&&typeof e.next==`function`}function Ye(e){return typeof e.toDateString==`function`&&typeof e.getDate==`function`&&typeof e.setDate==`function`}function Xe(e){return typeof e.message==`string`&&e.constructor&&typeof e.constructor.stackTraceLimit==`number`}function Ze(e){return typeof e.flags==`string`&&typeof e.ignoreCase==`boolean`&&typeof e.multiline==`boolean`&&typeof e.global==`boolean`}function Qe(e){if(e===void 0)return`undefined`;if(e===null)return`null`;let t=typeof e;if(t===`boolean`)return`boolean`;if(t===`string`)return`string`;if(t===`number`)return`number`;if(t===`symbol`)return`symbol`;if(t===`bigint`)return`bigint`;if(t===`function`)return qe(e)?`generatorfunction`:`function`;if(Array.isArray(e))return`array`;if(typeof Buffer<`u`&&Buffer.isBuffer?.(e))return`buffer`;if(typeof e.length==`number`&&I.call(e)===`[object Arguments]`)return`arguments`;if(e instanceof Date||Ye(e))return`date`;if(e instanceof Error||Xe(e))return`error`;if(e instanceof RegExp||Ze(e))return`regexp`;switch(L(e)){case`Promise`:return`promise`;case`WeakMap`:return`weakmap`;case`WeakSet`:return`weakset`;case`Map`:return`map`;case`Set`:return`set`;case`Int8Array`:return`int8array`;case`Uint8Array`:return`uint8array`;case`Uint8ClampedArray`:return`uint8clampedarray`;case`Int16Array`:return`int16array`;case`Uint16Array`:return`uint16array`;case`Int32Array`:return`int32array`;case`Uint32Array`:return`uint32array`;case`Float32Array`:return`float32array`;case`Float64Array`:return`float64array`}if(Je(e))return`generator`;let n=I.call(e);switch(n){case`[object Object]`:return`object`;case`[object Map Iterator]`:return`mapiterator`;case`[object Set Iterator]`:return`setiterator`;case`[object String Iterator]`:return`stringiterator`;case`[object Array Iterator]`:return`arrayiterator`}return n.slice(8,-1).toLowerCase().replace(/\s/g,``)}function $e(e,t){typeof e==`object`&&e&&`hash`in e&&(t=e,e=t.data);let n=l.default.createFrame(e||{});return(typeof t!=`object`||!t)&&(t={}),t.hash&&typeof t.hash==`object`&&Object.assign(n,t.hash),t.fn(this,{data:n})}function et(e,t,n){return D(k(this,t,n),e)}function tt(e){return e.fn(this)}const nt=Qe;function rt(e){return e.hash&&Object.keys(e.hash).length?e.fn(e.hash):e.inverse(this)}const it=[{name:`frame`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:$e},{name:`option`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:et},{name:`noop`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:tt},{name:`typeOf`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:nt},{name:`withHash`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:rt}],R=e=>typeof e==`number`&&!Number.isNaN(e),at=[{name:`bytes`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{if(e==null)return`0 B`;let n;if(typeof e==`string`){if(n=e.length,!n)return`0 B`}else if(R(e))n=Number(e);else if(typeof e.length==`number`){if(n=e.length,!n)return`0 B`}else return`0 B`;let r=typeof t==`number`&&!Number.isNaN(t)?t:2,i=[`B`,`kB`,`MB`,`GB`,`TB`,`PB`,`EB`,`ZB`,`YB`],a=10**r;for(let e=i.length-1;e>=0;e--){let t=10**(e*3);if(t<=n+1)return`${Math.round(n*a/t)/a} ${i[e]}`}return`${n}`}},{name:`addCommas`,category:`number`,compatibility:[`browser`,`nodejs`],fn:e=>e.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g,`$1,`)},{name:`phoneNumber`,category:`number`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=e.toString();return`(${t.substr(0,3)}) ${t.substr(3,3)}-${t.substr(6,4)}`}},{name:`toAbbr`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=R(e)?Number(e):0,r=10**(typeof t==`number`&&!Number.isNaN(t)?t:2),i=[`k`,`m`,`b`,`t`,`q`];for(let e=i.length-1;e>=0;e--){let t=10**((e+1)*3);if(t<=n+1)return`${Math.round(n*r/t)/r}${i[e]}`}return`${n}`}},{name:`toExponential`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=R(e)?Number(e):0,r=typeof t==`number`&&!Number.isNaN(t)?t:0;return Number(n).toExponential(r)}},{name:`toFixed`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=R(e)?Number(e):0,r=typeof t==`number`&&!Number.isNaN(t)?t:0;return Number(n).toFixed(r)}},{name:`toFloat`,category:`number`,compatibility:[`browser`,`nodejs`],fn:e=>parseFloat(String(e))},{name:`toInt`,category:`number`,compatibility:[`browser`,`nodejs`],fn:e=>parseInt(String(e),10)},{name:`toPrecision`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=R(e)?Number(e):0,r=typeof t==`number`&&!Number.isNaN(t)?t:1;return Number(n).toPrecision(r)}}],z=e=>!!(e&&typeof e==`object`&&`hash`in e),B=(e,t)=>({...e?.data||{},...t}),ot=(...e)=>{let t=[...e];if(t.length&&z(t[t.length-1])){let e=t.pop();t.push(e.hash)}let n={};for(let e of t)e&&typeof e==`object`&&!Array.isArray(e)&&Object.assign(n,e);return n},st=(e,t)=>{if(!z(t))return t?.inverse?.(e)??``;let n=B(t,t.hash||{}),r=``;for(let i in e)n.key=i,r+=t.fn(e[i],{data:n});return r},ct=(e,t)=>{if(!z(t))return t?.inverse?.(e)??``;let n=B(t,t.hash||{}),r=``;for(let i in e)Object.hasOwn(e,i)&&(n.key=i,r+=t.fn(e[i],{data:n}));return r},lt=(...e)=>{let t=[];for(let n of e)(typeof n==`string`||typeof n==`number`)&&t.push(n);return t.join(`.`)},ut=(e,t,n)=>{let r=D(t,e);return n&&typeof n.fn==`function`?r?n.fn(r):n.inverse?.(t):r},dt=(e,t)=>O(t,e),ft=(e,t)=>Object.hasOwn(e,t),pt=e=>!!e&&typeof e==`object`&&!Array.isArray(e),V=e=>JSON.parse(e),H=(e,t)=>JSON.stringify(e,null,typeof t==`number`?t:0),mt=[{name:`extend`,category:`object`,compatibility:[`browser`,`nodejs`],fn:ot},{name:`forIn`,category:`object`,compatibility:[`browser`,`nodejs`],fn:st},{name:`forOwn`,category:`object`,compatibility:[`browser`,`nodejs`],fn:ct},{name:`toPath`,category:`object`,compatibility:[`browser`,`nodejs`],fn:lt},{name:`get`,category:`object`,compatibility:[`browser`,`nodejs`],fn:ut},{name:`getObject`,category:`object`,compatibility:[`browser`,`nodejs`],fn:dt},{name:`hasOwn`,category:`object`,compatibility:[`browser`,`nodejs`],fn:ft},{name:`isObject`,category:`object`,compatibility:[`browser`,`nodejs`],fn:pt},{name:`JSONparse`,category:`object`,compatibility:[`browser`,`nodejs`],fn:V},{name:`JSONstringify`,category:`object`,compatibility:[`browser`,`nodejs`],fn:H},{name:`merge`,category:`object`,compatibility:[`browser`,`nodejs`],fn:(e,...t)=>{let n=[e,...t];if(n.length&&z(n[n.length-1])){let e=n.pop();n.push(e.hash)}return Object.assign(n[0],...n.slice(1))}},{name:`parseJSON`,category:`object`,compatibility:[`browser`,`nodejs`],fn:V},{name:`pick`,category:`object`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=v(e),i={};for(let e of r)i=Object.assign({},i,O(t,e));return n&&typeof n.fn==`function`?Object.keys(i).length?n.fn(i):n.inverse?.(t):i}},{name:`stringify`,category:`object`,compatibility:[`browser`,`nodejs`],fn:H}],ht=[{name:`toRegex`,category:`regex`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=k({},t,n);return new RegExp(e,r.flags)}},{name:`test`,category:`regex`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{if(typeof e!=`string`)return!1;if(!(t instanceof RegExp))throw TypeError(`expected a regular expression`);return t.test(e)}}],U=e=>e.trim().replace(/^[-_.\W\s]+|[-_.\W\s]+$/g,``),W=(e,t)=>e.length===1?e.toLowerCase():U(e).toLowerCase().replace(/[-_.\W\s]+(\w|$)/g,(e,n)=>t(n)),gt=(e,t)=>typeof e==`string`&&typeof t==`string`?e+t:e,_t=e=>typeof e==`string`?W(e,e=>e.toUpperCase()):``,G=e=>typeof e!=`string`||e.length===0?``:e.charAt(0).toUpperCase()+e.slice(1),vt=e=>typeof e==`string`?e.replace(/\w\S*/g,e=>G(e)):``,yt=(e,t)=>{if(typeof e!=`string`)return``;let n=``;for(let e=0;e<t;e++)n+=` `;return n+e+n},bt=e=>typeof e==`string`?U(e):``,xt=e=>typeof e==`string`?W(e,e=>`-${e}`):``,St=e=>typeof e==`string`?W(e,e=>`.${e}`):``,K=(e,t,n)=>typeof e==`string`?(typeof n!=`string`&&(n=``),e.length>t?e.slice(0,t-n.length)+n:e):``,Ct=(e,t)=>typeof e==`string`?e.length<=t?e:`${K(e,t)}…`:``,wt=e=>typeof e==`string`?e.split(` `).join(`-`):``,Tt=e=>typeof e==`string`,q=e=>typeof e==`object`&&e&&`fn`in e&&typeof e.fn==`function`?String(e.fn()).toLowerCase():typeof e==`string`?e.toLowerCase():``,Et=e=>q(e),Dt=(e,t)=>{if(typeof e!=`string`)return``;let n=t.length,r=e.indexOf(t,0),i=0;for(;r>-1;)i++,r=e.indexOf(t,r+n);return i},Ot=e=>{if(typeof e!=`string`)return``;let t=W(e,e=>e.toUpperCase());return t.charAt(0).toUpperCase()+t.slice(1)},kt=e=>typeof e==`string`?W(e,e=>`/${e}`):``,At=(e,t)=>typeof e==`string`?(typeof t!=`string`&&(t=` `),e.split(t).join(`+`)):``,jt=(e,t)=>typeof e==`string`&&typeof t==`string`?t+e:e,Mt=(e,t)=>typeof e==`string`?typeof t==`string`?e.split(t).join(``):e:``,Nt=(e,t)=>typeof e==`string`?typeof t==`string`?e.replace(t,``):e:``,Pt=(e,t,n)=>typeof e==`string`?typeof t==`string`?(typeof n!=`string`&&(n=``),e.split(t).join(n)):e:``,Ft=(e,t,n)=>typeof e==`string`?typeof t==`string`?(typeof n!=`string`&&(n=``),e.replace(t,n)):e:``,It=e=>typeof e==`string`?e.split(``).reverse().join(``):``,Lt=e=>typeof e==`string`?e.replace(/((?:\S[^.?!]*)[.?!]*)/g,e=>e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()):``,Rt=e=>typeof e==`string`?W(e,e=>`_${e}`):``,J=e=>typeof e==`string`?e.trim():``,zt=e=>typeof e==`string`?e.replace(/^\s+/,``):``,Bt=e=>typeof e==`string`?e.replace(/\s+$/,``):``,Vt=(e,t,n)=>{if(typeof e==`string`&&typeof t==`number`&&Number.isFinite(t)){typeof n!=`string`&&(n=`...`);let r=Math.trunc(t),i=e.split(` `);return r<i.length&&(i=i.slice(0,r)),i.join(` `).trim()+n}return``},Y=e=>typeof e==`object`&&e&&`fn`in e&&typeof e.fn==`function`?String(e.fn()).toUpperCase():typeof e==`string`?e.toUpperCase():``,Ht=[{name:`append`,category:`string`,compatibility:[`browser`,`nodejs`],fn:gt},{name:`camelcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:_t},{name:`capitalize`,category:`string`,compatibility:[`browser`,`nodejs`],fn:G},{name:`capitalizeAll`,category:`string`,compatibility:[`browser`,`nodejs`],fn:vt},{name:`center`,category:`string`,compatibility:[`browser`,`nodejs`],fn:yt},{name:`chop`,category:`string`,compatibility:[`browser`,`nodejs`],fn:bt},{name:`dashcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:xt},{name:`dotcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:St},{name:`ellipsis`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Ct},{name:`hyphenate`,category:`string`,compatibility:[`browser`,`nodejs`],fn:wt},{name:`isString`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Tt},{name:`lowercase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:q},{name:`downcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Et},{name:`occurrences`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Dt},{name:`pascalcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Ot},{name:`pathcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:kt},{name:`plusify`,category:`string`,compatibility:[`browser`,`nodejs`],fn:At},{name:`prepend`,category:`string`,compatibility:[`browser`,`nodejs`],fn:jt},{name:`remove`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Mt},{name:`removeFirst`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Nt},{name:`replace`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Pt},{name:`replaceFirst`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Ft},{name:`reverse`,category:`string`,compatibility:[`browser`,`nodejs`],fn:It},{name:`sentence`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Lt},{name:`snakecase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Rt},{name:`trim`,category:`string`,compatibility:[`browser`,`nodejs`],fn:J},{name:`trimLeft`,category:`string`,compatibility:[`browser`,`nodejs`],fn:zt},{name:`trimRight`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Bt},{name:`truncate`,category:`string`,compatibility:[`browser`,`nodejs`],fn:K},{name:`truncateWords`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Vt},{name:`uppercase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Y},{name:`upcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:e=>Y(e)},{name:`split`,category:`string`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>typeof e==`string`?(typeof t!=`string`&&(t=``),e.split(t)):``},{name:`startsWith`,category:`string`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>typeof e!=`string`||typeof t!=`string`?!1:t.startsWith(e)},{name:`titleize`,category:`string`,compatibility:[`browser`,`nodejs`],fn:e=>typeof e==`string`?e.replace(/\w\S*/g,e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()):``},{name:`raw`,category:`string`,compatibility:[`browser`,`nodejs`],fn:e=>e&&typeof e.fn==`function`?e.fn():``}],X=[`browser`,`nodejs`],Z=e=>{if(typeof e==`string`)return encodeURIComponent(e)},Q=e=>{if(typeof e==`string`)return decodeURIComponent(e)};function Ut(...e){return Z.apply(this,e)}function Wt(...e){return Q.apply(this,e)}const Gt=[{name:`encodeURI`,category:`url`,compatibility:X,fn:Z},{name:`decodeURI`,category:`url`,compatibility:X,fn:Q},{name:`url_encode`,category:`url`,compatibility:X,fn:Ut},{name:`url_decode`,category:`url`,compatibility:X,fn:Wt},{name:`stripQuerystring`,category:`url`,compatibility:X,fn:e=>{if(typeof e==`string`)return e.split(`?`)[0]}}];var $=class extends ee{init(){this.registerHelpers(ae),this.registerHelpers(pe),this.registerHelpers(Ee),this.registerHelpers(fe),this.registerHelpers(de),this.registerHelpers(Se),this.registerHelpers(De),this.registerHelpers(Oe),this.registerHelpers(ke),this.registerHelpers(Ue),this.registerHelpers(Ke),this.registerHelpers(it),this.registerHelpers(at),this.registerHelpers(ht),this.registerHelpers(Ht),this.registerHelpers(Gt),this.registerHelpers(mt)}};const Kt=l.default,qt=l.default.create();function Jt(e){new $().load(e.handlebars??e.hbs)}async function Yt(){let e=new $,t=l.default.create();return Object.keys(l.default.partials).length>0&&t.registerPartial(l.default.partials),e.load(t),typeof process<`u`&&process.env?.NODE_ENV===`development`&&console.warn("createHandlebars will be deprecated in future versions, use `fumanchu` instead."),t}function Xt(e){let t=new $,n=l.default.create();if(e?.handlebars?n=e.handlebars:Object.keys(l.default.partials).length>0&&n.registerPartial(l.default.partials),t.load(n),e?.caching){let t;t=e.caching instanceof c.CacheableMemory?e.caching:typeof e.caching==`object`?new c.CacheableMemory({useClone:!1,...e.caching}):new c.CacheableMemory({useClone:!1});let r=n.compile.bind(n);n.compile=(e,n)=>{let i=n?`${e}\0${JSON.stringify(n)}`:e,a=t.get(i);if(a)return a;let o=r(e,n);return t.set(i,o),o}}return n}exports.CacheableMemory=c.CacheableMemory,exports.Handlebars=Kt,exports.HelperRegistry=$,exports.createHandlebars=Yt,exports.fumanchu=Xt,exports.handlebars=qt,exports.helpers=Jt;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { CacheableMemory, CacheableMemoryOptions } from "@cacheable/memory";
|
|
2
|
+
import HandlebarsLib from "handlebars";
|
|
3
|
+
|
|
4
|
+
//#region src/helper-registry-base.d.ts
|
|
5
|
+
type Helper = {
|
|
6
|
+
name: string;
|
|
7
|
+
category: string;
|
|
8
|
+
compatibility?: string[];
|
|
9
|
+
fn: (...arguments_: any[]) => any;
|
|
10
|
+
};
|
|
11
|
+
type HelperFilter = {
|
|
12
|
+
names?: string[];
|
|
13
|
+
categories?: string[];
|
|
14
|
+
compatibility?: string[];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Base class for helper registries. Holds all state-management logic and
|
|
18
|
+
* leaves `init()` empty so environment-specific subclasses decide which
|
|
19
|
+
* helper sets to register. This lets the browser registry avoid importing
|
|
20
|
+
* any Node-only helper files.
|
|
21
|
+
*/
|
|
22
|
+
declare class HelperRegistryBase {
|
|
23
|
+
protected readonly _helpers: Helper[];
|
|
24
|
+
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Get all registered helpers.
|
|
27
|
+
*/
|
|
28
|
+
get helpers(): Helper[];
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the helper registry. Overridden by subclasses.
|
|
31
|
+
*/
|
|
32
|
+
init(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Register a helper. Returns true if the helper was added, false if a
|
|
35
|
+
* helper with the same name was already present.
|
|
36
|
+
*/
|
|
37
|
+
register(helper: Helper): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Register multiple helpers.
|
|
40
|
+
*/
|
|
41
|
+
registerHelpers(helpers: Helper[]): void;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a helper is registered.
|
|
44
|
+
*/
|
|
45
|
+
has(name: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Filter helpers by the given criteria.
|
|
48
|
+
*/
|
|
49
|
+
filter(filter: HelperFilter): Helper[];
|
|
50
|
+
/**
|
|
51
|
+
* Load Handlebars helpers.
|
|
52
|
+
*/
|
|
53
|
+
load(handlebars: any, filters?: HelperFilter): void;
|
|
54
|
+
/**
|
|
55
|
+
* Swap Handlebars helpers. This is used when you want to swap out legacy
|
|
56
|
+
* helpers for fumanchu helpers.
|
|
57
|
+
*/
|
|
58
|
+
swap(handlebars: any): void;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/helper-registry-browser.d.ts
|
|
62
|
+
/**
|
|
63
|
+
* Browser-only helper registry. Registers every environment-neutral helper
|
|
64
|
+
* and omits anything that depends on Node core modules (fs, path, logging,
|
|
65
|
+
* markdown, node-only url/html/code helpers).
|
|
66
|
+
*/
|
|
67
|
+
declare class HelperRegistryBrowser extends HelperRegistryBase {
|
|
68
|
+
init(): void;
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/index.browser.d.ts
|
|
72
|
+
/**
|
|
73
|
+
* Handlebars library not initiated with helpers
|
|
74
|
+
* @type {Handlebars}
|
|
75
|
+
*/
|
|
76
|
+
declare const Handlebars: typeof HandlebarsLib;
|
|
77
|
+
/**
|
|
78
|
+
* Fumanchu Handlebars instance not initiated with helpers
|
|
79
|
+
* @type {Handlebars}
|
|
80
|
+
*/
|
|
81
|
+
declare const handlebars: typeof HandlebarsLib;
|
|
82
|
+
/**
|
|
83
|
+
* Fumanchu Handlebars helpers
|
|
84
|
+
*/
|
|
85
|
+
type HelpersOptions = {
|
|
86
|
+
handlebars?: typeof HandlebarsLib;
|
|
87
|
+
hbs?: typeof HandlebarsLib;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Register Fumanchu browser-safe Handlebars helpers.
|
|
91
|
+
*/
|
|
92
|
+
declare function helpers(options: HelpersOptions): void;
|
|
93
|
+
/**
|
|
94
|
+
* Create a new Handlebars instance with Fumanchu browser-safe helpers.
|
|
95
|
+
* @returns {Promise<Handlebars>}
|
|
96
|
+
* @deprecated Will be deprecated in future versions, use `fumanchu()` instead.
|
|
97
|
+
*/
|
|
98
|
+
declare function createHandlebars(): Promise<typeof HandlebarsLib>;
|
|
99
|
+
type FumanchuOptions = {
|
|
100
|
+
handlebars?: typeof HandlebarsLib;
|
|
101
|
+
filter?: HelperFilter;
|
|
102
|
+
caching?: boolean | CacheableMemory | CacheableMemoryOptions;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Return a Handlebars instance with Fumanchu browser-safe helpers.
|
|
106
|
+
*/
|
|
107
|
+
declare function fumanchu(options?: FumanchuOptions): typeof HandlebarsLib;
|
|
108
|
+
//#endregion
|
|
109
|
+
export { CacheableMemory, type CacheableMemoryOptions, FumanchuOptions, Handlebars, type HelperFilter, HelperRegistryBrowser as HelperRegistry, HelpersOptions, createHandlebars, fumanchu, handlebars, helpers };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { CacheableMemory, CacheableMemoryOptions } from "@cacheable/memory";
|
|
2
|
+
import Handlebars$1 from "handlebars";
|
|
3
|
+
|
|
4
|
+
//#region src/helper-registry-base.d.ts
|
|
5
|
+
type Helper = {
|
|
6
|
+
name: string;
|
|
7
|
+
category: string;
|
|
8
|
+
compatibility?: string[];
|
|
9
|
+
fn: (...arguments_: any[]) => any;
|
|
10
|
+
};
|
|
11
|
+
type HelperFilter = {
|
|
12
|
+
names?: string[];
|
|
13
|
+
categories?: string[];
|
|
14
|
+
compatibility?: string[];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Base class for helper registries. Holds all state-management logic and
|
|
18
|
+
* leaves `init()` empty so environment-specific subclasses decide which
|
|
19
|
+
* helper sets to register. This lets the browser registry avoid importing
|
|
20
|
+
* any Node-only helper files.
|
|
21
|
+
*/
|
|
22
|
+
declare class HelperRegistryBase {
|
|
23
|
+
protected readonly _helpers: Helper[];
|
|
24
|
+
constructor();
|
|
25
|
+
/**
|
|
26
|
+
* Get all registered helpers.
|
|
27
|
+
*/
|
|
28
|
+
get helpers(): Helper[];
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the helper registry. Overridden by subclasses.
|
|
31
|
+
*/
|
|
32
|
+
init(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Register a helper. Returns true if the helper was added, false if a
|
|
35
|
+
* helper with the same name was already present.
|
|
36
|
+
*/
|
|
37
|
+
register(helper: Helper): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Register multiple helpers.
|
|
40
|
+
*/
|
|
41
|
+
registerHelpers(helpers: Helper[]): void;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a helper is registered.
|
|
44
|
+
*/
|
|
45
|
+
has(name: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Filter helpers by the given criteria.
|
|
48
|
+
*/
|
|
49
|
+
filter(filter: HelperFilter): Helper[];
|
|
50
|
+
/**
|
|
51
|
+
* Load Handlebars helpers.
|
|
52
|
+
*/
|
|
53
|
+
load(handlebars: any, filters?: HelperFilter): void;
|
|
54
|
+
/**
|
|
55
|
+
* Swap Handlebars helpers. This is used when you want to swap out legacy
|
|
56
|
+
* helpers for fumanchu helpers.
|
|
57
|
+
*/
|
|
58
|
+
swap(handlebars: any): void;
|
|
59
|
+
}
|
|
60
|
+
//#endregion
|
|
61
|
+
//#region src/helper-registry-browser.d.ts
|
|
62
|
+
/**
|
|
63
|
+
* Browser-only helper registry. Registers every environment-neutral helper
|
|
64
|
+
* and omits anything that depends on Node core modules (fs, path, logging,
|
|
65
|
+
* markdown, node-only url/html/code helpers).
|
|
66
|
+
*/
|
|
67
|
+
declare class HelperRegistryBrowser extends HelperRegistryBase {
|
|
68
|
+
init(): void;
|
|
69
|
+
}
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/index.browser.d.ts
|
|
72
|
+
/**
|
|
73
|
+
* Handlebars library not initiated with helpers
|
|
74
|
+
* @type {Handlebars}
|
|
75
|
+
*/
|
|
76
|
+
declare const Handlebars: typeof Handlebars$1;
|
|
77
|
+
/**
|
|
78
|
+
* Fumanchu Handlebars instance not initiated with helpers
|
|
79
|
+
* @type {Handlebars}
|
|
80
|
+
*/
|
|
81
|
+
declare const handlebars: typeof Handlebars$1;
|
|
82
|
+
/**
|
|
83
|
+
* Fumanchu Handlebars helpers
|
|
84
|
+
*/
|
|
85
|
+
type HelpersOptions = {
|
|
86
|
+
handlebars?: typeof Handlebars$1;
|
|
87
|
+
hbs?: typeof Handlebars$1;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Register Fumanchu browser-safe Handlebars helpers.
|
|
91
|
+
*/
|
|
92
|
+
declare function helpers(options: HelpersOptions): void;
|
|
93
|
+
/**
|
|
94
|
+
* Create a new Handlebars instance with Fumanchu browser-safe helpers.
|
|
95
|
+
* @returns {Promise<Handlebars>}
|
|
96
|
+
* @deprecated Will be deprecated in future versions, use `fumanchu()` instead.
|
|
97
|
+
*/
|
|
98
|
+
declare function createHandlebars(): Promise<typeof Handlebars$1>;
|
|
99
|
+
type FumanchuOptions = {
|
|
100
|
+
handlebars?: typeof Handlebars$1;
|
|
101
|
+
filter?: HelperFilter;
|
|
102
|
+
caching?: boolean | CacheableMemory | CacheableMemoryOptions;
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Return a Handlebars instance with Fumanchu browser-safe helpers.
|
|
106
|
+
*/
|
|
107
|
+
declare function fumanchu(options?: FumanchuOptions): typeof Handlebars$1;
|
|
108
|
+
//#endregion
|
|
109
|
+
export { CacheableMemory, type CacheableMemoryOptions, FumanchuOptions, Handlebars, type HelperFilter, HelperRegistryBrowser as HelperRegistry, HelpersOptions, createHandlebars, fumanchu, handlebars, helpers };
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{CacheableMemory as e}from"@cacheable/memory";import t from"handlebars";import{parseDate as n}from"chrono-node";import r from"dayjs";import i from"dayjs/plugin/isBetween.js";import a from"dayjs/plugin/relativeTime.js";import o from"dayjs/plugin/timezone.js";import s from"dayjs/plugin/utc.js";import c from"micromatch";import l from"markdown-it";var u=class{_helpers=[];constructor(){this.init()}get helpers(){return this._helpers}init(){}register(e){return this.has(e.name)?!1:(this._helpers.push(e),!0)}registerHelpers(e){for(let t of e)this.register(t)}has(e){return this._helpers.some(t=>t.name===e)}filter(e){let t=this._helpers;if(e.names){let n=e.names;t=t.filter(e=>n.includes(e.name))}if(e.categories){let n=e.categories;t=t.filter(e=>n.includes(e.category))}if(e.compatibility){let n=e.compatibility;t=t.filter(e=>e.compatibility?.some(e=>n.includes(e)))}return t}load(e,t){let n=this._helpers;t&&(n=this.filter(t));for(let t of n)e.registerHelper(t.name,t.fn)}swap(e){for(let t of this._helpers)e.registerHelper(t.name,t.fn)}};const ee=(e,t)=>Array.isArray(e)?e.slice(t):[],te=(e,t)=>Array.isArray(e)?e.slice(0,-t):[],d=e=>e==null?[]:Array.isArray(e)?e:[e],f=(e,t)=>{if(Array.isArray(e))return typeof t==`number`?e.slice(0,t):e[0]},ne=(e,t)=>{if(!Array.isArray(e)&&typeof e!=`string`)return;if(typeof t!=`number`){let t=e;return t[t.length-1]}let n=Math.abs(t);return e.slice(-n)},p=e=>e&&typeof e==`object`&&!Array.isArray(e)?Object.keys(e).length:typeof e==`string`||Array.isArray(e)?e.length:0,re=[{name:`after`,category:`array`,compatibility:[`browser`,`nodejs`],fn:ee},{name:`before`,category:`array`,compatibility:[`browser`,`nodejs`],fn:te},{name:`arrayify`,category:`array`,compatibility:[`browser`,`nodejs`],fn:d},{name:`first`,category:`array`,compatibility:[`browser`,`nodejs`],fn:f},{name:`last`,category:`array`,compatibility:[`browser`,`nodejs`],fn:ne},{name:`length`,category:`array`,compatibility:[`browser`,`nodejs`],fn:p},{name:`join`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t=`, `)=>typeof e==`string`?e:Array.isArray(e)?e.join(t):``},{name:`forEach`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t){if(!Array.isArray(e)||!t||typeof t.fn!=`function`)return t?.inverse?t.inverse(this)??``:``;if(e.length===0)return t.inverse?t.inverse(this)??``:``;let n=e.length,r=t.hash??{},i=t.data?{...t.data}:void 0,a=``;for(let o=0;o<n;o++){let s=e[o],c={index:o,total:n,isFirst:o===0,isLast:o===n-1},l={...i?{...i}:{},...r,...c},u;u=typeof s==`object`&&s?{...s,...r,...c}:{value:s,...r,...c},a+=t.fn(u,{data:l})}return a}},{name:`inArray`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||!n)return``;let r=e.includes(t);return r&&n.fn?n.fn(this):!r&&n.inverse?n.inverse(this):``}},{name:`isArray`,category:`array`,compatibility:[`browser`,`nodejs`],fn:e=>Array.isArray(e)},{name:`itemAt`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{if(Array.isArray(e))return e[t]}},{name:`equalsLength`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){let r=p(e)===t;return n&&(n.fn||n.inverse)?r&&n.fn?n.fn(this):!r&&n.inverse?n.inverse(this):``:r}},{name:`some`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||typeof t!=`function`||!n)return n?.inverse?n.inverse(this)??``:``;let r=e.some(t);return r&&n.fn?n.fn(this):!r&&n.inverse?n.inverse(this):``}},{name:`eachIndex`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t){if(!Array.isArray(e)||!t||typeof t.fn!=`function`)return t?.inverse?t.inverse(this)??``:``;if(e.length===0)return t.inverse?t.inverse(this)??``:``;let n=``;for(let r=0;r<e.length;r++){let i={item:e[r],index:r};n+=t.fn(i)}return n}},{name:`withAfter`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||!n||typeof n.fn!=`function`)return``;let r=e.slice(t+1);if(r.length===0)return n.inverse?n.inverse(this)??``:``;let i=``;for(let e of r)i+=n.fn(e);return i}},{name:`withBefore`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||!n||typeof n.fn!=`function`)return``;let r=e.slice(0,t);if(r.length===0)return n.inverse?n.inverse(this)??``:``;let i=``;for(let e of r)i+=n.fn(e);return i}},{name:`withFirst`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){let r=1,i=n;if(typeof t==`object`&&t&&!Array.isArray(t)?i=t:typeof t==`number`&&(r=t),!Array.isArray(e)||!i||typeof i.fn!=`function`)return``;if(e.length===0)return i.inverse?i.inverse(this)??``:``;let a=e.slice(0,r),o=``;for(let e of a)o+=i.fn(e);return o}},{name:`withLast`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){let r=1,i=n;if(typeof t==`object`&&t&&!Array.isArray(t)?i=t:typeof t==`number`&&(r=t),!Array.isArray(e)||!i||typeof i.fn!=`function`)return``;if(e.length===0)return i.inverse?i.inverse(this)??``:``;let a=e.slice(-r),o=``;for(let e of a)o+=i.fn(e);return o}},{name:`withGroup`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||typeof t!=`number`||t<=0||!n||typeof n.fn!=`function`)return``;if(e.length===0)return n.inverse?n.inverse(this)??``:``;let r=``,i=[];for(let n=0;n<e.length;n+=t)i.push(e.slice(n,n+t));for(let e of i)r+=n.fn(e);return r}},{name:`withSort`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){let r,i=n;if(typeof t==`object`&&t&&!Array.isArray(t)?i=t:typeof t==`string`&&(r=t),!Array.isArray(e)||!i||typeof i.fn!=`function`)return``;if(e.length===0)return i.inverse?i.inverse(this)??``:``;let a=[...e];r?a.sort((e,t)=>{let n=e?.[r],i=t?.[r];return n===i?0:n==null?1:i==null?-1:typeof n==`string`&&typeof i==`string`?n.localeCompare(i):n<i?-1:1}):a.sort((e,t)=>e===t?0:e==null?1:t==null?-1:typeof e==`string`&&typeof t==`string`?e.localeCompare(t):e<t?-1:1),(i.hash?.reverse===!0||i.hash?.reverse===`true`)&&a.reverse();let o=``;for(let e of a)o+=i.fn(e);return o}},{name:`filter`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(!Array.isArray(e)||!n)return n?.inverse?n.inverse(this)??``:``;let r=e.filter(e=>e===t);return r.length>0&&n.fn?n.fn(this):r.length===0&&n.inverse?n.inverse(this):``}},{name:`map`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>!Array.isArray(e)||typeof t!=`function`?[]:e.map(t)},{name:`pluck`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>!Array.isArray(e)||typeof t!=`string`?[]:e.map(e=>{if(typeof e!=`object`||!e)return;let n=t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r})},{name:`reverse`,category:`array`,compatibility:[`browser`,`nodejs`],fn:e=>{if(typeof e==`string`)return e.split(``).reverse().join(``);if(Array.isArray(e))return[...e].reverse()}},{name:`sort`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{if(!Array.isArray(e))return[];let n=[...e];return typeof t==`function`?n.sort(t):typeof t==`string`?n.sort((e,n)=>{let r=e?.[t],i=n?.[t];return r===i?0:r==null?1:i==null?-1:typeof r==`string`&&typeof i==`string`?r.localeCompare(i):r<i?-1:1}):n.sort((e,t)=>e===t?0:e==null?1:t==null?-1:typeof e==`string`&&typeof t==`string`?e.localeCompare(t):e<t?-1:1),n}},{name:`sortBy`,category:`array`,compatibility:[`browser`,`nodejs`],fn:(e,...t)=>{if(!Array.isArray(e)||t.length===0)return[];let n=[...e];return n.sort((e,n)=>{for(let r of t){let t=e?.[r],i=n?.[r];if(t!==i){if(t==null)return 1;if(i==null)return-1;if(typeof t==`string`&&typeof i==`string`){let e=t.localeCompare(i);if(e!==0)return e}else return t<i?-1:1}}return 0}),n}},{name:`unique`,category:`array`,compatibility:[`browser`,`nodejs`],fn:function(e,t){if(!Array.isArray(e))return t?t.inverse?t.inverse(this)??``:``:[];let n=[...new Set(e)];if(!t)return n;if(n.length===0&&t.inverse)return t.inverse(this);if(n.length>0&&t.fn){let e=``;for(let r of n)e+=t.fn(r);return e}return``}}],ie=e=>e!==void 0&&(e===`/`||e===`!`||e===`?`||/[a-zA-Z]/.test(e)),ae=e=>{let t=``,n=!1,r=!1,i=null;for(let a=0;a<e.length;a++){let o=e[a];if(r){o===`-`&&e[a+1]===`-`&&e[a+2]===`>`&&(r=!1,a+=2);continue}if(n){i?o===i&&(i=null):o===`"`||o===`'`?i=o:o===`>`&&(n=!1);continue}if(o===`<`){if(e[a+1]===`!`&&e[a+2]===`-`&&e[a+3]===`-`){r=!0,a+=3;continue}if(ie(e[a+1])){n=!0;continue}}t+=o}return t},oe=new Set([`area`,`base`,`br`,`col`,`command`,`embed`,`hr`,`img`,`input`,`keygen`,`link`,`meta`,`param`,`source`,`track`,`wbr`,`circle`,`ellipse`,`line`,`path`,`polygon`,`polyline`,`rect`,`stop`,`use`]),m=(e,t={},n=``)=>{let r=`<${e}`;for(let[e,n]of Object.entries(t))n===!0?r+=` ${e}`:(typeof n==`string`||typeof n==`number`)&&(r+=` ${e}="${h(String(n))}"`);return oe.has(e.toLowerCase())?`${r}>`:`${r}>${g(n)}</${e}>`},h=e=>e.replace(/&/g,`&`).replace(/"/g,`"`).replace(/</g,`<`).replace(/>/g,`>`),g=e=>e.replace(/&/g,`&`).replace(/</g,`<`).replace(/>/g,`>`),_=(e={})=>Object.keys(e).map(t=>`${t}="${String(e[t]).replace(/^['"]|["']$/g,``)}"`).join(` `),v=[{name:`attr`,category:`html`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=_(e?.hash??{});return t.trim()?` ${t}`:``}},{name:`sanitize`,category:`html`,compatibility:[`browser`,`nodejs`],fn:e=>typeof e==`string`?ae(e).trim():``},{name:`ul`,category:`html`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=_(t.hash??{}),r=e.map(e=>typeof e==`string`?e:t.fn(e));return`${n?`<ul ${n}>`:`<ul>`}${r.map(e=>`<li>${e}</li>`).join(`
|
|
2
|
+
`)}</ul>`}},{name:`ol`,category:`html`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=_(t.hash??{}),r=e.map(e=>typeof e==`string`?e:t.fn(e));return`${n?`<ol ${n}>`:`<ol>`}${r.map(e=>`<li>${e}</li>`).join(`
|
|
3
|
+
`)}</ol>`}},{name:`thumbnailImage`,category:`html`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=``,n=``,r=e.full||!1,i={alt:e.alt,src:e.thumbnail,width:e.size.width,height:e.size.height},a={id:`image-${e.id}`},o={href:r,rel:`thumbnail`};return e.classes&&(e.classes.image&&(i.class=e.classes.image.join(` `)),e.classes.figure&&(a.class=e.classes.figure.join(` `)),e.classes.link&&(o.class=e.classes.link.join(` `))),t+=`<figure ${_(a)}>\n`,n+=`<img ${_(i)}>\n`,r?t+=`<a ${_(o)}>\n${n}</a>\n`:t+=n,e.caption&&(t+=`<figcaption>${e.caption}</figcaption>\n`),t+=`</figure>`,t}}],se=[{name:`gist`,category:`code`,compatibility:[`browser`,`nodejs`],fn:e=>m(`script`,{src:`https://gist.github.com/${e}.js`})},{name:`jsfiddle`,category:`code`,compatibility:[`browser`,`nodejs`],fn:e=>{if(!e?.id)throw Error("jsfiddle helper expects an `id`");let{id:t,width:n=`100%`,height:r=`300`,skin:i=`/presentation/`,tabs:a=`result,js,html,css`,allowfullscreen:o=`allowfullscreen`,frameborder:s=`0`}=e;return m(`iframe`,{width:n,height:r,src:`http://jsfiddle.net/${t}/embedded/${a}${i}`,allowfullscreen:o,frameborder:s})}}],ce=[{name:`isEmpty`,category:`collection`,compatibility:[`browser`,`nodejs`],fn:e=>e==null?!0:Array.isArray(e)?e.length===0:typeof e==`object`?Object.keys(e).length===0:!1},{name:`iterate`,category:`collection`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{if(Array.isArray(e)){let n=``;for(let r=0;r<e.length;r++)n+=t(e[r],r);return n}if(e&&typeof e==`object`){let n=``;for(let r of Object.keys(e))n+=t(e[r],r);return n}return n?n():``}}],le=(...e)=>e.every(Boolean),ue=(e,t,n)=>{switch(t){case`==`:return e==n;case`===`:return e===n;case`!=`:return e!=n;case`!==`:return e!==n;case`<`:return e<n;case`>`:return e>n;case`<=`:return e<=n;case`>=`:return e>=n;case`typeof`:return typeof e===n;default:throw Error(`helper {{compare}}: invalid operator: '${t}'`)}},de=(e,t,n=0)=>e==null?!1:typeof e==`string`||Array.isArray(e)?e.indexOf(t,n)>-1:typeof e==`object`?t in e:!1,fe=(...e)=>{for(let t of e)if(t!=null)return t;return``},pe=(e,t)=>e===t,me=(e,t)=>e>t,he=(e,t)=>e>=t,ge=(e,t)=>e==null||t==null?!1:Array.isArray(e)||typeof e==`string`?e.indexOf(t)>-1:typeof e==`object`?t in e:!1,y=(e,t)=>{if(!e)return!0;let n=Array.isArray(t)?t:t==null?[`0`,`false`,`nada`,`nil`,`nay`,`nah`,`negative`,`no`,`none`,`nope`,`nul`,`null`,`nix`,`nyet`,`uh-uh`,`veto`,`zero`]:[t],r=typeof e==`string`?e.toLowerCase():null;for(let t of n)if(t===e||r!=null&&t===r)return!0;return!1},_e=[{name:`and`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:le},{name:`compare`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:ue},{name:`contains`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:de},{name:`default`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:fe},{name:`eq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:pe},{name:`gt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:me},{name:`gte`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:he},{name:`has`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:ge},{name:`isFalsey`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>y(e)},{name:`isTruthy`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>!y(e)},{name:`ifEven`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>typeof e==`number`&&e%2==0},{name:`ifNth`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>typeof e==`number`&&typeof t==`number`&&t%e===0},{name:`ifOdd`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>typeof e==`number`&&Math.abs(e%2)===1},{name:`is`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e==t},{name:`isnt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e!=t},{name:`lt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e<t},{name:`lte`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e<=t},{name:`neither`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>!e&&!t},{name:`not`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>!e},{name:`or`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(...e)=>e.some(Boolean)},{name:`unlessEq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e!==t},{name:`unlessGt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e<=t},{name:`unlessLt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e>=t},{name:`unlessGteq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e<t},{name:`unlessLteq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>e>t}];r.extend(a),r.extend(i),r.extend(s),r.extend(o);const b=e=>e?r(typeof e==`string`&&n(e)||e):r(),ve=()=>new Date().getFullYear().toString(),x=e=>e.replace(/yyyy/g,`YYYY`).replace(/yy/g,`YY`).replace(/dd/g,`DD`).replace(/mm/g,`MM`).replace(/hh/g,`HH`),S=(e,t)=>{let n=t||`YYYY-MM-DD`,r=b(e);if(!r.isValid())throw Error(`Unable to parse date: ${e}`);let i=x(n);return r.format(i)},ye=()=>Date.now().toString(),be=e=>{let t=x(e||`YYYY-MM-DD HH:mm:ss`);return r().format(t)},C=e=>{let t=b(e);if(!t.isValid())throw Error(`Unable to parse date: ${e}`);return t.fromNow()},xe=[{name:`year`,category:`date`,compatibility:[`browser`,`nodejs`],fn:ve},{name:`date`,category:`date`,compatibility:[`browser`,`nodejs`],fn:S},{name:`moment`,category:`date`,compatibility:[`browser`,`nodejs`],fn:S},{name:`timestamp`,category:`date`,compatibility:[`browser`,`nodejs`],fn:ye},{name:`now`,category:`date`,compatibility:[`browser`,`nodejs`],fn:be},{name:`fromNow`,category:`date`,compatibility:[`browser`,`nodejs`],fn:C},{name:`toNow`,category:`date`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=b(e);if(!t.isValid())throw Error(`Unable to parse date: ${e}`);return t.toNow()}},{name:`ago`,category:`date`,compatibility:[`browser`,`nodejs`],fn:e=>C(e)},{name:`dateAdd`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=b(e);if(!r.isValid())throw Error(`Unable to parse date: ${e}`);return r.add(t,n).format(`YYYY-MM-DD HH:mm:ss`)}},{name:`dateSubtract`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=b(e);if(!r.isValid())throw Error(`Unable to parse date: ${e}`);return r.subtract(t,n).format(`YYYY-MM-DD HH:mm:ss`)}},{name:`startOf`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=b(e);if(!n.isValid())throw Error(`Unable to parse date: ${e}`);return n.startOf(t).format(`YYYY-MM-DD HH:mm:ss`)}},{name:`endOf`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=b(e);if(!n.isValid())throw Error(`Unable to parse date: ${e}`);return n.endOf(t).format(`YYYY-MM-DD HH:mm:ss`)}},{name:`isBefore`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=b(e),r=b(t);if(!n.isValid()||!r.isValid())throw Error(`Unable to parse dates: ${e}, ${t}`);return n.isBefore(r)}},{name:`isAfter`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=b(e),r=b(t);if(!n.isValid()||!r.isValid())throw Error(`Unable to parse dates: ${e}, ${t}`);return n.isAfter(r)}},{name:`isSame`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=b(e),i=b(t);if(!r.isValid()||!i.isValid())throw Error(`Unable to parse dates: ${e}, ${t}`);return r.isSame(i,n)}},{name:`isBetween`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=b(e),i=b(t),a=b(n);if(!r.isValid()||!i.isValid()||!a.isValid())throw Error(`Unable to parse dates: ${e}, ${t}, ${n}`);return r.isBetween(i,a,null,`[]`)}},{name:`diff`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=b(e),i=b(t);if(!r.isValid()||!i.isValid())throw Error(`Unable to parse dates: ${e}, ${t}`);return r.diff(i,n)}},{name:`toISOString`,category:`date`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=b(e);if(!t.isValid())throw Error(`Unable to parse date: ${e}`);return t.toISOString()}},{name:`dateTimezone`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=x(n||`YYYY-MM-DD HH:mm:ss`),i=b(e);if(!i.isValid())throw Error(`Unable to parse date: ${e}`);return i.tz(t).format(r)}},{name:`dateLocale`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=x(n||`YYYY-MM-DD HH:mm:ss`),i=b(e);if(!i.isValid())throw Error(`Unable to parse date: ${e}`);return i.locale(t).format(r)}}],w=(e,t)=>{if(!e||typeof e!=`object`)return;let n=Array.isArray(t)?t:t.split(`.`),r=e;for(let e of n){if(typeof r!=`object`||!r)return;r=r[e]}return r},T=(e,t)=>{if(!e||typeof e!=`object`)return;let n=Array.isArray(t)?t:t.split(`.`);if(n.length===0)return;let r=e;for(let e=0;e<n.length-1;e++){if(typeof r!=`object`||!r)return;r=r[n[e]]}let i=n[n.length-1];if(!(typeof r!=`object`||!r||!(i in r)))return{[i]:r[i]}},E=(e,t,n)=>{let r={};return e&&typeof e==`object`&&e.options&&Object.assign(r,e.options),t&&typeof t==`object`&&(`hash`in t?Object.assign(r,t.hash):Object.assign(r,t)),n&&typeof n==`object`&&(`hash`in n?Object.assign(r,n.hash):Object.assign(r,n)),r},D=[{name:`i18n`,category:`i18n`,compatibility:[`browser`,`nodejs`],fn:function(e,t,n){if(t&&typeof t==`object`&&`hash`in t&&n===void 0&&(n=t,t={}),typeof e!=`string`)throw Error(`{{i18n}} helper expected "key" to be a string`);let r={...this,...t,...n?.hash??{}},i=r.language||r.lang;if(typeof i!=`string`)throw TypeError(`{{i18n}} helper expected "language" to be a string`);let a=r[i];if(a===void 0)throw Error(`{{i18n}} helper cannot find language "${i}"`);let o=w(a,e);if(o===void 0)throw Error(`{{i18n}} helper cannot find property "`+String(e)+`" for language "`+i+`"`);return String(o)}}],O=[{name:`inflect`,category:`inflection`,compatibility:[`browser`,`nodejs`],fn:(e,t,n,r)=>{let i=e>1||e===0?n:t;return r?`${e} ${i}`:i}},{name:`ordinalize`,category:`inflection`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=Math.abs(Math.round(Number(e))),n=String(e),r=t%100;if([11,12,13].includes(r))return`${n}th`;switch(t%10){case 1:return`${n}st`;case 2:return`${n}nd`;case 3:return`${n}rd`;default:return`${n}th`}}}],k=(e,t,n)=>{let r=typeof t==`string`?t.split(/, */):t;return c(typeof e==`string`?[e]:e,r,n)},A=[{name:`match`,category:`match`,compatibility:[`browser`,`nodejs`],fn:k},{name:`isMatch`,category:`match`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>c.isMatch(e,t,n)},{name:`mm`,category:`match`,compatibility:[`browser`,`nodejs`],fn:(...e)=>(console.log(`the {{mm}} helper is depcrecated and will be removed`),console.log(`in handlebars-helpers v1.0.0, please use the {{match}}`),console.log(`helper instead.`),k(...e))}],j=e=>typeof e==`number`&&!Number.isNaN(e)||typeof e==`string`&&e.trim()!==``&&!Number.isNaN(Number(e)),M=(e,t=`expected a number`)=>{if(j(e))return Number(e);throw TypeError(t)},Se=e=>{let t=M(e);return Math.abs(t)},Ce=(e,t)=>j(e)&&j(t)?Number(e)+Number(t):``,we=(...e)=>{let t=e.flat().map(e=>Number(e));return P(t)/t.length},Te=e=>{let t=M(e);return Math.ceil(t)},Ee=(e,t)=>M(e,`expected the first argument to be a number`)/M(t,`expected the second argument to be a number`),De=e=>{let t=M(e);return Math.floor(t)},Oe=(e,t)=>M(e,`expected the first argument to be a number`)-M(t,`expected the second argument to be a number`),ke=(e,t)=>M(e,`expected the first argument to be a number`)%M(t,`expected the second argument to be a number`),N=(e,t)=>M(e,`expected the first argument to be a number`)*M(t,`expected the second argument to be a number`),Ae=(e,t)=>M(e,`expected the first argument to be a number`)+M(t,`expected the second argument to be a number`),je=(e,t)=>{let n=M(e,`expected minimum to be a number`),r=M(t,`expected maximum to be a number`);return n+Math.floor(Math.random()*(r-n+1))},Me=(e,t)=>e%t,Ne=e=>{let t=M(e);return Math.round(t)},Pe=(e,t)=>M(e,`expected the first argument to be a number`)-M(t,`expected the second argument to be a number`),P=(...e)=>{let t=e.flat(),n=0;for(let e of t)j(e)&&(n+=Number(e));return n},Fe=[{name:`abs`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Se},{name:`add`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ce},{name:`avg`,category:`math`,compatibility:[`browser`,`nodejs`],fn:we},{name:`ceil`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Te},{name:`divide`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ee},{name:`floor`,category:`math`,compatibility:[`browser`,`nodejs`],fn:De},{name:`minus`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Oe},{name:`modulo`,category:`math`,compatibility:[`browser`,`nodejs`],fn:ke},{name:`multiply`,category:`math`,compatibility:[`browser`,`nodejs`],fn:N},{name:`plus`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ae},{name:`random`,category:`math`,compatibility:[`browser`,`nodejs`],fn:je},{name:`remainder`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Me},{name:`round`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ne},{name:`subtract`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Pe},{name:`sum`,category:`math`,compatibility:[`browser`,`nodejs`],fn:P},{name:`times`,category:`math`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>N(e,t)}],Ie=new l({breaks:!0,html:!0,langPrefix:`lang-`,typographer:!1,xhtmlOut:!1});function Le(e){return new t.SafeString(Ie.render(e))}const F=function(e,t){return typeof e==`object`&&e&&`fn`in e&&typeof e.fn==`function`?e=e.fn(this):typeof e!=`string`&&(e=``),Le(e)},Re=[{name:`md`,category:`markdown`,compatibility:[`browser`,`nodejs`],fn:F},{name:`markdown`,category:`markdown`,compatibility:[`browser`,`nodejs`],fn:F}],I=Object.prototype.toString;function L(e){return typeof e.constructor==`function`?e.constructor.name:null}function ze(e){return L(e)===`GeneratorFunction`}function Be(e){return typeof e.throw==`function`&&typeof e.return==`function`&&typeof e.next==`function`}function Ve(e){return typeof e.toDateString==`function`&&typeof e.getDate==`function`&&typeof e.setDate==`function`}function He(e){return typeof e.message==`string`&&e.constructor&&typeof e.constructor.stackTraceLimit==`number`}function Ue(e){return typeof e.flags==`string`&&typeof e.ignoreCase==`boolean`&&typeof e.multiline==`boolean`&&typeof e.global==`boolean`}function We(e){if(e===void 0)return`undefined`;if(e===null)return`null`;let t=typeof e;if(t===`boolean`)return`boolean`;if(t===`string`)return`string`;if(t===`number`)return`number`;if(t===`symbol`)return`symbol`;if(t===`bigint`)return`bigint`;if(t===`function`)return ze(e)?`generatorfunction`:`function`;if(Array.isArray(e))return`array`;if(typeof Buffer<`u`&&Buffer.isBuffer?.(e))return`buffer`;if(typeof e.length==`number`&&I.call(e)===`[object Arguments]`)return`arguments`;if(e instanceof Date||Ve(e))return`date`;if(e instanceof Error||He(e))return`error`;if(e instanceof RegExp||Ue(e))return`regexp`;switch(L(e)){case`Promise`:return`promise`;case`WeakMap`:return`weakmap`;case`WeakSet`:return`weakset`;case`Map`:return`map`;case`Set`:return`set`;case`Int8Array`:return`int8array`;case`Uint8Array`:return`uint8array`;case`Uint8ClampedArray`:return`uint8clampedarray`;case`Int16Array`:return`int16array`;case`Uint16Array`:return`uint16array`;case`Int32Array`:return`int32array`;case`Uint32Array`:return`uint32array`;case`Float32Array`:return`float32array`;case`Float64Array`:return`float64array`}if(Be(e))return`generator`;let n=I.call(e);switch(n){case`[object Object]`:return`object`;case`[object Map Iterator]`:return`mapiterator`;case`[object Set Iterator]`:return`setiterator`;case`[object String Iterator]`:return`stringiterator`;case`[object Array Iterator]`:return`arrayiterator`}return n.slice(8,-1).toLowerCase().replace(/\s/g,``)}function Ge(e,n){typeof e==`object`&&e&&`hash`in e&&(n=e,e=n.data);let r=t.createFrame(e||{});return(typeof n!=`object`||!n)&&(n={}),n.hash&&typeof n.hash==`object`&&Object.assign(r,n.hash),n.fn(this,{data:r})}function Ke(e,t,n){return w(E(this,t,n),e)}function qe(e){return e.fn(this)}const Je=We;function Ye(e){return e.hash&&Object.keys(e.hash).length?e.fn(e.hash):e.inverse(this)}const Xe=[{name:`frame`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:Ge},{name:`option`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:Ke},{name:`noop`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:qe},{name:`typeOf`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:Je},{name:`withHash`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:Ye}],R=e=>typeof e==`number`&&!Number.isNaN(e),Ze=[{name:`bytes`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{if(e==null)return`0 B`;let n;if(typeof e==`string`){if(n=e.length,!n)return`0 B`}else if(R(e))n=Number(e);else if(typeof e.length==`number`){if(n=e.length,!n)return`0 B`}else return`0 B`;let r=typeof t==`number`&&!Number.isNaN(t)?t:2,i=[`B`,`kB`,`MB`,`GB`,`TB`,`PB`,`EB`,`ZB`,`YB`],a=10**r;for(let e=i.length-1;e>=0;e--){let t=10**(e*3);if(t<=n+1)return`${Math.round(n*a/t)/a} ${i[e]}`}return`${n}`}},{name:`addCommas`,category:`number`,compatibility:[`browser`,`nodejs`],fn:e=>e.toString().replace(/(\d)(?=(\d\d\d)+(?!\d))/g,`$1,`)},{name:`phoneNumber`,category:`number`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=e.toString();return`(${t.substr(0,3)}) ${t.substr(3,3)}-${t.substr(6,4)}`}},{name:`toAbbr`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=R(e)?Number(e):0,r=10**(typeof t==`number`&&!Number.isNaN(t)?t:2),i=[`k`,`m`,`b`,`t`,`q`];for(let e=i.length-1;e>=0;e--){let t=10**((e+1)*3);if(t<=n+1)return`${Math.round(n*r/t)/r}${i[e]}`}return`${n}`}},{name:`toExponential`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=R(e)?Number(e):0,r=typeof t==`number`&&!Number.isNaN(t)?t:0;return Number(n).toExponential(r)}},{name:`toFixed`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=R(e)?Number(e):0,r=typeof t==`number`&&!Number.isNaN(t)?t:0;return Number(n).toFixed(r)}},{name:`toFloat`,category:`number`,compatibility:[`browser`,`nodejs`],fn:e=>parseFloat(String(e))},{name:`toInt`,category:`number`,compatibility:[`browser`,`nodejs`],fn:e=>parseInt(String(e),10)},{name:`toPrecision`,category:`number`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{let n=R(e)?Number(e):0,r=typeof t==`number`&&!Number.isNaN(t)?t:1;return Number(n).toPrecision(r)}}],z=e=>!!(e&&typeof e==`object`&&`hash`in e),B=(e,t)=>({...e?.data||{},...t}),Qe=(...e)=>{let t=[...e];if(t.length&&z(t[t.length-1])){let e=t.pop();t.push(e.hash)}let n={};for(let e of t)e&&typeof e==`object`&&!Array.isArray(e)&&Object.assign(n,e);return n},$e=(e,t)=>{if(!z(t))return t?.inverse?.(e)??``;let n=B(t,t.hash||{}),r=``;for(let i in e)n.key=i,r+=t.fn(e[i],{data:n});return r},et=(e,t)=>{if(!z(t))return t?.inverse?.(e)??``;let n=B(t,t.hash||{}),r=``;for(let i in e)Object.hasOwn(e,i)&&(n.key=i,r+=t.fn(e[i],{data:n}));return r},tt=(...e)=>{let t=[];for(let n of e)(typeof n==`string`||typeof n==`number`)&&t.push(n);return t.join(`.`)},nt=(e,t,n)=>{let r=w(t,e);return n&&typeof n.fn==`function`?r?n.fn(r):n.inverse?.(t):r},rt=(e,t)=>T(t,e),it=(e,t)=>Object.hasOwn(e,t),at=e=>!!e&&typeof e==`object`&&!Array.isArray(e),V=e=>JSON.parse(e),H=(e,t)=>JSON.stringify(e,null,typeof t==`number`?t:0),ot=[{name:`extend`,category:`object`,compatibility:[`browser`,`nodejs`],fn:Qe},{name:`forIn`,category:`object`,compatibility:[`browser`,`nodejs`],fn:$e},{name:`forOwn`,category:`object`,compatibility:[`browser`,`nodejs`],fn:et},{name:`toPath`,category:`object`,compatibility:[`browser`,`nodejs`],fn:tt},{name:`get`,category:`object`,compatibility:[`browser`,`nodejs`],fn:nt},{name:`getObject`,category:`object`,compatibility:[`browser`,`nodejs`],fn:rt},{name:`hasOwn`,category:`object`,compatibility:[`browser`,`nodejs`],fn:it},{name:`isObject`,category:`object`,compatibility:[`browser`,`nodejs`],fn:at},{name:`JSONparse`,category:`object`,compatibility:[`browser`,`nodejs`],fn:V},{name:`JSONstringify`,category:`object`,compatibility:[`browser`,`nodejs`],fn:H},{name:`merge`,category:`object`,compatibility:[`browser`,`nodejs`],fn:(e,...t)=>{let n=[e,...t];if(n.length&&z(n[n.length-1])){let e=n.pop();n.push(e.hash)}return Object.assign(n[0],...n.slice(1))}},{name:`parseJSON`,category:`object`,compatibility:[`browser`,`nodejs`],fn:V},{name:`pick`,category:`object`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=d(e),i={};for(let e of r)i=Object.assign({},i,T(t,e));return n&&typeof n.fn==`function`?Object.keys(i).length?n.fn(i):n.inverse?.(t):i}},{name:`stringify`,category:`object`,compatibility:[`browser`,`nodejs`],fn:H}],st=[{name:`toRegex`,category:`regex`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=E({},t,n);return new RegExp(e,r.flags)}},{name:`test`,category:`regex`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>{if(typeof e!=`string`)return!1;if(!(t instanceof RegExp))throw TypeError(`expected a regular expression`);return t.test(e)}}],U=e=>e.trim().replace(/^[-_.\W\s]+|[-_.\W\s]+$/g,``),W=(e,t)=>e.length===1?e.toLowerCase():U(e).toLowerCase().replace(/[-_.\W\s]+(\w|$)/g,(e,n)=>t(n)),ct=(e,t)=>typeof e==`string`&&typeof t==`string`?e+t:e,lt=e=>typeof e==`string`?W(e,e=>e.toUpperCase()):``,G=e=>typeof e!=`string`||e.length===0?``:e.charAt(0).toUpperCase()+e.slice(1),ut=e=>typeof e==`string`?e.replace(/\w\S*/g,e=>G(e)):``,dt=(e,t)=>{if(typeof e!=`string`)return``;let n=``;for(let e=0;e<t;e++)n+=` `;return n+e+n},ft=e=>typeof e==`string`?U(e):``,pt=e=>typeof e==`string`?W(e,e=>`-${e}`):``,mt=e=>typeof e==`string`?W(e,e=>`.${e}`):``,K=(e,t,n)=>typeof e==`string`?(typeof n!=`string`&&(n=``),e.length>t?e.slice(0,t-n.length)+n:e):``,ht=(e,t)=>typeof e==`string`?e.length<=t?e:`${K(e,t)}…`:``,gt=e=>typeof e==`string`?e.split(` `).join(`-`):``,_t=e=>typeof e==`string`,q=e=>typeof e==`object`&&e&&`fn`in e&&typeof e.fn==`function`?String(e.fn()).toLowerCase():typeof e==`string`?e.toLowerCase():``,vt=e=>q(e),yt=(e,t)=>{if(typeof e!=`string`)return``;let n=t.length,r=e.indexOf(t,0),i=0;for(;r>-1;)i++,r=e.indexOf(t,r+n);return i},bt=e=>{if(typeof e!=`string`)return``;let t=W(e,e=>e.toUpperCase());return t.charAt(0).toUpperCase()+t.slice(1)},xt=e=>typeof e==`string`?W(e,e=>`/${e}`):``,St=(e,t)=>typeof e==`string`?(typeof t!=`string`&&(t=` `),e.split(t).join(`+`)):``,Ct=(e,t)=>typeof e==`string`&&typeof t==`string`?t+e:e,wt=(e,t)=>typeof e==`string`?typeof t==`string`?e.split(t).join(``):e:``,Tt=(e,t)=>typeof e==`string`?typeof t==`string`?e.replace(t,``):e:``,Et=(e,t,n)=>typeof e==`string`?typeof t==`string`?(typeof n!=`string`&&(n=``),e.split(t).join(n)):e:``,Dt=(e,t,n)=>typeof e==`string`?typeof t==`string`?(typeof n!=`string`&&(n=``),e.replace(t,n)):e:``,Ot=e=>typeof e==`string`?e.split(``).reverse().join(``):``,kt=e=>typeof e==`string`?e.replace(/((?:\S[^.?!]*)[.?!]*)/g,e=>e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()):``,At=e=>typeof e==`string`?W(e,e=>`_${e}`):``,jt=e=>typeof e==`string`?e.trim():``,J=e=>typeof e==`string`?e.replace(/^\s+/,``):``,Mt=e=>typeof e==`string`?e.replace(/\s+$/,``):``,Nt=(e,t,n)=>{if(typeof e==`string`&&typeof t==`number`&&Number.isFinite(t)){typeof n!=`string`&&(n=`...`);let r=Math.trunc(t),i=e.split(` `);return r<i.length&&(i=i.slice(0,r)),i.join(` `).trim()+n}return``},Y=e=>typeof e==`object`&&e&&`fn`in e&&typeof e.fn==`function`?String(e.fn()).toUpperCase():typeof e==`string`?e.toUpperCase():``,Pt=[{name:`append`,category:`string`,compatibility:[`browser`,`nodejs`],fn:ct},{name:`camelcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:lt},{name:`capitalize`,category:`string`,compatibility:[`browser`,`nodejs`],fn:G},{name:`capitalizeAll`,category:`string`,compatibility:[`browser`,`nodejs`],fn:ut},{name:`center`,category:`string`,compatibility:[`browser`,`nodejs`],fn:dt},{name:`chop`,category:`string`,compatibility:[`browser`,`nodejs`],fn:ft},{name:`dashcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:pt},{name:`dotcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:mt},{name:`ellipsis`,category:`string`,compatibility:[`browser`,`nodejs`],fn:ht},{name:`hyphenate`,category:`string`,compatibility:[`browser`,`nodejs`],fn:gt},{name:`isString`,category:`string`,compatibility:[`browser`,`nodejs`],fn:_t},{name:`lowercase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:q},{name:`downcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:vt},{name:`occurrences`,category:`string`,compatibility:[`browser`,`nodejs`],fn:yt},{name:`pascalcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:bt},{name:`pathcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:xt},{name:`plusify`,category:`string`,compatibility:[`browser`,`nodejs`],fn:St},{name:`prepend`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Ct},{name:`remove`,category:`string`,compatibility:[`browser`,`nodejs`],fn:wt},{name:`removeFirst`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Tt},{name:`replace`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Et},{name:`replaceFirst`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Dt},{name:`reverse`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Ot},{name:`sentence`,category:`string`,compatibility:[`browser`,`nodejs`],fn:kt},{name:`snakecase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:At},{name:`trim`,category:`string`,compatibility:[`browser`,`nodejs`],fn:jt},{name:`trimLeft`,category:`string`,compatibility:[`browser`,`nodejs`],fn:J},{name:`trimRight`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Mt},{name:`truncate`,category:`string`,compatibility:[`browser`,`nodejs`],fn:K},{name:`truncateWords`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Nt},{name:`uppercase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Y},{name:`upcase`,category:`string`,compatibility:[`browser`,`nodejs`],fn:e=>Y(e)},{name:`split`,category:`string`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>typeof e==`string`?(typeof t!=`string`&&(t=``),e.split(t)):``},{name:`startsWith`,category:`string`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>typeof e!=`string`||typeof t!=`string`?!1:t.startsWith(e)},{name:`titleize`,category:`string`,compatibility:[`browser`,`nodejs`],fn:e=>typeof e==`string`?e.replace(/\w\S*/g,e=>e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()):``},{name:`raw`,category:`string`,compatibility:[`browser`,`nodejs`],fn:e=>e&&typeof e.fn==`function`?e.fn():``}],X=[`browser`,`nodejs`],Z=e=>{if(typeof e==`string`)return encodeURIComponent(e)},Q=e=>{if(typeof e==`string`)return decodeURIComponent(e)};function Ft(...e){return Z.apply(this,e)}function It(...e){return Q.apply(this,e)}const Lt=[{name:`encodeURI`,category:`url`,compatibility:X,fn:Z},{name:`decodeURI`,category:`url`,compatibility:X,fn:Q},{name:`url_encode`,category:`url`,compatibility:X,fn:Ft},{name:`url_decode`,category:`url`,compatibility:X,fn:It},{name:`stripQuerystring`,category:`url`,compatibility:X,fn:e=>{if(typeof e==`string`)return e.split(`?`)[0]}}];var $=class extends u{init(){this.registerHelpers(re),this.registerHelpers(ce),this.registerHelpers(xe),this.registerHelpers(se),this.registerHelpers(v),this.registerHelpers(_e),this.registerHelpers(D),this.registerHelpers(O),this.registerHelpers(A),this.registerHelpers(Fe),this.registerHelpers(Re),this.registerHelpers(Xe),this.registerHelpers(Ze),this.registerHelpers(st),this.registerHelpers(Pt),this.registerHelpers(Lt),this.registerHelpers(ot)}};const Rt=t,zt=t.create();function Bt(e){new $().load(e.handlebars??e.hbs)}async function Vt(){let e=new $,n=t.create();return Object.keys(t.partials).length>0&&n.registerPartial(t.partials),e.load(n),n}function Ht(n){let r=new $,i=t.create();if(n?.handlebars?i=n.handlebars:Object.keys(t.partials).length>0&&i.registerPartial(t.partials),r.load(i),n?.caching){let t;t=n.caching instanceof e?n.caching:typeof n.caching==`object`?new e({useClone:!1,...n.caching}):new e({useClone:!1});let r=i.compile.bind(i);i.compile=(e,n)=>{let i=n?`${e}\0${JSON.stringify(n)}`:e,a=t.get(i);if(a)return a;let o=r(e,n);return t.set(i,o),o}}return i}export{e as CacheableMemory,Rt as Handlebars,$ as HelperRegistry,Vt as createHandlebars,Ht as fumanchu,zt as handlebars,Bt as helpers};
|