From 36479d8e713dcaa9b90d2c2d78d59aa302d05f8d Mon Sep 17 00:00:00 2001 From: Rolf Heij Date: Wed, 21 Feb 2024 11:52:36 -0500 Subject: [PATCH] rename length -> stringLength --- lib/platform-bible-utils/dist/index.cjs | 2 +- lib/platform-bible-utils/dist/index.cjs.map | 2 +- lib/platform-bible-utils/dist/index.d.ts | 153 +++++++++++------- lib/platform-bible-utils/dist/index.js | 4 +- lib/platform-bible-utils/dist/index.js.map | 2 +- lib/platform-bible-utils/src/index.ts | 2 +- .../src/string-util.test.ts | 8 +- lib/platform-bible-utils/src/string-util.ts | 134 +++++++-------- .../services/extension-storage.service.ts | 4 +- .../services/extension.service.ts | 4 +- .../extension-asset-protocol.service.ts | 6 +- src/node/models/execution-token.model.ts | 4 +- src/node/services/execution-token.service.ts | 6 +- src/shared/models/data-provider.model.ts | 4 +- src/shared/services/network.service.ts | 4 +- src/shared/utils/util.ts | 6 +- 16 files changed, 193 insertions(+), 152 deletions(-) diff --git a/lib/platform-bible-utils/dist/index.cjs b/lib/platform-bible-utils/dist/index.cjs index 4d9f0e5ce6..022f8e2ce8 100644 --- a/lib/platform-bible-utils/dist/index.cjs +++ b/lib/platform-bible-utils/dist/index.cjs @@ -1,2 +1,2 @@ -"use strict";var me=Object.defineProperty;var de=(t,e,r)=>e in t?me(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var p=(t,e,r)=>(de(t,typeof e!="symbol"?e+"":e,r),r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const be=require("async-mutex");class ge{constructor(e,r=1e4){p(this,"variableName");p(this,"promiseToValue");p(this,"resolver");p(this,"rejecter");this.variableName=e,this.promiseToValue=new Promise((s,n)=>{this.resolver=s,this.rejecter=n}),r>0&&setTimeout(()=>{this.rejecter&&(this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`),this.complete())},r),Object.seal(this)}get promise(){return this.promiseToValue}get hasSettled(){return Object.isFrozen(this)}resolveToValue(e,r=!1){if(this.resolver)console.debug(`${this.variableName} is being resolved now`),this.resolver(e),this.complete();else{if(r)throw Error(`${this.variableName} was already settled`);console.debug(`Ignoring subsequent resolution of ${this.variableName}`)}}rejectWithReason(e,r=!1){if(this.rejecter)console.debug(`${this.variableName} is being rejected now`),this.rejecter(e),this.complete();else{if(r)throw Error(`${this.variableName} was already settled`);console.debug(`Ignoring subsequent rejection of ${this.variableName}`)}}complete(){this.resolver=void 0,this.rejecter=void 0,Object.freeze(this)}}function Ne(){return"00-0-4-1-000".replace(/[^-]/g,t=>((Math.random()+~~t)*65536>>t).toString(16).padStart(4,"0"))}function F(t){return typeof t=="string"||t instanceof String}function E(t){return JSON.parse(JSON.stringify(t))}function ve(t,e=300){if(F(t))throw new Error("Tried to debounce a string! Could be XSS");let r;return(...s)=>{clearTimeout(r),r=setTimeout(()=>t(...s),e)}}function ye(t,e,r){const s=new Map;return t.forEach(n=>{const o=e(n),a=s.get(o),i=r?r(n,o):n;a?a.push(i):s.set(o,[i])}),s}function we(t){return typeof t=="object"&&t!==null&&"message"in t&&typeof t.message=="string"}function Ee(t){if(we(t))return t;try{return new Error(JSON.stringify(t))}catch{return new Error(String(t))}}function Oe(t){return Ee(t).message}function H(t){return new Promise(e=>setTimeout(e,t))}function $e(t,e){const r=H(e).then(()=>{});return Promise.any([r,t()])}function Ae(t,e="obj"){const r=new Set;Object.getOwnPropertyNames(t).forEach(n=>{try{typeof t[n]=="function"&&r.add(n)}catch(o){console.debug(`Skipping ${n} on ${e} due to error: ${o}`)}});let s=Object.getPrototypeOf(t);for(;s&&Object.getPrototypeOf(s);)Object.getOwnPropertyNames(s).forEach(n=>{try{typeof t[n]=="function"&&r.add(n)}catch(o){console.debug(`Skipping ${n} on ${e}'s prototype due to error: ${o}`)}}),s=Object.getPrototypeOf(s);return r}function Se(t,e={}){return new Proxy(e,{get(r,s){return s in r?r[s]:async(...n)=>(await t())[s](...n)}})}class Me{constructor(e,r){p(this,"baseDocument");p(this,"contributions",new Map);p(this,"latestOutput");p(this,"options");this.baseDocument=e,this.options=r,this.updateBaseDocument(e)}updateBaseDocument(e){return this.validateStartingDocument(e),this.baseDocument=this.options.copyDocuments?E(e):e,this.rebuild()}addOrUpdateContribution(e,r){this.validateContribution(e,r);const s=this.contributions.get(e),n=this.options.copyDocuments&&r?E(r):r;this.contributions.set(e,n);try{return this.rebuild()}catch(o){throw s?this.contributions.set(e,s):this.contributions.delete(e),new Error(`Error when setting the document named ${e}: ${o}`)}}deleteContribution(e){const r=this.contributions.get(e);if(!r)throw new Error("{documentKey} does not exist");this.contributions.delete(e);try{return this.rebuild()}catch(s){throw this.contributions.set(e,r),new Error(`Error when deleting the document named ${e}: ${s}`)}}rebuild(){if(this.contributions.size===0){let r=E(this.baseDocument);return r=this.transformFinalOutput(r),this.validateOutput(r),this.latestOutput=r,this.latestOutput}let e=this.baseDocument;return this.contributions.forEach(r=>{e=k(e,r,this.options.ignoreDuplicateProperties),this.validateOutput(e)}),e=this.transformFinalOutput(e),this.validateOutput(e),this.latestOutput=e,this.latestOutput}}function qe(...t){let e=!0;return t.forEach(r=>{(!r||typeof r!="object"||Array.isArray(r))&&(e=!1)}),e}function je(...t){let e=!0;return t.forEach(r=>{(!r||typeof r!="object"||!Array.isArray(r))&&(e=!1)}),e}function k(t,e,r){const s=E(t);return e&&Object.keys(e).forEach(n=>{if(Object.hasOwn(t,n)){if(qe(t[n],e[n]))s[n]=k(t[n],e[n],r);else if(je(t[n],e[n]))s[n]=s[n].concat(e[n]);else if(!r)throw new Error(`Cannot merge objects: key "${n}" already exists in the target object`)}else s[n]=e[n]}),s}class Ce{constructor(e="Anonymous"){p(this,"unsubscribers",new Set);this.name=e}add(...e){e.forEach(r=>{"dispose"in r?this.unsubscribers.add(r.dispose):this.unsubscribers.add(r)})}async runAllUnsubscribers(){const e=[...this.unsubscribers].map(s=>s()),r=await Promise.all(e);return this.unsubscribers.clear(),r.every((s,n)=>(s||console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${n} failed!`),s))}}class Pe{constructor(){p(this,"subscribe",this.event);p(this,"subscriptions");p(this,"lazyEvent");p(this,"isDisposed",!1);p(this,"dispose",()=>this.disposeFn());p(this,"emit",e=>{this.emitFn(e)})}get event(){return this.assertNotDisposed(),this.lazyEvent||(this.lazyEvent=e=>{if(!e||typeof e!="function")throw new Error("Event handler callback must be a function!");return this.subscriptions||(this.subscriptions=[]),this.subscriptions.push(e),()=>{if(!this.subscriptions)return!1;const r=this.subscriptions.indexOf(e);return r<0?!1:(this.subscriptions.splice(r,1),!0)}}),this.lazyEvent}emitFn(e){var r;this.assertNotDisposed(),(r=this.subscriptions)==null||r.forEach(s=>s(e))}assertNotDisposed(){if(this.isDisposed)throw new Error("Emitter is disposed")}disposeFn(){return this.assertNotDisposed(),this.isDisposed=!0,this.subscriptions=void 0,this.lazyEvent=void 0,Promise.resolve(!0)}}class W extends be.Mutex{}class Te{constructor(){p(this,"mutexesByID",new Map)}get(e){let r=this.mutexesByID.get(e);return r||(r=new W,this.mutexesByID.set(e,r),r)}}const K=[{shortName:"ERR",fullNames:["ERROR"],chapters:-1},{shortName:"GEN",fullNames:["Genesis"],chapters:50},{shortName:"EXO",fullNames:["Exodus"],chapters:40},{shortName:"LEV",fullNames:["Leviticus"],chapters:27},{shortName:"NUM",fullNames:["Numbers"],chapters:36},{shortName:"DEU",fullNames:["Deuteronomy"],chapters:34},{shortName:"JOS",fullNames:["Joshua"],chapters:24},{shortName:"JDG",fullNames:["Judges"],chapters:21},{shortName:"RUT",fullNames:["Ruth"],chapters:4},{shortName:"1SA",fullNames:["1 Samuel"],chapters:31},{shortName:"2SA",fullNames:["2 Samuel"],chapters:24},{shortName:"1KI",fullNames:["1 Kings"],chapters:22},{shortName:"2KI",fullNames:["2 Kings"],chapters:25},{shortName:"1CH",fullNames:["1 Chronicles"],chapters:29},{shortName:"2CH",fullNames:["2 Chronicles"],chapters:36},{shortName:"EZR",fullNames:["Ezra"],chapters:10},{shortName:"NEH",fullNames:["Nehemiah"],chapters:13},{shortName:"EST",fullNames:["Esther"],chapters:10},{shortName:"JOB",fullNames:["Job"],chapters:42},{shortName:"PSA",fullNames:["Psalm","Psalms"],chapters:150},{shortName:"PRO",fullNames:["Proverbs"],chapters:31},{shortName:"ECC",fullNames:["Ecclesiastes"],chapters:12},{shortName:"SNG",fullNames:["Song of Solomon","Song of Songs"],chapters:8},{shortName:"ISA",fullNames:["Isaiah"],chapters:66},{shortName:"JER",fullNames:["Jeremiah"],chapters:52},{shortName:"LAM",fullNames:["Lamentations"],chapters:5},{shortName:"EZK",fullNames:["Ezekiel"],chapters:48},{shortName:"DAN",fullNames:["Daniel"],chapters:12},{shortName:"HOS",fullNames:["Hosea"],chapters:14},{shortName:"JOL",fullNames:["Joel"],chapters:3},{shortName:"AMO",fullNames:["Amos"],chapters:9},{shortName:"OBA",fullNames:["Obadiah"],chapters:1},{shortName:"JON",fullNames:["Jonah"],chapters:4},{shortName:"MIC",fullNames:["Micah"],chapters:7},{shortName:"NAM",fullNames:["Nahum"],chapters:3},{shortName:"HAB",fullNames:["Habakkuk"],chapters:3},{shortName:"ZEP",fullNames:["Zephaniah"],chapters:3},{shortName:"HAG",fullNames:["Haggai"],chapters:2},{shortName:"ZEC",fullNames:["Zechariah"],chapters:14},{shortName:"MAL",fullNames:["Malachi"],chapters:4},{shortName:"MAT",fullNames:["Matthew"],chapters:28},{shortName:"MRK",fullNames:["Mark"],chapters:16},{shortName:"LUK",fullNames:["Luke"],chapters:24},{shortName:"JHN",fullNames:["John"],chapters:21},{shortName:"ACT",fullNames:["Acts"],chapters:28},{shortName:"ROM",fullNames:["Romans"],chapters:16},{shortName:"1CO",fullNames:["1 Corinthians"],chapters:16},{shortName:"2CO",fullNames:["2 Corinthians"],chapters:13},{shortName:"GAL",fullNames:["Galatians"],chapters:6},{shortName:"EPH",fullNames:["Ephesians"],chapters:6},{shortName:"PHP",fullNames:["Philippians"],chapters:4},{shortName:"COL",fullNames:["Colossians"],chapters:4},{shortName:"1TH",fullNames:["1 Thessalonians"],chapters:5},{shortName:"2TH",fullNames:["2 Thessalonians"],chapters:3},{shortName:"1TI",fullNames:["1 Timothy"],chapters:6},{shortName:"2TI",fullNames:["2 Timothy"],chapters:4},{shortName:"TIT",fullNames:["Titus"],chapters:3},{shortName:"PHM",fullNames:["Philemon"],chapters:1},{shortName:"HEB",fullNames:["Hebrews"],chapters:13},{shortName:"JAS",fullNames:["James"],chapters:5},{shortName:"1PE",fullNames:["1 Peter"],chapters:5},{shortName:"2PE",fullNames:["2 Peter"],chapters:3},{shortName:"1JN",fullNames:["1 John"],chapters:5},{shortName:"2JN",fullNames:["2 John"],chapters:1},{shortName:"3JN",fullNames:["3 John"],chapters:1},{shortName:"JUD",fullNames:["Jude"],chapters:1},{shortName:"REV",fullNames:["Revelation"],chapters:22}],L=1,Z=K.length-1,X=1,Q=1,Y=t=>{var e;return((e=K[t])==null?void 0:e.chapters)??-1},Re=(t,e)=>({bookNum:Math.max(L,Math.min(t.bookNum+e,Z)),chapterNum:1,verseNum:1}),De=(t,e)=>({...t,chapterNum:Math.min(Math.max(X,t.chapterNum+e),Y(t.bookNum)),verseNum:1}),Ie=(t,e)=>({...t,verseNum:Math.max(Q,t.verseNum+e)}),xe=t=>(...e)=>t.map(s=>s(...e)).every(s=>s),_e=t=>async(...e)=>{const r=t.map(async s=>s(...e));return(await Promise.all(r)).every(s=>s)};var D=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},N={},ze=()=>{const t="\\ud800-\\udfff",e="\\u0300-\\u036f",r="\\ufe20-\\ufe2f",s="\\u20d0-\\u20ff",n="\\u1ab0-\\u1aff",o="\\u1dc0-\\u1dff",a=e+r+s+n+o,i="\\ufe0e\\ufe0f",c="\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDF93",h=`[${t}]`,u=`[${a}]`,l="\\ud83c[\\udffb-\\udfff]",f=`(?:${u}|${l})`,b=`[^${t}]`,d="(?:\\uD83C[\\uDDE6-\\uDDFF]){2}",y="[\\ud800-\\udbff][\\udc00-\\udfff]",q="\\u200d",le="(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40(?:\\udc65|\\udc73|\\udc77)\\udb40(?:\\udc6e|\\udc63|\\udc6c)\\udb40(?:\\udc67|\\udc74|\\udc73)\\udb40\\udc7f)",ce=`[${c}]`,T=`${f}?`,R=`[${i}]?`,fe=`(?:${q}(?:${[b,d,y].join("|")})${R+T})*`,he=R+T+fe,pe=`(?:${[`${b}${u}?`,u,d,y,h,ce].join("|")})`;return new RegExp(`${le}|${l}(?=${l})|${pe+he}`,"g")},Be=D&&D.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(N,"__esModule",{value:!0});var A=Be(ze);function j(t){if(typeof t!="string")throw new Error("A string is expected as input");return t.match(A.default())||[]}var Je=N.toArray=j;function P(t){if(typeof t!="string")throw new Error("Input must be a string");var e=t.match(A.default());return e===null?0:e.length}var Ge=N.length=P;function ee(t,e,r){if(e===void 0&&(e=0),typeof t!="string")throw new Error("Input must be a string");(typeof e!="number"||e<0)&&(e=0),typeof r=="number"&&r<0&&(r=0);var s=t.match(A.default());return s?s.slice(e,r).join(""):""}var Ue=N.substring=ee;function Ve(t,e,r){if(e===void 0&&(e=0),typeof t!="string")throw new Error("Input must be a string");var s=P(t);if(typeof e!="number"&&(e=parseInt(e,10)),e>=s)return"";e<0&&(e+=s);var n;typeof r>"u"?n=s:(typeof r!="number"&&(r=parseInt(r,10)),n=r>=0?r+e:e);var o=t.match(A.default());return o?o.slice(e,n).join(""):""}var Fe=N.substr=Ve;function He(t,e,r,s){if(e===void 0&&(e=16),r===void 0&&(r="#"),s===void 0&&(s="right"),typeof t!="string"||typeof e!="number")throw new Error("Invalid arguments specified");if(["left","right"].indexOf(s)===-1)throw new Error("Pad position should be either left or right");typeof r!="string"&&(r=String(r));var n=P(t);if(n>e)return ee(t,0,e);if(n=s.length)return e===""?s.length:-1;if(e==="")return r;var n=j(e),o=!1,a;for(a=r;am(t)||e<-m(t)))return M(t,e,1)}function Le(t,e){return e<0||e>m(t)-1?"":M(t,e,1)}function Ze(t,e){if(!(e<0||e>m(t)-1))return M(t,e,1).codePointAt(0)}function Xe(t,e,r=m(t)){const s=se(t,e);return!(s===-1||s+m(e)!==r)}function re(t,e,r=0){const s=O(t,r);return S(s,e)!==-1}function S(t,e,r=0){return We(t,e,r)}function se(t,e,r){let s=r||m(t);s<0?s=0:s>=m(t)&&(s=m(t)-1);for(let n=s;n>=0;n--)if(M(t,n,m(e))===e)return n;return-1}function m(t){return Ge(t)}function Qe(t,e){const r=e.toUpperCase();return r==="NONE"?t:t.normalize(r)}function Ye(t,e,r=" "){return e<=m(t)?t:te(t,e,r,"right")}function et(t,e,r=" "){return e<=m(t)?t:te(t,e,r,"left")}function I(t,e){return e>t?t:e<-t?0:e<0?e+t:e}function tt(t,e,r){const s=m(t);if(e>s||r&&(e>r&&!(e>0&&e-s)||r<-s||e<0&&e>-s&&r>0))return"";const n=I(s,e),o=r?I(s,r):void 0;return O(t,n,o)}function rt(t,e,r){const s=[];if(r!==void 0&&r<=0)return[t];if(e==="")return ne(t).slice(0,r);let n=e;(typeof e=="string"||e instanceof RegExp&&!re(e.flags,"g"))&&(n=new RegExp(e,"g"));const o=t.match(n);let a=0;if(!o)return[t];for(let i=0;i<(r?r-1:o.length);i++){const c=S(t,o[i],a),h=m(o[i]);if(s.push(O(t,a,c)),a=c+h,r!==void 0&&s.length===r)break}return s.push(O(t,a)),s}function st(t,e,r=0){return S(t,e,r)===r}function M(t,e=0,r=m(t)-e){return Fe(t,e,r)}function O(t,e,r=m(t)){return Ue(t,e,r)}function ne(t){return Je(t)}var nt=Object.getOwnPropertyNames,ot=Object.getOwnPropertySymbols,at=Object.prototype.hasOwnProperty;function x(t,e){return function(s,n,o){return t(s,n,o)&&e(s,n,o)}}function $(t){return function(r,s,n){if(!r||!s||typeof r!="object"||typeof s!="object")return t(r,s,n);var o=n.cache,a=o.get(r),i=o.get(s);if(a&&i)return a===s&&i===r;o.set(r,s),o.set(s,r);var c=t(r,s,n);return o.delete(r),o.delete(s),c}}function _(t){return nt(t).concat(ot(t))}var oe=Object.hasOwn||function(t,e){return at.call(t,e)};function v(t,e){return t||e?t===e:t===e||t!==t&&e!==e}var ae="_owner",z=Object.getOwnPropertyDescriptor,B=Object.keys;function it(t,e,r){var s=t.length;if(e.length!==s)return!1;for(;s-- >0;)if(!r.equals(t[s],e[s],s,s,t,e,r))return!1;return!0}function ut(t,e){return v(t.getTime(),e.getTime())}function J(t,e,r){if(t.size!==e.size)return!1;for(var s={},n=t.entries(),o=0,a,i;(a=n.next())&&!a.done;){for(var c=e.entries(),h=!1,u=0;(i=c.next())&&!i.done;){var l=a.value,f=l[0],b=l[1],d=i.value,y=d[0],q=d[1];!h&&!s[u]&&(h=r.equals(f,y,o,u,t,e,r)&&r.equals(b,q,f,y,t,e,r))&&(s[u]=!0),u++}if(!h)return!1;o++}return!0}function lt(t,e,r){var s=B(t),n=s.length;if(B(e).length!==n)return!1;for(var o;n-- >0;)if(o=s[n],o===ae&&(t.$$typeof||e.$$typeof)&&t.$$typeof!==e.$$typeof||!oe(e,o)||!r.equals(t[o],e[o],o,o,t,e,r))return!1;return!0}function w(t,e,r){var s=_(t),n=s.length;if(_(e).length!==n)return!1;for(var o,a,i;n-- >0;)if(o=s[n],o===ae&&(t.$$typeof||e.$$typeof)&&t.$$typeof!==e.$$typeof||!oe(e,o)||!r.equals(t[o],e[o],o,o,t,e,r)||(a=z(t,o),i=z(e,o),(a||i)&&(!a||!i||a.configurable!==i.configurable||a.enumerable!==i.enumerable||a.writable!==i.writable)))return!1;return!0}function ct(t,e){return v(t.valueOf(),e.valueOf())}function ft(t,e){return t.source===e.source&&t.flags===e.flags}function G(t,e,r){if(t.size!==e.size)return!1;for(var s={},n=t.values(),o,a;(o=n.next())&&!o.done;){for(var i=e.values(),c=!1,h=0;(a=i.next())&&!a.done;)!c&&!s[h]&&(c=r.equals(o.value,a.value,o.value,a.value,t,e,r))&&(s[h]=!0),h++;if(!c)return!1}return!0}function ht(t,e){var r=t.length;if(e.length!==r)return!1;for(;r-- >0;)if(t[r]!==e[r])return!1;return!0}var pt="[object Arguments]",mt="[object Boolean]",dt="[object Date]",bt="[object Map]",gt="[object Number]",Nt="[object Object]",vt="[object RegExp]",yt="[object Set]",wt="[object String]",Et=Array.isArray,U=typeof ArrayBuffer=="function"&&ArrayBuffer.isView?ArrayBuffer.isView:null,V=Object.assign,Ot=Object.prototype.toString.call.bind(Object.prototype.toString);function $t(t){var e=t.areArraysEqual,r=t.areDatesEqual,s=t.areMapsEqual,n=t.areObjectsEqual,o=t.arePrimitiveWrappersEqual,a=t.areRegExpsEqual,i=t.areSetsEqual,c=t.areTypedArraysEqual;return function(u,l,f){if(u===l)return!0;if(u==null||l==null||typeof u!="object"||typeof l!="object")return u!==u&&l!==l;var b=u.constructor;if(b!==l.constructor)return!1;if(b===Object)return n(u,l,f);if(Et(u))return e(u,l,f);if(U!=null&&U(u))return c(u,l,f);if(b===Date)return r(u,l,f);if(b===RegExp)return a(u,l,f);if(b===Map)return s(u,l,f);if(b===Set)return i(u,l,f);var d=Ot(u);return d===dt?r(u,l,f):d===vt?a(u,l,f):d===bt?s(u,l,f):d===yt?i(u,l,f):d===Nt?typeof u.then!="function"&&typeof l.then!="function"&&n(u,l,f):d===pt?n(u,l,f):d===mt||d===gt||d===wt?o(u,l,f):!1}}function At(t){var e=t.circular,r=t.createCustomConfig,s=t.strict,n={areArraysEqual:s?w:it,areDatesEqual:ut,areMapsEqual:s?x(J,w):J,areObjectsEqual:s?w:lt,arePrimitiveWrappersEqual:ct,areRegExpsEqual:ft,areSetsEqual:s?x(G,w):G,areTypedArraysEqual:s?w:ht};if(r&&(n=V({},n,r(n))),e){var o=$(n.areArraysEqual),a=$(n.areMapsEqual),i=$(n.areObjectsEqual),c=$(n.areSetsEqual);n=V({},n,{areArraysEqual:o,areMapsEqual:a,areObjectsEqual:i,areSetsEqual:c})}return n}function St(t){return function(e,r,s,n,o,a,i){return t(e,r,i)}}function Mt(t){var e=t.circular,r=t.comparator,s=t.createState,n=t.equals,o=t.strict;if(s)return function(c,h){var u=s(),l=u.cache,f=l===void 0?e?new WeakMap:void 0:l,b=u.meta;return r(c,h,{cache:f,equals:n,meta:b,strict:o})};if(e)return function(c,h){return r(c,h,{cache:new WeakMap,equals:n,meta:void 0,strict:o})};var a={cache:void 0,equals:n,meta:void 0,strict:o};return function(c,h){return r(c,h,a)}}var qt=g();g({strict:!0});g({circular:!0});g({circular:!0,strict:!0});g({createInternalComparator:function(){return v}});g({strict:!0,createInternalComparator:function(){return v}});g({circular:!0,createInternalComparator:function(){return v}});g({circular:!0,createInternalComparator:function(){return v},strict:!0});function g(t){t===void 0&&(t={});var e=t.circular,r=e===void 0?!1:e,s=t.createInternalComparator,n=t.createState,o=t.strict,a=o===void 0?!1:o,i=At(t),c=$t(i),h=s?s(c):St(c);return Mt({circular:r,comparator:c,createState:n,equals:h,strict:a})}function jt(t,e){return qt(t,e)}function C(t,e,r){return JSON.stringify(t,(n,o)=>{let a=o;return e&&(a=e(n,a)),a===void 0&&(a=null),a},r)}function ie(t,e){function r(n){return Object.keys(n).forEach(o=>{n[o]===null?n[o]=void 0:typeof n[o]=="object"&&(n[o]=r(n[o]))}),n}const s=JSON.parse(t,e);if(s!==null)return typeof s=="object"?r(s):s}function Ct(t){try{const e=C(t);return e===C(ie(e))}catch{return!1}}const Pt=t=>t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/"),ue={title:"Platform.Bible menus",type:"object",properties:{mainMenu:{description:"Top level menu for the application",$ref:"#/$defs/multiColumnMenu"},defaultWebViewTopMenu:{description:"Default top menu for web views that don't specify their own",$ref:"#/$defs/multiColumnMenu"},defaultWebViewContextMenu:{description:"Default context menu for web views that don't specify their own",$ref:"#/$defs/singleColumnMenu"},webViewMenus:{description:"Menus that apply per web view in the application",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{$ref:"#/$defs/menusForOneWebView"}},additionalProperties:!1}},required:["mainMenu","defaultWebViewTopMenu","defaultWebViewContextMenu","webViewMenus"],additionalProperties:!1,$defs:{localizeKey:{description:"Identifier for a string that will be localized in a menu based on the user's UI language",type:"string",pattern:"^%[\\w\\-\\.]+%$"},referencedItem:{description:"Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)",type:"string",pattern:"^[\\w\\-]+\\.[\\w\\-]+$"},columnsWithHeaders:{description:"Group of columns that can be combined with other columns to form a multi-column menu",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{description:"Single column with a header string",type:"object",properties:{label:{description:"Header text for this this column in the UI",$ref:"#/$defs/localizeKey"},localizeNotes:{description:"Additional information provided by developers to help people who perform localization",type:"string"},order:{description:"Relative order of this column compared to other columns (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu groups to this column",type:"boolean"}},required:["label","order"],additionalProperties:!1}},properties:{isExtensible:{description:"Defines whether contributions are allowed to add columns to this multi-column menu",type:"boolean"}}},menuGroups:{description:"Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{description:"Single group that contains menu items",type:"object",oneOf:[{properties:{column:{description:"Column where this group belongs, not required for single column menus",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this group compared to other groups in the same column or submenu (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu items to this menu group",type:"boolean"}},required:["order"],additionalProperties:!1},{properties:{menuItem:{description:"Menu item that anchors the submenu where this group belongs",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this group compared to other groups in the same column or submenu (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu items to this menu group",type:"boolean"}},required:["menuItem","order"],additionalProperties:!1}]}},additionalProperties:!1},menuItem:{description:"Single item in a menu that can be clicked on to take an action or can be the parent of a submenu",type:"object",oneOf:[{properties:{id:{description:"ID for this menu item that holds a submenu",$ref:"#/$defs/referencedItem"}},required:["id"]},{properties:{command:{description:"Name of the PAPI command to run when this menu item is selected.",$ref:"#/$defs/referencedItem"},iconPathBefore:{description:"Path to the icon to display before the menu text",type:"string"},iconPathAfter:{description:"Path to the icon to display after the menu text",type:"string"}},required:["command"]}],properties:{label:{description:"Key that represents the text of this menu item to display",$ref:"#/$defs/localizeKey"},tooltip:{description:"Key that represents the text to display if a mouse pointer hovers over the menu item",$ref:"#/$defs/localizeKey"},searchTerms:{description:"Key that represents additional words the platform should reference when users are searching for menu items",$ref:"#/$defs/localizeKey"},localizeNotes:{description:"Additional information provided by developers to help people who perform localization",type:"string"},group:{description:"Group to which this menu item belongs",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this menu item compared to other menu items in the same group (sorted ascending)",type:"number"}},required:["label","group","order"],unevaluatedProperties:!1},groupsAndItems:{description:"Core schema for a column",type:"object",properties:{groups:{description:"Groups that belong in this menu",$ref:"#/$defs/menuGroups"},items:{description:"List of menu items that belong in this menu",type:"array",items:{$ref:"#/$defs/menuItem"},uniqueItems:!0}},required:["groups","items"]},singleColumnMenu:{description:"Menu that contains a column without a header",type:"object",allOf:[{$ref:"#/$defs/groupsAndItems"}],unevaluatedProperties:!1},multiColumnMenu:{description:"Menu that can contain multiple columns with headers",type:"object",allOf:[{$ref:"#/$defs/groupsAndItems"},{properties:{columns:{description:"Columns that belong in this menu",$ref:"#/$defs/columnsWithHeaders"}},required:["columns"]}],unevaluatedProperties:!1},menusForOneWebView:{description:"Set of menus that are associated with a single tab",type:"object",properties:{includeDefaults:{description:"Indicates whether the platform default menus should be included for this webview",type:"boolean"},topMenu:{description:"Menu that opens when you click on the top left corner of a tab",$ref:"#/$defs/multiColumnMenu"},contextMenu:{description:"Menu that opens when you right click on the main body/area of a tab",$ref:"#/$defs/singleColumnMenu"}},additionalProperties:!1}}};Object.freeze(ue);exports.AsyncVariable=ge;exports.DocumentCombinerEngine=Me;exports.FIRST_SCR_BOOK_NUM=L;exports.FIRST_SCR_CHAPTER_NUM=X;exports.FIRST_SCR_VERSE_NUM=Q;exports.LAST_SCR_BOOK_NUM=Z;exports.Mutex=W;exports.MutexMap=Te;exports.PlatformEventEmitter=Pe;exports.UnsubscriberAsyncList=Ce;exports.aggregateUnsubscriberAsyncs=_e;exports.aggregateUnsubscribers=xe;exports.at=Ke;exports.charAt=Le;exports.codePointAt=Ze;exports.createSyncProxyForAsyncObject=Se;exports.debounce=ve;exports.deepClone=E;exports.deepEqual=jt;exports.deserialize=ie;exports.endsWith=Xe;exports.getAllObjectFunctionNames=Ae;exports.getChaptersForBook=Y;exports.getErrorMessage=Oe;exports.groupBy=ye;exports.htmlEncode=Pt;exports.includes=re;exports.indexOf=S;exports.isSerializable=Ct;exports.isString=F;exports.lastIndexOf=se;exports.length=m;exports.menuDocumentSchema=ue;exports.newGuid=Ne;exports.normalize=Qe;exports.offsetBook=Re;exports.offsetChapter=De;exports.offsetVerse=Ie;exports.padEnd=Ye;exports.padStart=et;exports.serialize=C;exports.slice=tt;exports.split=rt;exports.startsWith=st;exports.substring=O;exports.toArray=ne;exports.wait=H;exports.waitForDuration=$e; +"use strict";var me=Object.defineProperty;var de=(t,e,r)=>e in t?me(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var p=(t,e,r)=>(de(t,typeof e!="symbol"?e+"":e,r),r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const be=require("async-mutex");class ge{constructor(e,r=1e4){p(this,"variableName");p(this,"promiseToValue");p(this,"resolver");p(this,"rejecter");this.variableName=e,this.promiseToValue=new Promise((s,n)=>{this.resolver=s,this.rejecter=n}),r>0&&setTimeout(()=>{this.rejecter&&(this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`),this.complete())},r),Object.seal(this)}get promise(){return this.promiseToValue}get hasSettled(){return Object.isFrozen(this)}resolveToValue(e,r=!1){if(this.resolver)console.debug(`${this.variableName} is being resolved now`),this.resolver(e),this.complete();else{if(r)throw Error(`${this.variableName} was already settled`);console.debug(`Ignoring subsequent resolution of ${this.variableName}`)}}rejectWithReason(e,r=!1){if(this.rejecter)console.debug(`${this.variableName} is being rejected now`),this.rejecter(e),this.complete();else{if(r)throw Error(`${this.variableName} was already settled`);console.debug(`Ignoring subsequent rejection of ${this.variableName}`)}}complete(){this.resolver=void 0,this.rejecter=void 0,Object.freeze(this)}}function Ne(){return"00-0-4-1-000".replace(/[^-]/g,t=>((Math.random()+~~t)*65536>>t).toString(16).padStart(4,"0"))}function F(t){return typeof t=="string"||t instanceof String}function E(t){return JSON.parse(JSON.stringify(t))}function ve(t,e=300){if(F(t))throw new Error("Tried to debounce a string! Could be XSS");let r;return(...s)=>{clearTimeout(r),r=setTimeout(()=>t(...s),e)}}function ye(t,e,r){const s=new Map;return t.forEach(n=>{const o=e(n),a=s.get(o),i=r?r(n,o):n;a?a.push(i):s.set(o,[i])}),s}function we(t){return typeof t=="object"&&t!==null&&"message"in t&&typeof t.message=="string"}function Ee(t){if(we(t))return t;try{return new Error(JSON.stringify(t))}catch{return new Error(String(t))}}function Oe(t){return Ee(t).message}function H(t){return new Promise(e=>setTimeout(e,t))}function $e(t,e){const r=H(e).then(()=>{});return Promise.any([r,t()])}function Ae(t,e="obj"){const r=new Set;Object.getOwnPropertyNames(t).forEach(n=>{try{typeof t[n]=="function"&&r.add(n)}catch(o){console.debug(`Skipping ${n} on ${e} due to error: ${o}`)}});let s=Object.getPrototypeOf(t);for(;s&&Object.getPrototypeOf(s);)Object.getOwnPropertyNames(s).forEach(n=>{try{typeof t[n]=="function"&&r.add(n)}catch(o){console.debug(`Skipping ${n} on ${e}'s prototype due to error: ${o}`)}}),s=Object.getPrototypeOf(s);return r}function Se(t,e={}){return new Proxy(e,{get(r,s){return s in r?r[s]:async(...n)=>(await t())[s](...n)}})}class Me{constructor(e,r){p(this,"baseDocument");p(this,"contributions",new Map);p(this,"latestOutput");p(this,"options");this.baseDocument=e,this.options=r,this.updateBaseDocument(e)}updateBaseDocument(e){return this.validateStartingDocument(e),this.baseDocument=this.options.copyDocuments?E(e):e,this.rebuild()}addOrUpdateContribution(e,r){this.validateContribution(e,r);const s=this.contributions.get(e),n=this.options.copyDocuments&&r?E(r):r;this.contributions.set(e,n);try{return this.rebuild()}catch(o){throw s?this.contributions.set(e,s):this.contributions.delete(e),new Error(`Error when setting the document named ${e}: ${o}`)}}deleteContribution(e){const r=this.contributions.get(e);if(!r)throw new Error("{documentKey} does not exist");this.contributions.delete(e);try{return this.rebuild()}catch(s){throw this.contributions.set(e,r),new Error(`Error when deleting the document named ${e}: ${s}`)}}rebuild(){if(this.contributions.size===0){let r=E(this.baseDocument);return r=this.transformFinalOutput(r),this.validateOutput(r),this.latestOutput=r,this.latestOutput}let e=this.baseDocument;return this.contributions.forEach(r=>{e=k(e,r,this.options.ignoreDuplicateProperties),this.validateOutput(e)}),e=this.transformFinalOutput(e),this.validateOutput(e),this.latestOutput=e,this.latestOutput}}function qe(...t){let e=!0;return t.forEach(r=>{(!r||typeof r!="object"||Array.isArray(r))&&(e=!1)}),e}function je(...t){let e=!0;return t.forEach(r=>{(!r||typeof r!="object"||!Array.isArray(r))&&(e=!1)}),e}function k(t,e,r){const s=E(t);return e&&Object.keys(e).forEach(n=>{if(Object.hasOwn(t,n)){if(qe(t[n],e[n]))s[n]=k(t[n],e[n],r);else if(je(t[n],e[n]))s[n]=s[n].concat(e[n]);else if(!r)throw new Error(`Cannot merge objects: key "${n}" already exists in the target object`)}else s[n]=e[n]}),s}class Ce{constructor(e="Anonymous"){p(this,"unsubscribers",new Set);this.name=e}add(...e){e.forEach(r=>{"dispose"in r?this.unsubscribers.add(r.dispose):this.unsubscribers.add(r)})}async runAllUnsubscribers(){const e=[...this.unsubscribers].map(s=>s()),r=await Promise.all(e);return this.unsubscribers.clear(),r.every((s,n)=>(s||console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${n} failed!`),s))}}class Pe{constructor(){p(this,"subscribe",this.event);p(this,"subscriptions");p(this,"lazyEvent");p(this,"isDisposed",!1);p(this,"dispose",()=>this.disposeFn());p(this,"emit",e=>{this.emitFn(e)})}get event(){return this.assertNotDisposed(),this.lazyEvent||(this.lazyEvent=e=>{if(!e||typeof e!="function")throw new Error("Event handler callback must be a function!");return this.subscriptions||(this.subscriptions=[]),this.subscriptions.push(e),()=>{if(!this.subscriptions)return!1;const r=this.subscriptions.indexOf(e);return r<0?!1:(this.subscriptions.splice(r,1),!0)}}),this.lazyEvent}emitFn(e){var r;this.assertNotDisposed(),(r=this.subscriptions)==null||r.forEach(s=>s(e))}assertNotDisposed(){if(this.isDisposed)throw new Error("Emitter is disposed")}disposeFn(){return this.assertNotDisposed(),this.isDisposed=!0,this.subscriptions=void 0,this.lazyEvent=void 0,Promise.resolve(!0)}}class W extends be.Mutex{}class Te{constructor(){p(this,"mutexesByID",new Map)}get(e){let r=this.mutexesByID.get(e);return r||(r=new W,this.mutexesByID.set(e,r),r)}}const K=[{shortName:"ERR",fullNames:["ERROR"],chapters:-1},{shortName:"GEN",fullNames:["Genesis"],chapters:50},{shortName:"EXO",fullNames:["Exodus"],chapters:40},{shortName:"LEV",fullNames:["Leviticus"],chapters:27},{shortName:"NUM",fullNames:["Numbers"],chapters:36},{shortName:"DEU",fullNames:["Deuteronomy"],chapters:34},{shortName:"JOS",fullNames:["Joshua"],chapters:24},{shortName:"JDG",fullNames:["Judges"],chapters:21},{shortName:"RUT",fullNames:["Ruth"],chapters:4},{shortName:"1SA",fullNames:["1 Samuel"],chapters:31},{shortName:"2SA",fullNames:["2 Samuel"],chapters:24},{shortName:"1KI",fullNames:["1 Kings"],chapters:22},{shortName:"2KI",fullNames:["2 Kings"],chapters:25},{shortName:"1CH",fullNames:["1 Chronicles"],chapters:29},{shortName:"2CH",fullNames:["2 Chronicles"],chapters:36},{shortName:"EZR",fullNames:["Ezra"],chapters:10},{shortName:"NEH",fullNames:["Nehemiah"],chapters:13},{shortName:"EST",fullNames:["Esther"],chapters:10},{shortName:"JOB",fullNames:["Job"],chapters:42},{shortName:"PSA",fullNames:["Psalm","Psalms"],chapters:150},{shortName:"PRO",fullNames:["Proverbs"],chapters:31},{shortName:"ECC",fullNames:["Ecclesiastes"],chapters:12},{shortName:"SNG",fullNames:["Song of Solomon","Song of Songs"],chapters:8},{shortName:"ISA",fullNames:["Isaiah"],chapters:66},{shortName:"JER",fullNames:["Jeremiah"],chapters:52},{shortName:"LAM",fullNames:["Lamentations"],chapters:5},{shortName:"EZK",fullNames:["Ezekiel"],chapters:48},{shortName:"DAN",fullNames:["Daniel"],chapters:12},{shortName:"HOS",fullNames:["Hosea"],chapters:14},{shortName:"JOL",fullNames:["Joel"],chapters:3},{shortName:"AMO",fullNames:["Amos"],chapters:9},{shortName:"OBA",fullNames:["Obadiah"],chapters:1},{shortName:"JON",fullNames:["Jonah"],chapters:4},{shortName:"MIC",fullNames:["Micah"],chapters:7},{shortName:"NAM",fullNames:["Nahum"],chapters:3},{shortName:"HAB",fullNames:["Habakkuk"],chapters:3},{shortName:"ZEP",fullNames:["Zephaniah"],chapters:3},{shortName:"HAG",fullNames:["Haggai"],chapters:2},{shortName:"ZEC",fullNames:["Zechariah"],chapters:14},{shortName:"MAL",fullNames:["Malachi"],chapters:4},{shortName:"MAT",fullNames:["Matthew"],chapters:28},{shortName:"MRK",fullNames:["Mark"],chapters:16},{shortName:"LUK",fullNames:["Luke"],chapters:24},{shortName:"JHN",fullNames:["John"],chapters:21},{shortName:"ACT",fullNames:["Acts"],chapters:28},{shortName:"ROM",fullNames:["Romans"],chapters:16},{shortName:"1CO",fullNames:["1 Corinthians"],chapters:16},{shortName:"2CO",fullNames:["2 Corinthians"],chapters:13},{shortName:"GAL",fullNames:["Galatians"],chapters:6},{shortName:"EPH",fullNames:["Ephesians"],chapters:6},{shortName:"PHP",fullNames:["Philippians"],chapters:4},{shortName:"COL",fullNames:["Colossians"],chapters:4},{shortName:"1TH",fullNames:["1 Thessalonians"],chapters:5},{shortName:"2TH",fullNames:["2 Thessalonians"],chapters:3},{shortName:"1TI",fullNames:["1 Timothy"],chapters:6},{shortName:"2TI",fullNames:["2 Timothy"],chapters:4},{shortName:"TIT",fullNames:["Titus"],chapters:3},{shortName:"PHM",fullNames:["Philemon"],chapters:1},{shortName:"HEB",fullNames:["Hebrews"],chapters:13},{shortName:"JAS",fullNames:["James"],chapters:5},{shortName:"1PE",fullNames:["1 Peter"],chapters:5},{shortName:"2PE",fullNames:["2 Peter"],chapters:3},{shortName:"1JN",fullNames:["1 John"],chapters:5},{shortName:"2JN",fullNames:["2 John"],chapters:1},{shortName:"3JN",fullNames:["3 John"],chapters:1},{shortName:"JUD",fullNames:["Jude"],chapters:1},{shortName:"REV",fullNames:["Revelation"],chapters:22}],L=1,Z=K.length-1,X=1,Q=1,Y=t=>{var e;return((e=K[t])==null?void 0:e.chapters)??-1},Re=(t,e)=>({bookNum:Math.max(L,Math.min(t.bookNum+e,Z)),chapterNum:1,verseNum:1}),De=(t,e)=>({...t,chapterNum:Math.min(Math.max(X,t.chapterNum+e),Y(t.bookNum)),verseNum:1}),Ie=(t,e)=>({...t,verseNum:Math.max(Q,t.verseNum+e)}),xe=t=>(...e)=>t.map(s=>s(...e)).every(s=>s),_e=t=>async(...e)=>{const r=t.map(async s=>s(...e));return(await Promise.all(r)).every(s=>s)};var D=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},N={},ze=()=>{const t="\\ud800-\\udfff",e="\\u0300-\\u036f",r="\\ufe20-\\ufe2f",s="\\u20d0-\\u20ff",n="\\u1ab0-\\u1aff",o="\\u1dc0-\\u1dff",a=e+r+s+n+o,i="\\ufe0e\\ufe0f",c="\\uD83D\\uDC69\\uD83C\\uDFFB\\u200D\\uD83C\\uDF93",h=`[${t}]`,u=`[${a}]`,l="\\ud83c[\\udffb-\\udfff]",f=`(?:${u}|${l})`,b=`[^${t}]`,d="(?:\\uD83C[\\uDDE6-\\uDDFF]){2}",y="[\\ud800-\\udbff][\\udc00-\\udfff]",q="\\u200d",le="(?:\\ud83c\\udff4\\udb40\\udc67\\udb40\\udc62\\udb40(?:\\udc65|\\udc73|\\udc77)\\udb40(?:\\udc6e|\\udc63|\\udc6c)\\udb40(?:\\udc67|\\udc74|\\udc73)\\udb40\\udc7f)",ce=`[${c}]`,T=`${f}?`,R=`[${i}]?`,fe=`(?:${q}(?:${[b,d,y].join("|")})${R+T})*`,he=R+T+fe,pe=`(?:${[`${b}${u}?`,u,d,y,h,ce].join("|")})`;return new RegExp(`${le}|${l}(?=${l})|${pe+he}`,"g")},Be=D&&D.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(N,"__esModule",{value:!0});var A=Be(ze);function j(t){if(typeof t!="string")throw new Error("A string is expected as input");return t.match(A.default())||[]}var Je=N.toArray=j;function P(t){if(typeof t!="string")throw new Error("Input must be a string");var e=t.match(A.default());return e===null?0:e.length}var Ge=N.length=P;function ee(t,e,r){if(e===void 0&&(e=0),typeof t!="string")throw new Error("Input must be a string");(typeof e!="number"||e<0)&&(e=0),typeof r=="number"&&r<0&&(r=0);var s=t.match(A.default());return s?s.slice(e,r).join(""):""}var Ue=N.substring=ee;function Ve(t,e,r){if(e===void 0&&(e=0),typeof t!="string")throw new Error("Input must be a string");var s=P(t);if(typeof e!="number"&&(e=parseInt(e,10)),e>=s)return"";e<0&&(e+=s);var n;typeof r>"u"?n=s:(typeof r!="number"&&(r=parseInt(r,10)),n=r>=0?r+e:e);var o=t.match(A.default());return o?o.slice(e,n).join(""):""}var Fe=N.substr=Ve;function He(t,e,r,s){if(e===void 0&&(e=16),r===void 0&&(r="#"),s===void 0&&(s="right"),typeof t!="string"||typeof e!="number")throw new Error("Invalid arguments specified");if(["left","right"].indexOf(s)===-1)throw new Error("Pad position should be either left or right");typeof r!="string"&&(r=String(r));var n=P(t);if(n>e)return ee(t,0,e);if(n=s.length)return e===""?s.length:-1;if(e==="")return r;var n=j(e),o=!1,a;for(a=r;am(t)||e<-m(t)))return M(t,e,1)}function Le(t,e){return e<0||e>m(t)-1?"":M(t,e,1)}function Ze(t,e){if(!(e<0||e>m(t)-1))return M(t,e,1).codePointAt(0)}function Xe(t,e,r=m(t)){const s=se(t,e);return!(s===-1||s+m(e)!==r)}function re(t,e,r=0){const s=O(t,r);return S(s,e)!==-1}function S(t,e,r=0){return We(t,e,r)}function se(t,e,r){let s=r===void 0?m(t):r;s<0?s=0:s>=m(t)&&(s=m(t)-1);for(let n=s;n>=0;n--)if(M(t,n,m(e))===e)return n;return-1}function m(t){return Ge(t)}function Qe(t,e){const r=e.toUpperCase();return r==="NONE"?t:t.normalize(r)}function Ye(t,e,r=" "){return e<=m(t)?t:te(t,e,r,"right")}function et(t,e,r=" "){return e<=m(t)?t:te(t,e,r,"left")}function I(t,e){return e>t?t:e<-t?0:e<0?e+t:e}function tt(t,e,r){const s=m(t);if(e>s||r&&(e>r&&!(e>0&&e-s)||r<-s||e<0&&e>-s&&r>0))return"";const n=I(s,e),o=r?I(s,r):void 0;return O(t,n,o)}function rt(t,e,r){const s=[];if(r!==void 0&&r<=0)return[t];if(e==="")return ne(t).slice(0,r);let n=e;(typeof e=="string"||e instanceof RegExp&&!re(e.flags,"g"))&&(n=new RegExp(e,"g"));const o=t.match(n);let a=0;if(!o)return[t];for(let i=0;i<(r?r-1:o.length);i++){const c=S(t,o[i],a),h=m(o[i]);if(s.push(O(t,a,c)),a=c+h,r!==void 0&&s.length===r)break}return s.push(O(t,a)),s}function st(t,e,r=0){return S(t,e,r)===r}function M(t,e=0,r=m(t)-e){return Fe(t,e,r)}function O(t,e,r=m(t)){return Ue(t,e,r)}function ne(t){return Je(t)}var nt=Object.getOwnPropertyNames,ot=Object.getOwnPropertySymbols,at=Object.prototype.hasOwnProperty;function x(t,e){return function(s,n,o){return t(s,n,o)&&e(s,n,o)}}function $(t){return function(r,s,n){if(!r||!s||typeof r!="object"||typeof s!="object")return t(r,s,n);var o=n.cache,a=o.get(r),i=o.get(s);if(a&&i)return a===s&&i===r;o.set(r,s),o.set(s,r);var c=t(r,s,n);return o.delete(r),o.delete(s),c}}function _(t){return nt(t).concat(ot(t))}var oe=Object.hasOwn||function(t,e){return at.call(t,e)};function v(t,e){return t||e?t===e:t===e||t!==t&&e!==e}var ae="_owner",z=Object.getOwnPropertyDescriptor,B=Object.keys;function it(t,e,r){var s=t.length;if(e.length!==s)return!1;for(;s-- >0;)if(!r.equals(t[s],e[s],s,s,t,e,r))return!1;return!0}function ut(t,e){return v(t.getTime(),e.getTime())}function J(t,e,r){if(t.size!==e.size)return!1;for(var s={},n=t.entries(),o=0,a,i;(a=n.next())&&!a.done;){for(var c=e.entries(),h=!1,u=0;(i=c.next())&&!i.done;){var l=a.value,f=l[0],b=l[1],d=i.value,y=d[0],q=d[1];!h&&!s[u]&&(h=r.equals(f,y,o,u,t,e,r)&&r.equals(b,q,f,y,t,e,r))&&(s[u]=!0),u++}if(!h)return!1;o++}return!0}function lt(t,e,r){var s=B(t),n=s.length;if(B(e).length!==n)return!1;for(var o;n-- >0;)if(o=s[n],o===ae&&(t.$$typeof||e.$$typeof)&&t.$$typeof!==e.$$typeof||!oe(e,o)||!r.equals(t[o],e[o],o,o,t,e,r))return!1;return!0}function w(t,e,r){var s=_(t),n=s.length;if(_(e).length!==n)return!1;for(var o,a,i;n-- >0;)if(o=s[n],o===ae&&(t.$$typeof||e.$$typeof)&&t.$$typeof!==e.$$typeof||!oe(e,o)||!r.equals(t[o],e[o],o,o,t,e,r)||(a=z(t,o),i=z(e,o),(a||i)&&(!a||!i||a.configurable!==i.configurable||a.enumerable!==i.enumerable||a.writable!==i.writable)))return!1;return!0}function ct(t,e){return v(t.valueOf(),e.valueOf())}function ft(t,e){return t.source===e.source&&t.flags===e.flags}function G(t,e,r){if(t.size!==e.size)return!1;for(var s={},n=t.values(),o,a;(o=n.next())&&!o.done;){for(var i=e.values(),c=!1,h=0;(a=i.next())&&!a.done;)!c&&!s[h]&&(c=r.equals(o.value,a.value,o.value,a.value,t,e,r))&&(s[h]=!0),h++;if(!c)return!1}return!0}function ht(t,e){var r=t.length;if(e.length!==r)return!1;for(;r-- >0;)if(t[r]!==e[r])return!1;return!0}var pt="[object Arguments]",mt="[object Boolean]",dt="[object Date]",bt="[object Map]",gt="[object Number]",Nt="[object Object]",vt="[object RegExp]",yt="[object Set]",wt="[object String]",Et=Array.isArray,U=typeof ArrayBuffer=="function"&&ArrayBuffer.isView?ArrayBuffer.isView:null,V=Object.assign,Ot=Object.prototype.toString.call.bind(Object.prototype.toString);function $t(t){var e=t.areArraysEqual,r=t.areDatesEqual,s=t.areMapsEqual,n=t.areObjectsEqual,o=t.arePrimitiveWrappersEqual,a=t.areRegExpsEqual,i=t.areSetsEqual,c=t.areTypedArraysEqual;return function(u,l,f){if(u===l)return!0;if(u==null||l==null||typeof u!="object"||typeof l!="object")return u!==u&&l!==l;var b=u.constructor;if(b!==l.constructor)return!1;if(b===Object)return n(u,l,f);if(Et(u))return e(u,l,f);if(U!=null&&U(u))return c(u,l,f);if(b===Date)return r(u,l,f);if(b===RegExp)return a(u,l,f);if(b===Map)return s(u,l,f);if(b===Set)return i(u,l,f);var d=Ot(u);return d===dt?r(u,l,f):d===vt?a(u,l,f):d===bt?s(u,l,f):d===yt?i(u,l,f):d===Nt?typeof u.then!="function"&&typeof l.then!="function"&&n(u,l,f):d===pt?n(u,l,f):d===mt||d===gt||d===wt?o(u,l,f):!1}}function At(t){var e=t.circular,r=t.createCustomConfig,s=t.strict,n={areArraysEqual:s?w:it,areDatesEqual:ut,areMapsEqual:s?x(J,w):J,areObjectsEqual:s?w:lt,arePrimitiveWrappersEqual:ct,areRegExpsEqual:ft,areSetsEqual:s?x(G,w):G,areTypedArraysEqual:s?w:ht};if(r&&(n=V({},n,r(n))),e){var o=$(n.areArraysEqual),a=$(n.areMapsEqual),i=$(n.areObjectsEqual),c=$(n.areSetsEqual);n=V({},n,{areArraysEqual:o,areMapsEqual:a,areObjectsEqual:i,areSetsEqual:c})}return n}function St(t){return function(e,r,s,n,o,a,i){return t(e,r,i)}}function Mt(t){var e=t.circular,r=t.comparator,s=t.createState,n=t.equals,o=t.strict;if(s)return function(c,h){var u=s(),l=u.cache,f=l===void 0?e?new WeakMap:void 0:l,b=u.meta;return r(c,h,{cache:f,equals:n,meta:b,strict:o})};if(e)return function(c,h){return r(c,h,{cache:new WeakMap,equals:n,meta:void 0,strict:o})};var a={cache:void 0,equals:n,meta:void 0,strict:o};return function(c,h){return r(c,h,a)}}var qt=g();g({strict:!0});g({circular:!0});g({circular:!0,strict:!0});g({createInternalComparator:function(){return v}});g({strict:!0,createInternalComparator:function(){return v}});g({circular:!0,createInternalComparator:function(){return v}});g({circular:!0,createInternalComparator:function(){return v},strict:!0});function g(t){t===void 0&&(t={});var e=t.circular,r=e===void 0?!1:e,s=t.createInternalComparator,n=t.createState,o=t.strict,a=o===void 0?!1:o,i=At(t),c=$t(i),h=s?s(c):St(c);return Mt({circular:r,comparator:c,createState:n,equals:h,strict:a})}function jt(t,e){return qt(t,e)}function C(t,e,r){return JSON.stringify(t,(n,o)=>{let a=o;return e&&(a=e(n,a)),a===void 0&&(a=null),a},r)}function ie(t,e){function r(n){return Object.keys(n).forEach(o=>{n[o]===null?n[o]=void 0:typeof n[o]=="object"&&(n[o]=r(n[o]))}),n}const s=JSON.parse(t,e);if(s!==null)return typeof s=="object"?r(s):s}function Ct(t){try{const e=C(t);return e===C(ie(e))}catch{return!1}}const Pt=t=>t.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/"),ue={title:"Platform.Bible menus",type:"object",properties:{mainMenu:{description:"Top level menu for the application",$ref:"#/$defs/multiColumnMenu"},defaultWebViewTopMenu:{description:"Default top menu for web views that don't specify their own",$ref:"#/$defs/multiColumnMenu"},defaultWebViewContextMenu:{description:"Default context menu for web views that don't specify their own",$ref:"#/$defs/singleColumnMenu"},webViewMenus:{description:"Menus that apply per web view in the application",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{$ref:"#/$defs/menusForOneWebView"}},additionalProperties:!1}},required:["mainMenu","defaultWebViewTopMenu","defaultWebViewContextMenu","webViewMenus"],additionalProperties:!1,$defs:{localizeKey:{description:"Identifier for a string that will be localized in a menu based on the user's UI language",type:"string",pattern:"^%[\\w\\-\\.]+%$"},referencedItem:{description:"Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)",type:"string",pattern:"^[\\w\\-]+\\.[\\w\\-]+$"},columnsWithHeaders:{description:"Group of columns that can be combined with other columns to form a multi-column menu",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{description:"Single column with a header string",type:"object",properties:{label:{description:"Header text for this this column in the UI",$ref:"#/$defs/localizeKey"},localizeNotes:{description:"Additional information provided by developers to help people who perform localization",type:"string"},order:{description:"Relative order of this column compared to other columns (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu groups to this column",type:"boolean"}},required:["label","order"],additionalProperties:!1}},properties:{isExtensible:{description:"Defines whether contributions are allowed to add columns to this multi-column menu",type:"boolean"}}},menuGroups:{description:"Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.",type:"object",patternProperties:{"^[\\w\\-]+\\.[\\w\\-]+$":{description:"Single group that contains menu items",type:"object",oneOf:[{properties:{column:{description:"Column where this group belongs, not required for single column menus",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this group compared to other groups in the same column or submenu (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu items to this menu group",type:"boolean"}},required:["order"],additionalProperties:!1},{properties:{menuItem:{description:"Menu item that anchors the submenu where this group belongs",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this group compared to other groups in the same column or submenu (sorted ascending)",type:"number"},isExtensible:{description:"Defines whether contributions are allowed to add menu items to this menu group",type:"boolean"}},required:["menuItem","order"],additionalProperties:!1}]}},additionalProperties:!1},menuItem:{description:"Single item in a menu that can be clicked on to take an action or can be the parent of a submenu",type:"object",oneOf:[{properties:{id:{description:"ID for this menu item that holds a submenu",$ref:"#/$defs/referencedItem"}},required:["id"]},{properties:{command:{description:"Name of the PAPI command to run when this menu item is selected.",$ref:"#/$defs/referencedItem"},iconPathBefore:{description:"Path to the icon to display before the menu text",type:"string"},iconPathAfter:{description:"Path to the icon to display after the menu text",type:"string"}},required:["command"]}],properties:{label:{description:"Key that represents the text of this menu item to display",$ref:"#/$defs/localizeKey"},tooltip:{description:"Key that represents the text to display if a mouse pointer hovers over the menu item",$ref:"#/$defs/localizeKey"},searchTerms:{description:"Key that represents additional words the platform should reference when users are searching for menu items",$ref:"#/$defs/localizeKey"},localizeNotes:{description:"Additional information provided by developers to help people who perform localization",type:"string"},group:{description:"Group to which this menu item belongs",$ref:"#/$defs/referencedItem"},order:{description:"Relative order of this menu item compared to other menu items in the same group (sorted ascending)",type:"number"}},required:["label","group","order"],unevaluatedProperties:!1},groupsAndItems:{description:"Core schema for a column",type:"object",properties:{groups:{description:"Groups that belong in this menu",$ref:"#/$defs/menuGroups"},items:{description:"List of menu items that belong in this menu",type:"array",items:{$ref:"#/$defs/menuItem"},uniqueItems:!0}},required:["groups","items"]},singleColumnMenu:{description:"Menu that contains a column without a header",type:"object",allOf:[{$ref:"#/$defs/groupsAndItems"}],unevaluatedProperties:!1},multiColumnMenu:{description:"Menu that can contain multiple columns with headers",type:"object",allOf:[{$ref:"#/$defs/groupsAndItems"},{properties:{columns:{description:"Columns that belong in this menu",$ref:"#/$defs/columnsWithHeaders"}},required:["columns"]}],unevaluatedProperties:!1},menusForOneWebView:{description:"Set of menus that are associated with a single tab",type:"object",properties:{includeDefaults:{description:"Indicates whether the platform default menus should be included for this webview",type:"boolean"},topMenu:{description:"Menu that opens when you click on the top left corner of a tab",$ref:"#/$defs/multiColumnMenu"},contextMenu:{description:"Menu that opens when you right click on the main body/area of a tab",$ref:"#/$defs/singleColumnMenu"}},additionalProperties:!1}}};Object.freeze(ue);exports.AsyncVariable=ge;exports.DocumentCombinerEngine=Me;exports.FIRST_SCR_BOOK_NUM=L;exports.FIRST_SCR_CHAPTER_NUM=X;exports.FIRST_SCR_VERSE_NUM=Q;exports.LAST_SCR_BOOK_NUM=Z;exports.Mutex=W;exports.MutexMap=Te;exports.PlatformEventEmitter=Pe;exports.UnsubscriberAsyncList=Ce;exports.aggregateUnsubscriberAsyncs=_e;exports.aggregateUnsubscribers=xe;exports.at=Ke;exports.charAt=Le;exports.codePointAt=Ze;exports.createSyncProxyForAsyncObject=Se;exports.debounce=ve;exports.deepClone=E;exports.deepEqual=jt;exports.deserialize=ie;exports.endsWith=Xe;exports.getAllObjectFunctionNames=Ae;exports.getChaptersForBook=Y;exports.getErrorMessage=Oe;exports.groupBy=ye;exports.htmlEncode=Pt;exports.includes=re;exports.indexOf=S;exports.isSerializable=Ct;exports.isString=F;exports.lastIndexOf=se;exports.menuDocumentSchema=ue;exports.newGuid=Ne;exports.normalize=Qe;exports.offsetBook=Re;exports.offsetChapter=De;exports.offsetVerse=Ie;exports.padEnd=Ye;exports.padStart=et;exports.serialize=C;exports.slice=tt;exports.split=rt;exports.startsWith=st;exports.stringLength=m;exports.substring=O;exports.toArray=ne;exports.wait=H;exports.waitForDuration=$e; //# sourceMappingURL=index.cjs.map diff --git a/lib/platform-bible-utils/dist/index.cjs.map b/lib/platform-bible-utils/dist/index.cjs.map index 185424047d..ab65f685f7 100644 --- a/lib/platform-bible-utils/dist/index.cjs.map +++ b/lib/platform-bible-utils/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs","sources":["../src/async-variable.ts","../src/util.ts","../src/document-combiner-engine.ts","../src/unsubscriber-async-list.ts","../src/platform-event-emitter.model.ts","../src/mutex.ts","../src/mutex-map.ts","../src/scripture-util.ts","../src/unsubscriber.ts","../node_modules/char-regex/index.js","../node_modules/stringz/dist/index.js","../src/string-util.ts","../../../node_modules/fast-equals/dist/esm/index.mjs","../src/equality-checking.ts","../src/serialization.ts","../src/menus.model.ts"],"sourcesContent":["/** This class provides a convenient way for one task to wait on a variable that another task sets. */\nexport default class AsyncVariable {\n private readonly variableName: string;\n private readonly promiseToValue: Promise;\n private resolver: ((value: T) => void) | undefined;\n private rejecter: ((reason: string | undefined) => void) | undefined;\n\n /**\n * Creates an instance of the class\n *\n * @param variableName Name to use when logging about this variable\n * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was\n * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you\n * do not want a timeout at all.\n */\n constructor(variableName: string, rejectIfNotSettledWithinMS: number = 10000) {\n this.variableName = variableName;\n this.promiseToValue = new Promise((resolve, reject) => {\n this.resolver = resolve;\n this.rejecter = reject;\n });\n if (rejectIfNotSettledWithinMS > 0) {\n setTimeout(() => {\n if (this.rejecter) {\n this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`);\n this.complete();\n }\n }, rejectIfNotSettledWithinMS);\n }\n Object.seal(this);\n }\n\n /**\n * Get this variable's promise to a value. This always returns the same promise even after the\n * value has been resolved or rejected.\n *\n * @returns The promise for the value to be set\n */\n get promise(): Promise {\n return this.promiseToValue;\n }\n\n /**\n * A simple way to see if this variable's promise was resolved or rejected already\n *\n * @returns Whether the variable was already resolved or rejected\n */\n get hasSettled(): boolean {\n return Object.isFrozen(this);\n }\n\n /**\n * Resolve this variable's promise to the given value\n *\n * @param value This variable's promise will resolve to this value\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected\n */\n resolveToValue(value: T, throwIfAlreadySettled: boolean = false): void {\n if (this.resolver) {\n console.debug(`${this.variableName} is being resolved now`);\n this.resolver(value);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent resolution of ${this.variableName}`);\n }\n }\n\n /**\n * Reject this variable's promise for the value with the given reason\n *\n * @param reason This variable's promise will be rejected with this reason\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected\n */\n rejectWithReason(reason: string, throwIfAlreadySettled: boolean = false): void {\n if (this.rejecter) {\n console.debug(`${this.variableName} is being rejected now`);\n this.rejecter(reason);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent rejection of ${this.variableName}`);\n }\n }\n\n /** Prevent any further updates to this variable */\n private complete(): void {\n this.resolver = undefined;\n this.rejecter = undefined;\n Object.freeze(this);\n }\n}\n","/** Collection of functions, objects, and types that are used as helpers in other services. */\n\n// Thanks to blubberdiblub at https://stackoverflow.com/a/68141099/217579\nexport function newGuid(): string {\n return '00-0-4-1-000'.replace(/[^-]/g, (s) =>\n // @ts-expect-error ts(2363) this works fine\n // eslint-disable-next-line no-bitwise\n (((Math.random() + ~~s) * 0x10000) >> s).toString(16).padStart(4, '0'),\n );\n}\n\n// thanks to DRAX at https://stackoverflow.com/a/9436948\n/**\n * Determine whether the object is a string\n *\n * @param o Object to determine if it is a string\n * @returns True if the object is a string; false otherwise\n */\nexport function isString(o: unknown): o is string {\n return typeof o === 'string' || o instanceof String;\n}\n\n/**\n * If deepClone isn't used when copying properties between objects, you may be left with dangling\n * references between the source and target of property copying operations.\n *\n * @param obj Object to clone\n * @returns Duplicate copy of `obj` without any references back to the original one\n */\nexport function deepClone(obj: T): T {\n // Assert the return type matches what is expected\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return JSON.parse(JSON.stringify(obj)) as T;\n}\n\n/**\n * Get a function that reduces calls to the function passed in\n *\n * @param fn The function to debounce\n * @param delay How much delay in milliseconds after the most recent call to the debounced function\n * to call the function\n * @returns Function that, when called, only calls the function passed in at maximum every delay ms\n */\n// We don't know the parameter types since this function can be anything\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce void>(fn: T, delay = 300): T {\n if (isString(fn)) throw new Error('Tried to debounce a string! Could be XSS');\n let timeout: ReturnType;\n // Ensure the right return type.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return ((...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n }) as T;\n}\n\n/**\n * Groups each item in the array of items into a map according to the keySelector\n *\n * @param items Array of items to group by\n * @param keySelector Function to run on each item to get the key for the group to which it belongs\n * @param valueSelector Function to run on each item to get the value it should have in the group\n * (like map function). If not provided, uses the item itself\n * @returns Map of keys to groups of values corresponding to each item\n */\nexport function groupBy(items: T[], keySelector: (item: T) => K): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector: (item: T, key: K) => V,\n): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector?: (item: T, key: K) => V,\n): Map> {\n const map = new Map>();\n items.forEach((item) => {\n const key = keySelector(item);\n const group = map.get(key);\n const value = valueSelector ? valueSelector(item, key) : item;\n if (group) group.push(value);\n else map.set(key, [value]);\n });\n return map;\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\ntype ErrorWithMessage = {\n message: string;\n};\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return (\n typeof error === 'object' &&\n // We're potentially dealing with objects we didn't create, so they might contain `null`\n // eslint-disable-next-line no-null/no-null\n error !== null &&\n 'message' in error &&\n // Type assert `error` to check it's `message`.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n typeof (error as Record).message === 'string'\n );\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error from the object (useful for getting an error in a catch block)\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error message from the object (useful for getting error message in a catch\n * block)\n *\n * @example `try {...} catch (e) { logger.info(getErrorMessage(e)) }`\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\n/** Asynchronously waits for the specified number of milliseconds. (wraps setTimeout in a promise) */\nexport function wait(ms: number) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Runs the specified function and will timeout if it takes longer than the specified wait time\n *\n * @param fn The function to run\n * @param maxWaitTimeInMS The maximum amount of time to wait for the function to resolve\n * @returns Promise that resolves to the resolved value of the function or undefined if it ran\n * longer than the specified wait time\n */\nexport function waitForDuration(fn: () => Promise, maxWaitTimeInMS: number) {\n const timeout = wait(maxWaitTimeInMS).then(() => undefined);\n return Promise.any([timeout, fn()]);\n}\n\n/**\n * Get all functions on an object and its prototype chain (so we don't miss any class methods or any\n * object methods). Note that the functions on the final item in the prototype chain (i.e., Object)\n * are skipped to avoid including functions like `__defineGetter__`, `__defineSetter__`, `toString`,\n * etc.\n *\n * @param obj Object whose functions to get\n * @param objId Optional ID of the object to use for debug logging\n * @returns Array of all function names on an object\n */\n// Note: lodash has something that MIGHT do the same thing as this. Investigate for https://github.com/paranext/paranext-core/issues/134\nexport function getAllObjectFunctionNames(\n obj: { [property: string]: unknown },\n objId: string = 'obj',\n): Set {\n const objectFunctionNames = new Set();\n\n // Get all function properties directly defined on the object\n Object.getOwnPropertyNames(obj).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n console.debug(`Skipping ${property} on ${objId} due to error: ${error}`);\n }\n });\n\n // Walk up the prototype chain and get additional function properties, skipping the functions\n // provided by the final (Object) prototype\n let objectPrototype = Object.getPrototypeOf(obj);\n while (objectPrototype && Object.getPrototypeOf(objectPrototype)) {\n Object.getOwnPropertyNames(objectPrototype).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n console.debug(`Skipping ${property} on ${objId}'s prototype due to error: ${error}`);\n }\n });\n objectPrototype = Object.getPrototypeOf(objectPrototype);\n }\n\n return objectFunctionNames;\n}\n\n/**\n * Creates a synchronous proxy for an asynchronous object. The proxy allows calling methods on an\n * object that is asynchronously fetched using a provided asynchronous function.\n *\n * @param getObject - A function that returns a promise resolving to the object whose asynchronous\n * methods to call.\n * @param objectToProxy - An optional object that is the object that is proxied. If a property is\n * accessed that does exist on this object, it will be returned. If a property is accessed that\n * does not exist on this object, it will be considered to be an asynchronous method called on the\n * object returned from getObject.\n * @returns A synchronous proxy for the asynchronous object.\n */\nexport function createSyncProxyForAsyncObject(\n getObject: (args?: unknown[]) => Promise,\n objectToProxy: Partial = {},\n): T {\n // objectToProxy will have only the synchronously accessed properties of T on it, and this proxy\n // makes the async methods that do not exist yet available synchronously so we have all of T\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return new Proxy(objectToProxy as T, {\n get(target, prop) {\n // We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // @ts-expect-error 7053\n if (prop in target) return target[prop];\n return async (...args: unknown[]) => {\n // 7053: We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // 2556: The args here are the parameters for the method specified\n // @ts-expect-error 7053 2556\n return (await getObject())[prop](...args);\n };\n },\n });\n}\n","import { deepClone } from './util';\n\nexport type JsonDocumentLike = { [key: string]: unknown };\n\n/**\n * Options for DocumentCombinerEngine objects\n *\n * - `copyDocuments`: If true, this instance will perform a deep copy of all provided documents before\n * composing the output. If false, then changes made to provided documents after they are\n * contributed will be reflected in the next time output is composed.\n * - `ignoreDuplicateProperties`: If true, then duplicate properties are skipped if they are seen in\n * contributed documents. If false, then throw when duplicate properties are seen in contributed\n * documents.\n */\nexport type DocumentCombinerOptions = {\n copyDocuments: boolean;\n ignoreDuplicateProperties: boolean;\n};\n\n/**\n * Base class for any code that wants to compose JSON documents (in the form of JS objects) together\n * into a single output document.\n */\nexport default abstract class DocumentCombinerEngine {\n protected baseDocument: JsonDocumentLike;\n protected readonly contributions = new Map();\n protected latestOutput: JsonDocumentLike | undefined;\n protected readonly options: DocumentCombinerOptions;\n\n /**\n * Create a DocumentCombinerEngine instance\n *\n * @param baseDocument This is the first document that will be used when composing the output\n * @param options Options used by this object when combining documents\n */\n protected constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) {\n // Setting baseDocument redundantly because TS doesn't understand that updateBaseDocument does it\n this.baseDocument = baseDocument;\n this.options = options;\n this.updateBaseDocument(baseDocument);\n }\n\n /**\n * Update the starting document for composition process\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n * @returns Recalculated output document given the new starting state and existing other documents\n */\n updateBaseDocument(baseDocument: JsonDocumentLike): JsonDocumentLike | undefined {\n this.validateStartingDocument(baseDocument);\n this.baseDocument = this.options.copyDocuments ? deepClone(baseDocument) : baseDocument;\n return this.rebuild();\n }\n\n /**\n * Add or update one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n * @returns Recalculated output document given the new or updated contribution and existing other\n * documents\n */\n addOrUpdateContribution(\n documentName: string,\n document: JsonDocumentLike,\n ): JsonDocumentLike | undefined {\n this.validateContribution(documentName, document);\n const previousDocumentVersion = this.contributions.get(documentName);\n const documentToSet = this.options.copyDocuments && !!document ? deepClone(document) : document;\n this.contributions.set(documentName, documentToSet);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after adding/updating the contribution, put it back how it was\n if (previousDocumentVersion) this.contributions.set(documentName, previousDocumentVersion);\n else this.contributions.delete(documentName);\n throw new Error(`Error when setting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Delete one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to delete\n * @returns Recalculated output document given the remaining other documents\n */\n deleteContribution(documentName: string): object | undefined {\n const document = this.contributions.get(documentName);\n if (!document) throw new Error(`{documentKey} does not exist`);\n this.contributions.delete(documentName);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after deleting the contribution, put it back and rethrow\n this.contributions.set(documentName, document);\n throw new Error(`Error when deleting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Run the document composition process given the starting document and all contributions. Throws\n * if the output document fails to validate properly.\n *\n * @returns Recalculated output document given the starting and contributed documents\n */\n rebuild(): JsonDocumentLike | undefined {\n // The starting document is the output if there are no other contributions\n if (this.contributions.size === 0) {\n let potentialOutput = deepClone(this.baseDocument);\n potentialOutput = this.transformFinalOutput(potentialOutput);\n this.validateOutput(potentialOutput);\n this.latestOutput = potentialOutput;\n return this.latestOutput;\n }\n\n // Compose the output by validating each document one at a time to pinpoint errors better\n let outputIteration = this.baseDocument;\n this.contributions.forEach((contribution: JsonDocumentLike) => {\n outputIteration = mergeObjects(\n outputIteration,\n contribution,\n this.options.ignoreDuplicateProperties,\n );\n this.validateOutput(outputIteration);\n });\n outputIteration = this.transformFinalOutput(outputIteration);\n this.validateOutput(outputIteration);\n this.latestOutput = outputIteration;\n return this.latestOutput;\n }\n\n /**\n * Throw an error if the provided document is not a valid starting document.\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n */\n protected abstract validateStartingDocument(baseDocument: JsonDocumentLike): void;\n\n /**\n * Throw an error if the provided document is not a valid contribution document.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n */\n protected abstract validateContribution(documentName: string, document: JsonDocumentLike): void;\n\n /**\n * Throw an error if the provided output is not valid.\n *\n * @param output Output document that could potentially be returned to callers\n */\n protected abstract validateOutput(output: JsonDocumentLike): void;\n\n /**\n * Transform the document that is the composition of the base document and all contribution\n * documents. This is the last step that will be run prior to validation before\n * `this.latestOutput` is updated to the new output.\n *\n * @param finalOutput Final output document that could potentially be returned to callers. \"Final\"\n * means no further contribution documents will be merged.\n */\n protected abstract transformFinalOutput(finalOutput: JsonDocumentLike): JsonDocumentLike;\n}\n\n// #region Helper functions\n\n/**\n * Determines if the input values are objects but not arrays\n *\n * @param values Objects to check\n * @returns True if all the values are objects but not arrays\n */\nfunction areNonArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Determines if the input values are arrays\n *\n * @param value Objects to check\n * @returns True if the values are arrays\n */\nfunction areArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || !Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Recursively merge the properties of one object (copyFrom) into another (startingPoint). Throws if\n * copyFrom would overwrite values already existing in startingPoint.\n *\n * @param startingPoint Object that is the starting point for the return value\n * @param copyFrom Object whose values are copied into the return value\n * @returns Object that is the combination of the two documents\n */\nfunction mergeObjects(\n startingPoint: JsonDocumentLike,\n copyFrom: JsonDocumentLike,\n ignoreDuplicateProperties: boolean,\n): JsonDocumentLike {\n const retVal = deepClone(startingPoint);\n if (!copyFrom) return retVal;\n\n Object.keys(copyFrom).forEach((key: string | number) => {\n if (Object.hasOwn(startingPoint, key)) {\n if (areNonArrayObjects(startingPoint[key], copyFrom[key])) {\n retVal[key] = mergeObjects(\n // We know these are objects from the `if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n startingPoint[key] as JsonDocumentLike,\n copyFrom[key] as JsonDocumentLike,\n ignoreDuplicateProperties,\n /* eslint-enable no-type-assertion/no-type-assertion */\n );\n } else if (areArrayObjects(startingPoint[key], copyFrom[key])) {\n // We know these are arrays because of the `else if` check\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n retVal[key] = (retVal[key] as Array).concat(copyFrom[key] as Array);\n } else if (!ignoreDuplicateProperties)\n throw new Error(`Cannot merge objects: key \"${key}\" already exists in the target object`);\n } else {\n retVal[key] = copyFrom[key];\n }\n });\n\n return retVal;\n}\n\n// #endregion\n","import { Dispose } from './disposal.model';\nimport { Unsubscriber, UnsubscriberAsync } from './unsubscriber';\n\n/** Simple collection for UnsubscriberAsync objects that also provides an easy way to run them. */\nexport default class UnsubscriberAsyncList {\n readonly unsubscribers = new Set();\n\n constructor(private name = 'Anonymous') {}\n\n /**\n * Add unsubscribers to the list. Note that duplicates are not added twice.\n *\n * @param unsubscribers - Objects that were returned from a registration process.\n */\n add(...unsubscribers: (UnsubscriberAsync | Unsubscriber | Dispose)[]) {\n unsubscribers.forEach((unsubscriber) => {\n if ('dispose' in unsubscriber) this.unsubscribers.add(unsubscriber.dispose);\n else this.unsubscribers.add(unsubscriber);\n });\n }\n\n /**\n * Run all unsubscribers added to this list and then clear the list.\n *\n * @returns `true` if all unsubscribers succeeded, `false` otherwise.\n */\n async runAllUnsubscribers(): Promise {\n const unsubs = [...this.unsubscribers].map((unsubscriber) => unsubscriber());\n const results = await Promise.all(unsubs);\n this.unsubscribers.clear();\n return results.every((unsubscriberSucceeded, index) => {\n if (!unsubscriberSucceeded)\n console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${index} failed!`);\n\n return unsubscriberSucceeded;\n });\n }\n}\n","/** Interfaces, classes, and functions related to events and event emitters */\n\nimport { Dispose } from './disposal.model';\nimport { PlatformEvent, PlatformEventHandler } from './platform-event';\n\n/**\n * Event manager - accepts subscriptions to an event and runs the subscription callbacks when the\n * event is emitted Use eventEmitter.event(callback) to subscribe to the event. Use\n * eventEmitter.emit(event) to run the subscriptions. Generally, this EventEmitter should be\n * private, and its event should be public. That way, the emitter is not publicized, but anyone can\n * subscribe to the event.\n */\nexport default class PlatformEventEmitter implements Dispose {\n /**\n * Subscribes a function to run when this event is emitted.\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n * @alias event\n */\n subscribe = this.event;\n\n /** All callback functions that will run when this event is emitted. Lazy loaded */\n private subscriptions?: PlatformEventHandler[];\n /** Event for listeners to subscribe to. Lazy loaded */\n private lazyEvent?: PlatformEvent;\n /** Whether this emitter has been disposed */\n private isDisposed = false;\n\n /**\n * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted.\n * Use like `const unsubscriber = event(callback)`\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n */\n get event(): PlatformEvent {\n this.assertNotDisposed();\n\n if (!this.lazyEvent) {\n this.lazyEvent = (callback) => {\n if (!callback || typeof callback !== 'function')\n throw new Error(`Event handler callback must be a function!`);\n\n // Initialize this.subscriptions if it does not exist\n if (!this.subscriptions) this.subscriptions = [];\n\n this.subscriptions.push(callback);\n\n return () => {\n if (!this.subscriptions) return false; // Did not find any subscribed callbacks\n\n const callbackIndex = this.subscriptions.indexOf(callback);\n\n if (callbackIndex < 0) return false; // Did not find this callback in the subscriptions\n\n // Remove the callback\n this.subscriptions.splice(callbackIndex, 1);\n\n return true;\n };\n };\n }\n return this.lazyEvent;\n }\n\n /** Disposes of this event, preparing it to release from memory */\n dispose = () => {\n return this.disposeFn();\n };\n\n /**\n * Runs the subscriptions for the event\n *\n * @param event Event data to provide to subscribed callbacks\n */\n emit = (event: T) => {\n // Do not do anything other than emitFn here. This emit is just binding `this` to emitFn\n this.emitFn(event);\n };\n\n /**\n * Function that runs the subscriptions for the event. Added here so children can override emit\n * and still call the base functionality. See NetworkEventEmitter.emit for example\n */\n protected emitFn(event: T) {\n this.assertNotDisposed();\n\n this.subscriptions?.forEach((callback) => callback(event));\n }\n\n /** Check to make sure this emitter is not disposed. Throw if it is */\n protected assertNotDisposed() {\n if (this.isDisposed) throw new Error('Emitter is disposed');\n }\n\n /**\n * Disposes of this event, preparing it to release from memory. Added here so children can\n * override emit and still call the base functionality.\n */\n protected disposeFn() {\n this.assertNotDisposed();\n\n this.isDisposed = true;\n this.subscriptions = undefined;\n this.lazyEvent = undefined;\n return Promise.resolve(true);\n }\n}\n","import { Mutex as AsyncMutex } from 'async-mutex';\n\n// Extending Mutex from async-mutex so we can add JSDoc\n\n/**\n * Class that allows calling asynchronous functions multiple times at once while only running one at\n * a time.\n *\n * @example\n *\n * ```typescript\n * const mutex = new Mutex();\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n * ```\n *\n * See [`async-mutex`](https://www.npmjs.com/package/async-mutex) for more information.\n */\nclass Mutex extends AsyncMutex {}\n\nexport default Mutex;\n","import Mutex from './mutex';\n\n/** Map of {@link Mutex}es that automatically (lazily) generates a new {@link Mutex} for any new key */\nclass MutexMap {\n private mutexesByID = new Map();\n\n get(mutexID: string): Mutex {\n let retVal = this.mutexesByID.get(mutexID);\n if (retVal) return retVal;\n\n retVal = new Mutex();\n this.mutexesByID.set(mutexID, retVal);\n return retVal;\n }\n}\n\nexport default MutexMap;\n","import { BookInfo, ScriptureReference } from './scripture.model';\n\nconst scrBookData: BookInfo[] = [\n { shortName: 'ERR', fullNames: ['ERROR'], chapters: -1 },\n { shortName: 'GEN', fullNames: ['Genesis'], chapters: 50 },\n { shortName: 'EXO', fullNames: ['Exodus'], chapters: 40 },\n { shortName: 'LEV', fullNames: ['Leviticus'], chapters: 27 },\n { shortName: 'NUM', fullNames: ['Numbers'], chapters: 36 },\n { shortName: 'DEU', fullNames: ['Deuteronomy'], chapters: 34 },\n { shortName: 'JOS', fullNames: ['Joshua'], chapters: 24 },\n { shortName: 'JDG', fullNames: ['Judges'], chapters: 21 },\n { shortName: 'RUT', fullNames: ['Ruth'], chapters: 4 },\n { shortName: '1SA', fullNames: ['1 Samuel'], chapters: 31 },\n { shortName: '2SA', fullNames: ['2 Samuel'], chapters: 24 },\n { shortName: '1KI', fullNames: ['1 Kings'], chapters: 22 },\n { shortName: '2KI', fullNames: ['2 Kings'], chapters: 25 },\n { shortName: '1CH', fullNames: ['1 Chronicles'], chapters: 29 },\n { shortName: '2CH', fullNames: ['2 Chronicles'], chapters: 36 },\n { shortName: 'EZR', fullNames: ['Ezra'], chapters: 10 },\n { shortName: 'NEH', fullNames: ['Nehemiah'], chapters: 13 },\n { shortName: 'EST', fullNames: ['Esther'], chapters: 10 },\n { shortName: 'JOB', fullNames: ['Job'], chapters: 42 },\n { shortName: 'PSA', fullNames: ['Psalm', 'Psalms'], chapters: 150 },\n { shortName: 'PRO', fullNames: ['Proverbs'], chapters: 31 },\n { shortName: 'ECC', fullNames: ['Ecclesiastes'], chapters: 12 },\n { shortName: 'SNG', fullNames: ['Song of Solomon', 'Song of Songs'], chapters: 8 },\n { shortName: 'ISA', fullNames: ['Isaiah'], chapters: 66 },\n { shortName: 'JER', fullNames: ['Jeremiah'], chapters: 52 },\n { shortName: 'LAM', fullNames: ['Lamentations'], chapters: 5 },\n { shortName: 'EZK', fullNames: ['Ezekiel'], chapters: 48 },\n { shortName: 'DAN', fullNames: ['Daniel'], chapters: 12 },\n { shortName: 'HOS', fullNames: ['Hosea'], chapters: 14 },\n { shortName: 'JOL', fullNames: ['Joel'], chapters: 3 },\n { shortName: 'AMO', fullNames: ['Amos'], chapters: 9 },\n { shortName: 'OBA', fullNames: ['Obadiah'], chapters: 1 },\n { shortName: 'JON', fullNames: ['Jonah'], chapters: 4 },\n { shortName: 'MIC', fullNames: ['Micah'], chapters: 7 },\n { shortName: 'NAM', fullNames: ['Nahum'], chapters: 3 },\n { shortName: 'HAB', fullNames: ['Habakkuk'], chapters: 3 },\n { shortName: 'ZEP', fullNames: ['Zephaniah'], chapters: 3 },\n { shortName: 'HAG', fullNames: ['Haggai'], chapters: 2 },\n { shortName: 'ZEC', fullNames: ['Zechariah'], chapters: 14 },\n { shortName: 'MAL', fullNames: ['Malachi'], chapters: 4 },\n { shortName: 'MAT', fullNames: ['Matthew'], chapters: 28 },\n { shortName: 'MRK', fullNames: ['Mark'], chapters: 16 },\n { shortName: 'LUK', fullNames: ['Luke'], chapters: 24 },\n { shortName: 'JHN', fullNames: ['John'], chapters: 21 },\n { shortName: 'ACT', fullNames: ['Acts'], chapters: 28 },\n { shortName: 'ROM', fullNames: ['Romans'], chapters: 16 },\n { shortName: '1CO', fullNames: ['1 Corinthians'], chapters: 16 },\n { shortName: '2CO', fullNames: ['2 Corinthians'], chapters: 13 },\n { shortName: 'GAL', fullNames: ['Galatians'], chapters: 6 },\n { shortName: 'EPH', fullNames: ['Ephesians'], chapters: 6 },\n { shortName: 'PHP', fullNames: ['Philippians'], chapters: 4 },\n { shortName: 'COL', fullNames: ['Colossians'], chapters: 4 },\n { shortName: '1TH', fullNames: ['1 Thessalonians'], chapters: 5 },\n { shortName: '2TH', fullNames: ['2 Thessalonians'], chapters: 3 },\n { shortName: '1TI', fullNames: ['1 Timothy'], chapters: 6 },\n { shortName: '2TI', fullNames: ['2 Timothy'], chapters: 4 },\n { shortName: 'TIT', fullNames: ['Titus'], chapters: 3 },\n { shortName: 'PHM', fullNames: ['Philemon'], chapters: 1 },\n { shortName: 'HEB', fullNames: ['Hebrews'], chapters: 13 },\n { shortName: 'JAS', fullNames: ['James'], chapters: 5 },\n { shortName: '1PE', fullNames: ['1 Peter'], chapters: 5 },\n { shortName: '2PE', fullNames: ['2 Peter'], chapters: 3 },\n { shortName: '1JN', fullNames: ['1 John'], chapters: 5 },\n { shortName: '2JN', fullNames: ['2 John'], chapters: 1 },\n { shortName: '3JN', fullNames: ['3 John'], chapters: 1 },\n { shortName: 'JUD', fullNames: ['Jude'], chapters: 1 },\n { shortName: 'REV', fullNames: ['Revelation'], chapters: 22 },\n];\n\nexport const FIRST_SCR_BOOK_NUM = 1;\nexport const LAST_SCR_BOOK_NUM = scrBookData.length - 1;\nexport const FIRST_SCR_CHAPTER_NUM = 1;\nexport const FIRST_SCR_VERSE_NUM = 1;\n\nexport const getChaptersForBook = (bookNum: number): number => {\n return scrBookData[bookNum]?.chapters ?? -1;\n};\n\nexport const offsetBook = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n bookNum: Math.max(FIRST_SCR_BOOK_NUM, Math.min(scrRef.bookNum + offset, LAST_SCR_BOOK_NUM)),\n chapterNum: 1,\n verseNum: 1,\n});\n\nexport const offsetChapter = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n chapterNum: Math.min(\n Math.max(FIRST_SCR_CHAPTER_NUM, scrRef.chapterNum + offset),\n getChaptersForBook(scrRef.bookNum),\n ),\n verseNum: 1,\n});\n\nexport const offsetVerse = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n verseNum: Math.max(FIRST_SCR_VERSE_NUM, scrRef.verseNum + offset),\n});\n","/** Function to run to dispose of something. Returns true if successfully unsubscribed */\nexport type Unsubscriber = () => boolean;\n\n/**\n * Returns an Unsubscriber function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers All unsubscribers to aggregate into one unsubscriber\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscribers = (unsubscribers: Unsubscriber[]): Unsubscriber => {\n return (...args) => {\n // Run the unsubscriber for each handler\n const unsubs = unsubscribers.map((unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return unsubs.every((success) => success);\n };\n};\n\n/**\n * Function to run to dispose of something that runs asynchronously. The promise resolves to true if\n * successfully unsubscribed\n */\nexport type UnsubscriberAsync = () => Promise;\n\n/**\n * Returns an UnsubscriberAsync function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers - All unsubscribers to aggregate into one unsubscriber.\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscriberAsyncs = (\n unsubscribers: (UnsubscriberAsync | Unsubscriber)[],\n): UnsubscriberAsync => {\n return async (...args) => {\n // Run the unsubscriber for each handler\n const unsubPromises = unsubscribers.map(async (unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return (await Promise.all(unsubPromises)).every((success) => success);\n };\n};\n","\"use strict\"\r\n\r\n// Based on: https://github.com/lodash/lodash/blob/6018350ac10d5ce6a5b7db625140b82aeab804df/.internal/unicodeSize.js\r\n\r\nmodule.exports = () => {\r\n\t// Used to compose unicode character classes.\r\n\tconst astralRange = \"\\\\ud800-\\\\udfff\"\r\n\tconst comboMarksRange = \"\\\\u0300-\\\\u036f\"\r\n\tconst comboHalfMarksRange = \"\\\\ufe20-\\\\ufe2f\"\r\n\tconst comboSymbolsRange = \"\\\\u20d0-\\\\u20ff\"\r\n\tconst comboMarksExtendedRange = \"\\\\u1ab0-\\\\u1aff\"\r\n\tconst comboMarksSupplementRange = \"\\\\u1dc0-\\\\u1dff\"\r\n\tconst comboRange = comboMarksRange + comboHalfMarksRange + comboSymbolsRange + comboMarksExtendedRange + comboMarksSupplementRange\r\n\tconst varRange = \"\\\\ufe0e\\\\ufe0f\"\r\n\tconst familyRange = \"\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFB\\\\u200D\\\\uD83C\\\\uDF93\"\r\n\r\n\t// Used to compose unicode capture groups.\r\n\tconst astral = `[${astralRange}]`\r\n\tconst combo = `[${comboRange}]`\r\n\tconst fitz = \"\\\\ud83c[\\\\udffb-\\\\udfff]\"\r\n\tconst modifier = `(?:${combo}|${fitz})`\r\n\tconst nonAstral = `[^${astralRange}]`\r\n\tconst regional = \"(?:\\\\uD83C[\\\\uDDE6-\\\\uDDFF]){2}\"\r\n\tconst surrogatePair = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\"\r\n\tconst zwj = \"\\\\u200d\"\r\n\tconst blackFlag = \"(?:\\\\ud83c\\\\udff4\\\\udb40\\\\udc67\\\\udb40\\\\udc62\\\\udb40(?:\\\\udc65|\\\\udc73|\\\\udc77)\\\\udb40(?:\\\\udc6e|\\\\udc63|\\\\udc6c)\\\\udb40(?:\\\\udc67|\\\\udc74|\\\\udc73)\\\\udb40\\\\udc7f)\"\r\n\tconst family = `[${familyRange}]`\r\n\r\n\t// Used to compose unicode regexes.\r\n\tconst optModifier = `${modifier}?`\r\n\tconst optVar = `[${varRange}]?`\r\n\tconst optJoin = `(?:${zwj}(?:${[nonAstral, regional, surrogatePair].join(\"|\")})${optVar + optModifier})*`\r\n\tconst seq = optVar + optModifier + optJoin\r\n\tconst nonAstralCombo = `${nonAstral}${combo}?`\r\n\tconst symbol = `(?:${[nonAstralCombo, combo, regional, surrogatePair, astral, family].join(\"|\")})`\r\n\r\n\t// Used to match [String symbols](https://mathiasbynens.be/notes/javascript-unicode).\r\n\treturn new RegExp(`${blackFlag}|${fitz}(?=${fitz})|${symbol + seq}`, \"g\")\r\n}\r\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar char_regex_1 = __importDefault(require(\"char-regex\"));\n/**\n * Converts a string to an array of string chars\n * @param {string} str The string to turn into array\n * @returns {string[]}\n */\nfunction toArray(str) {\n if (typeof str !== 'string') {\n throw new Error('A string is expected as input');\n }\n return str.match(char_regex_1.default()) || [];\n}\nexports.toArray = toArray;\n/**\n * Returns the length of a string\n *\n * @export\n * @param {string} str\n * @returns {number}\n */\nfunction length(str) {\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var match = str.match(char_regex_1.default());\n return match === null ? 0 : match.length;\n}\nexports.length = length;\n/**\n * Returns a substring by providing start and end position\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} end End position\n * @returns {string}\n */\nfunction substring(str, begin, end) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n // Even though negative numbers work here, theyre not in the spec\n if (typeof begin !== 'number' || begin < 0) {\n begin = 0;\n }\n if (typeof end === 'number' && end < 0) {\n end = 0;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substring = substring;\n/**\n * Returns a substring by providing start position and length\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} len Desired length\n * @returns {string}\n */\nfunction substr(str, begin, len) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var strLength = length(str);\n // Fix type\n if (typeof begin !== 'number') {\n begin = parseInt(begin, 10);\n }\n // Return zero-length string if got oversize number.\n if (begin >= strLength) {\n return '';\n }\n // Calculating postive version of negative value.\n if (begin < 0) {\n begin += strLength;\n }\n var end;\n if (typeof len === 'undefined') {\n end = strLength;\n }\n else {\n // Fix type\n if (typeof len !== 'number') {\n len = parseInt(len, 10);\n }\n end = len >= 0 ? len + begin : begin;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substr = substr;\n/**\n * Enforces a string to be a certain length by\n * adding or removing characters\n *\n * @export\n * @param {string} str\n * @param {number} [limit=16] Limit\n * @param {string} [padString='#'] The Pad String\n * @param {string} [padPosition='right'] The Pad Position\n * @returns {string}\n */\nfunction limit(str, limit, padString, padPosition) {\n if (limit === void 0) { limit = 16; }\n if (padString === void 0) { padString = '#'; }\n if (padPosition === void 0) { padPosition = 'right'; }\n // Input should be a string, limit should be a number\n if (typeof str !== 'string' || typeof limit !== 'number') {\n throw new Error('Invalid arguments specified');\n }\n // Pad position should be either left or right\n if (['left', 'right'].indexOf(padPosition) === -1) {\n throw new Error('Pad position should be either left or right');\n }\n // Pad string can be anything, we convert it to string\n if (typeof padString !== 'string') {\n padString = String(padString);\n }\n // Calculate string length considering astral code points\n var strLength = length(str);\n if (strLength > limit) {\n return substring(str, 0, limit);\n }\n else if (strLength < limit) {\n var padRepeats = padString.repeat(limit - strLength);\n return padPosition === 'left' ? padRepeats + str : str + padRepeats;\n }\n return str;\n}\nexports.limit = limit;\n/**\n * Returns the index of the first occurrence of a given string\n *\n * @export\n * @param {string} str\n * @param {string} [searchStr] the string to search\n * @param {number} [pos] starting position\n * @returns {number}\n */\nfunction indexOf(str, searchStr, pos) {\n if (pos === void 0) { pos = 0; }\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n if (str === '') {\n if (searchStr === '') {\n return 0;\n }\n return -1;\n }\n // fix type\n pos = Number(pos);\n pos = isNaN(pos) ? 0 : pos;\n searchStr = String(searchStr);\n var strArr = toArray(str);\n if (pos >= strArr.length) {\n if (searchStr === '') {\n return strArr.length;\n }\n return -1;\n }\n if (searchStr === '') {\n return pos;\n }\n var searchArr = toArray(searchStr);\n var finded = false;\n var index;\n for (index = pos; index < strArr.length; index += 1) {\n var searchIndex = 0;\n while (searchIndex < searchArr.length &&\n searchArr[searchIndex] === strArr[index + searchIndex]) {\n searchIndex += 1;\n }\n if (searchIndex === searchArr.length &&\n searchArr[searchIndex - 1] === strArr[index + searchIndex - 1]) {\n finded = true;\n break;\n }\n }\n return finded ? index : -1;\n}\nexports.indexOf = indexOf;\n","import {\n indexOf as stringzIndexOf,\n substring as stringzSubstring,\n length as stringzLength,\n toArray as stringzToArray,\n limit as stringzLimit,\n substr as stringzSubstr,\n} from 'stringz';\n\n/**\n * Finds the Unicode code point at the given index. This function handles Unicode code points\n * instead of UTF-16 character codes.\n *\n * @param string String to index\n * @param index Position of the character to be returned in range of -length(string) to\n * length(string)\n * @returns New string consisting of the Unicode code point located at the specified\n * offset, undefined if index is out of bounds\n */\nexport function at(string: string, index: number): string | undefined {\n if (index > length(string) || index < -length(string)) return undefined;\n return substr(string, index, 1);\n}\n\n/**\n * Returns a new string consisting of the single UTF-16 code unit at the given index.\n * This function handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns New string consisting of the Unicode code point located at the specified\n * offset, empty string if index is out of bounds\n */\nexport function charAt(string: string, index: number): string {\n if (index < 0 || index > length(string) - 1) return '';\n return substr(string, index, 1);\n}\n\n/**\n * Returns a non-negative integer that is the Unicode code point value of the character starting at\n * the given index. This function handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns Non-negative integer representing the code point value of the\n * character at the given index, or undefined if there is no element at that position\n */\nexport function codePointAt(string: string, index: number): number | undefined {\n if (index < 0 || index > length(string) - 1) return undefined;\n return substr(string, index, 1).codePointAt(0);\n}\n\n/**\n * Determines whether a string ends with the characters of this string. This function handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to search through\n * @param searchString Characters to search for at the end of the string\n * @param endPosition End position where searchString is expected to be\n * found. Default is `length(string)`\n * @returns True if it ends with searchString, false if it does not\n */\nexport function endsWith(\n string: string,\n searchString: string,\n endPosition: number = length(string),\n): boolean {\n const lastIndexOfSearchString = lastIndexOf(string, searchString);\n if (lastIndexOfSearchString === -1) return false;\n if (lastIndexOfSearchString + length(searchString) !== endPosition) return false;\n return true;\n}\n\n/**\n * Performs a case-sensitive search to determine if searchString is found in string. This function\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to search through\n * @param searchString String to search for\n * @param position Position within the string to start searching for searchString.\n * Default is `0`\n * @returns True if search string is found, false if it is not\n */\nexport function includes(string: string, searchString: string, position: number = 0): boolean {\n const partialString = substring(string, position);\n const indexOfSearchString = indexOf(partialString, searchString);\n if (indexOfSearchString === -1) return false;\n return true;\n}\n\n/**\n * Returns the index of the first occurrence of a given string. This function handles Unicode code\n * points instead of UTF-16 character codes.\n *\n * @param string String to search through\n * @param searchString The string to search for\n * @param position Start of searching. Default is `0`\n * @returns Index of the first occurrence of a given string\n */\nexport function indexOf(\n string: string,\n searchString: string,\n position: number | undefined = 0,\n): number {\n return stringzIndexOf(string, searchString, position);\n}\n\n/**\n * Searches this string and returns the index of the last occurrence of the specified substring.\n * This function handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to search through\n * @param searchString Substring to search for\n * @param position The index at which to begin searching. If omitted, the search begins at the end\n * of the string. Default is `undefined`\n * @returns Index of the last occurrence of searchString found, or -1 if not found.\n */\nexport function lastIndexOf(\n string: string,\n searchString: string,\n position?: number,\n): number {\n let validatedPosition = position ? position : length(string);\n\n if (validatedPosition < 0) {\n validatedPosition = 0;\n } else if (validatedPosition >= length(string)) {\n validatedPosition = length(string) - 1;\n }\n\n for (let index = validatedPosition; index >= 0; index--) {\n if (substr(string, index, length(searchString)) === searchString) {\n return index;\n }\n }\n\n return -1;\n}\n\n/**\n * Returns the length of a string. This function handles Unicode code points instead of UTF-16\n * character codes.\n *\n * @param string String to return the length for\n * @returns Number that is length of the starting string\n */\nexport function length(string: string): number {\n return stringzLength(string);\n}\n\n/**\n * Returns the Unicode Normalization Form of this string.\n *\n * @param string The starting string\n * @param form Form specifying the Unicode Normalization Form. Default is `'NFC'`\n * @returns A string containing the Unicode Normalization Form of the given string.\n */\nexport function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' | 'none'): string {\n const upperCaseForm = form.toUpperCase();\n if (upperCaseForm === 'NONE') {\n return string;\n }\n return string.normalize(upperCaseForm);\n}\n\n/**\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the end of this string. This function\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been\n * padded. If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too\n * long to stay within targetLength, it will be truncated. Default is `\" \"`\n * @returns String with appropriate padding at the end\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padEnd(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= length(string)) return string;\n return stringzLimit(string, targetLength, padString, 'right');\n}\n\n/**\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the start of this string. This function\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been\n * padded. If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too\n * long to stay within the targetLength, it will be truncated from the end. Default is `\" \"`\n * @returns String with of specified targetLength with padString applied from the start\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padStart(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= length(string)) return string;\n return stringzLimit(string, targetLength, padString, 'left');\n}\n\nfunction correctSliceIndex(stringLength: number, index: number) {\n if (index > stringLength) return stringLength;\n if (index < -stringLength) return 0;\n if (index < 0) return index + stringLength;\n return index;\n}\n\n/**\n * Extracts a section of this string and returns it as a new string, without modifying the original\n * string. This function handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string The starting string\n * @param indexStart The index of the first character to include in the returned substring.\n * @param indexEnd The index of the first character to exclude from the returned substring.\n * @returns A new string containing the extracted section of the string.\n */\nexport function slice(string: string, indexStart: number, indexEnd?: number): string {\n const stringLength: number = length(string);\n if (\n indexStart > stringLength ||\n (indexEnd &&\n ((indexStart > indexEnd &&\n !(\n indexStart > 0 &&\n indexStart < stringLength &&\n indexEnd < 0 &&\n indexEnd > -stringLength\n )) ||\n indexEnd < -stringLength ||\n (indexStart < 0 && indexStart > -stringLength && indexEnd > 0)))\n )\n return '';\n\n const newStart = correctSliceIndex(stringLength, indexStart);\n const newEnd = indexEnd ? correctSliceIndex(stringLength, indexEnd) : undefined;\n\n return substring(string, newStart, newEnd);\n}\n\n/**\n * Takes a pattern and divides the string into an ordered list of substrings by searching for the\n * pattern, puts these substrings into an array, and returns the array. This function handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * @param string The string to split\n * @param separator The pattern describing where each split should occur\n * @param splitLimit Limit on the number of substrings to be included in the array. Splits\n * the string at each occurrence of specified separator, but stops when limit entries have been\n * placed in the array.\n * @returns An array of strings, split at each point where separator occurs\n * in the starting string. Returns undefined if separator is not found in string.\n */\nexport function split(string: string, separator: string | RegExp, splitLimit?: number): string[] {\n const result: string[] = [];\n\n if (splitLimit !== undefined && splitLimit <= 0) {\n return [string];\n }\n\n if (separator === '') return toArray(string).slice(0, splitLimit);\n\n let regexSeparator = separator;\n if (\n typeof separator === 'string' ||\n (separator instanceof RegExp && !includes(separator.flags, 'g'))\n ) {\n regexSeparator = new RegExp(separator, 'g');\n }\n\n const matches: RegExpMatchArray | null = string.match(regexSeparator);\n\n let currentIndex = 0;\n\n if (!matches) return [string];\n\n for (let index = 0; index < (splitLimit ? splitLimit - 1 : matches.length); index++) {\n const matchIndex = indexOf(string, matches[index], currentIndex);\n const matchLength = length(matches[index]);\n\n result.push(substring(string, currentIndex, matchIndex));\n currentIndex = matchIndex + matchLength;\n\n if (splitLimit !== undefined && result.length === splitLimit) {\n break;\n }\n }\n\n result.push(substring(string, currentIndex));\n\n return result;\n}\n\n/**\n * Determines whether the string begins with the characters of a specified string, returning true or\n * false as appropriate. This function handles Unicode code points instead of UTF-16 character\n * codes.\n *\n * @param string String to search through\n * @param searchString The characters to be searched for at the start of this string.\n * @param position The start position at which searchString is expected to be found\n * (the index of searchString's first character). Default is `0`\n * @returns True if the given characters are found at the beginning of the string,\n * including when searchString is an empty string; otherwise, false.\n */\nexport function startsWith(string: string, searchString: string, position: number = 0): boolean {\n const indexOfSearchString = indexOf(string, searchString, position);\n if (indexOfSearchString !== position) return false;\n return true;\n}\n\n/**\n * Returns a substring by providing start and length. This function handles Unicode code points\n * instead of UTF-16 character codes. This function is not exported because it is considered\n * deprecated, however it is still useful as a local helper function.\n *\n * @param string String to be divided\n * @param begin Start position. Default is `Start of string`\n * @param len Length of result. Default is `String\n * length minus start parameter`. Default is `String length minus start parameter`\n * @returns Substring from starting string\n */\nfunction substr(string: string, begin: number = 0, len: number = length(string) - begin): string {\n return stringzSubstr(string, begin, len);\n}\n\n/**\n * Returns a substring by providing start and end position. This function handles Unicode code\n * points instead of UTF-16 character codes.\n *\n * @param string String to be divided\n * @param begin Start position\n * @param end End position. Default is `End of string`\n * @returns Substring from starting string\n */\nexport function substring(\n string: string,\n begin: number,\n end: number = length(string),\n): string {\n return stringzSubstring(string, begin, end);\n}\n\n/**\n * Converts a string to an array of string characters. This function handles Unicode code points\n * instead of UTF-16 character codes.\n *\n * @param string String to convert to array\n * @returns An array of characters from the starting string\n */\nexport function toArray(string: string): string[] {\n return stringzToArray(string);\n}\n","var getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Combine two comparators into a single comparators.\n */\nfunction combineComparators(comparatorA, comparatorB) {\n return function isEqual(a, b, state) {\n return comparatorA(a, b, state) && comparatorB(a, b, state);\n };\n}\n/**\n * Wrap the provided `areItemsEqual` method to manage the circular state, allowing\n * for circular references to be safely included in the comparison without creating\n * stack overflows.\n */\nfunction createIsCircular(areItemsEqual) {\n return function isCircular(a, b, state) {\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object') {\n return areItemsEqual(a, b, state);\n }\n var cache = state.cache;\n var cachedA = cache.get(a);\n var cachedB = cache.get(b);\n if (cachedA && cachedB) {\n return cachedA === b && cachedB === a;\n }\n cache.set(a, b);\n cache.set(b, a);\n var result = areItemsEqual(a, b, state);\n cache.delete(a);\n cache.delete(b);\n return result;\n };\n}\n/**\n * Get the properties to strictly examine, which include both own properties that are\n * not enumerable and symbol properties.\n */\nfunction getStrictProperties(object) {\n return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));\n}\n/**\n * Whether the object contains the property passed as an own property.\n */\nvar hasOwn = Object.hasOwn ||\n (function (object, property) {\n return hasOwnProperty.call(object, property);\n });\n/**\n * Whether the values passed are strictly equal or both NaN.\n */\nfunction sameValueZeroEqual(a, b) {\n return a || b ? a === b : a === b || (a !== a && b !== b);\n}\n\nvar OWNER = '_owner';\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, keys = Object.keys;\n/**\n * Whether the arrays are equal in value.\n */\nfunction areArraysEqual(a, b, state) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (!state.equals(a[index], b[index], index, index, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the dates passed are equal in value.\n */\nfunction areDatesEqual(a, b) {\n return sameValueZeroEqual(a.getTime(), b.getTime());\n}\n/**\n * Whether the `Map`s are equal in value.\n */\nfunction areMapsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.entries();\n var index = 0;\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.entries();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n var _a = aResult.value, aKey = _a[0], aValue = _a[1];\n var _b = bResult.value, bKey = _b[0], bValue = _b[1];\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch =\n state.equals(aKey, bKey, index, matchIndex, a, b, state) &&\n state.equals(aValue, bValue, aKey, bKey, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n index++;\n }\n return true;\n}\n/**\n * Whether the objects are equal in value.\n */\nfunction areObjectsEqual(a, b, state) {\n var properties = keys(a);\n var index = properties.length;\n if (keys(b).length !== index) {\n return false;\n }\n var property;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property) ||\n !state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the objects are equal in value with strict property checking.\n */\nfunction areObjectsEqualStrict(a, b, state) {\n var properties = getStrictProperties(a);\n var index = properties.length;\n if (getStrictProperties(b).length !== index) {\n return false;\n }\n var property;\n var descriptorA;\n var descriptorB;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property)) {\n return false;\n }\n if (!state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n descriptorA = getOwnPropertyDescriptor(a, property);\n descriptorB = getOwnPropertyDescriptor(b, property);\n if ((descriptorA || descriptorB) &&\n (!descriptorA ||\n !descriptorB ||\n descriptorA.configurable !== descriptorB.configurable ||\n descriptorA.enumerable !== descriptorB.enumerable ||\n descriptorA.writable !== descriptorB.writable)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the primitive wrappers passed are equal in value.\n */\nfunction arePrimitiveWrappersEqual(a, b) {\n return sameValueZeroEqual(a.valueOf(), b.valueOf());\n}\n/**\n * Whether the regexps passed are equal in value.\n */\nfunction areRegExpsEqual(a, b) {\n return a.source === b.source && a.flags === b.flags;\n}\n/**\n * Whether the `Set`s are equal in value.\n */\nfunction areSetsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.values();\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.values();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch = state.equals(aResult.value, bResult.value, aResult.value, bResult.value, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the TypedArray instances are equal in value.\n */\nfunction areTypedArraysEqual(a, b) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n return true;\n}\n\nvar ARGUMENTS_TAG = '[object Arguments]';\nvar BOOLEAN_TAG = '[object Boolean]';\nvar DATE_TAG = '[object Date]';\nvar MAP_TAG = '[object Map]';\nvar NUMBER_TAG = '[object Number]';\nvar OBJECT_TAG = '[object Object]';\nvar REG_EXP_TAG = '[object RegExp]';\nvar SET_TAG = '[object Set]';\nvar STRING_TAG = '[object String]';\nvar isArray = Array.isArray;\nvar isTypedArray = typeof ArrayBuffer === 'function' && ArrayBuffer.isView\n ? ArrayBuffer.isView\n : null;\nvar assign = Object.assign;\nvar getTag = Object.prototype.toString.call.bind(Object.prototype.toString);\n/**\n * Create a comparator method based on the type-specific equality comparators passed.\n */\nfunction createEqualityComparator(_a) {\n var areArraysEqual = _a.areArraysEqual, areDatesEqual = _a.areDatesEqual, areMapsEqual = _a.areMapsEqual, areObjectsEqual = _a.areObjectsEqual, arePrimitiveWrappersEqual = _a.arePrimitiveWrappersEqual, areRegExpsEqual = _a.areRegExpsEqual, areSetsEqual = _a.areSetsEqual, areTypedArraysEqual = _a.areTypedArraysEqual;\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n */\n return function comparator(a, b, state) {\n // If the items are strictly equal, no need to do a value comparison.\n if (a === b) {\n return true;\n }\n // If the items are not non-nullish objects, then the only possibility\n // of them being equal but not strictly is if they are both `NaN`. Since\n // `NaN` is uniquely not equal to itself, we can use self-comparison of\n // both objects, which is faster than `isNaN()`.\n if (a == null ||\n b == null ||\n typeof a !== 'object' ||\n typeof b !== 'object') {\n return a !== a && b !== b;\n }\n var constructor = a.constructor;\n // Checks are listed in order of commonality of use-case:\n // 1. Common complex object types (plain object, array)\n // 2. Common data values (date, regexp)\n // 3. Less-common complex object types (map, set)\n // 4. Less-common data values (promise, primitive wrappers)\n // Inherently this is both subjective and assumptive, however\n // when reviewing comparable libraries in the wild this order\n // appears to be generally consistent.\n // Constructors should match, otherwise there is potential for false positives\n // between class and subclass or custom object and POJO.\n if (constructor !== b.constructor) {\n return false;\n }\n // `isPlainObject` only checks against the object's own realm. Cross-realm\n // comparisons are rare, and will be handled in the ultimate fallback, so\n // we can avoid capturing the string tag.\n if (constructor === Object) {\n return areObjectsEqual(a, b, state);\n }\n // `isArray()` works on subclasses and is cross-realm, so we can avoid capturing\n // the string tag or doing an `instanceof` check.\n if (isArray(a)) {\n return areArraysEqual(a, b, state);\n }\n // `isTypedArray()` works on all possible TypedArray classes, so we can avoid\n // capturing the string tag or comparing against all possible constructors.\n if (isTypedArray != null && isTypedArray(a)) {\n return areTypedArraysEqual(a, b, state);\n }\n // Try to fast-path equality checks for other complex object types in the\n // same realm to avoid capturing the string tag. Strict equality is used\n // instead of `instanceof` because it is more performant for the common\n // use-case. If someone is subclassing a native class, it will be handled\n // with the string tag comparison.\n if (constructor === Date) {\n return areDatesEqual(a, b, state);\n }\n if (constructor === RegExp) {\n return areRegExpsEqual(a, b, state);\n }\n if (constructor === Map) {\n return areMapsEqual(a, b, state);\n }\n if (constructor === Set) {\n return areSetsEqual(a, b, state);\n }\n // Since this is a custom object, capture the string tag to determing its type.\n // This is reasonably performant in modern environments like v8 and SpiderMonkey.\n var tag = getTag(a);\n if (tag === DATE_TAG) {\n return areDatesEqual(a, b, state);\n }\n if (tag === REG_EXP_TAG) {\n return areRegExpsEqual(a, b, state);\n }\n if (tag === MAP_TAG) {\n return areMapsEqual(a, b, state);\n }\n if (tag === SET_TAG) {\n return areSetsEqual(a, b, state);\n }\n if (tag === OBJECT_TAG) {\n // The exception for value comparison is custom `Promise`-like class instances. These should\n // be treated the same as standard `Promise` objects, which means strict equality, and if\n // it reaches this point then that strict equality comparison has already failed.\n return (typeof a.then !== 'function' &&\n typeof b.then !== 'function' &&\n areObjectsEqual(a, b, state));\n }\n // If an arguments tag, it should be treated as a standard object.\n if (tag === ARGUMENTS_TAG) {\n return areObjectsEqual(a, b, state);\n }\n // As the penultimate fallback, check if the values passed are primitive wrappers. This\n // is very rare in modern JS, which is why it is deprioritized compared to all other object\n // types.\n if (tag === BOOLEAN_TAG || tag === NUMBER_TAG || tag === STRING_TAG) {\n return arePrimitiveWrappersEqual(a, b, state);\n }\n // If not matching any tags that require a specific type of comparison, then we hard-code false because\n // the only thing remaining is strict equality, which has already been compared. This is for a few reasons:\n // - Certain types that cannot be introspected (e.g., `WeakMap`). For these types, this is the only\n // comparison that can be made.\n // - For types that can be introspected, but rarely have requirements to be compared\n // (`ArrayBuffer`, `DataView`, etc.), the cost is avoided to prioritize the common\n // use-cases (may be included in a future release, if requested enough).\n // - For types that can be introspected but do not have an objective definition of what\n // equality is (`Error`, etc.), the subjective decision is to be conservative and strictly compare.\n // In all cases, these decisions should be reevaluated based on changes to the language and\n // common development practices.\n return false;\n };\n}\n/**\n * Create the configuration object used for building comparators.\n */\nfunction createEqualityComparatorConfig(_a) {\n var circular = _a.circular, createCustomConfig = _a.createCustomConfig, strict = _a.strict;\n var config = {\n areArraysEqual: strict\n ? areObjectsEqualStrict\n : areArraysEqual,\n areDatesEqual: areDatesEqual,\n areMapsEqual: strict\n ? combineComparators(areMapsEqual, areObjectsEqualStrict)\n : areMapsEqual,\n areObjectsEqual: strict\n ? areObjectsEqualStrict\n : areObjectsEqual,\n arePrimitiveWrappersEqual: arePrimitiveWrappersEqual,\n areRegExpsEqual: areRegExpsEqual,\n areSetsEqual: strict\n ? combineComparators(areSetsEqual, areObjectsEqualStrict)\n : areSetsEqual,\n areTypedArraysEqual: strict\n ? areObjectsEqualStrict\n : areTypedArraysEqual,\n };\n if (createCustomConfig) {\n config = assign({}, config, createCustomConfig(config));\n }\n if (circular) {\n var areArraysEqual$1 = createIsCircular(config.areArraysEqual);\n var areMapsEqual$1 = createIsCircular(config.areMapsEqual);\n var areObjectsEqual$1 = createIsCircular(config.areObjectsEqual);\n var areSetsEqual$1 = createIsCircular(config.areSetsEqual);\n config = assign({}, config, {\n areArraysEqual: areArraysEqual$1,\n areMapsEqual: areMapsEqual$1,\n areObjectsEqual: areObjectsEqual$1,\n areSetsEqual: areSetsEqual$1,\n });\n }\n return config;\n}\n/**\n * Default equality comparator pass-through, used as the standard `isEqual` creator for\n * use inside the built comparator.\n */\nfunction createInternalEqualityComparator(compare) {\n return function (a, b, _indexOrKeyA, _indexOrKeyB, _parentA, _parentB, state) {\n return compare(a, b, state);\n };\n}\n/**\n * Create the `isEqual` function used by the consuming application.\n */\nfunction createIsEqual(_a) {\n var circular = _a.circular, comparator = _a.comparator, createState = _a.createState, equals = _a.equals, strict = _a.strict;\n if (createState) {\n return function isEqual(a, b) {\n var _a = createState(), _b = _a.cache, cache = _b === void 0 ? circular ? new WeakMap() : undefined : _b, meta = _a.meta;\n return comparator(a, b, {\n cache: cache,\n equals: equals,\n meta: meta,\n strict: strict,\n });\n };\n }\n if (circular) {\n return function isEqual(a, b) {\n return comparator(a, b, {\n cache: new WeakMap(),\n equals: equals,\n meta: undefined,\n strict: strict,\n });\n };\n }\n var state = {\n cache: undefined,\n equals: equals,\n meta: undefined,\n strict: strict,\n };\n return function isEqual(a, b) {\n return comparator(a, b, state);\n };\n}\n\n/**\n * Whether the items passed are deeply-equal in value.\n */\nvar deepEqual = createCustomEqual();\n/**\n * Whether the items passed are deeply-equal in value based on strict comparison.\n */\nvar strictDeepEqual = createCustomEqual({ strict: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references.\n */\nvar circularDeepEqual = createCustomEqual({ circular: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularDeepEqual = createCustomEqual({\n circular: true,\n strict: true,\n});\n/**\n * Whether the items passed are shallowly-equal in value.\n */\nvar shallowEqual = createCustomEqual({\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value based on strict comparison\n */\nvar strictShallowEqual = createCustomEqual({\n strict: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references.\n */\nvar circularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n strict: true,\n});\n/**\n * Create a custom equality comparison method.\n *\n * This can be done to create very targeted comparisons in extreme hot-path scenarios\n * where the standard methods are not performant enough, but can also be used to provide\n * support for legacy environments that do not support expected features like\n * `RegExp.prototype.flags` out of the box.\n */\nfunction createCustomEqual(options) {\n if (options === void 0) { options = {}; }\n var _a = options.circular, circular = _a === void 0 ? false : _a, createCustomInternalComparator = options.createInternalComparator, createState = options.createState, _b = options.strict, strict = _b === void 0 ? false : _b;\n var config = createEqualityComparatorConfig(options);\n var comparator = createEqualityComparator(config);\n var equals = createCustomInternalComparator\n ? createCustomInternalComparator(comparator)\n : createInternalEqualityComparator(comparator);\n return createIsEqual({ circular: circular, comparator: comparator, createState: createState, equals: equals, strict: strict });\n}\n\nexport { circularDeepEqual, circularShallowEqual, createCustomEqual, deepEqual, sameValueZeroEqual, shallowEqual, strictCircularDeepEqual, strictCircularShallowEqual, strictDeepEqual, strictShallowEqual };\n//# sourceMappingURL=index.mjs.map\n","// There is a circular version https://www.npmjs.com/package/fast-equals#circulardeepequal that I\n// think allows comparing React refs (which have circular references in particular places that this\n// library would ignore). Maybe we can change to that version sometime if needed.\nimport { deepEqual as isEqualDeep } from 'fast-equals';\n\n/**\n * Check that two objects are deeply equal, comparing members of each object and such\n *\n * @param a The first object to compare\n * @param b The second object to compare\n *\n * WARNING: Objects like arrays from different iframes have different constructor function\n * references even if they do the same thing, so this deep equality comparison fails objects that\n * look the same but have different constructors because different constructors could produce\n * false positives in [a few specific\n * situations](https://github.com/planttheidea/fast-equals/blob/a41afc0a240ad5a472e47b53791e9be017f52281/src/comparator.ts#L96).\n * This means that two objects like arrays from different iframes that look the same will fail\n * this check. Please use some other means to check deep equality in those situations.\n *\n * Note: This deep equality check considers `undefined` values on keys of objects NOT to be equal to\n * not specifying the key at all. For example, `{ stuff: 3, things: undefined }` and `{ stuff: 3\n * }` are not considered equal in this case\n *\n * - For more information and examples, see [this\n * CodeSandbox](https://codesandbox.io/s/deepequallibrarycomparison-4g4kk4?file=/src/index.mjs).\n *\n * @returns True if a and b are deeply equal; false otherwise\n */\nexport default function deepEqual(a: unknown, b: unknown) {\n return isEqualDeep(a, b);\n}\n","/**\n * Converts a JavaScript value to a JSON string, changing `undefined` properties in the JavaScript\n * object to `null` properties in the JSON string.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A JavaScript value, usually an object or array, to be converted.\n * @param replacer A function that transforms the results. Note that all `undefined` values returned\n * by the replacer will be further transformed into `null` in the JSON string.\n * @param space Adds indentation, white space, and line break characters to the return-value JSON\n * text to make it easier to read. See the `space` parameter of `JSON.stringify` for more\n * details.\n */\nexport function serialize(\n value: unknown,\n replacer?: (this: unknown, key: string, value: unknown) => unknown,\n space?: string | number,\n): string {\n const undefinedReplacer = (replacerKey: string, replacerValue: unknown) => {\n let newValue = replacerValue;\n if (replacer) newValue = replacer(replacerKey, newValue);\n // All `undefined` values become `null` on the way from JS objects into JSON strings\n // eslint-disable-next-line no-null/no-null\n if (newValue === undefined) newValue = null;\n return newValue;\n };\n return JSON.stringify(value, undefinedReplacer, space);\n}\n\n/**\n * Converts a JSON string into a value, converting all `null` properties from JSON into `undefined`\n * in the returned JavaScript value/object.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A valid JSON string.\n * @param reviver A function that transforms the results. This function is called for each member of\n * the object. If a member contains nested objects, the nested objects are transformed before the\n * parent object is. Note that `null` values are converted into `undefined` values after the\n * reviver has run.\n */\nexport function deserialize(\n value: string,\n reviver?: (this: unknown, key: string, value: unknown) => unknown,\n // Need to use `any` instead of `unknown` here to match the signature of JSON.parse\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n // Helper function to replace `null` with `undefined` on a per property basis. This can't be done\n // with our own reviver because `JSON.parse` removes `undefined` properties from the return value.\n function replaceNull(obj: Record): Record {\n Object.keys(obj).forEach((key: string | number) => {\n // We only want to replace `null`, not other falsy values\n // eslint-disable-next-line no-null/no-null\n if (obj[key] === null) obj[key] = undefined;\n // If the property is an object, recursively call the helper function on it\n else if (typeof obj[key] === 'object')\n // Since the object came from a string, we know the keys will not be symbols\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n obj[key] = replaceNull(obj[key] as Record);\n });\n return obj;\n }\n\n const parsedObject = JSON.parse(value, reviver);\n // Explicitly convert the value 'null' that isn't stored as a property on an object to 'undefined'\n // eslint-disable-next-line no-null/no-null\n if (parsedObject === null) return undefined;\n if (typeof parsedObject === 'object') return replaceNull(parsedObject);\n return parsedObject;\n}\n\n/**\n * Check to see if the value is serializable without losing information\n *\n * @param value Value to test\n * @returns True if serializable; false otherwise\n *\n * Note: the values `undefined` and `null` are serializable (on their own or in an array), but\n * `null` values get transformed into `undefined` when serializing/deserializing.\n *\n * WARNING: This is inefficient right now as it stringifies, parses, stringifies, and === the value.\n * Please only use this if you need to\n *\n * DISCLAIMER: this does not successfully detect that values are not serializable in some cases:\n *\n * - Losses of removed properties like functions and `Map`s\n * - Class instances (not deserializable into class instances without special code)\n *\n * We intend to improve this in the future if it becomes important to do so. See [`JSON.stringify`\n * documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description)\n * for more information.\n */\nexport function isSerializable(value: unknown): boolean {\n try {\n const serializedValue = serialize(value);\n return serializedValue === serialize(deserialize(serializedValue));\n } catch (e) {\n return false;\n }\n}\n\n/**\n * HTML Encodes the provided string. Thanks to ChatGPT\n *\n * @param str String to HTML encode\n * @returns HTML-encoded string\n */\nexport const htmlEncode = (str: string): string =>\n str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\n/** Identifier for a string that will be localized in a menu based on the user's UI language */\nexport type LocalizeKey = `%${string}%`;\n\n/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */\nexport type ReferencedItem = `${string}.${string}`;\n\nexport type OrderedItem = {\n /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */\n order: number;\n};\n\nexport type OrderedExtensibleContainer = OrderedItem & {\n /** Determines whether other items can be added to this after it has been defined */\n isExtensible?: boolean;\n};\n\n/** Group of menu items that belongs in a column */\nexport type MenuGroupDetailsInColumn = OrderedExtensibleContainer & {\n /** ID of column in which this group resides */\n column: ReferencedItem;\n};\n\n/** Group of menu items that belongs in a submenu */\nexport type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & {\n /** ID of menu item hosting the submenu in which this group resides */\n menuItem: ReferencedItem;\n};\n\n/** Column that includes header text in a menu */\nexport type MenuColumnWithHeader = OrderedExtensibleContainer & {\n /** Key that represents the text of the header text of the column */\n label: LocalizeKey;\n};\n\nexport type MenuItemBase = OrderedItem & {\n /** Menu group to which this menu item belongs */\n group: ReferencedItem;\n /** Key that represents the text of this menu item to display */\n label: LocalizeKey;\n /** Key that represents words the platform should reference when users are searching for menu items */\n searchTerms?: LocalizeKey;\n /** Key that represents the text to display if a mouse pointer hovers over the menu item */\n tooltip?: LocalizeKey;\n /** Additional information provided by developers to help people who perform localization */\n localizeNotes: string;\n};\n\n/** Menu item that hosts a submenu */\nexport type MenuItemContainingSubmenu = MenuItemBase & {\n /** ID for this menu item that holds a submenu */\n id: ReferencedItem;\n};\n\n/** Menu item that runs a command */\nexport type MenuItemContainingCommand = MenuItemBase & {\n /** Name of the PAPI command to run when this menu item is selected. */\n command: ReferencedItem;\n /** Path to the icon to display after the menu text */\n iconPathAfter?: string;\n /** Path to the icon to display before the menu text */\n iconPathBefore?: string;\n};\n\n/**\n * Group of menu items that can be combined with other groups to form a single menu/submenu. Groups\n * are separated using a line within the menu/submenu.\n */\nexport type Groups = {\n /** Named menu group */\n [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu;\n};\n\n/** Group of columns that can be combined with other columns to form a multi-column menu */\nexport type ColumnsWithHeaders = {\n /** Named column of a menu */\n [property: ReferencedItem]: MenuColumnWithHeader;\n /** Defines whether columns can be added to this multi-column menu */\n isExtensible?: boolean;\n};\n\n/** Menu that contains a column without a header */\nexport type SingleColumnMenu = {\n /** Groups that belong in this menu */\n groups: Groups;\n /** List of menu items that belong in this menu */\n items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[];\n};\n\n/** Menu that contains multiple columns with headers */\nexport type MultiColumnMenu = SingleColumnMenu & {\n /** Columns that belong in this menu */\n columns: ColumnsWithHeaders;\n};\n\n/** Menus for one single web view */\nexport type WebViewMenu = {\n /** Indicates whether the platform default menus should be included for this webview */\n includeDefaults: boolean | undefined;\n /** Menu that opens when you click on the top left corner of a tab */\n topMenu: MultiColumnMenu | undefined;\n /** Menu that opens when you right click on the main body/area of a tab */\n contextMenu: SingleColumnMenu | undefined;\n};\n\n/** Menus for all web views */\nexport type WebViewMenus = {\n /** Named web view */\n [property: ReferencedItem]: WebViewMenu;\n};\n\n/** Platform.Bible menus */\nexport type PlatformMenus = {\n /** Top level menu for the application */\n mainMenu: MultiColumnMenu;\n /** Menus that apply per web view in the application */\n webViewMenus: WebViewMenus;\n /** Default context menu for web views that don't specify their own */\n defaultWebViewContextMenu: SingleColumnMenu;\n /** Default top menu for web views that don't specify their own */\n defaultWebViewTopMenu: MultiColumnMenu;\n};\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\n/** JSON schema object that aligns with the PlatformMenus type */\nexport const menuDocumentSchema = {\n title: 'Platform.Bible menus',\n type: 'object',\n properties: {\n mainMenu: {\n description: 'Top level menu for the application',\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewTopMenu: {\n description: \"Default top menu for web views that don't specify their own\",\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewContextMenu: {\n description: \"Default context menu for web views that don't specify their own\",\n $ref: '#/$defs/singleColumnMenu',\n },\n webViewMenus: {\n description: 'Menus that apply per web view in the application',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/menusForOneWebView',\n },\n },\n additionalProperties: false,\n },\n },\n required: ['mainMenu', 'defaultWebViewTopMenu', 'defaultWebViewContextMenu', 'webViewMenus'],\n additionalProperties: false,\n $defs: {\n localizeKey: {\n description:\n \"Identifier for a string that will be localized in a menu based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n },\n referencedItem: {\n description:\n 'Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)',\n type: 'string',\n pattern: '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$',\n },\n columnsWithHeaders: {\n description:\n 'Group of columns that can be combined with other columns to form a multi-column menu',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single column with a header string',\n type: 'object',\n properties: {\n label: {\n description: 'Header text for this this column in the UI',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n order: {\n description:\n 'Relative order of this column compared to other columns (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu groups to this column',\n type: 'boolean',\n },\n },\n required: ['label', 'order'],\n additionalProperties: false,\n },\n },\n properties: {\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add columns to this multi-column menu',\n type: 'boolean',\n },\n },\n },\n menuGroups: {\n description:\n 'Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single group that contains menu items',\n type: 'object',\n oneOf: [\n {\n properties: {\n column: {\n description:\n 'Column where this group belongs, not required for single column menus',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['order'],\n additionalProperties: false,\n },\n {\n properties: {\n menuItem: {\n description: 'Menu item that anchors the submenu where this group belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['menuItem', 'order'],\n additionalProperties: false,\n },\n ],\n },\n },\n additionalProperties: false,\n },\n menuItem: {\n description:\n 'Single item in a menu that can be clicked on to take an action or can be the parent of a submenu',\n type: 'object',\n oneOf: [\n {\n properties: {\n id: {\n description: 'ID for this menu item that holds a submenu',\n $ref: '#/$defs/referencedItem',\n },\n },\n required: ['id'],\n },\n {\n properties: {\n command: {\n description: 'Name of the PAPI command to run when this menu item is selected.',\n $ref: '#/$defs/referencedItem',\n },\n iconPathBefore: {\n description: 'Path to the icon to display before the menu text',\n type: 'string',\n },\n iconPathAfter: {\n description: 'Path to the icon to display after the menu text',\n type: 'string',\n },\n },\n required: ['command'],\n },\n ],\n properties: {\n label: {\n description: 'Key that represents the text of this menu item to display',\n $ref: '#/$defs/localizeKey',\n },\n tooltip: {\n description:\n 'Key that represents the text to display if a mouse pointer hovers over the menu item',\n $ref: '#/$defs/localizeKey',\n },\n searchTerms: {\n description:\n 'Key that represents additional words the platform should reference when users are searching for menu items',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n group: {\n description: 'Group to which this menu item belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this menu item compared to other menu items in the same group (sorted ascending)',\n type: 'number',\n },\n },\n required: ['label', 'group', 'order'],\n unevaluatedProperties: false,\n },\n groupsAndItems: {\n description: 'Core schema for a column',\n type: 'object',\n properties: {\n groups: {\n description: 'Groups that belong in this menu',\n $ref: '#/$defs/menuGroups',\n },\n items: {\n description: 'List of menu items that belong in this menu',\n type: 'array',\n items: { $ref: '#/$defs/menuItem' },\n uniqueItems: true,\n },\n },\n required: ['groups', 'items'],\n },\n singleColumnMenu: {\n description: 'Menu that contains a column without a header',\n type: 'object',\n allOf: [{ $ref: '#/$defs/groupsAndItems' }],\n unevaluatedProperties: false,\n },\n multiColumnMenu: {\n description: 'Menu that can contain multiple columns with headers',\n type: 'object',\n allOf: [\n { $ref: '#/$defs/groupsAndItems' },\n {\n properties: {\n columns: {\n description: 'Columns that belong in this menu',\n $ref: '#/$defs/columnsWithHeaders',\n },\n },\n required: ['columns'],\n },\n ],\n unevaluatedProperties: false,\n },\n menusForOneWebView: {\n description: 'Set of menus that are associated with a single tab',\n type: 'object',\n properties: {\n includeDefaults: {\n description:\n 'Indicates whether the platform default menus should be included for this webview',\n type: 'boolean',\n },\n topMenu: {\n description: 'Menu that opens when you click on the top left corner of a tab',\n $ref: '#/$defs/multiColumnMenu',\n },\n contextMenu: {\n description: 'Menu that opens when you right click on the main body/area of a tab',\n $ref: '#/$defs/singleColumnMenu',\n },\n },\n additionalProperties: false,\n },\n },\n};\n\nObject.freeze(menuDocumentSchema);\n"],"names":["AsyncVariable","variableName","rejectIfNotSettledWithinMS","__publicField","resolve","reject","value","throwIfAlreadySettled","reason","newGuid","s","isString","o","deepClone","obj","debounce","fn","delay","timeout","args","groupBy","items","keySelector","valueSelector","map","item","key","group","isErrorWithMessage","error","toErrorWithMessage","maybeError","getErrorMessage","wait","ms","waitForDuration","maxWaitTimeInMS","getAllObjectFunctionNames","objId","objectFunctionNames","property","objectPrototype","createSyncProxyForAsyncObject","getObject","objectToProxy","target","prop","DocumentCombinerEngine","baseDocument","options","documentName","document","previousDocumentVersion","documentToSet","potentialOutput","outputIteration","contribution","mergeObjects","areNonArrayObjects","values","allMatch","areArrayObjects","startingPoint","copyFrom","ignoreDuplicateProperties","retVal","UnsubscriberAsyncList","name","unsubscribers","unsubscriber","unsubs","results","unsubscriberSucceeded","index","PlatformEventEmitter","event","callback","callbackIndex","_a","Mutex","AsyncMutex","MutexMap","mutexID","scrBookData","FIRST_SCR_BOOK_NUM","LAST_SCR_BOOK_NUM","FIRST_SCR_CHAPTER_NUM","FIRST_SCR_VERSE_NUM","getChaptersForBook","bookNum","offsetBook","scrRef","offset","offsetChapter","offsetVerse","aggregateUnsubscribers","success","aggregateUnsubscriberAsyncs","unsubPromises","charRegex","astralRange","comboMarksRange","comboHalfMarksRange","comboSymbolsRange","comboMarksExtendedRange","comboMarksSupplementRange","comboRange","varRange","familyRange","astral","combo","fitz","modifier","nonAstral","regional","surrogatePair","zwj","blackFlag","family","optModifier","optVar","optJoin","seq","symbol","__importDefault","this","mod","dist","char_regex_1","require$$0","toArray","str","toArray_1","length","match","length_1","substring","begin","end","substring_1","substr","len","strLength","substr_1","limit","padString","padPosition","padRepeats","limit_1","indexOf","searchStr","pos","strArr","searchArr","finded","searchIndex","indexOf_1","at","string","charAt","codePointAt","endsWith","searchString","endPosition","lastIndexOfSearchString","lastIndexOf","includes","position","partialString","stringzIndexOf","validatedPosition","stringzLength","normalize","form","upperCaseForm","padEnd","targetLength","stringzLimit","padStart","correctSliceIndex","stringLength","slice","indexStart","indexEnd","newStart","newEnd","split","separator","splitLimit","result","regexSeparator","matches","currentIndex","matchIndex","matchLength","startsWith","stringzSubstr","stringzSubstring","stringzToArray","getOwnPropertyNames","getOwnPropertySymbols","hasOwnProperty","combineComparators","comparatorA","comparatorB","a","b","state","createIsCircular","areItemsEqual","cache","cachedA","cachedB","getStrictProperties","object","hasOwn","sameValueZeroEqual","OWNER","getOwnPropertyDescriptor","keys","areArraysEqual","areDatesEqual","areMapsEqual","matchedIndices","aIterable","aResult","bResult","bIterable","hasMatch","aKey","aValue","_b","bKey","bValue","areObjectsEqual","properties","areObjectsEqualStrict","descriptorA","descriptorB","arePrimitiveWrappersEqual","areRegExpsEqual","areSetsEqual","areTypedArraysEqual","ARGUMENTS_TAG","BOOLEAN_TAG","DATE_TAG","MAP_TAG","NUMBER_TAG","OBJECT_TAG","REG_EXP_TAG","SET_TAG","STRING_TAG","isArray","isTypedArray","assign","getTag","createEqualityComparator","constructor","tag","createEqualityComparatorConfig","circular","createCustomConfig","strict","config","areArraysEqual$1","areMapsEqual$1","areObjectsEqual$1","areSetsEqual$1","createInternalEqualityComparator","compare","_indexOrKeyA","_indexOrKeyB","_parentA","_parentB","createIsEqual","comparator","createState","equals","meta","deepEqual","createCustomEqual","createCustomInternalComparator","isEqualDeep","serialize","replacer","space","replacerKey","replacerValue","newValue","deserialize","reviver","replaceNull","parsedObject","isSerializable","serializedValue","htmlEncode","menuDocumentSchema"],"mappings":"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B,qBAAsB,EACxB,EACA,CACE,WAAY,CACV,SAAU,CACR,YAAa,8DACb,KAAM,wBACR,EACA,MAAO,CACL,YACE,yGACF,KAAM,QACR,EACA,aAAc,CACZ,YACE,iFACF,KAAM,SACR,CACF,EACA,SAAU,CAAC,WAAY,OAAO,EAC9B,qBAAsB,EACxB,CACF,CACF,CACF,EACA,qBAAsB,EACxB,EACA,SAAU,CACR,YACE,mGACF,KAAM,SACN,MAAO,CACL,CACE,WAAY,CACV,GAAI,CACF,YAAa,6CACb,KAAM,wBACR,CACF,EACA,SAAU,CAAC,IAAI,CACjB,EACA,CACE,WAAY,CACV,QAAS,CACP,YAAa,mEACb,KAAM,wBACR,EACA,eAAgB,CACd,YAAa,mDACb,KAAM,QACR,EACA,cAAe,CACb,YAAa,kDACb,KAAM,QACR,CACF,EACA,SAAU,CAAC,SAAS,CACtB,CACF,EACA,WAAY,CACV,MAAO,CACL,YAAa,4DACb,KAAM,qBACR,EACA,QAAS,CACP,YACE,uFACF,KAAM,qBACR,EACA,YAAa,CACX,YACE,6GACF,KAAM,qBACR,EACA,cAAe,CACb,YACE,wFACF,KAAM,QACR,EACA,MAAO,CACL,YAAa,wCACb,KAAM,wBACR,EACA,MAAO,CACL,YACE,qGACF,KAAM,QACR,CACF,EACA,SAAU,CAAC,QAAS,QAAS,OAAO,EACpC,sBAAuB,EACzB,EACA,eAAgB,CACd,YAAa,2BACb,KAAM,SACN,WAAY,CACV,OAAQ,CACN,YAAa,kCACb,KAAM,oBACR,EACA,MAAO,CACL,YAAa,8CACb,KAAM,QACN,MAAO,CAAE,KAAM,kBAAmB,EAClC,YAAa,EACf,CACF,EACA,SAAU,CAAC,SAAU,OAAO,CAC9B,EACA,iBAAkB,CAChB,YAAa,+CACb,KAAM,SACN,MAAO,CAAC,CAAE,KAAM,yBAA0B,EAC1C,sBAAuB,EACzB,EACA,gBAAiB,CACf,YAAa,sDACb,KAAM,SACN,MAAO,CACL,CAAE,KAAM,wBAAyB,EACjC,CACE,WAAY,CACV,QAAS,CACP,YAAa,mCACb,KAAM,4BACR,CACF,EACA,SAAU,CAAC,SAAS,CACtB,CACF,EACA,sBAAuB,EACzB,EACA,mBAAoB,CAClB,YAAa,qDACb,KAAM,SACN,WAAY,CACV,gBAAiB,CACf,YACE,mFACF,KAAM,SACR,EACA,QAAS,CACP,YAAa,iEACb,KAAM,yBACR,EACA,YAAa,CACX,YAAa,sEACb,KAAM,0BACR,CACF,EACA,qBAAsB,EACxB,CACF,CACF,EAEA,OAAO,OAAOA,EAAkB","x_google_ignoreList":[9,10,12]} \ No newline at end of file +{"version":3,"file":"index.cjs","sources":["../src/async-variable.ts","../src/util.ts","../src/document-combiner-engine.ts","../src/unsubscriber-async-list.ts","../src/platform-event-emitter.model.ts","../src/mutex.ts","../src/mutex-map.ts","../src/scripture-util.ts","../src/unsubscriber.ts","../node_modules/char-regex/index.js","../node_modules/stringz/dist/index.js","../src/string-util.ts","../../../node_modules/fast-equals/dist/esm/index.mjs","../src/equality-checking.ts","../src/serialization.ts","../src/menus.model.ts"],"sourcesContent":["/** This class provides a convenient way for one task to wait on a variable that another task sets. */\nexport default class AsyncVariable {\n private readonly variableName: string;\n private readonly promiseToValue: Promise;\n private resolver: ((value: T) => void) | undefined;\n private rejecter: ((reason: string | undefined) => void) | undefined;\n\n /**\n * Creates an instance of the class\n *\n * @param variableName Name to use when logging about this variable\n * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was\n * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you\n * do not want a timeout at all.\n */\n constructor(variableName: string, rejectIfNotSettledWithinMS: number = 10000) {\n this.variableName = variableName;\n this.promiseToValue = new Promise((resolve, reject) => {\n this.resolver = resolve;\n this.rejecter = reject;\n });\n if (rejectIfNotSettledWithinMS > 0) {\n setTimeout(() => {\n if (this.rejecter) {\n this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`);\n this.complete();\n }\n }, rejectIfNotSettledWithinMS);\n }\n Object.seal(this);\n }\n\n /**\n * Get this variable's promise to a value. This always returns the same promise even after the\n * value has been resolved or rejected.\n *\n * @returns The promise for the value to be set\n */\n get promise(): Promise {\n return this.promiseToValue;\n }\n\n /**\n * A simple way to see if this variable's promise was resolved or rejected already\n *\n * @returns Whether the variable was already resolved or rejected\n */\n get hasSettled(): boolean {\n return Object.isFrozen(this);\n }\n\n /**\n * Resolve this variable's promise to the given value\n *\n * @param value This variable's promise will resolve to this value\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected\n */\n resolveToValue(value: T, throwIfAlreadySettled: boolean = false): void {\n if (this.resolver) {\n console.debug(`${this.variableName} is being resolved now`);\n this.resolver(value);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent resolution of ${this.variableName}`);\n }\n }\n\n /**\n * Reject this variable's promise for the value with the given reason\n *\n * @param reason This variable's promise will be rejected with this reason\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected\n */\n rejectWithReason(reason: string, throwIfAlreadySettled: boolean = false): void {\n if (this.rejecter) {\n console.debug(`${this.variableName} is being rejected now`);\n this.rejecter(reason);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent rejection of ${this.variableName}`);\n }\n }\n\n /** Prevent any further updates to this variable */\n private complete(): void {\n this.resolver = undefined;\n this.rejecter = undefined;\n Object.freeze(this);\n }\n}\n","/** Collection of functions, objects, and types that are used as helpers in other services. */\n\n// Thanks to blubberdiblub at https://stackoverflow.com/a/68141099/217579\nexport function newGuid(): string {\n return '00-0-4-1-000'.replace(/[^-]/g, (s) =>\n // @ts-expect-error ts(2363) this works fine\n // eslint-disable-next-line no-bitwise\n (((Math.random() + ~~s) * 0x10000) >> s).toString(16).padStart(4, '0'),\n );\n}\n\n// thanks to DRAX at https://stackoverflow.com/a/9436948\n/**\n * Determine whether the object is a string\n *\n * @param o Object to determine if it is a string\n * @returns True if the object is a string; false otherwise\n */\nexport function isString(o: unknown): o is string {\n return typeof o === 'string' || o instanceof String;\n}\n\n/**\n * If deepClone isn't used when copying properties between objects, you may be left with dangling\n * references between the source and target of property copying operations.\n *\n * @param obj Object to clone\n * @returns Duplicate copy of `obj` without any references back to the original one\n */\nexport function deepClone(obj: T): T {\n // Assert the return type matches what is expected\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return JSON.parse(JSON.stringify(obj)) as T;\n}\n\n/**\n * Get a function that reduces calls to the function passed in\n *\n * @param fn The function to debounce\n * @param delay How much delay in milliseconds after the most recent call to the debounced function\n * to call the function\n * @returns Function that, when called, only calls the function passed in at maximum every delay ms\n */\n// We don't know the parameter types since this function can be anything\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce void>(fn: T, delay = 300): T {\n if (isString(fn)) throw new Error('Tried to debounce a string! Could be XSS');\n let timeout: ReturnType;\n // Ensure the right return type.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return ((...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n }) as T;\n}\n\n/**\n * Groups each item in the array of items into a map according to the keySelector\n *\n * @param items Array of items to group by\n * @param keySelector Function to run on each item to get the key for the group to which it belongs\n * @param valueSelector Function to run on each item to get the value it should have in the group\n * (like map function). If not provided, uses the item itself\n * @returns Map of keys to groups of values corresponding to each item\n */\nexport function groupBy(items: T[], keySelector: (item: T) => K): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector: (item: T, key: K) => V,\n): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector?: (item: T, key: K) => V,\n): Map> {\n const map = new Map>();\n items.forEach((item) => {\n const key = keySelector(item);\n const group = map.get(key);\n const value = valueSelector ? valueSelector(item, key) : item;\n if (group) group.push(value);\n else map.set(key, [value]);\n });\n return map;\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\ntype ErrorWithMessage = {\n message: string;\n};\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return (\n typeof error === 'object' &&\n // We're potentially dealing with objects we didn't create, so they might contain `null`\n // eslint-disable-next-line no-null/no-null\n error !== null &&\n 'message' in error &&\n // Type assert `error` to check it's `message`.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n typeof (error as Record).message === 'string'\n );\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error from the object (useful for getting an error in a catch block)\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error message from the object (useful for getting error message in a catch\n * block)\n *\n * @example `try {...} catch (e) { logger.info(getErrorMessage(e)) }`\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\n/** Asynchronously waits for the specified number of milliseconds. (wraps setTimeout in a promise) */\nexport function wait(ms: number) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Runs the specified function and will timeout if it takes longer than the specified wait time\n *\n * @param fn The function to run\n * @param maxWaitTimeInMS The maximum amount of time to wait for the function to resolve\n * @returns Promise that resolves to the resolved value of the function or undefined if it ran\n * longer than the specified wait time\n */\nexport function waitForDuration(fn: () => Promise, maxWaitTimeInMS: number) {\n const timeout = wait(maxWaitTimeInMS).then(() => undefined);\n return Promise.any([timeout, fn()]);\n}\n\n/**\n * Get all functions on an object and its prototype chain (so we don't miss any class methods or any\n * object methods). Note that the functions on the final item in the prototype chain (i.e., Object)\n * are skipped to avoid including functions like `__defineGetter__`, `__defineSetter__`, `toString`,\n * etc.\n *\n * @param obj Object whose functions to get\n * @param objId Optional ID of the object to use for debug logging\n * @returns Array of all function names on an object\n */\n// Note: lodash has something that MIGHT do the same thing as this. Investigate for https://github.com/paranext/paranext-core/issues/134\nexport function getAllObjectFunctionNames(\n obj: { [property: string]: unknown },\n objId: string = 'obj',\n): Set {\n const objectFunctionNames = new Set();\n\n // Get all function properties directly defined on the object\n Object.getOwnPropertyNames(obj).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n console.debug(`Skipping ${property} on ${objId} due to error: ${error}`);\n }\n });\n\n // Walk up the prototype chain and get additional function properties, skipping the functions\n // provided by the final (Object) prototype\n let objectPrototype = Object.getPrototypeOf(obj);\n while (objectPrototype && Object.getPrototypeOf(objectPrototype)) {\n Object.getOwnPropertyNames(objectPrototype).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n console.debug(`Skipping ${property} on ${objId}'s prototype due to error: ${error}`);\n }\n });\n objectPrototype = Object.getPrototypeOf(objectPrototype);\n }\n\n return objectFunctionNames;\n}\n\n/**\n * Creates a synchronous proxy for an asynchronous object. The proxy allows calling methods on an\n * object that is asynchronously fetched using a provided asynchronous function.\n *\n * @param getObject - A function that returns a promise resolving to the object whose asynchronous\n * methods to call.\n * @param objectToProxy - An optional object that is the object that is proxied. If a property is\n * accessed that does exist on this object, it will be returned. If a property is accessed that\n * does not exist on this object, it will be considered to be an asynchronous method called on the\n * object returned from getObject.\n * @returns A synchronous proxy for the asynchronous object.\n */\nexport function createSyncProxyForAsyncObject(\n getObject: (args?: unknown[]) => Promise,\n objectToProxy: Partial = {},\n): T {\n // objectToProxy will have only the synchronously accessed properties of T on it, and this proxy\n // makes the async methods that do not exist yet available synchronously so we have all of T\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return new Proxy(objectToProxy as T, {\n get(target, prop) {\n // We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // @ts-expect-error 7053\n if (prop in target) return target[prop];\n return async (...args: unknown[]) => {\n // 7053: We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // 2556: The args here are the parameters for the method specified\n // @ts-expect-error 7053 2556\n return (await getObject())[prop](...args);\n };\n },\n });\n}\n","import { deepClone } from './util';\n\nexport type JsonDocumentLike = { [key: string]: unknown };\n\n/**\n * Options for DocumentCombinerEngine objects\n *\n * - `copyDocuments`: If true, this instance will perform a deep copy of all provided documents before\n * composing the output. If false, then changes made to provided documents after they are\n * contributed will be reflected in the next time output is composed.\n * - `ignoreDuplicateProperties`: If true, then duplicate properties are skipped if they are seen in\n * contributed documents. If false, then throw when duplicate properties are seen in contributed\n * documents.\n */\nexport type DocumentCombinerOptions = {\n copyDocuments: boolean;\n ignoreDuplicateProperties: boolean;\n};\n\n/**\n * Base class for any code that wants to compose JSON documents (in the form of JS objects) together\n * into a single output document.\n */\nexport default abstract class DocumentCombinerEngine {\n protected baseDocument: JsonDocumentLike;\n protected readonly contributions = new Map();\n protected latestOutput: JsonDocumentLike | undefined;\n protected readonly options: DocumentCombinerOptions;\n\n /**\n * Create a DocumentCombinerEngine instance\n *\n * @param baseDocument This is the first document that will be used when composing the output\n * @param options Options used by this object when combining documents\n */\n protected constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) {\n // Setting baseDocument redundantly because TS doesn't understand that updateBaseDocument does it\n this.baseDocument = baseDocument;\n this.options = options;\n this.updateBaseDocument(baseDocument);\n }\n\n /**\n * Update the starting document for composition process\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n * @returns Recalculated output document given the new starting state and existing other documents\n */\n updateBaseDocument(baseDocument: JsonDocumentLike): JsonDocumentLike | undefined {\n this.validateStartingDocument(baseDocument);\n this.baseDocument = this.options.copyDocuments ? deepClone(baseDocument) : baseDocument;\n return this.rebuild();\n }\n\n /**\n * Add or update one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n * @returns Recalculated output document given the new or updated contribution and existing other\n * documents\n */\n addOrUpdateContribution(\n documentName: string,\n document: JsonDocumentLike,\n ): JsonDocumentLike | undefined {\n this.validateContribution(documentName, document);\n const previousDocumentVersion = this.contributions.get(documentName);\n const documentToSet = this.options.copyDocuments && !!document ? deepClone(document) : document;\n this.contributions.set(documentName, documentToSet);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after adding/updating the contribution, put it back how it was\n if (previousDocumentVersion) this.contributions.set(documentName, previousDocumentVersion);\n else this.contributions.delete(documentName);\n throw new Error(`Error when setting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Delete one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to delete\n * @returns Recalculated output document given the remaining other documents\n */\n deleteContribution(documentName: string): object | undefined {\n const document = this.contributions.get(documentName);\n if (!document) throw new Error(`{documentKey} does not exist`);\n this.contributions.delete(documentName);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after deleting the contribution, put it back and rethrow\n this.contributions.set(documentName, document);\n throw new Error(`Error when deleting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Run the document composition process given the starting document and all contributions. Throws\n * if the output document fails to validate properly.\n *\n * @returns Recalculated output document given the starting and contributed documents\n */\n rebuild(): JsonDocumentLike | undefined {\n // The starting document is the output if there are no other contributions\n if (this.contributions.size === 0) {\n let potentialOutput = deepClone(this.baseDocument);\n potentialOutput = this.transformFinalOutput(potentialOutput);\n this.validateOutput(potentialOutput);\n this.latestOutput = potentialOutput;\n return this.latestOutput;\n }\n\n // Compose the output by validating each document one at a time to pinpoint errors better\n let outputIteration = this.baseDocument;\n this.contributions.forEach((contribution: JsonDocumentLike) => {\n outputIteration = mergeObjects(\n outputIteration,\n contribution,\n this.options.ignoreDuplicateProperties,\n );\n this.validateOutput(outputIteration);\n });\n outputIteration = this.transformFinalOutput(outputIteration);\n this.validateOutput(outputIteration);\n this.latestOutput = outputIteration;\n return this.latestOutput;\n }\n\n /**\n * Throw an error if the provided document is not a valid starting document.\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n */\n protected abstract validateStartingDocument(baseDocument: JsonDocumentLike): void;\n\n /**\n * Throw an error if the provided document is not a valid contribution document.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n */\n protected abstract validateContribution(documentName: string, document: JsonDocumentLike): void;\n\n /**\n * Throw an error if the provided output is not valid.\n *\n * @param output Output document that could potentially be returned to callers\n */\n protected abstract validateOutput(output: JsonDocumentLike): void;\n\n /**\n * Transform the document that is the composition of the base document and all contribution\n * documents. This is the last step that will be run prior to validation before\n * `this.latestOutput` is updated to the new output.\n *\n * @param finalOutput Final output document that could potentially be returned to callers. \"Final\"\n * means no further contribution documents will be merged.\n */\n protected abstract transformFinalOutput(finalOutput: JsonDocumentLike): JsonDocumentLike;\n}\n\n// #region Helper functions\n\n/**\n * Determines if the input values are objects but not arrays\n *\n * @param values Objects to check\n * @returns True if all the values are objects but not arrays\n */\nfunction areNonArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Determines if the input values are arrays\n *\n * @param value Objects to check\n * @returns True if the values are arrays\n */\nfunction areArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || !Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Recursively merge the properties of one object (copyFrom) into another (startingPoint). Throws if\n * copyFrom would overwrite values already existing in startingPoint.\n *\n * @param startingPoint Object that is the starting point for the return value\n * @param copyFrom Object whose values are copied into the return value\n * @returns Object that is the combination of the two documents\n */\nfunction mergeObjects(\n startingPoint: JsonDocumentLike,\n copyFrom: JsonDocumentLike,\n ignoreDuplicateProperties: boolean,\n): JsonDocumentLike {\n const retVal = deepClone(startingPoint);\n if (!copyFrom) return retVal;\n\n Object.keys(copyFrom).forEach((key: string | number) => {\n if (Object.hasOwn(startingPoint, key)) {\n if (areNonArrayObjects(startingPoint[key], copyFrom[key])) {\n retVal[key] = mergeObjects(\n // We know these are objects from the `if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n startingPoint[key] as JsonDocumentLike,\n copyFrom[key] as JsonDocumentLike,\n ignoreDuplicateProperties,\n /* eslint-enable no-type-assertion/no-type-assertion */\n );\n } else if (areArrayObjects(startingPoint[key], copyFrom[key])) {\n // We know these are arrays because of the `else if` check\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n retVal[key] = (retVal[key] as Array).concat(copyFrom[key] as Array);\n } else if (!ignoreDuplicateProperties)\n throw new Error(`Cannot merge objects: key \"${key}\" already exists in the target object`);\n } else {\n retVal[key] = copyFrom[key];\n }\n });\n\n return retVal;\n}\n\n// #endregion\n","import { Dispose } from './disposal.model';\nimport { Unsubscriber, UnsubscriberAsync } from './unsubscriber';\n\n/** Simple collection for UnsubscriberAsync objects that also provides an easy way to run them. */\nexport default class UnsubscriberAsyncList {\n readonly unsubscribers = new Set();\n\n constructor(private name = 'Anonymous') {}\n\n /**\n * Add unsubscribers to the list. Note that duplicates are not added twice.\n *\n * @param unsubscribers - Objects that were returned from a registration process.\n */\n add(...unsubscribers: (UnsubscriberAsync | Unsubscriber | Dispose)[]) {\n unsubscribers.forEach((unsubscriber) => {\n if ('dispose' in unsubscriber) this.unsubscribers.add(unsubscriber.dispose);\n else this.unsubscribers.add(unsubscriber);\n });\n }\n\n /**\n * Run all unsubscribers added to this list and then clear the list.\n *\n * @returns `true` if all unsubscribers succeeded, `false` otherwise.\n */\n async runAllUnsubscribers(): Promise {\n const unsubs = [...this.unsubscribers].map((unsubscriber) => unsubscriber());\n const results = await Promise.all(unsubs);\n this.unsubscribers.clear();\n return results.every((unsubscriberSucceeded, index) => {\n if (!unsubscriberSucceeded)\n console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${index} failed!`);\n\n return unsubscriberSucceeded;\n });\n }\n}\n","/** Interfaces, classes, and functions related to events and event emitters */\n\nimport { Dispose } from './disposal.model';\nimport { PlatformEvent, PlatformEventHandler } from './platform-event';\n\n/**\n * Event manager - accepts subscriptions to an event and runs the subscription callbacks when the\n * event is emitted Use eventEmitter.event(callback) to subscribe to the event. Use\n * eventEmitter.emit(event) to run the subscriptions. Generally, this EventEmitter should be\n * private, and its event should be public. That way, the emitter is not publicized, but anyone can\n * subscribe to the event.\n */\nexport default class PlatformEventEmitter implements Dispose {\n /**\n * Subscribes a function to run when this event is emitted.\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n * @alias event\n */\n subscribe = this.event;\n\n /** All callback functions that will run when this event is emitted. Lazy loaded */\n private subscriptions?: PlatformEventHandler[];\n /** Event for listeners to subscribe to. Lazy loaded */\n private lazyEvent?: PlatformEvent;\n /** Whether this emitter has been disposed */\n private isDisposed = false;\n\n /**\n * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted.\n * Use like `const unsubscriber = event(callback)`\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n */\n get event(): PlatformEvent {\n this.assertNotDisposed();\n\n if (!this.lazyEvent) {\n this.lazyEvent = (callback) => {\n if (!callback || typeof callback !== 'function')\n throw new Error(`Event handler callback must be a function!`);\n\n // Initialize this.subscriptions if it does not exist\n if (!this.subscriptions) this.subscriptions = [];\n\n this.subscriptions.push(callback);\n\n return () => {\n if (!this.subscriptions) return false; // Did not find any subscribed callbacks\n\n const callbackIndex = this.subscriptions.indexOf(callback);\n\n if (callbackIndex < 0) return false; // Did not find this callback in the subscriptions\n\n // Remove the callback\n this.subscriptions.splice(callbackIndex, 1);\n\n return true;\n };\n };\n }\n return this.lazyEvent;\n }\n\n /** Disposes of this event, preparing it to release from memory */\n dispose = () => {\n return this.disposeFn();\n };\n\n /**\n * Runs the subscriptions for the event\n *\n * @param event Event data to provide to subscribed callbacks\n */\n emit = (event: T) => {\n // Do not do anything other than emitFn here. This emit is just binding `this` to emitFn\n this.emitFn(event);\n };\n\n /**\n * Function that runs the subscriptions for the event. Added here so children can override emit\n * and still call the base functionality. See NetworkEventEmitter.emit for example\n */\n protected emitFn(event: T) {\n this.assertNotDisposed();\n\n this.subscriptions?.forEach((callback) => callback(event));\n }\n\n /** Check to make sure this emitter is not disposed. Throw if it is */\n protected assertNotDisposed() {\n if (this.isDisposed) throw new Error('Emitter is disposed');\n }\n\n /**\n * Disposes of this event, preparing it to release from memory. Added here so children can\n * override emit and still call the base functionality.\n */\n protected disposeFn() {\n this.assertNotDisposed();\n\n this.isDisposed = true;\n this.subscriptions = undefined;\n this.lazyEvent = undefined;\n return Promise.resolve(true);\n }\n}\n","import { Mutex as AsyncMutex } from 'async-mutex';\n\n// Extending Mutex from async-mutex so we can add JSDoc\n\n/**\n * Class that allows calling asynchronous functions multiple times at once while only running one at\n * a time.\n *\n * @example\n *\n * ```typescript\n * const mutex = new Mutex();\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n * ```\n *\n * See [`async-mutex`](https://www.npmjs.com/package/async-mutex) for more information.\n */\nclass Mutex extends AsyncMutex {}\n\nexport default Mutex;\n","import Mutex from './mutex';\n\n/** Map of {@link Mutex}es that automatically (lazily) generates a new {@link Mutex} for any new key */\nclass MutexMap {\n private mutexesByID = new Map();\n\n get(mutexID: string): Mutex {\n let retVal = this.mutexesByID.get(mutexID);\n if (retVal) return retVal;\n\n retVal = new Mutex();\n this.mutexesByID.set(mutexID, retVal);\n return retVal;\n }\n}\n\nexport default MutexMap;\n","import { BookInfo, ScriptureReference } from './scripture.model';\n\nconst scrBookData: BookInfo[] = [\n { shortName: 'ERR', fullNames: ['ERROR'], chapters: -1 },\n { shortName: 'GEN', fullNames: ['Genesis'], chapters: 50 },\n { shortName: 'EXO', fullNames: ['Exodus'], chapters: 40 },\n { shortName: 'LEV', fullNames: ['Leviticus'], chapters: 27 },\n { shortName: 'NUM', fullNames: ['Numbers'], chapters: 36 },\n { shortName: 'DEU', fullNames: ['Deuteronomy'], chapters: 34 },\n { shortName: 'JOS', fullNames: ['Joshua'], chapters: 24 },\n { shortName: 'JDG', fullNames: ['Judges'], chapters: 21 },\n { shortName: 'RUT', fullNames: ['Ruth'], chapters: 4 },\n { shortName: '1SA', fullNames: ['1 Samuel'], chapters: 31 },\n { shortName: '2SA', fullNames: ['2 Samuel'], chapters: 24 },\n { shortName: '1KI', fullNames: ['1 Kings'], chapters: 22 },\n { shortName: '2KI', fullNames: ['2 Kings'], chapters: 25 },\n { shortName: '1CH', fullNames: ['1 Chronicles'], chapters: 29 },\n { shortName: '2CH', fullNames: ['2 Chronicles'], chapters: 36 },\n { shortName: 'EZR', fullNames: ['Ezra'], chapters: 10 },\n { shortName: 'NEH', fullNames: ['Nehemiah'], chapters: 13 },\n { shortName: 'EST', fullNames: ['Esther'], chapters: 10 },\n { shortName: 'JOB', fullNames: ['Job'], chapters: 42 },\n { shortName: 'PSA', fullNames: ['Psalm', 'Psalms'], chapters: 150 },\n { shortName: 'PRO', fullNames: ['Proverbs'], chapters: 31 },\n { shortName: 'ECC', fullNames: ['Ecclesiastes'], chapters: 12 },\n { shortName: 'SNG', fullNames: ['Song of Solomon', 'Song of Songs'], chapters: 8 },\n { shortName: 'ISA', fullNames: ['Isaiah'], chapters: 66 },\n { shortName: 'JER', fullNames: ['Jeremiah'], chapters: 52 },\n { shortName: 'LAM', fullNames: ['Lamentations'], chapters: 5 },\n { shortName: 'EZK', fullNames: ['Ezekiel'], chapters: 48 },\n { shortName: 'DAN', fullNames: ['Daniel'], chapters: 12 },\n { shortName: 'HOS', fullNames: ['Hosea'], chapters: 14 },\n { shortName: 'JOL', fullNames: ['Joel'], chapters: 3 },\n { shortName: 'AMO', fullNames: ['Amos'], chapters: 9 },\n { shortName: 'OBA', fullNames: ['Obadiah'], chapters: 1 },\n { shortName: 'JON', fullNames: ['Jonah'], chapters: 4 },\n { shortName: 'MIC', fullNames: ['Micah'], chapters: 7 },\n { shortName: 'NAM', fullNames: ['Nahum'], chapters: 3 },\n { shortName: 'HAB', fullNames: ['Habakkuk'], chapters: 3 },\n { shortName: 'ZEP', fullNames: ['Zephaniah'], chapters: 3 },\n { shortName: 'HAG', fullNames: ['Haggai'], chapters: 2 },\n { shortName: 'ZEC', fullNames: ['Zechariah'], chapters: 14 },\n { shortName: 'MAL', fullNames: ['Malachi'], chapters: 4 },\n { shortName: 'MAT', fullNames: ['Matthew'], chapters: 28 },\n { shortName: 'MRK', fullNames: ['Mark'], chapters: 16 },\n { shortName: 'LUK', fullNames: ['Luke'], chapters: 24 },\n { shortName: 'JHN', fullNames: ['John'], chapters: 21 },\n { shortName: 'ACT', fullNames: ['Acts'], chapters: 28 },\n { shortName: 'ROM', fullNames: ['Romans'], chapters: 16 },\n { shortName: '1CO', fullNames: ['1 Corinthians'], chapters: 16 },\n { shortName: '2CO', fullNames: ['2 Corinthians'], chapters: 13 },\n { shortName: 'GAL', fullNames: ['Galatians'], chapters: 6 },\n { shortName: 'EPH', fullNames: ['Ephesians'], chapters: 6 },\n { shortName: 'PHP', fullNames: ['Philippians'], chapters: 4 },\n { shortName: 'COL', fullNames: ['Colossians'], chapters: 4 },\n { shortName: '1TH', fullNames: ['1 Thessalonians'], chapters: 5 },\n { shortName: '2TH', fullNames: ['2 Thessalonians'], chapters: 3 },\n { shortName: '1TI', fullNames: ['1 Timothy'], chapters: 6 },\n { shortName: '2TI', fullNames: ['2 Timothy'], chapters: 4 },\n { shortName: 'TIT', fullNames: ['Titus'], chapters: 3 },\n { shortName: 'PHM', fullNames: ['Philemon'], chapters: 1 },\n { shortName: 'HEB', fullNames: ['Hebrews'], chapters: 13 },\n { shortName: 'JAS', fullNames: ['James'], chapters: 5 },\n { shortName: '1PE', fullNames: ['1 Peter'], chapters: 5 },\n { shortName: '2PE', fullNames: ['2 Peter'], chapters: 3 },\n { shortName: '1JN', fullNames: ['1 John'], chapters: 5 },\n { shortName: '2JN', fullNames: ['2 John'], chapters: 1 },\n { shortName: '3JN', fullNames: ['3 John'], chapters: 1 },\n { shortName: 'JUD', fullNames: ['Jude'], chapters: 1 },\n { shortName: 'REV', fullNames: ['Revelation'], chapters: 22 },\n];\n\nexport const FIRST_SCR_BOOK_NUM = 1;\nexport const LAST_SCR_BOOK_NUM = scrBookData.length - 1;\nexport const FIRST_SCR_CHAPTER_NUM = 1;\nexport const FIRST_SCR_VERSE_NUM = 1;\n\nexport const getChaptersForBook = (bookNum: number): number => {\n return scrBookData[bookNum]?.chapters ?? -1;\n};\n\nexport const offsetBook = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n bookNum: Math.max(FIRST_SCR_BOOK_NUM, Math.min(scrRef.bookNum + offset, LAST_SCR_BOOK_NUM)),\n chapterNum: 1,\n verseNum: 1,\n});\n\nexport const offsetChapter = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n chapterNum: Math.min(\n Math.max(FIRST_SCR_CHAPTER_NUM, scrRef.chapterNum + offset),\n getChaptersForBook(scrRef.bookNum),\n ),\n verseNum: 1,\n});\n\nexport const offsetVerse = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n verseNum: Math.max(FIRST_SCR_VERSE_NUM, scrRef.verseNum + offset),\n});\n","/** Function to run to dispose of something. Returns true if successfully unsubscribed */\nexport type Unsubscriber = () => boolean;\n\n/**\n * Returns an Unsubscriber function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers All unsubscribers to aggregate into one unsubscriber\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscribers = (unsubscribers: Unsubscriber[]): Unsubscriber => {\n return (...args) => {\n // Run the unsubscriber for each handler\n const unsubs = unsubscribers.map((unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return unsubs.every((success) => success);\n };\n};\n\n/**\n * Function to run to dispose of something that runs asynchronously. The promise resolves to true if\n * successfully unsubscribed\n */\nexport type UnsubscriberAsync = () => Promise;\n\n/**\n * Returns an UnsubscriberAsync function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers - All unsubscribers to aggregate into one unsubscriber.\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscriberAsyncs = (\n unsubscribers: (UnsubscriberAsync | Unsubscriber)[],\n): UnsubscriberAsync => {\n return async (...args) => {\n // Run the unsubscriber for each handler\n const unsubPromises = unsubscribers.map(async (unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return (await Promise.all(unsubPromises)).every((success) => success);\n };\n};\n","\"use strict\"\r\n\r\n// Based on: https://github.com/lodash/lodash/blob/6018350ac10d5ce6a5b7db625140b82aeab804df/.internal/unicodeSize.js\r\n\r\nmodule.exports = () => {\r\n\t// Used to compose unicode character classes.\r\n\tconst astralRange = \"\\\\ud800-\\\\udfff\"\r\n\tconst comboMarksRange = \"\\\\u0300-\\\\u036f\"\r\n\tconst comboHalfMarksRange = \"\\\\ufe20-\\\\ufe2f\"\r\n\tconst comboSymbolsRange = \"\\\\u20d0-\\\\u20ff\"\r\n\tconst comboMarksExtendedRange = \"\\\\u1ab0-\\\\u1aff\"\r\n\tconst comboMarksSupplementRange = \"\\\\u1dc0-\\\\u1dff\"\r\n\tconst comboRange = comboMarksRange + comboHalfMarksRange + comboSymbolsRange + comboMarksExtendedRange + comboMarksSupplementRange\r\n\tconst varRange = \"\\\\ufe0e\\\\ufe0f\"\r\n\tconst familyRange = \"\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFB\\\\u200D\\\\uD83C\\\\uDF93\"\r\n\r\n\t// Used to compose unicode capture groups.\r\n\tconst astral = `[${astralRange}]`\r\n\tconst combo = `[${comboRange}]`\r\n\tconst fitz = \"\\\\ud83c[\\\\udffb-\\\\udfff]\"\r\n\tconst modifier = `(?:${combo}|${fitz})`\r\n\tconst nonAstral = `[^${astralRange}]`\r\n\tconst regional = \"(?:\\\\uD83C[\\\\uDDE6-\\\\uDDFF]){2}\"\r\n\tconst surrogatePair = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\"\r\n\tconst zwj = \"\\\\u200d\"\r\n\tconst blackFlag = \"(?:\\\\ud83c\\\\udff4\\\\udb40\\\\udc67\\\\udb40\\\\udc62\\\\udb40(?:\\\\udc65|\\\\udc73|\\\\udc77)\\\\udb40(?:\\\\udc6e|\\\\udc63|\\\\udc6c)\\\\udb40(?:\\\\udc67|\\\\udc74|\\\\udc73)\\\\udb40\\\\udc7f)\"\r\n\tconst family = `[${familyRange}]`\r\n\r\n\t// Used to compose unicode regexes.\r\n\tconst optModifier = `${modifier}?`\r\n\tconst optVar = `[${varRange}]?`\r\n\tconst optJoin = `(?:${zwj}(?:${[nonAstral, regional, surrogatePair].join(\"|\")})${optVar + optModifier})*`\r\n\tconst seq = optVar + optModifier + optJoin\r\n\tconst nonAstralCombo = `${nonAstral}${combo}?`\r\n\tconst symbol = `(?:${[nonAstralCombo, combo, regional, surrogatePair, astral, family].join(\"|\")})`\r\n\r\n\t// Used to match [String symbols](https://mathiasbynens.be/notes/javascript-unicode).\r\n\treturn new RegExp(`${blackFlag}|${fitz}(?=${fitz})|${symbol + seq}`, \"g\")\r\n}\r\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar char_regex_1 = __importDefault(require(\"char-regex\"));\n/**\n * Converts a string to an array of string chars\n * @param {string} str The string to turn into array\n * @returns {string[]}\n */\nfunction toArray(str) {\n if (typeof str !== 'string') {\n throw new Error('A string is expected as input');\n }\n return str.match(char_regex_1.default()) || [];\n}\nexports.toArray = toArray;\n/**\n * Returns the length of a string\n *\n * @export\n * @param {string} str\n * @returns {number}\n */\nfunction length(str) {\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var match = str.match(char_regex_1.default());\n return match === null ? 0 : match.length;\n}\nexports.length = length;\n/**\n * Returns a substring by providing start and end position\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} end End position\n * @returns {string}\n */\nfunction substring(str, begin, end) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n // Even though negative numbers work here, theyre not in the spec\n if (typeof begin !== 'number' || begin < 0) {\n begin = 0;\n }\n if (typeof end === 'number' && end < 0) {\n end = 0;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substring = substring;\n/**\n * Returns a substring by providing start position and length\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} len Desired length\n * @returns {string}\n */\nfunction substr(str, begin, len) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var strLength = length(str);\n // Fix type\n if (typeof begin !== 'number') {\n begin = parseInt(begin, 10);\n }\n // Return zero-length string if got oversize number.\n if (begin >= strLength) {\n return '';\n }\n // Calculating postive version of negative value.\n if (begin < 0) {\n begin += strLength;\n }\n var end;\n if (typeof len === 'undefined') {\n end = strLength;\n }\n else {\n // Fix type\n if (typeof len !== 'number') {\n len = parseInt(len, 10);\n }\n end = len >= 0 ? len + begin : begin;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substr = substr;\n/**\n * Enforces a string to be a certain length by\n * adding or removing characters\n *\n * @export\n * @param {string} str\n * @param {number} [limit=16] Limit\n * @param {string} [padString='#'] The Pad String\n * @param {string} [padPosition='right'] The Pad Position\n * @returns {string}\n */\nfunction limit(str, limit, padString, padPosition) {\n if (limit === void 0) { limit = 16; }\n if (padString === void 0) { padString = '#'; }\n if (padPosition === void 0) { padPosition = 'right'; }\n // Input should be a string, limit should be a number\n if (typeof str !== 'string' || typeof limit !== 'number') {\n throw new Error('Invalid arguments specified');\n }\n // Pad position should be either left or right\n if (['left', 'right'].indexOf(padPosition) === -1) {\n throw new Error('Pad position should be either left or right');\n }\n // Pad string can be anything, we convert it to string\n if (typeof padString !== 'string') {\n padString = String(padString);\n }\n // Calculate string length considering astral code points\n var strLength = length(str);\n if (strLength > limit) {\n return substring(str, 0, limit);\n }\n else if (strLength < limit) {\n var padRepeats = padString.repeat(limit - strLength);\n return padPosition === 'left' ? padRepeats + str : str + padRepeats;\n }\n return str;\n}\nexports.limit = limit;\n/**\n * Returns the index of the first occurrence of a given string\n *\n * @export\n * @param {string} str\n * @param {string} [searchStr] the string to search\n * @param {number} [pos] starting position\n * @returns {number}\n */\nfunction indexOf(str, searchStr, pos) {\n if (pos === void 0) { pos = 0; }\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n if (str === '') {\n if (searchStr === '') {\n return 0;\n }\n return -1;\n }\n // fix type\n pos = Number(pos);\n pos = isNaN(pos) ? 0 : pos;\n searchStr = String(searchStr);\n var strArr = toArray(str);\n if (pos >= strArr.length) {\n if (searchStr === '') {\n return strArr.length;\n }\n return -1;\n }\n if (searchStr === '') {\n return pos;\n }\n var searchArr = toArray(searchStr);\n var finded = false;\n var index;\n for (index = pos; index < strArr.length; index += 1) {\n var searchIndex = 0;\n while (searchIndex < searchArr.length &&\n searchArr[searchIndex] === strArr[index + searchIndex]) {\n searchIndex += 1;\n }\n if (searchIndex === searchArr.length &&\n searchArr[searchIndex - 1] === strArr[index + searchIndex - 1]) {\n finded = true;\n break;\n }\n }\n return finded ? index : -1;\n}\nexports.indexOf = indexOf;\n","import {\n indexOf as stringzIndexOf,\n substring as stringzSubstring,\n length as stringzLength,\n toArray as stringzToArray,\n limit as stringzLimit,\n substr as stringzSubstr,\n} from 'stringz';\n\n/**\n * This function mirrors the `at` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Finds the Unicode code point at the given index.\n *\n * @param string String to index\n * @param index Position of the character to be returned in range of -length(string) to\n * length(string)\n * @returns New string consisting of the Unicode code point located at the specified offset,\n * undefined if index is out of bounds\n */\nexport function at(string: string, index: number): string | undefined {\n if (index > stringLength(string) || index < -stringLength(string)) return undefined;\n return substr(string, index, 1);\n}\n\n/**\n * This function mirrors the `charAt` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a new string consisting of the single unicode code point at the given index.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns New string consisting of the Unicode code point located at the specified offset, empty\n * string if index is out of bounds\n */\nexport function charAt(string: string, index: number): string {\n if (index < 0 || index > stringLength(string) - 1) return '';\n return substr(string, index, 1);\n}\n\n/**\n * This function mirrors the `codePointAt` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a non-negative integer that is the Unicode code point value of the character starting at\n * the given index.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns Non-negative integer representing the code point value of the character at the given\n * index, or undefined if there is no element at that position\n */\nexport function codePointAt(string: string, index: number): number | undefined {\n if (index < 0 || index > stringLength(string) - 1) return undefined;\n return substr(string, index, 1).codePointAt(0);\n}\n\n/**\n * This function mirrors the `endsWith` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Determines whether a string ends with the characters of this string.\n *\n * @param string String to search through\n * @param searchString Characters to search for at the end of the string\n * @param endPosition End position where searchString is expected to be found. Default is\n * `length(string)`\n * @returns True if it ends with searchString, false if it does not\n */\nexport function endsWith(\n string: string,\n searchString: string,\n endPosition: number = stringLength(string),\n): boolean {\n const lastIndexOfSearchString = lastIndexOf(string, searchString);\n if (lastIndexOfSearchString === -1) return false;\n if (lastIndexOfSearchString + stringLength(searchString) !== endPosition) return false;\n return true;\n}\n\n/**\n * This function mirrors the `includes` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Performs a case-sensitive search to determine if searchString is found in string.\n *\n * @param string String to search through\n * @param searchString String to search for\n * @param position Position within the string to start searching for searchString. Default is `0`\n * @returns True if search string is found, false if it is not\n */\nexport function includes(string: string, searchString: string, position: number = 0): boolean {\n const partialString = substring(string, position);\n const indexOfSearchString = indexOf(partialString, searchString);\n if (indexOfSearchString === -1) return false;\n return true;\n}\n\n/**\n * This function mirrors the `indexOf` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the index of the first occurrence of a given string.\n *\n * @param string String to search through\n * @param searchString The string to search for\n * @param position Start of searching. Default is `0`\n * @returns Index of the first occurrence of a given string\n */\nexport function indexOf(\n string: string,\n searchString: string,\n position: number | undefined = 0,\n): number {\n return stringzIndexOf(string, searchString, position);\n}\n\n/**\n * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Searches this string and returns the index of the last occurrence of the specified substring.\n *\n * @param string String to search through\n * @param searchString Substring to search for\n * @param position The index at which to begin searching. If omitted, the search begins at the end\n * of the string. Default is `undefined`\n * @returns Index of the last occurrence of searchString found, or -1 if not found.\n */\nexport function lastIndexOf(string: string, searchString: string, position?: number): number {\n let validatedPosition = position === undefined ? stringLength(string) : position;\n\n if (validatedPosition < 0) {\n validatedPosition = 0;\n } else if (validatedPosition >= stringLength(string)) {\n validatedPosition = stringLength(string) - 1;\n }\n\n for (let index = validatedPosition; index >= 0; index--) {\n if (substr(string, index, stringLength(searchString)) === searchString) {\n return index;\n }\n }\n\n return -1;\n}\n\n/**\n * This function mirrors the `length` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the length of a string.\n *\n * @param string String to return the length for\n * @returns Number that is length of the starting string\n */\nexport function stringLength(string: string): number {\n return stringzLength(string);\n}\n\n/**\n * This function mirrors the `normalize` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the Unicode Normalization Form of this string.\n *\n * @param string The starting string\n * @param form Form specifying the Unicode Normalization Form. Default is `'NFC'`\n * @returns A string containing the Unicode Normalization Form of the given string.\n */\nexport function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' | 'none'): string {\n const upperCaseForm = form.toUpperCase();\n if (upperCaseForm === 'NONE') {\n return string;\n }\n return string.normalize(upperCaseForm);\n}\n\n/**\n * This function mirrors the `padEnd` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the end of this string.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been padded.\n * If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too long to stay\n * within targetLength, it will be truncated. Default is `\" \"`\n * @returns String with appropriate padding at the end\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padEnd(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= stringLength(string)) return string;\n return stringzLimit(string, targetLength, padString, 'right');\n}\n\n/**\n * This function mirrors the `padStart` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the start of this string.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been padded.\n * If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too long to stay\n * within the targetLength, it will be truncated from the end. Default is `\" \"`\n * @returns String with of specified targetLength with padString applied from the start\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padStart(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= stringLength(string)) return string;\n return stringzLimit(string, targetLength, padString, 'left');\n}\n\n// This is a helper function that performs a correction on the slice index to make sure it\n// cannot go out of bounds\nfunction correctSliceIndex(length: number, index: number) {\n if (index > length) return length;\n if (index < -length) return 0;\n if (index < 0) return index + length;\n return index;\n}\n\n/**\n * This function mirrors the `slice` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Extracts a section of this string and returns it as a new string, without modifying the original\n * string.\n *\n * @param string The starting string\n * @param indexStart The index of the first character to include in the returned substring.\n * @param indexEnd The index of the first character to exclude from the returned substring.\n * @returns A new string containing the extracted section of the string.\n */\nexport function slice(string: string, indexStart: number, indexEnd?: number): string {\n const length: number = stringLength(string);\n if (\n indexStart > length ||\n (indexEnd &&\n ((indexStart > indexEnd &&\n !(indexStart > 0 && indexStart < length && indexEnd < 0 && indexEnd > -length)) ||\n indexEnd < -length ||\n (indexStart < 0 && indexStart > -length && indexEnd > 0)))\n )\n return '';\n\n const newStart = correctSliceIndex(length, indexStart);\n const newEnd = indexEnd ? correctSliceIndex(length, indexEnd) : undefined;\n\n return substring(string, newStart, newEnd);\n}\n\n/**\n * This function mirrors the `split` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Takes a pattern and divides the string into an ordered list of substrings by searching for the\n * pattern, puts these substrings into an array, and returns the array.\n *\n * @param string The string to split\n * @param separator The pattern describing where each split should occur\n * @param splitLimit Limit on the number of substrings to be included in the array. Splits the\n * string at each occurrence of specified separator, but stops when limit entries have been placed\n * in the array.\n * @returns An array of strings, split at each point where separator occurs in the starting string.\n * Returns undefined if separator is not found in string.\n */\nexport function split(string: string, separator: string | RegExp, splitLimit?: number): string[] {\n const result: string[] = [];\n\n if (splitLimit !== undefined && splitLimit <= 0) {\n return [string];\n }\n\n if (separator === '') return toArray(string).slice(0, splitLimit);\n\n let regexSeparator = separator;\n if (\n typeof separator === 'string' ||\n (separator instanceof RegExp && !includes(separator.flags, 'g'))\n ) {\n regexSeparator = new RegExp(separator, 'g');\n }\n\n const matches: RegExpMatchArray | null = string.match(regexSeparator);\n\n let currentIndex = 0;\n\n if (!matches) return [string];\n\n for (let index = 0; index < (splitLimit ? splitLimit - 1 : matches.length); index++) {\n const matchIndex = indexOf(string, matches[index], currentIndex);\n const matchLength = stringLength(matches[index]);\n\n result.push(substring(string, currentIndex, matchIndex));\n currentIndex = matchIndex + matchLength;\n\n if (splitLimit !== undefined && result.length === splitLimit) {\n break;\n }\n }\n\n result.push(substring(string, currentIndex));\n\n return result;\n}\n\n/**\n * This function mirrors the `startsWith` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Determines whether the string begins with the characters of a specified string, returning true or\n * false as appropriate.\n *\n * @param string String to search through\n * @param searchString The characters to be searched for at the start of this string.\n * @param position The start position at which searchString is expected to be found (the index of\n * searchString's first character). Default is `0`\n * @returns True if the given characters are found at the beginning of the string, including when\n * searchString is an empty string; otherwise, false.\n */\nexport function startsWith(string: string, searchString: string, position: number = 0): boolean {\n const indexOfSearchString = indexOf(string, searchString, position);\n if (indexOfSearchString !== position) return false;\n return true;\n}\n\n/**\n * This function mirrors the `substr` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a substring by providing start and length. This function is not exported because it is\n * considered deprecated, however it is still useful as a local helper function.\n *\n * @param string String to be divided\n * @param begin Start position. Default is `Start of string`\n * @param len Length of result. Default is `String length minus start parameter`. Default is `String\n * length minus start parameter`\n * @returns Substring from starting string\n */\nfunction substr(\n string: string,\n begin: number = 0,\n len: number = stringLength(string) - begin,\n): string {\n return stringzSubstr(string, begin, len);\n}\n\n/**\n * This function mirrors the `substring` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a substring by providing start and end position.\n *\n * @param string String to be divided\n * @param begin Start position\n * @param end End position. Default is `End of string`\n * @returns Substring from starting string\n */\nexport function substring(\n string: string,\n begin: number,\n end: number = stringLength(string),\n): string {\n return stringzSubstring(string, begin, end);\n}\n\n/**\n * This function mirrors the `toArray` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Converts a string to an array of string characters.\n *\n * @param string String to convert to array\n * @returns An array of characters from the starting string\n */\nexport function toArray(string: string): string[] {\n return stringzToArray(string);\n}\n","var getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Combine two comparators into a single comparators.\n */\nfunction combineComparators(comparatorA, comparatorB) {\n return function isEqual(a, b, state) {\n return comparatorA(a, b, state) && comparatorB(a, b, state);\n };\n}\n/**\n * Wrap the provided `areItemsEqual` method to manage the circular state, allowing\n * for circular references to be safely included in the comparison without creating\n * stack overflows.\n */\nfunction createIsCircular(areItemsEqual) {\n return function isCircular(a, b, state) {\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object') {\n return areItemsEqual(a, b, state);\n }\n var cache = state.cache;\n var cachedA = cache.get(a);\n var cachedB = cache.get(b);\n if (cachedA && cachedB) {\n return cachedA === b && cachedB === a;\n }\n cache.set(a, b);\n cache.set(b, a);\n var result = areItemsEqual(a, b, state);\n cache.delete(a);\n cache.delete(b);\n return result;\n };\n}\n/**\n * Get the properties to strictly examine, which include both own properties that are\n * not enumerable and symbol properties.\n */\nfunction getStrictProperties(object) {\n return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));\n}\n/**\n * Whether the object contains the property passed as an own property.\n */\nvar hasOwn = Object.hasOwn ||\n (function (object, property) {\n return hasOwnProperty.call(object, property);\n });\n/**\n * Whether the values passed are strictly equal or both NaN.\n */\nfunction sameValueZeroEqual(a, b) {\n return a || b ? a === b : a === b || (a !== a && b !== b);\n}\n\nvar OWNER = '_owner';\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, keys = Object.keys;\n/**\n * Whether the arrays are equal in value.\n */\nfunction areArraysEqual(a, b, state) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (!state.equals(a[index], b[index], index, index, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the dates passed are equal in value.\n */\nfunction areDatesEqual(a, b) {\n return sameValueZeroEqual(a.getTime(), b.getTime());\n}\n/**\n * Whether the `Map`s are equal in value.\n */\nfunction areMapsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.entries();\n var index = 0;\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.entries();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n var _a = aResult.value, aKey = _a[0], aValue = _a[1];\n var _b = bResult.value, bKey = _b[0], bValue = _b[1];\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch =\n state.equals(aKey, bKey, index, matchIndex, a, b, state) &&\n state.equals(aValue, bValue, aKey, bKey, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n index++;\n }\n return true;\n}\n/**\n * Whether the objects are equal in value.\n */\nfunction areObjectsEqual(a, b, state) {\n var properties = keys(a);\n var index = properties.length;\n if (keys(b).length !== index) {\n return false;\n }\n var property;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property) ||\n !state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the objects are equal in value with strict property checking.\n */\nfunction areObjectsEqualStrict(a, b, state) {\n var properties = getStrictProperties(a);\n var index = properties.length;\n if (getStrictProperties(b).length !== index) {\n return false;\n }\n var property;\n var descriptorA;\n var descriptorB;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property)) {\n return false;\n }\n if (!state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n descriptorA = getOwnPropertyDescriptor(a, property);\n descriptorB = getOwnPropertyDescriptor(b, property);\n if ((descriptorA || descriptorB) &&\n (!descriptorA ||\n !descriptorB ||\n descriptorA.configurable !== descriptorB.configurable ||\n descriptorA.enumerable !== descriptorB.enumerable ||\n descriptorA.writable !== descriptorB.writable)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the primitive wrappers passed are equal in value.\n */\nfunction arePrimitiveWrappersEqual(a, b) {\n return sameValueZeroEqual(a.valueOf(), b.valueOf());\n}\n/**\n * Whether the regexps passed are equal in value.\n */\nfunction areRegExpsEqual(a, b) {\n return a.source === b.source && a.flags === b.flags;\n}\n/**\n * Whether the `Set`s are equal in value.\n */\nfunction areSetsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.values();\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.values();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch = state.equals(aResult.value, bResult.value, aResult.value, bResult.value, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the TypedArray instances are equal in value.\n */\nfunction areTypedArraysEqual(a, b) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n return true;\n}\n\nvar ARGUMENTS_TAG = '[object Arguments]';\nvar BOOLEAN_TAG = '[object Boolean]';\nvar DATE_TAG = '[object Date]';\nvar MAP_TAG = '[object Map]';\nvar NUMBER_TAG = '[object Number]';\nvar OBJECT_TAG = '[object Object]';\nvar REG_EXP_TAG = '[object RegExp]';\nvar SET_TAG = '[object Set]';\nvar STRING_TAG = '[object String]';\nvar isArray = Array.isArray;\nvar isTypedArray = typeof ArrayBuffer === 'function' && ArrayBuffer.isView\n ? ArrayBuffer.isView\n : null;\nvar assign = Object.assign;\nvar getTag = Object.prototype.toString.call.bind(Object.prototype.toString);\n/**\n * Create a comparator method based on the type-specific equality comparators passed.\n */\nfunction createEqualityComparator(_a) {\n var areArraysEqual = _a.areArraysEqual, areDatesEqual = _a.areDatesEqual, areMapsEqual = _a.areMapsEqual, areObjectsEqual = _a.areObjectsEqual, arePrimitiveWrappersEqual = _a.arePrimitiveWrappersEqual, areRegExpsEqual = _a.areRegExpsEqual, areSetsEqual = _a.areSetsEqual, areTypedArraysEqual = _a.areTypedArraysEqual;\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n */\n return function comparator(a, b, state) {\n // If the items are strictly equal, no need to do a value comparison.\n if (a === b) {\n return true;\n }\n // If the items are not non-nullish objects, then the only possibility\n // of them being equal but not strictly is if they are both `NaN`. Since\n // `NaN` is uniquely not equal to itself, we can use self-comparison of\n // both objects, which is faster than `isNaN()`.\n if (a == null ||\n b == null ||\n typeof a !== 'object' ||\n typeof b !== 'object') {\n return a !== a && b !== b;\n }\n var constructor = a.constructor;\n // Checks are listed in order of commonality of use-case:\n // 1. Common complex object types (plain object, array)\n // 2. Common data values (date, regexp)\n // 3. Less-common complex object types (map, set)\n // 4. Less-common data values (promise, primitive wrappers)\n // Inherently this is both subjective and assumptive, however\n // when reviewing comparable libraries in the wild this order\n // appears to be generally consistent.\n // Constructors should match, otherwise there is potential for false positives\n // between class and subclass or custom object and POJO.\n if (constructor !== b.constructor) {\n return false;\n }\n // `isPlainObject` only checks against the object's own realm. Cross-realm\n // comparisons are rare, and will be handled in the ultimate fallback, so\n // we can avoid capturing the string tag.\n if (constructor === Object) {\n return areObjectsEqual(a, b, state);\n }\n // `isArray()` works on subclasses and is cross-realm, so we can avoid capturing\n // the string tag or doing an `instanceof` check.\n if (isArray(a)) {\n return areArraysEqual(a, b, state);\n }\n // `isTypedArray()` works on all possible TypedArray classes, so we can avoid\n // capturing the string tag or comparing against all possible constructors.\n if (isTypedArray != null && isTypedArray(a)) {\n return areTypedArraysEqual(a, b, state);\n }\n // Try to fast-path equality checks for other complex object types in the\n // same realm to avoid capturing the string tag. Strict equality is used\n // instead of `instanceof` because it is more performant for the common\n // use-case. If someone is subclassing a native class, it will be handled\n // with the string tag comparison.\n if (constructor === Date) {\n return areDatesEqual(a, b, state);\n }\n if (constructor === RegExp) {\n return areRegExpsEqual(a, b, state);\n }\n if (constructor === Map) {\n return areMapsEqual(a, b, state);\n }\n if (constructor === Set) {\n return areSetsEqual(a, b, state);\n }\n // Since this is a custom object, capture the string tag to determing its type.\n // This is reasonably performant in modern environments like v8 and SpiderMonkey.\n var tag = getTag(a);\n if (tag === DATE_TAG) {\n return areDatesEqual(a, b, state);\n }\n if (tag === REG_EXP_TAG) {\n return areRegExpsEqual(a, b, state);\n }\n if (tag === MAP_TAG) {\n return areMapsEqual(a, b, state);\n }\n if (tag === SET_TAG) {\n return areSetsEqual(a, b, state);\n }\n if (tag === OBJECT_TAG) {\n // The exception for value comparison is custom `Promise`-like class instances. These should\n // be treated the same as standard `Promise` objects, which means strict equality, and if\n // it reaches this point then that strict equality comparison has already failed.\n return (typeof a.then !== 'function' &&\n typeof b.then !== 'function' &&\n areObjectsEqual(a, b, state));\n }\n // If an arguments tag, it should be treated as a standard object.\n if (tag === ARGUMENTS_TAG) {\n return areObjectsEqual(a, b, state);\n }\n // As the penultimate fallback, check if the values passed are primitive wrappers. This\n // is very rare in modern JS, which is why it is deprioritized compared to all other object\n // types.\n if (tag === BOOLEAN_TAG || tag === NUMBER_TAG || tag === STRING_TAG) {\n return arePrimitiveWrappersEqual(a, b, state);\n }\n // If not matching any tags that require a specific type of comparison, then we hard-code false because\n // the only thing remaining is strict equality, which has already been compared. This is for a few reasons:\n // - Certain types that cannot be introspected (e.g., `WeakMap`). For these types, this is the only\n // comparison that can be made.\n // - For types that can be introspected, but rarely have requirements to be compared\n // (`ArrayBuffer`, `DataView`, etc.), the cost is avoided to prioritize the common\n // use-cases (may be included in a future release, if requested enough).\n // - For types that can be introspected but do not have an objective definition of what\n // equality is (`Error`, etc.), the subjective decision is to be conservative and strictly compare.\n // In all cases, these decisions should be reevaluated based on changes to the language and\n // common development practices.\n return false;\n };\n}\n/**\n * Create the configuration object used for building comparators.\n */\nfunction createEqualityComparatorConfig(_a) {\n var circular = _a.circular, createCustomConfig = _a.createCustomConfig, strict = _a.strict;\n var config = {\n areArraysEqual: strict\n ? areObjectsEqualStrict\n : areArraysEqual,\n areDatesEqual: areDatesEqual,\n areMapsEqual: strict\n ? combineComparators(areMapsEqual, areObjectsEqualStrict)\n : areMapsEqual,\n areObjectsEqual: strict\n ? areObjectsEqualStrict\n : areObjectsEqual,\n arePrimitiveWrappersEqual: arePrimitiveWrappersEqual,\n areRegExpsEqual: areRegExpsEqual,\n areSetsEqual: strict\n ? combineComparators(areSetsEqual, areObjectsEqualStrict)\n : areSetsEqual,\n areTypedArraysEqual: strict\n ? areObjectsEqualStrict\n : areTypedArraysEqual,\n };\n if (createCustomConfig) {\n config = assign({}, config, createCustomConfig(config));\n }\n if (circular) {\n var areArraysEqual$1 = createIsCircular(config.areArraysEqual);\n var areMapsEqual$1 = createIsCircular(config.areMapsEqual);\n var areObjectsEqual$1 = createIsCircular(config.areObjectsEqual);\n var areSetsEqual$1 = createIsCircular(config.areSetsEqual);\n config = assign({}, config, {\n areArraysEqual: areArraysEqual$1,\n areMapsEqual: areMapsEqual$1,\n areObjectsEqual: areObjectsEqual$1,\n areSetsEqual: areSetsEqual$1,\n });\n }\n return config;\n}\n/**\n * Default equality comparator pass-through, used as the standard `isEqual` creator for\n * use inside the built comparator.\n */\nfunction createInternalEqualityComparator(compare) {\n return function (a, b, _indexOrKeyA, _indexOrKeyB, _parentA, _parentB, state) {\n return compare(a, b, state);\n };\n}\n/**\n * Create the `isEqual` function used by the consuming application.\n */\nfunction createIsEqual(_a) {\n var circular = _a.circular, comparator = _a.comparator, createState = _a.createState, equals = _a.equals, strict = _a.strict;\n if (createState) {\n return function isEqual(a, b) {\n var _a = createState(), _b = _a.cache, cache = _b === void 0 ? circular ? new WeakMap() : undefined : _b, meta = _a.meta;\n return comparator(a, b, {\n cache: cache,\n equals: equals,\n meta: meta,\n strict: strict,\n });\n };\n }\n if (circular) {\n return function isEqual(a, b) {\n return comparator(a, b, {\n cache: new WeakMap(),\n equals: equals,\n meta: undefined,\n strict: strict,\n });\n };\n }\n var state = {\n cache: undefined,\n equals: equals,\n meta: undefined,\n strict: strict,\n };\n return function isEqual(a, b) {\n return comparator(a, b, state);\n };\n}\n\n/**\n * Whether the items passed are deeply-equal in value.\n */\nvar deepEqual = createCustomEqual();\n/**\n * Whether the items passed are deeply-equal in value based on strict comparison.\n */\nvar strictDeepEqual = createCustomEqual({ strict: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references.\n */\nvar circularDeepEqual = createCustomEqual({ circular: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularDeepEqual = createCustomEqual({\n circular: true,\n strict: true,\n});\n/**\n * Whether the items passed are shallowly-equal in value.\n */\nvar shallowEqual = createCustomEqual({\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value based on strict comparison\n */\nvar strictShallowEqual = createCustomEqual({\n strict: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references.\n */\nvar circularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n strict: true,\n});\n/**\n * Create a custom equality comparison method.\n *\n * This can be done to create very targeted comparisons in extreme hot-path scenarios\n * where the standard methods are not performant enough, but can also be used to provide\n * support for legacy environments that do not support expected features like\n * `RegExp.prototype.flags` out of the box.\n */\nfunction createCustomEqual(options) {\n if (options === void 0) { options = {}; }\n var _a = options.circular, circular = _a === void 0 ? false : _a, createCustomInternalComparator = options.createInternalComparator, createState = options.createState, _b = options.strict, strict = _b === void 0 ? false : _b;\n var config = createEqualityComparatorConfig(options);\n var comparator = createEqualityComparator(config);\n var equals = createCustomInternalComparator\n ? createCustomInternalComparator(comparator)\n : createInternalEqualityComparator(comparator);\n return createIsEqual({ circular: circular, comparator: comparator, createState: createState, equals: equals, strict: strict });\n}\n\nexport { circularDeepEqual, circularShallowEqual, createCustomEqual, deepEqual, sameValueZeroEqual, shallowEqual, strictCircularDeepEqual, strictCircularShallowEqual, strictDeepEqual, strictShallowEqual };\n//# sourceMappingURL=index.mjs.map\n","// There is a circular version https://www.npmjs.com/package/fast-equals#circulardeepequal that I\n// think allows comparing React refs (which have circular references in particular places that this\n// library would ignore). Maybe we can change to that version sometime if needed.\nimport { deepEqual as isEqualDeep } from 'fast-equals';\n\n/**\n * Check that two objects are deeply equal, comparing members of each object and such\n *\n * @param a The first object to compare\n * @param b The second object to compare\n *\n * WARNING: Objects like arrays from different iframes have different constructor function\n * references even if they do the same thing, so this deep equality comparison fails objects that\n * look the same but have different constructors because different constructors could produce\n * false positives in [a few specific\n * situations](https://github.com/planttheidea/fast-equals/blob/a41afc0a240ad5a472e47b53791e9be017f52281/src/comparator.ts#L96).\n * This means that two objects like arrays from different iframes that look the same will fail\n * this check. Please use some other means to check deep equality in those situations.\n *\n * Note: This deep equality check considers `undefined` values on keys of objects NOT to be equal to\n * not specifying the key at all. For example, `{ stuff: 3, things: undefined }` and `{ stuff: 3\n * }` are not considered equal in this case\n *\n * - For more information and examples, see [this\n * CodeSandbox](https://codesandbox.io/s/deepequallibrarycomparison-4g4kk4?file=/src/index.mjs).\n *\n * @returns True if a and b are deeply equal; false otherwise\n */\nexport default function deepEqual(a: unknown, b: unknown) {\n return isEqualDeep(a, b);\n}\n","/**\n * Converts a JavaScript value to a JSON string, changing `undefined` properties in the JavaScript\n * object to `null` properties in the JSON string.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A JavaScript value, usually an object or array, to be converted.\n * @param replacer A function that transforms the results. Note that all `undefined` values returned\n * by the replacer will be further transformed into `null` in the JSON string.\n * @param space Adds indentation, white space, and line break characters to the return-value JSON\n * text to make it easier to read. See the `space` parameter of `JSON.stringify` for more\n * details.\n */\nexport function serialize(\n value: unknown,\n replacer?: (this: unknown, key: string, value: unknown) => unknown,\n space?: string | number,\n): string {\n const undefinedReplacer = (replacerKey: string, replacerValue: unknown) => {\n let newValue = replacerValue;\n if (replacer) newValue = replacer(replacerKey, newValue);\n // All `undefined` values become `null` on the way from JS objects into JSON strings\n // eslint-disable-next-line no-null/no-null\n if (newValue === undefined) newValue = null;\n return newValue;\n };\n return JSON.stringify(value, undefinedReplacer, space);\n}\n\n/**\n * Converts a JSON string into a value, converting all `null` properties from JSON into `undefined`\n * in the returned JavaScript value/object.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A valid JSON string.\n * @param reviver A function that transforms the results. This function is called for each member of\n * the object. If a member contains nested objects, the nested objects are transformed before the\n * parent object is. Note that `null` values are converted into `undefined` values after the\n * reviver has run.\n */\nexport function deserialize(\n value: string,\n reviver?: (this: unknown, key: string, value: unknown) => unknown,\n // Need to use `any` instead of `unknown` here to match the signature of JSON.parse\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n // Helper function to replace `null` with `undefined` on a per property basis. This can't be done\n // with our own reviver because `JSON.parse` removes `undefined` properties from the return value.\n function replaceNull(obj: Record): Record {\n Object.keys(obj).forEach((key: string | number) => {\n // We only want to replace `null`, not other falsy values\n // eslint-disable-next-line no-null/no-null\n if (obj[key] === null) obj[key] = undefined;\n // If the property is an object, recursively call the helper function on it\n else if (typeof obj[key] === 'object')\n // Since the object came from a string, we know the keys will not be symbols\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n obj[key] = replaceNull(obj[key] as Record);\n });\n return obj;\n }\n\n const parsedObject = JSON.parse(value, reviver);\n // Explicitly convert the value 'null' that isn't stored as a property on an object to 'undefined'\n // eslint-disable-next-line no-null/no-null\n if (parsedObject === null) return undefined;\n if (typeof parsedObject === 'object') return replaceNull(parsedObject);\n return parsedObject;\n}\n\n/**\n * Check to see if the value is serializable without losing information\n *\n * @param value Value to test\n * @returns True if serializable; false otherwise\n *\n * Note: the values `undefined` and `null` are serializable (on their own or in an array), but\n * `null` values get transformed into `undefined` when serializing/deserializing.\n *\n * WARNING: This is inefficient right now as it stringifies, parses, stringifies, and === the value.\n * Please only use this if you need to\n *\n * DISCLAIMER: this does not successfully detect that values are not serializable in some cases:\n *\n * - Losses of removed properties like functions and `Map`s\n * - Class instances (not deserializable into class instances without special code)\n *\n * We intend to improve this in the future if it becomes important to do so. See [`JSON.stringify`\n * documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description)\n * for more information.\n */\nexport function isSerializable(value: unknown): boolean {\n try {\n const serializedValue = serialize(value);\n return serializedValue === serialize(deserialize(serializedValue));\n } catch (e) {\n return false;\n }\n}\n\n/**\n * HTML Encodes the provided string. Thanks to ChatGPT\n *\n * @param str String to HTML encode\n * @returns HTML-encoded string\n */\nexport const htmlEncode = (str: string): string =>\n str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\n/** Identifier for a string that will be localized in a menu based on the user's UI language */\nexport type LocalizeKey = `%${string}%`;\n\n/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */\nexport type ReferencedItem = `${string}.${string}`;\n\nexport type OrderedItem = {\n /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */\n order: number;\n};\n\nexport type OrderedExtensibleContainer = OrderedItem & {\n /** Determines whether other items can be added to this after it has been defined */\n isExtensible?: boolean;\n};\n\n/** Group of menu items that belongs in a column */\nexport type MenuGroupDetailsInColumn = OrderedExtensibleContainer & {\n /** ID of column in which this group resides */\n column: ReferencedItem;\n};\n\n/** Group of menu items that belongs in a submenu */\nexport type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & {\n /** ID of menu item hosting the submenu in which this group resides */\n menuItem: ReferencedItem;\n};\n\n/** Column that includes header text in a menu */\nexport type MenuColumnWithHeader = OrderedExtensibleContainer & {\n /** Key that represents the text of the header text of the column */\n label: LocalizeKey;\n};\n\nexport type MenuItemBase = OrderedItem & {\n /** Menu group to which this menu item belongs */\n group: ReferencedItem;\n /** Key that represents the text of this menu item to display */\n label: LocalizeKey;\n /** Key that represents words the platform should reference when users are searching for menu items */\n searchTerms?: LocalizeKey;\n /** Key that represents the text to display if a mouse pointer hovers over the menu item */\n tooltip?: LocalizeKey;\n /** Additional information provided by developers to help people who perform localization */\n localizeNotes: string;\n};\n\n/** Menu item that hosts a submenu */\nexport type MenuItemContainingSubmenu = MenuItemBase & {\n /** ID for this menu item that holds a submenu */\n id: ReferencedItem;\n};\n\n/** Menu item that runs a command */\nexport type MenuItemContainingCommand = MenuItemBase & {\n /** Name of the PAPI command to run when this menu item is selected. */\n command: ReferencedItem;\n /** Path to the icon to display after the menu text */\n iconPathAfter?: string;\n /** Path to the icon to display before the menu text */\n iconPathBefore?: string;\n};\n\n/**\n * Group of menu items that can be combined with other groups to form a single menu/submenu. Groups\n * are separated using a line within the menu/submenu.\n */\nexport type Groups = {\n /** Named menu group */\n [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu;\n};\n\n/** Group of columns that can be combined with other columns to form a multi-column menu */\nexport type ColumnsWithHeaders = {\n /** Named column of a menu */\n [property: ReferencedItem]: MenuColumnWithHeader;\n /** Defines whether columns can be added to this multi-column menu */\n isExtensible?: boolean;\n};\n\n/** Menu that contains a column without a header */\nexport type SingleColumnMenu = {\n /** Groups that belong in this menu */\n groups: Groups;\n /** List of menu items that belong in this menu */\n items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[];\n};\n\n/** Menu that contains multiple columns with headers */\nexport type MultiColumnMenu = SingleColumnMenu & {\n /** Columns that belong in this menu */\n columns: ColumnsWithHeaders;\n};\n\n/** Menus for one single web view */\nexport type WebViewMenu = {\n /** Indicates whether the platform default menus should be included for this webview */\n includeDefaults: boolean | undefined;\n /** Menu that opens when you click on the top left corner of a tab */\n topMenu: MultiColumnMenu | undefined;\n /** Menu that opens when you right click on the main body/area of a tab */\n contextMenu: SingleColumnMenu | undefined;\n};\n\n/** Menus for all web views */\nexport type WebViewMenus = {\n /** Named web view */\n [property: ReferencedItem]: WebViewMenu;\n};\n\n/** Platform.Bible menus */\nexport type PlatformMenus = {\n /** Top level menu for the application */\n mainMenu: MultiColumnMenu;\n /** Menus that apply per web view in the application */\n webViewMenus: WebViewMenus;\n /** Default context menu for web views that don't specify their own */\n defaultWebViewContextMenu: SingleColumnMenu;\n /** Default top menu for web views that don't specify their own */\n defaultWebViewTopMenu: MultiColumnMenu;\n};\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\n/** JSON schema object that aligns with the PlatformMenus type */\nexport const menuDocumentSchema = {\n title: 'Platform.Bible menus',\n type: 'object',\n properties: {\n mainMenu: {\n description: 'Top level menu for the application',\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewTopMenu: {\n description: \"Default top menu for web views that don't specify their own\",\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewContextMenu: {\n description: \"Default context menu for web views that don't specify their own\",\n $ref: '#/$defs/singleColumnMenu',\n },\n webViewMenus: {\n description: 'Menus that apply per web view in the application',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/menusForOneWebView',\n },\n },\n additionalProperties: false,\n },\n },\n required: ['mainMenu', 'defaultWebViewTopMenu', 'defaultWebViewContextMenu', 'webViewMenus'],\n additionalProperties: false,\n $defs: {\n localizeKey: {\n description:\n \"Identifier for a string that will be localized in a menu based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n },\n referencedItem: {\n description:\n 'Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)',\n type: 'string',\n pattern: '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$',\n },\n columnsWithHeaders: {\n description:\n 'Group of columns that can be combined with other columns to form a multi-column menu',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single column with a header string',\n type: 'object',\n properties: {\n label: {\n description: 'Header text for this this column in the UI',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n order: {\n description:\n 'Relative order of this column compared to other columns (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu groups to this column',\n type: 'boolean',\n },\n },\n required: ['label', 'order'],\n additionalProperties: false,\n },\n },\n properties: {\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add columns to this multi-column menu',\n type: 'boolean',\n },\n },\n },\n menuGroups: {\n description:\n 'Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single group that contains menu items',\n type: 'object',\n oneOf: [\n {\n properties: {\n column: {\n description:\n 'Column where this group belongs, not required for single column menus',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['order'],\n additionalProperties: false,\n },\n {\n properties: {\n menuItem: {\n description: 'Menu item that anchors the submenu where this group belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['menuItem', 'order'],\n additionalProperties: false,\n },\n ],\n },\n },\n additionalProperties: false,\n },\n menuItem: {\n description:\n 'Single item in a menu that can be clicked on to take an action or can be the parent of a submenu',\n type: 'object',\n oneOf: [\n {\n properties: {\n id: {\n description: 'ID for this menu item that holds a submenu',\n $ref: '#/$defs/referencedItem',\n },\n },\n required: ['id'],\n },\n {\n properties: {\n command: {\n description: 'Name of the PAPI command to run when this menu item is selected.',\n $ref: '#/$defs/referencedItem',\n },\n iconPathBefore: {\n description: 'Path to the icon to display before the menu text',\n type: 'string',\n },\n iconPathAfter: {\n description: 'Path to the icon to display after the menu text',\n type: 'string',\n },\n },\n required: ['command'],\n },\n ],\n properties: {\n label: {\n description: 'Key that represents the text of this menu item to display',\n $ref: '#/$defs/localizeKey',\n },\n tooltip: {\n description:\n 'Key that represents the text to display if a mouse pointer hovers over the menu item',\n $ref: '#/$defs/localizeKey',\n },\n searchTerms: {\n description:\n 'Key that represents additional words the platform should reference when users are searching for menu items',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n group: {\n description: 'Group to which this menu item belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this menu item compared to other menu items in the same group (sorted ascending)',\n type: 'number',\n },\n },\n required: ['label', 'group', 'order'],\n unevaluatedProperties: false,\n },\n groupsAndItems: {\n description: 'Core schema for a column',\n type: 'object',\n properties: {\n groups: {\n description: 'Groups that belong in this menu',\n $ref: '#/$defs/menuGroups',\n },\n items: {\n description: 'List of menu items that belong in this menu',\n type: 'array',\n items: { $ref: '#/$defs/menuItem' },\n uniqueItems: true,\n },\n },\n required: ['groups', 'items'],\n },\n singleColumnMenu: {\n description: 'Menu that contains a column without a header',\n type: 'object',\n allOf: [{ $ref: '#/$defs/groupsAndItems' }],\n unevaluatedProperties: false,\n },\n multiColumnMenu: {\n description: 'Menu that can contain multiple columns with headers',\n type: 'object',\n allOf: [\n { $ref: '#/$defs/groupsAndItems' },\n {\n properties: {\n columns: {\n description: 'Columns that belong in this menu',\n $ref: '#/$defs/columnsWithHeaders',\n },\n },\n required: ['columns'],\n },\n ],\n unevaluatedProperties: false,\n },\n menusForOneWebView: {\n description: 'Set of menus that are associated with a single tab',\n type: 'object',\n properties: {\n includeDefaults: {\n description:\n 'Indicates whether the platform default menus should be included for this webview',\n type: 'boolean',\n },\n topMenu: {\n description: 'Menu that opens when you click on the top left corner of a tab',\n $ref: '#/$defs/multiColumnMenu',\n },\n contextMenu: {\n description: 'Menu that opens when you right click on the main body/area of a tab',\n $ref: '#/$defs/singleColumnMenu',\n },\n },\n additionalProperties: false,\n },\n },\n};\n\nObject.freeze(menuDocumentSchema);\n"],"names":["AsyncVariable","variableName","rejectIfNotSettledWithinMS","__publicField","resolve","reject","value","throwIfAlreadySettled","reason","newGuid","s","isString","o","deepClone","obj","debounce","fn","delay","timeout","args","groupBy","items","keySelector","valueSelector","map","item","key","group","isErrorWithMessage","error","toErrorWithMessage","maybeError","getErrorMessage","wait","ms","waitForDuration","maxWaitTimeInMS","getAllObjectFunctionNames","objId","objectFunctionNames","property","objectPrototype","createSyncProxyForAsyncObject","getObject","objectToProxy","target","prop","DocumentCombinerEngine","baseDocument","options","documentName","document","previousDocumentVersion","documentToSet","potentialOutput","outputIteration","contribution","mergeObjects","areNonArrayObjects","values","allMatch","areArrayObjects","startingPoint","copyFrom","ignoreDuplicateProperties","retVal","UnsubscriberAsyncList","name","unsubscribers","unsubscriber","unsubs","results","unsubscriberSucceeded","index","PlatformEventEmitter","event","callback","callbackIndex","_a","Mutex","AsyncMutex","MutexMap","mutexID","scrBookData","FIRST_SCR_BOOK_NUM","LAST_SCR_BOOK_NUM","FIRST_SCR_CHAPTER_NUM","FIRST_SCR_VERSE_NUM","getChaptersForBook","bookNum","offsetBook","scrRef","offset","offsetChapter","offsetVerse","aggregateUnsubscribers","success","aggregateUnsubscriberAsyncs","unsubPromises","charRegex","astralRange","comboMarksRange","comboHalfMarksRange","comboSymbolsRange","comboMarksExtendedRange","comboMarksSupplementRange","comboRange","varRange","familyRange","astral","combo","fitz","modifier","nonAstral","regional","surrogatePair","zwj","blackFlag","family","optModifier","optVar","optJoin","seq","symbol","__importDefault","this","mod","dist","char_regex_1","require$$0","toArray","str","toArray_1","length","match","length_1","substring","begin","end","substring_1","substr","len","strLength","substr_1","limit","padString","padPosition","padRepeats","limit_1","indexOf","searchStr","pos","strArr","searchArr","finded","searchIndex","indexOf_1","at","string","stringLength","charAt","codePointAt","endsWith","searchString","endPosition","lastIndexOfSearchString","lastIndexOf","includes","position","partialString","stringzIndexOf","validatedPosition","stringzLength","normalize","form","upperCaseForm","padEnd","targetLength","stringzLimit","padStart","correctSliceIndex","slice","indexStart","indexEnd","newStart","newEnd","split","separator","splitLimit","result","regexSeparator","matches","currentIndex","matchIndex","matchLength","startsWith","stringzSubstr","stringzSubstring","stringzToArray","getOwnPropertyNames","getOwnPropertySymbols","hasOwnProperty","combineComparators","comparatorA","comparatorB","a","b","state","createIsCircular","areItemsEqual","cache","cachedA","cachedB","getStrictProperties","object","hasOwn","sameValueZeroEqual","OWNER","getOwnPropertyDescriptor","keys","areArraysEqual","areDatesEqual","areMapsEqual","matchedIndices","aIterable","aResult","bResult","bIterable","hasMatch","aKey","aValue","_b","bKey","bValue","areObjectsEqual","properties","areObjectsEqualStrict","descriptorA","descriptorB","arePrimitiveWrappersEqual","areRegExpsEqual","areSetsEqual","areTypedArraysEqual","ARGUMENTS_TAG","BOOLEAN_TAG","DATE_TAG","MAP_TAG","NUMBER_TAG","OBJECT_TAG","REG_EXP_TAG","SET_TAG","STRING_TAG","isArray","isTypedArray","assign","getTag","createEqualityComparator","constructor","tag","createEqualityComparatorConfig","circular","createCustomConfig","strict","config","areArraysEqual$1","areMapsEqual$1","areObjectsEqual$1","areSetsEqual$1","createInternalEqualityComparator","compare","_indexOrKeyA","_indexOrKeyB","_parentA","_parentB","createIsEqual","comparator","createState","equals","meta","deepEqual","createCustomEqual","createCustomInternalComparator","isEqualDeep","serialize","replacer","space","replacerKey","replacerValue","newValue","deserialize","reviver","replaceNull","parsedObject","isSerializable","serializedValue","htmlEncode","menuDocumentSchema"],"mappings":"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CAAC,OAAO,EAClB,qBAAsB,EACxB,EACA,CACE,WAAY,CACV,SAAU,CACR,YAAa,8DACb,KAAM,wBACR,EACA,MAAO,CACL,YACE,yGACF,KAAM,QACR,EACA,aAAc,CACZ,YACE,iFACF,KAAM,SACR,CACF,EACA,SAAU,CAAC,WAAY,OAAO,EAC9B,qBAAsB,EACxB,CACF,CACF,CACF,EACA,qBAAsB,EACxB,EACA,SAAU,CACR,YACE,mGACF,KAAM,SACN,MAAO,CACL,CACE,WAAY,CACV,GAAI,CACF,YAAa,6CACb,KAAM,wBACR,CACF,EACA,SAAU,CAAC,IAAI,CACjB,EACA,CACE,WAAY,CACV,QAAS,CACP,YAAa,mEACb,KAAM,wBACR,EACA,eAAgB,CACd,YAAa,mDACb,KAAM,QACR,EACA,cAAe,CACb,YAAa,kDACb,KAAM,QACR,CACF,EACA,SAAU,CAAC,SAAS,CACtB,CACF,EACA,WAAY,CACV,MAAO,CACL,YAAa,4DACb,KAAM,qBACR,EACA,QAAS,CACP,YACE,uFACF,KAAM,qBACR,EACA,YAAa,CACX,YACE,6GACF,KAAM,qBACR,EACA,cAAe,CACb,YACE,wFACF,KAAM,QACR,EACA,MAAO,CACL,YAAa,wCACb,KAAM,wBACR,EACA,MAAO,CACL,YACE,qGACF,KAAM,QACR,CACF,EACA,SAAU,CAAC,QAAS,QAAS,OAAO,EACpC,sBAAuB,EACzB,EACA,eAAgB,CACd,YAAa,2BACb,KAAM,SACN,WAAY,CACV,OAAQ,CACN,YAAa,kCACb,KAAM,oBACR,EACA,MAAO,CACL,YAAa,8CACb,KAAM,QACN,MAAO,CAAE,KAAM,kBAAmB,EAClC,YAAa,EACf,CACF,EACA,SAAU,CAAC,SAAU,OAAO,CAC9B,EACA,iBAAkB,CAChB,YAAa,+CACb,KAAM,SACN,MAAO,CAAC,CAAE,KAAM,yBAA0B,EAC1C,sBAAuB,EACzB,EACA,gBAAiB,CACf,YAAa,sDACb,KAAM,SACN,MAAO,CACL,CAAE,KAAM,wBAAyB,EACjC,CACE,WAAY,CACV,QAAS,CACP,YAAa,mCACb,KAAM,4BACR,CACF,EACA,SAAU,CAAC,SAAS,CACtB,CACF,EACA,sBAAuB,EACzB,EACA,mBAAoB,CAClB,YAAa,qDACb,KAAM,SACN,WAAY,CACV,gBAAiB,CACf,YACE,mFACF,KAAM,SACR,EACA,QAAS,CACP,YAAa,iEACb,KAAM,yBACR,EACA,YAAa,CACX,YAAa,sEACb,KAAM,0BACR,CACF,EACA,qBAAsB,EACxB,CACF,CACF,EAEA,OAAO,OAAOA,EAAkB","x_google_ignoreList":[9,10,12]} \ No newline at end of file diff --git a/lib/platform-bible-utils/dist/index.d.ts b/lib/platform-bible-utils/dist/index.d.ts index 798be2391f..87a7eefcc5 100644 --- a/lib/platform-bible-utils/dist/index.d.ts +++ b/lib/platform-bible-utils/dist/index.d.ts @@ -404,63 +404,75 @@ export declare function getAllObjectFunctionNames(obj: { */ export declare function createSyncProxyForAsyncObject(getObject: (args?: unknown[]) => Promise, objectToProxy?: Partial): T; /** - * Finds the Unicode code point at the given index. This function handles Unicode code points - * instead of UTF-16 character codes. + * This function mirrors the `at` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. + * + * Finds the Unicode code point at the given index. * * @param string String to index * @param index Position of the character to be returned in range of -length(string) to - * length(string) - * @returns New string consisting of the Unicode code point located at the specified - * offset, undefined if index is out of bounds + * length(string) + * @returns New string consisting of the Unicode code point located at the specified offset, + * undefined if index is out of bounds */ export declare function at(string: string, index: number): string | undefined; /** - * Returns a new string consisting of the single UTF-16 code unit at the given index. - * This function handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `charAt` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a new string consisting of the single unicode code point at the given index. * * @param string String to index * @param index Position of the string character to be returned, in the range of 0 to * length(string)-1 - * @returns New string consisting of the Unicode code point located at the specified - * offset, empty string if index is out of bounds + * @returns New string consisting of the Unicode code point located at the specified offset, empty + * string if index is out of bounds */ export declare function charAt(string: string, index: number): string; /** + * This function mirrors the `codePointAt` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * * Returns a non-negative integer that is the Unicode code point value of the character starting at - * the given index. This function handles Unicode code points instead of UTF-16 character codes. + * the given index. * * @param string String to index * @param index Position of the string character to be returned, in the range of 0 to * length(string)-1 - * @returns Non-negative integer representing the code point value of the - * character at the given index, or undefined if there is no element at that position + * @returns Non-negative integer representing the code point value of the character at the given + * index, or undefined if there is no element at that position */ export declare function codePointAt(string: string, index: number): number | undefined; /** - * Determines whether a string ends with the characters of this string. This function handles - * Unicode code points instead of UTF-16 character codes. + * This function mirrors the `endsWith` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Determines whether a string ends with the characters of this string. * * @param string String to search through * @param searchString Characters to search for at the end of the string - * @param endPosition End position where searchString is expected to be - * found. Default is `length(string)` + * @param endPosition End position where searchString is expected to be found. Default is + * `length(string)` * @returns True if it ends with searchString, false if it does not */ export declare function endsWith(string: string, searchString: string, endPosition?: number): boolean; /** - * Performs a case-sensitive search to determine if searchString is found in string. This function + * This function mirrors the `includes` function from the JavaScript Standard String object. It * handles Unicode code points instead of UTF-16 character codes. * + * Performs a case-sensitive search to determine if searchString is found in string. + * * @param string String to search through * @param searchString String to search for - * @param position Position within the string to start searching for searchString. - * Default is `0` + * @param position Position within the string to start searching for searchString. Default is `0` * @returns True if search string is found, false if it is not */ export declare function includes(string: string, searchString: string, position?: number): boolean; /** - * Returns the index of the first occurrence of a given string. This function handles Unicode code - * points instead of UTF-16 character codes. + * This function mirrors the `indexOf` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns the index of the first occurrence of a given string. * * @param string String to search through * @param searchString The string to search for @@ -469,18 +481,32 @@ export declare function includes(string: string, searchString: string, position? */ export declare function indexOf(string: string, searchString: string, position?: number | undefined): number; /** + * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * * Searches this string and returns the index of the last occurrence of the specified substring. - * This function handles Unicode code points instead of UTF-16 character codes. * * @param string String to search through * @param searchString Substring to search for * @param position The index at which to begin searching. If omitted, the search begins at the end - * of the string. Default is `undefined` + * of the string. Default is `undefined` * @returns Index of the last occurrence of searchString found, or -1 if not found. */ export declare function lastIndexOf(string: string, searchString: string, position?: number): number; -declare function length$1(string: string): number; /** + * This function mirrors the `length` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns the length of a string. + * + * @param string String to return the length for + * @returns Number that is length of the starting string + */ +export declare function stringLength(string: string): number; +/** + * This function mirrors the `normalize` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * * Returns the Unicode Normalization Form of this string. * * @param string The starting string @@ -489,34 +515,41 @@ declare function length$1(string: string): number; */ export declare function normalize(string: string, form: "NFC" | "NFD" | "NFKC" | "NFKD" | "none"): string; /** - * Pads this string with another string (multiple times, if needed) until the resulting string - * reaches the given length. The padding is applied from the end of this string. This function + * This function mirrors the `padEnd` function from the JavaScript Standard String object. It * handles Unicode code points instead of UTF-16 character codes. * + * Pads this string with another string (multiple times, if needed) until the resulting string + * reaches the given length. The padding is applied from the end of this string. + * * @param string String to add padding too - * @param targetLength The length of the resulting string once the starting string has been - * padded. If value is less than or equal to length(string), then string is returned as is. - * @param padString The string to pad the current string with. If padString is too - * long to stay within targetLength, it will be truncated. Default is `" "` + * @param targetLength The length of the resulting string once the starting string has been padded. + * If value is less than or equal to length(string), then string is returned as is. + * @param padString The string to pad the current string with. If padString is too long to stay + * within targetLength, it will be truncated. Default is `" "` * @returns String with appropriate padding at the end */ export declare function padEnd(string: string, targetLength: number, padString?: string): string; /** - * Pads this string with another string (multiple times, if needed) until the resulting string - * reaches the given length. The padding is applied from the start of this string. This function + * This function mirrors the `padStart` function from the JavaScript Standard String object. It * handles Unicode code points instead of UTF-16 character codes. * + * Pads this string with another string (multiple times, if needed) until the resulting string + * reaches the given length. The padding is applied from the start of this string. + * * @param string String to add padding too - * @param targetLength The length of the resulting string once the starting string has been - * padded. If value is less than or equal to length(string), then string is returned as is. - * @param padString The string to pad the current string with. If padString is too - * long to stay within the targetLength, it will be truncated from the end. Default is `" "` + * @param targetLength The length of the resulting string once the starting string has been padded. + * If value is less than or equal to length(string), then string is returned as is. + * @param padString The string to pad the current string with. If padString is too long to stay + * within the targetLength, it will be truncated from the end. Default is `" "` * @returns String with of specified targetLength with padString applied from the start */ export declare function padStart(string: string, targetLength: number, padString?: string): string; /** + * This function mirrors the `slice` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. + * * Extracts a section of this string and returns it as a new string, without modifying the original - * string. This function handles Unicode code points instead of UTF-16 character codes. + * string. * * @param string The starting string * @param indexStart The index of the first character to include in the returned substring. @@ -525,35 +558,41 @@ export declare function padStart(string: string, targetLength: number, padString */ export declare function slice(string: string, indexStart: number, indexEnd?: number): string; /** - * Takes a pattern and divides the string into an ordered list of substrings by searching for the - * pattern, puts these substrings into an array, and returns the array. This function handles + * This function mirrors the `split` function from the JavaScript Standard String object. It handles * Unicode code points instead of UTF-16 character codes. * + * Takes a pattern and divides the string into an ordered list of substrings by searching for the + * pattern, puts these substrings into an array, and returns the array. + * * @param string The string to split * @param separator The pattern describing where each split should occur - * @param splitLimit Limit on the number of substrings to be included in the array. Splits - * the string at each occurrence of specified separator, but stops when limit entries have been - * placed in the array. - * @returns An array of strings, split at each point where separator occurs - * in the starting string. Returns undefined if separator is not found in string. + * @param splitLimit Limit on the number of substrings to be included in the array. Splits the + * string at each occurrence of specified separator, but stops when limit entries have been placed + * in the array. + * @returns An array of strings, split at each point where separator occurs in the starting string. + * Returns undefined if separator is not found in string. */ export declare function split(string: string, separator: string | RegExp, splitLimit?: number): string[]; /** + * This function mirrors the `startsWith` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * * Determines whether the string begins with the characters of a specified string, returning true or - * false as appropriate. This function handles Unicode code points instead of UTF-16 character - * codes. + * false as appropriate. * * @param string String to search through * @param searchString The characters to be searched for at the start of this string. - * @param position The start position at which searchString is expected to be found - * (the index of searchString's first character). Default is `0` - * @returns True if the given characters are found at the beginning of the string, - * including when searchString is an empty string; otherwise, false. + * @param position The start position at which searchString is expected to be found (the index of + * searchString's first character). Default is `0` + * @returns True if the given characters are found at the beginning of the string, including when + * searchString is an empty string; otherwise, false. */ export declare function startsWith(string: string, searchString: string, position?: number): boolean; /** - * Returns a substring by providing start and end position. This function handles Unicode code - * points instead of UTF-16 character codes. + * This function mirrors the `substring` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Returns a substring by providing start and end position. * * @param string String to be divided * @param begin Start position @@ -562,8 +601,10 @@ export declare function startsWith(string: string, searchString: string, positio */ export declare function substring(string: string, begin: number, end?: number): string; /** - * Converts a string to an array of string characters. This function handles Unicode code points - * instead of UTF-16 character codes. + * This function mirrors the `toArray` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. + * + * Converts a string to an array of string characters. * * @param string String to convert to array * @returns An array of characters from the starting string @@ -1016,8 +1057,4 @@ export declare const menuDocumentSchema: { }; }; -export { - length$1 as length, -}; - export {}; diff --git a/lib/platform-bible-utils/dist/index.js b/lib/platform-bible-utils/dist/index.js index 955a1b03a0..b4d1351d52 100644 --- a/lib/platform-bible-utils/dist/index.js +++ b/lib/platform-bible-utils/dist/index.js @@ -571,7 +571,7 @@ function C(t, e, r = 0) { return Ae(t, e, r); } function je(t, e, r) { - let s = r || m(t); + let s = r === void 0 ? m(t) : r; s < 0 ? s = 0 : s >= m(t) && (s = m(t) - 1); for (let n = s; n >= 0; n--) if (q(t, n, m(e)) === e) @@ -1159,7 +1159,6 @@ export { Tt as isSerializable, ne as isString, je as lastIndexOf, - m as length, tt as menuDocumentSchema, at as newGuid, qt as normalize, @@ -1172,6 +1171,7 @@ export { St as slice, Ct as split, Pt as startsWith, + m as stringLength, $ as substring, Me as toArray, ie as wait, diff --git a/lib/platform-bible-utils/dist/index.js.map b/lib/platform-bible-utils/dist/index.js.map index d12e38b4be..adc1f8e3ae 100644 --- a/lib/platform-bible-utils/dist/index.js.map +++ b/lib/platform-bible-utils/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../src/async-variable.ts","../src/util.ts","../src/document-combiner-engine.ts","../src/unsubscriber-async-list.ts","../src/platform-event-emitter.model.ts","../src/mutex.ts","../src/mutex-map.ts","../src/scripture-util.ts","../src/unsubscriber.ts","../node_modules/char-regex/index.js","../node_modules/stringz/dist/index.js","../src/string-util.ts","../../../node_modules/fast-equals/dist/esm/index.mjs","../src/equality-checking.ts","../src/serialization.ts","../src/menus.model.ts"],"sourcesContent":["/** This class provides a convenient way for one task to wait on a variable that another task sets. */\nexport default class AsyncVariable {\n private readonly variableName: string;\n private readonly promiseToValue: Promise;\n private resolver: ((value: T) => void) | undefined;\n private rejecter: ((reason: string | undefined) => void) | undefined;\n\n /**\n * Creates an instance of the class\n *\n * @param variableName Name to use when logging about this variable\n * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was\n * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you\n * do not want a timeout at all.\n */\n constructor(variableName: string, rejectIfNotSettledWithinMS: number = 10000) {\n this.variableName = variableName;\n this.promiseToValue = new Promise((resolve, reject) => {\n this.resolver = resolve;\n this.rejecter = reject;\n });\n if (rejectIfNotSettledWithinMS > 0) {\n setTimeout(() => {\n if (this.rejecter) {\n this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`);\n this.complete();\n }\n }, rejectIfNotSettledWithinMS);\n }\n Object.seal(this);\n }\n\n /**\n * Get this variable's promise to a value. This always returns the same promise even after the\n * value has been resolved or rejected.\n *\n * @returns The promise for the value to be set\n */\n get promise(): Promise {\n return this.promiseToValue;\n }\n\n /**\n * A simple way to see if this variable's promise was resolved or rejected already\n *\n * @returns Whether the variable was already resolved or rejected\n */\n get hasSettled(): boolean {\n return Object.isFrozen(this);\n }\n\n /**\n * Resolve this variable's promise to the given value\n *\n * @param value This variable's promise will resolve to this value\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected\n */\n resolveToValue(value: T, throwIfAlreadySettled: boolean = false): void {\n if (this.resolver) {\n console.debug(`${this.variableName} is being resolved now`);\n this.resolver(value);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent resolution of ${this.variableName}`);\n }\n }\n\n /**\n * Reject this variable's promise for the value with the given reason\n *\n * @param reason This variable's promise will be rejected with this reason\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected\n */\n rejectWithReason(reason: string, throwIfAlreadySettled: boolean = false): void {\n if (this.rejecter) {\n console.debug(`${this.variableName} is being rejected now`);\n this.rejecter(reason);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent rejection of ${this.variableName}`);\n }\n }\n\n /** Prevent any further updates to this variable */\n private complete(): void {\n this.resolver = undefined;\n this.rejecter = undefined;\n Object.freeze(this);\n }\n}\n","/** Collection of functions, objects, and types that are used as helpers in other services. */\n\n// Thanks to blubberdiblub at https://stackoverflow.com/a/68141099/217579\nexport function newGuid(): string {\n return '00-0-4-1-000'.replace(/[^-]/g, (s) =>\n // @ts-expect-error ts(2363) this works fine\n // eslint-disable-next-line no-bitwise\n (((Math.random() + ~~s) * 0x10000) >> s).toString(16).padStart(4, '0'),\n );\n}\n\n// thanks to DRAX at https://stackoverflow.com/a/9436948\n/**\n * Determine whether the object is a string\n *\n * @param o Object to determine if it is a string\n * @returns True if the object is a string; false otherwise\n */\nexport function isString(o: unknown): o is string {\n return typeof o === 'string' || o instanceof String;\n}\n\n/**\n * If deepClone isn't used when copying properties between objects, you may be left with dangling\n * references between the source and target of property copying operations.\n *\n * @param obj Object to clone\n * @returns Duplicate copy of `obj` without any references back to the original one\n */\nexport function deepClone(obj: T): T {\n // Assert the return type matches what is expected\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return JSON.parse(JSON.stringify(obj)) as T;\n}\n\n/**\n * Get a function that reduces calls to the function passed in\n *\n * @param fn The function to debounce\n * @param delay How much delay in milliseconds after the most recent call to the debounced function\n * to call the function\n * @returns Function that, when called, only calls the function passed in at maximum every delay ms\n */\n// We don't know the parameter types since this function can be anything\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce void>(fn: T, delay = 300): T {\n if (isString(fn)) throw new Error('Tried to debounce a string! Could be XSS');\n let timeout: ReturnType;\n // Ensure the right return type.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return ((...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n }) as T;\n}\n\n/**\n * Groups each item in the array of items into a map according to the keySelector\n *\n * @param items Array of items to group by\n * @param keySelector Function to run on each item to get the key for the group to which it belongs\n * @param valueSelector Function to run on each item to get the value it should have in the group\n * (like map function). If not provided, uses the item itself\n * @returns Map of keys to groups of values corresponding to each item\n */\nexport function groupBy(items: T[], keySelector: (item: T) => K): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector: (item: T, key: K) => V,\n): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector?: (item: T, key: K) => V,\n): Map> {\n const map = new Map>();\n items.forEach((item) => {\n const key = keySelector(item);\n const group = map.get(key);\n const value = valueSelector ? valueSelector(item, key) : item;\n if (group) group.push(value);\n else map.set(key, [value]);\n });\n return map;\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\ntype ErrorWithMessage = {\n message: string;\n};\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return (\n typeof error === 'object' &&\n // We're potentially dealing with objects we didn't create, so they might contain `null`\n // eslint-disable-next-line no-null/no-null\n error !== null &&\n 'message' in error &&\n // Type assert `error` to check it's `message`.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n typeof (error as Record).message === 'string'\n );\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error from the object (useful for getting an error in a catch block)\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error message from the object (useful for getting error message in a catch\n * block)\n *\n * @example `try {...} catch (e) { logger.info(getErrorMessage(e)) }`\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\n/** Asynchronously waits for the specified number of milliseconds. (wraps setTimeout in a promise) */\nexport function wait(ms: number) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Runs the specified function and will timeout if it takes longer than the specified wait time\n *\n * @param fn The function to run\n * @param maxWaitTimeInMS The maximum amount of time to wait for the function to resolve\n * @returns Promise that resolves to the resolved value of the function or undefined if it ran\n * longer than the specified wait time\n */\nexport function waitForDuration(fn: () => Promise, maxWaitTimeInMS: number) {\n const timeout = wait(maxWaitTimeInMS).then(() => undefined);\n return Promise.any([timeout, fn()]);\n}\n\n/**\n * Get all functions on an object and its prototype chain (so we don't miss any class methods or any\n * object methods). Note that the functions on the final item in the prototype chain (i.e., Object)\n * are skipped to avoid including functions like `__defineGetter__`, `__defineSetter__`, `toString`,\n * etc.\n *\n * @param obj Object whose functions to get\n * @param objId Optional ID of the object to use for debug logging\n * @returns Array of all function names on an object\n */\n// Note: lodash has something that MIGHT do the same thing as this. Investigate for https://github.com/paranext/paranext-core/issues/134\nexport function getAllObjectFunctionNames(\n obj: { [property: string]: unknown },\n objId: string = 'obj',\n): Set {\n const objectFunctionNames = new Set();\n\n // Get all function properties directly defined on the object\n Object.getOwnPropertyNames(obj).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n console.debug(`Skipping ${property} on ${objId} due to error: ${error}`);\n }\n });\n\n // Walk up the prototype chain and get additional function properties, skipping the functions\n // provided by the final (Object) prototype\n let objectPrototype = Object.getPrototypeOf(obj);\n while (objectPrototype && Object.getPrototypeOf(objectPrototype)) {\n Object.getOwnPropertyNames(objectPrototype).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n console.debug(`Skipping ${property} on ${objId}'s prototype due to error: ${error}`);\n }\n });\n objectPrototype = Object.getPrototypeOf(objectPrototype);\n }\n\n return objectFunctionNames;\n}\n\n/**\n * Creates a synchronous proxy for an asynchronous object. The proxy allows calling methods on an\n * object that is asynchronously fetched using a provided asynchronous function.\n *\n * @param getObject - A function that returns a promise resolving to the object whose asynchronous\n * methods to call.\n * @param objectToProxy - An optional object that is the object that is proxied. If a property is\n * accessed that does exist on this object, it will be returned. If a property is accessed that\n * does not exist on this object, it will be considered to be an asynchronous method called on the\n * object returned from getObject.\n * @returns A synchronous proxy for the asynchronous object.\n */\nexport function createSyncProxyForAsyncObject(\n getObject: (args?: unknown[]) => Promise,\n objectToProxy: Partial = {},\n): T {\n // objectToProxy will have only the synchronously accessed properties of T on it, and this proxy\n // makes the async methods that do not exist yet available synchronously so we have all of T\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return new Proxy(objectToProxy as T, {\n get(target, prop) {\n // We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // @ts-expect-error 7053\n if (prop in target) return target[prop];\n return async (...args: unknown[]) => {\n // 7053: We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // 2556: The args here are the parameters for the method specified\n // @ts-expect-error 7053 2556\n return (await getObject())[prop](...args);\n };\n },\n });\n}\n","import { deepClone } from './util';\n\nexport type JsonDocumentLike = { [key: string]: unknown };\n\n/**\n * Options for DocumentCombinerEngine objects\n *\n * - `copyDocuments`: If true, this instance will perform a deep copy of all provided documents before\n * composing the output. If false, then changes made to provided documents after they are\n * contributed will be reflected in the next time output is composed.\n * - `ignoreDuplicateProperties`: If true, then duplicate properties are skipped if they are seen in\n * contributed documents. If false, then throw when duplicate properties are seen in contributed\n * documents.\n */\nexport type DocumentCombinerOptions = {\n copyDocuments: boolean;\n ignoreDuplicateProperties: boolean;\n};\n\n/**\n * Base class for any code that wants to compose JSON documents (in the form of JS objects) together\n * into a single output document.\n */\nexport default abstract class DocumentCombinerEngine {\n protected baseDocument: JsonDocumentLike;\n protected readonly contributions = new Map();\n protected latestOutput: JsonDocumentLike | undefined;\n protected readonly options: DocumentCombinerOptions;\n\n /**\n * Create a DocumentCombinerEngine instance\n *\n * @param baseDocument This is the first document that will be used when composing the output\n * @param options Options used by this object when combining documents\n */\n protected constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) {\n // Setting baseDocument redundantly because TS doesn't understand that updateBaseDocument does it\n this.baseDocument = baseDocument;\n this.options = options;\n this.updateBaseDocument(baseDocument);\n }\n\n /**\n * Update the starting document for composition process\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n * @returns Recalculated output document given the new starting state and existing other documents\n */\n updateBaseDocument(baseDocument: JsonDocumentLike): JsonDocumentLike | undefined {\n this.validateStartingDocument(baseDocument);\n this.baseDocument = this.options.copyDocuments ? deepClone(baseDocument) : baseDocument;\n return this.rebuild();\n }\n\n /**\n * Add or update one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n * @returns Recalculated output document given the new or updated contribution and existing other\n * documents\n */\n addOrUpdateContribution(\n documentName: string,\n document: JsonDocumentLike,\n ): JsonDocumentLike | undefined {\n this.validateContribution(documentName, document);\n const previousDocumentVersion = this.contributions.get(documentName);\n const documentToSet = this.options.copyDocuments && !!document ? deepClone(document) : document;\n this.contributions.set(documentName, documentToSet);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after adding/updating the contribution, put it back how it was\n if (previousDocumentVersion) this.contributions.set(documentName, previousDocumentVersion);\n else this.contributions.delete(documentName);\n throw new Error(`Error when setting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Delete one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to delete\n * @returns Recalculated output document given the remaining other documents\n */\n deleteContribution(documentName: string): object | undefined {\n const document = this.contributions.get(documentName);\n if (!document) throw new Error(`{documentKey} does not exist`);\n this.contributions.delete(documentName);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after deleting the contribution, put it back and rethrow\n this.contributions.set(documentName, document);\n throw new Error(`Error when deleting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Run the document composition process given the starting document and all contributions. Throws\n * if the output document fails to validate properly.\n *\n * @returns Recalculated output document given the starting and contributed documents\n */\n rebuild(): JsonDocumentLike | undefined {\n // The starting document is the output if there are no other contributions\n if (this.contributions.size === 0) {\n let potentialOutput = deepClone(this.baseDocument);\n potentialOutput = this.transformFinalOutput(potentialOutput);\n this.validateOutput(potentialOutput);\n this.latestOutput = potentialOutput;\n return this.latestOutput;\n }\n\n // Compose the output by validating each document one at a time to pinpoint errors better\n let outputIteration = this.baseDocument;\n this.contributions.forEach((contribution: JsonDocumentLike) => {\n outputIteration = mergeObjects(\n outputIteration,\n contribution,\n this.options.ignoreDuplicateProperties,\n );\n this.validateOutput(outputIteration);\n });\n outputIteration = this.transformFinalOutput(outputIteration);\n this.validateOutput(outputIteration);\n this.latestOutput = outputIteration;\n return this.latestOutput;\n }\n\n /**\n * Throw an error if the provided document is not a valid starting document.\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n */\n protected abstract validateStartingDocument(baseDocument: JsonDocumentLike): void;\n\n /**\n * Throw an error if the provided document is not a valid contribution document.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n */\n protected abstract validateContribution(documentName: string, document: JsonDocumentLike): void;\n\n /**\n * Throw an error if the provided output is not valid.\n *\n * @param output Output document that could potentially be returned to callers\n */\n protected abstract validateOutput(output: JsonDocumentLike): void;\n\n /**\n * Transform the document that is the composition of the base document and all contribution\n * documents. This is the last step that will be run prior to validation before\n * `this.latestOutput` is updated to the new output.\n *\n * @param finalOutput Final output document that could potentially be returned to callers. \"Final\"\n * means no further contribution documents will be merged.\n */\n protected abstract transformFinalOutput(finalOutput: JsonDocumentLike): JsonDocumentLike;\n}\n\n// #region Helper functions\n\n/**\n * Determines if the input values are objects but not arrays\n *\n * @param values Objects to check\n * @returns True if all the values are objects but not arrays\n */\nfunction areNonArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Determines if the input values are arrays\n *\n * @param value Objects to check\n * @returns True if the values are arrays\n */\nfunction areArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || !Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Recursively merge the properties of one object (copyFrom) into another (startingPoint). Throws if\n * copyFrom would overwrite values already existing in startingPoint.\n *\n * @param startingPoint Object that is the starting point for the return value\n * @param copyFrom Object whose values are copied into the return value\n * @returns Object that is the combination of the two documents\n */\nfunction mergeObjects(\n startingPoint: JsonDocumentLike,\n copyFrom: JsonDocumentLike,\n ignoreDuplicateProperties: boolean,\n): JsonDocumentLike {\n const retVal = deepClone(startingPoint);\n if (!copyFrom) return retVal;\n\n Object.keys(copyFrom).forEach((key: string | number) => {\n if (Object.hasOwn(startingPoint, key)) {\n if (areNonArrayObjects(startingPoint[key], copyFrom[key])) {\n retVal[key] = mergeObjects(\n // We know these are objects from the `if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n startingPoint[key] as JsonDocumentLike,\n copyFrom[key] as JsonDocumentLike,\n ignoreDuplicateProperties,\n /* eslint-enable no-type-assertion/no-type-assertion */\n );\n } else if (areArrayObjects(startingPoint[key], copyFrom[key])) {\n // We know these are arrays because of the `else if` check\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n retVal[key] = (retVal[key] as Array).concat(copyFrom[key] as Array);\n } else if (!ignoreDuplicateProperties)\n throw new Error(`Cannot merge objects: key \"${key}\" already exists in the target object`);\n } else {\n retVal[key] = copyFrom[key];\n }\n });\n\n return retVal;\n}\n\n// #endregion\n","import { Dispose } from './disposal.model';\nimport { Unsubscriber, UnsubscriberAsync } from './unsubscriber';\n\n/** Simple collection for UnsubscriberAsync objects that also provides an easy way to run them. */\nexport default class UnsubscriberAsyncList {\n readonly unsubscribers = new Set();\n\n constructor(private name = 'Anonymous') {}\n\n /**\n * Add unsubscribers to the list. Note that duplicates are not added twice.\n *\n * @param unsubscribers - Objects that were returned from a registration process.\n */\n add(...unsubscribers: (UnsubscriberAsync | Unsubscriber | Dispose)[]) {\n unsubscribers.forEach((unsubscriber) => {\n if ('dispose' in unsubscriber) this.unsubscribers.add(unsubscriber.dispose);\n else this.unsubscribers.add(unsubscriber);\n });\n }\n\n /**\n * Run all unsubscribers added to this list and then clear the list.\n *\n * @returns `true` if all unsubscribers succeeded, `false` otherwise.\n */\n async runAllUnsubscribers(): Promise {\n const unsubs = [...this.unsubscribers].map((unsubscriber) => unsubscriber());\n const results = await Promise.all(unsubs);\n this.unsubscribers.clear();\n return results.every((unsubscriberSucceeded, index) => {\n if (!unsubscriberSucceeded)\n console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${index} failed!`);\n\n return unsubscriberSucceeded;\n });\n }\n}\n","/** Interfaces, classes, and functions related to events and event emitters */\n\nimport { Dispose } from './disposal.model';\nimport { PlatformEvent, PlatformEventHandler } from './platform-event';\n\n/**\n * Event manager - accepts subscriptions to an event and runs the subscription callbacks when the\n * event is emitted Use eventEmitter.event(callback) to subscribe to the event. Use\n * eventEmitter.emit(event) to run the subscriptions. Generally, this EventEmitter should be\n * private, and its event should be public. That way, the emitter is not publicized, but anyone can\n * subscribe to the event.\n */\nexport default class PlatformEventEmitter implements Dispose {\n /**\n * Subscribes a function to run when this event is emitted.\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n * @alias event\n */\n subscribe = this.event;\n\n /** All callback functions that will run when this event is emitted. Lazy loaded */\n private subscriptions?: PlatformEventHandler[];\n /** Event for listeners to subscribe to. Lazy loaded */\n private lazyEvent?: PlatformEvent;\n /** Whether this emitter has been disposed */\n private isDisposed = false;\n\n /**\n * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted.\n * Use like `const unsubscriber = event(callback)`\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n */\n get event(): PlatformEvent {\n this.assertNotDisposed();\n\n if (!this.lazyEvent) {\n this.lazyEvent = (callback) => {\n if (!callback || typeof callback !== 'function')\n throw new Error(`Event handler callback must be a function!`);\n\n // Initialize this.subscriptions if it does not exist\n if (!this.subscriptions) this.subscriptions = [];\n\n this.subscriptions.push(callback);\n\n return () => {\n if (!this.subscriptions) return false; // Did not find any subscribed callbacks\n\n const callbackIndex = this.subscriptions.indexOf(callback);\n\n if (callbackIndex < 0) return false; // Did not find this callback in the subscriptions\n\n // Remove the callback\n this.subscriptions.splice(callbackIndex, 1);\n\n return true;\n };\n };\n }\n return this.lazyEvent;\n }\n\n /** Disposes of this event, preparing it to release from memory */\n dispose = () => {\n return this.disposeFn();\n };\n\n /**\n * Runs the subscriptions for the event\n *\n * @param event Event data to provide to subscribed callbacks\n */\n emit = (event: T) => {\n // Do not do anything other than emitFn here. This emit is just binding `this` to emitFn\n this.emitFn(event);\n };\n\n /**\n * Function that runs the subscriptions for the event. Added here so children can override emit\n * and still call the base functionality. See NetworkEventEmitter.emit for example\n */\n protected emitFn(event: T) {\n this.assertNotDisposed();\n\n this.subscriptions?.forEach((callback) => callback(event));\n }\n\n /** Check to make sure this emitter is not disposed. Throw if it is */\n protected assertNotDisposed() {\n if (this.isDisposed) throw new Error('Emitter is disposed');\n }\n\n /**\n * Disposes of this event, preparing it to release from memory. Added here so children can\n * override emit and still call the base functionality.\n */\n protected disposeFn() {\n this.assertNotDisposed();\n\n this.isDisposed = true;\n this.subscriptions = undefined;\n this.lazyEvent = undefined;\n return Promise.resolve(true);\n }\n}\n","import { Mutex as AsyncMutex } from 'async-mutex';\n\n// Extending Mutex from async-mutex so we can add JSDoc\n\n/**\n * Class that allows calling asynchronous functions multiple times at once while only running one at\n * a time.\n *\n * @example\n *\n * ```typescript\n * const mutex = new Mutex();\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n * ```\n *\n * See [`async-mutex`](https://www.npmjs.com/package/async-mutex) for more information.\n */\nclass Mutex extends AsyncMutex {}\n\nexport default Mutex;\n","import Mutex from './mutex';\n\n/** Map of {@link Mutex}es that automatically (lazily) generates a new {@link Mutex} for any new key */\nclass MutexMap {\n private mutexesByID = new Map();\n\n get(mutexID: string): Mutex {\n let retVal = this.mutexesByID.get(mutexID);\n if (retVal) return retVal;\n\n retVal = new Mutex();\n this.mutexesByID.set(mutexID, retVal);\n return retVal;\n }\n}\n\nexport default MutexMap;\n","import { BookInfo, ScriptureReference } from './scripture.model';\n\nconst scrBookData: BookInfo[] = [\n { shortName: 'ERR', fullNames: ['ERROR'], chapters: -1 },\n { shortName: 'GEN', fullNames: ['Genesis'], chapters: 50 },\n { shortName: 'EXO', fullNames: ['Exodus'], chapters: 40 },\n { shortName: 'LEV', fullNames: ['Leviticus'], chapters: 27 },\n { shortName: 'NUM', fullNames: ['Numbers'], chapters: 36 },\n { shortName: 'DEU', fullNames: ['Deuteronomy'], chapters: 34 },\n { shortName: 'JOS', fullNames: ['Joshua'], chapters: 24 },\n { shortName: 'JDG', fullNames: ['Judges'], chapters: 21 },\n { shortName: 'RUT', fullNames: ['Ruth'], chapters: 4 },\n { shortName: '1SA', fullNames: ['1 Samuel'], chapters: 31 },\n { shortName: '2SA', fullNames: ['2 Samuel'], chapters: 24 },\n { shortName: '1KI', fullNames: ['1 Kings'], chapters: 22 },\n { shortName: '2KI', fullNames: ['2 Kings'], chapters: 25 },\n { shortName: '1CH', fullNames: ['1 Chronicles'], chapters: 29 },\n { shortName: '2CH', fullNames: ['2 Chronicles'], chapters: 36 },\n { shortName: 'EZR', fullNames: ['Ezra'], chapters: 10 },\n { shortName: 'NEH', fullNames: ['Nehemiah'], chapters: 13 },\n { shortName: 'EST', fullNames: ['Esther'], chapters: 10 },\n { shortName: 'JOB', fullNames: ['Job'], chapters: 42 },\n { shortName: 'PSA', fullNames: ['Psalm', 'Psalms'], chapters: 150 },\n { shortName: 'PRO', fullNames: ['Proverbs'], chapters: 31 },\n { shortName: 'ECC', fullNames: ['Ecclesiastes'], chapters: 12 },\n { shortName: 'SNG', fullNames: ['Song of Solomon', 'Song of Songs'], chapters: 8 },\n { shortName: 'ISA', fullNames: ['Isaiah'], chapters: 66 },\n { shortName: 'JER', fullNames: ['Jeremiah'], chapters: 52 },\n { shortName: 'LAM', fullNames: ['Lamentations'], chapters: 5 },\n { shortName: 'EZK', fullNames: ['Ezekiel'], chapters: 48 },\n { shortName: 'DAN', fullNames: ['Daniel'], chapters: 12 },\n { shortName: 'HOS', fullNames: ['Hosea'], chapters: 14 },\n { shortName: 'JOL', fullNames: ['Joel'], chapters: 3 },\n { shortName: 'AMO', fullNames: ['Amos'], chapters: 9 },\n { shortName: 'OBA', fullNames: ['Obadiah'], chapters: 1 },\n { shortName: 'JON', fullNames: ['Jonah'], chapters: 4 },\n { shortName: 'MIC', fullNames: ['Micah'], chapters: 7 },\n { shortName: 'NAM', fullNames: ['Nahum'], chapters: 3 },\n { shortName: 'HAB', fullNames: ['Habakkuk'], chapters: 3 },\n { shortName: 'ZEP', fullNames: ['Zephaniah'], chapters: 3 },\n { shortName: 'HAG', fullNames: ['Haggai'], chapters: 2 },\n { shortName: 'ZEC', fullNames: ['Zechariah'], chapters: 14 },\n { shortName: 'MAL', fullNames: ['Malachi'], chapters: 4 },\n { shortName: 'MAT', fullNames: ['Matthew'], chapters: 28 },\n { shortName: 'MRK', fullNames: ['Mark'], chapters: 16 },\n { shortName: 'LUK', fullNames: ['Luke'], chapters: 24 },\n { shortName: 'JHN', fullNames: ['John'], chapters: 21 },\n { shortName: 'ACT', fullNames: ['Acts'], chapters: 28 },\n { shortName: 'ROM', fullNames: ['Romans'], chapters: 16 },\n { shortName: '1CO', fullNames: ['1 Corinthians'], chapters: 16 },\n { shortName: '2CO', fullNames: ['2 Corinthians'], chapters: 13 },\n { shortName: 'GAL', fullNames: ['Galatians'], chapters: 6 },\n { shortName: 'EPH', fullNames: ['Ephesians'], chapters: 6 },\n { shortName: 'PHP', fullNames: ['Philippians'], chapters: 4 },\n { shortName: 'COL', fullNames: ['Colossians'], chapters: 4 },\n { shortName: '1TH', fullNames: ['1 Thessalonians'], chapters: 5 },\n { shortName: '2TH', fullNames: ['2 Thessalonians'], chapters: 3 },\n { shortName: '1TI', fullNames: ['1 Timothy'], chapters: 6 },\n { shortName: '2TI', fullNames: ['2 Timothy'], chapters: 4 },\n { shortName: 'TIT', fullNames: ['Titus'], chapters: 3 },\n { shortName: 'PHM', fullNames: ['Philemon'], chapters: 1 },\n { shortName: 'HEB', fullNames: ['Hebrews'], chapters: 13 },\n { shortName: 'JAS', fullNames: ['James'], chapters: 5 },\n { shortName: '1PE', fullNames: ['1 Peter'], chapters: 5 },\n { shortName: '2PE', fullNames: ['2 Peter'], chapters: 3 },\n { shortName: '1JN', fullNames: ['1 John'], chapters: 5 },\n { shortName: '2JN', fullNames: ['2 John'], chapters: 1 },\n { shortName: '3JN', fullNames: ['3 John'], chapters: 1 },\n { shortName: 'JUD', fullNames: ['Jude'], chapters: 1 },\n { shortName: 'REV', fullNames: ['Revelation'], chapters: 22 },\n];\n\nexport const FIRST_SCR_BOOK_NUM = 1;\nexport const LAST_SCR_BOOK_NUM = scrBookData.length - 1;\nexport const FIRST_SCR_CHAPTER_NUM = 1;\nexport const FIRST_SCR_VERSE_NUM = 1;\n\nexport const getChaptersForBook = (bookNum: number): number => {\n return scrBookData[bookNum]?.chapters ?? -1;\n};\n\nexport const offsetBook = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n bookNum: Math.max(FIRST_SCR_BOOK_NUM, Math.min(scrRef.bookNum + offset, LAST_SCR_BOOK_NUM)),\n chapterNum: 1,\n verseNum: 1,\n});\n\nexport const offsetChapter = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n chapterNum: Math.min(\n Math.max(FIRST_SCR_CHAPTER_NUM, scrRef.chapterNum + offset),\n getChaptersForBook(scrRef.bookNum),\n ),\n verseNum: 1,\n});\n\nexport const offsetVerse = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n verseNum: Math.max(FIRST_SCR_VERSE_NUM, scrRef.verseNum + offset),\n});\n","/** Function to run to dispose of something. Returns true if successfully unsubscribed */\nexport type Unsubscriber = () => boolean;\n\n/**\n * Returns an Unsubscriber function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers All unsubscribers to aggregate into one unsubscriber\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscribers = (unsubscribers: Unsubscriber[]): Unsubscriber => {\n return (...args) => {\n // Run the unsubscriber for each handler\n const unsubs = unsubscribers.map((unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return unsubs.every((success) => success);\n };\n};\n\n/**\n * Function to run to dispose of something that runs asynchronously. The promise resolves to true if\n * successfully unsubscribed\n */\nexport type UnsubscriberAsync = () => Promise;\n\n/**\n * Returns an UnsubscriberAsync function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers - All unsubscribers to aggregate into one unsubscriber.\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscriberAsyncs = (\n unsubscribers: (UnsubscriberAsync | Unsubscriber)[],\n): UnsubscriberAsync => {\n return async (...args) => {\n // Run the unsubscriber for each handler\n const unsubPromises = unsubscribers.map(async (unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return (await Promise.all(unsubPromises)).every((success) => success);\n };\n};\n","\"use strict\"\r\n\r\n// Based on: https://github.com/lodash/lodash/blob/6018350ac10d5ce6a5b7db625140b82aeab804df/.internal/unicodeSize.js\r\n\r\nmodule.exports = () => {\r\n\t// Used to compose unicode character classes.\r\n\tconst astralRange = \"\\\\ud800-\\\\udfff\"\r\n\tconst comboMarksRange = \"\\\\u0300-\\\\u036f\"\r\n\tconst comboHalfMarksRange = \"\\\\ufe20-\\\\ufe2f\"\r\n\tconst comboSymbolsRange = \"\\\\u20d0-\\\\u20ff\"\r\n\tconst comboMarksExtendedRange = \"\\\\u1ab0-\\\\u1aff\"\r\n\tconst comboMarksSupplementRange = \"\\\\u1dc0-\\\\u1dff\"\r\n\tconst comboRange = comboMarksRange + comboHalfMarksRange + comboSymbolsRange + comboMarksExtendedRange + comboMarksSupplementRange\r\n\tconst varRange = \"\\\\ufe0e\\\\ufe0f\"\r\n\tconst familyRange = \"\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFB\\\\u200D\\\\uD83C\\\\uDF93\"\r\n\r\n\t// Used to compose unicode capture groups.\r\n\tconst astral = `[${astralRange}]`\r\n\tconst combo = `[${comboRange}]`\r\n\tconst fitz = \"\\\\ud83c[\\\\udffb-\\\\udfff]\"\r\n\tconst modifier = `(?:${combo}|${fitz})`\r\n\tconst nonAstral = `[^${astralRange}]`\r\n\tconst regional = \"(?:\\\\uD83C[\\\\uDDE6-\\\\uDDFF]){2}\"\r\n\tconst surrogatePair = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\"\r\n\tconst zwj = \"\\\\u200d\"\r\n\tconst blackFlag = \"(?:\\\\ud83c\\\\udff4\\\\udb40\\\\udc67\\\\udb40\\\\udc62\\\\udb40(?:\\\\udc65|\\\\udc73|\\\\udc77)\\\\udb40(?:\\\\udc6e|\\\\udc63|\\\\udc6c)\\\\udb40(?:\\\\udc67|\\\\udc74|\\\\udc73)\\\\udb40\\\\udc7f)\"\r\n\tconst family = `[${familyRange}]`\r\n\r\n\t// Used to compose unicode regexes.\r\n\tconst optModifier = `${modifier}?`\r\n\tconst optVar = `[${varRange}]?`\r\n\tconst optJoin = `(?:${zwj}(?:${[nonAstral, regional, surrogatePair].join(\"|\")})${optVar + optModifier})*`\r\n\tconst seq = optVar + optModifier + optJoin\r\n\tconst nonAstralCombo = `${nonAstral}${combo}?`\r\n\tconst symbol = `(?:${[nonAstralCombo, combo, regional, surrogatePair, astral, family].join(\"|\")})`\r\n\r\n\t// Used to match [String symbols](https://mathiasbynens.be/notes/javascript-unicode).\r\n\treturn new RegExp(`${blackFlag}|${fitz}(?=${fitz})|${symbol + seq}`, \"g\")\r\n}\r\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar char_regex_1 = __importDefault(require(\"char-regex\"));\n/**\n * Converts a string to an array of string chars\n * @param {string} str The string to turn into array\n * @returns {string[]}\n */\nfunction toArray(str) {\n if (typeof str !== 'string') {\n throw new Error('A string is expected as input');\n }\n return str.match(char_regex_1.default()) || [];\n}\nexports.toArray = toArray;\n/**\n * Returns the length of a string\n *\n * @export\n * @param {string} str\n * @returns {number}\n */\nfunction length(str) {\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var match = str.match(char_regex_1.default());\n return match === null ? 0 : match.length;\n}\nexports.length = length;\n/**\n * Returns a substring by providing start and end position\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} end End position\n * @returns {string}\n */\nfunction substring(str, begin, end) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n // Even though negative numbers work here, theyre not in the spec\n if (typeof begin !== 'number' || begin < 0) {\n begin = 0;\n }\n if (typeof end === 'number' && end < 0) {\n end = 0;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substring = substring;\n/**\n * Returns a substring by providing start position and length\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} len Desired length\n * @returns {string}\n */\nfunction substr(str, begin, len) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var strLength = length(str);\n // Fix type\n if (typeof begin !== 'number') {\n begin = parseInt(begin, 10);\n }\n // Return zero-length string if got oversize number.\n if (begin >= strLength) {\n return '';\n }\n // Calculating postive version of negative value.\n if (begin < 0) {\n begin += strLength;\n }\n var end;\n if (typeof len === 'undefined') {\n end = strLength;\n }\n else {\n // Fix type\n if (typeof len !== 'number') {\n len = parseInt(len, 10);\n }\n end = len >= 0 ? len + begin : begin;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substr = substr;\n/**\n * Enforces a string to be a certain length by\n * adding or removing characters\n *\n * @export\n * @param {string} str\n * @param {number} [limit=16] Limit\n * @param {string} [padString='#'] The Pad String\n * @param {string} [padPosition='right'] The Pad Position\n * @returns {string}\n */\nfunction limit(str, limit, padString, padPosition) {\n if (limit === void 0) { limit = 16; }\n if (padString === void 0) { padString = '#'; }\n if (padPosition === void 0) { padPosition = 'right'; }\n // Input should be a string, limit should be a number\n if (typeof str !== 'string' || typeof limit !== 'number') {\n throw new Error('Invalid arguments specified');\n }\n // Pad position should be either left or right\n if (['left', 'right'].indexOf(padPosition) === -1) {\n throw new Error('Pad position should be either left or right');\n }\n // Pad string can be anything, we convert it to string\n if (typeof padString !== 'string') {\n padString = String(padString);\n }\n // Calculate string length considering astral code points\n var strLength = length(str);\n if (strLength > limit) {\n return substring(str, 0, limit);\n }\n else if (strLength < limit) {\n var padRepeats = padString.repeat(limit - strLength);\n return padPosition === 'left' ? padRepeats + str : str + padRepeats;\n }\n return str;\n}\nexports.limit = limit;\n/**\n * Returns the index of the first occurrence of a given string\n *\n * @export\n * @param {string} str\n * @param {string} [searchStr] the string to search\n * @param {number} [pos] starting position\n * @returns {number}\n */\nfunction indexOf(str, searchStr, pos) {\n if (pos === void 0) { pos = 0; }\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n if (str === '') {\n if (searchStr === '') {\n return 0;\n }\n return -1;\n }\n // fix type\n pos = Number(pos);\n pos = isNaN(pos) ? 0 : pos;\n searchStr = String(searchStr);\n var strArr = toArray(str);\n if (pos >= strArr.length) {\n if (searchStr === '') {\n return strArr.length;\n }\n return -1;\n }\n if (searchStr === '') {\n return pos;\n }\n var searchArr = toArray(searchStr);\n var finded = false;\n var index;\n for (index = pos; index < strArr.length; index += 1) {\n var searchIndex = 0;\n while (searchIndex < searchArr.length &&\n searchArr[searchIndex] === strArr[index + searchIndex]) {\n searchIndex += 1;\n }\n if (searchIndex === searchArr.length &&\n searchArr[searchIndex - 1] === strArr[index + searchIndex - 1]) {\n finded = true;\n break;\n }\n }\n return finded ? index : -1;\n}\nexports.indexOf = indexOf;\n","import {\n indexOf as stringzIndexOf,\n substring as stringzSubstring,\n length as stringzLength,\n toArray as stringzToArray,\n limit as stringzLimit,\n substr as stringzSubstr,\n} from 'stringz';\n\n/**\n * Finds the Unicode code point at the given index. This function handles Unicode code points\n * instead of UTF-16 character codes.\n *\n * @param string String to index\n * @param index Position of the character to be returned in range of -length(string) to\n * length(string)\n * @returns New string consisting of the Unicode code point located at the specified\n * offset, undefined if index is out of bounds\n */\nexport function at(string: string, index: number): string | undefined {\n if (index > length(string) || index < -length(string)) return undefined;\n return substr(string, index, 1);\n}\n\n/**\n * Returns a new string consisting of the single UTF-16 code unit at the given index.\n * This function handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns New string consisting of the Unicode code point located at the specified\n * offset, empty string if index is out of bounds\n */\nexport function charAt(string: string, index: number): string {\n if (index < 0 || index > length(string) - 1) return '';\n return substr(string, index, 1);\n}\n\n/**\n * Returns a non-negative integer that is the Unicode code point value of the character starting at\n * the given index. This function handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns Non-negative integer representing the code point value of the\n * character at the given index, or undefined if there is no element at that position\n */\nexport function codePointAt(string: string, index: number): number | undefined {\n if (index < 0 || index > length(string) - 1) return undefined;\n return substr(string, index, 1).codePointAt(0);\n}\n\n/**\n * Determines whether a string ends with the characters of this string. This function handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to search through\n * @param searchString Characters to search for at the end of the string\n * @param endPosition End position where searchString is expected to be\n * found. Default is `length(string)`\n * @returns True if it ends with searchString, false if it does not\n */\nexport function endsWith(\n string: string,\n searchString: string,\n endPosition: number = length(string),\n): boolean {\n const lastIndexOfSearchString = lastIndexOf(string, searchString);\n if (lastIndexOfSearchString === -1) return false;\n if (lastIndexOfSearchString + length(searchString) !== endPosition) return false;\n return true;\n}\n\n/**\n * Performs a case-sensitive search to determine if searchString is found in string. This function\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to search through\n * @param searchString String to search for\n * @param position Position within the string to start searching for searchString.\n * Default is `0`\n * @returns True if search string is found, false if it is not\n */\nexport function includes(string: string, searchString: string, position: number = 0): boolean {\n const partialString = substring(string, position);\n const indexOfSearchString = indexOf(partialString, searchString);\n if (indexOfSearchString === -1) return false;\n return true;\n}\n\n/**\n * Returns the index of the first occurrence of a given string. This function handles Unicode code\n * points instead of UTF-16 character codes.\n *\n * @param string String to search through\n * @param searchString The string to search for\n * @param position Start of searching. Default is `0`\n * @returns Index of the first occurrence of a given string\n */\nexport function indexOf(\n string: string,\n searchString: string,\n position: number | undefined = 0,\n): number {\n return stringzIndexOf(string, searchString, position);\n}\n\n/**\n * Searches this string and returns the index of the last occurrence of the specified substring.\n * This function handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to search through\n * @param searchString Substring to search for\n * @param position The index at which to begin searching. If omitted, the search begins at the end\n * of the string. Default is `undefined`\n * @returns Index of the last occurrence of searchString found, or -1 if not found.\n */\nexport function lastIndexOf(\n string: string,\n searchString: string,\n position?: number,\n): number {\n let validatedPosition = position ? position : length(string);\n\n if (validatedPosition < 0) {\n validatedPosition = 0;\n } else if (validatedPosition >= length(string)) {\n validatedPosition = length(string) - 1;\n }\n\n for (let index = validatedPosition; index >= 0; index--) {\n if (substr(string, index, length(searchString)) === searchString) {\n return index;\n }\n }\n\n return -1;\n}\n\n/**\n * Returns the length of a string. This function handles Unicode code points instead of UTF-16\n * character codes.\n *\n * @param string String to return the length for\n * @returns Number that is length of the starting string\n */\nexport function length(string: string): number {\n return stringzLength(string);\n}\n\n/**\n * Returns the Unicode Normalization Form of this string.\n *\n * @param string The starting string\n * @param form Form specifying the Unicode Normalization Form. Default is `'NFC'`\n * @returns A string containing the Unicode Normalization Form of the given string.\n */\nexport function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' | 'none'): string {\n const upperCaseForm = form.toUpperCase();\n if (upperCaseForm === 'NONE') {\n return string;\n }\n return string.normalize(upperCaseForm);\n}\n\n/**\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the end of this string. This function\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been\n * padded. If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too\n * long to stay within targetLength, it will be truncated. Default is `\" \"`\n * @returns String with appropriate padding at the end\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padEnd(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= length(string)) return string;\n return stringzLimit(string, targetLength, padString, 'right');\n}\n\n/**\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the start of this string. This function\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been\n * padded. If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too\n * long to stay within the targetLength, it will be truncated from the end. Default is `\" \"`\n * @returns String with of specified targetLength with padString applied from the start\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padStart(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= length(string)) return string;\n return stringzLimit(string, targetLength, padString, 'left');\n}\n\nfunction correctSliceIndex(stringLength: number, index: number) {\n if (index > stringLength) return stringLength;\n if (index < -stringLength) return 0;\n if (index < 0) return index + stringLength;\n return index;\n}\n\n/**\n * Extracts a section of this string and returns it as a new string, without modifying the original\n * string. This function handles Unicode code points instead of UTF-16 character codes.\n *\n * @param string The starting string\n * @param indexStart The index of the first character to include in the returned substring.\n * @param indexEnd The index of the first character to exclude from the returned substring.\n * @returns A new string containing the extracted section of the string.\n */\nexport function slice(string: string, indexStart: number, indexEnd?: number): string {\n const stringLength: number = length(string);\n if (\n indexStart > stringLength ||\n (indexEnd &&\n ((indexStart > indexEnd &&\n !(\n indexStart > 0 &&\n indexStart < stringLength &&\n indexEnd < 0 &&\n indexEnd > -stringLength\n )) ||\n indexEnd < -stringLength ||\n (indexStart < 0 && indexStart > -stringLength && indexEnd > 0)))\n )\n return '';\n\n const newStart = correctSliceIndex(stringLength, indexStart);\n const newEnd = indexEnd ? correctSliceIndex(stringLength, indexEnd) : undefined;\n\n return substring(string, newStart, newEnd);\n}\n\n/**\n * Takes a pattern and divides the string into an ordered list of substrings by searching for the\n * pattern, puts these substrings into an array, and returns the array. This function handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * @param string The string to split\n * @param separator The pattern describing where each split should occur\n * @param splitLimit Limit on the number of substrings to be included in the array. Splits\n * the string at each occurrence of specified separator, but stops when limit entries have been\n * placed in the array.\n * @returns An array of strings, split at each point where separator occurs\n * in the starting string. Returns undefined if separator is not found in string.\n */\nexport function split(string: string, separator: string | RegExp, splitLimit?: number): string[] {\n const result: string[] = [];\n\n if (splitLimit !== undefined && splitLimit <= 0) {\n return [string];\n }\n\n if (separator === '') return toArray(string).slice(0, splitLimit);\n\n let regexSeparator = separator;\n if (\n typeof separator === 'string' ||\n (separator instanceof RegExp && !includes(separator.flags, 'g'))\n ) {\n regexSeparator = new RegExp(separator, 'g');\n }\n\n const matches: RegExpMatchArray | null = string.match(regexSeparator);\n\n let currentIndex = 0;\n\n if (!matches) return [string];\n\n for (let index = 0; index < (splitLimit ? splitLimit - 1 : matches.length); index++) {\n const matchIndex = indexOf(string, matches[index], currentIndex);\n const matchLength = length(matches[index]);\n\n result.push(substring(string, currentIndex, matchIndex));\n currentIndex = matchIndex + matchLength;\n\n if (splitLimit !== undefined && result.length === splitLimit) {\n break;\n }\n }\n\n result.push(substring(string, currentIndex));\n\n return result;\n}\n\n/**\n * Determines whether the string begins with the characters of a specified string, returning true or\n * false as appropriate. This function handles Unicode code points instead of UTF-16 character\n * codes.\n *\n * @param string String to search through\n * @param searchString The characters to be searched for at the start of this string.\n * @param position The start position at which searchString is expected to be found\n * (the index of searchString's first character). Default is `0`\n * @returns True if the given characters are found at the beginning of the string,\n * including when searchString is an empty string; otherwise, false.\n */\nexport function startsWith(string: string, searchString: string, position: number = 0): boolean {\n const indexOfSearchString = indexOf(string, searchString, position);\n if (indexOfSearchString !== position) return false;\n return true;\n}\n\n/**\n * Returns a substring by providing start and length. This function handles Unicode code points\n * instead of UTF-16 character codes. This function is not exported because it is considered\n * deprecated, however it is still useful as a local helper function.\n *\n * @param string String to be divided\n * @param begin Start position. Default is `Start of string`\n * @param len Length of result. Default is `String\n * length minus start parameter`. Default is `String length minus start parameter`\n * @returns Substring from starting string\n */\nfunction substr(string: string, begin: number = 0, len: number = length(string) - begin): string {\n return stringzSubstr(string, begin, len);\n}\n\n/**\n * Returns a substring by providing start and end position. This function handles Unicode code\n * points instead of UTF-16 character codes.\n *\n * @param string String to be divided\n * @param begin Start position\n * @param end End position. Default is `End of string`\n * @returns Substring from starting string\n */\nexport function substring(\n string: string,\n begin: number,\n end: number = length(string),\n): string {\n return stringzSubstring(string, begin, end);\n}\n\n/**\n * Converts a string to an array of string characters. This function handles Unicode code points\n * instead of UTF-16 character codes.\n *\n * @param string String to convert to array\n * @returns An array of characters from the starting string\n */\nexport function toArray(string: string): string[] {\n return stringzToArray(string);\n}\n","var getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Combine two comparators into a single comparators.\n */\nfunction combineComparators(comparatorA, comparatorB) {\n return function isEqual(a, b, state) {\n return comparatorA(a, b, state) && comparatorB(a, b, state);\n };\n}\n/**\n * Wrap the provided `areItemsEqual` method to manage the circular state, allowing\n * for circular references to be safely included in the comparison without creating\n * stack overflows.\n */\nfunction createIsCircular(areItemsEqual) {\n return function isCircular(a, b, state) {\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object') {\n return areItemsEqual(a, b, state);\n }\n var cache = state.cache;\n var cachedA = cache.get(a);\n var cachedB = cache.get(b);\n if (cachedA && cachedB) {\n return cachedA === b && cachedB === a;\n }\n cache.set(a, b);\n cache.set(b, a);\n var result = areItemsEqual(a, b, state);\n cache.delete(a);\n cache.delete(b);\n return result;\n };\n}\n/**\n * Get the properties to strictly examine, which include both own properties that are\n * not enumerable and symbol properties.\n */\nfunction getStrictProperties(object) {\n return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));\n}\n/**\n * Whether the object contains the property passed as an own property.\n */\nvar hasOwn = Object.hasOwn ||\n (function (object, property) {\n return hasOwnProperty.call(object, property);\n });\n/**\n * Whether the values passed are strictly equal or both NaN.\n */\nfunction sameValueZeroEqual(a, b) {\n return a || b ? a === b : a === b || (a !== a && b !== b);\n}\n\nvar OWNER = '_owner';\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, keys = Object.keys;\n/**\n * Whether the arrays are equal in value.\n */\nfunction areArraysEqual(a, b, state) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (!state.equals(a[index], b[index], index, index, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the dates passed are equal in value.\n */\nfunction areDatesEqual(a, b) {\n return sameValueZeroEqual(a.getTime(), b.getTime());\n}\n/**\n * Whether the `Map`s are equal in value.\n */\nfunction areMapsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.entries();\n var index = 0;\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.entries();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n var _a = aResult.value, aKey = _a[0], aValue = _a[1];\n var _b = bResult.value, bKey = _b[0], bValue = _b[1];\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch =\n state.equals(aKey, bKey, index, matchIndex, a, b, state) &&\n state.equals(aValue, bValue, aKey, bKey, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n index++;\n }\n return true;\n}\n/**\n * Whether the objects are equal in value.\n */\nfunction areObjectsEqual(a, b, state) {\n var properties = keys(a);\n var index = properties.length;\n if (keys(b).length !== index) {\n return false;\n }\n var property;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property) ||\n !state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the objects are equal in value with strict property checking.\n */\nfunction areObjectsEqualStrict(a, b, state) {\n var properties = getStrictProperties(a);\n var index = properties.length;\n if (getStrictProperties(b).length !== index) {\n return false;\n }\n var property;\n var descriptorA;\n var descriptorB;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property)) {\n return false;\n }\n if (!state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n descriptorA = getOwnPropertyDescriptor(a, property);\n descriptorB = getOwnPropertyDescriptor(b, property);\n if ((descriptorA || descriptorB) &&\n (!descriptorA ||\n !descriptorB ||\n descriptorA.configurable !== descriptorB.configurable ||\n descriptorA.enumerable !== descriptorB.enumerable ||\n descriptorA.writable !== descriptorB.writable)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the primitive wrappers passed are equal in value.\n */\nfunction arePrimitiveWrappersEqual(a, b) {\n return sameValueZeroEqual(a.valueOf(), b.valueOf());\n}\n/**\n * Whether the regexps passed are equal in value.\n */\nfunction areRegExpsEqual(a, b) {\n return a.source === b.source && a.flags === b.flags;\n}\n/**\n * Whether the `Set`s are equal in value.\n */\nfunction areSetsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.values();\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.values();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch = state.equals(aResult.value, bResult.value, aResult.value, bResult.value, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the TypedArray instances are equal in value.\n */\nfunction areTypedArraysEqual(a, b) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n return true;\n}\n\nvar ARGUMENTS_TAG = '[object Arguments]';\nvar BOOLEAN_TAG = '[object Boolean]';\nvar DATE_TAG = '[object Date]';\nvar MAP_TAG = '[object Map]';\nvar NUMBER_TAG = '[object Number]';\nvar OBJECT_TAG = '[object Object]';\nvar REG_EXP_TAG = '[object RegExp]';\nvar SET_TAG = '[object Set]';\nvar STRING_TAG = '[object String]';\nvar isArray = Array.isArray;\nvar isTypedArray = typeof ArrayBuffer === 'function' && ArrayBuffer.isView\n ? ArrayBuffer.isView\n : null;\nvar assign = Object.assign;\nvar getTag = Object.prototype.toString.call.bind(Object.prototype.toString);\n/**\n * Create a comparator method based on the type-specific equality comparators passed.\n */\nfunction createEqualityComparator(_a) {\n var areArraysEqual = _a.areArraysEqual, areDatesEqual = _a.areDatesEqual, areMapsEqual = _a.areMapsEqual, areObjectsEqual = _a.areObjectsEqual, arePrimitiveWrappersEqual = _a.arePrimitiveWrappersEqual, areRegExpsEqual = _a.areRegExpsEqual, areSetsEqual = _a.areSetsEqual, areTypedArraysEqual = _a.areTypedArraysEqual;\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n */\n return function comparator(a, b, state) {\n // If the items are strictly equal, no need to do a value comparison.\n if (a === b) {\n return true;\n }\n // If the items are not non-nullish objects, then the only possibility\n // of them being equal but not strictly is if they are both `NaN`. Since\n // `NaN` is uniquely not equal to itself, we can use self-comparison of\n // both objects, which is faster than `isNaN()`.\n if (a == null ||\n b == null ||\n typeof a !== 'object' ||\n typeof b !== 'object') {\n return a !== a && b !== b;\n }\n var constructor = a.constructor;\n // Checks are listed in order of commonality of use-case:\n // 1. Common complex object types (plain object, array)\n // 2. Common data values (date, regexp)\n // 3. Less-common complex object types (map, set)\n // 4. Less-common data values (promise, primitive wrappers)\n // Inherently this is both subjective and assumptive, however\n // when reviewing comparable libraries in the wild this order\n // appears to be generally consistent.\n // Constructors should match, otherwise there is potential for false positives\n // between class and subclass or custom object and POJO.\n if (constructor !== b.constructor) {\n return false;\n }\n // `isPlainObject` only checks against the object's own realm. Cross-realm\n // comparisons are rare, and will be handled in the ultimate fallback, so\n // we can avoid capturing the string tag.\n if (constructor === Object) {\n return areObjectsEqual(a, b, state);\n }\n // `isArray()` works on subclasses and is cross-realm, so we can avoid capturing\n // the string tag or doing an `instanceof` check.\n if (isArray(a)) {\n return areArraysEqual(a, b, state);\n }\n // `isTypedArray()` works on all possible TypedArray classes, so we can avoid\n // capturing the string tag or comparing against all possible constructors.\n if (isTypedArray != null && isTypedArray(a)) {\n return areTypedArraysEqual(a, b, state);\n }\n // Try to fast-path equality checks for other complex object types in the\n // same realm to avoid capturing the string tag. Strict equality is used\n // instead of `instanceof` because it is more performant for the common\n // use-case. If someone is subclassing a native class, it will be handled\n // with the string tag comparison.\n if (constructor === Date) {\n return areDatesEqual(a, b, state);\n }\n if (constructor === RegExp) {\n return areRegExpsEqual(a, b, state);\n }\n if (constructor === Map) {\n return areMapsEqual(a, b, state);\n }\n if (constructor === Set) {\n return areSetsEqual(a, b, state);\n }\n // Since this is a custom object, capture the string tag to determing its type.\n // This is reasonably performant in modern environments like v8 and SpiderMonkey.\n var tag = getTag(a);\n if (tag === DATE_TAG) {\n return areDatesEqual(a, b, state);\n }\n if (tag === REG_EXP_TAG) {\n return areRegExpsEqual(a, b, state);\n }\n if (tag === MAP_TAG) {\n return areMapsEqual(a, b, state);\n }\n if (tag === SET_TAG) {\n return areSetsEqual(a, b, state);\n }\n if (tag === OBJECT_TAG) {\n // The exception for value comparison is custom `Promise`-like class instances. These should\n // be treated the same as standard `Promise` objects, which means strict equality, and if\n // it reaches this point then that strict equality comparison has already failed.\n return (typeof a.then !== 'function' &&\n typeof b.then !== 'function' &&\n areObjectsEqual(a, b, state));\n }\n // If an arguments tag, it should be treated as a standard object.\n if (tag === ARGUMENTS_TAG) {\n return areObjectsEqual(a, b, state);\n }\n // As the penultimate fallback, check if the values passed are primitive wrappers. This\n // is very rare in modern JS, which is why it is deprioritized compared to all other object\n // types.\n if (tag === BOOLEAN_TAG || tag === NUMBER_TAG || tag === STRING_TAG) {\n return arePrimitiveWrappersEqual(a, b, state);\n }\n // If not matching any tags that require a specific type of comparison, then we hard-code false because\n // the only thing remaining is strict equality, which has already been compared. This is for a few reasons:\n // - Certain types that cannot be introspected (e.g., `WeakMap`). For these types, this is the only\n // comparison that can be made.\n // - For types that can be introspected, but rarely have requirements to be compared\n // (`ArrayBuffer`, `DataView`, etc.), the cost is avoided to prioritize the common\n // use-cases (may be included in a future release, if requested enough).\n // - For types that can be introspected but do not have an objective definition of what\n // equality is (`Error`, etc.), the subjective decision is to be conservative and strictly compare.\n // In all cases, these decisions should be reevaluated based on changes to the language and\n // common development practices.\n return false;\n };\n}\n/**\n * Create the configuration object used for building comparators.\n */\nfunction createEqualityComparatorConfig(_a) {\n var circular = _a.circular, createCustomConfig = _a.createCustomConfig, strict = _a.strict;\n var config = {\n areArraysEqual: strict\n ? areObjectsEqualStrict\n : areArraysEqual,\n areDatesEqual: areDatesEqual,\n areMapsEqual: strict\n ? combineComparators(areMapsEqual, areObjectsEqualStrict)\n : areMapsEqual,\n areObjectsEqual: strict\n ? areObjectsEqualStrict\n : areObjectsEqual,\n arePrimitiveWrappersEqual: arePrimitiveWrappersEqual,\n areRegExpsEqual: areRegExpsEqual,\n areSetsEqual: strict\n ? combineComparators(areSetsEqual, areObjectsEqualStrict)\n : areSetsEqual,\n areTypedArraysEqual: strict\n ? areObjectsEqualStrict\n : areTypedArraysEqual,\n };\n if (createCustomConfig) {\n config = assign({}, config, createCustomConfig(config));\n }\n if (circular) {\n var areArraysEqual$1 = createIsCircular(config.areArraysEqual);\n var areMapsEqual$1 = createIsCircular(config.areMapsEqual);\n var areObjectsEqual$1 = createIsCircular(config.areObjectsEqual);\n var areSetsEqual$1 = createIsCircular(config.areSetsEqual);\n config = assign({}, config, {\n areArraysEqual: areArraysEqual$1,\n areMapsEqual: areMapsEqual$1,\n areObjectsEqual: areObjectsEqual$1,\n areSetsEqual: areSetsEqual$1,\n });\n }\n return config;\n}\n/**\n * Default equality comparator pass-through, used as the standard `isEqual` creator for\n * use inside the built comparator.\n */\nfunction createInternalEqualityComparator(compare) {\n return function (a, b, _indexOrKeyA, _indexOrKeyB, _parentA, _parentB, state) {\n return compare(a, b, state);\n };\n}\n/**\n * Create the `isEqual` function used by the consuming application.\n */\nfunction createIsEqual(_a) {\n var circular = _a.circular, comparator = _a.comparator, createState = _a.createState, equals = _a.equals, strict = _a.strict;\n if (createState) {\n return function isEqual(a, b) {\n var _a = createState(), _b = _a.cache, cache = _b === void 0 ? circular ? new WeakMap() : undefined : _b, meta = _a.meta;\n return comparator(a, b, {\n cache: cache,\n equals: equals,\n meta: meta,\n strict: strict,\n });\n };\n }\n if (circular) {\n return function isEqual(a, b) {\n return comparator(a, b, {\n cache: new WeakMap(),\n equals: equals,\n meta: undefined,\n strict: strict,\n });\n };\n }\n var state = {\n cache: undefined,\n equals: equals,\n meta: undefined,\n strict: strict,\n };\n return function isEqual(a, b) {\n return comparator(a, b, state);\n };\n}\n\n/**\n * Whether the items passed are deeply-equal in value.\n */\nvar deepEqual = createCustomEqual();\n/**\n * Whether the items passed are deeply-equal in value based on strict comparison.\n */\nvar strictDeepEqual = createCustomEqual({ strict: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references.\n */\nvar circularDeepEqual = createCustomEqual({ circular: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularDeepEqual = createCustomEqual({\n circular: true,\n strict: true,\n});\n/**\n * Whether the items passed are shallowly-equal in value.\n */\nvar shallowEqual = createCustomEqual({\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value based on strict comparison\n */\nvar strictShallowEqual = createCustomEqual({\n strict: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references.\n */\nvar circularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n strict: true,\n});\n/**\n * Create a custom equality comparison method.\n *\n * This can be done to create very targeted comparisons in extreme hot-path scenarios\n * where the standard methods are not performant enough, but can also be used to provide\n * support for legacy environments that do not support expected features like\n * `RegExp.prototype.flags` out of the box.\n */\nfunction createCustomEqual(options) {\n if (options === void 0) { options = {}; }\n var _a = options.circular, circular = _a === void 0 ? false : _a, createCustomInternalComparator = options.createInternalComparator, createState = options.createState, _b = options.strict, strict = _b === void 0 ? false : _b;\n var config = createEqualityComparatorConfig(options);\n var comparator = createEqualityComparator(config);\n var equals = createCustomInternalComparator\n ? createCustomInternalComparator(comparator)\n : createInternalEqualityComparator(comparator);\n return createIsEqual({ circular: circular, comparator: comparator, createState: createState, equals: equals, strict: strict });\n}\n\nexport { circularDeepEqual, circularShallowEqual, createCustomEqual, deepEqual, sameValueZeroEqual, shallowEqual, strictCircularDeepEqual, strictCircularShallowEqual, strictDeepEqual, strictShallowEqual };\n//# sourceMappingURL=index.mjs.map\n","// There is a circular version https://www.npmjs.com/package/fast-equals#circulardeepequal that I\n// think allows comparing React refs (which have circular references in particular places that this\n// library would ignore). Maybe we can change to that version sometime if needed.\nimport { deepEqual as isEqualDeep } from 'fast-equals';\n\n/**\n * Check that two objects are deeply equal, comparing members of each object and such\n *\n * @param a The first object to compare\n * @param b The second object to compare\n *\n * WARNING: Objects like arrays from different iframes have different constructor function\n * references even if they do the same thing, so this deep equality comparison fails objects that\n * look the same but have different constructors because different constructors could produce\n * false positives in [a few specific\n * situations](https://github.com/planttheidea/fast-equals/blob/a41afc0a240ad5a472e47b53791e9be017f52281/src/comparator.ts#L96).\n * This means that two objects like arrays from different iframes that look the same will fail\n * this check. Please use some other means to check deep equality in those situations.\n *\n * Note: This deep equality check considers `undefined` values on keys of objects NOT to be equal to\n * not specifying the key at all. For example, `{ stuff: 3, things: undefined }` and `{ stuff: 3\n * }` are not considered equal in this case\n *\n * - For more information and examples, see [this\n * CodeSandbox](https://codesandbox.io/s/deepequallibrarycomparison-4g4kk4?file=/src/index.mjs).\n *\n * @returns True if a and b are deeply equal; false otherwise\n */\nexport default function deepEqual(a: unknown, b: unknown) {\n return isEqualDeep(a, b);\n}\n","/**\n * Converts a JavaScript value to a JSON string, changing `undefined` properties in the JavaScript\n * object to `null` properties in the JSON string.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A JavaScript value, usually an object or array, to be converted.\n * @param replacer A function that transforms the results. Note that all `undefined` values returned\n * by the replacer will be further transformed into `null` in the JSON string.\n * @param space Adds indentation, white space, and line break characters to the return-value JSON\n * text to make it easier to read. See the `space` parameter of `JSON.stringify` for more\n * details.\n */\nexport function serialize(\n value: unknown,\n replacer?: (this: unknown, key: string, value: unknown) => unknown,\n space?: string | number,\n): string {\n const undefinedReplacer = (replacerKey: string, replacerValue: unknown) => {\n let newValue = replacerValue;\n if (replacer) newValue = replacer(replacerKey, newValue);\n // All `undefined` values become `null` on the way from JS objects into JSON strings\n // eslint-disable-next-line no-null/no-null\n if (newValue === undefined) newValue = null;\n return newValue;\n };\n return JSON.stringify(value, undefinedReplacer, space);\n}\n\n/**\n * Converts a JSON string into a value, converting all `null` properties from JSON into `undefined`\n * in the returned JavaScript value/object.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A valid JSON string.\n * @param reviver A function that transforms the results. This function is called for each member of\n * the object. If a member contains nested objects, the nested objects are transformed before the\n * parent object is. Note that `null` values are converted into `undefined` values after the\n * reviver has run.\n */\nexport function deserialize(\n value: string,\n reviver?: (this: unknown, key: string, value: unknown) => unknown,\n // Need to use `any` instead of `unknown` here to match the signature of JSON.parse\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n // Helper function to replace `null` with `undefined` on a per property basis. This can't be done\n // with our own reviver because `JSON.parse` removes `undefined` properties from the return value.\n function replaceNull(obj: Record): Record {\n Object.keys(obj).forEach((key: string | number) => {\n // We only want to replace `null`, not other falsy values\n // eslint-disable-next-line no-null/no-null\n if (obj[key] === null) obj[key] = undefined;\n // If the property is an object, recursively call the helper function on it\n else if (typeof obj[key] === 'object')\n // Since the object came from a string, we know the keys will not be symbols\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n obj[key] = replaceNull(obj[key] as Record);\n });\n return obj;\n }\n\n const parsedObject = JSON.parse(value, reviver);\n // Explicitly convert the value 'null' that isn't stored as a property on an object to 'undefined'\n // eslint-disable-next-line no-null/no-null\n if (parsedObject === null) return undefined;\n if (typeof parsedObject === 'object') return replaceNull(parsedObject);\n return parsedObject;\n}\n\n/**\n * Check to see if the value is serializable without losing information\n *\n * @param value Value to test\n * @returns True if serializable; false otherwise\n *\n * Note: the values `undefined` and `null` are serializable (on their own or in an array), but\n * `null` values get transformed into `undefined` when serializing/deserializing.\n *\n * WARNING: This is inefficient right now as it stringifies, parses, stringifies, and === the value.\n * Please only use this if you need to\n *\n * DISCLAIMER: this does not successfully detect that values are not serializable in some cases:\n *\n * - Losses of removed properties like functions and `Map`s\n * - Class instances (not deserializable into class instances without special code)\n *\n * We intend to improve this in the future if it becomes important to do so. See [`JSON.stringify`\n * documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description)\n * for more information.\n */\nexport function isSerializable(value: unknown): boolean {\n try {\n const serializedValue = serialize(value);\n return serializedValue === serialize(deserialize(serializedValue));\n } catch (e) {\n return false;\n }\n}\n\n/**\n * HTML Encodes the provided string. Thanks to ChatGPT\n *\n * @param str String to HTML encode\n * @returns HTML-encoded string\n */\nexport const htmlEncode = (str: string): string =>\n str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\n/** Identifier for a string that will be localized in a menu based on the user's UI language */\nexport type LocalizeKey = `%${string}%`;\n\n/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */\nexport type ReferencedItem = `${string}.${string}`;\n\nexport type OrderedItem = {\n /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */\n order: number;\n};\n\nexport type OrderedExtensibleContainer = OrderedItem & {\n /** Determines whether other items can be added to this after it has been defined */\n isExtensible?: boolean;\n};\n\n/** Group of menu items that belongs in a column */\nexport type MenuGroupDetailsInColumn = OrderedExtensibleContainer & {\n /** ID of column in which this group resides */\n column: ReferencedItem;\n};\n\n/** Group of menu items that belongs in a submenu */\nexport type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & {\n /** ID of menu item hosting the submenu in which this group resides */\n menuItem: ReferencedItem;\n};\n\n/** Column that includes header text in a menu */\nexport type MenuColumnWithHeader = OrderedExtensibleContainer & {\n /** Key that represents the text of the header text of the column */\n label: LocalizeKey;\n};\n\nexport type MenuItemBase = OrderedItem & {\n /** Menu group to which this menu item belongs */\n group: ReferencedItem;\n /** Key that represents the text of this menu item to display */\n label: LocalizeKey;\n /** Key that represents words the platform should reference when users are searching for menu items */\n searchTerms?: LocalizeKey;\n /** Key that represents the text to display if a mouse pointer hovers over the menu item */\n tooltip?: LocalizeKey;\n /** Additional information provided by developers to help people who perform localization */\n localizeNotes: string;\n};\n\n/** Menu item that hosts a submenu */\nexport type MenuItemContainingSubmenu = MenuItemBase & {\n /** ID for this menu item that holds a submenu */\n id: ReferencedItem;\n};\n\n/** Menu item that runs a command */\nexport type MenuItemContainingCommand = MenuItemBase & {\n /** Name of the PAPI command to run when this menu item is selected. */\n command: ReferencedItem;\n /** Path to the icon to display after the menu text */\n iconPathAfter?: string;\n /** Path to the icon to display before the menu text */\n iconPathBefore?: string;\n};\n\n/**\n * Group of menu items that can be combined with other groups to form a single menu/submenu. Groups\n * are separated using a line within the menu/submenu.\n */\nexport type Groups = {\n /** Named menu group */\n [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu;\n};\n\n/** Group of columns that can be combined with other columns to form a multi-column menu */\nexport type ColumnsWithHeaders = {\n /** Named column of a menu */\n [property: ReferencedItem]: MenuColumnWithHeader;\n /** Defines whether columns can be added to this multi-column menu */\n isExtensible?: boolean;\n};\n\n/** Menu that contains a column without a header */\nexport type SingleColumnMenu = {\n /** Groups that belong in this menu */\n groups: Groups;\n /** List of menu items that belong in this menu */\n items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[];\n};\n\n/** Menu that contains multiple columns with headers */\nexport type MultiColumnMenu = SingleColumnMenu & {\n /** Columns that belong in this menu */\n columns: ColumnsWithHeaders;\n};\n\n/** Menus for one single web view */\nexport type WebViewMenu = {\n /** Indicates whether the platform default menus should be included for this webview */\n includeDefaults: boolean | undefined;\n /** Menu that opens when you click on the top left corner of a tab */\n topMenu: MultiColumnMenu | undefined;\n /** Menu that opens when you right click on the main body/area of a tab */\n contextMenu: SingleColumnMenu | undefined;\n};\n\n/** Menus for all web views */\nexport type WebViewMenus = {\n /** Named web view */\n [property: ReferencedItem]: WebViewMenu;\n};\n\n/** Platform.Bible menus */\nexport type PlatformMenus = {\n /** Top level menu for the application */\n mainMenu: MultiColumnMenu;\n /** Menus that apply per web view in the application */\n webViewMenus: WebViewMenus;\n /** Default context menu for web views that don't specify their own */\n defaultWebViewContextMenu: SingleColumnMenu;\n /** Default top menu for web views that don't specify their own */\n defaultWebViewTopMenu: MultiColumnMenu;\n};\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\n/** JSON schema object that aligns with the PlatformMenus type */\nexport const menuDocumentSchema = {\n title: 'Platform.Bible menus',\n type: 'object',\n properties: {\n mainMenu: {\n description: 'Top level menu for the application',\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewTopMenu: {\n description: \"Default top menu for web views that don't specify their own\",\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewContextMenu: {\n description: \"Default context menu for web views that don't specify their own\",\n $ref: '#/$defs/singleColumnMenu',\n },\n webViewMenus: {\n description: 'Menus that apply per web view in the application',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/menusForOneWebView',\n },\n },\n additionalProperties: false,\n },\n },\n required: ['mainMenu', 'defaultWebViewTopMenu', 'defaultWebViewContextMenu', 'webViewMenus'],\n additionalProperties: false,\n $defs: {\n localizeKey: {\n description:\n \"Identifier for a string that will be localized in a menu based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n },\n referencedItem: {\n description:\n 'Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)',\n type: 'string',\n pattern: '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$',\n },\n columnsWithHeaders: {\n description:\n 'Group of columns that can be combined with other columns to form a multi-column menu',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single column with a header string',\n type: 'object',\n properties: {\n label: {\n description: 'Header text for this this column in the UI',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n order: {\n description:\n 'Relative order of this column compared to other columns (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu groups to this column',\n type: 'boolean',\n },\n },\n required: ['label', 'order'],\n additionalProperties: false,\n },\n },\n properties: {\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add columns to this multi-column menu',\n type: 'boolean',\n },\n },\n },\n menuGroups: {\n description:\n 'Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single group that contains menu items',\n type: 'object',\n oneOf: [\n {\n properties: {\n column: {\n description:\n 'Column where this group belongs, not required for single column menus',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['order'],\n additionalProperties: false,\n },\n {\n properties: {\n menuItem: {\n description: 'Menu item that anchors the submenu where this group belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['menuItem', 'order'],\n additionalProperties: false,\n },\n ],\n },\n },\n additionalProperties: false,\n },\n menuItem: {\n description:\n 'Single item in a menu that can be clicked on to take an action or can be the parent of a submenu',\n type: 'object',\n oneOf: [\n {\n properties: {\n id: {\n description: 'ID for this menu item that holds a submenu',\n $ref: '#/$defs/referencedItem',\n },\n },\n required: ['id'],\n },\n {\n properties: {\n command: {\n description: 'Name of the PAPI command to run when this menu item is selected.',\n $ref: '#/$defs/referencedItem',\n },\n iconPathBefore: {\n description: 'Path to the icon to display before the menu text',\n type: 'string',\n },\n iconPathAfter: {\n description: 'Path to the icon to display after the menu text',\n type: 'string',\n },\n },\n required: ['command'],\n },\n ],\n properties: {\n label: {\n description: 'Key that represents the text of this menu item to display',\n $ref: '#/$defs/localizeKey',\n },\n tooltip: {\n description:\n 'Key that represents the text to display if a mouse pointer hovers over the menu item',\n $ref: '#/$defs/localizeKey',\n },\n searchTerms: {\n description:\n 'Key that represents additional words the platform should reference when users are searching for menu items',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n group: {\n description: 'Group to which this menu item belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this menu item compared to other menu items in the same group (sorted ascending)',\n type: 'number',\n },\n },\n required: ['label', 'group', 'order'],\n unevaluatedProperties: false,\n },\n groupsAndItems: {\n description: 'Core schema for a column',\n type: 'object',\n properties: {\n groups: {\n description: 'Groups that belong in this menu',\n $ref: '#/$defs/menuGroups',\n },\n items: {\n description: 'List of menu items that belong in this menu',\n type: 'array',\n items: { $ref: '#/$defs/menuItem' },\n uniqueItems: true,\n },\n },\n required: ['groups', 'items'],\n },\n singleColumnMenu: {\n description: 'Menu that contains a column without a header',\n type: 'object',\n allOf: [{ $ref: '#/$defs/groupsAndItems' }],\n unevaluatedProperties: false,\n },\n multiColumnMenu: {\n description: 'Menu that can contain multiple columns with headers',\n type: 'object',\n allOf: [\n { $ref: '#/$defs/groupsAndItems' },\n {\n properties: {\n columns: {\n description: 'Columns that belong in this menu',\n $ref: '#/$defs/columnsWithHeaders',\n },\n },\n required: ['columns'],\n },\n ],\n unevaluatedProperties: false,\n },\n menusForOneWebView: {\n description: 'Set of menus that are associated with a single tab',\n type: 'object',\n properties: {\n includeDefaults: {\n description:\n 'Indicates whether the platform default menus should be included for this webview',\n type: 'boolean',\n },\n topMenu: {\n description: 'Menu that opens when you click on the top left corner of a tab',\n $ref: '#/$defs/multiColumnMenu',\n },\n contextMenu: {\n description: 'Menu that opens when you right click on the main body/area of a tab',\n $ref: '#/$defs/singleColumnMenu',\n },\n },\n additionalProperties: false,\n },\n },\n};\n\nObject.freeze(menuDocumentSchema);\n"],"names":["AsyncVariable","variableName","rejectIfNotSettledWithinMS","__publicField","resolve","reject","value","throwIfAlreadySettled","reason","newGuid","s","isString","o","deepClone","obj","debounce","fn","delay","timeout","args","groupBy","items","keySelector","valueSelector","map","item","key","group","isErrorWithMessage","error","toErrorWithMessage","maybeError","getErrorMessage","wait","ms","waitForDuration","maxWaitTimeInMS","getAllObjectFunctionNames","objId","objectFunctionNames","property","objectPrototype","createSyncProxyForAsyncObject","getObject","objectToProxy","target","prop","DocumentCombinerEngine","baseDocument","options","documentName","document","previousDocumentVersion","documentToSet","potentialOutput","outputIteration","contribution","mergeObjects","areNonArrayObjects","values","allMatch","areArrayObjects","startingPoint","copyFrom","ignoreDuplicateProperties","retVal","UnsubscriberAsyncList","name","unsubscribers","unsubscriber","unsubs","results","unsubscriberSucceeded","index","PlatformEventEmitter","event","callback","callbackIndex","_a","Mutex","AsyncMutex","MutexMap","mutexID","scrBookData","FIRST_SCR_BOOK_NUM","LAST_SCR_BOOK_NUM","FIRST_SCR_CHAPTER_NUM","FIRST_SCR_VERSE_NUM","getChaptersForBook","bookNum","offsetBook","scrRef","offset","offsetChapter","offsetVerse","aggregateUnsubscribers","success","aggregateUnsubscriberAsyncs","unsubPromises","charRegex","astralRange","comboMarksRange","comboHalfMarksRange","comboSymbolsRange","comboMarksExtendedRange","comboMarksSupplementRange","comboRange","varRange","familyRange","astral","combo","fitz","modifier","nonAstral","regional","surrogatePair","zwj","blackFlag","family","optModifier","optVar","optJoin","seq","symbol","__importDefault","this","mod","dist","char_regex_1","require$$0","toArray","str","toArray_1","length","match","length_1","substring","begin","end","substring_1","substr","len","strLength","substr_1","limit","padString","padPosition","padRepeats","limit_1","indexOf","searchStr","pos","strArr","searchArr","finded","searchIndex","indexOf_1","at","string","charAt","codePointAt","endsWith","searchString","endPosition","lastIndexOfSearchString","lastIndexOf","includes","position","partialString","stringzIndexOf","validatedPosition","stringzLength","normalize","form","upperCaseForm","padEnd","targetLength","stringzLimit","padStart","correctSliceIndex","stringLength","slice","indexStart","indexEnd","newStart","newEnd","split","separator","splitLimit","result","regexSeparator","matches","currentIndex","matchIndex","matchLength","startsWith","stringzSubstr","stringzSubstring","stringzToArray","getOwnPropertyNames","getOwnPropertySymbols","hasOwnProperty","combineComparators","comparatorA","comparatorB","a","b","state","createIsCircular","areItemsEqual","cache","cachedA","cachedB","getStrictProperties","object","hasOwn","sameValueZeroEqual","OWNER","getOwnPropertyDescriptor","keys","areArraysEqual","areDatesEqual","areMapsEqual","matchedIndices","aIterable","aResult","bResult","bIterable","hasMatch","aKey","aValue","_b","bKey","bValue","areObjectsEqual","properties","areObjectsEqualStrict","descriptorA","descriptorB","arePrimitiveWrappersEqual","areRegExpsEqual","areSetsEqual","areTypedArraysEqual","ARGUMENTS_TAG","BOOLEAN_TAG","DATE_TAG","MAP_TAG","NUMBER_TAG","OBJECT_TAG","REG_EXP_TAG","SET_TAG","STRING_TAG","isArray","isTypedArray","assign","getTag","createEqualityComparator","constructor","tag","createEqualityComparatorConfig","circular","createCustomConfig","strict","config","areArraysEqual$1","areMapsEqual$1","areObjectsEqual$1","areSetsEqual$1","createInternalEqualityComparator","compare","_indexOrKeyA","_indexOrKeyB","_parentA","_parentB","createIsEqual","comparator","createState","equals","meta","deepEqual","createCustomEqual","createCustomInternalComparator","isEqualDeep","serialize","replacer","space","replacerKey","replacerValue","newValue","deserialize","reviver","replaceNull","parsedObject","isSerializable","serializedValue","htmlEncode","menuDocumentSchema"],"mappings":"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","x_google_ignoreList":[9,10,12]} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../src/async-variable.ts","../src/util.ts","../src/document-combiner-engine.ts","../src/unsubscriber-async-list.ts","../src/platform-event-emitter.model.ts","../src/mutex.ts","../src/mutex-map.ts","../src/scripture-util.ts","../src/unsubscriber.ts","../node_modules/char-regex/index.js","../node_modules/stringz/dist/index.js","../src/string-util.ts","../../../node_modules/fast-equals/dist/esm/index.mjs","../src/equality-checking.ts","../src/serialization.ts","../src/menus.model.ts"],"sourcesContent":["/** This class provides a convenient way for one task to wait on a variable that another task sets. */\nexport default class AsyncVariable {\n private readonly variableName: string;\n private readonly promiseToValue: Promise;\n private resolver: ((value: T) => void) | undefined;\n private rejecter: ((reason: string | undefined) => void) | undefined;\n\n /**\n * Creates an instance of the class\n *\n * @param variableName Name to use when logging about this variable\n * @param rejectIfNotSettledWithinMS Milliseconds to wait before verifying if the promise was\n * settled (resolved or rejected); will reject if it has not settled by that time. Use -1 if you\n * do not want a timeout at all.\n */\n constructor(variableName: string, rejectIfNotSettledWithinMS: number = 10000) {\n this.variableName = variableName;\n this.promiseToValue = new Promise((resolve, reject) => {\n this.resolver = resolve;\n this.rejecter = reject;\n });\n if (rejectIfNotSettledWithinMS > 0) {\n setTimeout(() => {\n if (this.rejecter) {\n this.rejecter(`Timeout reached when waiting for ${this.variableName} to settle`);\n this.complete();\n }\n }, rejectIfNotSettledWithinMS);\n }\n Object.seal(this);\n }\n\n /**\n * Get this variable's promise to a value. This always returns the same promise even after the\n * value has been resolved or rejected.\n *\n * @returns The promise for the value to be set\n */\n get promise(): Promise {\n return this.promiseToValue;\n }\n\n /**\n * A simple way to see if this variable's promise was resolved or rejected already\n *\n * @returns Whether the variable was already resolved or rejected\n */\n get hasSettled(): boolean {\n return Object.isFrozen(this);\n }\n\n /**\n * Resolve this variable's promise to the given value\n *\n * @param value This variable's promise will resolve to this value\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected\n */\n resolveToValue(value: T, throwIfAlreadySettled: boolean = false): void {\n if (this.resolver) {\n console.debug(`${this.variableName} is being resolved now`);\n this.resolver(value);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent resolution of ${this.variableName}`);\n }\n }\n\n /**\n * Reject this variable's promise for the value with the given reason\n *\n * @param reason This variable's promise will be rejected with this reason\n * @param throwIfAlreadySettled Determines whether to throw if the variable was already resolved\n * or rejected\n */\n rejectWithReason(reason: string, throwIfAlreadySettled: boolean = false): void {\n if (this.rejecter) {\n console.debug(`${this.variableName} is being rejected now`);\n this.rejecter(reason);\n this.complete();\n } else {\n if (throwIfAlreadySettled) throw Error(`${this.variableName} was already settled`);\n console.debug(`Ignoring subsequent rejection of ${this.variableName}`);\n }\n }\n\n /** Prevent any further updates to this variable */\n private complete(): void {\n this.resolver = undefined;\n this.rejecter = undefined;\n Object.freeze(this);\n }\n}\n","/** Collection of functions, objects, and types that are used as helpers in other services. */\n\n// Thanks to blubberdiblub at https://stackoverflow.com/a/68141099/217579\nexport function newGuid(): string {\n return '00-0-4-1-000'.replace(/[^-]/g, (s) =>\n // @ts-expect-error ts(2363) this works fine\n // eslint-disable-next-line no-bitwise\n (((Math.random() + ~~s) * 0x10000) >> s).toString(16).padStart(4, '0'),\n );\n}\n\n// thanks to DRAX at https://stackoverflow.com/a/9436948\n/**\n * Determine whether the object is a string\n *\n * @param o Object to determine if it is a string\n * @returns True if the object is a string; false otherwise\n */\nexport function isString(o: unknown): o is string {\n return typeof o === 'string' || o instanceof String;\n}\n\n/**\n * If deepClone isn't used when copying properties between objects, you may be left with dangling\n * references between the source and target of property copying operations.\n *\n * @param obj Object to clone\n * @returns Duplicate copy of `obj` without any references back to the original one\n */\nexport function deepClone(obj: T): T {\n // Assert the return type matches what is expected\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return JSON.parse(JSON.stringify(obj)) as T;\n}\n\n/**\n * Get a function that reduces calls to the function passed in\n *\n * @param fn The function to debounce\n * @param delay How much delay in milliseconds after the most recent call to the debounced function\n * to call the function\n * @returns Function that, when called, only calls the function passed in at maximum every delay ms\n */\n// We don't know the parameter types since this function can be anything\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function debounce void>(fn: T, delay = 300): T {\n if (isString(fn)) throw new Error('Tried to debounce a string! Could be XSS');\n let timeout: ReturnType;\n // Ensure the right return type.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return ((...args) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => fn(...args), delay);\n }) as T;\n}\n\n/**\n * Groups each item in the array of items into a map according to the keySelector\n *\n * @param items Array of items to group by\n * @param keySelector Function to run on each item to get the key for the group to which it belongs\n * @param valueSelector Function to run on each item to get the value it should have in the group\n * (like map function). If not provided, uses the item itself\n * @returns Map of keys to groups of values corresponding to each item\n */\nexport function groupBy(items: T[], keySelector: (item: T) => K): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector: (item: T, key: K) => V,\n): Map>;\nexport function groupBy(\n items: T[],\n keySelector: (item: T) => K,\n valueSelector?: (item: T, key: K) => V,\n): Map> {\n const map = new Map>();\n items.forEach((item) => {\n const key = keySelector(item);\n const group = map.get(key);\n const value = valueSelector ? valueSelector(item, key) : item;\n if (group) group.push(value);\n else map.set(key, [value]);\n });\n return map;\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\ntype ErrorWithMessage = {\n message: string;\n};\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\nfunction isErrorWithMessage(error: unknown): error is ErrorWithMessage {\n return (\n typeof error === 'object' &&\n // We're potentially dealing with objects we didn't create, so they might contain `null`\n // eslint-disable-next-line no-null/no-null\n error !== null &&\n 'message' in error &&\n // Type assert `error` to check it's `message`.\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n typeof (error as Record).message === 'string'\n );\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error from the object (useful for getting an error in a catch block)\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nfunction toErrorWithMessage(maybeError: unknown): ErrorWithMessage {\n if (isErrorWithMessage(maybeError)) return maybeError;\n\n try {\n return new Error(JSON.stringify(maybeError));\n } catch {\n // fallback in case there's an error stringifying the maybeError\n // like with circular references for example.\n return new Error(String(maybeError));\n }\n}\n\n// From https://kentcdodds.com/blog/get-a-catch-block-error-message-with-typescript\n/**\n * Function to get an error message from the object (useful for getting error message in a catch\n * block)\n *\n * @example `try {...} catch (e) { logger.info(getErrorMessage(e)) }`\n *\n * @param error Error object whose message to get\n * @returns Message of the error - if object has message, returns message. Otherwise tries to\n * stringify\n */\nexport function getErrorMessage(error: unknown) {\n return toErrorWithMessage(error).message;\n}\n\n/** Asynchronously waits for the specified number of milliseconds. (wraps setTimeout in a promise) */\nexport function wait(ms: number) {\n // eslint-disable-next-line no-promise-executor-return\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Runs the specified function and will timeout if it takes longer than the specified wait time\n *\n * @param fn The function to run\n * @param maxWaitTimeInMS The maximum amount of time to wait for the function to resolve\n * @returns Promise that resolves to the resolved value of the function or undefined if it ran\n * longer than the specified wait time\n */\nexport function waitForDuration(fn: () => Promise, maxWaitTimeInMS: number) {\n const timeout = wait(maxWaitTimeInMS).then(() => undefined);\n return Promise.any([timeout, fn()]);\n}\n\n/**\n * Get all functions on an object and its prototype chain (so we don't miss any class methods or any\n * object methods). Note that the functions on the final item in the prototype chain (i.e., Object)\n * are skipped to avoid including functions like `__defineGetter__`, `__defineSetter__`, `toString`,\n * etc.\n *\n * @param obj Object whose functions to get\n * @param objId Optional ID of the object to use for debug logging\n * @returns Array of all function names on an object\n */\n// Note: lodash has something that MIGHT do the same thing as this. Investigate for https://github.com/paranext/paranext-core/issues/134\nexport function getAllObjectFunctionNames(\n obj: { [property: string]: unknown },\n objId: string = 'obj',\n): Set {\n const objectFunctionNames = new Set();\n\n // Get all function properties directly defined on the object\n Object.getOwnPropertyNames(obj).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n console.debug(`Skipping ${property} on ${objId} due to error: ${error}`);\n }\n });\n\n // Walk up the prototype chain and get additional function properties, skipping the functions\n // provided by the final (Object) prototype\n let objectPrototype = Object.getPrototypeOf(obj);\n while (objectPrototype && Object.getPrototypeOf(objectPrototype)) {\n Object.getOwnPropertyNames(objectPrototype).forEach((property) => {\n try {\n if (typeof obj[property] === 'function') objectFunctionNames.add(property);\n } catch (error) {\n console.debug(`Skipping ${property} on ${objId}'s prototype due to error: ${error}`);\n }\n });\n objectPrototype = Object.getPrototypeOf(objectPrototype);\n }\n\n return objectFunctionNames;\n}\n\n/**\n * Creates a synchronous proxy for an asynchronous object. The proxy allows calling methods on an\n * object that is asynchronously fetched using a provided asynchronous function.\n *\n * @param getObject - A function that returns a promise resolving to the object whose asynchronous\n * methods to call.\n * @param objectToProxy - An optional object that is the object that is proxied. If a property is\n * accessed that does exist on this object, it will be returned. If a property is accessed that\n * does not exist on this object, it will be considered to be an asynchronous method called on the\n * object returned from getObject.\n * @returns A synchronous proxy for the asynchronous object.\n */\nexport function createSyncProxyForAsyncObject(\n getObject: (args?: unknown[]) => Promise,\n objectToProxy: Partial = {},\n): T {\n // objectToProxy will have only the synchronously accessed properties of T on it, and this proxy\n // makes the async methods that do not exist yet available synchronously so we have all of T\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n return new Proxy(objectToProxy as T, {\n get(target, prop) {\n // We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // @ts-expect-error 7053\n if (prop in target) return target[prop];\n return async (...args: unknown[]) => {\n // 7053: We don't have any type information for T, so we assume methodName exists on it and will let JavaScript throw if it doesn't exist\n // 2556: The args here are the parameters for the method specified\n // @ts-expect-error 7053 2556\n return (await getObject())[prop](...args);\n };\n },\n });\n}\n","import { deepClone } from './util';\n\nexport type JsonDocumentLike = { [key: string]: unknown };\n\n/**\n * Options for DocumentCombinerEngine objects\n *\n * - `copyDocuments`: If true, this instance will perform a deep copy of all provided documents before\n * composing the output. If false, then changes made to provided documents after they are\n * contributed will be reflected in the next time output is composed.\n * - `ignoreDuplicateProperties`: If true, then duplicate properties are skipped if they are seen in\n * contributed documents. If false, then throw when duplicate properties are seen in contributed\n * documents.\n */\nexport type DocumentCombinerOptions = {\n copyDocuments: boolean;\n ignoreDuplicateProperties: boolean;\n};\n\n/**\n * Base class for any code that wants to compose JSON documents (in the form of JS objects) together\n * into a single output document.\n */\nexport default abstract class DocumentCombinerEngine {\n protected baseDocument: JsonDocumentLike;\n protected readonly contributions = new Map();\n protected latestOutput: JsonDocumentLike | undefined;\n protected readonly options: DocumentCombinerOptions;\n\n /**\n * Create a DocumentCombinerEngine instance\n *\n * @param baseDocument This is the first document that will be used when composing the output\n * @param options Options used by this object when combining documents\n */\n protected constructor(baseDocument: JsonDocumentLike, options: DocumentCombinerOptions) {\n // Setting baseDocument redundantly because TS doesn't understand that updateBaseDocument does it\n this.baseDocument = baseDocument;\n this.options = options;\n this.updateBaseDocument(baseDocument);\n }\n\n /**\n * Update the starting document for composition process\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n * @returns Recalculated output document given the new starting state and existing other documents\n */\n updateBaseDocument(baseDocument: JsonDocumentLike): JsonDocumentLike | undefined {\n this.validateStartingDocument(baseDocument);\n this.baseDocument = this.options.copyDocuments ? deepClone(baseDocument) : baseDocument;\n return this.rebuild();\n }\n\n /**\n * Add or update one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n * @returns Recalculated output document given the new or updated contribution and existing other\n * documents\n */\n addOrUpdateContribution(\n documentName: string,\n document: JsonDocumentLike,\n ): JsonDocumentLike | undefined {\n this.validateContribution(documentName, document);\n const previousDocumentVersion = this.contributions.get(documentName);\n const documentToSet = this.options.copyDocuments && !!document ? deepClone(document) : document;\n this.contributions.set(documentName, documentToSet);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after adding/updating the contribution, put it back how it was\n if (previousDocumentVersion) this.contributions.set(documentName, previousDocumentVersion);\n else this.contributions.delete(documentName);\n throw new Error(`Error when setting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Delete one of the contribution documents for the composition process\n *\n * @param documentName Name of the contributed document to delete\n * @returns Recalculated output document given the remaining other documents\n */\n deleteContribution(documentName: string): object | undefined {\n const document = this.contributions.get(documentName);\n if (!document) throw new Error(`{documentKey} does not exist`);\n this.contributions.delete(documentName);\n try {\n return this.rebuild();\n } catch (error) {\n // If the output isn't valid after deleting the contribution, put it back and rethrow\n this.contributions.set(documentName, document);\n throw new Error(`Error when deleting the document named ${documentName}: ${error}`);\n }\n }\n\n /**\n * Run the document composition process given the starting document and all contributions. Throws\n * if the output document fails to validate properly.\n *\n * @returns Recalculated output document given the starting and contributed documents\n */\n rebuild(): JsonDocumentLike | undefined {\n // The starting document is the output if there are no other contributions\n if (this.contributions.size === 0) {\n let potentialOutput = deepClone(this.baseDocument);\n potentialOutput = this.transformFinalOutput(potentialOutput);\n this.validateOutput(potentialOutput);\n this.latestOutput = potentialOutput;\n return this.latestOutput;\n }\n\n // Compose the output by validating each document one at a time to pinpoint errors better\n let outputIteration = this.baseDocument;\n this.contributions.forEach((contribution: JsonDocumentLike) => {\n outputIteration = mergeObjects(\n outputIteration,\n contribution,\n this.options.ignoreDuplicateProperties,\n );\n this.validateOutput(outputIteration);\n });\n outputIteration = this.transformFinalOutput(outputIteration);\n this.validateOutput(outputIteration);\n this.latestOutput = outputIteration;\n return this.latestOutput;\n }\n\n /**\n * Throw an error if the provided document is not a valid starting document.\n *\n * @param baseDocument Base JSON document/JS object that all other documents are added to\n */\n protected abstract validateStartingDocument(baseDocument: JsonDocumentLike): void;\n\n /**\n * Throw an error if the provided document is not a valid contribution document.\n *\n * @param documentName Name of the contributed document to combine\n * @param document Content of the contributed document to combine\n */\n protected abstract validateContribution(documentName: string, document: JsonDocumentLike): void;\n\n /**\n * Throw an error if the provided output is not valid.\n *\n * @param output Output document that could potentially be returned to callers\n */\n protected abstract validateOutput(output: JsonDocumentLike): void;\n\n /**\n * Transform the document that is the composition of the base document and all contribution\n * documents. This is the last step that will be run prior to validation before\n * `this.latestOutput` is updated to the new output.\n *\n * @param finalOutput Final output document that could potentially be returned to callers. \"Final\"\n * means no further contribution documents will be merged.\n */\n protected abstract transformFinalOutput(finalOutput: JsonDocumentLike): JsonDocumentLike;\n}\n\n// #region Helper functions\n\n/**\n * Determines if the input values are objects but not arrays\n *\n * @param values Objects to check\n * @returns True if all the values are objects but not arrays\n */\nfunction areNonArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Determines if the input values are arrays\n *\n * @param value Objects to check\n * @returns True if the values are arrays\n */\nfunction areArrayObjects(...values: unknown[]): boolean {\n let allMatch = true;\n values.forEach((value: unknown) => {\n if (!value || typeof value !== 'object' || !Array.isArray(value)) allMatch = false;\n });\n return allMatch;\n}\n\n/**\n * Recursively merge the properties of one object (copyFrom) into another (startingPoint). Throws if\n * copyFrom would overwrite values already existing in startingPoint.\n *\n * @param startingPoint Object that is the starting point for the return value\n * @param copyFrom Object whose values are copied into the return value\n * @returns Object that is the combination of the two documents\n */\nfunction mergeObjects(\n startingPoint: JsonDocumentLike,\n copyFrom: JsonDocumentLike,\n ignoreDuplicateProperties: boolean,\n): JsonDocumentLike {\n const retVal = deepClone(startingPoint);\n if (!copyFrom) return retVal;\n\n Object.keys(copyFrom).forEach((key: string | number) => {\n if (Object.hasOwn(startingPoint, key)) {\n if (areNonArrayObjects(startingPoint[key], copyFrom[key])) {\n retVal[key] = mergeObjects(\n // We know these are objects from the `if` check\n /* eslint-disable no-type-assertion/no-type-assertion */\n startingPoint[key] as JsonDocumentLike,\n copyFrom[key] as JsonDocumentLike,\n ignoreDuplicateProperties,\n /* eslint-enable no-type-assertion/no-type-assertion */\n );\n } else if (areArrayObjects(startingPoint[key], copyFrom[key])) {\n // We know these are arrays because of the `else if` check\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n retVal[key] = (retVal[key] as Array).concat(copyFrom[key] as Array);\n } else if (!ignoreDuplicateProperties)\n throw new Error(`Cannot merge objects: key \"${key}\" already exists in the target object`);\n } else {\n retVal[key] = copyFrom[key];\n }\n });\n\n return retVal;\n}\n\n// #endregion\n","import { Dispose } from './disposal.model';\nimport { Unsubscriber, UnsubscriberAsync } from './unsubscriber';\n\n/** Simple collection for UnsubscriberAsync objects that also provides an easy way to run them. */\nexport default class UnsubscriberAsyncList {\n readonly unsubscribers = new Set();\n\n constructor(private name = 'Anonymous') {}\n\n /**\n * Add unsubscribers to the list. Note that duplicates are not added twice.\n *\n * @param unsubscribers - Objects that were returned from a registration process.\n */\n add(...unsubscribers: (UnsubscriberAsync | Unsubscriber | Dispose)[]) {\n unsubscribers.forEach((unsubscriber) => {\n if ('dispose' in unsubscriber) this.unsubscribers.add(unsubscriber.dispose);\n else this.unsubscribers.add(unsubscriber);\n });\n }\n\n /**\n * Run all unsubscribers added to this list and then clear the list.\n *\n * @returns `true` if all unsubscribers succeeded, `false` otherwise.\n */\n async runAllUnsubscribers(): Promise {\n const unsubs = [...this.unsubscribers].map((unsubscriber) => unsubscriber());\n const results = await Promise.all(unsubs);\n this.unsubscribers.clear();\n return results.every((unsubscriberSucceeded, index) => {\n if (!unsubscriberSucceeded)\n console.error(`UnsubscriberAsyncList ${this.name}: Unsubscriber at index ${index} failed!`);\n\n return unsubscriberSucceeded;\n });\n }\n}\n","/** Interfaces, classes, and functions related to events and event emitters */\n\nimport { Dispose } from './disposal.model';\nimport { PlatformEvent, PlatformEventHandler } from './platform-event';\n\n/**\n * Event manager - accepts subscriptions to an event and runs the subscription callbacks when the\n * event is emitted Use eventEmitter.event(callback) to subscribe to the event. Use\n * eventEmitter.emit(event) to run the subscriptions. Generally, this EventEmitter should be\n * private, and its event should be public. That way, the emitter is not publicized, but anyone can\n * subscribe to the event.\n */\nexport default class PlatformEventEmitter implements Dispose {\n /**\n * Subscribes a function to run when this event is emitted.\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n * @alias event\n */\n subscribe = this.event;\n\n /** All callback functions that will run when this event is emitted. Lazy loaded */\n private subscriptions?: PlatformEventHandler[];\n /** Event for listeners to subscribe to. Lazy loaded */\n private lazyEvent?: PlatformEvent;\n /** Whether this emitter has been disposed */\n private isDisposed = false;\n\n /**\n * Event for listeners to subscribe to. Subscribes a function to run when this event is emitted.\n * Use like `const unsubscriber = event(callback)`\n *\n * @param callback Function to run with the event when it is emitted\n * @returns Unsubscriber function to run to stop calling the passed-in function when the event is\n * emitted\n */\n get event(): PlatformEvent {\n this.assertNotDisposed();\n\n if (!this.lazyEvent) {\n this.lazyEvent = (callback) => {\n if (!callback || typeof callback !== 'function')\n throw new Error(`Event handler callback must be a function!`);\n\n // Initialize this.subscriptions if it does not exist\n if (!this.subscriptions) this.subscriptions = [];\n\n this.subscriptions.push(callback);\n\n return () => {\n if (!this.subscriptions) return false; // Did not find any subscribed callbacks\n\n const callbackIndex = this.subscriptions.indexOf(callback);\n\n if (callbackIndex < 0) return false; // Did not find this callback in the subscriptions\n\n // Remove the callback\n this.subscriptions.splice(callbackIndex, 1);\n\n return true;\n };\n };\n }\n return this.lazyEvent;\n }\n\n /** Disposes of this event, preparing it to release from memory */\n dispose = () => {\n return this.disposeFn();\n };\n\n /**\n * Runs the subscriptions for the event\n *\n * @param event Event data to provide to subscribed callbacks\n */\n emit = (event: T) => {\n // Do not do anything other than emitFn here. This emit is just binding `this` to emitFn\n this.emitFn(event);\n };\n\n /**\n * Function that runs the subscriptions for the event. Added here so children can override emit\n * and still call the base functionality. See NetworkEventEmitter.emit for example\n */\n protected emitFn(event: T) {\n this.assertNotDisposed();\n\n this.subscriptions?.forEach((callback) => callback(event));\n }\n\n /** Check to make sure this emitter is not disposed. Throw if it is */\n protected assertNotDisposed() {\n if (this.isDisposed) throw new Error('Emitter is disposed');\n }\n\n /**\n * Disposes of this event, preparing it to release from memory. Added here so children can\n * override emit and still call the base functionality.\n */\n protected disposeFn() {\n this.assertNotDisposed();\n\n this.isDisposed = true;\n this.subscriptions = undefined;\n this.lazyEvent = undefined;\n return Promise.resolve(true);\n }\n}\n","import { Mutex as AsyncMutex } from 'async-mutex';\n\n// Extending Mutex from async-mutex so we can add JSDoc\n\n/**\n * Class that allows calling asynchronous functions multiple times at once while only running one at\n * a time.\n *\n * @example\n *\n * ```typescript\n * const mutex = new Mutex();\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n *\n * mutex.runExclusive(async () => {\n * // Do some asynchronous stuff\n * console.log('These run one-at-a-time');\n * });\n * ```\n *\n * See [`async-mutex`](https://www.npmjs.com/package/async-mutex) for more information.\n */\nclass Mutex extends AsyncMutex {}\n\nexport default Mutex;\n","import Mutex from './mutex';\n\n/** Map of {@link Mutex}es that automatically (lazily) generates a new {@link Mutex} for any new key */\nclass MutexMap {\n private mutexesByID = new Map();\n\n get(mutexID: string): Mutex {\n let retVal = this.mutexesByID.get(mutexID);\n if (retVal) return retVal;\n\n retVal = new Mutex();\n this.mutexesByID.set(mutexID, retVal);\n return retVal;\n }\n}\n\nexport default MutexMap;\n","import { BookInfo, ScriptureReference } from './scripture.model';\n\nconst scrBookData: BookInfo[] = [\n { shortName: 'ERR', fullNames: ['ERROR'], chapters: -1 },\n { shortName: 'GEN', fullNames: ['Genesis'], chapters: 50 },\n { shortName: 'EXO', fullNames: ['Exodus'], chapters: 40 },\n { shortName: 'LEV', fullNames: ['Leviticus'], chapters: 27 },\n { shortName: 'NUM', fullNames: ['Numbers'], chapters: 36 },\n { shortName: 'DEU', fullNames: ['Deuteronomy'], chapters: 34 },\n { shortName: 'JOS', fullNames: ['Joshua'], chapters: 24 },\n { shortName: 'JDG', fullNames: ['Judges'], chapters: 21 },\n { shortName: 'RUT', fullNames: ['Ruth'], chapters: 4 },\n { shortName: '1SA', fullNames: ['1 Samuel'], chapters: 31 },\n { shortName: '2SA', fullNames: ['2 Samuel'], chapters: 24 },\n { shortName: '1KI', fullNames: ['1 Kings'], chapters: 22 },\n { shortName: '2KI', fullNames: ['2 Kings'], chapters: 25 },\n { shortName: '1CH', fullNames: ['1 Chronicles'], chapters: 29 },\n { shortName: '2CH', fullNames: ['2 Chronicles'], chapters: 36 },\n { shortName: 'EZR', fullNames: ['Ezra'], chapters: 10 },\n { shortName: 'NEH', fullNames: ['Nehemiah'], chapters: 13 },\n { shortName: 'EST', fullNames: ['Esther'], chapters: 10 },\n { shortName: 'JOB', fullNames: ['Job'], chapters: 42 },\n { shortName: 'PSA', fullNames: ['Psalm', 'Psalms'], chapters: 150 },\n { shortName: 'PRO', fullNames: ['Proverbs'], chapters: 31 },\n { shortName: 'ECC', fullNames: ['Ecclesiastes'], chapters: 12 },\n { shortName: 'SNG', fullNames: ['Song of Solomon', 'Song of Songs'], chapters: 8 },\n { shortName: 'ISA', fullNames: ['Isaiah'], chapters: 66 },\n { shortName: 'JER', fullNames: ['Jeremiah'], chapters: 52 },\n { shortName: 'LAM', fullNames: ['Lamentations'], chapters: 5 },\n { shortName: 'EZK', fullNames: ['Ezekiel'], chapters: 48 },\n { shortName: 'DAN', fullNames: ['Daniel'], chapters: 12 },\n { shortName: 'HOS', fullNames: ['Hosea'], chapters: 14 },\n { shortName: 'JOL', fullNames: ['Joel'], chapters: 3 },\n { shortName: 'AMO', fullNames: ['Amos'], chapters: 9 },\n { shortName: 'OBA', fullNames: ['Obadiah'], chapters: 1 },\n { shortName: 'JON', fullNames: ['Jonah'], chapters: 4 },\n { shortName: 'MIC', fullNames: ['Micah'], chapters: 7 },\n { shortName: 'NAM', fullNames: ['Nahum'], chapters: 3 },\n { shortName: 'HAB', fullNames: ['Habakkuk'], chapters: 3 },\n { shortName: 'ZEP', fullNames: ['Zephaniah'], chapters: 3 },\n { shortName: 'HAG', fullNames: ['Haggai'], chapters: 2 },\n { shortName: 'ZEC', fullNames: ['Zechariah'], chapters: 14 },\n { shortName: 'MAL', fullNames: ['Malachi'], chapters: 4 },\n { shortName: 'MAT', fullNames: ['Matthew'], chapters: 28 },\n { shortName: 'MRK', fullNames: ['Mark'], chapters: 16 },\n { shortName: 'LUK', fullNames: ['Luke'], chapters: 24 },\n { shortName: 'JHN', fullNames: ['John'], chapters: 21 },\n { shortName: 'ACT', fullNames: ['Acts'], chapters: 28 },\n { shortName: 'ROM', fullNames: ['Romans'], chapters: 16 },\n { shortName: '1CO', fullNames: ['1 Corinthians'], chapters: 16 },\n { shortName: '2CO', fullNames: ['2 Corinthians'], chapters: 13 },\n { shortName: 'GAL', fullNames: ['Galatians'], chapters: 6 },\n { shortName: 'EPH', fullNames: ['Ephesians'], chapters: 6 },\n { shortName: 'PHP', fullNames: ['Philippians'], chapters: 4 },\n { shortName: 'COL', fullNames: ['Colossians'], chapters: 4 },\n { shortName: '1TH', fullNames: ['1 Thessalonians'], chapters: 5 },\n { shortName: '2TH', fullNames: ['2 Thessalonians'], chapters: 3 },\n { shortName: '1TI', fullNames: ['1 Timothy'], chapters: 6 },\n { shortName: '2TI', fullNames: ['2 Timothy'], chapters: 4 },\n { shortName: 'TIT', fullNames: ['Titus'], chapters: 3 },\n { shortName: 'PHM', fullNames: ['Philemon'], chapters: 1 },\n { shortName: 'HEB', fullNames: ['Hebrews'], chapters: 13 },\n { shortName: 'JAS', fullNames: ['James'], chapters: 5 },\n { shortName: '1PE', fullNames: ['1 Peter'], chapters: 5 },\n { shortName: '2PE', fullNames: ['2 Peter'], chapters: 3 },\n { shortName: '1JN', fullNames: ['1 John'], chapters: 5 },\n { shortName: '2JN', fullNames: ['2 John'], chapters: 1 },\n { shortName: '3JN', fullNames: ['3 John'], chapters: 1 },\n { shortName: 'JUD', fullNames: ['Jude'], chapters: 1 },\n { shortName: 'REV', fullNames: ['Revelation'], chapters: 22 },\n];\n\nexport const FIRST_SCR_BOOK_NUM = 1;\nexport const LAST_SCR_BOOK_NUM = scrBookData.length - 1;\nexport const FIRST_SCR_CHAPTER_NUM = 1;\nexport const FIRST_SCR_VERSE_NUM = 1;\n\nexport const getChaptersForBook = (bookNum: number): number => {\n return scrBookData[bookNum]?.chapters ?? -1;\n};\n\nexport const offsetBook = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n bookNum: Math.max(FIRST_SCR_BOOK_NUM, Math.min(scrRef.bookNum + offset, LAST_SCR_BOOK_NUM)),\n chapterNum: 1,\n verseNum: 1,\n});\n\nexport const offsetChapter = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n chapterNum: Math.min(\n Math.max(FIRST_SCR_CHAPTER_NUM, scrRef.chapterNum + offset),\n getChaptersForBook(scrRef.bookNum),\n ),\n verseNum: 1,\n});\n\nexport const offsetVerse = (scrRef: ScriptureReference, offset: number): ScriptureReference => ({\n ...scrRef,\n verseNum: Math.max(FIRST_SCR_VERSE_NUM, scrRef.verseNum + offset),\n});\n","/** Function to run to dispose of something. Returns true if successfully unsubscribed */\nexport type Unsubscriber = () => boolean;\n\n/**\n * Returns an Unsubscriber function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers All unsubscribers to aggregate into one unsubscriber\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscribers = (unsubscribers: Unsubscriber[]): Unsubscriber => {\n return (...args) => {\n // Run the unsubscriber for each handler\n const unsubs = unsubscribers.map((unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return unsubs.every((success) => success);\n };\n};\n\n/**\n * Function to run to dispose of something that runs asynchronously. The promise resolves to true if\n * successfully unsubscribed\n */\nexport type UnsubscriberAsync = () => Promise;\n\n/**\n * Returns an UnsubscriberAsync function that combines all the unsubscribers passed in.\n *\n * @param unsubscribers - All unsubscribers to aggregate into one unsubscriber.\n * @returns Function that unsubscribes from all passed in unsubscribers when run\n */\nexport const aggregateUnsubscriberAsyncs = (\n unsubscribers: (UnsubscriberAsync | Unsubscriber)[],\n): UnsubscriberAsync => {\n return async (...args) => {\n // Run the unsubscriber for each handler\n const unsubPromises = unsubscribers.map(async (unsubscriber) => unsubscriber(...args));\n\n // If all the unsubscribers resolve to truthiness, we succeed\n return (await Promise.all(unsubPromises)).every((success) => success);\n };\n};\n","\"use strict\"\r\n\r\n// Based on: https://github.com/lodash/lodash/blob/6018350ac10d5ce6a5b7db625140b82aeab804df/.internal/unicodeSize.js\r\n\r\nmodule.exports = () => {\r\n\t// Used to compose unicode character classes.\r\n\tconst astralRange = \"\\\\ud800-\\\\udfff\"\r\n\tconst comboMarksRange = \"\\\\u0300-\\\\u036f\"\r\n\tconst comboHalfMarksRange = \"\\\\ufe20-\\\\ufe2f\"\r\n\tconst comboSymbolsRange = \"\\\\u20d0-\\\\u20ff\"\r\n\tconst comboMarksExtendedRange = \"\\\\u1ab0-\\\\u1aff\"\r\n\tconst comboMarksSupplementRange = \"\\\\u1dc0-\\\\u1dff\"\r\n\tconst comboRange = comboMarksRange + comboHalfMarksRange + comboSymbolsRange + comboMarksExtendedRange + comboMarksSupplementRange\r\n\tconst varRange = \"\\\\ufe0e\\\\ufe0f\"\r\n\tconst familyRange = \"\\\\uD83D\\\\uDC69\\\\uD83C\\\\uDFFB\\\\u200D\\\\uD83C\\\\uDF93\"\r\n\r\n\t// Used to compose unicode capture groups.\r\n\tconst astral = `[${astralRange}]`\r\n\tconst combo = `[${comboRange}]`\r\n\tconst fitz = \"\\\\ud83c[\\\\udffb-\\\\udfff]\"\r\n\tconst modifier = `(?:${combo}|${fitz})`\r\n\tconst nonAstral = `[^${astralRange}]`\r\n\tconst regional = \"(?:\\\\uD83C[\\\\uDDE6-\\\\uDDFF]){2}\"\r\n\tconst surrogatePair = \"[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]\"\r\n\tconst zwj = \"\\\\u200d\"\r\n\tconst blackFlag = \"(?:\\\\ud83c\\\\udff4\\\\udb40\\\\udc67\\\\udb40\\\\udc62\\\\udb40(?:\\\\udc65|\\\\udc73|\\\\udc77)\\\\udb40(?:\\\\udc6e|\\\\udc63|\\\\udc6c)\\\\udb40(?:\\\\udc67|\\\\udc74|\\\\udc73)\\\\udb40\\\\udc7f)\"\r\n\tconst family = `[${familyRange}]`\r\n\r\n\t// Used to compose unicode regexes.\r\n\tconst optModifier = `${modifier}?`\r\n\tconst optVar = `[${varRange}]?`\r\n\tconst optJoin = `(?:${zwj}(?:${[nonAstral, regional, surrogatePair].join(\"|\")})${optVar + optModifier})*`\r\n\tconst seq = optVar + optModifier + optJoin\r\n\tconst nonAstralCombo = `${nonAstral}${combo}?`\r\n\tconst symbol = `(?:${[nonAstralCombo, combo, regional, surrogatePair, astral, family].join(\"|\")})`\r\n\r\n\t// Used to match [String symbols](https://mathiasbynens.be/notes/javascript-unicode).\r\n\treturn new RegExp(`${blackFlag}|${fitz}(?=${fitz})|${symbol + seq}`, \"g\")\r\n}\r\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// @ts-ignore\nvar char_regex_1 = __importDefault(require(\"char-regex\"));\n/**\n * Converts a string to an array of string chars\n * @param {string} str The string to turn into array\n * @returns {string[]}\n */\nfunction toArray(str) {\n if (typeof str !== 'string') {\n throw new Error('A string is expected as input');\n }\n return str.match(char_regex_1.default()) || [];\n}\nexports.toArray = toArray;\n/**\n * Returns the length of a string\n *\n * @export\n * @param {string} str\n * @returns {number}\n */\nfunction length(str) {\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var match = str.match(char_regex_1.default());\n return match === null ? 0 : match.length;\n}\nexports.length = length;\n/**\n * Returns a substring by providing start and end position\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} end End position\n * @returns {string}\n */\nfunction substring(str, begin, end) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n // Even though negative numbers work here, theyre not in the spec\n if (typeof begin !== 'number' || begin < 0) {\n begin = 0;\n }\n if (typeof end === 'number' && end < 0) {\n end = 0;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substring = substring;\n/**\n * Returns a substring by providing start position and length\n *\n * @export\n * @param {string} str\n * @param {number} [begin=0] Starting position\n * @param {number} len Desired length\n * @returns {string}\n */\nfunction substr(str, begin, len) {\n if (begin === void 0) { begin = 0; }\n // Check for input\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n var strLength = length(str);\n // Fix type\n if (typeof begin !== 'number') {\n begin = parseInt(begin, 10);\n }\n // Return zero-length string if got oversize number.\n if (begin >= strLength) {\n return '';\n }\n // Calculating postive version of negative value.\n if (begin < 0) {\n begin += strLength;\n }\n var end;\n if (typeof len === 'undefined') {\n end = strLength;\n }\n else {\n // Fix type\n if (typeof len !== 'number') {\n len = parseInt(len, 10);\n }\n end = len >= 0 ? len + begin : begin;\n }\n var match = str.match(char_regex_1.default());\n if (!match)\n return '';\n return match.slice(begin, end).join('');\n}\nexports.substr = substr;\n/**\n * Enforces a string to be a certain length by\n * adding or removing characters\n *\n * @export\n * @param {string} str\n * @param {number} [limit=16] Limit\n * @param {string} [padString='#'] The Pad String\n * @param {string} [padPosition='right'] The Pad Position\n * @returns {string}\n */\nfunction limit(str, limit, padString, padPosition) {\n if (limit === void 0) { limit = 16; }\n if (padString === void 0) { padString = '#'; }\n if (padPosition === void 0) { padPosition = 'right'; }\n // Input should be a string, limit should be a number\n if (typeof str !== 'string' || typeof limit !== 'number') {\n throw new Error('Invalid arguments specified');\n }\n // Pad position should be either left or right\n if (['left', 'right'].indexOf(padPosition) === -1) {\n throw new Error('Pad position should be either left or right');\n }\n // Pad string can be anything, we convert it to string\n if (typeof padString !== 'string') {\n padString = String(padString);\n }\n // Calculate string length considering astral code points\n var strLength = length(str);\n if (strLength > limit) {\n return substring(str, 0, limit);\n }\n else if (strLength < limit) {\n var padRepeats = padString.repeat(limit - strLength);\n return padPosition === 'left' ? padRepeats + str : str + padRepeats;\n }\n return str;\n}\nexports.limit = limit;\n/**\n * Returns the index of the first occurrence of a given string\n *\n * @export\n * @param {string} str\n * @param {string} [searchStr] the string to search\n * @param {number} [pos] starting position\n * @returns {number}\n */\nfunction indexOf(str, searchStr, pos) {\n if (pos === void 0) { pos = 0; }\n if (typeof str !== 'string') {\n throw new Error('Input must be a string');\n }\n if (str === '') {\n if (searchStr === '') {\n return 0;\n }\n return -1;\n }\n // fix type\n pos = Number(pos);\n pos = isNaN(pos) ? 0 : pos;\n searchStr = String(searchStr);\n var strArr = toArray(str);\n if (pos >= strArr.length) {\n if (searchStr === '') {\n return strArr.length;\n }\n return -1;\n }\n if (searchStr === '') {\n return pos;\n }\n var searchArr = toArray(searchStr);\n var finded = false;\n var index;\n for (index = pos; index < strArr.length; index += 1) {\n var searchIndex = 0;\n while (searchIndex < searchArr.length &&\n searchArr[searchIndex] === strArr[index + searchIndex]) {\n searchIndex += 1;\n }\n if (searchIndex === searchArr.length &&\n searchArr[searchIndex - 1] === strArr[index + searchIndex - 1]) {\n finded = true;\n break;\n }\n }\n return finded ? index : -1;\n}\nexports.indexOf = indexOf;\n","import {\n indexOf as stringzIndexOf,\n substring as stringzSubstring,\n length as stringzLength,\n toArray as stringzToArray,\n limit as stringzLimit,\n substr as stringzSubstr,\n} from 'stringz';\n\n/**\n * This function mirrors the `at` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Finds the Unicode code point at the given index.\n *\n * @param string String to index\n * @param index Position of the character to be returned in range of -length(string) to\n * length(string)\n * @returns New string consisting of the Unicode code point located at the specified offset,\n * undefined if index is out of bounds\n */\nexport function at(string: string, index: number): string | undefined {\n if (index > stringLength(string) || index < -stringLength(string)) return undefined;\n return substr(string, index, 1);\n}\n\n/**\n * This function mirrors the `charAt` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a new string consisting of the single unicode code point at the given index.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns New string consisting of the Unicode code point located at the specified offset, empty\n * string if index is out of bounds\n */\nexport function charAt(string: string, index: number): string {\n if (index < 0 || index > stringLength(string) - 1) return '';\n return substr(string, index, 1);\n}\n\n/**\n * This function mirrors the `codePointAt` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a non-negative integer that is the Unicode code point value of the character starting at\n * the given index.\n *\n * @param string String to index\n * @param index Position of the string character to be returned, in the range of 0 to\n * length(string)-1\n * @returns Non-negative integer representing the code point value of the character at the given\n * index, or undefined if there is no element at that position\n */\nexport function codePointAt(string: string, index: number): number | undefined {\n if (index < 0 || index > stringLength(string) - 1) return undefined;\n return substr(string, index, 1).codePointAt(0);\n}\n\n/**\n * This function mirrors the `endsWith` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Determines whether a string ends with the characters of this string.\n *\n * @param string String to search through\n * @param searchString Characters to search for at the end of the string\n * @param endPosition End position where searchString is expected to be found. Default is\n * `length(string)`\n * @returns True if it ends with searchString, false if it does not\n */\nexport function endsWith(\n string: string,\n searchString: string,\n endPosition: number = stringLength(string),\n): boolean {\n const lastIndexOfSearchString = lastIndexOf(string, searchString);\n if (lastIndexOfSearchString === -1) return false;\n if (lastIndexOfSearchString + stringLength(searchString) !== endPosition) return false;\n return true;\n}\n\n/**\n * This function mirrors the `includes` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Performs a case-sensitive search to determine if searchString is found in string.\n *\n * @param string String to search through\n * @param searchString String to search for\n * @param position Position within the string to start searching for searchString. Default is `0`\n * @returns True if search string is found, false if it is not\n */\nexport function includes(string: string, searchString: string, position: number = 0): boolean {\n const partialString = substring(string, position);\n const indexOfSearchString = indexOf(partialString, searchString);\n if (indexOfSearchString === -1) return false;\n return true;\n}\n\n/**\n * This function mirrors the `indexOf` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the index of the first occurrence of a given string.\n *\n * @param string String to search through\n * @param searchString The string to search for\n * @param position Start of searching. Default is `0`\n * @returns Index of the first occurrence of a given string\n */\nexport function indexOf(\n string: string,\n searchString: string,\n position: number | undefined = 0,\n): number {\n return stringzIndexOf(string, searchString, position);\n}\n\n/**\n * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Searches this string and returns the index of the last occurrence of the specified substring.\n *\n * @param string String to search through\n * @param searchString Substring to search for\n * @param position The index at which to begin searching. If omitted, the search begins at the end\n * of the string. Default is `undefined`\n * @returns Index of the last occurrence of searchString found, or -1 if not found.\n */\nexport function lastIndexOf(string: string, searchString: string, position?: number): number {\n let validatedPosition = position === undefined ? stringLength(string) : position;\n\n if (validatedPosition < 0) {\n validatedPosition = 0;\n } else if (validatedPosition >= stringLength(string)) {\n validatedPosition = stringLength(string) - 1;\n }\n\n for (let index = validatedPosition; index >= 0; index--) {\n if (substr(string, index, stringLength(searchString)) === searchString) {\n return index;\n }\n }\n\n return -1;\n}\n\n/**\n * This function mirrors the `length` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the length of a string.\n *\n * @param string String to return the length for\n * @returns Number that is length of the starting string\n */\nexport function stringLength(string: string): number {\n return stringzLength(string);\n}\n\n/**\n * This function mirrors the `normalize` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns the Unicode Normalization Form of this string.\n *\n * @param string The starting string\n * @param form Form specifying the Unicode Normalization Form. Default is `'NFC'`\n * @returns A string containing the Unicode Normalization Form of the given string.\n */\nexport function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' | 'none'): string {\n const upperCaseForm = form.toUpperCase();\n if (upperCaseForm === 'NONE') {\n return string;\n }\n return string.normalize(upperCaseForm);\n}\n\n/**\n * This function mirrors the `padEnd` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the end of this string.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been padded.\n * If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too long to stay\n * within targetLength, it will be truncated. Default is `\" \"`\n * @returns String with appropriate padding at the end\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padEnd(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= stringLength(string)) return string;\n return stringzLimit(string, targetLength, padString, 'right');\n}\n\n/**\n * This function mirrors the `padStart` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Pads this string with another string (multiple times, if needed) until the resulting string\n * reaches the given length. The padding is applied from the start of this string.\n *\n * @param string String to add padding too\n * @param targetLength The length of the resulting string once the starting string has been padded.\n * If value is less than or equal to length(string), then string is returned as is.\n * @param padString The string to pad the current string with. If padString is too long to stay\n * within the targetLength, it will be truncated from the end. Default is `\" \"`\n * @returns String with of specified targetLength with padString applied from the start\n */\n// Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59\nexport function padStart(string: string, targetLength: number, padString: string = ' '): string {\n if (targetLength <= stringLength(string)) return string;\n return stringzLimit(string, targetLength, padString, 'left');\n}\n\n// This is a helper function that performs a correction on the slice index to make sure it\n// cannot go out of bounds\nfunction correctSliceIndex(length: number, index: number) {\n if (index > length) return length;\n if (index < -length) return 0;\n if (index < 0) return index + length;\n return index;\n}\n\n/**\n * This function mirrors the `slice` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Extracts a section of this string and returns it as a new string, without modifying the original\n * string.\n *\n * @param string The starting string\n * @param indexStart The index of the first character to include in the returned substring.\n * @param indexEnd The index of the first character to exclude from the returned substring.\n * @returns A new string containing the extracted section of the string.\n */\nexport function slice(string: string, indexStart: number, indexEnd?: number): string {\n const length: number = stringLength(string);\n if (\n indexStart > length ||\n (indexEnd &&\n ((indexStart > indexEnd &&\n !(indexStart > 0 && indexStart < length && indexEnd < 0 && indexEnd > -length)) ||\n indexEnd < -length ||\n (indexStart < 0 && indexStart > -length && indexEnd > 0)))\n )\n return '';\n\n const newStart = correctSliceIndex(length, indexStart);\n const newEnd = indexEnd ? correctSliceIndex(length, indexEnd) : undefined;\n\n return substring(string, newStart, newEnd);\n}\n\n/**\n * This function mirrors the `split` function from the JavaScript Standard String object. It handles\n * Unicode code points instead of UTF-16 character codes.\n *\n * Takes a pattern and divides the string into an ordered list of substrings by searching for the\n * pattern, puts these substrings into an array, and returns the array.\n *\n * @param string The string to split\n * @param separator The pattern describing where each split should occur\n * @param splitLimit Limit on the number of substrings to be included in the array. Splits the\n * string at each occurrence of specified separator, but stops when limit entries have been placed\n * in the array.\n * @returns An array of strings, split at each point where separator occurs in the starting string.\n * Returns undefined if separator is not found in string.\n */\nexport function split(string: string, separator: string | RegExp, splitLimit?: number): string[] {\n const result: string[] = [];\n\n if (splitLimit !== undefined && splitLimit <= 0) {\n return [string];\n }\n\n if (separator === '') return toArray(string).slice(0, splitLimit);\n\n let regexSeparator = separator;\n if (\n typeof separator === 'string' ||\n (separator instanceof RegExp && !includes(separator.flags, 'g'))\n ) {\n regexSeparator = new RegExp(separator, 'g');\n }\n\n const matches: RegExpMatchArray | null = string.match(regexSeparator);\n\n let currentIndex = 0;\n\n if (!matches) return [string];\n\n for (let index = 0; index < (splitLimit ? splitLimit - 1 : matches.length); index++) {\n const matchIndex = indexOf(string, matches[index], currentIndex);\n const matchLength = stringLength(matches[index]);\n\n result.push(substring(string, currentIndex, matchIndex));\n currentIndex = matchIndex + matchLength;\n\n if (splitLimit !== undefined && result.length === splitLimit) {\n break;\n }\n }\n\n result.push(substring(string, currentIndex));\n\n return result;\n}\n\n/**\n * This function mirrors the `startsWith` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Determines whether the string begins with the characters of a specified string, returning true or\n * false as appropriate.\n *\n * @param string String to search through\n * @param searchString The characters to be searched for at the start of this string.\n * @param position The start position at which searchString is expected to be found (the index of\n * searchString's first character). Default is `0`\n * @returns True if the given characters are found at the beginning of the string, including when\n * searchString is an empty string; otherwise, false.\n */\nexport function startsWith(string: string, searchString: string, position: number = 0): boolean {\n const indexOfSearchString = indexOf(string, searchString, position);\n if (indexOfSearchString !== position) return false;\n return true;\n}\n\n/**\n * This function mirrors the `substr` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a substring by providing start and length. This function is not exported because it is\n * considered deprecated, however it is still useful as a local helper function.\n *\n * @param string String to be divided\n * @param begin Start position. Default is `Start of string`\n * @param len Length of result. Default is `String length minus start parameter`. Default is `String\n * length minus start parameter`\n * @returns Substring from starting string\n */\nfunction substr(\n string: string,\n begin: number = 0,\n len: number = stringLength(string) - begin,\n): string {\n return stringzSubstr(string, begin, len);\n}\n\n/**\n * This function mirrors the `substring` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Returns a substring by providing start and end position.\n *\n * @param string String to be divided\n * @param begin Start position\n * @param end End position. Default is `End of string`\n * @returns Substring from starting string\n */\nexport function substring(\n string: string,\n begin: number,\n end: number = stringLength(string),\n): string {\n return stringzSubstring(string, begin, end);\n}\n\n/**\n * This function mirrors the `toArray` function from the JavaScript Standard String object. It\n * handles Unicode code points instead of UTF-16 character codes.\n *\n * Converts a string to an array of string characters.\n *\n * @param string String to convert to array\n * @returns An array of characters from the starting string\n */\nexport function toArray(string: string): string[] {\n return stringzToArray(string);\n}\n","var getOwnPropertyNames = Object.getOwnPropertyNames, getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\n/**\n * Combine two comparators into a single comparators.\n */\nfunction combineComparators(comparatorA, comparatorB) {\n return function isEqual(a, b, state) {\n return comparatorA(a, b, state) && comparatorB(a, b, state);\n };\n}\n/**\n * Wrap the provided `areItemsEqual` method to manage the circular state, allowing\n * for circular references to be safely included in the comparison without creating\n * stack overflows.\n */\nfunction createIsCircular(areItemsEqual) {\n return function isCircular(a, b, state) {\n if (!a || !b || typeof a !== 'object' || typeof b !== 'object') {\n return areItemsEqual(a, b, state);\n }\n var cache = state.cache;\n var cachedA = cache.get(a);\n var cachedB = cache.get(b);\n if (cachedA && cachedB) {\n return cachedA === b && cachedB === a;\n }\n cache.set(a, b);\n cache.set(b, a);\n var result = areItemsEqual(a, b, state);\n cache.delete(a);\n cache.delete(b);\n return result;\n };\n}\n/**\n * Get the properties to strictly examine, which include both own properties that are\n * not enumerable and symbol properties.\n */\nfunction getStrictProperties(object) {\n return getOwnPropertyNames(object).concat(getOwnPropertySymbols(object));\n}\n/**\n * Whether the object contains the property passed as an own property.\n */\nvar hasOwn = Object.hasOwn ||\n (function (object, property) {\n return hasOwnProperty.call(object, property);\n });\n/**\n * Whether the values passed are strictly equal or both NaN.\n */\nfunction sameValueZeroEqual(a, b) {\n return a || b ? a === b : a === b || (a !== a && b !== b);\n}\n\nvar OWNER = '_owner';\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor, keys = Object.keys;\n/**\n * Whether the arrays are equal in value.\n */\nfunction areArraysEqual(a, b, state) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (!state.equals(a[index], b[index], index, index, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the dates passed are equal in value.\n */\nfunction areDatesEqual(a, b) {\n return sameValueZeroEqual(a.getTime(), b.getTime());\n}\n/**\n * Whether the `Map`s are equal in value.\n */\nfunction areMapsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.entries();\n var index = 0;\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.entries();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n var _a = aResult.value, aKey = _a[0], aValue = _a[1];\n var _b = bResult.value, bKey = _b[0], bValue = _b[1];\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch =\n state.equals(aKey, bKey, index, matchIndex, a, b, state) &&\n state.equals(aValue, bValue, aKey, bKey, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n index++;\n }\n return true;\n}\n/**\n * Whether the objects are equal in value.\n */\nfunction areObjectsEqual(a, b, state) {\n var properties = keys(a);\n var index = properties.length;\n if (keys(b).length !== index) {\n return false;\n }\n var property;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property) ||\n !state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the objects are equal in value with strict property checking.\n */\nfunction areObjectsEqualStrict(a, b, state) {\n var properties = getStrictProperties(a);\n var index = properties.length;\n if (getStrictProperties(b).length !== index) {\n return false;\n }\n var property;\n var descriptorA;\n var descriptorB;\n // Decrementing `while` showed faster results than either incrementing or\n // decrementing `for` loop and than an incrementing `while` loop. Declarative\n // methods like `some` / `every` were not used to avoid incurring the garbage\n // cost of anonymous callbacks.\n while (index-- > 0) {\n property = properties[index];\n if (property === OWNER &&\n (a.$$typeof || b.$$typeof) &&\n a.$$typeof !== b.$$typeof) {\n return false;\n }\n if (!hasOwn(b, property)) {\n return false;\n }\n if (!state.equals(a[property], b[property], property, property, a, b, state)) {\n return false;\n }\n descriptorA = getOwnPropertyDescriptor(a, property);\n descriptorB = getOwnPropertyDescriptor(b, property);\n if ((descriptorA || descriptorB) &&\n (!descriptorA ||\n !descriptorB ||\n descriptorA.configurable !== descriptorB.configurable ||\n descriptorA.enumerable !== descriptorB.enumerable ||\n descriptorA.writable !== descriptorB.writable)) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the primitive wrappers passed are equal in value.\n */\nfunction arePrimitiveWrappersEqual(a, b) {\n return sameValueZeroEqual(a.valueOf(), b.valueOf());\n}\n/**\n * Whether the regexps passed are equal in value.\n */\nfunction areRegExpsEqual(a, b) {\n return a.source === b.source && a.flags === b.flags;\n}\n/**\n * Whether the `Set`s are equal in value.\n */\nfunction areSetsEqual(a, b, state) {\n if (a.size !== b.size) {\n return false;\n }\n var matchedIndices = {};\n var aIterable = a.values();\n var aResult;\n var bResult;\n while ((aResult = aIterable.next())) {\n if (aResult.done) {\n break;\n }\n var bIterable = b.values();\n var hasMatch = false;\n var matchIndex = 0;\n while ((bResult = bIterable.next())) {\n if (bResult.done) {\n break;\n }\n if (!hasMatch &&\n !matchedIndices[matchIndex] &&\n (hasMatch = state.equals(aResult.value, bResult.value, aResult.value, bResult.value, a, b, state))) {\n matchedIndices[matchIndex] = true;\n }\n matchIndex++;\n }\n if (!hasMatch) {\n return false;\n }\n }\n return true;\n}\n/**\n * Whether the TypedArray instances are equal in value.\n */\nfunction areTypedArraysEqual(a, b) {\n var index = a.length;\n if (b.length !== index) {\n return false;\n }\n while (index-- > 0) {\n if (a[index] !== b[index]) {\n return false;\n }\n }\n return true;\n}\n\nvar ARGUMENTS_TAG = '[object Arguments]';\nvar BOOLEAN_TAG = '[object Boolean]';\nvar DATE_TAG = '[object Date]';\nvar MAP_TAG = '[object Map]';\nvar NUMBER_TAG = '[object Number]';\nvar OBJECT_TAG = '[object Object]';\nvar REG_EXP_TAG = '[object RegExp]';\nvar SET_TAG = '[object Set]';\nvar STRING_TAG = '[object String]';\nvar isArray = Array.isArray;\nvar isTypedArray = typeof ArrayBuffer === 'function' && ArrayBuffer.isView\n ? ArrayBuffer.isView\n : null;\nvar assign = Object.assign;\nvar getTag = Object.prototype.toString.call.bind(Object.prototype.toString);\n/**\n * Create a comparator method based on the type-specific equality comparators passed.\n */\nfunction createEqualityComparator(_a) {\n var areArraysEqual = _a.areArraysEqual, areDatesEqual = _a.areDatesEqual, areMapsEqual = _a.areMapsEqual, areObjectsEqual = _a.areObjectsEqual, arePrimitiveWrappersEqual = _a.arePrimitiveWrappersEqual, areRegExpsEqual = _a.areRegExpsEqual, areSetsEqual = _a.areSetsEqual, areTypedArraysEqual = _a.areTypedArraysEqual;\n /**\n * compare the value of the two objects and return true if they are equivalent in values\n */\n return function comparator(a, b, state) {\n // If the items are strictly equal, no need to do a value comparison.\n if (a === b) {\n return true;\n }\n // If the items are not non-nullish objects, then the only possibility\n // of them being equal but not strictly is if they are both `NaN`. Since\n // `NaN` is uniquely not equal to itself, we can use self-comparison of\n // both objects, which is faster than `isNaN()`.\n if (a == null ||\n b == null ||\n typeof a !== 'object' ||\n typeof b !== 'object') {\n return a !== a && b !== b;\n }\n var constructor = a.constructor;\n // Checks are listed in order of commonality of use-case:\n // 1. Common complex object types (plain object, array)\n // 2. Common data values (date, regexp)\n // 3. Less-common complex object types (map, set)\n // 4. Less-common data values (promise, primitive wrappers)\n // Inherently this is both subjective and assumptive, however\n // when reviewing comparable libraries in the wild this order\n // appears to be generally consistent.\n // Constructors should match, otherwise there is potential for false positives\n // between class and subclass or custom object and POJO.\n if (constructor !== b.constructor) {\n return false;\n }\n // `isPlainObject` only checks against the object's own realm. Cross-realm\n // comparisons are rare, and will be handled in the ultimate fallback, so\n // we can avoid capturing the string tag.\n if (constructor === Object) {\n return areObjectsEqual(a, b, state);\n }\n // `isArray()` works on subclasses and is cross-realm, so we can avoid capturing\n // the string tag or doing an `instanceof` check.\n if (isArray(a)) {\n return areArraysEqual(a, b, state);\n }\n // `isTypedArray()` works on all possible TypedArray classes, so we can avoid\n // capturing the string tag or comparing against all possible constructors.\n if (isTypedArray != null && isTypedArray(a)) {\n return areTypedArraysEqual(a, b, state);\n }\n // Try to fast-path equality checks for other complex object types in the\n // same realm to avoid capturing the string tag. Strict equality is used\n // instead of `instanceof` because it is more performant for the common\n // use-case. If someone is subclassing a native class, it will be handled\n // with the string tag comparison.\n if (constructor === Date) {\n return areDatesEqual(a, b, state);\n }\n if (constructor === RegExp) {\n return areRegExpsEqual(a, b, state);\n }\n if (constructor === Map) {\n return areMapsEqual(a, b, state);\n }\n if (constructor === Set) {\n return areSetsEqual(a, b, state);\n }\n // Since this is a custom object, capture the string tag to determing its type.\n // This is reasonably performant in modern environments like v8 and SpiderMonkey.\n var tag = getTag(a);\n if (tag === DATE_TAG) {\n return areDatesEqual(a, b, state);\n }\n if (tag === REG_EXP_TAG) {\n return areRegExpsEqual(a, b, state);\n }\n if (tag === MAP_TAG) {\n return areMapsEqual(a, b, state);\n }\n if (tag === SET_TAG) {\n return areSetsEqual(a, b, state);\n }\n if (tag === OBJECT_TAG) {\n // The exception for value comparison is custom `Promise`-like class instances. These should\n // be treated the same as standard `Promise` objects, which means strict equality, and if\n // it reaches this point then that strict equality comparison has already failed.\n return (typeof a.then !== 'function' &&\n typeof b.then !== 'function' &&\n areObjectsEqual(a, b, state));\n }\n // If an arguments tag, it should be treated as a standard object.\n if (tag === ARGUMENTS_TAG) {\n return areObjectsEqual(a, b, state);\n }\n // As the penultimate fallback, check if the values passed are primitive wrappers. This\n // is very rare in modern JS, which is why it is deprioritized compared to all other object\n // types.\n if (tag === BOOLEAN_TAG || tag === NUMBER_TAG || tag === STRING_TAG) {\n return arePrimitiveWrappersEqual(a, b, state);\n }\n // If not matching any tags that require a specific type of comparison, then we hard-code false because\n // the only thing remaining is strict equality, which has already been compared. This is for a few reasons:\n // - Certain types that cannot be introspected (e.g., `WeakMap`). For these types, this is the only\n // comparison that can be made.\n // - For types that can be introspected, but rarely have requirements to be compared\n // (`ArrayBuffer`, `DataView`, etc.), the cost is avoided to prioritize the common\n // use-cases (may be included in a future release, if requested enough).\n // - For types that can be introspected but do not have an objective definition of what\n // equality is (`Error`, etc.), the subjective decision is to be conservative and strictly compare.\n // In all cases, these decisions should be reevaluated based on changes to the language and\n // common development practices.\n return false;\n };\n}\n/**\n * Create the configuration object used for building comparators.\n */\nfunction createEqualityComparatorConfig(_a) {\n var circular = _a.circular, createCustomConfig = _a.createCustomConfig, strict = _a.strict;\n var config = {\n areArraysEqual: strict\n ? areObjectsEqualStrict\n : areArraysEqual,\n areDatesEqual: areDatesEqual,\n areMapsEqual: strict\n ? combineComparators(areMapsEqual, areObjectsEqualStrict)\n : areMapsEqual,\n areObjectsEqual: strict\n ? areObjectsEqualStrict\n : areObjectsEqual,\n arePrimitiveWrappersEqual: arePrimitiveWrappersEqual,\n areRegExpsEqual: areRegExpsEqual,\n areSetsEqual: strict\n ? combineComparators(areSetsEqual, areObjectsEqualStrict)\n : areSetsEqual,\n areTypedArraysEqual: strict\n ? areObjectsEqualStrict\n : areTypedArraysEqual,\n };\n if (createCustomConfig) {\n config = assign({}, config, createCustomConfig(config));\n }\n if (circular) {\n var areArraysEqual$1 = createIsCircular(config.areArraysEqual);\n var areMapsEqual$1 = createIsCircular(config.areMapsEqual);\n var areObjectsEqual$1 = createIsCircular(config.areObjectsEqual);\n var areSetsEqual$1 = createIsCircular(config.areSetsEqual);\n config = assign({}, config, {\n areArraysEqual: areArraysEqual$1,\n areMapsEqual: areMapsEqual$1,\n areObjectsEqual: areObjectsEqual$1,\n areSetsEqual: areSetsEqual$1,\n });\n }\n return config;\n}\n/**\n * Default equality comparator pass-through, used as the standard `isEqual` creator for\n * use inside the built comparator.\n */\nfunction createInternalEqualityComparator(compare) {\n return function (a, b, _indexOrKeyA, _indexOrKeyB, _parentA, _parentB, state) {\n return compare(a, b, state);\n };\n}\n/**\n * Create the `isEqual` function used by the consuming application.\n */\nfunction createIsEqual(_a) {\n var circular = _a.circular, comparator = _a.comparator, createState = _a.createState, equals = _a.equals, strict = _a.strict;\n if (createState) {\n return function isEqual(a, b) {\n var _a = createState(), _b = _a.cache, cache = _b === void 0 ? circular ? new WeakMap() : undefined : _b, meta = _a.meta;\n return comparator(a, b, {\n cache: cache,\n equals: equals,\n meta: meta,\n strict: strict,\n });\n };\n }\n if (circular) {\n return function isEqual(a, b) {\n return comparator(a, b, {\n cache: new WeakMap(),\n equals: equals,\n meta: undefined,\n strict: strict,\n });\n };\n }\n var state = {\n cache: undefined,\n equals: equals,\n meta: undefined,\n strict: strict,\n };\n return function isEqual(a, b) {\n return comparator(a, b, state);\n };\n}\n\n/**\n * Whether the items passed are deeply-equal in value.\n */\nvar deepEqual = createCustomEqual();\n/**\n * Whether the items passed are deeply-equal in value based on strict comparison.\n */\nvar strictDeepEqual = createCustomEqual({ strict: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references.\n */\nvar circularDeepEqual = createCustomEqual({ circular: true });\n/**\n * Whether the items passed are deeply-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularDeepEqual = createCustomEqual({\n circular: true,\n strict: true,\n});\n/**\n * Whether the items passed are shallowly-equal in value.\n */\nvar shallowEqual = createCustomEqual({\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value based on strict comparison\n */\nvar strictShallowEqual = createCustomEqual({\n strict: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references.\n */\nvar circularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n});\n/**\n * Whether the items passed are shallowly-equal in value, including circular references,\n * based on strict comparison.\n */\nvar strictCircularShallowEqual = createCustomEqual({\n circular: true,\n createInternalComparator: function () { return sameValueZeroEqual; },\n strict: true,\n});\n/**\n * Create a custom equality comparison method.\n *\n * This can be done to create very targeted comparisons in extreme hot-path scenarios\n * where the standard methods are not performant enough, but can also be used to provide\n * support for legacy environments that do not support expected features like\n * `RegExp.prototype.flags` out of the box.\n */\nfunction createCustomEqual(options) {\n if (options === void 0) { options = {}; }\n var _a = options.circular, circular = _a === void 0 ? false : _a, createCustomInternalComparator = options.createInternalComparator, createState = options.createState, _b = options.strict, strict = _b === void 0 ? false : _b;\n var config = createEqualityComparatorConfig(options);\n var comparator = createEqualityComparator(config);\n var equals = createCustomInternalComparator\n ? createCustomInternalComparator(comparator)\n : createInternalEqualityComparator(comparator);\n return createIsEqual({ circular: circular, comparator: comparator, createState: createState, equals: equals, strict: strict });\n}\n\nexport { circularDeepEqual, circularShallowEqual, createCustomEqual, deepEqual, sameValueZeroEqual, shallowEqual, strictCircularDeepEqual, strictCircularShallowEqual, strictDeepEqual, strictShallowEqual };\n//# sourceMappingURL=index.mjs.map\n","// There is a circular version https://www.npmjs.com/package/fast-equals#circulardeepequal that I\n// think allows comparing React refs (which have circular references in particular places that this\n// library would ignore). Maybe we can change to that version sometime if needed.\nimport { deepEqual as isEqualDeep } from 'fast-equals';\n\n/**\n * Check that two objects are deeply equal, comparing members of each object and such\n *\n * @param a The first object to compare\n * @param b The second object to compare\n *\n * WARNING: Objects like arrays from different iframes have different constructor function\n * references even if they do the same thing, so this deep equality comparison fails objects that\n * look the same but have different constructors because different constructors could produce\n * false positives in [a few specific\n * situations](https://github.com/planttheidea/fast-equals/blob/a41afc0a240ad5a472e47b53791e9be017f52281/src/comparator.ts#L96).\n * This means that two objects like arrays from different iframes that look the same will fail\n * this check. Please use some other means to check deep equality in those situations.\n *\n * Note: This deep equality check considers `undefined` values on keys of objects NOT to be equal to\n * not specifying the key at all. For example, `{ stuff: 3, things: undefined }` and `{ stuff: 3\n * }` are not considered equal in this case\n *\n * - For more information and examples, see [this\n * CodeSandbox](https://codesandbox.io/s/deepequallibrarycomparison-4g4kk4?file=/src/index.mjs).\n *\n * @returns True if a and b are deeply equal; false otherwise\n */\nexport default function deepEqual(a: unknown, b: unknown) {\n return isEqualDeep(a, b);\n}\n","/**\n * Converts a JavaScript value to a JSON string, changing `undefined` properties in the JavaScript\n * object to `null` properties in the JSON string.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A JavaScript value, usually an object or array, to be converted.\n * @param replacer A function that transforms the results. Note that all `undefined` values returned\n * by the replacer will be further transformed into `null` in the JSON string.\n * @param space Adds indentation, white space, and line break characters to the return-value JSON\n * text to make it easier to read. See the `space` parameter of `JSON.stringify` for more\n * details.\n */\nexport function serialize(\n value: unknown,\n replacer?: (this: unknown, key: string, value: unknown) => unknown,\n space?: string | number,\n): string {\n const undefinedReplacer = (replacerKey: string, replacerValue: unknown) => {\n let newValue = replacerValue;\n if (replacer) newValue = replacer(replacerKey, newValue);\n // All `undefined` values become `null` on the way from JS objects into JSON strings\n // eslint-disable-next-line no-null/no-null\n if (newValue === undefined) newValue = null;\n return newValue;\n };\n return JSON.stringify(value, undefinedReplacer, space);\n}\n\n/**\n * Converts a JSON string into a value, converting all `null` properties from JSON into `undefined`\n * in the returned JavaScript value/object.\n *\n * WARNING: `null` values will become `undefined` values after passing through {@link serialize} then\n * {@link deserialize}. For example, `{ a: 1, b: undefined, c: null }` will become `{ a: 1, b:\n * undefined, c: undefined }`. If you are passing around user data that needs to retain `null`\n * values, you should wrap them yourself in a string before using this function. Alternatively, you\n * can write your own replacer that will preserve `null` in a way that you can recover later.\n *\n * @param value A valid JSON string.\n * @param reviver A function that transforms the results. This function is called for each member of\n * the object. If a member contains nested objects, the nested objects are transformed before the\n * parent object is. Note that `null` values are converted into `undefined` values after the\n * reviver has run.\n */\nexport function deserialize(\n value: string,\n reviver?: (this: unknown, key: string, value: unknown) => unknown,\n // Need to use `any` instead of `unknown` here to match the signature of JSON.parse\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n // Helper function to replace `null` with `undefined` on a per property basis. This can't be done\n // with our own reviver because `JSON.parse` removes `undefined` properties from the return value.\n function replaceNull(obj: Record): Record {\n Object.keys(obj).forEach((key: string | number) => {\n // We only want to replace `null`, not other falsy values\n // eslint-disable-next-line no-null/no-null\n if (obj[key] === null) obj[key] = undefined;\n // If the property is an object, recursively call the helper function on it\n else if (typeof obj[key] === 'object')\n // Since the object came from a string, we know the keys will not be symbols\n // eslint-disable-next-line no-type-assertion/no-type-assertion\n obj[key] = replaceNull(obj[key] as Record);\n });\n return obj;\n }\n\n const parsedObject = JSON.parse(value, reviver);\n // Explicitly convert the value 'null' that isn't stored as a property on an object to 'undefined'\n // eslint-disable-next-line no-null/no-null\n if (parsedObject === null) return undefined;\n if (typeof parsedObject === 'object') return replaceNull(parsedObject);\n return parsedObject;\n}\n\n/**\n * Check to see if the value is serializable without losing information\n *\n * @param value Value to test\n * @returns True if serializable; false otherwise\n *\n * Note: the values `undefined` and `null` are serializable (on their own or in an array), but\n * `null` values get transformed into `undefined` when serializing/deserializing.\n *\n * WARNING: This is inefficient right now as it stringifies, parses, stringifies, and === the value.\n * Please only use this if you need to\n *\n * DISCLAIMER: this does not successfully detect that values are not serializable in some cases:\n *\n * - Losses of removed properties like functions and `Map`s\n * - Class instances (not deserializable into class instances without special code)\n *\n * We intend to improve this in the future if it becomes important to do so. See [`JSON.stringify`\n * documentation](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#description)\n * for more information.\n */\nexport function isSerializable(value: unknown): boolean {\n try {\n const serializedValue = serialize(value);\n return serializedValue === serialize(deserialize(serializedValue));\n } catch (e) {\n return false;\n }\n}\n\n/**\n * HTML Encodes the provided string. Thanks to ChatGPT\n *\n * @param str String to HTML encode\n * @returns HTML-encoded string\n */\nexport const htmlEncode = (str: string): string =>\n str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n .replace(/\\//g, '/');\n","//----------------------------------------------------------------------------------------------\n// NOTE: If you change any of the types, make sure the JSON schema at the end of this file gets\n// changed so they align.\n//----------------------------------------------------------------------------------------------\n\n/** Identifier for a string that will be localized in a menu based on the user's UI language */\nexport type LocalizeKey = `%${string}%`;\n\n/** Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command) */\nexport type ReferencedItem = `${string}.${string}`;\n\nexport type OrderedItem = {\n /** Relative order of this item compared to other items in the same parent/scope (sorted ascending) */\n order: number;\n};\n\nexport type OrderedExtensibleContainer = OrderedItem & {\n /** Determines whether other items can be added to this after it has been defined */\n isExtensible?: boolean;\n};\n\n/** Group of menu items that belongs in a column */\nexport type MenuGroupDetailsInColumn = OrderedExtensibleContainer & {\n /** ID of column in which this group resides */\n column: ReferencedItem;\n};\n\n/** Group of menu items that belongs in a submenu */\nexport type MenuGroupDetailsInSubMenu = OrderedExtensibleContainer & {\n /** ID of menu item hosting the submenu in which this group resides */\n menuItem: ReferencedItem;\n};\n\n/** Column that includes header text in a menu */\nexport type MenuColumnWithHeader = OrderedExtensibleContainer & {\n /** Key that represents the text of the header text of the column */\n label: LocalizeKey;\n};\n\nexport type MenuItemBase = OrderedItem & {\n /** Menu group to which this menu item belongs */\n group: ReferencedItem;\n /** Key that represents the text of this menu item to display */\n label: LocalizeKey;\n /** Key that represents words the platform should reference when users are searching for menu items */\n searchTerms?: LocalizeKey;\n /** Key that represents the text to display if a mouse pointer hovers over the menu item */\n tooltip?: LocalizeKey;\n /** Additional information provided by developers to help people who perform localization */\n localizeNotes: string;\n};\n\n/** Menu item that hosts a submenu */\nexport type MenuItemContainingSubmenu = MenuItemBase & {\n /** ID for this menu item that holds a submenu */\n id: ReferencedItem;\n};\n\n/** Menu item that runs a command */\nexport type MenuItemContainingCommand = MenuItemBase & {\n /** Name of the PAPI command to run when this menu item is selected. */\n command: ReferencedItem;\n /** Path to the icon to display after the menu text */\n iconPathAfter?: string;\n /** Path to the icon to display before the menu text */\n iconPathBefore?: string;\n};\n\n/**\n * Group of menu items that can be combined with other groups to form a single menu/submenu. Groups\n * are separated using a line within the menu/submenu.\n */\nexport type Groups = {\n /** Named menu group */\n [property: ReferencedItem]: MenuGroupDetailsInColumn | MenuGroupDetailsInSubMenu;\n};\n\n/** Group of columns that can be combined with other columns to form a multi-column menu */\nexport type ColumnsWithHeaders = {\n /** Named column of a menu */\n [property: ReferencedItem]: MenuColumnWithHeader;\n /** Defines whether columns can be added to this multi-column menu */\n isExtensible?: boolean;\n};\n\n/** Menu that contains a column without a header */\nexport type SingleColumnMenu = {\n /** Groups that belong in this menu */\n groups: Groups;\n /** List of menu items that belong in this menu */\n items: (MenuItemContainingCommand | MenuItemContainingSubmenu)[];\n};\n\n/** Menu that contains multiple columns with headers */\nexport type MultiColumnMenu = SingleColumnMenu & {\n /** Columns that belong in this menu */\n columns: ColumnsWithHeaders;\n};\n\n/** Menus for one single web view */\nexport type WebViewMenu = {\n /** Indicates whether the platform default menus should be included for this webview */\n includeDefaults: boolean | undefined;\n /** Menu that opens when you click on the top left corner of a tab */\n topMenu: MultiColumnMenu | undefined;\n /** Menu that opens when you right click on the main body/area of a tab */\n contextMenu: SingleColumnMenu | undefined;\n};\n\n/** Menus for all web views */\nexport type WebViewMenus = {\n /** Named web view */\n [property: ReferencedItem]: WebViewMenu;\n};\n\n/** Platform.Bible menus */\nexport type PlatformMenus = {\n /** Top level menu for the application */\n mainMenu: MultiColumnMenu;\n /** Menus that apply per web view in the application */\n webViewMenus: WebViewMenus;\n /** Default context menu for web views that don't specify their own */\n defaultWebViewContextMenu: SingleColumnMenu;\n /** Default top menu for web views that don't specify their own */\n defaultWebViewTopMenu: MultiColumnMenu;\n};\n\n//----------------------------------------------------------------------------------------------\n// NOTE: If you change the schema below, make sure the TS types above get changed so they align.\n//----------------------------------------------------------------------------------------------\n/** JSON schema object that aligns with the PlatformMenus type */\nexport const menuDocumentSchema = {\n title: 'Platform.Bible menus',\n type: 'object',\n properties: {\n mainMenu: {\n description: 'Top level menu for the application',\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewTopMenu: {\n description: \"Default top menu for web views that don't specify their own\",\n $ref: '#/$defs/multiColumnMenu',\n },\n defaultWebViewContextMenu: {\n description: \"Default context menu for web views that don't specify their own\",\n $ref: '#/$defs/singleColumnMenu',\n },\n webViewMenus: {\n description: 'Menus that apply per web view in the application',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n $ref: '#/$defs/menusForOneWebView',\n },\n },\n additionalProperties: false,\n },\n },\n required: ['mainMenu', 'defaultWebViewTopMenu', 'defaultWebViewContextMenu', 'webViewMenus'],\n additionalProperties: false,\n $defs: {\n localizeKey: {\n description:\n \"Identifier for a string that will be localized in a menu based on the user's UI language\",\n type: 'string',\n pattern: '^%[\\\\w\\\\-\\\\.]+%$',\n },\n referencedItem: {\n description:\n 'Name of some UI element (i.e., tab, column, group, menu item) or some PAPI object (i.e., command)',\n type: 'string',\n pattern: '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$',\n },\n columnsWithHeaders: {\n description:\n 'Group of columns that can be combined with other columns to form a multi-column menu',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single column with a header string',\n type: 'object',\n properties: {\n label: {\n description: 'Header text for this this column in the UI',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n order: {\n description:\n 'Relative order of this column compared to other columns (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu groups to this column',\n type: 'boolean',\n },\n },\n required: ['label', 'order'],\n additionalProperties: false,\n },\n },\n properties: {\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add columns to this multi-column menu',\n type: 'boolean',\n },\n },\n },\n menuGroups: {\n description:\n 'Group of menu items that can be combined with other groups to form a single menu/submenu. Groups are separated using a line within the menu/submenu.',\n type: 'object',\n patternProperties: {\n '^[\\\\w\\\\-]+\\\\.[\\\\w\\\\-]+$': {\n description: 'Single group that contains menu items',\n type: 'object',\n oneOf: [\n {\n properties: {\n column: {\n description:\n 'Column where this group belongs, not required for single column menus',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['order'],\n additionalProperties: false,\n },\n {\n properties: {\n menuItem: {\n description: 'Menu item that anchors the submenu where this group belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this group compared to other groups in the same column or submenu (sorted ascending)',\n type: 'number',\n },\n isExtensible: {\n description:\n 'Defines whether contributions are allowed to add menu items to this menu group',\n type: 'boolean',\n },\n },\n required: ['menuItem', 'order'],\n additionalProperties: false,\n },\n ],\n },\n },\n additionalProperties: false,\n },\n menuItem: {\n description:\n 'Single item in a menu that can be clicked on to take an action or can be the parent of a submenu',\n type: 'object',\n oneOf: [\n {\n properties: {\n id: {\n description: 'ID for this menu item that holds a submenu',\n $ref: '#/$defs/referencedItem',\n },\n },\n required: ['id'],\n },\n {\n properties: {\n command: {\n description: 'Name of the PAPI command to run when this menu item is selected.',\n $ref: '#/$defs/referencedItem',\n },\n iconPathBefore: {\n description: 'Path to the icon to display before the menu text',\n type: 'string',\n },\n iconPathAfter: {\n description: 'Path to the icon to display after the menu text',\n type: 'string',\n },\n },\n required: ['command'],\n },\n ],\n properties: {\n label: {\n description: 'Key that represents the text of this menu item to display',\n $ref: '#/$defs/localizeKey',\n },\n tooltip: {\n description:\n 'Key that represents the text to display if a mouse pointer hovers over the menu item',\n $ref: '#/$defs/localizeKey',\n },\n searchTerms: {\n description:\n 'Key that represents additional words the platform should reference when users are searching for menu items',\n $ref: '#/$defs/localizeKey',\n },\n localizeNotes: {\n description:\n 'Additional information provided by developers to help people who perform localization',\n type: 'string',\n },\n group: {\n description: 'Group to which this menu item belongs',\n $ref: '#/$defs/referencedItem',\n },\n order: {\n description:\n 'Relative order of this menu item compared to other menu items in the same group (sorted ascending)',\n type: 'number',\n },\n },\n required: ['label', 'group', 'order'],\n unevaluatedProperties: false,\n },\n groupsAndItems: {\n description: 'Core schema for a column',\n type: 'object',\n properties: {\n groups: {\n description: 'Groups that belong in this menu',\n $ref: '#/$defs/menuGroups',\n },\n items: {\n description: 'List of menu items that belong in this menu',\n type: 'array',\n items: { $ref: '#/$defs/menuItem' },\n uniqueItems: true,\n },\n },\n required: ['groups', 'items'],\n },\n singleColumnMenu: {\n description: 'Menu that contains a column without a header',\n type: 'object',\n allOf: [{ $ref: '#/$defs/groupsAndItems' }],\n unevaluatedProperties: false,\n },\n multiColumnMenu: {\n description: 'Menu that can contain multiple columns with headers',\n type: 'object',\n allOf: [\n { $ref: '#/$defs/groupsAndItems' },\n {\n properties: {\n columns: {\n description: 'Columns that belong in this menu',\n $ref: '#/$defs/columnsWithHeaders',\n },\n },\n required: ['columns'],\n },\n ],\n unevaluatedProperties: false,\n },\n menusForOneWebView: {\n description: 'Set of menus that are associated with a single tab',\n type: 'object',\n properties: {\n includeDefaults: {\n description:\n 'Indicates whether the platform default menus should be included for this webview',\n type: 'boolean',\n },\n topMenu: {\n description: 'Menu that opens when you click on the top left corner of a tab',\n $ref: '#/$defs/multiColumnMenu',\n },\n contextMenu: {\n description: 'Menu that opens when you right click on the main body/area of a tab',\n $ref: '#/$defs/singleColumnMenu',\n },\n },\n additionalProperties: false,\n },\n },\n};\n\nObject.freeze(menuDocumentSchema);\n"],"names":["AsyncVariable","variableName","rejectIfNotSettledWithinMS","__publicField","resolve","reject","value","throwIfAlreadySettled","reason","newGuid","s","isString","o","deepClone","obj","debounce","fn","delay","timeout","args","groupBy","items","keySelector","valueSelector","map","item","key","group","isErrorWithMessage","error","toErrorWithMessage","maybeError","getErrorMessage","wait","ms","waitForDuration","maxWaitTimeInMS","getAllObjectFunctionNames","objId","objectFunctionNames","property","objectPrototype","createSyncProxyForAsyncObject","getObject","objectToProxy","target","prop","DocumentCombinerEngine","baseDocument","options","documentName","document","previousDocumentVersion","documentToSet","potentialOutput","outputIteration","contribution","mergeObjects","areNonArrayObjects","values","allMatch","areArrayObjects","startingPoint","copyFrom","ignoreDuplicateProperties","retVal","UnsubscriberAsyncList","name","unsubscribers","unsubscriber","unsubs","results","unsubscriberSucceeded","index","PlatformEventEmitter","event","callback","callbackIndex","_a","Mutex","AsyncMutex","MutexMap","mutexID","scrBookData","FIRST_SCR_BOOK_NUM","LAST_SCR_BOOK_NUM","FIRST_SCR_CHAPTER_NUM","FIRST_SCR_VERSE_NUM","getChaptersForBook","bookNum","offsetBook","scrRef","offset","offsetChapter","offsetVerse","aggregateUnsubscribers","success","aggregateUnsubscriberAsyncs","unsubPromises","charRegex","astralRange","comboMarksRange","comboHalfMarksRange","comboSymbolsRange","comboMarksExtendedRange","comboMarksSupplementRange","comboRange","varRange","familyRange","astral","combo","fitz","modifier","nonAstral","regional","surrogatePair","zwj","blackFlag","family","optModifier","optVar","optJoin","seq","symbol","__importDefault","this","mod","dist","char_regex_1","require$$0","toArray","str","toArray_1","length","match","length_1","substring","begin","end","substring_1","substr","len","strLength","substr_1","limit","padString","padPosition","padRepeats","limit_1","indexOf","searchStr","pos","strArr","searchArr","finded","searchIndex","indexOf_1","at","string","stringLength","charAt","codePointAt","endsWith","searchString","endPosition","lastIndexOfSearchString","lastIndexOf","includes","position","partialString","stringzIndexOf","validatedPosition","stringzLength","normalize","form","upperCaseForm","padEnd","targetLength","stringzLimit","padStart","correctSliceIndex","slice","indexStart","indexEnd","newStart","newEnd","split","separator","splitLimit","result","regexSeparator","matches","currentIndex","matchIndex","matchLength","startsWith","stringzSubstr","stringzSubstring","stringzToArray","getOwnPropertyNames","getOwnPropertySymbols","hasOwnProperty","combineComparators","comparatorA","comparatorB","a","b","state","createIsCircular","areItemsEqual","cache","cachedA","cachedB","getStrictProperties","object","hasOwn","sameValueZeroEqual","OWNER","getOwnPropertyDescriptor","keys","areArraysEqual","areDatesEqual","areMapsEqual","matchedIndices","aIterable","aResult","bResult","bIterable","hasMatch","aKey","aValue","_b","bKey","bValue","areObjectsEqual","properties","areObjectsEqualStrict","descriptorA","descriptorB","arePrimitiveWrappersEqual","areRegExpsEqual","areSetsEqual","areTypedArraysEqual","ARGUMENTS_TAG","BOOLEAN_TAG","DATE_TAG","MAP_TAG","NUMBER_TAG","OBJECT_TAG","REG_EXP_TAG","SET_TAG","STRING_TAG","isArray","isTypedArray","assign","getTag","createEqualityComparator","constructor","tag","createEqualityComparatorConfig","circular","createCustomConfig","strict","config","areArraysEqual$1","areMapsEqual$1","areObjectsEqual$1","areSetsEqual$1","createInternalEqualityComparator","compare","_indexOrKeyA","_indexOrKeyB","_parentA","_parentB","createIsEqual","comparator","createState","equals","meta","deepEqual","createCustomEqual","createCustomInternalComparator","isEqualDeep","serialize","replacer","space","replacerKey","replacerValue","newValue","deserialize","reviver","replaceNull","parsedObject","isSerializable","serializedValue","htmlEncode","menuDocumentSchema"],"mappings":";;;;AACA,MAAqBA,GAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcpC,YAAYC,GAAsBC,IAAqC,KAAO;AAb7D,IAAAC,EAAA;AACA,IAAAA,EAAA;AACT,IAAAA,EAAA;AACA,IAAAA,EAAA;AAWN,SAAK,eAAeF,GACpB,KAAK,iBAAiB,IAAI,QAAW,CAACG,GAASC,MAAW;AACxD,WAAK,WAAWD,GAChB,KAAK,WAAWC;AAAA,IAAA,CACjB,GACGH,IAA6B,KAC/B,WAAW,MAAM;AACf,MAAI,KAAK,aACP,KAAK,SAAS,oCAAoC,KAAK,YAAY,YAAY,GAC/E,KAAK,SAAS;AAAA,OAEfA,CAA0B,GAE/B,OAAO,KAAK,IAAI;AAAA,EAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,UAAsB;AACxB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,aAAsB;AACjB,WAAA,OAAO,SAAS,IAAI;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,eAAeI,GAAUC,IAAiC,IAAa;AACrE,QAAI,KAAK;AACP,cAAQ,MAAM,GAAG,KAAK,YAAY,wBAAwB,GAC1D,KAAK,SAASD,CAAK,GACnB,KAAK,SAAS;AAAA,SACT;AACD,UAAAC;AAAuB,cAAM,MAAM,GAAG,KAAK,YAAY,sBAAsB;AACjF,cAAQ,MAAM,qCAAqC,KAAK,YAAY,EAAE;AAAA,IACxE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,iBAAiBC,GAAgBD,IAAiC,IAAa;AAC7E,QAAI,KAAK;AACP,cAAQ,MAAM,GAAG,KAAK,YAAY,wBAAwB,GAC1D,KAAK,SAASC,CAAM,GACpB,KAAK,SAAS;AAAA,SACT;AACD,UAAAD;AAAuB,cAAM,MAAM,GAAG,KAAK,YAAY,sBAAsB;AACjF,cAAQ,MAAM,oCAAoC,KAAK,YAAY,EAAE;AAAA,IACvE;AAAA,EACF;AAAA;AAAA,EAGQ,WAAiB;AACvB,SAAK,WAAW,QAChB,KAAK,WAAW,QAChB,OAAO,OAAO,IAAI;AAAA,EACpB;AACF;AC1FO,SAASE,KAAkB;AAChC,SAAO,eAAe;AAAA,IAAQ;AAAA,IAAS,CAACC;AAAA;AAAA;AAAA,QAGnC,KAAK,WAAW,CAAC,CAACA,KAAK,SAAYA,GAAG,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA;AAAA,EAAA;AAEzE;AASO,SAASC,GAASC,GAAyB;AACzC,SAAA,OAAOA,KAAM,YAAYA,aAAa;AAC/C;AASO,SAASC,EAAaC,GAAW;AAGtC,SAAO,KAAK,MAAM,KAAK,UAAUA,CAAG,CAAC;AACvC;AAYgB,SAAAC,GAA6CC,GAAOC,IAAQ,KAAQ;AAClF,MAAIN,GAASK,CAAE;AAAS,UAAA,IAAI,MAAM,0CAA0C;AACxE,MAAAE;AAGJ,SAAQ,IAAIC,MAAS;AACnB,iBAAaD,CAAO,GACpBA,IAAU,WAAW,MAAMF,EAAG,GAAGG,CAAI,GAAGF,CAAK;AAAA,EAAA;AAEjD;AAiBgB,SAAAG,GACdC,GACAC,GACAC,GACsB;AAChB,QAAAC,wBAAU;AACV,SAAAH,EAAA,QAAQ,CAACI,MAAS;AAChB,UAAAC,IAAMJ,EAAYG,CAAI,GACtBE,IAAQH,EAAI,IAAIE,CAAG,GACnBpB,IAAQiB,IAAgBA,EAAcE,GAAMC,CAAG,IAAID;AACrD,IAAAE,IAAOA,EAAM,KAAKrB,CAAK,IACtBkB,EAAI,IAAIE,GAAK,CAACpB,CAAK,CAAC;AAAA,EAAA,CAC1B,GACMkB;AACT;AAQA,SAASI,GAAmBC,GAA2C;AACrE,SACE,OAAOA,KAAU;AAAA;AAAA,EAGjBA,MAAU,QACV,aAAaA;AAAA;AAAA,EAGb,OAAQA,EAAkC,WAAY;AAE1D;AAUA,SAASC,GAAmBC,GAAuC;AACjE,MAAIH,GAAmBG,CAAU;AAAU,WAAAA;AAEvC,MAAA;AACF,WAAO,IAAI,MAAM,KAAK,UAAUA,CAAU,CAAC;AAAA,EAAA,QACrC;AAGN,WAAO,IAAI,MAAM,OAAOA,CAAU,CAAC;AAAA,EACrC;AACF;AAaO,SAASC,GAAgBH,GAAgB;AACvC,SAAAC,GAAmBD,CAAK,EAAE;AACnC;AAGO,SAASI,GAAKC,GAAY;AAE/B,SAAO,IAAI,QAAc,CAAC9B,MAAY,WAAWA,GAAS8B,CAAE,CAAC;AAC/D;AAUgB,SAAAC,GAAyBnB,GAA4BoB,GAAyB;AAC5F,QAAMlB,IAAUe,GAAKG,CAAe,EAAE,KAAK,MAAA;AAAA,GAAe;AAC1D,SAAO,QAAQ,IAAI,CAAClB,GAASF,EAAA,CAAI,CAAC;AACpC;AAagB,SAAAqB,GACdvB,GACAwB,IAAgB,OACH;AACP,QAAAC,wBAA0B;AAGhC,SAAO,oBAAoBzB,CAAG,EAAE,QAAQ,CAAC0B,MAAa;AAChD,QAAA;AACE,MAAA,OAAO1B,EAAI0B,CAAQ,KAAM,cAAYD,EAAoB,IAAIC,CAAQ;AAAA,aAClEX,GAAO;AACd,cAAQ,MAAM,YAAYW,CAAQ,OAAOF,CAAK,kBAAkBT,CAAK,EAAE;AAAA,IACzE;AAAA,EAAA,CACD;AAIG,MAAAY,IAAkB,OAAO,eAAe3B,CAAG;AAC/C,SAAO2B,KAAmB,OAAO,eAAeA,CAAe;AAC7D,WAAO,oBAAoBA,CAAe,EAAE,QAAQ,CAACD,MAAa;AAC5D,UAAA;AACE,QAAA,OAAO1B,EAAI0B,CAAQ,KAAM,cAAYD,EAAoB,IAAIC,CAAQ;AAAA,eAClEX,GAAO;AACd,gBAAQ,MAAM,YAAYW,CAAQ,OAAOF,CAAK,8BAA8BT,CAAK,EAAE;AAAA,MACrF;AAAA,IAAA,CACD,GACiBY,IAAA,OAAO,eAAeA,CAAe;AAGlD,SAAAF;AACT;AAcO,SAASG,GACdC,GACAC,IAA4B,IACzB;AAII,SAAA,IAAI,MAAMA,GAAoB;AAAA,IACnC,IAAIC,GAAQC,GAAM;AAGhB,aAAIA,KAAQD,IAAeA,EAAOC,CAAI,IAC/B,UAAU3B,OAIP,MAAMwB,EAAU,GAAGG,CAAI,EAAE,GAAG3B,CAAI;AAAA,IAE5C;AAAA,EAAA,CACD;AACH;ACpNA,MAA8B4B,GAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYzC,YAAYC,GAAgCC,GAAkC;AAX9E,IAAA9C,EAAA;AACS,IAAAA,EAAA,2CAAoB;AAC7B,IAAAA,EAAA;AACS,IAAAA,EAAA;AAUjB,SAAK,eAAe6C,GACpB,KAAK,UAAUC,GACf,KAAK,mBAAmBD,CAAY;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmBA,GAA8D;AAC/E,gBAAK,yBAAyBA,CAAY,GAC1C,KAAK,eAAe,KAAK,QAAQ,gBAAgBnC,EAAUmC,CAAY,IAAIA,GACpE,KAAK;EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,wBACEE,GACAC,GAC8B;AACzB,SAAA,qBAAqBD,GAAcC,CAAQ;AAChD,UAAMC,IAA0B,KAAK,cAAc,IAAIF,CAAY,GAC7DG,IAAgB,KAAK,QAAQ,iBAAmBF,IAAWtC,EAAUsC,CAAQ,IAAIA;AAClF,SAAA,cAAc,IAAID,GAAcG,CAAa;AAC9C,QAAA;AACF,aAAO,KAAK;aACLxB,GAAO;AAEV,YAAAuB,IAA8B,KAAA,cAAc,IAAIF,GAAcE,CAAuB,IAC/E,KAAA,cAAc,OAAOF,CAAY,GACrC,IAAI,MAAM,yCAAyCA,CAAY,KAAKrB,CAAK,EAAE;AAAA,IACnF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,mBAAmBqB,GAA0C;AAC3D,UAAMC,IAAW,KAAK,cAAc,IAAID,CAAY;AACpD,QAAI,CAACC;AAAgB,YAAA,IAAI,MAAM,8BAA8B;AACxD,SAAA,cAAc,OAAOD,CAAY;AAClC,QAAA;AACF,aAAO,KAAK;aACLrB,GAAO;AAET,iBAAA,cAAc,IAAIqB,GAAcC,CAAQ,GACvC,IAAI,MAAM,0CAA0CD,CAAY,KAAKrB,CAAK,EAAE;AAAA,IACpF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,UAAwC;AAElC,QAAA,KAAK,cAAc,SAAS,GAAG;AAC7B,UAAAyB,IAAkBzC,EAAU,KAAK,YAAY;AAC/B,aAAAyC,IAAA,KAAK,qBAAqBA,CAAe,GAC3D,KAAK,eAAeA,CAAe,GACnC,KAAK,eAAeA,GACb,KAAK;AAAA,IACd;AAGA,QAAIC,IAAkB,KAAK;AACtB,gBAAA,cAAc,QAAQ,CAACC,MAAmC;AAC3C,MAAAD,IAAAE;AAAA,QAChBF;AAAA,QACAC;AAAA,QACA,KAAK,QAAQ;AAAA,MAAA,GAEf,KAAK,eAAeD,CAAe;AAAA,IAAA,CACpC,GACiBA,IAAA,KAAK,qBAAqBA,CAAe,GAC3D,KAAK,eAAeA,CAAe,GACnC,KAAK,eAAeA,GACb,KAAK;AAAA,EACd;AAiCF;AAUA,SAASG,MAAsBC,GAA4B;AACzD,MAAIC,IAAW;AACR,SAAAD,EAAA,QAAQ,CAACrD,MAAmB;AACjC,KAAI,CAACA,KAAS,OAAOA,KAAU,YAAY,MAAM,QAAQA,CAAK,OAAcsD,IAAA;AAAA,EAAA,CAC7E,GACMA;AACT;AAQA,SAASC,MAAmBF,GAA4B;AACtD,MAAIC,IAAW;AACR,SAAAD,EAAA,QAAQ,CAACrD,MAAmB;AAC7B,KAAA,CAACA,KAAS,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK,OAAcsD,IAAA;AAAA,EAAA,CAC9E,GACMA;AACT;AAUA,SAASH,EACPK,GACAC,GACAC,GACkB;AACZ,QAAAC,IAASpD,EAAUiD,CAAa;AACtC,SAAKC,KAEL,OAAO,KAAKA,CAAQ,EAAE,QAAQ,CAACrC,MAAyB;AACtD,QAAI,OAAO,OAAOoC,GAAepC,CAAG;AAClC,UAAIgC,GAAmBI,EAAcpC,CAAG,GAAGqC,EAASrC,CAAG,CAAC;AACtD,QAAAuC,EAAOvC,CAAG,IAAI+B;AAAA;AAAA;AAAA,UAGZK,EAAcpC,CAAG;AAAA,UACjBqC,EAASrC,CAAG;AAAA,UACZsC;AAAA;AAAA,QAAA;AAAA,eAGOH,GAAgBC,EAAcpC,CAAG,GAAGqC,EAASrC,CAAG,CAAC;AAGnD,QAAAuC,EAAAvC,CAAG,IAAKuC,EAAOvC,CAAG,EAAqB,OAAOqC,EAASrC,CAAG,CAAmB;AAAA,eAC3E,CAACsC;AACV,cAAM,IAAI,MAAM,8BAA8BtC,CAAG,uCAAuC;AAAA;AAEnF,MAAAuC,EAAAvC,CAAG,IAAIqC,EAASrC,CAAG;AAAA,EAC5B,CACD,GAEMuC;AACT;ACrOA,MAAqBC,GAAsB;AAAA,EAGzC,YAAoBC,IAAO,aAAa;AAF/B,IAAAhE,EAAA,2CAAoB;AAET,SAAA,OAAAgE;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOzC,OAAOC,GAA+D;AACtD,IAAAA,EAAA,QAAQ,CAACC,MAAiB;AACtC,MAAI,aAAaA,IAAmB,KAAA,cAAc,IAAIA,EAAa,OAAO,IAChE,KAAA,cAAc,IAAIA,CAAY;AAAA,IAAA,CACzC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,sBAAwC;AACtC,UAAAC,IAAS,CAAC,GAAG,KAAK,aAAa,EAAE,IAAI,CAACD,MAAiBA,EAAA,CAAc,GACrEE,IAAU,MAAM,QAAQ,IAAID,CAAM;AACxC,gBAAK,cAAc,SACZC,EAAQ,MAAM,CAACC,GAAuBC,OACtCD,KACH,QAAQ,MAAM,yBAAyB,KAAK,IAAI,2BAA2BC,CAAK,UAAU,GAErFD,EACR;AAAA,EACH;AACF;ACzBA,MAAqBE,GAA2C;AAAA,EAAhE;AASE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAvE,EAAA,mBAAY,KAAK;AAGT;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA;AAEA;AAAA,IAAAA,EAAA,oBAAa;AAyCrB;AAAA,IAAAA,EAAA,iBAAU,MACD,KAAK;AAQd;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,EAAA,cAAO,CAACwE,MAAa;AAEnB,WAAK,OAAOA,CAAK;AAAA,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA1CnB,IAAI,QAA0B;AAC5B,gBAAK,kBAAkB,GAElB,KAAK,cACH,KAAA,YAAY,CAACC,MAAa;AACzB,UAAA,CAACA,KAAY,OAAOA,KAAa;AAC7B,cAAA,IAAI,MAAM,4CAA4C;AAG9D,aAAK,KAAK,kBAAe,KAAK,gBAAgB,KAEzC,KAAA,cAAc,KAAKA,CAAQ,GAEzB,MAAM;AACX,YAAI,CAAC,KAAK;AAAsB,iBAAA;AAEhC,cAAMC,IAAgB,KAAK,cAAc,QAAQD,CAAQ;AAEzD,eAAIC,IAAgB,IAAU,MAGzB,KAAA,cAAc,OAAOA,GAAe,CAAC,GAEnC;AAAA,MAAA;AAAA,IACT,IAGG,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBU,OAAOF,GAAU;;AACzB,SAAK,kBAAkB,IAEvBG,IAAA,KAAK,kBAAL,QAAAA,EAAoB,QAAQ,CAACF,MAAaA,EAASD,CAAK;AAAA,EAC1D;AAAA;AAAA,EAGU,oBAAoB;AAC5B,QAAI,KAAK;AAAkB,YAAA,IAAI,MAAM,qBAAqB;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMU,YAAY;AACpB,gBAAK,kBAAkB,GAEvB,KAAK,aAAa,IAClB,KAAK,gBAAgB,QACrB,KAAK,YAAY,QACV,QAAQ,QAAQ,EAAI;AAAA,EAC7B;AACF;ACpFA,MAAMI,WAAcC,GAAW;AAAC;ACvBhC,MAAMC,GAAS;AAAA,EAAf;AACU,IAAA9E,EAAA,yCAAkB;;EAE1B,IAAI+E,GAAwB;AAC1B,QAAIjB,IAAS,KAAK,YAAY,IAAIiB,CAAO;AACrC,WAAAjB,MAEJA,IAAS,IAAIc,MACR,KAAA,YAAY,IAAIG,GAASjB,CAAM,GAC7BA;AAAA,EACT;AACF;ACZA,MAAMkB,IAA0B;AAAA,EAC9B,EAAE,WAAW,OAAO,WAAW,CAAC,OAAO,GAAG,UAAU,GAAG;AAAA,EACvD,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,GAAG;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,GAAG;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,WAAW,GAAG,UAAU,GAAG;AAAA,EAC3D,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,GAAG;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,aAAa,GAAG,UAAU,GAAG;AAAA,EAC7D,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,GAAG;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,GAAG;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,EAAE;AAAA,EACrD,EAAE,WAAW,OAAO,WAAW,CAAC,UAAU,GAAG,UAAU,GAAG;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,UAAU,GAAG,UAAU,GAAG;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,GAAG;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,GAAG;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,cAAc,GAAG,UAAU,GAAG;AAAA,EAC9D,EAAE,WAAW,OAAO,WAAW,CAAC,cAAc,GAAG,UAAU,GAAG;AAAA,EAC9D,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,GAAG;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,UAAU,GAAG,UAAU,GAAG;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,GAAG;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,KAAK,GAAG,UAAU,GAAG;AAAA,EACrD,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,QAAQ,GAAG,UAAU,IAAI;AAAA,EAClE,EAAE,WAAW,OAAO,WAAW,CAAC,UAAU,GAAG,UAAU,GAAG;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,cAAc,GAAG,UAAU,GAAG;AAAA,EAC9D,EAAE,WAAW,OAAO,WAAW,CAAC,mBAAmB,eAAe,GAAG,UAAU,EAAE;AAAA,EACjF,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,GAAG;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,UAAU,GAAG,UAAU,GAAG;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,cAAc,GAAG,UAAU,EAAE;AAAA,EAC7D,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,GAAG;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,GAAG;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,OAAO,GAAG,UAAU,GAAG;AAAA,EACvD,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,EAAE;AAAA,EACrD,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,EAAE;AAAA,EACrD,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,EAAE;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,OAAO,GAAG,UAAU,EAAE;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,OAAO,GAAG,UAAU,EAAE;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,OAAO,GAAG,UAAU,EAAE;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,UAAU,GAAG,UAAU,EAAE;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,WAAW,GAAG,UAAU,EAAE;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,EAAE;AAAA,EACvD,EAAE,WAAW,OAAO,WAAW,CAAC,WAAW,GAAG,UAAU,GAAG;AAAA,EAC3D,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,EAAE;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,GAAG;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,GAAG;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,GAAG;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,GAAG;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,GAAG;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,GAAG;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,eAAe,GAAG,UAAU,GAAG;AAAA,EAC/D,EAAE,WAAW,OAAO,WAAW,CAAC,eAAe,GAAG,UAAU,GAAG;AAAA,EAC/D,EAAE,WAAW,OAAO,WAAW,CAAC,WAAW,GAAG,UAAU,EAAE;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,WAAW,GAAG,UAAU,EAAE;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,aAAa,GAAG,UAAU,EAAE;AAAA,EAC5D,EAAE,WAAW,OAAO,WAAW,CAAC,YAAY,GAAG,UAAU,EAAE;AAAA,EAC3D,EAAE,WAAW,OAAO,WAAW,CAAC,iBAAiB,GAAG,UAAU,EAAE;AAAA,EAChE,EAAE,WAAW,OAAO,WAAW,CAAC,iBAAiB,GAAG,UAAU,EAAE;AAAA,EAChE,EAAE,WAAW,OAAO,WAAW,CAAC,WAAW,GAAG,UAAU,EAAE;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,WAAW,GAAG,UAAU,EAAE;AAAA,EAC1D,EAAE,WAAW,OAAO,WAAW,CAAC,OAAO,GAAG,UAAU,EAAE;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,UAAU,GAAG,UAAU,EAAE;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,GAAG;AAAA,EACzD,EAAE,WAAW,OAAO,WAAW,CAAC,OAAO,GAAG,UAAU,EAAE;AAAA,EACtD,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,EAAE;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,SAAS,GAAG,UAAU,EAAE;AAAA,EACxD,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,EAAE;AAAA,EACvD,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,EAAE;AAAA,EACvD,EAAE,WAAW,OAAO,WAAW,CAAC,QAAQ,GAAG,UAAU,EAAE;AAAA,EACvD,EAAE,WAAW,OAAO,WAAW,CAAC,MAAM,GAAG,UAAU,EAAE;AAAA,EACrD,EAAE,WAAW,OAAO,WAAW,CAAC,YAAY,GAAG,UAAU,GAAG;AAC9D,GAEaC,KAAqB,GACrBC,KAAoBF,EAAY,SAAS,GACzCG,KAAwB,GACxBC,KAAsB,GAEtBC,KAAqB,CAACC,MAA4B;;AACtD,WAAAX,IAAAK,EAAYM,CAAO,MAAnB,gBAAAX,EAAsB,aAAY;AAC3C,GAEaY,KAAa,CAACC,GAA4BC,OAAwC;AAAA,EAC7F,SAAS,KAAK,IAAIR,IAAoB,KAAK,IAAIO,EAAO,UAAUC,GAAQP,EAAiB,CAAC;AAAA,EAC1F,YAAY;AAAA,EACZ,UAAU;AACZ,IAEaQ,KAAgB,CAACF,GAA4BC,OAAwC;AAAA,EAChG,GAAGD;AAAA,EACH,YAAY,KAAK;AAAA,IACf,KAAK,IAAIL,IAAuBK,EAAO,aAAaC,CAAM;AAAA,IAC1DJ,GAAmBG,EAAO,OAAO;AAAA,EACnC;AAAA,EACA,UAAU;AACZ,IAEaG,KAAc,CAACH,GAA4BC,OAAwC;AAAA,EAC9F,GAAGD;AAAA,EACH,UAAU,KAAK,IAAIJ,IAAqBI,EAAO,WAAWC,CAAM;AAClE,IC1FaG,KAAyB,CAAC3B,MAC9B,IAAIjD,MAEMiD,EAAc,IAAI,CAACC,MAAiBA,EAAa,GAAGlD,CAAI,CAAC,EAG1D,MAAM,CAAC6E,MAAYA,CAAO,GAgB/BC,KAA8B,CACzC7B,MAEO,UAAUjD,MAAS;AAElB,QAAA+E,IAAgB9B,EAAc,IAAI,OAAOC,MAAiBA,EAAa,GAAGlD,CAAI,CAAC;AAG7E,UAAA,MAAM,QAAQ,IAAI+E,CAAa,GAAG,MAAM,CAACF,MAAYA,CAAO;AAAA;oJCnCxEG,KAAiB,MAAM;AAEtB,QAAMC,IAAc,mBACdC,IAAkB,mBAClBC,IAAsB,mBACtBC,IAAoB,mBACpBC,IAA0B,mBAC1BC,IAA4B,mBAC5BC,IAAaL,IAAkBC,IAAsBC,IAAoBC,IAA0BC,GACnGE,IAAW,kBACXC,IAAc,qDAGdC,IAAS,IAAIT,CAAW,KACxBU,IAAQ,IAAIJ,CAAU,KACtBK,IAAO,4BACPC,IAAW,MAAMF,CAAK,IAAIC,CAAI,KAC9BE,IAAY,KAAKb,CAAW,KAC5Bc,IAAW,mCACXC,IAAgB,sCAChBC,IAAM,WACNC,IAAY,sKACZC,IAAS,IAAIV,CAAW,KAGxBW,IAAc,GAAGP,CAAQ,KACzBQ,IAAS,IAAIb,CAAQ,MACrBc,IAAU,MAAML,CAAG,MAAM,CAACH,GAAWC,GAAUC,CAAa,EAAE,KAAK,GAAG,CAAC,IAAIK,IAASD,CAAW,MAC/FG,IAAMF,IAASD,IAAcE,GAE7BE,KAAS,MAAM,CADE,GAAGV,CAAS,GAAGH,CAAK,KACLA,GAAOI,GAAUC,GAAeN,GAAQS,CAAM,EAAE,KAAK,GAAG,CAAC;AAG/F,SAAO,IAAI,OAAO,GAAGD,CAAS,IAAIN,CAAI,MAAMA,CAAI,KAAKY,KAASD,CAAG,IAAI,GAAG;AACzE,GCrCIE,KAAmBC,KAAQA,EAAK,mBAAoB,SAAUC,GAAK;AACnE,SAAQA,KAAOA,EAAI,aAAcA,IAAM,EAAE,SAAWA;AACxD;AACA,OAAO,eAAeC,GAAS,cAAc,EAAE,OAAO,GAAI,CAAE;AAE5D,IAAIC,IAAeJ,GAAgBK,EAAqB;AAMxD,SAASC,EAAQC,GAAK;AAClB,MAAI,OAAOA,KAAQ;AACf,UAAM,IAAI,MAAM,+BAA+B;AAEnD,SAAOA,EAAI,MAAMH,EAAa,QAAS,CAAA,KAAK,CAAA;AAChD;AACA,IAAeI,KAAAL,EAAA,UAAGG;AAQlB,SAASG,EAAOF,GAAK;AAEjB,MAAI,OAAOA,KAAQ;AACf,UAAM,IAAI,MAAM,wBAAwB;AAE5C,MAAIG,IAAQH,EAAI,MAAMH,EAAa,QAAS,CAAA;AAC5C,SAAOM,MAAU,OAAO,IAAIA,EAAM;AACtC;AACA,IAAcC,KAAAR,EAAA,SAAGM;AAUjB,SAASG,EAAUL,GAAKM,GAAOC,GAAK;AAGhC,MAFID,MAAU,WAAUA,IAAQ,IAE5B,OAAON,KAAQ;AACf,UAAM,IAAI,MAAM,wBAAwB;AAG5C,GAAI,OAAOM,KAAU,YAAYA,IAAQ,OACrCA,IAAQ,IAER,OAAOC,KAAQ,YAAYA,IAAM,MACjCA,IAAM;AAEV,MAAIJ,IAAQH,EAAI,MAAMH,EAAa,QAAS,CAAA;AAC5C,SAAKM,IAEEA,EAAM,MAAMG,GAAOC,CAAG,EAAE,KAAK,EAAE,IAD3B;AAEf;AACA,IAAiBC,KAAAZ,EAAA,YAAGS;AAUpB,SAASI,GAAOT,GAAKM,GAAOI,GAAK;AAG7B,MAFIJ,MAAU,WAAUA,IAAQ,IAE5B,OAAON,KAAQ;AACf,UAAM,IAAI,MAAM,wBAAwB;AAE5C,MAAIW,IAAYT,EAAOF,CAAG;AAM1B,MAJI,OAAOM,KAAU,aACjBA,IAAQ,SAASA,GAAO,EAAE,IAG1BA,KAASK;AACT,WAAO;AAGX,EAAIL,IAAQ,MACRA,KAASK;AAEb,MAAIJ;AACJ,EAAI,OAAOG,IAAQ,MACfH,IAAMI,KAIF,OAAOD,KAAQ,aACfA,IAAM,SAASA,GAAK,EAAE,IAE1BH,IAAMG,KAAO,IAAIA,IAAMJ,IAAQA;AAEnC,MAAIH,IAAQH,EAAI,MAAMH,EAAa,QAAS,CAAA;AAC5C,SAAKM,IAEEA,EAAM,MAAMG,GAAOC,CAAG,EAAE,KAAK,EAAE,IAD3B;AAEf;AACA,IAAcK,KAAAhB,EAAA,SAAGa;AAYjB,SAASI,GAAMb,GAAKa,GAAOC,GAAWC,GAAa;AAK/C,MAJIF,MAAU,WAAUA,IAAQ,KAC5BC,MAAc,WAAUA,IAAY,MACpCC,MAAgB,WAAUA,IAAc,UAExC,OAAOf,KAAQ,YAAY,OAAOa,KAAU;AAC5C,UAAM,IAAI,MAAM,6BAA6B;AAGjD,MAAI,CAAC,QAAQ,OAAO,EAAE,QAAQE,CAAW,MAAM;AAC3C,UAAM,IAAI,MAAM,6CAA6C;AAGjE,EAAI,OAAOD,KAAc,aACrBA,IAAY,OAAOA,CAAS;AAGhC,MAAIH,IAAYT,EAAOF,CAAG;AAC1B,MAAIW,IAAYE;AACZ,WAAOR,EAAUL,GAAK,GAAGa,CAAK;AAE7B,MAAIF,IAAYE,GAAO;AACxB,QAAIG,IAAaF,EAAU,OAAOD,IAAQF,CAAS;AACnD,WAAOI,MAAgB,SAASC,IAAahB,IAAMA,IAAMgB;AAAA,EAC5D;AACD,SAAOhB;AACX;AACA,IAAaiB,IAAArB,EAAA,QAAGiB;AAUhB,SAASK,GAAQlB,GAAKmB,GAAWC,GAAK;AAElC,MADIA,MAAQ,WAAUA,IAAM,IACxB,OAAOpB,KAAQ;AACf,UAAM,IAAI,MAAM,wBAAwB;AAE5C,MAAIA,MAAQ;AACR,WAAImB,MAAc,KACP,IAEJ;AAGX,EAAAC,IAAM,OAAOA,CAAG,GAChBA,IAAM,MAAMA,CAAG,IAAI,IAAIA,GACvBD,IAAY,OAAOA,CAAS;AAC5B,MAAIE,IAAStB,EAAQC,CAAG;AACxB,MAAIoB,KAAOC,EAAO;AACd,WAAIF,MAAc,KACPE,EAAO,SAEX;AAEX,MAAIF,MAAc;AACd,WAAOC;AAEX,MAAIE,IAAYvB,EAAQoB,CAAS,GAC7BI,IAAS,IACTjF;AACJ,OAAKA,IAAQ8E,GAAK9E,IAAQ+E,EAAO,QAAQ/E,KAAS,GAAG;AAEjD,aADIkF,IAAc,GACXA,IAAcF,EAAU,UAC3BA,EAAUE,CAAW,MAAMH,EAAO/E,IAAQkF,CAAW;AACrD,MAAAA,KAAe;AAEnB,QAAIA,MAAgBF,EAAU,UAC1BA,EAAUE,IAAc,CAAC,MAAMH,EAAO/E,IAAQkF,IAAc,CAAC,GAAG;AAChE,MAAAD,IAAS;AACT;AAAA,IACH;AAAA,EACJ;AACD,SAAOA,IAASjF,IAAQ;AAC5B;AACA,IAAAmF,KAAA7B,EAAA,UAAkBsB;ACjLF,SAAAQ,GAAGC,GAAgBrF,GAAmC;AACpE,MAAI,EAAAA,IAAQsF,EAAaD,CAAM,KAAKrF,IAAQ,CAACsF,EAAaD,CAAM;AACzD,WAAAlB,EAAOkB,GAAQrF,GAAO,CAAC;AAChC;AAcgB,SAAAuF,GAAOF,GAAgBrF,GAAuB;AAC5D,SAAIA,IAAQ,KAAKA,IAAQsF,EAAaD,CAAM,IAAI,IAAU,KACnDlB,EAAOkB,GAAQrF,GAAO,CAAC;AAChC;AAegB,SAAAwF,GAAYH,GAAgBrF,GAAmC;AAC7E,MAAI,EAAAA,IAAQ,KAAKA,IAAQsF,EAAaD,CAAM,IAAI;AAChD,WAAOlB,EAAOkB,GAAQrF,GAAO,CAAC,EAAE,YAAY,CAAC;AAC/C;AAcO,SAASyF,GACdJ,GACAK,GACAC,IAAsBL,EAAaD,CAAM,GAChC;AACH,QAAAO,IAA0BC,GAAYR,GAAQK,CAAY;AAE5D,SADA,EAAAE,MAA4B,MAC5BA,IAA0BN,EAAaI,CAAY,MAAMC;AAE/D;AAaO,SAASG,GAAST,GAAgBK,GAAsBK,IAAmB,GAAY;AACtF,QAAAC,IAAgBjC,EAAUsB,GAAQU,CAAQ;AAEhD,SAD4BnB,EAAQoB,GAAeN,CAAY,MACnC;AAE9B;AAaO,SAASd,EACdS,GACAK,GACAK,IAA+B,GACvB;AACD,SAAAE,GAAeZ,GAAQK,GAAcK,CAAQ;AACtD;AAcgB,SAAAF,GAAYR,GAAgBK,GAAsBK,GAA2B;AAC3F,MAAIG,IAAoBH,MAAa,SAAYT,EAAaD,CAAM,IAAIU;AAExE,EAAIG,IAAoB,IACFA,IAAA,IACXA,KAAqBZ,EAAaD,CAAM,MAC7Ba,IAAAZ,EAAaD,CAAM,IAAI;AAG7C,WAASrF,IAAQkG,GAAmBlG,KAAS,GAAGA;AAC9C,QAAImE,EAAOkB,GAAQrF,GAAOsF,EAAaI,CAAY,CAAC,MAAMA;AACjD,aAAA1F;AAIJ,SAAA;AACT;AAWO,SAASsF,EAAaD,GAAwB;AACnD,SAAOc,GAAcd,CAAM;AAC7B;AAYgB,SAAAe,GAAUf,GAAgBgB,GAAwD;AAC1F,QAAAC,IAAgBD,EAAK;AAC3B,SAAIC,MAAkB,SACbjB,IAEFA,EAAO,UAAUiB,CAAa;AACvC;AAiBO,SAASC,GAAOlB,GAAgBmB,GAAsBhC,IAAoB,KAAa;AACxF,SAAAgC,KAAgBlB,EAAaD,CAAM,IAAUA,IAC1CoB,EAAapB,GAAQmB,GAAchC,GAAW,OAAO;AAC9D;AAiBO,SAASkC,GAASrB,GAAgBmB,GAAsBhC,IAAoB,KAAa;AAC1F,SAAAgC,KAAgBlB,EAAaD,CAAM,IAAUA,IAC1CoB,EAAapB,GAAQmB,GAAchC,GAAW,MAAM;AAC7D;AAIA,SAASmC,EAAkB/C,GAAgB5D,GAAe;AACxD,SAAIA,IAAQ4D,IAAeA,IACvB5D,IAAQ,CAAC4D,IAAe,IACxB5D,IAAQ,IAAUA,IAAQ4D,IACvB5D;AACT;AAcgB,SAAA4G,GAAMvB,GAAgBwB,GAAoBC,GAA2B;AAC7E,QAAAlD,IAAiB0B,EAAaD,CAAM;AAExC,MAAAwB,IAAajD,KACZkD,MACGD,IAAaC,KACb,EAAED,IAAa,KAAKA,IAAajD,KAAUkD,IAAW,KAAKA,IAAW,CAAClD,MACvEkD,IAAW,CAAClD,KACXiD,IAAa,KAAKA,IAAa,CAACjD,KAAUkD,IAAW;AAEnD,WAAA;AAEH,QAAAC,IAAWJ,EAAkB/C,GAAQiD,CAAU,GAC/CG,IAASF,IAAWH,EAAkB/C,GAAQkD,CAAQ,IAAI;AAEzD,SAAA/C,EAAUsB,GAAQ0B,GAAUC,CAAM;AAC3C;AAiBgB,SAAAC,GAAM5B,GAAgB6B,GAA4BC,GAA+B;AAC/F,QAAMC,IAAmB,CAAA;AAErB,MAAAD,MAAe,UAAaA,KAAc;AAC5C,WAAO,CAAC9B,CAAM;AAGhB,MAAI6B,MAAc;AAAI,WAAOzD,GAAQ4B,CAAM,EAAE,MAAM,GAAG8B,CAAU;AAEhE,MAAIE,IAAiBH;AAEnB,GAAA,OAAOA,KAAc,YACpBA,aAAqB,UAAU,CAACpB,GAASoB,EAAU,OAAO,GAAG,OAE7CG,IAAA,IAAI,OAAOH,GAAW,GAAG;AAGtC,QAAAI,IAAmCjC,EAAO,MAAMgC,CAAc;AAEpE,MAAIE,IAAe;AAEnB,MAAI,CAACD;AAAS,WAAO,CAACjC,CAAM;AAEnB,WAAArF,IAAQ,GAAGA,KAASmH,IAAaA,IAAa,IAAIG,EAAQ,SAAStH,KAAS;AACnF,UAAMwH,IAAa5C,EAAQS,GAAQiC,EAAQtH,CAAK,GAAGuH,CAAY,GACzDE,IAAcnC,EAAagC,EAAQtH,CAAK,CAAC;AAK/C,QAHAoH,EAAO,KAAKrD,EAAUsB,GAAQkC,GAAcC,CAAU,CAAC,GACvDD,IAAeC,IAAaC,GAExBN,MAAe,UAAaC,EAAO,WAAWD;AAChD;AAAA,EAEJ;AAEA,SAAAC,EAAO,KAAKrD,EAAUsB,GAAQkC,CAAY,CAAC,GAEpCH;AACT;AAgBO,SAASM,GAAWrC,GAAgBK,GAAsBK,IAAmB,GAAY;AAE9F,SAD4BnB,EAAQS,GAAQK,GAAcK,CAAQ,MACtCA;AAE9B;AAeA,SAAS5B,EACPkB,GACArB,IAAgB,GAChBI,IAAckB,EAAaD,CAAM,IAAIrB,GAC7B;AACD,SAAA2D,GAActC,GAAQrB,GAAOI,CAAG;AACzC;AAaO,SAASL,EACdsB,GACArB,GACAC,IAAcqB,EAAaD,CAAM,GACzB;AACD,SAAAuC,GAAiBvC,GAAQrB,GAAOC,CAAG;AAC5C;AAWO,SAASR,GAAQ4B,GAA0B;AAChD,SAAOwC,GAAexC,CAAM;AAC9B;ACnYA,IAAIyC,KAAsB,OAAO,qBAAqBC,KAAwB,OAAO,uBACjFC,KAAiB,OAAO,UAAU;AAItC,SAASC,EAAmBC,GAAaC,GAAa;AAClD,SAAO,SAAiBC,GAAGC,GAAGC,GAAO;AACjC,WAAOJ,EAAYE,GAAGC,GAAGC,CAAK,KAAKH,EAAYC,GAAGC,GAAGC,CAAK;AAAA,EAClE;AACA;AAMA,SAASC,EAAiBC,GAAe;AACrC,SAAO,SAAoBJ,GAAGC,GAAGC,GAAO;AACpC,QAAI,CAACF,KAAK,CAACC,KAAK,OAAOD,KAAM,YAAY,OAAOC,KAAM;AAClD,aAAOG,EAAcJ,GAAGC,GAAGC,CAAK;AAEpC,QAAIG,IAAQH,EAAM,OACdI,IAAUD,EAAM,IAAIL,CAAC,GACrBO,IAAUF,EAAM,IAAIJ,CAAC;AACzB,QAAIK,KAAWC;AACX,aAAOD,MAAYL,KAAKM,MAAYP;AAExC,IAAAK,EAAM,IAAIL,GAAGC,CAAC,GACdI,EAAM,IAAIJ,GAAGD,CAAC;AACd,QAAIhB,IAASoB,EAAcJ,GAAGC,GAAGC,CAAK;AACtC,WAAAG,EAAM,OAAOL,CAAC,GACdK,EAAM,OAAOJ,CAAC,GACPjB;AAAA,EACf;AACA;AAKA,SAASwB,EAAoBC,GAAQ;AACjC,SAAOf,GAAoBe,CAAM,EAAE,OAAOd,GAAsBc,CAAM,CAAC;AAC3E;AAIA,IAAIC,IAAS,OAAO,UACf,SAAUD,GAAQ9K,GAAU;AACzB,SAAOiK,GAAe,KAAKa,GAAQ9K,CAAQ;AACnD;AAIA,SAASgL,EAAmBX,GAAGC,GAAG;AAC9B,SAAOD,KAAKC,IAAID,MAAMC,IAAID,MAAMC,KAAMD,MAAMA,KAAKC,MAAMA;AAC3D;AAEA,IAAIW,IAAQ,UACRC,IAA2B,OAAO,0BAA0BC,IAAO,OAAO;AAI9E,SAASC,GAAef,GAAGC,GAAGC,GAAO;AACjC,MAAItI,IAAQoI,EAAE;AACd,MAAIC,EAAE,WAAWrI;AACb,WAAO;AAEX,SAAOA,MAAU;AACb,QAAI,CAACsI,EAAM,OAAOF,EAAEpI,CAAK,GAAGqI,EAAErI,CAAK,GAAGA,GAAOA,GAAOoI,GAAGC,GAAGC,CAAK;AAC3D,aAAO;AAGf,SAAO;AACX;AAIA,SAASc,GAAchB,GAAGC,GAAG;AACzB,SAAOU,EAAmBX,EAAE,QAAS,GAAEC,EAAE,QAAO,CAAE;AACtD;AAIA,SAASgB,EAAajB,GAAGC,GAAGC,GAAO;AAC/B,MAAIF,EAAE,SAASC,EAAE;AACb,WAAO;AAOX,WALIiB,IAAiB,CAAA,GACjBC,IAAYnB,EAAE,WACdpI,IAAQ,GACRwJ,GACAC,IACID,IAAUD,EAAU,WACpB,CAAAC,EAAQ,QADqB;AAOjC,aAHIE,IAAYrB,EAAE,WACdsB,IAAW,IACXnC,IAAa,IACTiC,IAAUC,EAAU,WACpB,CAAAD,EAAQ,QADqB;AAIjC,UAAIpJ,IAAKmJ,EAAQ,OAAOI,IAAOvJ,EAAG,CAAC,GAAGwJ,IAASxJ,EAAG,CAAC,GAC/CyJ,IAAKL,EAAQ,OAAOM,IAAOD,EAAG,CAAC,GAAGE,IAASF,EAAG,CAAC;AACnD,MAAI,CAACH,KACD,CAACL,EAAe9B,CAAU,MACzBmC,IACGrB,EAAM,OAAOsB,GAAMG,GAAM/J,GAAOwH,GAAYY,GAAGC,GAAGC,CAAK,KACnDA,EAAM,OAAOuB,GAAQG,GAAQJ,GAAMG,GAAM3B,GAAGC,GAAGC,CAAK,OAC5DgB,EAAe9B,CAAU,IAAI,KAEjCA;AAAA,IACH;AACD,QAAI,CAACmC;AACD,aAAO;AAEX,IAAA3J;AAAA,EACH;AACD,SAAO;AACX;AAIA,SAASiK,GAAgB7B,GAAGC,GAAGC,GAAO;AAClC,MAAI4B,IAAahB,EAAKd,CAAC,GACnBpI,IAAQkK,EAAW;AACvB,MAAIhB,EAAKb,CAAC,EAAE,WAAWrI;AACnB,WAAO;AAOX,WALIjC,GAKGiC,MAAU;AAOb,QANAjC,IAAWmM,EAAWlK,CAAK,GACvBjC,MAAaiL,MACZZ,EAAE,YAAYC,EAAE,aACjBD,EAAE,aAAaC,EAAE,YAGjB,CAACS,EAAOT,GAAGtK,CAAQ,KACnB,CAACuK,EAAM,OAAOF,EAAErK,CAAQ,GAAGsK,EAAEtK,CAAQ,GAAGA,GAAUA,GAAUqK,GAAGC,GAAGC,CAAK;AACvE,aAAO;AAGf,SAAO;AACX;AAIA,SAAS6B,EAAsB/B,GAAGC,GAAGC,GAAO;AACxC,MAAI4B,IAAatB,EAAoBR,CAAC,GAClCpI,IAAQkK,EAAW;AACvB,MAAItB,EAAoBP,CAAC,EAAE,WAAWrI;AAClC,WAAO;AASX,WAPIjC,GACAqM,GACAC,GAKGrK,MAAU;AAeb,QAdAjC,IAAWmM,EAAWlK,CAAK,GACvBjC,MAAaiL,MACZZ,EAAE,YAAYC,EAAE,aACjBD,EAAE,aAAaC,EAAE,YAGjB,CAACS,EAAOT,GAAGtK,CAAQ,KAGnB,CAACuK,EAAM,OAAOF,EAAErK,CAAQ,GAAGsK,EAAEtK,CAAQ,GAAGA,GAAUA,GAAUqK,GAAGC,GAAGC,CAAK,MAG3E8B,IAAcnB,EAAyBb,GAAGrK,CAAQ,GAClDsM,IAAcpB,EAAyBZ,GAAGtK,CAAQ,IAC7CqM,KAAeC,OACf,CAACD,KACE,CAACC,KACDD,EAAY,iBAAiBC,EAAY,gBACzCD,EAAY,eAAeC,EAAY,cACvCD,EAAY,aAAaC,EAAY;AACzC,aAAO;AAGf,SAAO;AACX;AAIA,SAASC,GAA0BlC,GAAGC,GAAG;AACrC,SAAOU,EAAmBX,EAAE,QAAS,GAAEC,EAAE,QAAO,CAAE;AACtD;AAIA,SAASkC,GAAgBnC,GAAGC,GAAG;AAC3B,SAAOD,EAAE,WAAWC,EAAE,UAAUD,EAAE,UAAUC,EAAE;AAClD;AAIA,SAASmC,EAAapC,GAAGC,GAAGC,GAAO;AAC/B,MAAIF,EAAE,SAASC,EAAE;AACb,WAAO;AAMX,WAJIiB,IAAiB,CAAA,GACjBC,IAAYnB,EAAE,UACdoB,GACAC,IACID,IAAUD,EAAU,WACpB,CAAAC,EAAQ,QADqB;AAOjC,aAHIE,IAAYrB,EAAE,UACdsB,IAAW,IACXnC,IAAa,IACTiC,IAAUC,EAAU,WACpB,CAAAD,EAAQ;AAGZ,MAAI,CAACE,KACD,CAACL,EAAe9B,CAAU,MACzBmC,IAAWrB,EAAM,OAAOkB,EAAQ,OAAOC,EAAQ,OAAOD,EAAQ,OAAOC,EAAQ,OAAOrB,GAAGC,GAAGC,CAAK,OAChGgB,EAAe9B,CAAU,IAAI,KAEjCA;AAEJ,QAAI,CAACmC;AACD,aAAO;AAAA,EAEd;AACD,SAAO;AACX;AAIA,SAASc,GAAoBrC,GAAGC,GAAG;AAC/B,MAAIrI,IAAQoI,EAAE;AACd,MAAIC,EAAE,WAAWrI;AACb,WAAO;AAEX,SAAOA,MAAU;AACb,QAAIoI,EAAEpI,CAAK,MAAMqI,EAAErI,CAAK;AACpB,aAAO;AAGf,SAAO;AACX;AAEA,IAAI0K,KAAgB,sBAChBC,KAAc,oBACdC,KAAW,iBACXC,KAAU,gBACVC,KAAa,mBACbC,KAAa,mBACbC,KAAc,mBACdC,KAAU,gBACVC,KAAa,mBACbC,KAAU,MAAM,SAChBC,IAAe,OAAO,eAAgB,cAAc,YAAY,SAC9D,YAAY,SACZ,MACFC,IAAS,OAAO,QAChBC,KAAS,OAAO,UAAU,SAAS,KAAK,KAAK,OAAO,UAAU,QAAQ;AAI1E,SAASC,GAAyBlL,GAAI;AAClC,MAAI8I,IAAiB9I,EAAG,gBAAgB+I,IAAgB/I,EAAG,eAAegJ,IAAehJ,EAAG,cAAc4J,IAAkB5J,EAAG,iBAAiBiK,IAA4BjK,EAAG,2BAA2BkK,IAAkBlK,EAAG,iBAAiBmK,IAAenK,EAAG,cAAcoK,IAAsBpK,EAAG;AAIzS,SAAO,SAAoB+H,GAAGC,GAAGC,GAAO;AAEpC,QAAIF,MAAMC;AACN,aAAO;AAMX,QAAID,KAAK,QACLC,KAAK,QACL,OAAOD,KAAM,YACb,OAAOC,KAAM;AACb,aAAOD,MAAMA,KAAKC,MAAMA;AAE5B,QAAImD,IAAcpD,EAAE;AAWpB,QAAIoD,MAAgBnD,EAAE;AAClB,aAAO;AAKX,QAAImD,MAAgB;AAChB,aAAOvB,EAAgB7B,GAAGC,GAAGC,CAAK;AAItC,QAAI6C,GAAQ/C,CAAC;AACT,aAAOe,EAAef,GAAGC,GAAGC,CAAK;AAIrC,QAAI8C,KAAgB,QAAQA,EAAahD,CAAC;AACtC,aAAOqC,EAAoBrC,GAAGC,GAAGC,CAAK;AAO1C,QAAIkD,MAAgB;AAChB,aAAOpC,EAAchB,GAAGC,GAAGC,CAAK;AAEpC,QAAIkD,MAAgB;AAChB,aAAOjB,EAAgBnC,GAAGC,GAAGC,CAAK;AAEtC,QAAIkD,MAAgB;AAChB,aAAOnC,EAAajB,GAAGC,GAAGC,CAAK;AAEnC,QAAIkD,MAAgB;AAChB,aAAOhB,EAAapC,GAAGC,GAAGC,CAAK;AAInC,QAAImD,IAAMH,GAAOlD,CAAC;AAClB,WAAIqD,MAAQb,KACDxB,EAAchB,GAAGC,GAAGC,CAAK,IAEhCmD,MAAQT,KACDT,EAAgBnC,GAAGC,GAAGC,CAAK,IAElCmD,MAAQZ,KACDxB,EAAajB,GAAGC,GAAGC,CAAK,IAE/BmD,MAAQR,KACDT,EAAapC,GAAGC,GAAGC,CAAK,IAE/BmD,MAAQV,KAIA,OAAO3C,EAAE,QAAS,cACtB,OAAOC,EAAE,QAAS,cAClB4B,EAAgB7B,GAAGC,GAAGC,CAAK,IAG/BmD,MAAQf,KACDT,EAAgB7B,GAAGC,GAAGC,CAAK,IAKlCmD,MAAQd,MAAec,MAAQX,MAAcW,MAAQP,KAC9CZ,EAA0BlC,GAAGC,GAAGC,CAAK,IAazC;AAAA,EACf;AACA;AAIA,SAASoD,GAA+BrL,GAAI;AACxC,MAAIsL,IAAWtL,EAAG,UAAUuL,IAAqBvL,EAAG,oBAAoBwL,IAASxL,EAAG,QAChFyL,IAAS;AAAA,IACT,gBAAgBD,IACV1B,IACAhB;AAAA,IACN,eAAeC;AAAA,IACf,cAAcyC,IACR5D,EAAmBoB,GAAcc,CAAqB,IACtDd;AAAA,IACN,iBAAiBwC,IACX1B,IACAF;AAAA,IACN,2BAA2BK;AAAA,IAC3B,iBAAiBC;AAAA,IACjB,cAAcsB,IACR5D,EAAmBuC,GAAcL,CAAqB,IACtDK;AAAA,IACN,qBAAqBqB,IACf1B,IACAM;AAAA,EACd;AAII,MAHImB,MACAE,IAAST,EAAO,CAAE,GAAES,GAAQF,EAAmBE,CAAM,CAAC,IAEtDH,GAAU;AACV,QAAII,IAAmBxD,EAAiBuD,EAAO,cAAc,GACzDE,IAAiBzD,EAAiBuD,EAAO,YAAY,GACrDG,IAAoB1D,EAAiBuD,EAAO,eAAe,GAC3DI,IAAiB3D,EAAiBuD,EAAO,YAAY;AACzD,IAAAA,IAAST,EAAO,CAAE,GAAES,GAAQ;AAAA,MACxB,gBAAgBC;AAAA,MAChB,cAAcC;AAAA,MACd,iBAAiBC;AAAA,MACjB,cAAcC;AAAA,IAC1B,CAAS;AAAA,EACJ;AACD,SAAOJ;AACX;AAKA,SAASK,GAAiCC,GAAS;AAC/C,SAAO,SAAUhE,GAAGC,GAAGgE,GAAcC,GAAcC,GAAUC,GAAUlE,GAAO;AAC1E,WAAO8D,EAAQhE,GAAGC,GAAGC,CAAK;AAAA,EAClC;AACA;AAIA,SAASmE,GAAcpM,GAAI;AACvB,MAAIsL,IAAWtL,EAAG,UAAUqM,IAAarM,EAAG,YAAYsM,IAActM,EAAG,aAAauM,IAASvM,EAAG,QAAQwL,IAASxL,EAAG;AACtH,MAAIsM;AACA,WAAO,SAAiBvE,GAAGC,GAAG;AAC1B,UAAIhI,IAAKsM,KAAe7C,IAAKzJ,EAAG,OAAOoI,IAAQqB,MAAO,SAAS6B,IAAW,oBAAI,YAAY,SAAY7B,GAAI+C,IAAOxM,EAAG;AACpH,aAAOqM,EAAWtE,GAAGC,GAAG;AAAA,QACpB,OAAOI;AAAA,QACP,QAAQmE;AAAA,QACR,MAAMC;AAAA,QACN,QAAQhB;AAAA,MACxB,CAAa;AAAA,IACb;AAEI,MAAIF;AACA,WAAO,SAAiBvD,GAAGC,GAAG;AAC1B,aAAOqE,EAAWtE,GAAGC,GAAG;AAAA,QACpB,OAAO,oBAAI,QAAS;AAAA,QACpB,QAAQuE;AAAA,QACR,MAAM;AAAA,QACN,QAAQf;AAAA,MACxB,CAAa;AAAA,IACb;AAEI,MAAIvD,IAAQ;AAAA,IACR,OAAO;AAAA,IACP,QAAQsE;AAAA,IACR,MAAM;AAAA,IACN,QAAQf;AAAA,EAChB;AACI,SAAO,SAAiBzD,GAAGC,GAAG;AAC1B,WAAOqE,EAAWtE,GAAGC,GAAGC,CAAK;AAAA,EACrC;AACA;AAKA,IAAIwE,KAAYC,EAAiB;AAIXA,EAAkB,EAAE,QAAQ,IAAM;AAIhCA,EAAkB,EAAE,UAAU,IAAM;AAK9BA,EAAkB;AAAA,EAC5C,UAAU;AAAA,EACV,QAAQ;AACZ,CAAC;AAIkBA,EAAkB;AAAA,EACjC,0BAA0B,WAAY;AAAE,WAAOhE;AAAA,EAAqB;AACxE,CAAC;AAIwBgE,EAAkB;AAAA,EACvC,QAAQ;AAAA,EACR,0BAA0B,WAAY;AAAE,WAAOhE;AAAA,EAAqB;AACxE,CAAC;AAI0BgE,EAAkB;AAAA,EACzC,UAAU;AAAA,EACV,0BAA0B,WAAY;AAAE,WAAOhE;AAAA,EAAqB;AACxE,CAAC;AAKgCgE,EAAkB;AAAA,EAC/C,UAAU;AAAA,EACV,0BAA0B,WAAY;AAAE,WAAOhE;AAAA,EAAqB;AAAA,EACpE,QAAQ;AACZ,CAAC;AASD,SAASgE,EAAkBvO,GAAS;AAChC,EAAIA,MAAY,WAAUA,IAAU,CAAE;AACtC,MAAI6B,IAAK7B,EAAQ,UAAUmN,IAAWtL,MAAO,SAAS,KAAQA,GAAI2M,IAAiCxO,EAAQ,0BAA0BmO,IAAcnO,EAAQ,aAAasL,IAAKtL,EAAQ,QAAQqN,IAAS/B,MAAO,SAAS,KAAQA,GAC1NgC,IAASJ,GAA+BlN,CAAO,GAC/CkO,IAAanB,GAAyBO,CAAM,GAC5Cc,IAASI,IACPA,EAA+BN,CAAU,IACzCP,GAAiCO,CAAU;AACjD,SAAOD,GAAc,EAAE,UAAUd,GAAU,YAAYe,GAAY,aAAaC,GAAa,QAAQC,GAAQ,QAAQf,EAAQ,CAAA;AACjI;AC9fwB,SAAAiB,GAAU1E,GAAYC,GAAY;AACjD,SAAA4E,GAAY7E,GAAGC,CAAC;AACzB;ACbgB,SAAA6E,EACdrR,GACAsR,GACAC,GACQ;AASR,SAAO,KAAK,UAAUvR,GARI,CAACwR,GAAqBC,MAA2B;AACzE,QAAIC,IAAWD;AACX,WAAAH,MAAqBI,IAAAJ,EAASE,GAAaE,CAAQ,IAGnDA,MAAa,WAAsBA,IAAA,OAChCA;AAAA,EAAA,GAEuCH,CAAK;AACvD;AAkBgB,SAAAI,GACd3R,GACA4R,GAGK;AAGL,WAASC,EAAYrR,GAAyE;AAC5F,kBAAO,KAAKA,CAAG,EAAE,QAAQ,CAACY,MAAyB;AAG7C,MAAAZ,EAAIY,CAAG,MAAM,OAAMZ,EAAIY,CAAG,IAAI,SAEzB,OAAOZ,EAAIY,CAAG,KAAM,aAG3BZ,EAAIY,CAAG,IAAIyQ,EAAYrR,EAAIY,CAAG,CAAqC;AAAA,IAAA,CACtE,GACMZ;AAAA,EACT;AAEA,QAAMsR,IAAe,KAAK,MAAM9R,GAAO4R,CAAO;AAG9C,MAAIE,MAAiB;AACrB,WAAI,OAAOA,KAAiB,WAAiBD,EAAYC,CAAY,IAC9DA;AACT;AAuBO,SAASC,GAAe/R,GAAyB;AAClD,MAAA;AACI,UAAAgS,IAAkBX,EAAUrR,CAAK;AACvC,WAAOgS,MAAoBX,EAAUM,GAAYK,CAAe,CAAC;AAAA,UACvD;AACH,WAAA;AAAA,EACT;AACF;AAQa,MAAAC,KAAa,CAACpK,MACzBA,EACG,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,MAAM,QAAQ,EACtB,QAAQ,OAAO,QAAQ,GCSfqK,KAAqB;AAAA,EAChC,OAAO;AAAA,EACP,MAAM;AAAA,EACN,YAAY;AAAA,IACV,UAAU;AAAA,MACR,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,uBAAuB;AAAA,MACrB,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,2BAA2B;AAAA,MACzB,aAAa;AAAA,MACb,MAAM;AAAA,IACR;AAAA,IACA,cAAc;AAAA,MACZ,aAAa;AAAA,MACb,MAAM;AAAA,MACN,mBAAmB;AAAA,QACjB,2BAA2B;AAAA,UACzB,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA,UAAU,CAAC,YAAY,yBAAyB,6BAA6B,cAAc;AAAA,EAC3F,sBAAsB;AAAA,EACtB,OAAO;AAAA,IACL,aAAa;AAAA,MACX,aACE;AAAA,MACF,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,gBAAgB;AAAA,MACd,aACE;AAAA,MACF,MAAM;AAAA,MACN,SAAS;AAAA,IACX;AAAA,IACA,oBAAoB;AAAA,MAClB,aACE;AAAA,MACF,MAAM;AAAA,MACN,mBAAmB;AAAA,QACjB,2BAA2B;AAAA,UACzB,aAAa;AAAA,UACb,MAAM;AAAA,UACN,YAAY;AAAA,YACV,OAAO;AAAA,cACL,aAAa;AAAA,cACb,MAAM;AAAA,YACR;AAAA,YACA,eAAe;AAAA,cACb,aACE;AAAA,cACF,MAAM;AAAA,YACR;AAAA,YACA,OAAO;AAAA,cACL,aACE;AAAA,cACF,MAAM;AAAA,YACR;AAAA,YACA,cAAc;AAAA,cACZ,aACE;AAAA,cACF,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,UAAU,CAAC,SAAS,OAAO;AAAA,UAC3B,sBAAsB;AAAA,QACxB;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,cAAc;AAAA,UACZ,aACE;AAAA,UACF,MAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,IACA,YAAY;AAAA,MACV,aACE;AAAA,MACF,MAAM;AAAA,MACN,mBAAmB;AAAA,QACjB,2BAA2B;AAAA,UACzB,aAAa;AAAA,UACb,MAAM;AAAA,UACN,OAAO;AAAA,YACL;AAAA,cACE,YAAY;AAAA,gBACV,QAAQ;AAAA,kBACN,aACE;AAAA,kBACF,MAAM;AAAA,gBACR;AAAA,gBACA,OAAO;AAAA,kBACL,aACE;AAAA,kBACF,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,aACE;AAAA,kBACF,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,cACA,UAAU,CAAC,OAAO;AAAA,cAClB,sBAAsB;AAAA,YACxB;AAAA,YACA;AAAA,cACE,YAAY;AAAA,gBACV,UAAU;AAAA,kBACR,aAAa;AAAA,kBACb,MAAM;AAAA,gBACR;AAAA,gBACA,OAAO;AAAA,kBACL,aACE;AAAA,kBACF,MAAM;AAAA,gBACR;AAAA,gBACA,cAAc;AAAA,kBACZ,aACE;AAAA,kBACF,MAAM;AAAA,gBACR;AAAA,cACF;AAAA,cACA,UAAU,CAAC,YAAY,OAAO;AAAA,cAC9B,sBAAsB;AAAA,YACxB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,IACA,UAAU;AAAA,MACR,aACE;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,QACL;AAAA,UACE,YAAY;AAAA,YACV,IAAI;AAAA,cACF,aAAa;AAAA,cACb,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,UAAU,CAAC,IAAI;AAAA,QACjB;AAAA,QACA;AAAA,UACE,YAAY;AAAA,YACV,SAAS;AAAA,cACP,aAAa;AAAA,cACb,MAAM;AAAA,YACR;AAAA,YACA,gBAAgB;AAAA,cACd,aAAa;AAAA,cACb,MAAM;AAAA,YACR;AAAA,YACA,eAAe;AAAA,cACb,aAAa;AAAA,cACb,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,UAAU,CAAC,SAAS;AAAA,QACtB;AAAA,MACF;AAAA,MACA,YAAY;AAAA,QACV,OAAO;AAAA,UACL,aAAa;AAAA,UACb,MAAM;AAAA,QACR;AAAA,QACA,SAAS;AAAA,UACP,aACE;AAAA,UACF,MAAM;AAAA,QACR;AAAA,QACA,aAAa;AAAA,UACX,aACE;AAAA,UACF,MAAM;AAAA,QACR;AAAA,QACA,eAAe;AAAA,UACb,aACE;AAAA,UACF,MAAM;AAAA,QACR;AAAA,QACA,OAAO;AAAA,UACL,aAAa;AAAA,UACb,MAAM;AAAA,QACR;AAAA,QACA,OAAO;AAAA,UACL,aACE;AAAA,UACF,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,UAAU,CAAC,SAAS,SAAS,OAAO;AAAA,MACpC,uBAAuB;AAAA,IACzB;AAAA,IACA,gBAAgB;AAAA,MACd,aAAa;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,QACV,QAAQ;AAAA,UACN,aAAa;AAAA,UACb,MAAM;AAAA,QACR;AAAA,QACA,OAAO;AAAA,UACL,aAAa;AAAA,UACb,MAAM;AAAA,UACN,OAAO,EAAE,MAAM,mBAAmB;AAAA,UAClC,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,UAAU,OAAO;AAAA,IAC9B;AAAA,IACA,kBAAkB;AAAA,MAChB,aAAa;AAAA,MACb,MAAM;AAAA,MACN,OAAO,CAAC,EAAE,MAAM,0BAA0B;AAAA,MAC1C,uBAAuB;AAAA,IACzB;AAAA,IACA,iBAAiB;AAAA,MACf,aAAa;AAAA,MACb,MAAM;AAAA,MACN,OAAO;AAAA,QACL,EAAE,MAAM,yBAAyB;AAAA,QACjC;AAAA,UACE,YAAY;AAAA,YACV,SAAS;AAAA,cACP,aAAa;AAAA,cACb,MAAM;AAAA,YACR;AAAA,UACF;AAAA,UACA,UAAU,CAAC,SAAS;AAAA,QACtB;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,IACzB;AAAA,IACA,oBAAoB;AAAA,MAClB,aAAa;AAAA,MACb,MAAM;AAAA,MACN,YAAY;AAAA,QACV,iBAAiB;AAAA,UACf,aACE;AAAA,UACF,MAAM;AAAA,QACR;AAAA,QACA,SAAS;AAAA,UACP,aAAa;AAAA,UACb,MAAM;AAAA,QACR;AAAA,QACA,aAAa;AAAA,UACX,aAAa;AAAA,UACb,MAAM;AAAA,QACR;AAAA,MACF;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,EACF;AACF;AAEA,OAAO,OAAOA,EAAkB;","x_google_ignoreList":[9,10,12]} \ No newline at end of file diff --git a/lib/platform-bible-utils/src/index.ts b/lib/platform-bible-utils/src/index.ts index 20c3d0fed4..5c071a31da 100644 --- a/lib/platform-bible-utils/src/index.ts +++ b/lib/platform-bible-utils/src/index.ts @@ -40,7 +40,7 @@ export { includes, indexOf, lastIndexOf, - length, + stringLength, normalize, padEnd, padStart, diff --git a/lib/platform-bible-utils/src/string-util.test.ts b/lib/platform-bible-utils/src/string-util.test.ts index 4a74c7a43e..34656d56b6 100644 --- a/lib/platform-bible-utils/src/string-util.test.ts +++ b/lib/platform-bible-utils/src/string-util.test.ts @@ -6,7 +6,7 @@ import { includes, indexOf, lastIndexOf, - length, + stringLength, normalize, padEnd, padStart, @@ -47,12 +47,12 @@ describe('at', () => { }); test('at with index greater than length returns undefined', () => { - const result = at(LONG_SURROGATE_PAIRS_STRING, length(LONG_SURROGATE_PAIRS_STRING) + 10); + const result = at(LONG_SURROGATE_PAIRS_STRING, stringLength(LONG_SURROGATE_PAIRS_STRING) + 10); expect(result).toEqual(undefined); }); test('at with index smaller than -length returns undefined', () => { - const result = at(LONG_SURROGATE_PAIRS_STRING, -length(LONG_SURROGATE_PAIRS_STRING) - 10); + const result = at(LONG_SURROGATE_PAIRS_STRING, -stringLength(LONG_SURROGATE_PAIRS_STRING) - 10); expect(result).toEqual(undefined); }); }); @@ -151,7 +151,7 @@ describe('lastIndexOf', () => { describe('length', () => { test('length is correct', () => { - const result = length(LONG_SURROGATE_PAIRS_STRING); + const result = stringLength(LONG_SURROGATE_PAIRS_STRING); expect(result).toEqual(SURROGATE_PAIRS_STRING_LENGTH); }); }); diff --git a/lib/platform-bible-utils/src/string-util.ts b/lib/platform-bible-utils/src/string-util.ts index 5f87a8fb8c..eea006fe72 100644 --- a/lib/platform-bible-utils/src/string-util.ts +++ b/lib/platform-bible-utils/src/string-util.ts @@ -8,8 +8,8 @@ import { } from 'stringz'; /** - * This function mirrors the `at` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `at` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. * * Finds the Unicode code point at the given index. * @@ -20,13 +20,13 @@ import { * undefined if index is out of bounds */ export function at(string: string, index: number): string | undefined { - if (index > length(string) || index < -length(string)) return undefined; + if (index > stringLength(string) || index < -stringLength(string)) return undefined; return substr(string, index, 1); } /** - * This function mirrors the `charAt` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `charAt` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Returns a new string consisting of the single unicode code point at the given index. * @@ -37,13 +37,13 @@ export function at(string: string, index: number): string | undefined { * string if index is out of bounds */ export function charAt(string: string, index: number): string { - if (index < 0 || index > length(string) - 1) return ''; + if (index < 0 || index > stringLength(string) - 1) return ''; return substr(string, index, 1); } /** - * This function mirrors the `codePointAt` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `codePointAt` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Returns a non-negative integer that is the Unicode code point value of the character starting at * the given index. @@ -55,13 +55,13 @@ export function charAt(string: string, index: number): string { * index, or undefined if there is no element at that position */ export function codePointAt(string: string, index: number): number | undefined { - if (index < 0 || index > length(string) - 1) return undefined; + if (index < 0 || index > stringLength(string) - 1) return undefined; return substr(string, index, 1).codePointAt(0); } /** - * This function mirrors the `endsWith` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `endsWith` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Determines whether a string ends with the characters of this string. * @@ -74,17 +74,17 @@ export function codePointAt(string: string, index: number): number | undefined { export function endsWith( string: string, searchString: string, - endPosition: number = length(string), + endPosition: number = stringLength(string), ): boolean { const lastIndexOfSearchString = lastIndexOf(string, searchString); if (lastIndexOfSearchString === -1) return false; - if (lastIndexOfSearchString + length(searchString) !== endPosition) return false; + if (lastIndexOfSearchString + stringLength(searchString) !== endPosition) return false; return true; } /** - * This function mirrors the `includes` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `includes` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Performs a case-sensitive search to determine if searchString is found in string. * @@ -101,8 +101,8 @@ export function includes(string: string, searchString: string, position: number } /** - * This function mirrors the `indexOf` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `indexOf` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Returns the index of the first occurrence of a given string. * @@ -120,8 +120,8 @@ export function indexOf( } /** - * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `lastIndexOf` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Searches this string and returns the index of the last occurrence of the specified substring. * @@ -132,16 +132,16 @@ export function indexOf( * @returns Index of the last occurrence of searchString found, or -1 if not found. */ export function lastIndexOf(string: string, searchString: string, position?: number): number { - let validatedPosition = position === undefined ? length(string) : position; + let validatedPosition = position === undefined ? stringLength(string) : position; if (validatedPosition < 0) { validatedPosition = 0; - } else if (validatedPosition >= length(string)) { - validatedPosition = length(string) - 1; + } else if (validatedPosition >= stringLength(string)) { + validatedPosition = stringLength(string) - 1; } for (let index = validatedPosition; index >= 0; index--) { - if (substr(string, index, length(searchString)) === searchString) { + if (substr(string, index, stringLength(searchString)) === searchString) { return index; } } @@ -150,21 +150,22 @@ export function lastIndexOf(string: string, searchString: string, position?: num } /** - * This function mirrors the `length` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `length` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. Since `length` appears to be a + * reserved keyword, the function was renamed to `stringLength` * * Returns the length of a string. * * @param string String to return the length for * @returns Number that is length of the starting string */ -export function length(string: string): number { +export function stringLength(string: string): number { return stringzLength(string); } /** - * This function mirrors the `normalize` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `normalize` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Returns the Unicode Normalization Form of this string. * @@ -181,8 +182,8 @@ export function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' } /** - * This function mirrors the `padEnd` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `padEnd` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Pads this string with another string (multiple times, if needed) until the resulting string * reaches the given length. The padding is applied from the end of this string. @@ -196,13 +197,13 @@ export function normalize(string: string, form: 'NFC' | 'NFD' | 'NFKC' | 'NFKD' */ // Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59 export function padEnd(string: string, targetLength: number, padString: string = ' '): string { - if (targetLength <= length(string)) return string; + if (targetLength <= stringLength(string)) return string; return stringzLimit(string, targetLength, padString, 'right'); } /** - * This function mirrors the `padStart` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `padStart` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Pads this string with another string (multiple times, if needed) until the resulting string * reaches the given length. The padding is applied from the start of this string. @@ -216,22 +217,22 @@ export function padEnd(string: string, targetLength: number, padString: string = */ // Note: Limit with padString only works when length(padString) = 1, will be fixed with https://github.com/sallar/stringz/pull/59 export function padStart(string: string, targetLength: number, padString: string = ' '): string { - if (targetLength <= length(string)) return string; + if (targetLength <= stringLength(string)) return string; return stringzLimit(string, targetLength, padString, 'left'); } // This is a helper function that performs a correction on the slice index to make sure it // cannot go out of bounds -function correctSliceIndex(stringLength: number, index: number) { - if (index > stringLength) return stringLength; - if (index < -stringLength) return 0; - if (index < 0) return index + stringLength; +function correctSliceIndex(length: number, index: number) { + if (index > length) return length; + if (index < -length) return 0; + if (index < 0) return index + length; return index; } /** - * This function mirrors the `slice` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `slice` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. * * Extracts a section of this string and returns it as a new string, without modifying the original * string. @@ -242,31 +243,26 @@ function correctSliceIndex(stringLength: number, index: number) { * @returns A new string containing the extracted section of the string. */ export function slice(string: string, indexStart: number, indexEnd?: number): string { - const stringLength: number = length(string); + const length: number = stringLength(string); if ( - indexStart > stringLength || + indexStart > length || (indexEnd && ((indexStart > indexEnd && - !( - indexStart > 0 && - indexStart < stringLength && - indexEnd < 0 && - indexEnd > -stringLength - )) || - indexEnd < -stringLength || - (indexStart < 0 && indexStart > -stringLength && indexEnd > 0))) + !(indexStart > 0 && indexStart < length && indexEnd < 0 && indexEnd > -length)) || + indexEnd < -length || + (indexStart < 0 && indexStart > -length && indexEnd > 0))) ) return ''; - const newStart = correctSliceIndex(stringLength, indexStart); - const newEnd = indexEnd ? correctSliceIndex(stringLength, indexEnd) : undefined; + const newStart = correctSliceIndex(length, indexStart); + const newEnd = indexEnd ? correctSliceIndex(length, indexEnd) : undefined; return substring(string, newStart, newEnd); } /** - * This function mirrors the `split` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `split` function from the JavaScript Standard String object. It handles + * Unicode code points instead of UTF-16 character codes. * * Takes a pattern and divides the string into an ordered list of substrings by searching for the * pattern, puts these substrings into an array, and returns the array. @@ -304,7 +300,7 @@ export function split(string: string, separator: string | RegExp, splitLimit?: n for (let index = 0; index < (splitLimit ? splitLimit - 1 : matches.length); index++) { const matchIndex = indexOf(string, matches[index], currentIndex); - const matchLength = length(matches[index]); + const matchLength = stringLength(matches[index]); result.push(substring(string, currentIndex, matchIndex)); currentIndex = matchIndex + matchLength; @@ -320,8 +316,8 @@ export function split(string: string, separator: string | RegExp, splitLimit?: n } /** - * This function mirrors the `startsWith` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `startsWith` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Determines whether the string begins with the characters of a specified string, returning true or * false as appropriate. @@ -340,8 +336,8 @@ export function startsWith(string: string, searchString: string, position: numbe } /** - * This function mirrors the `substr` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `substr` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Returns a substring by providing start and length. This function is not exported because it is * considered deprecated, however it is still useful as a local helper function. @@ -352,13 +348,17 @@ export function startsWith(string: string, searchString: string, position: numbe * length minus start parameter` * @returns Substring from starting string */ -function substr(string: string, begin: number = 0, len: number = length(string) - begin): string { +function substr( + string: string, + begin: number = 0, + len: number = stringLength(string) - begin, +): string { return stringzSubstr(string, begin, len); } /** - * This function mirrors the `substring` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `substring` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Returns a substring by providing start and end position. * @@ -367,13 +367,17 @@ function substr(string: string, begin: number = 0, len: number = length(string) * @param end End position. Default is `End of string` * @returns Substring from starting string */ -export function substring(string: string, begin: number, end: number = length(string)): string { +export function substring( + string: string, + begin: number, + end: number = stringLength(string), +): string { return stringzSubstring(string, begin, end); } /** - * This function mirrors the `toArray` function from the JavaScript Standard String object. - * It handles Unicode code points instead of UTF-16 character codes. + * This function mirrors the `toArray` function from the JavaScript Standard String object. It + * handles Unicode code points instead of UTF-16 character codes. * * Converts a string to an array of string characters. * diff --git a/src/extension-host/services/extension-storage.service.ts b/src/extension-host/services/extension-storage.service.ts index 707856dc48..d9c1e41d85 100644 --- a/src/extension-host/services/extension-storage.service.ts +++ b/src/extension-host/services/extension-storage.service.ts @@ -8,7 +8,7 @@ import { import { ExecutionToken } from '@node/models/execution-token.model'; import executionTokenService from '@node/services/execution-token.service'; import { Buffer } from 'buffer'; -import { length, includes } from 'platform-bible-utils'; +import { stringLength, includes } from 'platform-bible-utils'; // #region Functions that need to be called by other services to initialize this service @@ -67,7 +67,7 @@ export function buildExtensionPathFromName(extensionName: string, fileName: stri function buildUserDataPath(token: ExecutionToken, key: string): string { if (!executionTokenService.tokenIsValid(token)) throw new Error('Invalid token'); const subDir: string = sanitizeDirectoryName(token.name); - if (!subDir || length(subDir) === 0) throw new Error('Bad extension name'); + if (!subDir || stringLength(subDir) === 0) throw new Error('Bad extension name'); // From https://base64.guru/standards/base64url, the purpose of "base64url" encoding is // "the ability to use the encoding result as filename or URL address" diff --git a/src/extension-host/services/extension.service.ts b/src/extension-host/services/extension.service.ts index 6c78984ded..03ff253fef 100644 --- a/src/extension-host/services/extension.service.ts +++ b/src/extension-host/services/extension.service.ts @@ -23,7 +23,7 @@ import { deserialize, endsWith, includes, - length, + stringLength, startsWith, slice, } from 'platform-bible-utils'; @@ -491,7 +491,7 @@ async function cacheExtensionTypeDeclarations(extensionInfos: ExtensionInfo[]) { userExtensionTypesCacheUri, // Folder name must match module name which we are assuming is the same as the name of the // .d.ts file, so get the .d.ts file's name and use it as the folder name - slice(extensionDtsBaseDestination, 0, -length('.d.ts')), + slice(extensionDtsBaseDestination, 0, -stringLength('.d.ts')), 'index.d.ts', ); diff --git a/src/main/services/extension-asset-protocol.service.ts b/src/main/services/extension-asset-protocol.service.ts index cf017faf7e..e92608e621 100644 --- a/src/main/services/extension-asset-protocol.service.ts +++ b/src/main/services/extension-asset-protocol.service.ts @@ -1,7 +1,7 @@ import { protocol } from 'electron'; import { StatusCodes } from 'http-status-codes'; import extensionAssetService from '@shared/services/extension-asset.service'; -import { includes, indexOf, lastIndexOf, length, substring } from 'platform-bible-utils'; +import { includes, indexOf, lastIndexOf, stringLength, substring } from 'platform-bible-utils'; /** Here some of the most common MIME types that we expect to handle */ // https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types @@ -68,7 +68,7 @@ const initialize = () => { // 2) Use request headers to pass along the extension name so extension code doesn't have to embed its name in URLs. // Remove "papi-extension://" from the front of the URL - const uri: string = substring(request.url, length(`${protocolName}://`)); + const uri: string = substring(request.url, stringLength(`${protocolName}://`)); // There have to be at least 2 parts to the URI divided by a slash if (!includes(uri, '/')) { @@ -86,7 +86,7 @@ const initialize = () => { // allowed in URLs. So let's decode both of them before passing them to the extension host. extension = decodeURIComponent(extension); asset = decodeURIComponent(asset); - if (length(extension) > 100 || length(asset) > 100) { + if (stringLength(extension) > 100 || stringLength(asset) > 100) { return errorResponse(request.url, StatusCodes.BAD_REQUEST); } diff --git a/src/node/models/execution-token.model.ts b/src/node/models/execution-token.model.ts index 9914bbb9dc..8e1ba10aef 100644 --- a/src/node/models/execution-token.model.ts +++ b/src/node/models/execution-token.model.ts @@ -1,6 +1,6 @@ import crypto from 'crypto'; import { createNonce } from '@node/utils/crypto-util'; -import { length } from 'platform-bible-utils'; +import { stringLength } from 'platform-bible-utils'; /** For now this is just for extensions, but maybe we will want to expand this in the future */ export type ExecutionTokenType = 'extension'; @@ -13,7 +13,7 @@ export class ExecutionToken { constructor(tokenType: ExecutionTokenType, name: string) { if (!tokenType) throw new Error('token type must be defined'); - if (!name || length(name) < 1) throw new Error('name must be a string of length > 0'); + if (!name || stringLength(name) < 1) throw new Error('name must be a string of length > 0'); this.type = tokenType; this.name = name; diff --git a/src/node/services/execution-token.service.ts b/src/node/services/execution-token.service.ts index cae94fb62d..623c190698 100644 --- a/src/node/services/execution-token.service.ts +++ b/src/node/services/execution-token.service.ts @@ -1,11 +1,11 @@ import { ExecutionToken, ExecutionTokenType } from '@node/models/execution-token.model'; -import { length } from 'platform-bible-utils'; +import { stringLength } from 'platform-bible-utils'; const tokenMap = new Map(); function getMapKey(name: string, tokenType: ExecutionTokenType = 'extension'): string { - if (!name || length(name) < 1) throw new Error('name must be defined'); - if (!tokenType || length(tokenType) < 1) throw new Error('type must be defined'); + if (!name || stringLength(name) < 1) throw new Error('name must be defined'); + if (!tokenType || stringLength(tokenType) < 1) throw new Error('type must be defined'); return `${tokenType}:${name}`; } diff --git a/src/shared/models/data-provider.model.ts b/src/shared/models/data-provider.model.ts index 5693936d8f..b2be660036 100644 --- a/src/shared/models/data-provider.model.ts +++ b/src/shared/models/data-provider.model.ts @@ -1,5 +1,5 @@ import { - length, + stringLength, UnsubscriberAsync, PlatformEventHandler, substring, @@ -241,7 +241,7 @@ export function getDataProviderDataTypeFromFunctionName< // Assert the expected return type. // eslint-disable-next-line no-type-assertion/no-type-assertion - return substring(fnName, length(fnPrefix)) as DataTypeNames; + return substring(fnName, stringLength(fnPrefix)) as DataTypeNames; } export default DataProviderInternal; diff --git a/src/shared/services/network.service.ts b/src/shared/services/network.service.ts index e02b0b6b28..08a71f318b 100644 --- a/src/shared/services/network.service.ts +++ b/src/shared/services/network.service.ts @@ -15,7 +15,7 @@ import { } from '@shared/data/internal-connection.model'; import { aggregateUnsubscriberAsyncs, - length, + stringLength, UnsubscriberAsync, getErrorMessage, wait, @@ -149,7 +149,7 @@ function validateCommandFormatting(commandName: string) { throw new Error( `Invalid command name ${commandName}: must have non-empty string before a period`, ); - if (periodIndex >= length(commandName) - 1) + if (periodIndex >= stringLength(commandName) - 1) throw new Error( `Invalid command name ${commandName}: must have a non-empty string after a period`, ); diff --git a/src/shared/utils/util.ts b/src/shared/utils/util.ts index 933e9b1a56..18ea621cf2 100644 --- a/src/shared/utils/util.ts +++ b/src/shared/utils/util.ts @@ -4,12 +4,12 @@ import { charAt, indexOf, isString, - length, + stringLength, substring, } from 'platform-bible-utils'; const NONCE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; -const NONCE_CHARS_LENGTH = length(NONCE_CHARS); +const NONCE_CHARS_LENGTH = stringLength(NONCE_CHARS); /** * Create a nonce that is at least 128 bits long and should be (is not currently) cryptographically * random. See nonce spec at https://w3c.github.io/webappsec-csp/#security-nonces @@ -182,7 +182,7 @@ export function deserializeRequestType(requestType: SerializedRequestType): Requ if (!requestType) throw new Error('deserializeRequestType: must be a non-empty string'); const colonIndex = indexOf(requestType, REQUEST_TYPE_SEPARATOR); - if (colonIndex <= 0 || colonIndex >= length(requestType) - 1) + if (colonIndex <= 0 || colonIndex >= stringLength(requestType) - 1) throw new Error( `deserializeRequestType: Must have two parts divided by a ${REQUEST_TYPE_SEPARATOR} (${requestType})`, );