@jaredwray/fumanchu 4.6.1 → 4.7.0

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 CHANGED
@@ -10,36 +10,40 @@ Handlebars + Helpers Together
10
10
  [![NPM License](https://img.shields.io/npm/l/%40jaredwray%2Ffumanchu)
11
11
  ](https://github.com/jaredwray/fumanchu/blob/main/LICENSE)
12
12
  [![npm](https://img.shields.io/npm/dm/@jaredwray/fumanchu)](https://npmjs.com/package/@jaredwray/fumanchu)
13
+ [![](https://data.jsdelivr.com/v1/package/npm/@jaredwray/fumanchu/badge)](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. 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
+ [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](#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://github.com/jonathas/logging-helpers)
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);let u=require(`chrono-node`),d=require(`dayjs`);d=s(d);let f=require(`dayjs/plugin/isBetween.js`);f=s(f);let p=require(`dayjs/plugin/relativeTime.js`);p=s(p);let m=require(`dayjs/plugin/timezone.js`);m=s(m);let h=require(`dayjs/plugin/utc.js`);h=s(h);let g=require(`micromatch`);g=s(g);let _=require(`ent`);_=s(_);let v=require(`markdown-it`);v=s(v);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):[],y=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)},b=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:y},{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:b},{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=b(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`]),x=(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,`&amp;`).replace(/"/g,`&quot;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),ue=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),S=(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=S(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=S(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=S(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 ${S(a)}>\n`,n+=`<img ${S(i)}>\n`,r?t+=`<a ${S(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=>x(`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 x(`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,C=(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=>C(e)},{name:`isTruthy`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:e=>!C(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 w=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(),T=e=>e.replace(/yyyy/g,`YYYY`).replace(/yy/g,`YY`).replace(/dd/g,`DD`).replace(/mm/g,`MM`).replace(/hh/g,`HH`),E=(e,t)=>{let n=t||`YYYY-MM-DD`,r=w(e);if(!r.isValid())throw Error(`Unable to parse date: ${e}`);let i=T(n);return r.format(i)},we=()=>Date.now().toString(),Te=e=>{let t=T(e||`YYYY-MM-DD HH:mm:ss`);return(0,d.default)().format(t)},D=e=>{let t=w(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:E},{name:`moment`,category:`date`,compatibility:[`browser`,`nodejs`],fn:E},{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:D},{name:`toNow`,category:`date`,compatibility:[`browser`,`nodejs`],fn:e=>{let t=w(e);if(!t.isValid())throw Error(`Unable to parse date: ${e}`);return t.toNow()}},{name:`ago`,category:`date`,compatibility:[`browser`,`nodejs`],fn:e=>D(e)},{name:`dateAdd`,category:`date`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=w(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=w(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=w(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=w(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=w(e),r=w(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=w(e),r=w(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=w(e),i=w(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=w(e),i=w(t),a=w(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=w(e),i=w(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=w(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=T(n||`YYYY-MM-DD HH:mm:ss`),i=w(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=T(n||`YYYY-MM-DD HH:mm:ss`),i=w(e);if(!i.isValid())throw Error(`Unable to parse date: ${e}`);return i.locale(t).format(r)}}],O=(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},k=(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]}},A=(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=O(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`}}}],j=(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:j},{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.`),j(...e))}],M=e=>typeof e==`number`&&!Number.isNaN(e)||typeof e==`string`&&e.trim()!==``&&!Number.isNaN(Number(e)),N=(e,t=`expected a number`)=>{if(M(e))return Number(e);throw TypeError(t)},Ae=e=>{let t=N(e);return Math.abs(t)},je=(e,t)=>M(e)&&M(t)?Number(e)+Number(t):``,Me=(...e)=>{let t=e.flat().map(e=>Number(e));return F(t)/t.length},Ne=e=>{let t=N(e);return Math.ceil(t)},Pe=(e,t)=>N(e,`expected the first argument to be a number`)/N(t,`expected the second argument to be a number`),Fe=e=>{let t=N(e);return Math.floor(t)},Ie=(e,t)=>N(e,`expected the first argument to be a number`)-N(t,`expected the second argument to be a number`),Le=(e,t)=>N(e,`expected the first argument to be a number`)%N(t,`expected the second argument to be a number`),P=(e,t)=>N(e,`expected the first argument to be a number`)*N(t,`expected the second argument to be a number`),Re=(e,t)=>N(e,`expected the first argument to be a number`)+N(t,`expected the second argument to be a number`),ze=(e,t)=>{let n=N(e,`expected minimum to be a number`),r=N(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=N(e);return Math.round(t)},He=(e,t)=>N(e,`expected the first argument to be a number`)-N(t,`expected the second argument to be a number`),F=(...e)=>{let t=e.flat(),n=0;for(let e of t)M(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:P},{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:F},{name:`times`,category:`math`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>P(e,t)}],We=new v.default({breaks:!0,html:!0,langPrefix:`lang-`,typographer:!1,xhtmlOut:!1});function Ge(e){return new l.default.SafeString(_.default.decode(We.render(e)))}const I=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:I},{name:`markdown`,category:`markdown`,compatibility:[`browser`,`nodejs`],fn:I}],L=Object.prototype.toString;function R(e){return typeof e.constructor==`function`?e.constructor.name:null}function qe(e){return R(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`&&L.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(R(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=L.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 O(A(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}],z=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(z(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=z(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=z(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=z(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=z(e)?Number(e):0,r=typeof t==`number`&&!Number.isNaN(t)?t:1;return Number(n).toPrecision(r)}}],B=e=>!!(e&&typeof e==`object`&&`hash`in e),V=(e,t)=>({...e?.data||{},...t}),ot=(...e)=>{let t=[...e];if(t.length&&B(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(!B(t))return t?.inverse?.(e)??``;let n=V(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(!B(t))return t?.inverse?.(e)??``;let n=V(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=O(t,e);return n&&typeof n.fn==`function`?r?n.fn(r):n.inverse?.(t):r},dt=(e,t)=>k(t,e),ft=(e,t)=>Object.hasOwn(e,t),pt=e=>!!e&&typeof e==`object`&&!Array.isArray(e),H=e=>JSON.parse(e),U=(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:H},{name:`JSONstringify`,category:`object`,compatibility:[`browser`,`nodejs`],fn:U},{name:`merge`,category:`object`,compatibility:[`browser`,`nodejs`],fn:(e,...t)=>{let n=[e,...t];if(n.length&&B(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:H},{name:`pick`,category:`object`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=y(e),i={};for(let e of r)i=Object.assign({},i,k(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:U}],ht=[{name:`toRegex`,category:`regex`,compatibility:[`browser`,`nodejs`],fn:(e,t,n)=>{let r=A({},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)}}],W=e=>e.trim().replace(/^[-_.\W\s]+|[-_.\W\s]+$/g,``),G=(e,t)=>e.length===1?e.toLowerCase():W(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`?G(e,e=>e.toUpperCase()):``,K=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=>K(e)):``,yt=(e,t)=>{if(typeof e!=`string`)return``;let n=``;for(let e=0;e<t;e++)n+=`&nbsp;`;return n+e+n},bt=e=>typeof e==`string`?W(e):``,xt=e=>typeof e==`string`?G(e,e=>`-${e}`):``,St=e=>typeof e==`string`?G(e,e=>`.${e}`):``,q=(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:`${q(e,t)}…`:``,wt=e=>typeof e==`string`?e.split(` `).join(`-`):``,Tt=e=>typeof e==`string`,J=e=>typeof e==`object`&&e&&`fn`in e&&typeof e.fn==`function`?String(e.fn()).toLowerCase():typeof e==`string`?e.toLowerCase():``,Et=e=>J(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=G(e,e=>e.toUpperCase());return t.charAt(0).toUpperCase()+t.slice(1)},kt=e=>typeof e==`string`?G(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`?G(e,e=>`_${e}`):``,zt=e=>typeof e==`string`?e.trim():``,Bt=e=>typeof e==`string`?e.replace(/^\s+/,``):``,Vt=e=>typeof e==`string`?e.replace(/\s+$/,``):``,Ht=(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():``,Ut=[{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:K},{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:J},{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:zt},{name:`trimLeft`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Bt},{name:`trimRight`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Vt},{name:`truncate`,category:`string`,compatibility:[`browser`,`nodejs`],fn:q},{name:`truncateWords`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Ht},{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 Wt(...e){return Z.apply(this,e)}function Gt(...e){return Q.apply(this,e)}const Kt=[{name:`encodeURI`,category:`url`,compatibility:X,fn:Z},{name:`decodeURI`,category:`url`,compatibility:X,fn:Q},{name:`url_encode`,category:`url`,compatibility:X,fn:Wt},{name:`url_decode`,category:`url`,compatibility:X,fn:Gt},{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(Ut),this.registerHelpers(Kt),this.registerHelpers(mt)}};const qt=l.default,Jt=l.default.create();function Yt(e){new $().load(e.handlebars??e.hbs)}async function Xt(){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 Zt(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=qt,exports.HelperRegistry=$,exports.createHandlebars=Xt,exports.fumanchu=Zt,exports.handlebars=Jt,exports.helpers=Yt;
@@ -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 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,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"ent";import u from"markdown-it";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):[],d=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)},f=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:d},{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:f},{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=f(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`]),p=(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,`&amp;`).replace(/"/g,`&quot;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),ue=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`),m=(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=m(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=m(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=m(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 ${m(a)}>\n`,n+=`<img ${m(i)}>\n`,r?t+=`<a ${m(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=>p(`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 p(`iframe`,{width:n,height:r,src:`http://jsfiddle.net/${t}/embedded/${a}${i}`,allowfullscreen:o,frameborder:s})}}],h=[{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():``}}],g=(...e)=>e.every(Boolean),_=(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}'`)}},v=(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,pe=(...e)=>{for(let t of e)if(t!=null)return t;return``},me=(e,t)=>e===t,he=(e,t)=>e>t,ge=(e,t)=>e>=t,_e=(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},ve=[{name:`and`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:g},{name:`compare`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:_},{name:`contains`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:v},{name:`default`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:pe},{name:`eq`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:me},{name:`gt`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:he},{name:`gte`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:ge},{name:`has`,category:`comparison`,compatibility:[`browser`,`nodejs`],fn:_e},{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(),ye=()=>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)},be=()=>Date.now().toString(),xe=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()},Se=[{name:`year`,category:`date`,compatibility:[`browser`,`nodejs`],fn:ye},{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:be},{name:`now`,category:`date`,compatibility:[`browser`,`nodejs`],fn:xe},{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)},Ce=e=>{let t=M(e);return Math.abs(t)},we=(e,t)=>j(e)&&j(t)?Number(e)+Number(t):``,Te=(...e)=>{let t=e.flat().map(e=>Number(e));return P(t)/t.length},Ee=e=>{let t=M(e);return Math.ceil(t)},De=(e,t)=>M(e,`expected the first argument to be a number`)/M(t,`expected the second argument to be a number`),Oe=e=>{let t=M(e);return Math.floor(t)},ke=(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`),N=(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)=>M(e,`expected the first argument to be a number`)+M(t,`expected the second argument to be a number`),Me=(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))},Ne=(e,t)=>e%t,Pe=e=>{let t=M(e);return Math.round(t)},Fe=(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},Ie=[{name:`abs`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ce},{name:`add`,category:`math`,compatibility:[`browser`,`nodejs`],fn:we},{name:`avg`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Te},{name:`ceil`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ee},{name:`divide`,category:`math`,compatibility:[`browser`,`nodejs`],fn:De},{name:`floor`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Oe},{name:`minus`,category:`math`,compatibility:[`browser`,`nodejs`],fn:ke},{name:`modulo`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ae},{name:`multiply`,category:`math`,compatibility:[`browser`,`nodejs`],fn:N},{name:`plus`,category:`math`,compatibility:[`browser`,`nodejs`],fn:je},{name:`random`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Me},{name:`remainder`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Ne},{name:`round`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Pe},{name:`subtract`,category:`math`,compatibility:[`browser`,`nodejs`],fn:Fe},{name:`sum`,category:`math`,compatibility:[`browser`,`nodejs`],fn:P},{name:`times`,category:`math`,compatibility:[`browser`,`nodejs`],fn:(e,t)=>N(e,t)}],Le=new u({breaks:!0,html:!0,langPrefix:`lang-`,typographer:!1,xhtmlOut:!1});function Re(e){return new t.SafeString(l.decode(Le.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=``),Re(e)},ze=[{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 Be(e){return L(e)===`GeneratorFunction`}function Ve(e){return typeof e.throw==`function`&&typeof e.return==`function`&&typeof e.next==`function`}function He(e){return typeof e.toDateString==`function`&&typeof e.getDate==`function`&&typeof e.setDate==`function`}function Ue(e){return typeof e.message==`string`&&e.constructor&&typeof e.constructor.stackTraceLimit==`number`}function We(e){return typeof e.flags==`string`&&typeof e.ignoreCase==`boolean`&&typeof e.multiline==`boolean`&&typeof e.global==`boolean`}function Ge(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 Be(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||He(e))return`date`;if(e instanceof Error||Ue(e))return`error`;if(e instanceof RegExp||We(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(Ve(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 Ke(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 qe(e,t,n){return w(E(this,t,n),e)}function Je(e){return e.fn(this)}const Ye=Ge;function Xe(e){return e.hash&&Object.keys(e.hash).length?e.fn(e.hash):e.inverse(this)}const Ze=[{name:`frame`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:Ke},{name:`option`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:qe},{name:`noop`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:Je},{name:`typeOf`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:Ye},{name:`withHash`,category:`misc`,compatibility:[`browser`,`nodejs`],fn:Xe}],R=e=>typeof e==`number`&&!Number.isNaN(e),Qe=[{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}),V=(...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),H=e=>JSON.parse(e),U=(e,t)=>JSON.stringify(e,null,typeof t==`number`?t:0),ot=[{name:`extend`,category:`object`,compatibility:[`browser`,`nodejs`],fn:V},{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:H},{name:`JSONstringify`,category:`object`,compatibility:[`browser`,`nodejs`],fn:U},{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:H},{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:U}],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)}}],W=e=>e.trim().replace(/^[-_.\W\s]+|[-_.\W\s]+$/g,``),G=(e,t)=>e.length===1?e.toLowerCase():W(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`?G(e,e=>e.toUpperCase()):``,K=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=>K(e)):``,dt=(e,t)=>{if(typeof e!=`string`)return``;let n=``;for(let e=0;e<t;e++)n+=`&nbsp;`;return n+e+n},ft=e=>typeof e==`string`?W(e):``,pt=e=>typeof e==`string`?G(e,e=>`-${e}`):``,mt=e=>typeof e==`string`?G(e,e=>`.${e}`):``,q=(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:`${q(e,t)}…`:``,gt=e=>typeof e==`string`?e.split(` `).join(`-`):``,_t=e=>typeof e==`string`,J=e=>typeof e==`object`&&e&&`fn`in e&&typeof e.fn==`function`?String(e.fn()).toLowerCase():typeof e==`string`?e.toLowerCase():``,vt=e=>J(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=G(e,e=>e.toUpperCase());return t.charAt(0).toUpperCase()+t.slice(1)},xt=e=>typeof e==`string`?G(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`?G(e,e=>`_${e}`):``,jt=e=>typeof e==`string`?e.trim():``,Mt=e=>typeof e==`string`?e.replace(/^\s+/,``):``,Nt=e=>typeof e==`string`?e.replace(/\s+$/,``):``,Pt=(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():``,Ft=[{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:K},{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:J},{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:Mt},{name:`trimRight`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Nt},{name:`truncate`,category:`string`,compatibility:[`browser`,`nodejs`],fn:q},{name:`truncateWords`,category:`string`,compatibility:[`browser`,`nodejs`],fn:Pt},{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 It(...e){return Z.apply(this,e)}function Lt(...e){return Q.apply(this,e)}const Rt=[{name:`encodeURI`,category:`url`,compatibility:X,fn:Z},{name:`decodeURI`,category:`url`,compatibility:X,fn:Q},{name:`url_encode`,category:`url`,compatibility:X,fn:It},{name:`url_decode`,category:`url`,compatibility:X,fn:Lt},{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(h),this.registerHelpers(Se),this.registerHelpers(fe),this.registerHelpers(de),this.registerHelpers(ve),this.registerHelpers(D),this.registerHelpers(O),this.registerHelpers(A),this.registerHelpers(Ie),this.registerHelpers(ze),this.registerHelpers(Ze),this.registerHelpers(Qe),this.registerHelpers(st),this.registerHelpers(Ft),this.registerHelpers(Rt),this.registerHelpers(ot)}};const zt=t,Bt=t.create();function Vt(e){new $().load(e.handlebars??e.hbs)}async function Ht(){let e=new $,n=t.create();return Object.keys(t.partials).length>0&&n.registerPartial(t.partials),e.load(n),n}function Ut(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,zt as Handlebars,$ as HelperRegistry,Ht as createHandlebars,Ut as fumanchu,Bt as handlebars,Vt as helpers};