hyperbole-0.6.1: client/dist/hyperbole.js
"use strict";(()=>{var Ce="data-key",A=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},Re=function(e,n){return n?A(e,n)?(console.warn("[OmDomDom]: Children with duplicate keys detected. Children with duplicate keys will be skipped, resulting in dropped node references. Keys must be unique and non-indexed."),!1):!0:!1},y=function(e,n){var r=e.length,i=-1;if(r)for(;++i<r&&n(e[i],i)!==!1;);},Ve=function(e){var n={};y(e,function(i){var o=i.attributes[Ce];Re(n,o)&&(n[o]=i)});for(var r in n)return n},$=function(e,n,r){return e.node.insertBefore(n.node,r)},He=function(e,n){for(var r in e)n[r]=e[r]},ke=function(e){var n=e.trim().replace(/\s+</g,"<").replace(/>\s+/g,">"),r=new DOMParser,i=r.parseFromString(n,"text/html");return i.body};function Se(t,e){var n=t==null?null:typeof Symbol<"u"&&t[Symbol.iterator]||t["@@iterator"];if(n!=null){var r,i,o,s,c=[],a=!0,l=!1;try{if(o=(n=n.call(t)).next,e===0){if(Object(n)!==n)return;a=!1}else for(;!(a=(r=o.call(n)).done)&&(c.push(r.value),c.length!==e);a=!0);}catch(d){l=!0,i=d}finally{try{if(!a&&n.return!=null&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw i}}return c}}function Y(t,e){return qe(t)||Se(t,e)||De(t,e)||Oe()}function qe(t){if(Array.isArray(t))return t}function De(t,e){if(t){if(typeof t=="string")return _(t,e);var n=Object.prototype.toString.call(t).slice(8,-1);if(n==="Object"&&t.constructor&&(n=t.constructor.name),n==="Map"||n==="Set")return Array.from(t);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _(t,e)}}function _(t,e){(e==null||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n<e;n++)r[n]=t[n];return r}function Oe(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var m={STRING:"string",INT:"number",BOOL:"boolean"},g={},S=function(e,n,r){return{attrName:e,propName:n,type:r}},Pe=[["style","cssText"],["class","className"]];y(Pe,function(t){var e=Y(t,2),n=e[0],r=e[1];g[n]=S(n,r||n,m.STRING)});var Ue=["autofocus","draggable","hidden","checked","multiple","muted","selected"];y(Ue,function(t){g[t]=S(t,t,m.BOOL)});var Be=[["tabindex","tabIndex"]];y(Be,function(t){var e=Y(t,2),n=e[0],r=e[1];g[n]=S(n,r,m.INT)});var I={xlink:{prefix:"xlink:",resource:"http://www.w3.org/1999/xlink"},xml:{prefix:"xml:",resource:"http://www.w3.org/XML/1998/namespace"}},x=function(e,n,r,i){switch(n){case m.STRING:{r===g.style.propName?i===null?e.style[r]="":e.style[r]=i:i===null?e[r]="":e[r]=i;break}case m.INT:{if(i===null){var o=r.toLowerCase();e.removeAttribute(o)}else if(i==="0")e[r]=0;else if(i==="-1")e[r]=-1;else{var s=parseInt(i,10);isNaN(s)||(e[r]=s)}break}case m.BOOL:{["","true"].indexOf(i)<0?e[r]=!1:e[r]=!0;break}}},Ke=function(e,n){y(n,function(r){if(A(g,r)){var i=g[r];x(e.node,i.type,i.propName,null)}else r in e.node&&x(e.node,m.STRING,r,null),e.node.removeAttribute(r);delete e.attributes[r]})},je=function(e,n){for(var r in n){var i=n[r];if(e.attributes[r]=i,A(g,r)){var o=g[r];x(e.node,o.type,o.propName,i);continue}if(r.startsWith(I.xlink.prefix)){e.node.setAttributeNS(I.xlink.resource,r,i);continue}if(r.startsWith(I.xml.prefix)){e.node.setAttributeNS(I.xml.resource,r,i);continue}r in e.node&&x(e.node,m.STRING,r,i),e.node.setAttribute(r,i||"")}},Fe=function(e,n){for(var r in g){var i=g[r],o=i.propName,s=e.getAttribute(r);r===g.style.attrName?n[r]=e.style[o]:typeof s=="string"&&(n[r]=s)}},We=function(e){return Array.prototype.reduce.call(e.attributes,function(n,r){return A(g,r.name)||(n[r.name]=r.value),n},{})},Ge=function(e){var n=We(e);return Fe(e,n),n},Qe=function(e,n){var r=[],i={};for(var o in n.attributes){var s=n.attributes[o],c=e.attributes[o];s!==c&&typeof c>"u"&&r.push(o)}for(var a in e.attributes){var l=n.attributes[a],d=e.attributes[a];l!==d&&typeof d<"u"&&(i[a]=d)}Ke(n,r),je(n,i)},Je="data-key";function $e(t,e,n){var r=t.children.length,i=e.children.length;if(!(!r&&!i)){var o=Ve(e.children),s=Array(r);o!==void 0?y(t.children,function(l,d){var f=e.node.childNodes,u=l.attributes[Je];if(Object.prototype.hasOwnProperty.call(o,u)){var p=o[u];Array.prototype.indexOf.call(f,p.node)!==d&&$(e,p,f[d]),s[d]=p,delete o[u],n(l,s[d])}else $(e,l,f[d]),s[d]=l}):y(t.children,function(l,d){var f=e.children[d];typeof f<"u"?(n(l,f),s[d]=f):(e.node.appendChild(l.node),s[d]=l)}),e.children=s;var c=e.node.childNodes.length,a=c-r;if(a>0)for(;a>0;)e.node.removeChild(e.node.childNodes[c-1]),c--,a--}}var z=function t(e,n,r){if(!(!e||!n)){r=r||n.node.parentNode;var i=e.content&&e.content!==n.content;if(e.type!==n.type||i)return r.replaceChild(e.node,n.node),He(e,n);Qe(e,n),$e(e,n,t)}};var q=function t(e){var n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;typeof e=="string"&&(e=ke(e));var r=e.tagName==="BODY",i=e.childNodes,o=i?i.length:0;if(r){if(o>1)throw new Error("[OmDomDom]: Your element should not have more than one root node.");if(o===0)throw new Error("[OmDomDom]: Your element should have at least one root node.");return t(i[0])}var s=e.nodeType===3?"text":e.nodeType===8?"comment":e.tagName.toLowerCase(),c=n||s==="svg",a=e.nodeType===1?Ge(e):{},l=o>0?null:e.textContent,d=Array(o);return y(i,function(f,u){d[u]=t(f,c)}),{type:s,attributes:a,children:d,content:l,node:e,isSVGContext:c}};function D(t,e){var n=[];for(var r of e){let i=t(r);if(i)n.push(i);else break}return n}function X(t,e){let n=0;for(;n<e.length&&t(e[n]);)n++;return e.slice(n)}function N(t){return t.map(e=>e.key+": "+e.value).join(`
`)}function L(t){return{cookies:t.filter(e=>e.key=="Cookie").map(e=>e.value),error:E("Error",t),query:E("Query",t),pageTitle:E("PageTitle",t),events:Z("Event",t).map(P),actions:Z("Trigger",t).map(U)}}function O(t){let e=D(te,t.trim().split(`
`));return L(e)}function E(t,e){return e.find(n=>n.key==t)?.value}function Z(t,e){return e.filter(n=>n.key==t).map(n=>n.value)}function ee(t){let e=t.split(`
`),n=e[0],r=D(te,e.slice(1)),i=X(o=>o=="",e.slice(r.length+1));return{command:n,metas:r,rest:i}}function te(t){let e=t.match(/^(\w+)\: (.*)$/);if(e)return{key:e[1],value:e[2]}}function P(t){let[e,n]=ne(t);return{name:e,detail:JSON.parse(n)}}function U(t){let[e,n]=ne(t);return[e,n]}function ne(t){let e=t.indexOf("|");if(e===-1){let n=new Error("Bad Encoding, Expected Segment");throw n.message=t,n}return[t.slice(0,e),t.slice(e+1)]}function ie(t,e,n,r,i){let o=[{key:"Cookie",value:decodeURI(document.cookie)},{key:"Query",value:window.location.search}];return{viewId:t,action:e,state:n,requestId:r,meta:o,form:_e(i)}}function _e(t){if(!t)return;let e=new URLSearchParams;return t.forEach((n,r)=>{e.append(r,n)}),e}function oe(t){let e=["|ACTION|","ViewId: "+t.viewId,"Action: "+t.action];return t.state&&e.push("State: "+t.state),e.push("RequestId: "+t.requestId),[e.join(`
`),N(t.meta)].join(`
`)+Ye(t.form)}function Ye(t){return t?`
`+t:""}var ze=0;function se(){return{requestId:++ze,isCancelled:!1}}function B(t,e){return t+" "+Xe(e)}function Xe(t){return t==""?"|":t.replace(/_/g,"\\_").replace(/\s+/g,"_")}var Ze=window.location.protocol==="https:"?"wss:":"ws:",ae=`${Ze}//${window.location.host}${window.location.pathname}`,C=class{constructor(e=ae){this.hasEverConnected=!1;this.isConnected=!1;this.reconnectDelay=0;this.queue=[];this.events=new EventTarget;let n=new WebSocket(e);this.socket=n}connect(e=ae,n=!1){let r=n?new WebSocket(e):this.socket;this.socket=r;function i(s){console.error("Connect Error",s)}function o(s){console.error("Socket Error",s)}r.addEventListener("error",i),r.addEventListener("open",s=>{console.log("Websocket Connected"),this.hasEverConnected&&document.dispatchEvent(new Event("hyp-socket-reconnect")),this.isConnected=!0,this.hasEverConnected=!0,this.reconnectDelay=1e3,r.removeEventListener("error",i),r.addEventListener("error",o),document.dispatchEvent(new Event("hyp-socket-connect")),this.runQueue()}),r.addEventListener("close",s=>{console.log("CLOSE SOCKET"),this.isConnected&&document.dispatchEvent(new Event("hyp-socket-disconnect")),this.isConnected=!1,r.removeEventListener("error",o),this.hasEverConnected&&(console.log("Reconnecting in "+this.reconnectDelay/1e3+"s"),setTimeout(()=>this.connect(e,!0),this.reconnectDelay)),r.removeEventListener("error",o)}),r.addEventListener("message",s=>this.onMessage(s))}async sendAction(e){if(this.isConnected){let n=oe(e);this.socket.send(n)}else this.queue.push(e)}runQueue(){let e=this.queue.pop();e&&(console.log("runQueue: ",e),this.sendAction(e),this.runQueue())}onMessage(e){let{command:n,metas:r,rest:i}=ee(e.data),o=parseInt(s("RequestId"),0);function s(u){let p=E(u,r);if(!p)throw new R("Missing Required Metadata: "+u,e.data);return p}function c(u){let p=s("ViewId"),M=s("Action");return{requestId:o,targetViewId:void 0,viewId:p,action:M,meta:L(r),body:u.join(`
`)}}function a(u){let p=c(u);return p.targetViewId=E("TargetViewId",r),p}function l(u){let p=u[0];return{requestId:o,meta:L(r),url:p}}function d(u){let{requestId:p,meta:M,viewId:V,action:H}=c(u),[k,Le]=U(s("Trigger"));return{requestId:p,meta:M,viewId:V,action:H,targetViewId:k,targetAction:Le}}function f(u){let{requestId:p,meta:M,viewId:V,action:H}=c(u),k=P(s("Event"));return{requestId:p,meta:M,viewId:V,action:H,event:k}}switch(n){case"|UPDATE|":return this.dispatchEvent(new CustomEvent("update",{detail:a(i)}));case"|RESPONSE|":return this.dispatchEvent(new CustomEvent("response",{detail:c(i)}));case"|REDIRECT|":return this.dispatchEvent(new CustomEvent("redirect",{detail:l(i)}));case"|TRIGGER|":return this.dispatchEvent(new CustomEvent("trigger",{detail:d(i)}));case"|EVENT|":return this.dispatchEvent(new CustomEvent("event",{detail:f(i)}));default:throw new R("Unknown Server Command: "+n,e.data)}}addEventListener(e,n){this.events.addEventListener(e,n)}dispatchEvent(e){this.events.dispatchEvent(e)}disconnect(){this.isConnected=!1,this.hasEverConnected=!1,this.socket.close()}},R=class extends Error{constructor(e,n){super(e+`
`+n),this.name="ProtocolError"}};function K(t,e=100,n={}){if(typeof t!="function")throw new TypeError(`Expected the first parameter to be a function, got \`${typeof t}\`.`);if(e<0)throw new RangeError("`wait` must not be negative.");if(typeof n=="boolean")throw new TypeError("The `options` parameter must be an object, not a boolean. Use `{immediate: true}` instead.");let{immediate:r}=n,i,o,s,c,a;function l(){let u=i,p=o;return i=void 0,o=void 0,a=t.apply(u,p),a}function d(){let u=Date.now()-c;u<e&&u>=0?s=setTimeout(d,e-u):(s=void 0,r||(a=l()))}let f=function(...u){if(i&&this!==i&&Object.getPrototypeOf(this)===Object.getPrototypeOf(i))throw new Error("Debounced method called with different contexts of the same prototype.");i=this,o=u,c=Date.now();let p=r&&!s;if(s||(s=setTimeout(d,e)),p)return a=l(),a};return Object.defineProperty(f,"isPending",{get(){return s!==void 0}}),f.clear=()=>{s&&(clearTimeout(s),s=void 0,i=void 0,o=void 0)},f.flush=()=>{s&&f.trigger()},f.trigger=()=>{a=l(),f.clear()},f}var T=t=>t?.runAction!==void 0;function j(t){let e=new Event("hyp-content",{bubbles:!0});t.dispatchEvent(e)}function F(t,e){t.querySelectorAll("[id]").forEach(n=>{n.runAction=function(r){return e(n,r)},n.concurrency=n.dataset.concurrency||"Drop",n.cancelActiveRequest=function(){n.activeRequest&&!n.activeRequest?.isCancelled&&(n.activeRequest.isCancelled=!0)},j(t)})}function ce(t){de("keydown",t)}function ue(t){de("keyup",t)}function de(t,e){document.addEventListener(t,function(n){if(!(n.target instanceof HTMLElement)){console.warn("listenKeyEvent received event with non HTMLElment as EventTarget: %o",n);return}let r=n.target,i="on"+t+n.key,o=r.dataset[i];if(!o)return;n.preventDefault();let s=w(r);if(!s){console.error("Missing target: ",r);return}e(s,o)})}function le(t,e){document.addEventListener(t,function(n){if(!(n.target instanceof HTMLElement)){console.warn("listenBubblingEvent received an event with non HTMLElment as EventTarget: %o",n);return}let i=n.target.closest("[data-on"+t+"]");if(!i)return;n.preventDefault();let o=w(i);if(!o){console.error("Missing target: ",i);return}let s=i.dataset["on"+t];if(s===void 0){console.error("Missing action: ",i,t);return}e(o,s)})}function pe(t){le("click",t)}function fe(t){le("dblclick",t)}function ge(t){document.addEventListener("hyp-load",function(e){let n=e.detail.onLoad,r=e.detail.target;t(r,n)}),document.addEventListener("hyp-mouseenter",function(e){let n=e.detail.onMouseEnter,r=e.detail.target;t(r,n)}),document.addEventListener("hyp-mouseleave",function(e){let n=e.detail.onMouseLeave,r=e.detail.target;t(r,n)})}function W(t){t.querySelectorAll("[data-onload]").forEach(e=>{let n=parseInt(e.dataset.delay||"")||0,r=e.dataset.onload;setTimeout(()=>{let i=w(e);if(e.dataset.onload!=r)return;let o=new CustomEvent("hyp-load",{bubbles:!0,detail:{target:i,onLoad:r}});e.dispatchEvent(o)},n)})}function G(t){t.querySelectorAll("[data-onmouseenter]").forEach(e=>{let n=e.dataset.onmouseenter,r=J(e);e.onmouseenter=()=>{let i=new CustomEvent("hyp-mouseenter",{bubbles:!0,detail:{target:r,onMouseEnter:n}});e.dispatchEvent(i)}})}function Q(t){t.querySelectorAll("[data-onmouseleave]").forEach(e=>{let n=e.dataset.onmouseleave,r=J(e);e.onmouseleave=()=>{let i=new CustomEvent("hyp-mouseleave",{bubbles:!0,detail:{target:r,onMouseLeave:n}});e.dispatchEvent(i)}})}function ve(t){document.addEventListener("change",function(e){if(!(e.target instanceof HTMLElement)){console.warn("listenChange received an event with non HTMLElment as EventTarget: %o",e);return}let r=e.target.closest("[data-onchange]");if(!r)return;if(e.preventDefault(),r.value===null){console.error("Missing input value:",r);return}let i=w(r);if(!i){console.error("Missing target: listenChange");return}if(!r.dataset.onchange){console.error("Missing onchange: ",r);return}let o=B(r.dataset.onchange,r.value);t(i,o)})}function me(t,e){document.addEventListener("input",function(n){if(!(n.target instanceof HTMLElement)){console.warn("listenInput received an event with non HTMLElment as EventTarget: %o",n);return}let i=n.target.closest("[data-oninput]");if(!i)return;let o=parseInt(i.dataset.delay||"")||250;o<250&&console.warn("Input delay < 250 can result in poor performance."),n.preventDefault();let s=w(i);if(!s){console.error("Missing target: ",i);return}t(s),i.debouncedCallback||(i.debouncedCallback=K(()=>{if(!i.dataset.oninput){console.error("Missing onInput: ",i);return}let c=B(i.dataset.oninput,i.value);e(s,c)},o)),i.debouncedCallback()})}function ye(t){document.addEventListener("submit",function(e){if(!(e.target instanceof HTMLFormElement)){console.warn("listenFormSubmit received an event with non HTMLElment as EventTarget: %o",e);return}let n=e.target;if(!n.dataset.onsubmit){console.error("Missing onSubmit: ",n);return}e.preventDefault();let r=w(n),i=new FormData(n);if(!r){console.error("Missing target: ",n);return}t(r,n.dataset.onsubmit,i)})}function Ne(t){return t.closest("[data-target]")?.dataset.target||t.closest("[id]")?.id}function w(t){let e=J(t);if(!T(e)){console.error("Non HyperView target: ",e);return}return e}function J(t){let e=Ne(t),n=e&&document.getElementById(e);if(!n){console.error("Cannot find target: ",e,t);return}return n}function he(t){if(t!=et()){t!=""&&(t="?"+t);let e=location.pathname+t;window.history.replaceState({},"",e)}}function et(){let t=window.location.search;return t.startsWith("?")?t.substring(1):t}function Ee(t){let n=new DOMParser().parseFromString(t,"text/html"),r=n.querySelector("style");return{content:n.querySelector("div"),css:r}}var we={name:"web-ui",version:"0.6.0",description:"Development -----------",main:"index.js",directories:{client:"client"},scripts:{build:"esbuild src/index.ts --bundle --minify --sourcemap --outfile=dist/hyperbole.js",dev:"esbuild src/index.ts --bundle --minify --sourcemap --watch=forever --outfile=dist/hyperbole.js",check:"tsc --noEmit --preserveWatchOutput --watch"},author:"",license:"ISC",devDependencies:{esbuild:"^0.28.0",typescript:"^6.0.3"},dependencies:{omdomdom:"^0.3.2",debounce:"^3.0.0"}};console.log("Hyperbole "+we.version+"b");var b,be=new Set;async function v(t,e,n){if(t.activeRequest&&!t.activeRequest?.isCancelled&&t.concurrency=="Drop"){console.warn("Drop action overlapping with active request ("+t.activeRequest+")",e);return}t._timeout=window.setTimeout(()=>{t.classList.add("hyp-loading")},100);let r=t.dataset.state,i=se(),o=ie(t.id,e,r,i.requestId,n);t.activeRequest=i,h.sendAction(o)}function nt(t){Ae(t.targetViewId,t.targetAction)}function rt(t){let e=document.getElementById(t.viewId);xe(t.event,e)}function it(t){console.log("REDIRECT",t),Te(t.meta.cookies??[]),window.location.href=t.url}function ot(t){let e=Me(t);e&&(delete e.activeRequest,clearTimeout(e._timeout),e.classList.remove("hyp-loading"))}function Me(t){let e=t.targetViewId||t.viewId,n=document.getElementById(e);if(!T(n)){console.error("Missing Update HyperView Target: ",e,t);return}if(n.activeRequest?.requestId&&t.requestId<n.activeRequest.requestId)return console.warn("Ignore Stale Action ("+t.requestId+") vs ("+n.activeRequest.requestId+"): "+t.action),n;if(n.activeRequest?.isCancelled)return console.warn("Cancelled request",n.activeRequest?.requestId),delete n.activeRequest,n;let r=Ee(t.body);if(!r.content)return console.error("Empty Response!",t.body),n;at(r.css);let i=q(n),o=q(r.content),s=o.attributes;if(!t.meta.error&&s.id!=n.id){console.error("Mismatched ViewId in update - ",s.id," target:",n.id);return}let c=s["data-state"];o.attributes=i.attributes,z(o,i);let a=document.getElementById(n.id);return a?(j(a),c===void 0||c=="()"?delete a.dataset.state:a.dataset.state=c,Ie(t.meta,a),Te(t.meta.cookies??[]),W(a),G(a),Q(a),st(a),F(a,v),n):(console.warn("Target Missing: ",n.id),n)}function Te(t){t.forEach(e=>{console.log("SetCookie: ",e),document.cookie=e})}function Ie(t,e){t.query!=null&&he(t.query),t.pageTitle!=null&&(document.title=t.pageTitle),t.events?.forEach(n=>{xe(n,e)}),t.actions?.forEach(([n,r])=>{Ae(n,r)})}function xe(t,e){setTimeout(()=>{let n=new CustomEvent(t.name,{bubbles:!0,detail:t.detail});(e||document).dispatchEvent(n)},10)}function Ae(t,e){setTimeout(()=>{let n=window.Hyperbole?.hyperView(t);n&&v(n,e)},10)}function st(t){let e=t.querySelector("[autofocus]");e?.focus&&e.focus(),t.querySelectorAll("input[value]").forEach(n=>{let r=n.getAttribute("value");r!==null&&(n.value=r)}),t.querySelectorAll("input[type=checkbox]").forEach(n=>{let r=n.dataset.checked=="True";n.checked=r})}function at(t){if(!t)return;let e=t.sheet?.cssRules;if(e)for(let n=0;n<e.length;n++){let r=e.item(n);r&&be.has(r.cssText)==!1&&b.sheet&&(b.sheet.insertRule(r.cssText),be.add(r.cssText))}}function ct(){let t=O(document.getElementById("hyp.metadata")?.innerText??"");Ie(t,null);let e=document.body.querySelector("style");e!==null?b=e:(console.warn("rootStyles missing from page, creating..."),b=document.createElement("style"),b.type="text/css",document.body.appendChild(b)),ge(async function(r,i){v(r,i)}),W(document.body),G(document.body),Q(document.body),F(document.body,v),pe(async function(r,i){v(r,i)}),fe(async function(r,i){v(r,i)}),ce(async function(r,i){v(r,i)}),ue(async function(r,i){v(r,i)}),ye(async function(r,i,o){v(r,i,o)}),ve(async function(r,i){v(r,i)});function n(r){r.concurrency=="Replace"&&r.cancelActiveRequest()}me(n,async function(r,i){v(r,i)})}document.addEventListener("DOMContentLoaded",ct);var h=new C;h.connect();h.addEventListener("update",t=>{Me(t.detail)});h.addEventListener("response",t=>ot(t.detail));h.addEventListener("redirect",t=>it(t.detail));h.addEventListener("trigger",t=>nt(t.detail));h.addEventListener("event",t=>rt(t.detail));window.Hyperbole={runAction:v,parseMetadata:O,action:function(t,...e){return e.reduce((n,r)=>n+" "+JSON.stringify(r),t)},hyperView:function(t){let e=document.getElementById(t);if(!T(e)){console.error("Element id="+t+" was not a HyperView");return}return e},socket:h};})();
/*! Bundled license information:
omdomdom/lib/omdomdom.es.js:
(*!
* @license MIT (https://github.com/geotrev/omdomdom/blob/master/LICENSE)
* Omdomdom v0.3.2 (https://github.com/geotrev/omdomdom)
* Copyright 2023 George Treviranus <geowtrev@gmail.com>
*)
*/
//# sourceMappingURL=hyperbole.js.map