From 87f6070657b006ec3fdc643f415357fa32b571a5 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Fri, 19 Jun 2026 18:30:54 -0500 Subject: [PATCH 001/122] Update version number to v0.1.0-alpha.3 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea2eb07..9a50135 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@blwat/utils", - "version": "0.1.0-alpha.2", + "version": "0.1.0-alpha.3", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@blwat/utils", - "version": "0.1.0-alpha.2", + "version": "0.1.0-alpha.3", "license": "MIT", "dependencies": { "typebox": "^1.2.14" diff --git a/package.json b/package.json index cc8a6a2..b92b5e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@blwat/utils", - "version": "0.1.0-alpha.2", + "version": "0.1.0-alpha.3", "license": "MIT", "private": false, "description": "A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development.", From 5ab3ee9a2519c5f19490874ed475a6de035d1225 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Fri, 19 Jun 2026 18:31:11 -0500 Subject: [PATCH 002/122] Remove deprecated number-utility.ts method. --- src/number/number-utility.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/number/number-utility.ts b/src/number/number-utility.ts index 002302d..bf747a2 100644 --- a/src/number/number-utility.ts +++ b/src/number/number-utility.ts @@ -84,13 +84,4 @@ export class NumberUtility { return input > 0; } - - /* ---------- DEPRECATED METHODS ---------- */ - /** - * @deprecated To be removed in v0.1.0-alpha.2. - * Replaced by {@link NumberUtility.isFiniteNumber}. - */ - public static isNumber(input: unknown): input is number { - return typeof input === 'number' && !isNaN(input); - } } From a5e5f19aaed86b05d2345f1f298aa81e08fd46f2 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Fri, 19 Jun 2026 18:31:23 -0500 Subject: [PATCH 003/122] Update releases.md --- docs/releases.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/releases.md b/docs/releases.md index 96aec37..26097dc 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -14,3 +14,4 @@ toc: true - [v0.1.0-alpha.0](releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html) *(May 19, 2026)* - **@latest** - [v0.1.0-alpha.1](releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html) *(June 16, 2026)* - [v0.1.0-alpha.2](releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/index.html) *(June 19, 2026)* - **@alpha** +- [v0.1.0-alpha.3](releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html) - *In Development* From a202c74789ca55cbd3151102d62bec8c9d922e9e Mon Sep 17 00:00:00 2001 From: blwatkins Date: Fri, 19 Jun 2026 18:31:40 -0500 Subject: [PATCH 004/122] Add generated docs for v0.1.0-alpha.3 --- .../v0.1.0-alpha.3/doc/.nojekyll | 1 + .../v0.1.0-alpha.3/doc/assets/hierarchy.js | 1 + .../v0.1.0-alpha.3/doc/assets/highlight.css | 22 + .../v0.1.0-alpha.3/doc/assets/icons.js | 18 + .../v0.1.0-alpha.3/doc/assets/icons.svg | 1 + .../v0.1.0-alpha.3/doc/assets/main.js | 60 + .../v0.1.0-alpha.3/doc/assets/navigation.js | 1 + .../v0.1.0-alpha.3/doc/assets/search.js | 1 + .../v0.1.0-alpha.3/doc/assets/style.css | 1633 +++++++++++++++++ .../discriminator.DiscriminatorRegistry.html | 22 + .../doc/classes/number.NumberUtility.html | 17 + .../random.RandomNumberGeneratorFactory.html | 39 + .../doc/classes/random.SeedVersions.html | 23 + .../random.SeededRandomNumberGenerator.html | 18 + .../doc/classes/string.StringUtility.html | 34 + .../v0.1.0-alpha.3/doc/hierarchy.html | 1 + .../v0.1.0-alpha.3/doc/index.html | 59 + ...scriminator.DiscriminatorRegistration.html | 14 + .../doc/interfaces/random.SeedVersion.html | 8 + .../v0.1.0-alpha.3/doc/modules.html | 1 + .../doc/modules/discriminator.html | 1 + .../v0.1.0-alpha.3/doc/modules/number.html | 1 + .../v0.1.0-alpha.3/doc/modules/random.html | 1 + .../v0.1.0-alpha.3/doc/modules/string.html | 1 + .../types/discriminator.Discriminated.html | 3 + .../doc/types/discriminator.TypeGuard.html | 3 + .../discriminator.discriminatedSchema.html | 3 + 27 files changed, 1987 insertions(+) create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/.nojekyll create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/hierarchy.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/highlight.css create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.svg create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/main.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/style.css create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/hierarchy.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/number.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/.nojekyll b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/.nojekyll new file mode 100644 index 0000000..e2ac661 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/hierarchy.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/hierarchy.js new file mode 100644 index 0000000..fb85f0a --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/hierarchy.js @@ -0,0 +1 @@ +window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/highlight.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/highlight.css new file mode 100644 index 0000000..5674cf3 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/highlight.css @@ -0,0 +1,22 @@ +:root { + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --code-background: var(--dark-code-background); +} + +pre, code { background: var(--code-background); } diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.js new file mode 100644 index 0000000..4fbadc5 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.svg b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.svg new file mode 100644 index 0000000..be7798f --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.svg @@ -0,0 +1 @@ +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/main.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/main.js new file mode 100644 index 0000000..8182cee --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","search_index_not_available":"The search index is not available","search_no_results_found_for_0":"No results found for {0}","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; +"use strict";(()=>{var Ke=Object.create;var he=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var et=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var tt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ze(e))!Ye.call(t,i)&&i!==n&&he(t,i,{get:()=>e[i],enumerable:!(r=Ge(e,i))||r.enumerable});return t};var nt=(t,e,n)=>(n=t!=null?Ke(Xe(t)):{},tt(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var ye=et((me,ge)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=(function(e){return function(n){e.console&&console.warn&&console.warn(n)}})(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,l],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?d+=2:a==c&&(n+=r[l+1]*i[d+1],l+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),f=s.str.charAt(1),p;f in s.node.edges?p=s.node.edges[f]:(p=new t.TokenSet,s.node.edges[f]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}if(s.type===t.QueryLexer.TERM)return t.QueryParser.parseTerm;var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},(function(e,n){typeof define=="function"&&define.amd?define(n):typeof me=="object"?ge.exports=n():e.lunr=n()})(this,function(){return t})})()});var M,G={getItem(){return null},setItem(){}},K;try{K=localStorage,M=K}catch{K=G,M=G}var S={getItem:t=>M.getItem(t),setItem:(t,e)=>M.setItem(t,e),disableWritingLocalStorage(){M=G},disable(){localStorage.clear(),M=G},enable(){M=K}};window.TypeDoc||={disableWritingLocalStorage(){S.disableWritingLocalStorage()},disableLocalStorage:()=>{S.disable()},enableLocalStorage:()=>{S.enable()}};window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",search_index_not_available:"The search index is not available",search_no_results_found_for_0:"No results found for {0}",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var pe=[];function X(t,e){pe.push({selector:e,constructor:t})}var Z=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){pe.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!rt(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function rt(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var fe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var Ie=nt(ye(),1);async function R(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}var Y="closing",ae="tsd-overlay";function it(){let t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.body.style.overflow="hidden",document.body.style.paddingRight=`${t}px`}function st(){document.body.style.removeProperty("overflow"),document.body.style.removeProperty("padding-right")}function Ee(t,e){t.addEventListener("animationend",()=>{t.classList.contains(Y)&&(t.classList.remove(Y),document.getElementById(ae)?.remove(),t.close(),st())}),t.addEventListener("cancel",n=>{n.preventDefault(),ve(t)}),e?.closeOnClick&&document.addEventListener("click",n=>{t.open&&!t.contains(n.target)&&ve(t)},!0)}function xe(t){if(t.open)return;let e=document.createElement("div");e.id=ae,document.body.appendChild(e),t.showModal(),it()}function ve(t){if(!t.open)return;document.getElementById(ae)?.classList.add(Y),t.classList.add(Y)}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var le={};function Le(t){for(let e of t.split(/\s+/))if(le.hasOwnProperty(e)&&!le[e])return!0;return!1}var ee=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=S.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){S.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),le[`tsd-is-${this.el.name}`]=this.value,this.app.filterChanged(),this.app.updateIndexVisibility()}};var we=0;async function Se(t,e){if(!window.searchData)return;let n=await R(window.searchData);t.data=n,t.index=Ie.Index.load(n.index),e.innerHTML=""}function _e(){let t=document.getElementById("tsd-search-trigger"),e=document.getElementById("tsd-search"),n=document.getElementById("tsd-search-input"),r=document.getElementById("tsd-search-results"),i=document.getElementById("tsd-search-script"),s=document.getElementById("tsd-search-status");if(!(t&&e&&n&&r&&i&&s))throw new Error("Search controls missing");let o={base:document.documentElement.dataset.base};o.base.endsWith("/")||(o.base+="/"),i.addEventListener("error",()=>{let a=window.translations.search_index_not_available;Pe(s,a)}),i.addEventListener("load",()=>{Se(o,s)}),Se(o,s),ot({trigger:t,searchEl:e,results:r,field:n,status:s},o)}function ot(t,e){let{field:n,results:r,searchEl:i,status:s,trigger:o}=t;Ee(i,{closeOnClick:!0});function a(){xe(i),n.setSelectionRange(0,n.value.length)}o.addEventListener("click",a),n.addEventListener("input",fe(()=>{at(r,n,s,e)},200)),n.addEventListener("keydown",l=>{if(r.childElementCount===0||l.ctrlKey||l.metaKey||l.altKey)return;let d=n.getAttribute("aria-activedescendant"),f=d?document.getElementById(d):null;if(f){let p=!1,v=!1;switch(l.key){case"Home":case"End":case"ArrowLeft":case"ArrowRight":v=!0;break;case"ArrowDown":case"ArrowUp":p=l.shiftKey;break}(p||v)&&ke(n)}if(!l.shiftKey)switch(l.key){case"Enter":f?.querySelector("a")?.click();break;case"ArrowUp":Te(r,n,f,-1),l.preventDefault();break;case"ArrowDown":Te(r,n,f,1),l.preventDefault();break}});function c(){ke(n)}n.addEventListener("change",c),n.addEventListener("blur",c),n.addEventListener("click",c),document.body.addEventListener("keydown",l=>{if(l.altKey||l.metaKey||l.shiftKey)return;let d=l.ctrlKey&&l.key==="k",f=!l.ctrlKey&&!ut()&&l.key==="/";(d||f)&&(l.preventDefault(),a())})}function at(t,e,n,r){if(!r.index||!r.data)return;t.innerHTML="",n.innerHTML="",we+=1;let i=e.value.trim(),s;if(i){let a=i.split(" ").map(c=>c.length?`*${c}*`:"").join(" ");s=r.index.search(a).filter(({ref:c})=>{let l=r.data.rows[Number(c)].classes;return!l||!Le(l)})}else s=[];if(s.length===0&&i){let a=window.translations.search_no_results_found_for_0.replace("{0}",` "${te(i)}" `);Pe(n,a);return}for(let a=0;ac.score-a.score);let o=Math.min(10,s.length);for(let a=0;a`,f=Ce(c.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(f+=` (score: ${s[a].score.toFixed(2)})`),c.parent&&(f=` + ${Ce(c.parent,i)}.${f}`);let p=document.createElement("li");p.id=`tsd-search:${we}-${a}`,p.role="option",p.ariaSelected="false",p.classList.value=c.classes??"";let v=document.createElement("a");v.tabIndex=-1,v.href=r.base+c.url,v.innerHTML=d+`${f}`,p.append(v),t.appendChild(p)}}function Te(t,e,n,r){let i;if(r===1?i=n?.nextElementSibling||t.firstElementChild:i=n?.previousElementSibling||t.lastElementChild,i!==n){if(!i||i.role!=="option"){console.error("Option missing");return}i.ariaSelected="true",i.scrollIntoView({behavior:"smooth",block:"nearest"}),e.setAttribute("aria-activedescendant",i.id),n?.setAttribute("aria-selected","false")}}function ke(t){let e=t.getAttribute("aria-activedescendant");(e?document.getElementById(e):null)?.setAttribute("aria-selected","false"),t.setAttribute("aria-activedescendant","")}function Ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var lt={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>lt[e])}function Pe(t,e){t.innerHTML=e?`
${e}
`:""}var ct=["button","checkbox","file","hidden","image","radio","range","reset","submit"];function ut(){let t=document.activeElement;return t?t.isContentEditable||t.tagName==="TEXTAREA"||t.tagName==="SEARCH"?!0:t.tagName==="INPUT"&&!ct.includes(t.type):!1}var D="mousedown",Me="mousemove",$="mouseup",ne={x:0,y:0},Qe=!1,ce=!1,dt=!1,F=!1,Oe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Oe?"is-mobile":"not-mobile");Oe&&"ontouchstart"in document.documentElement&&(dt=!0,D="touchstart",Me="touchmove",$="touchend");document.addEventListener(D,t=>{ce=!0,F=!1;let e=D=="touchstart"?t.targetTouches[0]:t;ne.y=e.pageY||0,ne.x=e.pageX||0});document.addEventListener(Me,t=>{if(ce&&!F){let e=D=="touchstart"?t.targetTouches[0]:t,n=ne.x-(e.pageX||0),r=ne.y-(e.pageY||0);F=Math.sqrt(n*n+r*r)>10}});document.addEventListener($,()=>{ce=!1});document.addEventListener("click",t=>{Qe&&(t.preventDefault(),t.stopImmediatePropagation(),Qe=!1)});var re=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener($,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(D,n=>this.onDocumentPointerDown(n)),document.addEventListener($,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){F||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!F&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ue=new Map,de=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;S.setItem(this.key,e.toString())}},ie=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(ue.has(i))s=ue.get(i);else{let o=S.getItem(i),a=o?o==="true":this.el.open;s=new de(i,a),ue.set(i,s)}s.add(this.el)}};function He(t){let e=S.getItem("tsd-theme")||"os";t.value=e,Ae(e),t.addEventListener("change",()=>{S.setItem("tsd-theme",t.value),Ae(t.value)})}function Ae(t){document.documentElement.dataset.theme=t}var se;function Ne(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Re),Re())}async function Re(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await R(window.navigationData);se=document.documentElement.dataset.base,se.endsWith("/")||(se+="/"),t.innerHTML="";for(let n of e)Ve(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ve(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',De(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let c=a.appendChild(document.createElement("ul"));c.className="tsd-nested-navigation";for(let l of t.children)Ve(l,c,i)}else De(t,r,t.class)}function De(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=se+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&(r.classList.add("current"),r.ariaCurrent="page"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(Fe(t.text,document.createElement("span")))}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(Fe(t.text,document.createElement("span")))}}function Fe(t,e){let n=t.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);for(let r=0;r{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=gt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function pt(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Be),Be())}async function Be(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await R(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),ft(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function ft(t,e,n){let r=e.roots.filter(i=>mt(e,i,n));for(let i of r)t.appendChild(je(e,i,n))}function je(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let c=t.reflections[a],l=s.appendChild(document.createElement("a"));l.textContent=c.name,l.href=oe+c.url,l.className=c.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=oe+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let c=je(t,a,n,r);c&&o.appendChild(c)}}return r.delete(e),s}function mt(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function gt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='',t}X(re,"a[data-toggle]");X(ie,".tsd-accordion");X(ee,".tsd-filter-item input[type=checkbox]");var qe=document.getElementById("tsd-theme");qe&&He(qe);var yt=new Z;Object.defineProperty(window,"app",{value:yt});_e();Ne();$e();"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0);})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js new file mode 100644 index 0000000..475b836 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "eJytlEtPwzAQhP8K2nMEtKg8ckMgKg5waKGXqgc3XpoViVPZW0SE8t9RkzZPJw0iV2dnvrE98fIHGL8ZXHiJ5C5AAw54PgVSowJ3mX+VZDxNISnBkQYHtoJ9cCHMRBeVz+c+hwE48ElKgju2Gz4EwphW3GPZb4YbMqzjAutl4hrWKqqGGY1vk1Xi5Jxnxag/hPenIIIpUkUYyj165Em1tQOaXFcyvcVbPLsPSPQ6HpRFEo63XSFQ1sCXdzejybiGnu6EPuGZj9n9yptZCE1i3atXKOeej6Eo2F9HcY1vEVWTXO1DlGOoXbhGS2+z9QEK+5oavTMFxJaiHjiVKVszy5m1UDIKm5mz9QEyz1KjLNMUFer94T4JjyPbv3bAdomaOyp2M0eUKK3qVlaH5hRqgdpQpEyn93Hon29Eycr6KjSJtgegjDSsSW2aV5+tD3D189Sota4HTmXKXtdVsvoFogoyxQ==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js new file mode 100644 index 0000000..1c782d3 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js @@ -0,0 +1 @@ +window.searchData = "eJy1mt1u2zgQhd+FvhVSz9D/l4vdFgWKoGja3hhGoViMQ6wtGZKcNmvk3ReUZGnGpBRace4Cm+fMIfmJZEQfRZr8zsRieRT/6jgSCwxEHO6UWIhIZ+tU73Qc5kkqAnFIt2Ihdkl02KrsA/v25jHfbUUg1tswy1QmFkK8BCdHwFnt+TdVfVMbneXpc+1dyc+8nRpHxUDsw1TFuRW9iYLDUZPlMcx6Vx6UYo/qbpO2TGnxvUr7ByMOV0k3nnROXpjrJK7T6jhX6UO49gpcSPvNIwxx9AqnPaMMzt36DmI5MC2Rn8Ktjq4SlzpdKyoO51MYo2veVVQnzp/3XWFV1PcR5cW/P+/Vp0OYdheuW/UrKp2rnoru1o9qF9aVn8JUh/f26ufQ9Ox8HSM+7O6VveqWH3svt7dF8x+53urcXmYrM9aoO3eVqmXx0tlHHetc3fLsr5Yb6OyhENad7qrODdqzfI5ztbkwhq4110jwNcl0rp9UnyT7SvvWRM3OEsZRsrOAKj/2Bupb0bys9knFKjUAfwzXeeLYxivvLk03blXmlgEOs+d4/ddBb6PelQeFx33l0RWi06st4f3bwl0zF53EO6UiFTmFbWE7JBdO4RgaJtdJnOXpYf2GwgPu0TlUXf1umcFY/cl7R6vEV8h0Pns/VZrpJLbPr8T11ObSR2yCMGpOKpn+T3lXGVStX+1xnb9l2Dcqr5r4196o/KnWvDmBzn6ak9XnOFJ//DPorDiP6UrVKwU5cJMmroOibXThXLMzafLwkKk8u6DQoJH49tS5NWV5quONtTWVH3tvTXdF87azTmXGGnWPVpWq48mIN1v1RcfqS/JbpeswU99Tvdup6GuY5yq10W3NMCi9tjpW25NXXnrta6+ulNzTJ/MVor5zwh/7/dVG9XDyulJmvlLcJvE/u33+fMc5fj2gzuIkVkZaPwLXyHPXSmaPhO1ovlPma0R934TnZL4p6jma183cI1mf+qtAlHve4ihOm/BC4I28mYtAPGi1jcw7xjJYINbJbmfsAhEl60Px56pq9lOZk5xpXLb+MBTBchjg9GY0latVsDyJiy+KD04ezSeFEESwhEDizXgGTAiWEJgQRbBElxAtITKhFMFSuoTSEkomHIlgOXIJR5ZwxITjtsEZW8IxE05EsBy7Kk4s4YQJpyJYTlzCqSWcMuFMBMupSzizhDMmnItgOXMJ55ZwzgEwPMydBNjswBk8BT1Dp9jBDwcIDBbgZs9mCDhEYNAAJ39gcwQcJDB4gJNBsFkCDhMYRMDJIdg8AQcKDCbgRApspoBDBQYVcGIFNlfAwQKDCzjRApst4HCBQQaceIHNF3DA0DADTsLQJgw5YWiYQSdhaBOGZ0tUsUY5CUPHKsUJQ8MMulc4mzDkhKFhBp2EoU0YcsLQMINOwtAmDDlhaJhBJ2FoE4acMDTMoJMwtAlDThgaZtBJGNqEIScMDTPoJAxtwpATJg0z6CRM2oRJTpg0zEgnYdImTHLCpGFGOgmTNmHybCMsdkInYdKxF3LCpGFGuvdRmzDJCZOGGekkTNqESU6YNMxIJ2HSJkxywqRhRjoJkzZh1UfFuelJpbmq3jSYYw99J3kUv6qDFdSvBY4CpmJxfHlpDlKL4ws5S5nvTDXbY0o8Zl4e7PUacZo3Tjj0cor4LVLjRTrm1y/mlFVXNI3frPGbX+rHezlsnIaldny5YcouShvzUWM+6u36zCaFzK6XI31l1tigJHPrF624DScOxMBLf34BRPpEO+VrVl+aEB+SCaSnz/l/542dJHbS18660yHxyJiD35j7/GtOApMC8vIC7b4EY+n3dPj890sKjEmBiW8B24asMtJvmeEvcwndpMvo1+XyJoBYkJUF/Z5V+9EgSzD4LcGlx+H0ipTgR/KAX5763S/pFRlj9Bvj060kiUJGF/xGtzQpO7c53Z48nC4liTVBCfxQan5NQ1AiJHmZZMUdjzMli0c2LvDbuYyzawUnHUW/jhInPqdk/UW/9dfjZTbxJxRLP4rb30CTOSJASz+gPd4WE38yLNJ3WMzdGOk53SU9QbKWNSQnOvQ70ZUmjkUACX/ox5/5Kc6m/HFO40Mi+SUiv2FqXAjCHgSvArHX+2L2xGK5enn5H39Tt60="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/style.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/style.css new file mode 100644 index 0000000..44328e9 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/style.css @@ -0,0 +1,1633 @@ +@layer typedoc { + :root { + --dim-toolbar-contents-height: 2.5rem; + --dim-toolbar-border-bottom-width: 1px; + --dim-header-height: calc( + var(--dim-toolbar-border-bottom-width) + + var(--dim-toolbar-contents-height) + ); + + /* 0rem For mobile; unit is required for calculation in `calc` */ + --dim-container-main-margin-y: 0rem; + + --dim-footer-height: 3.5rem; + + --modal-animation-duration: 0.2s; + } + + :root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --light-color-background-active: #d6d8da; + --light-color-background-warning: #e6e600; + --light-color-warning-text: #222; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-background-active); + --light-color-text: #222; + --light-color-contrast-text: #000; + --light-color-text-aside: #5e5e5e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: #9f5f30; + --light-color-ts-method: #be3989; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var( + --light-color-ts-constructor + ); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #c73c3c; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-color-alert-note: #0969d9; + --light-color-alert-tip: #1a7f37; + --light-color-alert-important: #8250df; + --light-color-alert-warning: #9a6700; + --light-color-alert-caution: #cf222e; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + } + + :root { + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --dark-color-background-active: #5d5d6a; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: var(--dark-color-background-active); + --dark-color-text: #f5f5f5; + --dark-color-contrast-text: #ffffff; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff6060; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-color-alert-note: #0969d9; + --dark-color-alert-tip: #1a7f37; + --dark-color-alert-important: #8250df; + --dark-color-alert-warning: #9a6700; + --dark-color-alert-caution: #cf222e; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; + } + + @media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var( + --light-color-background-secondary + ); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-alert-note: var(--light-color-alert-note); + --color-alert-tip: var(--light-color-alert-tip); + --color-alert-important: var(--light-color-alert-important); + --color-alert-warning: var(--light-color-alert-warning); + --color-alert-caution: var(--light-color-alert-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + } + + @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var( + --dark-color-background-secondary + ); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-alert-note: var(--dark-color-alert-note); + --color-alert-tip: var(--dark-color-alert-tip); + --color-alert-important: var(--dark-color-alert-important); + --color-alert-warning: var(--dark-color-alert-warning); + --color-alert-caution: var(--dark-color-alert-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + } + + :root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-note: var(--light-color-note); + --color-tip: var(--light-color-tip); + --color-important: var(--light-color-important); + --color-warning: var(--light-color-warning); + --color-caution: var(--light-color-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + + :root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-note: var(--dark-color-note); + --color-tip: var(--dark-color-tip); + --color-important: var(--dark-color-important); + --color-warning: var(--dark-color-warning); + --color-caution: var(--dark-color-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + + html { + color-scheme: var(--color-scheme); + @media (prefers-reduced-motion: no-preference) { + scroll-behavior: smooth; + } + } + + *:focus-visible, + .tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); + } + + .always-visible, + .always-visible .tsd-signatures { + display: inherit !important; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.2; + } + + h1 { + font-size: 1.875rem; + margin: 0.67rem 0; + } + + h2 { + font-size: 1.5rem; + margin: 0.83rem 0; + } + + h3 { + font-size: 1.25rem; + margin: 1rem 0; + } + + h4 { + font-size: 1.05rem; + margin: 1.33rem 0; + } + + h5 { + font-size: 1rem; + margin: 1.5rem 0; + } + + h6 { + font-size: 0.875rem; + margin: 2.33rem 0; + } + + dl, + menu, + ol, + ul { + margin: 1em 0; + } + + dd { + margin: 0 0 0 34px; + } + + .container { + max-width: 1700px; + padding: 0 2rem; + } + + /* Footer */ + footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: var(--dim-footer-height); + } + footer > p { + margin: 0 1em; + } + + .container-main { + margin: var(--dim-container-main-margin-y) auto; + /* toolbar, footer, margin */ + min-height: calc( + 100svh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + } + + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } + } + @keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } + } + @keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } + } + body { + background: var(--color-background); + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); + margin: 0; + } + + a { + color: var(--color-link); + text-decoration: none; + } + a:hover { + text-decoration: underline; + } + a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; + } + a.tsd-anchor-link { + color: var(--color-text); + } + :target { + scroll-margin-block: calc(var(--dim-header-height) + 0.5rem); + } + + code, + pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; + } + + pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); + margin-bottom: 8px; + } + pre code { + padding: 0; + font-size: 100%; + } + pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; + } + pre:hover > button, + pre > button.visible, + pre > button:focus-visible { + opacity: 1; + } + + blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; + } + + img { + max-width: 100%; + } + + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); + } + + *::-webkit-scrollbar { + width: 0.75rem; + } + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); + } + + dialog { + border: none; + outline: none; + padding: 0; + background-color: var(--color-background); + } + dialog::backdrop { + display: none; + } + #tsd-overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + z-index: 9999; + top: 0; + left: 0; + right: 0; + bottom: 0; + animation: fade-in var(--modal-animation-duration) forwards; + } + #tsd-overlay.closing { + animation-name: fade-out; + } + + .tsd-typography { + line-height: 1.333em; + } + .tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; + } + .tsd-typography .tsd-index-panel h3, + .tsd-index-panel .tsd-typography h3, + .tsd-typography h4, + .tsd-typography h5, + .tsd-typography h6 { + font-size: 1em; + } + .tsd-typography h5, + .tsd-typography h6 { + font-weight: normal; + } + .tsd-typography p, + .tsd-typography ul, + .tsd-typography ol { + margin: 1em 0; + } + .tsd-typography table { + border-collapse: collapse; + border: none; + } + .tsd-typography td, + .tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); + } + .tsd-typography thead, + .tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); + } + + .tsd-alert { + padding: 8px 16px; + margin-bottom: 16px; + border-left: 0.25em solid var(--alert-color); + } + .tsd-alert blockquote > :last-child, + .tsd-alert > :last-child { + margin-bottom: 0; + } + .tsd-alert-title { + color: var(--alert-color); + display: inline-flex; + align-items: center; + } + .tsd-alert-title span { + margin-left: 4px; + } + + .tsd-alert-note { + --alert-color: var(--color-alert-note); + } + .tsd-alert-tip { + --alert-color: var(--color-alert-tip); + } + .tsd-alert-important { + --alert-color: var(--color-alert-important); + } + .tsd-alert-warning { + --alert-color: var(--color-alert-warning); + } + .tsd-alert-caution { + --alert-color: var(--color-alert-caution); + } + + .tsd-breadcrumb { + margin: 0; + margin-top: 1rem; + padding: 0; + color: var(--color-text-aside); + } + .tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; + } + .tsd-breadcrumb a:hover { + text-decoration: underline; + } + .tsd-breadcrumb li { + display: inline; + } + .tsd-breadcrumb li:after { + content: " / "; + } + + .tsd-comment-tags { + display: flex; + flex-direction: column; + } + dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; + } + dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; + } + dl.tsd-comment-tag-group dd { + margin: 0; + } + code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; + } + h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; + } + + dl.tsd-comment-tag-group dd:before, + dl.tsd-comment-tag-group dd:after { + content: " "; + } + dl.tsd-comment-tag-group dd pre, + dl.tsd-comment-tag-group dd:after { + clear: both; + } + dl.tsd-comment-tag-group p { + margin: 0; + } + + .tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; + } + .tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; + } + + .tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; + } + .tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; + } + .tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + } + .tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; + } + .tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; + } + .tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; + } + .tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); + } + .tsd-checkbox-background { + fill: var(--color-accent); + } + input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); + } + + .settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; + } + + .tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; + } + + .tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; + } + + .tsd-hierarchy h4 label:hover span { + text-decoration: underline; + } + + .tsd-hierarchy { + list-style: square; + margin: 0; + } + .tsd-hierarchy-target { + font-weight: bold; + } + .tsd-hierarchy-toggle { + color: var(--color-link); + cursor: pointer; + } + + .tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); + } + .tsd-full-hierarchy, + .tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; + } + .tsd-full-hierarchy ul { + padding-left: 1.5rem; + } + .tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-full-hierarchy svg[data-dropdown] { + cursor: pointer; + } + .tsd-full-hierarchy svg[data-dropdown="false"] { + transform: rotate(-90deg); + } + .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { + display: none; + } + + .tsd-panel-group.tsd-index-group { + margin-bottom: 0; + } + .tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; + } + @media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } + } + @media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } + } + .tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; + } + + .tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; + } + + .tsd-anchor { + position: relative; + top: -100px; + } + + .tsd-member { + position: relative; + } + .tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; + } + + .tsd-navigation.settings { + margin: 0; + margin-bottom: 1rem; + } + .tsd-navigation > a, + .tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; + } + .tsd-navigation a, + .tsd-navigation summary > span, + .tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background: var(--color-active-menu-item); + color: var(--color-contrast-text); + } + .tsd-navigation a:hover, + .tsd-page-navigation a:hover { + text-decoration: underline; + } + .tsd-navigation ul, + .tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; + } + .tsd-navigation li, + .tsd-page-navigation li { + padding: 0; + max-width: 100%; + } + .tsd-navigation .tsd-nav-link { + display: none; + } + .tsd-nested-navigation { + margin-left: 3rem; + } + .tsd-nested-navigation > li > details { + margin-left: -1.5rem; + } + .tsd-small-nested-navigation { + margin-left: 1.5rem; + } + .tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; + } + + .tsd-page-navigation-section > summary { + padding: 0.25rem; + } + .tsd-page-navigation-section > summary > svg { + margin-right: 0.25rem; + } + .tsd-page-navigation-section > div { + margin-left: 30px; + } + .tsd-page-navigation ul { + padding-left: 1.75rem; + } + + #tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; + } + #tsd-sidebar-links a:last-of-type { + margin-bottom: 0; + } + + a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ + display: flex; + align-items: center; + gap: 0.25rem; + box-sizing: border-box; + } + .tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ + } + .tsd-accordion-summary, + .tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; + } + .tsd-accordion-summary a { + width: calc(100% - 1.5rem); + } + .tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + } + /* + * We need to be careful to target the arrow indicating whether the accordion + * is open, but not any other SVGs included in the details element. + */ + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child { + transform: rotate(-90deg); + } + .tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; + } + .tsd-index-summary { + margin-top: 1.5rem; + margin-bottom: 0.75rem; + display: flex; + align-content: center; + } + + .tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; + } + .tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; + } + + .tsd-panel { + margin-bottom: 2.5rem; + } + .tsd-panel.tsd-member { + margin-bottom: 4rem; + } + .tsd-panel:empty { + display: none; + } + .tsd-panel > h1, + .tsd-panel > h2, + .tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; + } + .tsd-panel > h1.tsd-before-signature, + .tsd-panel > h2.tsd-before-signature, + .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; + } + + .tsd-panel-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group details { + margin: 2rem 0; + } + .tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; + } + + #tsd-search[open] { + animation: fade-in var(--modal-animation-duration) ease-out forwards; + } + #tsd-search[open].closing { + animation-name: fade-out; + } + + /* Avoid setting `display` on closed dialog */ + #tsd-search[open] { + display: flex; + flex-direction: column; + padding: 1rem; + width: 32rem; + max-width: 90vw; + max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh); + /* Anchor dialog to top */ + margin-top: 10vh; + border-radius: 6px; + will-change: max-height; + } + #tsd-search-input { + box-sizing: border-box; + width: 100%; + padding: 0 0.625rem; /* 10px */ + outline: 0; + border: 2px solid var(--color-accent); + background-color: transparent; + color: var(--color-text); + border-radius: 4px; + height: 2.5rem; + flex: 0 0 auto; + font-size: 0.875rem; + transition: border-color 0.2s, background-color 0.2s; + } + #tsd-search-input:focus-visible { + background-color: var(--color-background-active); + border-color: transparent; + color: var(--color-contrast-text); + } + #tsd-search-input::placeholder { + color: inherit; + opacity: 0.8; + } + #tsd-search-results { + margin: 0; + padding: 0; + list-style: none; + flex: 1 1 auto; + display: flex; + flex-direction: column; + overflow-y: auto; + } + #tsd-search-results:not(:empty) { + margin-top: 0.5rem; + } + #tsd-search-results > li { + background-color: var(--color-background); + line-height: 1.5; + box-sizing: border-box; + border-radius: 4px; + } + #tsd-search-results > li:nth-child(even) { + background-color: var(--color-background-secondary); + } + #tsd-search-results > li:is(:hover, [aria-selected="true"]) { + background-color: var(--color-background-active); + color: var(--color-contrast-text); + } + /* It's important that this takes full size of parent `li`, to capture a click on `li` */ + #tsd-search-results > li > a { + display: flex; + align-items: center; + padding: 0.5rem 0.25rem; + box-sizing: border-box; + width: 100%; + } + #tsd-search-results > li > a > .text { + flex: 1 1 auto; + min-width: 0; + overflow-wrap: anywhere; + } + #tsd-search-results > li > a .parent { + color: var(--color-text-aside); + } + #tsd-search-results > li > a mark { + color: inherit; + background-color: inherit; + font-weight: bold; + } + #tsd-search-status { + flex: 1; + display: grid; + place-content: center; + text-align: center; + overflow-wrap: anywhere; + } + #tsd-search-status:not(:empty) { + min-height: 6rem; + } + + .tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; + } + + .tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; + } + + .tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; + } + + .tsd-signature-type { + font-style: italic; + font-weight: normal; + } + + .tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; + } + .tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; + } + .tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; + } + .tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; + } + .tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; + } + + ul.tsd-parameter-list, + ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; + } + ul.tsd-parameter-list > li.tsd-parameter-signature, + ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; + } + ul.tsd-parameter-list h5, + ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; + } + .tsd-sources { + margin-top: 1rem; + font-size: 0.875em; + } + .tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; + } + .tsd-sources ul { + list-style: none; + padding: 0; + } + + .tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: var(--dim-toolbar-border-bottom-width) + var(--color-accent) solid; + transition: transform 0.3s ease-in-out; + } + .tsd-page-toolbar a { + color: var(--color-text); + } + .tsd-toolbar-contents { + display: flex; + align-items: center; + height: var(--dim-toolbar-contents-height); + margin: 0 auto; + } + .tsd-toolbar-contents > .title { + font-weight: bold; + margin-right: auto; + } + #tsd-toolbar-links { + display: flex; + align-items: center; + gap: 1.5rem; + margin-right: 1rem; + } + + .tsd-widget { + box-sizing: border-box; + display: inline-block; + opacity: 0.8; + height: 2.5rem; + width: 2.5rem; + transition: opacity 0.1s, background-color 0.1s; + text-align: center; + cursor: pointer; + border: none; + background-color: transparent; + } + .tsd-widget:hover { + opacity: 0.9; + } + .tsd-widget:active { + opacity: 1; + background-color: var(--color-accent); + } + #tsd-toolbar-menu-trigger { + display: none; + } + + .tsd-member-summary-name { + display: inline-flex; + align-items: center; + padding: 0.25rem; + text-decoration: none; + } + + .tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + color: var(--color-text); + vertical-align: middle; + } + + .tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; + } + + .tsd-member-summary-name:hover > .tsd-anchor-icon svg, + .tsd-anchor-link:hover > .tsd-anchor-icon svg, + .tsd-anchor-icon:focus-visible svg { + visibility: visible; + } + + .deprecated { + text-decoration: line-through !important; + } + + .warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); + } + + .tsd-kind-project { + color: var(--color-ts-project); + } + .tsd-kind-module { + color: var(--color-ts-module); + } + .tsd-kind-namespace { + color: var(--color-ts-namespace); + } + .tsd-kind-enum { + color: var(--color-ts-enum); + } + .tsd-kind-enum-member { + color: var(--color-ts-enum-member); + } + .tsd-kind-variable { + color: var(--color-ts-variable); + } + .tsd-kind-function { + color: var(--color-ts-function); + } + .tsd-kind-class { + color: var(--color-ts-class); + } + .tsd-kind-interface { + color: var(--color-ts-interface); + } + .tsd-kind-constructor { + color: var(--color-ts-constructor); + } + .tsd-kind-property { + color: var(--color-ts-property); + } + .tsd-kind-method { + color: var(--color-ts-method); + } + .tsd-kind-reference { + color: var(--color-ts-reference); + } + .tsd-kind-call-signature { + color: var(--color-ts-call-signature); + } + .tsd-kind-index-signature { + color: var(--color-ts-index-signature); + } + .tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); + } + .tsd-kind-parameter { + color: var(--color-ts-parameter); + } + .tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); + } + .tsd-kind-accessor { + color: var(--color-ts-accessor); + } + .tsd-kind-get-signature { + color: var(--color-ts-get-signature); + } + .tsd-kind-set-signature { + color: var(--color-ts-set-signature); + } + .tsd-kind-type-alias { + color: var(--color-ts-type-alias); + } + + /* if we have a kind icon, don't color the text by kind */ + .tsd-kind-icon ~ span { + color: var(--color-text); + } + + /* mobile */ + @media (max-width: 769px) { + #tsd-toolbar-menu-trigger { + display: inline-block; + /* temporary fix to vertically align, for compatibility */ + line-height: 2.5; + } + #tsd-toolbar-links { + display: none; + } + + .container-main { + display: flex; + } + .col-content { + float: none; + max-width: 100%; + width: 100%; + } + .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + .col-sidebar > *:last-child { + padding-bottom: 20px; + } + .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } + } + + /* one sidebar */ + @media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + --dim-container-main-margin-y: 2rem; + } + + .tsd-breadcrumb { + margin-top: 0; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + .site-menu { + margin-top: 1rem; + } + } + + /* two sidebars */ + @media (min-width: 1200px) { + .container-main { + grid-template-columns: + minmax(0, 1fr) minmax(0, 2.5fr) minmax( + 0, + 20rem + ); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 0rem; + } + + .page-menu, + .site-menu { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + } +} diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html new file mode 100644 index 0000000..2b37db7 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html @@ -0,0 +1,22 @@ +DiscriminatorRegistry | @blwat/utils - v0.1.0-alpha.3

Class DiscriminatorRegistry

Static registry for managing discriminators and their associated type guards. +Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

+

0.1.0

+
Index

Methods

Methods

  • Checks if a discriminator is already registered.

    +

    Parameters

    • discriminator: string

      The discriminator value to check.

      +

    Returns boolean

      +
    • true if the discriminator is registered, false otherwise.
    • +
    +

    0.1.0

    +

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html new file mode 100644 index 0000000..0c3aa30 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html @@ -0,0 +1,17 @@ +NumberUtility | @blwat/utils - v0.1.0-alpha.3

Class NumberUtility

Static properties and methods for validating number types.

+

0.1.0

+
Index

Methods

  • Is the given input a finite number?

    +

    Parameters

    • input: unknown

    Returns input is number

    true when the input is a finite number; false otherwise.

    +

    0.1.0

    +
  • Is the given input an integer?

    +

    Parameters

    • input: unknown

    Returns input is number

    true when the input is an integer; false otherwise.

    +

    0.1.0

    +
  • Is the given input a positive integer?

    +

    Parameters

    • input: unknown
    • OptionalzeroInclusive: boolean

      true if zero should be considered a valid input. +false if zero should be considered an invalid input.

      +

    Returns input is number

    true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

    +

    0.1.0

    +

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html new file mode 100644 index 0000000..6d7a8c7 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html @@ -0,0 +1,39 @@ +RandomNumberGeneratorFactory | @blwat/utils - v0.1.0-alpha.3

Class RandomNumberGeneratorFactory

A static factory class for creating a SeededRandomNumberGenerator object.

+

0.1.0

+
Index

Methods

Methods

  • Build a SeededRandomNumberGenerator object with the given seed and namespace from an asynchronous hashing algorithm.

    +

    Parameters

    • seed: string

      The primary input to determine the random number sequence.

      +
    • Optionalnamespace: string

      Namespace to create different sequences from the same seed.

      +

    Returns Promise<SeededRandomNumberGenerator>

    This method relies on the Web Crypto API via crypto.subtle. +In Node.js environments, ensure you are using a version where the Web Crypto API is available.

    +
      +
    • When the given seed is not a string.
    • +
    +
      +
    • When the given namespace is not a string.
    • +
    +

    0.1.0

    +

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html new file mode 100644 index 0000000..f531ac6 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html @@ -0,0 +1,23 @@ +SeedVersions | @blwat/utils - v0.1.0-alpha.3

Class SeedVersions

A static class for accessing different seed versions. +Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

+

0.1.0

+
Index

Accessors

Methods

Accessors

Methods

  • Is the given index a valid seed version?

    +

    Parameters

    • index: number

      The index to check.

      +

    Returns boolean

    0.1.0

    +

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html new file mode 100644 index 0000000..4fec4e9 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html @@ -0,0 +1,18 @@ +SeededRandomNumberGenerator | @blwat/utils - v0.1.0-alpha.3

Class SeededRandomNumberGenerator

Deterministic seeded pseudorandom number generator. +This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

+

0.1.0

+
Index

Constructors

Methods

Constructors

  • Parameters

    • state: [number, number, number, number]

      Initial 128-bit state. +Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

      +

    Returns SeededRandomNumberGenerator

    If state is not an array with 4 elements.

    +

    If each element of state is not a 32-bit unsigned integer.

    +

    If state does not have at least one element that is greater than 0.

    +

    0.1.0

    +

Methods

  • Returns number

      +
    • The next pseudorandom float in the range [0, 1).
    • +
    +

    This method advances the internal 128-bit xoshiro128** state by one step. +Successive calls produce an independent, uniformly distributed sequence.

    +

    0.1.0

    +

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html new file mode 100644 index 0000000..8ca981b --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html @@ -0,0 +1,34 @@ +StringUtility | @blwat/utils - v0.1.0-alpha.3

Class StringUtility

Static properties and methods for validating string types.

+

0.1.0

+
Index

Accessors

  • get singleLineLowercaseTrimmedPattern(): RegExp

    Returns RegExp

    Regular expression pattern for validating single-line lowercase strings.

    +

    This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

    +

    0.1.0

    +
  • get singleLineTrimmedPattern(): RegExp

    Returns RegExp

    Regular expression pattern for validating single-line mixed-case strings.

    +

    This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

    +

    0.1.0

    +
  • get singleLineUppercaseTrimmedPattern(): RegExp

    Returns RegExp

    Regular expression pattern for validating single-line uppercase strings.

    +

    This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

    +

    0.1.0

    +

Methods

  • Is the given input a non-empty string? +Non-empty strings must contain at least one non-whitespace character.

    +

    Parameters

    • input: unknown

    Returns boolean

    0.1.0

    +
  • Is the given input a string?

    +

    Parameters

    • input: unknown

    Returns input is string

    0.1.0

    +

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/hierarchy.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/hierarchy.html new file mode 100644 index 0000000..c6467b3 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/hierarchy.html @@ -0,0 +1 @@ +@blwat/utils - v0.1.0-alpha.3

@blwat/utils - v0.1.0-alpha.3

Hierarchy Summary

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html new file mode 100644 index 0000000..11b4d05 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html @@ -0,0 +1,59 @@ +@blwat/utils - v0.1.0-alpha.3

@blwat/utils - v0.1.0-alpha.3

TypeScript Utilities

+

A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development.

+ + + +

The source code of this project is licensed under the MIT License. +The full text of the license is included with the project source code.

+ + +

npm License +npm Version +npm @alpha Version +npm Types +npm Node Version +npm Weekly Downloads +npm Total Downloads +npm Last Update +npm Unpacked Size

+ +

Socket Score

+ +

Bundlephobia Tree Shaking +Bundlephobia Dependency Count +Bundlephobia Minified +Bundlephobia Minified + gzip

+ +

Package Phobia Install Size +Package Phobia Publish Size

+ +

GitHub License +GitHub Dependabot +GitHub Latest Release +GitHub Releases +GitHub Last Commit +GitHub Commits +GitHub Commit Activity +GitHub Code Size in Bytes +GitHub Repo Size +GitHub Repo File or Directory Count +GitHub Language Count

+ +

CodeQL +npm Lint, Build, and Test +Deploy GitHub Pages with Jekyll

+ + + +

A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation.

+

A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. +Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer.

+
+

Copyright © 2024-2026 Brittni Watkins.

+

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html new file mode 100644 index 0000000..8b361b5 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -0,0 +1,14 @@ +DiscriminatorRegistration | @blwat/utils - v0.1.0-alpha.3

Interface DiscriminatorRegistration

A registration for a discriminator to the DiscriminatorRegistry.

+

0.1.0

+
interface DiscriminatorRegistration {
    discriminator: string;
    validator: (input: unknown) => boolean;
}
Index

Properties

discriminator: string

The discriminator value that identifies the type of a Discriminated object. +This value must be unique across all registered discriminators.

+

0.1.0

+
validator: (input: unknown) => boolean

A method that validates whether an input matches the type associated with the discriminator.

+

Type Declaration

    • (input: unknown): boolean
    • Parameters

      • input: unknown

        The input to validate.

        +

      Returns boolean

        +
      • true if the input matches the type associated with the discriminator, false otherwise.
      • +
      +

0.1.0

+

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html new file mode 100644 index 0000000..0763635 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html @@ -0,0 +1,8 @@ +SeedVersion | @blwat/utils - v0.1.0-alpha.3

Interface SeedVersion

A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. +A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

+

0.1.0

+
interface SeedVersion {
    offsets: readonly [number, number, number, number];
}
Index

Properties

Properties

offsets: readonly [number, number, number, number]

A collection of offset values for the FNV-1a hashing algorithm. +Each offset value should be a 32-bit unsigned integer.

+

0.1.0

+

Generated using TypeDoc


Copyright © 2024-2026 Brittni Watkins.

diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules.html new file mode 100644 index 0000000..00c886e --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules.html @@ -0,0 +1 @@ +@blwat/utils - v0.1.0-alpha.3

    @blwat/utils - v0.1.0-alpha.3

    Modules

    discriminator
    number
    random
    string

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html new file mode 100644 index 0000000..0f75c72 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html @@ -0,0 +1 @@ +discriminator | @blwat/utils - v0.1.0-alpha.3

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/number.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/number.html new file mode 100644 index 0000000..50159c0 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/number.html @@ -0,0 +1 @@ +number | @blwat/utils - v0.1.0-alpha.3

    Module number

    Classes

    NumberUtility

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html new file mode 100644 index 0000000..d8d8edb --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html @@ -0,0 +1 @@ +random | @blwat/utils - v0.1.0-alpha.3

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html new file mode 100644 index 0000000..5f760de --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html @@ -0,0 +1 @@ +string | @blwat/utils - v0.1.0-alpha.3

    Module string

    Classes

    StringUtility

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html new file mode 100644 index 0000000..6f3b38c --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html @@ -0,0 +1,3 @@ +Discriminated | @blwat/utils - v0.1.0-alpha.3

    Type Alias Discriminated

    Discriminated: Static<typeof discriminatedSchema>

    Discriminated objects can be type checked using the discriminator registry.

    +

    0.1.0

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html new file mode 100644 index 0000000..9219040 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html @@ -0,0 +1,3 @@ +TypeGuard | @blwat/utils - v0.1.0-alpha.3

    Type Alias TypeGuard<T>

    TypeGuard: (input: unknown) => input is T

    A type guard function that checks if an input is of a specific Discriminated type.

    +

    Type Parameters

    Type Declaration

      • (input: unknown): input is T
      • Parameters

        • input: unknown

        Returns input is T

    0.1.0

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html new file mode 100644 index 0000000..41f1bdc --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html @@ -0,0 +1,3 @@ +discriminatedSchema | @blwat/utils - v0.1.0-alpha.3

    Variable discriminatedSchemaConst

    discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

    TypeBox schema for validating that an object implements the Discriminated type.

    +

    0.1.0

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    From 48affba0d34d5220e1059ab8f1bd17f058f83734 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 21 Jun 2026 11:53:24 -0500 Subject: [PATCH 005/122] Update GitHub Pages title. --- docs/_config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/_config.yml b/docs/_config.yml index d25caad..c610489 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -38,7 +38,7 @@ minima: nav_pages: - index.md -title: "TypeScript Utilities, by Brittni Watkins" +title: "TypeScript Utilities" description: "A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development." show_downloads: true From 5e538c20f7d0906d7ba06280af4f244c0f94e1fd Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 21 Jun 2026 12:49:10 -0500 Subject: [PATCH 006/122] Update .gitignore, copilot-instructions.md, portfolio-skills.md, index.md, and README.md --- .github/copilot-instructions.md | 11 +++++++---- .gitignore | 3 +++ README.md | 2 +- docs/index.md | 2 +- docs/portfolio-skills.md | 25 ++++++++++++------------- 5 files changed, 24 insertions(+), 19 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 7527593..ca2bd2b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -234,10 +234,11 @@ Generate a Markdown file with these sections in order: Use consistent capitalization across similar projects, keep labels semantically precise, and keep tool mentions durable (avoid hardcoded versions, exact cadences, or similarly brittle operational details unless they are intentionally maintained). -5. **Skills and Tooling Inventory** (categorized lists) +5. **Skills and Tooling Inventory** (flat bulleted list with bold category labels, e.g., `- **Category:** [Tool](url), [Tool](url)`) - Languages - - Runtime & Frameworks (or similar category) - - Key libraries and middleware + - Runtime (or similar category) + - Frameworks (or similar category) + - Libraries (or similar category) - Testing - Build / Bundling - Code Quality @@ -250,12 +251,13 @@ Generate a Markdown file with these sections in order: - Code Analysis / Security - Dependency Automation - Development Utilities - - Environment Management + - Environment Configuration (or similar category) - Development Environments - AI-Assisted Development Link each tool/language to its official documentation. Keep categories semantically precise: do not group unrelated concerns together (for example, CI automation, deployment/hosting, code analysis/security, and dependency automation should usually remain separate). + Omit categories that do not apply to the project; add context-specific categories where appropriate. 6. **Capability Record** (bulleted list) - 5–10 bullets describing what this project demonstrates @@ -433,6 +435,7 @@ When reviewing a new page, compare with existing template pages for: - heading style/casing - label style in `At a Glance` +- label style and format in `Skills and Tooling Inventory` (flat bulleted list with bold category labels) - tense and sentence style - bullet punctuation consistency - naming conventions (`webpack` vs `Webpack`, etc.) diff --git a/.gitignore b/.gitignore index c609ed4..4a34af8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ # Visual Studio Code .vscode/ +# Claude Code +.claude/ + # Node.js and npm node_modules/ diff --git a/README.md b/README.md index bad81b9..59df1ac 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ The full text of the license is included with the project source code. ## Thank Yous A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation. -A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. +A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of algorithmic art, web development, and computer science. Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer. ---- diff --git a/docs/index.md b/docs/index.md index cbe140c..a65cb59 100644 --- a/docs/index.md +++ b/docs/index.md @@ -65,5 +65,5 @@ The full text of the license is included with the project source code. ## Thank Yous A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation. -A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. +A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of algorithmic art, web development, and computer science. Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer. diff --git a/docs/portfolio-skills.md b/docs/portfolio-skills.md index 736b22a..eb23866 100644 --- a/docs/portfolio-skills.md +++ b/docs/portfolio-skills.md @@ -10,29 +10,28 @@ toc: true --- ## About This Page - This page is a technical record of the skills, tools, and engineering practices represented in the TypeScript Utilities project. ## Project Overview - -TypeScript Utilities (`@blwat/utils`) is a growing, domain-agnostic utility package that provides reusable helpers for number checks, string checks, deterministic seeded pseudorandom number generation, and a discriminator-based type guard registry. The repository is maintained at [blwatkins/typescript-utils](https://github.com/blwatkins/typescript-utils), and it is built with TypeScript and tsdown. +TypeScript Utilities (`@blwat/utils`) is a growing, domain-agnostic utility package that provides reusable helpers for number checks, string checks, deterministic seeded pseudorandom number generation, and a discriminator-based type guard registry. The project is maintained at [github.com/blwatkins/typescript-utils](https://github.com/blwatkins/typescript-utils) and built with TypeScript, tsdown (ESM bundling), and Vitest for testing. GitHub Actions automates linting, building, testing, and publishing. ## At a Glance - **Project Type:** TypeScript utility library package -- **Primary Language:** [TypeScript](https://www.typescriptlang.org/) -- **Primary Runtime:** [Node.js](https://nodejs.org/en) -- **Primary Framework/Library:** Minimal framework-free utility architecture -- **Build Pipeline:** [tsdown](https://tsdown.dev/) -- **Quality Controls:** [ESLint](https://eslint.org/) and [GitHub Actions](https://github.com/features/actions) -- **Dependency Automation:** [Dependabot](https://docs.github.com/en/code-security/concepts/supply-chain-security/about-dependabot-version-updates) -- **Security Analysis:** [CodeQL](https://codeql.github.com/) via GitHub Actions -- **Documentation Pattern:** [TypeDoc](https://typedoc.org/) output plus manually maintained release docs in `docs/releases/...` +- **Primary Language:** TypeScript +- **Primary Runtime:** Node.js +- **Build Pipeline:** tsdown (ESM) +- **Quality Controls:** ESLint +- **Automation:** GitHub Actions +- **Dependency Automation:** Dependabot +- **Security Analysis:** CodeQL via GitHub Actions +- **Documentation Pattern:** TypeDoc and Jekyll (GitHub Pages) ## Skills and Tooling Inventory - **Languages:** [TypeScript](https://www.typescriptlang.org/), [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript), [Markdown](https://www.markdownguide.org/), [YAML](https://yaml.org/) -- **Runtime & Libraries:** [Node.js](https://nodejs.org/en), [TypeBox](https://sinclairzx81.github.io/typebox/) +- **Runtime & Libraries:** [Node.js](https://nodejs.org/en) +- **Libraries:** [TypeBox](https://sinclairzx81.github.io/typebox/) - **Testing:** [Vitest](https://vitest.dev/) - **Build / Bundling:** [tsdown](https://tsdown.dev/) - **Code Quality:** [ESLint](https://eslint.org/) @@ -43,7 +42,7 @@ TypeScript Utilities (`@blwat/utils`) is a growing, domain-agnostic utility pack - **Automation:** [GitHub Actions](https://github.com/features/actions) - **Hosting & Deployment:** [GitHub Pages](https://docs.github.com/en/pages), [npm Package Registry](https://www.npmjs.com/) - **Code Analysis / Security:** [CodeQL](https://codeql.github.com/) -- **Dependency Automation:** [Dependabot](https://docs.github.com/en/code-security/concepts/supply-chain-security/about-dependabot-version-updates) +- **Dependency Automation:** [Dependabot](https://docs.github.com/en/code-security/concepts/supply-chain-security/dependabot-version-updates) - **Development Utilities:** [npm CLI](https://docs.npmjs.com/cli) - **Environment Configuration:** Node.js version pinning via `.node-version`, plus Ruby version pinning for the Jekyll/Bundler docs site via `docs/.ruby-version` - **Development Environments:** [WebStorm](https://www.jetbrains.com/webstorm/), [Visual Studio Code](https://code.visualstudio.com/) From f8c636e01454364e3545a3a0dcf327272c40c4ac Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 21 Jun 2026 12:55:32 -0500 Subject: [PATCH 007/122] Update modified date of portfolio-skills.md --- docs/portfolio-skills.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/portfolio-skills.md b/docs/portfolio-skills.md index eb23866..ca6c3cf 100644 --- a/docs/portfolio-skills.md +++ b/docs/portfolio-skills.md @@ -5,7 +5,7 @@ author: - GitHub Copilot layout: post date: 2026-05-27 -modified_date: 2026-06-19 +modified_date: 2026-06-21 toc: true --- From 3fc617b87dc74776b9bf547a85fd371160591e00 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 21:11:14 -0500 Subject: [PATCH 008/122] Update string-utility.ts return types. --- src/string/string-utility.ts | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/string/string-utility.ts b/src/string/string-utility.ts index bb77977..089ac67 100644 --- a/src/string/string-utility.ts +++ b/src/string/string-utility.ts @@ -95,12 +95,12 @@ export class StringUtility { * * @param {unknown} input * - * @returns {boolean} + * @returns {input is string} * * @public * @since 0.1.0 */ - public static isNonEmptyString(input: unknown): boolean { + public static isNonEmptyString(input: unknown): input is string { return StringUtility.isString(input) && (input.trim().length > 0); } @@ -111,13 +111,13 @@ export class StringUtility { * * @param {unknown} input * - * @returns {boolean} + * @returns {input is string} * * @public * @since 0.1.0 */ - public static isSingleLineLowercaseTrimmedString(input: unknown): boolean { - return StringUtility.isString(input) && (StringUtility.singleLineLowercaseTrimmedPattern.test(input)); + public static isSingleLineLowercaseTrimmedString(input: unknown): input is string { + return StringUtility.isString(input) && StringUtility.singleLineLowercaseTrimmedPattern.test(input); } /** @@ -127,13 +127,13 @@ export class StringUtility { * * @param {unknown} input * - * @returns {boolean} + * @returns {input is string} * * @public * @since 0.1.0 */ - public static isSingleLineUppercaseTrimmedString(input: unknown): boolean { - return StringUtility.isString(input) && (StringUtility.singleLineUppercaseTrimmedPattern.test(input)); + public static isSingleLineUppercaseTrimmedString(input: unknown): input is string { + return StringUtility.isString(input) && StringUtility.singleLineUppercaseTrimmedPattern.test(input); } /** @@ -143,12 +143,12 @@ export class StringUtility { * * @param {unknown} input * - * @returns {boolean} + * @returns {input is string} * * @public * @since 0.1.0 */ - public static isSingleLineTrimmedString(input: unknown): boolean { - return StringUtility.isString(input) && (StringUtility.singleLineTrimmedPattern.test(input)); + public static isSingleLineTrimmedString(input: unknown): input is string { + return StringUtility.isString(input) && StringUtility.singleLineTrimmedPattern.test(input); } } From cb93f68f6adbc501a060e83185817a8bb561dd8c Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 21:11:41 -0500 Subject: [PATCH 009/122] Update number-utility.ts isPositiveInteger method. --- src/number/number-utility.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/number/number-utility.ts b/src/number/number-utility.ts index bf747a2..5b385a2 100644 --- a/src/number/number-utility.ts +++ b/src/number/number-utility.ts @@ -67,18 +67,19 @@ export class NumberUtility { * @param {unknown} input * @param {boolean} zeroInclusive - `true` if zero should be considered a valid input. * `false` if zero should be considered an invalid input. + * Default value is `false`. * * @returns {input is number} `true` if the given input is a positive integer, or zero when `zeroInclusive` is `true`; `false` otherwise. * * @public * @since 0.1.0 */ - public static isPositiveInteger(input: unknown, zeroInclusive?: boolean): input is number { + public static isPositiveInteger(input: unknown, zeroInclusive: boolean = false): input is number { if (!NumberUtility.isInteger(input)) { return false; } - if (zeroInclusive === true) { + if (zeroInclusive) { return input >= 0; } From c033de929f5130c3fd4954f549a75976523a290c Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 21:11:48 -0500 Subject: [PATCH 010/122] Add color-string-utility.ts --- src/string/color-string-utility.ts | 118 +++++++++++++++++++++++++++++ src/string/index.ts | 1 + 2 files changed, 119 insertions(+) create mode 100644 src/string/color-string-utility.ts diff --git a/src/string/color-string-utility.ts b/src/string/color-string-utility.ts new file mode 100644 index 0000000..8d871b5 --- /dev/null +++ b/src/string/color-string-utility.ts @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2024-2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { StringUtility } from './string-utility'; + +const regularExpressions = { + hexColorPattern: /^(#[A-F0-9]{6}(?:[A-F0-9]{2})?|#[a-f0-9]{6}(?:[a-f0-9]{2})?)$/, + hexColorPatternRGB: /^(#[A-F0-9]{6}|#[a-f0-9]{6})$/, + hexColorPatternRGBA: /^(#[A-F0-9]{8}|#[a-f0-9]{8})$/ +} + +/** + * Static properties and methods for validating formatted color strings. + * + * @since 0.1.0 + */ +export class ColorStringUtility { + /** + * @throws {Error} - ColorStringUtility is a static class and cannot be instantiated. + * + * @private + */ + private constructor() { + throw new Error('ColorStringUtility is a static class and cannot be instantiated.'); + } + + /** + * @returns {RegExp} Regular expression pattern for validating hex color strings in the format `#RRGGBB` or `#RRGGBBAA`. + * Case must be consistent in hex color strings: either all lowercase or all uppercase. + * + * @public + * @since 0.1.0 + */ + public static get hexColorPattern(): RegExp { + return regularExpressions.hexColorPattern; + } + + /** + * @returns {RegExp} Regular expression pattern for validating hex color strings in the format `#RRGGBB`. + * Case must be consistent in hex color strings: either all lowercase or all uppercase. + * + * @public + * @since 0.1.0 + */ + public static get hexColorPatternRGB(): RegExp { + return regularExpressions.hexColorPatternRGB; + } + + /** + * @returns {RegExp} Regular expression pattern for validating hex color strings in the format `#RRGGBBAA`. + * Case must be consistent in hex color strings: either all lowercase or all uppercase. + * + * @public + * @since 0.1.0 + */ + public static get hexColorPatternRGBA(): RegExp { + return regularExpressions.hexColorPatternRGBA; + } + + /** + * Is the given input a string matching the {@link ColorStringUtility.hexColorPattern} pattern? + * + * @param {unknown} input + * + * @returns {input is string} `true` if the given input matches the {@link ColorStringUtility.hexColorPattern} pattern; `false` otherwise. + * + * @public + * @since 0.1.0 + */ + public static isHexColor(input: unknown): input is string { + return StringUtility.isString(input) && ColorStringUtility.hexColorPattern.test(input); + } + + /** + * Is the given input a string matching the {@link ColorStringUtility.hexColorPatternRGB} pattern? + * + * @param {unknown} input + * + * @returns {input is string} `true` if the given input matches the {@link ColorStringUtility.hexColorPatternRGB} pattern; `false` otherwise. + * + * @public + * @since 0.1.0 + */ + public static isHexColorRGB(input: unknown): input is string { + return StringUtility.isString(input) && ColorStringUtility.hexColorPatternRGB.test(input); + } + + /** + * Is the given input a string matching the {@link ColorStringUtility.hexColorPatternRGBA} pattern? + * + * @param {unknown} input + * + * @returns {input is string} `true` if the given input matches the {@link ColorStringUtility.hexColorPatternRGBA} pattern; `false` otherwise. + * + * @public + * @since 0.1.0 + */ + public static isHexColorRGBA(input: unknown): input is string { + return StringUtility.isString(input) && ColorStringUtility.hexColorPatternRGBA.test(input); + } +} diff --git a/src/string/index.ts b/src/string/index.ts index 2420d3f..1d4b618 100644 --- a/src/string/index.ts +++ b/src/string/index.ts @@ -18,4 +18,5 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +export * from './color-string-utility'; export * from './string-utility'; From 8e416c9eeda5ddd77a337398a8abfc175630c84c Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 21:12:09 -0500 Subject: [PATCH 011/122] Update string-inputs.ts and add color-string-inputs.ts --- test/string/string-utility.test.ts | 20 +-- test/utils/input/color-string-inputs.ts | 208 ++++++++++++++++++++++++ test/utils/input/string-inputs.ts | 36 ++-- 3 files changed, 241 insertions(+), 23 deletions(-) create mode 100644 test/utils/input/color-string-inputs.ts diff --git a/test/string/string-utility.test.ts b/test/string/string-utility.test.ts index 5657eb2..83c70b7 100644 --- a/test/string/string-utility.test.ts +++ b/test/string/string-utility.test.ts @@ -26,11 +26,11 @@ import { emptyStringInputs, nonEmptyStringInputs, nonStringInputs, - numberAndSymbolTrimmedInputs, - singleLineLowercaseTrimmedFailureInputs, - singleLineLowercaseTrimmedInputs, - singleLineMixedCaseTrimmedInputs, - singleLineUppercaseTrimmedInputs + singleLineTrimmedInputsNumsAndSymbols, + singleLineTrimmedFailureInputsLowercase, + singleLineTrimmedInputsLowercase, + singleLineTrimmedInputsMixedCase, + singleLineTrimmedInputsUppercase } from '../utils/input/string-inputs'; import { Scenario, TestCase, buildTestCases } from '../utils/test-case/test-case'; @@ -87,24 +87,24 @@ describe('StringUtility', (): void => { { label: 'Incorrect case inputs', inputs: [ - ...singleLineUppercaseTrimmedInputs, - ...singleLineMixedCaseTrimmedInputs + ...singleLineTrimmedInputsUppercase, + ...singleLineTrimmedInputsMixedCase ], expected: false }, { label: 'Whitespace failure inputs', - inputs: [...singleLineLowercaseTrimmedFailureInputs], + inputs: [...singleLineTrimmedFailureInputsLowercase], expected: false }, { label: 'Single line lowercase trimmed inputs', - inputs: [...singleLineLowercaseTrimmedInputs], + inputs: [...singleLineTrimmedInputsLowercase], expected: true }, { label: 'Number and symbol trimmed inputs', - inputs: [...numberAndSymbolTrimmedInputs], + inputs: [...singleLineTrimmedInputsNumsAndSymbols], expected: true } ]; diff --git a/test/utils/input/color-string-inputs.ts b/test/utils/input/color-string-inputs.ts new file mode 100644 index 0000000..ba66e28 --- /dev/null +++ b/test/utils/input/color-string-inputs.ts @@ -0,0 +1,208 @@ +/* + * Copyright (c) 2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +export const hexColorRGBNumberInputs: string[] = [ + '#000000', + '#999999', + '#123456', + '#987654' +]; + +export const hexColorRGBANumberInputs: string[] = [ + '#00000000', + '#99999999', + '#12345678', + '#98765432' +]; + +export const hexColorRGBUppercaseInputs: string[] = [ + '#AAAAAA', + '#FFFFFF', + '#ABCDEF', + '#1A2B3C' +]; + +export const hexColorRGBAUppercaseInputs: string[] = [ + '#AAAAAAAA', + '#FFFFFFFF', + '#ABCDEFBC', + '#1A2B3C4D' +]; + +export const hexColorRGBLowercaseInputs: string[] = [ + '#aaaaaa', + '#ffffff', + '#abcdef', + '#1a2b3c' +]; + +export const hexColorRGBALowercaseInputs: string[] = [ + '#aaaaaaaa', + '#ffffffff', + '#abcdefbc', + '#1a2b3c4d' +]; + +export const hexColorRGBMixedCaseInputs: string[] = [ + '#aAaAaA', + '#FfFfFf', + '#AbcdeF', + '#1a2B3c' +]; + +export const hexColorRGBAMixedCaseInputs: string[] = [ + '#aAaAaAaA', + '#FfFfFfFf', + '#AbcdefaB', + '#1a2B3c4D' +]; + +export const hexColorInputs: string[] = [ + ...hexColorRGBNumberInputs, + ...hexColorRGBANumberInputs, + ...hexColorRGBUppercaseInputs, + ...hexColorRGBAUppercaseInputs, + ...hexColorRGBLowercaseInputs, + ...hexColorRGBALowercaseInputs +]; + +export const hexColorMixedCaseInputs: string[] = [ + ...hexColorRGBMixedCaseInputs, + ...hexColorRGBAMixedCaseInputs +]; + +export const hexColorFailureInputs: string[] = [ + '000000', + '999999', + '123456', + '987654', + 'AAAAAA', + 'FFFFFF', + 'ABCDEF', + '1A2B3C', + 'aaaaaa', + 'ffffff', + 'abcdef', + '1a2b3c', + '#000', + '#AAA', + '#FFF', + '#1A2', + '#aaa', + '#fff', + '#abc', + '#1a2', + '#000', + '#AAA', + '#FFF', + '#1A2', + '#aaa', + '#fff', + '#abc', + '#1a2', + '#00', + '#AA', + '#FF', + '#1A', + '#aa', + '#ff', + '#ab', + '#1a', + '#00', + '#AA', + '#FF', + '#1A', + '#aa', + '#ff', + '#ab', + '#1a', + '#0000000', + '#9999999', + '#1234567', + '#9876543', + '#AAAAAAA', + '#FFFFFFF', + '#ABCDEFB', + '#1A2B3C4', + '#aaaaaaa', + '#fffffff', + '#abcdefb', + '#1a2b3c4', + '#000000000', + '#999999999', + '#123456789', + '#987654321', + '#AAAAAAAAA', + '#FFFFFFFFF', + '#ABCDEFBCD', + '#1A2B3C4D5', + '#aaaaaaaaa', + '#fffffffff', + '#abcdefbcd', + '#1a2b3c4d5', + '#00000G', + '#99999H', + '#12345Z', + '#98765\u{1F3A8}', + '#AAAAA!', + '#FFFFF@', + '#ABCDE?', + '#1A2B3]', + '#aaaaaë', + '#fffffg', + '#abcde\u{1F3A8}', + '#1a2b3$', + '#0000000G', + '#9999999H', + '#1234567Z', + '#9876543\u{1F3A8}', + '#AAAAAAA!', + '#FFFFFFF@', + '#ABCDEFB?', + '#1A2B3C4]', + '#aaaaaaaë', + '#fffffffg', + '#abcdefb\u{1F3A8}', + '#1a2b3c4$', + '#000 000', + '#99 9999', + '#123 456', + '#987 654', + '#AAAA AA', + '# FFFFFF', + '#ABCDE F', + '#1A2 3C', + '#aaaa aa', + '# ffffff', + ' #abcdef', + '#1a2b3c ', + '#00\n0000', + '#9999\n99', + '#12345\t6', + '#987654\n', + '#AAAAAA ', + '#F\nFFFFF', + '#ABC\aDEF', + '#1\tA2B3C', + '#aaa\n\taaa', + '#ffffff\n\t', + ' #abcdef', + '#1a2b3c ', +]; diff --git a/test/utils/input/string-inputs.ts b/test/utils/input/string-inputs.ts index 97cb96f..3134030 100644 --- a/test/utils/input/string-inputs.ts +++ b/test/utils/input/string-inputs.ts @@ -19,6 +19,8 @@ */ // noinspection JSPrimitiveTypeWrapperUsage +import {hexColorFailureInputs, hexColorInputs, hexColorMixedCaseInputs} from "./color-string-inputs"; + export const nonStringInputs: unknown[] = [ null, undefined, @@ -74,7 +76,7 @@ export const emptyStringInputs: string[] = [ ' \n\t ' ]; -export const numberAndSymbolTrimmedInputs: string[] = [ +export const singleLineTrimmedInputsNumsAndSymbols: string[] = [ '\u{1F3A8}', '\u{1F3A8} \u{1F3A8}', '🎨', @@ -84,7 +86,7 @@ export const numberAndSymbolTrimmedInputs: string[] = [ '!@#$%^&*()-_+=~`"\'/\\|,.<>?;:' ]; -export const singleLineMixedCaseTrimmedInputs: string[] = [ +export const singleLineTrimmedInputsMixedCase: string[] = [ 'Example', 'ëË', 'ë Ë', @@ -93,7 +95,7 @@ export const singleLineMixedCaseTrimmedInputs: string[] = [ 'this IS an Example sEnTeNcE!' ]; -export const singleLineLowercaseTrimmedInputs: string[] = [ +export const singleLineTrimmedInputsLowercase: string[] = [ 'example', 'ë', 'ë ë', @@ -102,7 +104,7 @@ export const singleLineLowercaseTrimmedInputs: string[] = [ 'this is an example sentence!' ]; -export const singleLineUppercaseTrimmedInputs: string[] = [ +export const singleLineTrimmedInputsUppercase: string[] = [ 'EXAMPLE', 'Ë', 'Ë Ë', @@ -111,7 +113,7 @@ export const singleLineUppercaseTrimmedInputs: string[] = [ 'THIS IS AN EXAMPLE SENTENCE!' ]; -export const singleLineLowercaseTrimmedFailureInputs: string[] = [ +export const singleLineTrimmedFailureInputsLowercase: string[] = [ ' example ', '\nexample\n', '\texample\t', @@ -134,7 +136,7 @@ export const singleLineLowercaseTrimmedFailureInputs: string[] = [ 'internal spaces example' ]; -export const singleLineUppercaseTrimmedFailureInputs: string[] = [ +export const singleLineTrimmedFailureInputsUppercase: string[] = [ ' EXAMPLE ', '\nEXAMPLE\n', '\tEXAMPLE\t', @@ -157,7 +159,7 @@ export const singleLineUppercaseTrimmedFailureInputs: string[] = [ 'INTERNAL SPACES EXAMPLE' ]; -export const singleLineMixedCaseTrimmedFailureInputs: string[] = [ +export const singleLineTrimmedFailureInputsMixedCase: string[] = [ ' Example ', '\nExample\n', '\tExample\t', @@ -180,10 +182,17 @@ export const singleLineMixedCaseTrimmedFailureInputs: string[] = [ 'Internal Spaces Example' ]; +export const singleLineTrimmedInputs: string[] = [ + ...singleLineTrimmedInputsLowercase, + ...singleLineTrimmedInputsUppercase, + ...singleLineTrimmedInputsMixedCase, + ...singleLineTrimmedInputsNumsAndSymbols +]; + export const singleLineTrimmedFailureInputs: string[] = [ - ...singleLineLowercaseTrimmedFailureInputs, - ...singleLineUppercaseTrimmedFailureInputs, - ...singleLineMixedCaseTrimmedFailureInputs + ...singleLineTrimmedFailureInputsLowercase, + ...singleLineTrimmedFailureInputsUppercase, + ...singleLineTrimmedFailureInputsMixedCase ]; export const nonEmptyStringInputs: string[] = [ @@ -197,7 +206,8 @@ export const nonEmptyStringInputs: string[] = [ '🎨', 'ë', ...singleLineTrimmedFailureInputs, - ...singleLineLowercaseTrimmedInputs, - ...singleLineUppercaseTrimmedInputs, - ...singleLineMixedCaseTrimmedInputs + ...singleLineTrimmedInputs, + ...hexColorInputs, + ...hexColorMixedCaseInputs, + ...hexColorFailureInputs ]; From c3ac809988611efb3adbe04c7ffa22305d04a0bb Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 22:20:25 -0500 Subject: [PATCH 012/122] Update discriminator-registry.ts validation check logic. --- src/discriminator/discriminator-registry.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/discriminator/discriminator-registry.ts b/src/discriminator/discriminator-registry.ts index eafd781..282a8a8 100644 --- a/src/discriminator/discriminator-registry.ts +++ b/src/discriminator/discriminator-registry.ts @@ -146,7 +146,7 @@ export class DiscriminatorRegistry { const registration: DiscriminatorRegistration = input as DiscriminatorRegistration; - if (!StringUtility.isSingleLineTrimmedString(registration.discriminator)) { + if (!StringUtility.isSingleLineTrimmedString((registration as { discriminator: unknown; }).discriminator)) { throw new TypeError(`Discriminator '${registration.discriminator}' must be a non-empty single line trimmed string.`); } From ccde796c7daccbc163cb3bf12f8aa2dc13dceebb Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 22:20:45 -0500 Subject: [PATCH 013/122] Fix linting errors in color-string-utility.ts --- src/string/color-string-utility.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/string/color-string-utility.ts b/src/string/color-string-utility.ts index 8d871b5..8950434 100644 --- a/src/string/color-string-utility.ts +++ b/src/string/color-string-utility.ts @@ -24,7 +24,7 @@ const regularExpressions = { hexColorPattern: /^(#[A-F0-9]{6}(?:[A-F0-9]{2})?|#[a-f0-9]{6}(?:[a-f0-9]{2})?)$/, hexColorPatternRGB: /^(#[A-F0-9]{6}|#[a-f0-9]{6})$/, hexColorPatternRGBA: /^(#[A-F0-9]{8}|#[a-f0-9]{8})$/ -} +}; /** * Static properties and methods for validating formatted color strings. From bc5e9e64cd8b66f129af771d8665cab40c91f15e Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 22:21:05 -0500 Subject: [PATCH 014/122] Fix linting errors utils/input --- test/utils/input/color-string-inputs.ts | 4 ++-- test/utils/input/string-inputs.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/utils/input/color-string-inputs.ts b/test/utils/input/color-string-inputs.ts index ba66e28..ff253f1 100644 --- a/test/utils/input/color-string-inputs.ts +++ b/test/utils/input/color-string-inputs.ts @@ -199,10 +199,10 @@ export const hexColorFailureInputs: string[] = [ '#987654\n', '#AAAAAA ', '#F\nFFFFF', - '#ABC\aDEF', + '\n\t#ABCDEF', '#1\tA2B3C', '#aaa\n\taaa', '#ffffff\n\t', ' #abcdef', - '#1a2b3c ', + '#1a2b3c ' ]; diff --git a/test/utils/input/string-inputs.ts b/test/utils/input/string-inputs.ts index 3134030..a001158 100644 --- a/test/utils/input/string-inputs.ts +++ b/test/utils/input/string-inputs.ts @@ -18,9 +18,9 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -// noinspection JSPrimitiveTypeWrapperUsage -import {hexColorFailureInputs, hexColorInputs, hexColorMixedCaseInputs} from "./color-string-inputs"; +import { hexColorFailureInputs, hexColorInputs, hexColorMixedCaseInputs } from './color-string-inputs'; +// noinspection JSPrimitiveTypeWrapperUsage export const nonStringInputs: unknown[] = [ null, undefined, From b02f59d5e57016943cd7ca01e03255154df18a3f Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 22:21:22 -0500 Subject: [PATCH 015/122] Add unit tests for color-string-utility.test.ts --- test/string/color-string-utility.test.ts | 209 +++++++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 test/string/color-string-utility.test.ts diff --git a/test/string/color-string-utility.test.ts b/test/string/color-string-utility.test.ts new file mode 100644 index 0000000..bd9411a --- /dev/null +++ b/test/string/color-string-utility.test.ts @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { describe, test, expect } from 'vitest'; + +import { ColorStringUtility } from '../../src'; + +import { + hexColorFailureInputs, + hexColorInputs, + hexColorMixedCaseInputs, + hexColorRGBALowercaseInputs, + hexColorRGBANumberInputs, + hexColorRGBAUppercaseInputs, + hexColorRGBLowercaseInputs, + hexColorRGBNumberInputs, + hexColorRGBUppercaseInputs +} from '../utils/input/color-string-inputs'; + +import { emptyStringInputs, nonStringInputs } from '../utils/input/string-inputs'; +import { Scenario, TestCase, buildTestCases } from '../utils/test-case/test-case'; + +describe('ColorStringUtility', (): void => { + describe('new ColorStringUtility()', (): void => { + describe('Runtime behavior guards', (): void => { + test('Constructor should throw an error when instantiated at runtime', (): void => { + const RuntimeConstructor = ColorStringUtility as unknown as new () => ColorStringUtility; + expect((): ColorStringUtility => new RuntimeConstructor()).toThrow(Error); + }); + }); + }); + + describe('isHexColor', (): void => { + const scenarios: Scenario[] = [ + { + label: 'non-string inputs', + inputs: [ + ...nonStringInputs + ], + expected: false + }, + { + label: 'empty string inputs', + inputs: [ + ...emptyStringInputs + ], + expected: false + }, + { + label: 'hex color string failure inputs', + inputs: [ + ...hexColorFailureInputs, + ...hexColorMixedCaseInputs + ], + expected: false + }, + { + label: 'hex color inputs', + inputs: [ + ...hexColorInputs + ], + expected: true + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(ColorStringUtility.isHexColor(testInput)).toBe(testExpected); + }); + }); + }); + + describe('isHexColorRGB', (): void => { + const scenarios: Scenario[] = [ + { + label: 'non-string inputs', + inputs: [ + ...nonStringInputs + ], + expected: false + }, + { + label: 'empty string inputs', + inputs: [ + ...emptyStringInputs + ], + expected: false + }, + { + label: 'hex color string failure inputs', + inputs: [ + ...hexColorFailureInputs, + ...hexColorMixedCaseInputs + ], + expected: false + }, + { + label: 'RGBA hex color inputs', + inputs: [ + ...hexColorRGBANumberInputs, + ...hexColorRGBALowercaseInputs, + ...hexColorRGBAUppercaseInputs + ], + expected: false + }, + { + label: 'RGB hex color inputs', + inputs: [ + ...hexColorRGBNumberInputs, + ...hexColorRGBLowercaseInputs, + ...hexColorRGBUppercaseInputs + ], + expected: true + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(ColorStringUtility.isHexColorRGB(testInput)).toBe(testExpected); + }); + }); + }); + + describe('isHexColorRGBA', (): void => { + const scenarios: Scenario[] = [ + { + label: 'non-string inputs', + inputs: [ + ...nonStringInputs + ], + expected: false + }, + { + label: 'empty string inputs', + inputs: [ + ...emptyStringInputs + ], + expected: false + }, + { + label: 'hex color string failure inputs', + inputs: [ + ...hexColorFailureInputs, + ...hexColorMixedCaseInputs + ], + expected: false + }, + { + label: 'RGBA hex color inputs', + inputs: [ + ...hexColorRGBANumberInputs, + ...hexColorRGBALowercaseInputs, + ...hexColorRGBAUppercaseInputs + ], + expected: true + }, + { + label: 'RGB hex color inputs', + inputs: [ + ...hexColorRGBNumberInputs, + ...hexColorRGBLowercaseInputs, + ...hexColorRGBUppercaseInputs + ], + expected: false + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(ColorStringUtility.isHexColorRGBA(testInput)).toBe(testExpected); + }); + }); + }); +}); From 3febee2bc347ddf3cb0e6b05f10b3495cf9262dd Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 22:23:53 -0500 Subject: [PATCH 016/122] Update generated docs for v0.1.0-alpha.3 --- .../v0.1.0-alpha.3/doc/assets/navigation.js | 2 +- .../v0.1.0-alpha.3/doc/assets/search.js | 2 +- .../discriminator.DiscriminatorRegistry.html | 6 ++--- .../doc/classes/number.NumberUtility.html | 13 ++++----- .../random.RandomNumberGeneratorFactory.html | 6 ++--- .../doc/classes/random.SeedVersions.html | 8 +++--- .../random.SeededRandomNumberGenerator.html | 6 ++--- .../classes/string.ColorStringUtility.html | 27 +++++++++++++++++++ .../doc/classes/string.StringUtility.html | 26 +++++++++--------- ...scriminator.DiscriminatorRegistration.html | 6 ++--- .../doc/interfaces/random.SeedVersion.html | 4 +-- .../v0.1.0-alpha.3/doc/modules/string.html | 2 +- .../types/discriminator.Discriminated.html | 2 +- .../doc/types/discriminator.TypeGuard.html | 2 +- .../discriminator.discriminatedSchema.html | 2 +- 15 files changed, 71 insertions(+), 43 deletions(-) create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js index 475b836..69c1398 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJytlEtPwzAQhP8K2nMEtKg8ckMgKg5waKGXqgc3XpoViVPZW0SE8t9RkzZPJw0iV2dnvrE98fIHGL8ZXHiJ5C5AAw54PgVSowJ3mX+VZDxNISnBkQYHtoJ9cCHMRBeVz+c+hwE48ElKgju2Gz4EwphW3GPZb4YbMqzjAutl4hrWKqqGGY1vk1Xi5Jxnxag/hPenIIIpUkUYyj165Em1tQOaXFcyvcVbPLsPSPQ6HpRFEo63XSFQ1sCXdzejybiGnu6EPuGZj9n9yptZCE1i3atXKOeej6Eo2F9HcY1vEVWTXO1DlGOoXbhGS2+z9QEK+5oavTMFxJaiHjiVKVszy5m1UDIKm5mz9QEyz1KjLNMUFer94T4JjyPbv3bAdomaOyp2M0eUKK3qVlaH5hRqgdpQpEyn93Hon29Eycr6KjSJtgegjDSsSW2aV5+tD3D189Sota4HTmXKXtdVsvoFogoyxQ==" \ No newline at end of file +window.navigationData = "eJytlE1PAjEQhv+KmfNGZQ1+7I1gJB70AMqFcCjbkZ3YbUlbjMTw3w1b2M+yrJHsrZ33fd5OZzv7AYvfFiJ4UXwt0EAAcUKCa5QQzfJdTibWlJJkVmkIYMVsAhGkTnRV2b5MbCoggE+SHKLQbzgUzJijuMey3xiXZKzeFNjYiWtYr6gaphfeb+fbIOc8S4v6g8V/CsIsKVmEodyjQ55MW2tQ/7aS6W2zwouBINapPciLJHazaguBvAa+frjr9cMaerRm+oRnXub3Kx9myjSxRae5Qj6JE0xZwf46iGt8j6ia5GYXohxDrtMFeubWrZ9hYF8zo3dLgqxnUPecSpVvMsuZNZNcpc3Mbv0MmceZkcs0Qol619wnFlvl+9f22DZR80TFaSaIHLlXfZTVojmFmqI2pKRp9T4U/fONKFl5X4Um0fcAlJHGapLL5tW79TNc/VAJpSeZ29GZ3cOapa297+R5wm7uvl/sIVKP" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js index 1c782d3..9225b86 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js @@ -1 +1 @@ -window.searchData = "eJy1mt1u2zgQhd+FvhVSz9D/l4vdFgWKoGja3hhGoViMQ6wtGZKcNmvk3ReUZGnGpBRace4Cm+fMIfmJZEQfRZr8zsRieRT/6jgSCwxEHO6UWIhIZ+tU73Qc5kkqAnFIt2Ihdkl02KrsA/v25jHfbUUg1tswy1QmFkK8BCdHwFnt+TdVfVMbneXpc+1dyc+8nRpHxUDsw1TFuRW9iYLDUZPlMcx6Vx6UYo/qbpO2TGnxvUr7ByMOV0k3nnROXpjrJK7T6jhX6UO49gpcSPvNIwxx9AqnPaMMzt36DmI5MC2Rn8Ktjq4SlzpdKyoO51MYo2veVVQnzp/3XWFV1PcR5cW/P+/Vp0OYdheuW/UrKp2rnoru1o9qF9aVn8JUh/f26ufQ9Ox8HSM+7O6VveqWH3svt7dF8x+53urcXmYrM9aoO3eVqmXx0tlHHetc3fLsr5Yb6OyhENad7qrODdqzfI5ztbkwhq4110jwNcl0rp9UnyT7SvvWRM3OEsZRsrOAKj/2Bupb0bys9knFKjUAfwzXeeLYxivvLk03blXmlgEOs+d4/ddBb6PelQeFx33l0RWi06st4f3bwl0zF53EO6UiFTmFbWE7JBdO4RgaJtdJnOXpYf2GwgPu0TlUXf1umcFY/cl7R6vEV8h0Pns/VZrpJLbPr8T11ObSR2yCMGpOKpn+T3lXGVStX+1xnb9l2Dcqr5r4196o/KnWvDmBzn6ak9XnOFJ//DPorDiP6UrVKwU5cJMmroOibXThXLMzafLwkKk8u6DQoJH49tS5NWV5quONtTWVH3tvTXdF87azTmXGGnWPVpWq48mIN1v1RcfqS/JbpeswU99Tvdup6GuY5yq10W3NMCi9tjpW25NXXnrta6+ulNzTJ/MVor5zwh/7/dVG9XDyulJmvlLcJvE/u33+fMc5fj2gzuIkVkZaPwLXyHPXSmaPhO1ovlPma0R934TnZL4p6jma183cI1mf+qtAlHve4ihOm/BC4I28mYtAPGi1jcw7xjJYINbJbmfsAhEl60Px56pq9lOZk5xpXLb+MBTBchjg9GY0latVsDyJiy+KD04ezSeFEESwhEDizXgGTAiWEJgQRbBElxAtITKhFMFSuoTSEkomHIlgOXIJR5ZwxITjtsEZW8IxE05EsBy7Kk4s4YQJpyJYTlzCqSWcMuFMBMupSzizhDMmnItgOXMJ55ZwzgEwPMydBNjswBk8BT1Dp9jBDwcIDBbgZs9mCDhEYNAAJ39gcwQcJDB4gJNBsFkCDhMYRMDJIdg8AQcKDCbgRApspoBDBQYVcGIFNlfAwQKDCzjRApst4HCBQQaceIHNF3DA0DADTsLQJgw5YWiYQSdhaBOGZ0tUsUY5CUPHKsUJQ8MMulc4mzDkhKFhBp2EoU0YcsLQMINOwtAmDDlhaJhBJ2FoE4acMDTMoJMwtAlDThgaZtBJGNqEIScMDTPoJAxtwpATJg0z6CRM2oRJTpg0zEgnYdImTHLCpGFGOgmTNmHybCMsdkInYdKxF3LCpGFGuvdRmzDJCZOGGekkTNqESU6YNMxIJ2HSJkxywqRhRjoJkzZh1UfFuelJpbmq3jSYYw99J3kUv6qDFdSvBY4CpmJxfHlpDlKL4ws5S5nvTDXbY0o8Zl4e7PUacZo3Tjj0cor4LVLjRTrm1y/mlFVXNI3frPGbX+rHezlsnIaldny5YcouShvzUWM+6u36zCaFzK6XI31l1tigJHPrF624DScOxMBLf34BRPpEO+VrVl+aEB+SCaSnz/l/542dJHbS18660yHxyJiD35j7/GtOApMC8vIC7b4EY+n3dPj890sKjEmBiW8B24asMtJvmeEvcwndpMvo1+XyJoBYkJUF/Z5V+9EgSzD4LcGlx+H0ipTgR/KAX5763S/pFRlj9Bvj060kiUJGF/xGtzQpO7c53Z48nC4liTVBCfxQan5NQ1AiJHmZZMUdjzMli0c2LvDbuYyzawUnHUW/jhInPqdk/UW/9dfjZTbxJxRLP4rb30CTOSJASz+gPd4WE38yLNJ3WMzdGOk53SU9QbKWNSQnOvQ70ZUmjkUACX/ox5/5Kc6m/HFO40Mi+SUiv2FqXAjCHgSvArHX+2L2xGK5enn5H39Tt60="; \ No newline at end of file +window.searchData = "eJy1msFu2zgQht+FvgqpOaSd2Ld2d9stUBRF0/ZiBAvFYhxibcmQ5DRZI+++oCRLQ3Ek07JzC2TOz5+cT+SE4p6lye+MzRd79q+OIzaHgMXhRrE5i3S2TPVGx2GepCxgu3TN5myTRLu1yt5Zv1495ps1C9hyHWaZyticsdfgoMjhptb8E0d9Vyud5elLrV2Ft7TJGKLHgG3DVMW5Y72xAmPZeHkMs8E9j8pgj95pkS5PafG7SocbQwoXcTeZ9iYvzHUS1251nKv0IVx6GS5Ch+WRj0Ee4XSglVFbbegklhPTYfkpXOvoInax0qWswnh2zSdA5V1FteP8ZdtnVkVDX1G78x8vW/VpF6b9HdethnUqyFVPRbfLR7UJ656fwlSH9+7qR8QMHHxtI95t7pW76paPvZfbr0Xzn7le69xdZisxq1G/78pVx+Kls4861rn6ans/2t1IZw9FYD3ovt5tgW4vn+NcrU60oeuYSzj4lmQ6109qiJNtFXuuo2ZnCeMo2ThAlY+9gfpeNC97+6RilRqAP4bLPCG28Uq7L6Yft8pzxwSH2Uu8/LDT62hwz6NC477S6DPRq9Xl8P48c5f0hZN4q1SkIjKwy2xPyIkpnPCGyWUSZ3m6W57R8cjW6J2qvnF3ZDBWz/lga1XwBTy1s/dLpZlOYrd+RaqHNqe+YlPgsqlUMv2f8u5lVLU+OuLaf8e0r1ReNfHve6XypzrmbAc6+2Uqq89xpJ79PeisqMd0FTXIBSq4UROqUHSFTsy1VZMmDw+ZyrMTOho1Ib4jJbemLE91vHK2pvKx99b0R7JO0tsipqvgqRTdlv3zVvnrfEce1XMh+S3Mc5W6yPZ3O3pUz0vz07YO77NByHg7+/7pw5nm0tX92/p7f77B8DyH9irwd+XwVFs6Oxh7CzcDEtkYOjuHnZ5OTp5l6ry8WVukzypwwQUg0/Fqrb7oWH1Jfqt0GWbqR6o3GxUdWRKIKSm11jpW64NWXmp5rg+er17j+QJW39jhz+32YrO6O2hdyLP9MnxN4r822/zl1t7SjhvUWZzEyoTWu+El/Nx2kjnAYTeab+T5Elbf1mGbzLOsttG8rOcBzob0fxewsvyd79mhHp8zuBJXMxawB63WkfncUBoL2DLZbIxcwKJkuSv+vKua/VLmnzrTuGz9bsyCxTiA2RUHeXcXLA7BxQ/Fg4NG86QI5CxY8EDIKxBgBXInkFuBwIIFUIHgBIIVKFiwEFSgcAKFFShZsJBUoHQCpRU46ZqciRM4sQKnLFhMqB6nTuDUCrxmwWJKBV47gddW4A0LFtdU4I0TeGMFzliwuKECZ07gzAbA8DAjCXDZ4S14CnrGZDDBjw0QN1hwmj2XIW5DxA0anOSPuxxxGyRu8OAkg9xlidswcYMIJznkLk/cBoobTDiJFHeZ4jZU3KDCSay4yxW3weIGF06ixV22uA0XN8hwEi/u8sVtwMAww0nCwCUMbMLAMAMkYeASBq0lqlijSMKAWKVswsAwA/QK5xIGNmFgmAGSMHAJA5swMMwASRi4hIFNGBhmgCQMXMLAJgwMM0ASBi5hYBMGhhkgCQOXMLAJA8MMkISBSxjYhAnDDJCECZcwYRMmDDOCJEy4hAmbMGGYESRhwiVMtDbCYickCRPEXmgTJgwzgt5HXcKETZgwzAiSMOESJmzChGFGkIQJlzBhEyYMM4IkTLiECZswYZgRJGHCJUzYhAnDjCAJEy5hwiZMGmYESZh0CZM2YdIwI0nCpEuYtAmThhlJEiZdwqRNmDTMSJIw6RImW+VWUW+RhEmi4iofFSXuk0pzVZ0PmwoVf0nas3+qGpjXh7l7xq/ZfP/62tS88/0rKnvNb6Y3V+Maadx4aRRHKmV9vjucgjSCzUnJnsHMUxB9ZUHWZkhp7KUU2ZcJGi00U34TZSll1Zf6Rg8N0m+MrZsfjdK4URqXsZPTBVPrvkwjLhtxOVjVSi9HuHgp4i8niBKBcutnrbgUhRSQgF98+yQcaSHShB9p1NF1IyhQVoXfPJFHzUgRTbzwG3D74gNKIs6ir1hz5IxcoSwIcaJQe84QEsIPifYJLxJD5Au/Fwpd0EAzhQbIfQfYPmxDthBo0g804rYGsofmjPvO2fGTNrSAIJClH8g952NIFxEofQk8fpiFOkCJk76JI2TQBEvfCcafadEig5AEPyTLb/xIAmUD/LLhvvwIQe6HYKlB7PUc+eF+fuqvumhUaHMGv935cN8IWUGzy/1mtxQpB7c63It4OFw3QtITJD31k67vyaJ3H61IXiJZcXuDdGnZQ7UI9ytGjDK1KaOBgt9AkZKdU/R+g9/77fFtCk0mYkb4MdP9QQnJompY+FXDHh9/kD7KlfDMVXHrBc0sLnw8QXKWNUDjBM9xdhX8AlEj/Kgxl2xX5bXbRgdZ8nOEbic3KsiMh5e7gG31tsgemy/uXl//B2CTWwA="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html index 2b37db7..55c3c11 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html @@ -1,7 +1,7 @@ DiscriminatorRegistry | @blwat/utils - v0.1.0-alpha.3

    Class DiscriminatorRegistry

    Static registry for managing discriminators and their associated type guards. Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

    0.1.0

    -
    Index

    Methods

    has +
    Index

    Methods

    Methods

    • Checks if a discriminator is already registered.

      Parameters

      • discriminator: string

        The discriminator value to check.

        @@ -9,7 +9,7 @@
      • true if the discriminator is registered, false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html index 0c3aa30..6f3ed8e 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html @@ -1,17 +1,18 @@ NumberUtility | @blwat/utils - v0.1.0-alpha.3

    Class NumberUtility

    Static properties and methods for validating number types.

    0.1.0

    -
    Index
    Index

    Methods

    • Is the given input a finite number?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is a finite number; false otherwise.

      0.1.0

      -
    • Is the given input an integer?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is an integer; false otherwise.

      0.1.0

      -
    • Is the given input a positive integer?

      -

      Parameters

      • input: unknown
      • OptionalzeroInclusive: boolean

        true if zero should be considered a valid input. -false if zero should be considered an invalid input.

        +
    • Is the given input a positive integer?

      +

      Parameters

      • input: unknown
      • zeroInclusive: boolean = false

        true if zero should be considered a valid input. +false if zero should be considered an invalid input. +Default value is false.

      Returns input is number

      true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html index 6d7a8c7..a19478d 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html @@ -1,6 +1,6 @@ RandomNumberGeneratorFactory | @blwat/utils - v0.1.0-alpha.3

    Class RandomNumberGeneratorFactory

    A static factory class for creating a SeededRandomNumberGenerator object.

    0.1.0

    -
    Index

    Methods

    Index

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html index f531ac6..173b7b5 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html @@ -1,14 +1,14 @@ SeedVersions | @blwat/utils - v0.1.0-alpha.3

    Class SeedVersions

    A static class for accessing different seed versions. Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    Methods

    Accessors

    Methods

    Methods

    • Parameters

      • index: number

        The index of the seed version to retrieve. Must be a valid SeedVersions index.

      Returns SeedVersion

      • The seed version with the given index.
      • @@ -17,7 +17,7 @@
      • If the index is not a valid seed version index.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html index 4fec4e9..0d3f662 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html @@ -1,7 +1,7 @@ SeededRandomNumberGenerator | @blwat/utils - v0.1.0-alpha.3

    Class SeededRandomNumberGenerator

    Deterministic seeded pseudorandom number generator. This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

    0.1.0

    -
    Index

    Constructors

    Index

    Constructors

    Methods

    Constructors

    • Parameters

      • state: [number, number, number, number]

        Initial 128-bit state. Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

        @@ -9,10 +9,10 @@

        If each element of state is not a 32-bit unsigned integer.

        If state does not have at least one element that is greater than 0.

        0.1.0

        -

    Methods

    • Returns number

        +

    Methods

    • Returns number

      • The next pseudorandom float in the range [0, 1).

      This method advances the internal 128-bit xoshiro128** state by one step. Successive calls produce an independent, uniformly distributed sequence.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html new file mode 100644 index 0000000..4d08f6b --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html @@ -0,0 +1,27 @@ +ColorStringUtility | @blwat/utils - v0.1.0-alpha.3

    Class ColorStringUtility

    Static properties and methods for validating formatted color strings.

    +

    0.1.0

    +
    Index

    Accessors

    • get hexColorPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

      +

      0.1.0

      +
    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

      +

      0.1.0

      +
    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

      +

      0.1.0

      +

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html index 8ca981b..e70b003 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html @@ -1,6 +1,6 @@ StringUtility | @blwat/utils - v0.1.0-alpha.3

    Class StringUtility

    Static properties and methods for validating string types.

    0.1.0

    -
    Index
    Index

    Accessors

    • get singleLineLowercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line lowercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      +
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      +
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -

    Methods

    Methods

    • Is the given input a non-empty string? Non-empty strings must contain at least one non-whitespace character.

      -

      Parameters

      • input: unknown

      Returns boolean

      0.1.0

      -
    • Is the given input a string?

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html index 8b361b5..abca9b8 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -1,14 +1,14 @@ DiscriminatorRegistration | @blwat/utils - v0.1.0-alpha.3

    Interface DiscriminatorRegistration

    A registration for a discriminator to the DiscriminatorRegistry.

    0.1.0

    -
    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    discriminator: string

    The discriminator value that identifies the type of a Discriminated object. This value must be unique across all registered discriminators.

    0.1.0

    -
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    +
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    Type Declaration

      • (input: unknown): boolean
      • Parameters

        • input: unknown

          The input to validate.

        Returns boolean

        • true if the input matches the type associated with the discriminator, false otherwise.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html index 0763635..d3c0dbf 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html @@ -1,8 +1,8 @@ SeedVersion | @blwat/utils - v0.1.0-alpha.3

    Interface SeedVersion

    A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

    0.1.0

    -
    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    Properties

    offsets: readonly [number, number, number, number]

    A collection of offset values for the FNV-1a hashing algorithm. Each offset value should be a 32-bit unsigned integer.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html index 5f760de..9717f12 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html @@ -1 +1 @@ -string | @blwat/utils - v0.1.0-alpha.3

    Module string

    Classes

    StringUtility

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +string | @blwat/utils - v0.1.0-alpha.3

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html index 6f3b38c..8fa311a 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html @@ -1,3 +1,3 @@ Discriminated | @blwat/utils - v0.1.0-alpha.3

    Type Alias Discriminated

    Discriminated: Static<typeof discriminatedSchema>

    Discriminated objects can be type checked using the discriminator registry.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html index 9219040..52b4f66 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html @@ -1,3 +1,3 @@ TypeGuard | @blwat/utils - v0.1.0-alpha.3

    Type Alias TypeGuard<T>

    TypeGuard: (input: unknown) => input is T

    A type guard function that checks if an input is of a specific Discriminated type.

    Type Parameters

    Type Declaration

      • (input: unknown): input is T
      • Parameters

        • input: unknown

        Returns input is T

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html index 41f1bdc..2a5866a 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html @@ -1,3 +1,3 @@ discriminatedSchema | @blwat/utils - v0.1.0-alpha.3

    Variable discriminatedSchemaConst

    discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

    TypeBox schema for validating that an object implements the Discriminated type.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    From 8cefbd1b5392f5fc7e2a324569a1827512e6c91a Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 22:46:49 -0500 Subject: [PATCH 017/122] Update .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index c609ed4..4a34af8 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ # Visual Studio Code .vscode/ +# Claude Code +.claude/ + # Node.js and npm node_modules/ From 4931331d8bec1e6a13d18e25bd02d26e2864ae7d Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 22:47:07 -0500 Subject: [PATCH 018/122] Update markdown --- .github/copilot-instructions.md | 44 ++++++++++++++++++++++++++++++++ CLAUDE.md | 6 +++++ README.md | 11 ++++++++ docs/index.md | 11 ++++++++ docs/portfolio-skills.md | 5 +++- docs/releases.md | 3 ++- docs/resources-and-references.md | 9 +++---- 7 files changed, 82 insertions(+), 7 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 7527593..bffddaf 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,16 +1,19 @@ # Copilot Instructions ## Project Overview + This repository contains `@blwat/utils`, a growing ESM-first TypeScript utility package for reusable number, random, and string helpers. The package source is maintained in `src/`, bundled to `_dist/` with `tsdown`, and documented through TypeDoc output plus manually maintained GitHub Pages release docs under `docs/`. ## Companion Instruction Files + This repository maintains a companion `CLAUDE.md` at the repository root alongside this file. The two documents serve overlapping audiences and should stay consistent: when you update guidance in `.github/copilot-instructions.md` that also applies to `CLAUDE.md`, mirror the change there, and vice versa. `CLAUDE.md` is intentionally a concise pointer to this file; this file remains the canonical, detailed source of conventions. ## Tech Stack + - TypeScript source compiled and bundled for ESM distribution - Node.js runtime support aligned with `package.json` engines (`^22.22.0 || >=24`) - `tsdown` for package builds and declaration output @@ -20,19 +23,23 @@ The two documents serve overlapping audiences and should stay consistent: when y - Jekyll-based `docs/` site content for published project and release documentation ## Development and Validation + Primary development work happens in `src/` and corresponding tests under `test/`. Shared test fixtures and scenario helpers live under `test/utils`. ### Development Status + The package is currently in an alpha release line and exports grouped utility modules from `src/discriminator`, `src/number`, `src/random`, and `src/string`. ### Validation Steps + - Install dependencies with `npm ci`. - Run lint checks with `npm run lint:all`. - Build with `npm run build`. - Run tests with `npm run test`. ## npm Scripts + - `npm run lint:js` - lint repository files with `eslint.config.js.mjs` - `npm run lint:ts` - lint repository files with `eslint.config.ts.mjs` - `npm run lint:all` - run both lint configurations @@ -45,6 +52,7 @@ The package is currently in an alpha release line and exports grouped utility mo - `npm run prepack` - build the package before packing or publishing ## GitHub Actions CI + | Workflow file | Name | Trigger | Description | |---|---|---|---| | `codeql.yml` | CodeQL | Push/PR to `main`, monthly schedule | Runs CodeQL security analysis for `actions`, `javascript-typescript`, and `ruby` | @@ -53,26 +61,32 @@ The package is currently in an alpha release line and exports grouped utility mo | `npm-test.yml` | npm Lint, Build, and Test | Push/PR to `main`, manual | Runs lint, build, and tests across supported Node.js versions | ## Security and Dependency Management + - GitHub Actions runs CodeQL analysis for `actions`, `javascript-typescript`, and `ruby`. - Dependabot is configured for monthly updates to npm dependencies, GitHub Actions workflows, and Bundler dependencies under `docs/`. - The npm publish workflow uses npm Trusted Publishing with GitHub OIDC (`id-token: write`) instead of a committed registry token. - The package declares `typebox` as a runtime dependency in `package.json`; all other toolchain packages are maintained through `devDependencies`. ## Development Guidelines + Keep changes scoped to existing files unless a task explicitly requires scaffolding project code. ### TypeScript Conventions + - The package is ESM-only (`"type": "module"`), so keep imports/exports compatible with Node.js ESM resolution. - Public exports flow through module index files. For example, `src/index.ts` re-exports from `src/number/index.ts`, which re-exports from individual utility files. This pattern is intentional to maintain clear module boundaries and organization in both source code and generated documentation. - API documentation entry points stay module-scoped rather than pointing TypeDoc at the root package entry point. #### tsdown Build Output + This project uses `tsdown` to bundle and emit declaration files. When the output format is `esm`, tsdown emits format-specific file extensions: `.mjs` for the bundle and `.d.mts` for the declaration file, regardless of whether the source files use the `.ts` or `.mts` extension. The `types`, `module`, `main`, and `exports` fields in `package.json` should always reference these `.mjs`/`.d.mts` paths (e.g., `./_dist/index.mjs` and `./_dist/index.d.mts`). #### JavaScript Consumer Safety + This package is published as ESM and targets both TypeScript and JavaScript consumers. Retain runtime type guards and input validation even when TypeScript's type system would catch the same issue at compile time. JavaScript callers have no compile-time safety, so runtime checks are necessary for correctness. #### Static Classes + Static utility classes must: - Have a `private constructor()` that throws an `Error` to prevent instantiation - Include a JSDoc `@throws` on the constructor documenting the instantiation error @@ -81,14 +95,17 @@ Static utility classes must: ## Code Style #### Code Style Preferences and Conventions + - Prefer `if`/`else` blocks over ternary operators for conditional logic. - Prefer `@returns` (not `@return`) in TSDoc comments. #### Formatting Rules + - Keep formatting compatible with the repository ESLint configurations in `eslint.config.js.mjs` and `eslint.config.ts.mjs`. - Do not introduce formatting-only tooling or workflow changes unless the task explicitly requires them. ### Documentation Comment Preferences + When writing or reviewing code, follow these documentation standards for maximum compatibility: - **Use `@returns` instead of `@return`**: Always use `@returns` in documentation comments for compatibility with documentation generators. @@ -132,6 +149,7 @@ Place annotations in the following order for consistency and readability: Include other relevant tags (such as `@template`, `@type`) after the above, as appropriate for the context. ### File Headers + All source files must include the MIT License copyright header at the top. **Copyright year convention:** Use the original year the file was authored. If the file is subsequently modified in a later year, expand to a range (e.g., `2024-2026`). Do not change the starting year when editing an existing file. @@ -159,6 +177,7 @@ All source files must include the MIT License copyright header at the top. ``` ## Directory Structure + - `src/` - package source code - `test/` - Vitest test suites - `test/utils` - Shared test fixtures and scenario helpers for use across test suites @@ -168,31 +187,38 @@ All source files must include the MIT License copyright header at the top. - `.github/workflows/` - CI, publishing, documentation, and analysis workflows ## Documentation and GitHub Pages + - `README.md` and `docs/index.md` should stay in sync for shared content, but they are not expected to be identical. Expected differences include Jekyll front matter, file-specific introductory or heading sections, footer or copyright text, and internal link differences. Any addition, removal, or update to shared sections must be applied consistently to both files. ### TypeDoc Configuration + - API docs are generated with TypeDoc (`npm run docs`) using `typedoc.json`. - TypeDoc entry points are intentionally pointed to module-level index files (e.g., `./src/number/index.ts`, `./src/random/index.ts`) rather than the root package entry point (e.g., `./src/index.ts`). This is done purposefully to maintain module-level organization in the generated documentation output. Do not change TypeDoc entry points to the root package entry point. ### Release Documentation + - Release documentation organized in `docs/releases/...` is maintained manually and not generated by any automated process. - Release docs follow the directory structure: `docs/releases/v{major}.x/v{major}.{minor}.x/v{version-prefix}.x/{full-version}/doc/`, where `{version-prefix}` includes the major, minor, patch, and any pre-release type identifier (e.g., `v0.1.0-alpha` for versions like `v0.1.0-alpha.0`). ### Jekyll Build + - The Jekyll build uses the `jekyll-relative-links` plugin (configured in `docs/_config.yml`), which automatically converts relative `.md` links in `docs/` markdown files to their rendered `.html` paths. For example, `./portfolio-skills.md` in `docs/index.md` resolves to `portfolio-skills.html` on the published site. Use `.md` relative links within `docs/` source files; the build process will convert them correctly. ## Portfolio Page Generation and Maintenance + - The portfolio skills page for this repository lives at `docs/portfolio-skills.md` and is published through the Jekyll site under `docs/`. - Evidence links in `docs/portfolio-skills.md` should always point to the `main` branch, even when the page is updated from another branch. - The guidance in this section applies only when `docs/portfolio-skills.md` is present or intentionally being created. ### Prompt Template + Use the following prompt template when generating or updating the `docs/portfolio-skills.md` page; for example, when a new project is started, when key dependencies or tooling change, or when the project's capabilities, functionality, or implementation evolve. ````markdown You are generating/updating a technical portfolio page documenting a software project, template, starter, or implementation, following a specific evidence-based structure. ## Context + Project Name: [PROJECT_NAME] Project Repository: [GITHUB_REPO_URL] Target Ref for Evidence Links: main @@ -202,6 +228,7 @@ Runtime: [e.g., Node.js, Python 3.11+] Key Technologies: [list 3-5 core tech choices] ## Structure Requirements + Generate a Markdown file with these sections in order: 1. **Front Matter** (Jekyll metadata): @@ -285,6 +312,7 @@ Generate a Markdown file with these sections in order: - Avoid defensive language; treat gaps as engineering decisions or next-step opportunities ## Tone & Style Guidelines + - **Clarity:** Use precise technical language; avoid marketing speak - **Evidence-first:** Every statement in "Detailed Technical Notes" must be traceable - **Durability:** Generalize version/cadence claims unless you will actively maintain them @@ -296,6 +324,7 @@ Generate a Markdown file with these sections in order: - **Scope discipline:** Do not overstate maturity, completeness, or production-readiness unless directly supported by evidence ## Common Pitfalls to Avoid + - Claim/evidence mismatch (e.g., claiming workflow setup but only linking asset files) - Evidence that is technically relevant but not representative of the current runtime/configured implementation - Overstated scope (e.g., "full-stack" when really just frontend or backend) @@ -306,6 +335,7 @@ Generate a Markdown file with these sections in order: - Capability bullets that list technologies without explaining engineering value ## Output Format + Return the complete Markdown file ready to save as `docs/portfolio-skills.md` and publish. Ensure: - All links use the full GitHub repo URL with `/blob/main/` path format for files - Use `/tree/main/` for directory links when appropriate @@ -315,6 +345,7 @@ Return the complete Markdown file ready to save as `docs/portfolio-skills.md` an - The page reads as evidence-based, concise, and professional ## Update Mode (when `docs/portfolio-skills.md` already exists) + - Preserve any accurate, still-relevant sections and links that do not need changes - Update only sections where repository evidence, tooling, or capabilities changed - Keep front matter `date` from the original file; only update `modified_date` @@ -322,6 +353,7 @@ Return the complete Markdown file ready to save as `docs/portfolio-skills.md` an ```` ### How to Use This Template + 1. **Customize the bracketed fields** at the top with your project's info: - `[PROJECT_NAME]` → actual name - `[GITHUB_REPO_URL]` → full URL @@ -351,6 +383,7 @@ Return the complete Markdown file ready to save as `docs/portfolio-skills.md` an - Ask Copilot to add stronger evidence links where claims are currently under-supported ### Example Customization + If you were documenting a new project called `my-ml-starter`: ```text @@ -365,9 +398,11 @@ Key Technologies: PyTorch, pre-trained models, Docker, GitHub Actions Then paste the full template prompt with these values filled in. ## Portfolio Skills Page Review Instructions + Use the following standards for Copilot code review and any agentic Copilot sessions reviewing changes to `docs/portfolio-skills.md`. ### Reusable Summary for This Portfolio Page Pattern + These pages follow a strong, repeatable structure: 1. **Concise project framing** @@ -382,6 +417,7 @@ The core standard is: **every technical claim should be durable and traceable to ### What to Verify When Reviewing `docs/portfolio-skills.md` #### 1) Structure and completeness + Ensure the page includes the required front matter and these sections (or equivalents): - Required Front Matter (`title`, `layout`, `date`, `modified_date`) @@ -395,6 +431,7 @@ Ensure the page includes the required front matter and these sections (or equiva Why: this keeps pages consistent and easy to compare across projects. #### 2) Claim quality (accuracy + durability) + Check that claims are: - **specific enough to be meaningful** @@ -408,6 +445,7 @@ Risky pattern: - hardcoding exact versions/cadences unless you plan frequent updates #### 3) Evidence alignment (most important review item) + For each claim in technical notes, verify linked evidence **directly supports** it. Evidence does not need to enumerate every implementation instance in the repository. A representative selection that successfully demonstrates the claim is sufficient. Example rule: @@ -418,6 +456,7 @@ Also check whether the linked evidence is **representative of the project's curr This is a common high-impact review issue. #### 4) Portfolio tone calibration + Look for balance between: - implementation facts ("what exists") @@ -429,6 +468,7 @@ Avoid: - absolute claims not backed by links #### 5) Consistency across pages + When reviewing a new page, compare with existing template pages for: - heading style/casing @@ -440,6 +480,7 @@ When reviewing a new page, compare with existing template pages for: Consistency boosts professionalism at portfolio scale. #### 6) Gaps section quality + A strong `Current Gaps / Future Improvements` section is: - concise (2–4 bullets) @@ -453,6 +494,7 @@ Common high-value bullets: - deployment/docs not yet covered (if true) ### Quick Review Checklist + Reuse the earlier template usage checklist as the canonical baseline review list. Use this section only for additional review-specific checks: ```markdown @@ -463,6 +505,7 @@ Reuse the earlier template usage checklist as the canonical baseline review list ``` ### Common Pitfalls to Catch Early + - Claim/evidence mismatch (most frequent) - Hardcoded version/cadence details that will drift - "CI/CD" wording when no deployment pipeline is shown @@ -472,6 +515,7 @@ Reuse the earlier template usage checklist as the canonical baseline review list - Mixed category labels in tooling inventory that blur automation, deployment, security, and dependency management ### One-Sentence Review Standard + When you review the next page, use this rule: **"If a reader challenges any technical statement, can I point to an exact linked file that proves it, and is the wording likely to stay accurate over time?"** diff --git a/CLAUDE.md b/CLAUDE.md index 53b93c9..e426976 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -3,17 +3,21 @@ Guidance for Claude Code (and other AI assistants) when working in this repository. ## Canonical Instructions + The detailed, authoritative conventions for this project live in [`.github/copilot-instructions.md`](./.github/copilot-instructions.md); read that file first. This document is a concise map; `.github/copilot-instructions.md` is the source of truth. ## Keep These Two Files in Sync + This repository maintains both `CLAUDE.md` and `.github/copilot-instructions.md`. When you update guidance in one file that also applies to the other, mirror the change so the two stay consistent. Updates to `CLAUDE.md` should be reflected, when appropriate, in `.github/copilot-instructions.md`, and vice versa. ## Project Summary + A growing ESM-first TypeScript utility package for reusable number, random, and string helpers. ## Common Commands + - `npm ci` — install dependencies from the lockfile. - `npm run lint:all` — run both the JavaScript and TypeScript ESLint configurations. - `npm run build` — bundle the package to `_dist/` with tsdown. @@ -22,10 +26,12 @@ A growing ESM-first TypeScript utility package for reusable number, random, and - `npm run docs` — generate TypeDoc API documentation to `_doc/`. ## Generated Output Directories (not committed) + `_dist/` (build), `_coverage/` (coverage), and `_doc/` (TypeDoc) are generated and gitignored. Note that the `docs/` Jekyll site separately includes committed sample documentation. ## Documentation Notes + - Keep shared content between `README.md` and `docs/index.md` consistent; expected differences (front matter, headings, footer/links) are documented in `.github/copilot-instructions.md`. - The portfolio skills page (`docs/portfolio-skills.md`) and its generation/review workflow are diff --git a/README.md b/README.md index bad81b9..8ecf11b 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,21 @@ # TypeScript Utilities + A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development. ## Documentation + - [Latest Release](https://blwatkins.github.io/typescript-utils/doc/index.html) - [Documentation by Version Number](https://blwatkins.github.io/typescript-utils/releases.html) ## License + The source code of this project is licensed under the [MIT License](https://opensource.org/license/mit). The full text of the license is included with the project source code. ## Project Status Badges ### [npm](https://www.npmjs.com/package/@blwat/utils) + ![npm License](https://badgen.net/npm/license/@blwat/utils/alpha) ![npm Version](https://badgen.net/npm/v/@blwat/utils) ![npm @alpha Version](https://badgen.net/npm/v/@blwat/utils/alpha) @@ -23,19 +27,23 @@ The full text of the license is included with the project source code. ![npm Unpacked Size](https://img.shields.io/npm/unpacked-size/%40blwat%2Futils) ### [Socket](https://socket.dev/npm/package/@blwat/utils) + ![Socket Score](https://badge.socket.dev/npm/package/@blwat/utils) ### [Bundlephobia](https://bundlephobia.com/package/@blwat/utils) + ![Bundlephobia Tree Shaking](https://badgen.net/bundlephobia/tree-shaking/@blwat/utils) ![Bundlephobia Dependency Count](https://badgen.net/bundlephobia/dependency-count/@blwat/utils) ![Bundlephobia Minified](https://badgen.net/bundlephobia/min/@blwat/utils) ![Bundlephobia Minified + gzip](https://badgen.net/bundlephobia/minzip/@blwat/utils) ### [Package Phobia](https://packagephobia.com/result?p=%40blwat%2Futils) + ![Package Phobia Install Size](https://badgen.net/packagephobia/install/@blwat/utils) ![Package Phobia Publish Size](https://badgen.net/packagephobia/publish/@blwat/utils) ### [GitHub](https://github.com/blwatkins/typescript-utils) + ![GitHub License](https://badgen.net/github/license/blwatkins/typescript-utils) ![GitHub Dependabot](https://badgen.net/github/dependabot/blwatkins/typescript-utils) ![GitHub Latest Release](https://badgen.net/github/release/blwatkins/typescript-utils) @@ -49,15 +57,18 @@ The full text of the license is included with the project source code. ![GitHub Language Count](https://img.shields.io/github/languages/count/blwatkins/typescript-utils) ### GitHub Actions + ![CodeQL](https://github.com/blwatkins/typescript-utils/actions/workflows/codeql.yml/badge.svg) ![npm Lint, Build, and Test](https://github.com/blwatkins/typescript-utils/actions/workflows/npm-test.yml/badge.svg) ![Deploy GitHub Pages with Jekyll](https://github.com/blwatkins/typescript-utils/actions/workflows/gh-pages-jekyll.yml/badge.svg) ## Sources and Technical Notes + - [Demonstrated Portfolio Skills](https://blwatkins.github.io/typescript-utils/portfolio-skills.html) - [Resources and References](https://blwatkins.github.io/typescript-utils/resources-and-references.html) ## Thank Yous + A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation. A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. diff --git a/docs/index.md b/docs/index.md index cbe140c..873ab24 100644 --- a/docs/index.md +++ b/docs/index.md @@ -4,19 +4,23 @@ layout: page --- ## About This Project + A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development. ## Documentation + - [Latest Release](./doc/index.html) - [Documentation by Version Number](./releases.md) ## License + The source code of this project is licensed under the [MIT License](https://opensource.org/license/mit). The full text of the license is included with the project source code. ## Project Status Badges ### [npm](https://www.npmjs.com/package/@blwat/utils) + ![npm License](https://badgen.net/npm/license/@blwat/utils/alpha) ![npm Version](https://badgen.net/npm/v/@blwat/utils) ![npm @alpha Version](https://badgen.net/npm/v/@blwat/utils/alpha) @@ -28,19 +32,23 @@ The full text of the license is included with the project source code. ![npm Unpacked Size](https://img.shields.io/npm/unpacked-size/%40blwat%2Futils) ### [Socket](https://socket.dev/npm/package/@blwat/utils) + ![Socket Score](https://badge.socket.dev/npm/package/@blwat/utils) ### [Bundlephobia](https://bundlephobia.com/package/@blwat/utils) + ![Bundlephobia Tree Shaking](https://badgen.net/bundlephobia/tree-shaking/@blwat/utils) ![Bundlephobia Dependency Count](https://badgen.net/bundlephobia/dependency-count/@blwat/utils) ![Bundlephobia Minified](https://badgen.net/bundlephobia/min/@blwat/utils) ![Bundlephobia Minified + gzip](https://badgen.net/bundlephobia/minzip/@blwat/utils) ### [Package Phobia](https://packagephobia.com/result?p=%40blwat%2Futils) + ![Package Phobia Install Size](https://badgen.net/packagephobia/install/@blwat/utils) ![Package Phobia Publish Size](https://badgen.net/packagephobia/publish/@blwat/utils) ### [GitHub](https://github.com/blwatkins/typescript-utils) + ![GitHub License](https://badgen.net/github/license/blwatkins/typescript-utils) ![GitHub Dependabot](https://badgen.net/github/dependabot/blwatkins/typescript-utils) ![GitHub Latest Release](https://badgen.net/github/release/blwatkins/typescript-utils) @@ -54,15 +62,18 @@ The full text of the license is included with the project source code. ![GitHub Language Count](https://img.shields.io/github/languages/count/blwatkins/typescript-utils) ### GitHub Actions + ![CodeQL](https://github.com/blwatkins/typescript-utils/actions/workflows/codeql.yml/badge.svg) ![npm Lint, Build, and Test](https://github.com/blwatkins/typescript-utils/actions/workflows/npm-test.yml/badge.svg) ![Deploy GitHub Pages with Jekyll](https://github.com/blwatkins/typescript-utils/actions/workflows/gh-pages-jekyll.yml/badge.svg) ## Sources and Technical Notes + - [Demonstrated Portfolio Skills](./portfolio-skills.md) - [Resources and References](./resources-and-references.md) ## Thank Yous + A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation. A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. diff --git a/docs/portfolio-skills.md b/docs/portfolio-skills.md index 736b22a..9c0721b 100644 --- a/docs/portfolio-skills.md +++ b/docs/portfolio-skills.md @@ -5,7 +5,7 @@ author: - GitHub Copilot layout: post date: 2026-05-27 -modified_date: 2026-06-19 +modified_date: 2026-06-22 toc: true --- @@ -85,6 +85,7 @@ The public entry point re-exports domain modules, and each domain module re-expo - [src/number/index.ts](https://github.com/blwatkins/typescript-utils/blob/main/src/number/index.ts) - [src/random/index.ts](https://github.com/blwatkins/typescript-utils/blob/main/src/random/index.ts) - [src/random/seeded-random/index.ts](https://github.com/blwatkins/typescript-utils/blob/main/src/random/seeded-random/index.ts) +- [src/string/index.ts](https://github.com/blwatkins/typescript-utils/blob/main/src/string/index.ts) ### Strict typing and lint enforcement model @@ -105,6 +106,8 @@ The project uses Vitest for repeatable unit testing, with scripts wired into loc - [package.json scripts](https://github.com/blwatkins/typescript-utils/blob/main/package.json) - [test/string/string-utility.test.ts](https://github.com/blwatkins/typescript-utils/blob/main/test/string/string-utility.test.ts) - [test/utils/input/string-inputs.ts](https://github.com/blwatkins/typescript-utils/blob/main/test/utils/input/string-inputs.ts) +- [test/string/color-string-utility.test.ts](https://github.com/blwatkins/typescript-utils/blob/main/test/string/color-string-utility.test.ts) +- [test/utils/input/color-string-inputs.ts](https://github.com/blwatkins/typescript-utils/blob/main/test/utils/input/color-string-inputs.ts) - [test/utils/test-case/scenarios/random-number-generator-factory-scenarios.ts](https://github.com/blwatkins/typescript-utils/blob/main/test/utils/test-case/scenarios/random-number-generator-factory-scenarios.ts) - [npm-test.yml](https://github.com/blwatkins/typescript-utils/blob/main/.github/workflows/npm-test.yml) diff --git a/docs/releases.md b/docs/releases.md index 26097dc..7e641ff 100644 --- a/docs/releases.md +++ b/docs/releases.md @@ -3,7 +3,7 @@ layout: post author: - Brittni Watkins date: 2026-05-18 -modified_date: 2026-06-19 +modified_date: 2026-06-22 title: "Releases" tags: - releases @@ -11,6 +11,7 @@ toc: true --- ## v0.x + - [v0.1.0-alpha.0](releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html) *(May 19, 2026)* - **@latest** - [v0.1.0-alpha.1](releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html) *(June 16, 2026)* - [v0.1.0-alpha.2](releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.2/doc/index.html) *(June 19, 2026)* - **@alpha** diff --git a/docs/resources-and-references.md b/docs/resources-and-references.md index 138fe7f..943eec8 100644 --- a/docs/resources-and-references.md +++ b/docs/resources-and-references.md @@ -4,7 +4,7 @@ author: - Brittni Watkins layout: post date: 2026-06-05 -modified_date: 2026-06-05 +modified_date: 2026-06-22 toc: true --- @@ -12,10 +12,9 @@ toc: true ### JavaScript -[MDN Web Docs - Number.isFinite()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite) - -[MDN Web Docs - Number.isInteger()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger) +- [MDN Web Docs - Number.isFinite()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite) +- [MDN Web Docs - Number.isInteger()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger) ## Pseudorandom Number Generation -[Xoshiro128** Algorithm](https://github.com/bryc/code/blob/master/jshash/PRNGs.md#xoshiro) +- [Xoshiro128** Algorithm](https://github.com/bryc/code/blob/master/jshash/PRNGs.md#xoshiro) From a39cf856097358c9f9ac19dd834ebdbd7eafc0dd Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 22:53:31 -0500 Subject: [PATCH 019/122] Update discriminator-registry.ts type validation. --- src/discriminator/discriminator-registry.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/discriminator/discriminator-registry.ts b/src/discriminator/discriminator-registry.ts index 282a8a8..10101c5 100644 --- a/src/discriminator/discriminator-registry.ts +++ b/src/discriminator/discriminator-registry.ts @@ -144,18 +144,18 @@ export class DiscriminatorRegistry { throw new TypeError('Registration must be an object.'); } - const registration: DiscriminatorRegistration = input as DiscriminatorRegistration; + const record = input as Record; - if (!StringUtility.isSingleLineTrimmedString((registration as { discriminator: unknown; }).discriminator)) { - throw new TypeError(`Discriminator '${registration.discriminator}' must be a non-empty single line trimmed string.`); + if (!StringUtility.isSingleLineTrimmedString(record['discriminator'])) { + throw new TypeError(`Discriminator '${record['discriminator']}' must be a non-empty single line trimmed string.`); } - if (typeof registration.validator !== 'function') { - throw new TypeError(`Discriminator '${registration.discriminator}' must have a validator function.`); + if (typeof record['validator'] !== 'function') { + throw new TypeError(`Discriminator '${record['discriminator']}' must have a validator function.`); } - if (DiscriminatorRegistry.has(registration.discriminator)) { - throw new Error(`Discriminator '${registration.discriminator}' is already registered.`); + if (DiscriminatorRegistry.has(record['discriminator'] as string)) { + throw new Error(`Discriminator '${record['discriminator']}' is already registered.`); } } From a5488ff5c8094b8391e026e6e805daf672c3fa36 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 23:12:53 -0500 Subject: [PATCH 020/122] Refactor and update discriminator-registry.ts and discriminator-registry.test.ts --- src/discriminator/discriminator-registry.ts | 55 ++++++++++--------- .../discriminator-registry.test.ts | 10 ++++ 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/discriminator/discriminator-registry.ts b/src/discriminator/discriminator-registry.ts index 10101c5..3a3bf31 100644 --- a/src/discriminator/discriminator-registry.ts +++ b/src/discriminator/discriminator-registry.ts @@ -119,10 +119,35 @@ export class DiscriminatorRegistry { DiscriminatorRegistry.#discriminators.set(registration.discriminator, registration.validator); return (input: unknown): input is T => { - return DiscriminatorRegistry.#validate(input, registration.discriminator); + return DiscriminatorRegistry.validate(input, registration.discriminator); }; } + /** + * Validates an input against a specific discriminator. + * + * @param {unknown} input - The input to validate. + * @param {string} discriminator - The discriminator value to check. + * + * @returns {boolean} - `true` if the input matches the type associated with the discriminator, `false` otherwise. + * + * @public + * @since 0.1.0 + */ + public static validate(input: unknown, discriminator: string): boolean { + if (!DiscriminatorRegistry.#isDiscriminated(input, discriminator)) { + return false; + } + + const validator: ((input: unknown) => boolean) | undefined = DiscriminatorRegistry.#discriminators.get(discriminator); + + if (validator) { + return validator(input); + } + + return false; + } + /** * Validates a discriminator registration object to ensure it has the required properties and that the discriminator value is unique. * @@ -147,42 +172,18 @@ export class DiscriminatorRegistry { const record = input as Record; if (!StringUtility.isSingleLineTrimmedString(record['discriminator'])) { - throw new TypeError(`Discriminator '${record['discriminator']}' must be a non-empty single line trimmed string.`); + throw new TypeError(`Discriminator '${record['discriminator'] as string}' must be a non-empty single line trimmed string.`); } if (typeof record['validator'] !== 'function') { throw new TypeError(`Discriminator '${record['discriminator']}' must have a validator function.`); } - if (DiscriminatorRegistry.has(record['discriminator'] as string)) { + if (DiscriminatorRegistry.has(record['discriminator'])) { throw new Error(`Discriminator '${record['discriminator']}' is already registered.`); } } - /** - * Validates an input against a specific discriminator. - * - * @param {unknown} input - The input to validate. - * @param {string} discriminator - The discriminator value to check. - * - * @returns {boolean} - `true` if the input matches the type associated with the discriminator, `false` otherwise. - * - * @private - */ - static #validate(input: unknown, discriminator: string): boolean { - if (!DiscriminatorRegistry.#isDiscriminated(input, discriminator)) { - return false; - } - - const validator: ((input: unknown) => boolean) | undefined = DiscriminatorRegistry.#discriminators.get(discriminator); - - if (validator) { - return validator(input); - } - - return false; - } - /** * Is the given input an object with a discriminator property that matches the given discriminator value? * diff --git a/test/discriminator/discriminator-registry.test.ts b/test/discriminator/discriminator-registry.test.ts index 32f9bb8..55edf81 100644 --- a/test/discriminator/discriminator-registry.test.ts +++ b/test/discriminator/discriminator-registry.test.ts @@ -306,4 +306,14 @@ describe('DiscriminatorRegistry', (): void => { }); }); }); + + describe('validate', (): void => { + test('validate returns false for unregistered discriminator', (): void => { + const input = { + discriminator: 'unregistered' + }; + + expect(DiscriminatorRegistry.validate(input, 'unregistered')).toBe(false); + }); + }); }); From a75ba20a080dee05e434d410716df2e0667b836c Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 22 Jun 2026 23:13:53 -0500 Subject: [PATCH 021/122] Update generated docs for v0.1.0-alpha.3 --- .../v0.1.0-alpha.3/doc/assets/search.js | 2 +- .../discriminator.DiscriminatorRegistry.html | 14 +++++++++++--- .../doc/classes/number.NumberUtility.html | 8 ++++---- .../random.RandomNumberGeneratorFactory.html | 6 +++--- .../doc/classes/random.SeedVersions.html | 8 ++++---- .../random.SeededRandomNumberGenerator.html | 6 +++--- .../doc/classes/string.ColorStringUtility.html | 14 +++++++------- .../doc/classes/string.StringUtility.html | 18 +++++++++--------- ...iscriminator.DiscriminatorRegistration.html | 6 +++--- .../doc/interfaces/random.SeedVersion.html | 4 ++-- .../doc/types/discriminator.Discriminated.html | 2 +- .../doc/types/discriminator.TypeGuard.html | 2 +- .../discriminator.discriminatedSchema.html | 2 +- 13 files changed, 50 insertions(+), 42 deletions(-) diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js index 9225b86..55b2924 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js @@ -1 +1 @@ -window.searchData = "eJy1msFu2zgQht+FvgqpOaSd2Ld2d9stUBRF0/ZiBAvFYhxibcmQ5DRZI+++oCRLQ3Ek07JzC2TOz5+cT+SE4p6lye+MzRd79q+OIzaHgMXhRrE5i3S2TPVGx2GepCxgu3TN5myTRLu1yt5Zv1495ps1C9hyHWaZyticsdfgoMjhptb8E0d9Vyud5elLrV2Ft7TJGKLHgG3DVMW5Y72xAmPZeHkMs8E9j8pgj95pkS5PafG7SocbQwoXcTeZ9iYvzHUS1251nKv0IVx6GS5Ch+WRj0Ee4XSglVFbbegklhPTYfkpXOvoInax0qWswnh2zSdA5V1FteP8ZdtnVkVDX1G78x8vW/VpF6b9HdethnUqyFVPRbfLR7UJ656fwlSH9+7qR8QMHHxtI95t7pW76paPvZfbr0Xzn7le69xdZisxq1G/78pVx+Kls4861rn6ans/2t1IZw9FYD3ovt5tgW4vn+NcrU60oeuYSzj4lmQ6109qiJNtFXuuo2ZnCeMo2ThAlY+9gfpeNC97+6RilRqAP4bLPCG28Uq7L6Yft8pzxwSH2Uu8/LDT62hwz6NC477S6DPRq9Xl8P48c5f0hZN4q1SkIjKwy2xPyIkpnPCGyWUSZ3m6W57R8cjW6J2qvnF3ZDBWz/lga1XwBTy1s/dLpZlOYrd+RaqHNqe+YlPgsqlUMv2f8u5lVLU+OuLaf8e0r1ReNfHve6XypzrmbAc6+2Uqq89xpJ79PeisqMd0FTXIBSq4UROqUHSFTsy1VZMmDw+ZyrMTOho1Ib4jJbemLE91vHK2pvKx99b0R7JO0tsipqvgqRTdlv3zVvnrfEce1XMh+S3Mc5W6yPZ3O3pUz0vz07YO77NByHg7+/7pw5nm0tX92/p7f77B8DyH9irwd+XwVFs6Oxh7CzcDEtkYOjuHnZ5OTp5l6ry8WVukzypwwQUg0/Fqrb7oWH1Jfqt0GWbqR6o3GxUdWRKIKSm11jpW64NWXmp5rg+er17j+QJW39jhz+32YrO6O2hdyLP9MnxN4r822/zl1t7SjhvUWZzEyoTWu+El/Nx2kjnAYTeab+T5Elbf1mGbzLOsttG8rOcBzob0fxewsvyd79mhHp8zuBJXMxawB63WkfncUBoL2DLZbIxcwKJkuSv+vKua/VLmnzrTuGz9bsyCxTiA2RUHeXcXLA7BxQ/Fg4NG86QI5CxY8EDIKxBgBXInkFuBwIIFUIHgBIIVKFiwEFSgcAKFFShZsJBUoHQCpRU46ZqciRM4sQKnLFhMqB6nTuDUCrxmwWJKBV47gddW4A0LFtdU4I0TeGMFzliwuKECZ07gzAbA8DAjCXDZ4S14CnrGZDDBjw0QN1hwmj2XIW5DxA0anOSPuxxxGyRu8OAkg9xlidswcYMIJznkLk/cBoobTDiJFHeZ4jZU3KDCSay4yxW3weIGF06ixV22uA0XN8hwEi/u8sVtwMAww0nCwCUMbMLAMAMkYeASBq0lqlijSMKAWKVswsAwA/QK5xIGNmFgmAGSMHAJA5swMMwASRi4hIFNGBhmgCQMXMLAJgwMM0ASBi5hYBMGhhkgCQOXMLAJA8MMkISBSxjYhAnDDJCECZcwYRMmDDOCJEy4hAmbMGGYESRhwiVMtDbCYickCRPEXmgTJgwzgt5HXcKETZgwzAiSMOESJmzChGFGkIQJlzBhEyYMM4IkTLiECZswYZgRJGHCJUzYhAnDjCAJEy5hwiZMGmYESZh0CZM2YdIwI0nCpEuYtAmThhlJEiZdwqRNmDTMSJIw6RImW+VWUW+RhEmi4iofFSXuk0pzVZ0PmwoVf0nas3+qGpjXh7l7xq/ZfP/62tS88/0rKnvNb6Y3V+Maadx4aRRHKmV9vjucgjSCzUnJnsHMUxB9ZUHWZkhp7KUU2ZcJGi00U34TZSll1Zf6Rg8N0m+MrZsfjdK4URqXsZPTBVPrvkwjLhtxOVjVSi9HuHgp4i8niBKBcutnrbgUhRSQgF98+yQcaSHShB9p1NF1IyhQVoXfPJFHzUgRTbzwG3D74gNKIs6ir1hz5IxcoSwIcaJQe84QEsIPifYJLxJD5Au/Fwpd0EAzhQbIfQfYPmxDthBo0g804rYGsofmjPvO2fGTNrSAIJClH8g952NIFxEofQk8fpiFOkCJk76JI2TQBEvfCcafadEig5AEPyTLb/xIAmUD/LLhvvwIQe6HYKlB7PUc+eF+fuqvumhUaHMGv935cN8IWUGzy/1mtxQpB7c63It4OFw3QtITJD31k67vyaJ3H61IXiJZcXuDdGnZQ7UI9ytGjDK1KaOBgt9AkZKdU/R+g9/77fFtCk0mYkb4MdP9QQnJompY+FXDHh9/kD7KlfDMVXHrBc0sLnw8QXKWNUDjBM9xdhX8AlEj/Kgxl2xX5bXbRgdZ8nOEbic3KsiMh5e7gG31tsgemy/uXl//B2CTWwA="; \ No newline at end of file +window.searchData = "eJy1mt1u2zgQhd+FvhVS88d27Lt2d9stUBRF0/bGCBaKxTjE2pIhyWmyQd59QUmWZsSRTMvOXSDrHB6Sn8iJxBeWJr8ztli+sH9NHLGFCFgcbjVbsMhkq9RsTRzmScoCtk83bMG2SbTf6Owd+vXqId9uWMBWmzDLdMYWjL0GB0curmvPP6Hqu16bLE+fa+9K3vImNUSLAduFqY5zJ3oTRYxVk+UhzAa3PCrFHq3TJl2Z0uJ3nQ4PBhwunu4x3JgozPXwdMDhIukm0160wtwkcZ3WxLlO78OVV+BCOowyPhbqyFM0MMqo7TZ0EMuB6YhcTdIF4kKnS0UV4/mMTwQ17zqqE+fPu76wOhq6gODGfzzv9Kd9mPY3XN81rFFJrsk6ulk96G1Yt/wYpia8c9dmQjOw83WMeL+90+6eUF723gy+Frf/zM3G5O4mUJmhm/pzV6k6Fi+TfTSxyfVXnP1ocyOT3RfCutN9rWOD7iyf41yvT4xhas0lEnxLMpObRz0kya7Snpuo2ffCOEq2DlDlZW+gvhe3l6190rFOLcAfw1WeEEVG5d2n6cetytwxwGH2HK8+7M0mGtzyqPC4qzz6QvR6dSW8Oy/cJXPBSbzROtIRKewK2yM5cQonvGFylcRZnu5XZzQ8wh69Q9XX744ZjPVTPjhaJb5Apvbs/dJpZpLYra6B6+GeUx+xqeCqqVQy859bjHa1MqruPtrjOn/HsK91Xt3i3/Za54+15uwEJvtlK6vPcaSf/DOYrKjHTKUalAIU3OAWqlB0jU6ca1STJvf3mc6zExoaNRLfnpJbU5anJl47W1N52Xtr+iPZJOlNoekqeCpH987+cavydT4jD/qpsPwW5rlOXWT7mx096KeV/WlXy/tiEDbeyb5/+nBmuHR997b53p8fMDwvIV4F/q4SnhrLZIdgb5FmwEQ2gc6ew85MJ08eCnXevKEt0mcVuOACkJl4vdFfTKy/JL91ugoz/SM1262OjiwJxJCUXhsT683BKy+9PNcHz0evyXyBqG+c8Odud7FR3R+8LpQZPwxfk/iv7S5/vsFb2vGAJouTWFtpvRteIs9NJ5kDEnaj+UaZLxH1bRO2yTwrahvNy2YekGxI+7cBK8vfxQs71OMLJq7k1ZwF7N7oTWQ/hpTBArZKtltrF7AoWe2LP2+r235p+0+dvbm8+92YBctxIOZXUs5vb4PlQVz8UFw4eDRXCiFnwZIHUl0pNUNC7gg5EgoWLAUlFI5QIKFkwVJSQukIJRIqFiwVJVSOUCHhhAXLCSWcOMIJEk67RnXqCKdIOGPBckq1OHOEMyS8ZsFyRgmvHeE1Es5ZsLymhHNHOMcAWB7mJAEuO7wFT0HPmBQT/GCAuMWC0+y5DHEMEbdocJI/7nLEMUjc4sFJBrnLEscwcYsIJznkLk8cA8UtJpxkkbtMcQwVt6hwEivucsUxWNziwkm0uMsWx3Bxiwwn8eIuXxwDJiwznCRMuIQJTJiwzAiSMOESJlpLVLFGkYQJYpXChAnLjKBXOJcwgQkTlhlBEiZcwgQmTFhmBEmYcAkTmDBhmREkYcIlTGDChGVGkIQJlzCBCROWGUESJlzCBCZMWGYESZhwCROYMGmZESRh0iVMYsKkZUaShEmXMIkJk5YZSRImXcJkayMsdkKSMEnshZgwaZmR9D7qEiYxYdIyI0nCpEuYxIRJy4wkCZMuYRITJi0zkiRMuoRJTJi0zEiSMOkSJjFh0jIjScKkS5jEhCnLjCQJUy5hChOmLDOKJEy5hClMmLLMKJIw5RKmMGHKMqNIwpRLmGqVW0W9RRKmiIoLE6YsM4qu1lzCqktFffyo01xXL5dteQs/Q72wf6oCms8O9fsL49ds8fL62hTMi5dXUDPb32xrrsc18Jh7eRTvY8rifn94hdIYinljKMeehuATDXAaN06CezlF+CRC4wVGym+gkFNWfeZv/EAnuV8nW+dGGivQy3GpnZ5umKLTNo35pDGfDHZF88tBz70c4XcXMLkKTK5ftOLAF3AABn769nv0xkuCSZB+3aJefANDMExyULzyhSdwBP2V0suxfWwCTCIw475mzQtrkEqCVOpEo/aYASSkHxLt98PADJAv/R4ocLwDjBToIPftYPtVXWOnAGjKDzTirAeIB8aM+47Z8fd0IDAAWfmB3PN2DfgCApUvgcdfhYEGwMQp34kjbMAAK98Bhh95wYIFkBR+SJYnBIAFmA3hNxvEww8Y5H4MlibEbs/hduAXqP4oDLoFtmfhtz8fjiuBKGB4ud/wliZl59aHYxX3h9NKwHoKrGd+1vUhYLAmgSXJyyQrDn+QKVE8UI0Iv2rEOlO7Muio8OsocMJzCvdnz+4e/7QFBhMwI/2Y6f4eBWxBPSz96mGPb0fAH8yV8pyr4tAMGFnAkfBb2dx1TYB+Cs9+dpX8ElAj/aixZ3TX5andxgdE8kvUnGUHCzYY31NM8CMFeuTRoduA7cyuQIAtlrevr/8DVXu+WQ=="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html index 55c3c11..83f80a3 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html @@ -1,15 +1,16 @@ DiscriminatorRegistry | @blwat/utils - v0.1.0-alpha.3

    Class DiscriminatorRegistry

    Static registry for managing discriminators and their associated type guards. Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

    0.1.0

    -
    Index

    Methods

    has +
    Index

    Methods

    • Checks if a discriminator is already registered.

      Parameters

      • discriminator: string

        The discriminator value to check.

      Returns boolean

      • true if the discriminator is registered, false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +
    • Validates an input against a specific discriminator.

      +

      Parameters

      • input: unknown

        The input to validate.

        +
      • discriminator: string

        The discriminator value to check.

        +

      Returns boolean

        +
      • true if the input matches the type associated with the discriminator, false otherwise.
      • +
      +

      0.1.0

      +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html index 6f3ed8e..b5664fd 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html @@ -1,18 +1,18 @@ NumberUtility | @blwat/utils - v0.1.0-alpha.3

    Class NumberUtility

    Static properties and methods for validating number types.

    0.1.0

    -
    Index
    Index

    Methods

    • Is the given input a finite number?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is a finite number; false otherwise.

      0.1.0

      -
    • Is the given input an integer?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is an integer; false otherwise.

      0.1.0

      -
    • Is the given input a positive integer?

      +
    • Is the given input a positive integer?

      Parameters

      • input: unknown
      • zeroInclusive: boolean = false

        true if zero should be considered a valid input. false if zero should be considered an invalid input. Default value is false.

      Returns input is number

      true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html index a19478d..d894edc 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html @@ -1,6 +1,6 @@ RandomNumberGeneratorFactory | @blwat/utils - v0.1.0-alpha.3

    Class RandomNumberGeneratorFactory

    A static factory class for creating a SeededRandomNumberGenerator object.

    0.1.0

    -
    Index

    Methods

    Index

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html index 173b7b5..a8ef8f4 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html @@ -1,14 +1,14 @@ SeedVersions | @blwat/utils - v0.1.0-alpha.3

    Class SeedVersions

    A static class for accessing different seed versions. Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    Methods

    Accessors

    Methods

    Methods

    • Parameters

      • index: number

        The index of the seed version to retrieve. Must be a valid SeedVersions index.

      Returns SeedVersion

      • The seed version with the given index.
      • @@ -17,7 +17,7 @@
      • If the index is not a valid seed version index.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html index 0d3f662..571b86a 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html @@ -1,7 +1,7 @@ SeededRandomNumberGenerator | @blwat/utils - v0.1.0-alpha.3

    Class SeededRandomNumberGenerator

    Deterministic seeded pseudorandom number generator. This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

    0.1.0

    -
    Index

    Constructors

    Index

    Constructors

    Methods

    Constructors

    • Parameters

      • state: [number, number, number, number]

        Initial 128-bit state. Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

        @@ -9,10 +9,10 @@

        If each element of state is not a 32-bit unsigned integer.

        If state does not have at least one element that is greater than 0.

        0.1.0

        -

    Methods

    • Returns number

        +

    Methods

    • Returns number

      • The next pseudorandom float in the range [0, 1).

      This method advances the internal 128-bit xoshiro128** state by one step. Successive calls produce an independent, uniformly distributed sequence.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html index 4d08f6b..9770a27 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html @@ -1,6 +1,6 @@ ColorStringUtility | @blwat/utils - v0.1.0-alpha.3

    Class ColorStringUtility

    Static properties and methods for validating formatted color strings.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    • get hexColorPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -
    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. +

    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -
    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. +

    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -

    Methods

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html index e70b003..593511a 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html @@ -1,6 +1,6 @@ StringUtility | @blwat/utils - v0.1.0-alpha.3

    Class StringUtility

    Static properties and methods for validating string types.

    0.1.0

    -
    Index
    Index

    Accessors

    • get singleLineLowercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line lowercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      +
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      +
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -

    Methods

    Methods

    • Is the given input a non-empty string? Non-empty strings must contain at least one non-whitespace character.

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -
    • Is the given input a single-line lowercase string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a single-line string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a single-line uppercase string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a string?

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html index abca9b8..805117c 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -1,14 +1,14 @@ DiscriminatorRegistration | @blwat/utils - v0.1.0-alpha.3

    Interface DiscriminatorRegistration

    A registration for a discriminator to the DiscriminatorRegistry.

    0.1.0

    -
    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    discriminator: string

    The discriminator value that identifies the type of a Discriminated object. This value must be unique across all registered discriminators.

    0.1.0

    -
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    +
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    Type Declaration

      • (input: unknown): boolean
      • Parameters

        • input: unknown

          The input to validate.

        Returns boolean

        • true if the input matches the type associated with the discriminator, false otherwise.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html index d3c0dbf..0440fca 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html @@ -1,8 +1,8 @@ SeedVersion | @blwat/utils - v0.1.0-alpha.3

    Interface SeedVersion

    A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

    0.1.0

    -
    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    Properties

    offsets: readonly [number, number, number, number]

    A collection of offset values for the FNV-1a hashing algorithm. Each offset value should be a 32-bit unsigned integer.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html index 8fa311a..43b5a85 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html @@ -1,3 +1,3 @@ Discriminated | @blwat/utils - v0.1.0-alpha.3

    Type Alias Discriminated

    Discriminated: Static<typeof discriminatedSchema>

    Discriminated objects can be type checked using the discriminator registry.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html index 52b4f66..c49b642 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html @@ -1,3 +1,3 @@ TypeGuard | @blwat/utils - v0.1.0-alpha.3

    Type Alias TypeGuard<T>

    TypeGuard: (input: unknown) => input is T

    A type guard function that checks if an input is of a specific Discriminated type.

    Type Parameters

    Type Declaration

      • (input: unknown): input is T
      • Parameters

        • input: unknown

        Returns input is T

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html index 2a5866a..15c0078 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html @@ -1,3 +1,3 @@ discriminatedSchema | @blwat/utils - v0.1.0-alpha.3

    Variable discriminatedSchemaConst

    discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

    TypeBox schema for validating that an object implements the Discriminated type.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    From 252ccb89124ae5d41f31300b5da4608ef3b8f07d Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 23 Jun 2026 09:54:08 -0500 Subject: [PATCH 022/122] Update case in unit test labels and descriptions. --- .../discriminator-registry.test.ts | 40 ++++++++--------- test/number/number-utility.test.ts | 6 +-- .../random-number-generator-factory.test.ts | 44 +++++++++---------- .../seeded-random/seed-versions.test.ts | 6 +-- .../seeded-random-number-generator.test.ts | 20 ++++----- test/string/color-string-utility.test.ts | 26 +++++------ test/utils/input/string-inputs.ts | 15 +++++-- 7 files changed, 83 insertions(+), 74 deletions(-) diff --git a/test/discriminator/discriminator-registry.test.ts b/test/discriminator/discriminator-registry.test.ts index 55edf81..2cfc7e8 100644 --- a/test/discriminator/discriminator-registry.test.ts +++ b/test/discriminator/discriminator-registry.test.ts @@ -65,10 +65,10 @@ describe('DiscriminatorRegistry', (): void => { expect(DiscriminatorRegistry.has(TestDiscriminators.TEST)).toBe(true); }); - describe('input validation', (): void => { + describe('Input validation', (): void => { const scenarios: Scenario[] = [ { - label: 'non-string discriminators', + label: 'Non-string discriminators', inputs: [ ...nonStringInputs ], @@ -83,7 +83,7 @@ describe('DiscriminatorRegistry', (): void => { test.each( testCases - )('%# - input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(DiscriminatorRegistry.has(testInput as string)).toBe(testExpected); }); }); @@ -95,17 +95,17 @@ describe('DiscriminatorRegistry', (): void => { }); describe('register', (): void => { - describe('Register should return a method that validates the registered Discriminated type', (): void => { + describe('register() should return a method that validates the registered Discriminated type', (): void => { const scenarios: Scenario[] = [ { - label: 'non-object inputs', + label: 'Non-object inputs', inputs: [ ...nonObjectInputs ], expected: false }, { - label: 'array inputs', + label: 'Array inputs', inputs: [ [], ['value'], @@ -114,7 +114,7 @@ describe('DiscriminatorRegistry', (): void => { expected: false }, { - label: 'object inputs without discriminator', + label: 'Object inputs without discriminator', inputs: [ {}, { property: 'value' }, @@ -123,7 +123,7 @@ describe('DiscriminatorRegistry', (): void => { expected: false }, { - label: 'object inputs with incorrect discriminator', + label: 'Object inputs with incorrect discriminator', inputs: [ { discriminator: '' }, { discriminator: 'invalid' }, @@ -136,7 +136,7 @@ describe('DiscriminatorRegistry', (): void => { expected: false }, { - label: 'object inputs with correct discriminator, but incorrect schema', + label: 'Object inputs with correct discriminator, but incorrect schema', inputs: [ { discriminator: TestDiscriminators.TEST @@ -161,7 +161,7 @@ describe('DiscriminatorRegistry', (): void => { expected: false }, { - label: 'object inputs with correct schema', + label: 'Object inputs with correct schema', inputs: [ { discriminator: TestDiscriminators.TEST, @@ -183,7 +183,7 @@ describe('DiscriminatorRegistry', (): void => { test.each( testCases - )('%# - input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(isTestObject(testInput)).toBe(testExpected); }); }); @@ -233,14 +233,14 @@ describe('DiscriminatorRegistry', (): void => { const scenarios: Scenario[] = [ { - label: 'non-object registration', + label: 'Non-object registration', inputs: [ ...nonObjectInputs ], expected: TypeError }, { - label: 'array registration', + label: 'Array registration', inputs: [ [], ['value'], @@ -249,7 +249,7 @@ describe('DiscriminatorRegistry', (): void => { expected: TypeError }, { - label: 'non-string discriminators', + label: 'Non-string discriminators', inputs: [ ...buildRegistrations([ ...nonStringInputs @@ -258,7 +258,7 @@ describe('DiscriminatorRegistry', (): void => { expected: TypeError }, { - label: 'empty string discriminators', + label: 'Empty string discriminators', inputs: [ ...buildRegistrations([ ...emptyStringInputs @@ -267,7 +267,7 @@ describe('DiscriminatorRegistry', (): void => { expected: TypeError }, { - label: 'multi-line string discriminators', + label: 'Multi-line string discriminators', inputs: [ ...buildRegistrations([ ...singleLineTrimmedFailureInputs @@ -276,7 +276,7 @@ describe('DiscriminatorRegistry', (): void => { expected: TypeError }, { - label: 'non-function validators', + label: 'Non-function validators', inputs: [ ...buildRegistrations(['test-discriminator'], [ ...nonFunctionInputs @@ -285,7 +285,7 @@ describe('DiscriminatorRegistry', (): void => { expected: TypeError }, { - label: 'duplicate discriminator registration', + label: 'Duplicate discriminator registration', inputs: [ ...buildRegistrations([TestDiscriminators.TEST], [(): boolean => false]) ], @@ -300,7 +300,7 @@ describe('DiscriminatorRegistry', (): void => { test.each( testCases - )('%# - invalid registration $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Invalid registration $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect((): TypeGuard => DiscriminatorRegistry.register(testInput as DiscriminatorRegistration)).toThrow(testExpected); }); }); @@ -308,7 +308,7 @@ describe('DiscriminatorRegistry', (): void => { }); describe('validate', (): void => { - test('validate returns false for unregistered discriminator', (): void => { + test('validate() returns false for unregistered discriminator', (): void => { const input = { discriminator: 'unregistered' }; diff --git a/test/number/number-utility.test.ts b/test/number/number-utility.test.ts index 293815a..c6cc9e3 100644 --- a/test/number/number-utility.test.ts +++ b/test/number/number-utility.test.ts @@ -38,12 +38,12 @@ describe('NumberUtility', (): void => { describe('isFiniteNumber', (): void => { const scenarios: Scenario[] = [ { - label: 'non-number inputs', + label: 'Non-number inputs', inputs: [...nonNumberInputs], expected: false }, { - label: 'number inputs', + label: 'Number inputs', inputs: [ ...positiveNumberInputs, ...negativeNumberInputs, @@ -73,7 +73,7 @@ describe('NumberUtility', (): void => { test.each( testCases - )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(NumberUtility.isFiniteNumber(testInput)).toBe(testExpected); }); }); diff --git a/test/random/seeded-random/random-number-generator-factory.test.ts b/test/random/seeded-random/random-number-generator-factory.test.ts index d6eb99d..1870d67 100644 --- a/test/random/seeded-random/random-number-generator-factory.test.ts +++ b/test/random/seeded-random/random-number-generator-factory.test.ts @@ -88,7 +88,7 @@ describe('RandomNumberGeneratorFactory', (): void => { }); describe('build', (): void => { - describe('build with valid inputs', (): void => { + describe('build() with valid inputs', (): void => { test.each( scenarios )('%# - $label', @@ -102,8 +102,8 @@ describe('RandomNumberGeneratorFactory', (): void => { ); }); - describe('sequence distinctness contracts', (): void => { - test('changing seed changes sequence', (): void => { + describe('Sequence distinctness contracts', (): void => { + test('Changing seed changes sequence', (): void => { const rngA: SeededRandomNumberGenerator = callBuild(asciiSeed); const rngB: SeededRandomNumberGenerator = callBuild(alternateAsciiSeed); const a: number[] = buildActualSequence(rngA, sequenceLength); @@ -111,7 +111,7 @@ describe('RandomNumberGeneratorFactory', (): void => { expect(a).not.toEqual(b); }); - test('changing namespace changes sequence', (): void => { + test('Changing namespace changes sequence', (): void => { const rngA: SeededRandomNumberGenerator = callBuild(asciiSeed, asciiNamespace); const rngB: SeededRandomNumberGenerator = callBuild(asciiSeed, alternateAsciiNamespace); const a: number[] = buildActualSequence(rngA, sequenceLength); @@ -119,7 +119,7 @@ describe('RandomNumberGeneratorFactory', (): void => { expect(a).not.toEqual(b); }); - test('changing valid version changes sequence for same seed and namespace', (): void => { + test('Changing valid version changes sequence for same seed and namespace', (): void => { const rngA: SeededRandomNumberGenerator = callBuild(asciiSeed, asciiNamespace, 0); const rngB: SeededRandomNumberGenerator = callBuild(asciiSeed, asciiNamespace, 1); const v0: number[] = buildActualSequence(rngA, sequenceLength); @@ -128,31 +128,31 @@ describe('RandomNumberGeneratorFactory', (): void => { }); }); - describe('input validation', (): void => { - describe('invalid seed inputs', (): void => { + describe('Input validation', (): void => { + describe('Invalid seed inputs', (): void => { test.each( nonStringInputs - )('%# - invalid seed %o should throw a TypeError', (seed: unknown): void => { + )('%# - Invalid seed %o should throw a TypeError', (seed: unknown): void => { expect((): void => { RandomNumberGeneratorFactory.build(seed as string); }).toThrow(TypeError); }); }); - describe('invalid namespace inputs', (): void => { + describe('Invalid namespace inputs', (): void => { test.each( nonStringInputs.filter((s: unknown): boolean => s !== undefined) - )('%# - invalid namespace %o should throw a TypeError', (namespace: unknown): void => { + )('%# - Invalid namespace %o should throw a TypeError', (namespace: unknown): void => { expect((): void => { RandomNumberGeneratorFactory.build('', namespace as string); }).toThrow(TypeError); }); }); - describe('invalid version inputs', (): void => { + describe('Invalid version inputs', (): void => { const testScenarios: Scenario[] = [ { - label: 'non-number, non-finite, and float versions', + label: 'Non-number, non-finite, and float versions', inputs: [ ...nonNumberInputs.filter((s: unknown): boolean => s !== undefined), ...nonFiniteNumberInputs, @@ -161,7 +161,7 @@ describe('RandomNumberGeneratorFactory', (): void => { expected: TypeError }, { - label: 'out-of-range integer versions', + label: 'Out-of-range integer versions', inputs: [ ...negativeIntegerInputs, SeedVersions.size, @@ -192,7 +192,7 @@ describe('RandomNumberGeneratorFactory', (): void => { }); describe('asyncBuild', (): void => { - describe('asyncBuild with valid inputs', (): void => { + describe('asyncBuild() with valid inputs', (): void => { test.each( asyncScenarios )('%# - $label', @@ -206,8 +206,8 @@ describe('RandomNumberGeneratorFactory', (): void => { ); }); - describe('sequence distinctness contracts', (): void => { - test('changing seed changes sequence', async (): Promise => { + describe('Sequence distinctness contracts', (): void => { + test('Changing seed changes sequence', async (): Promise => { const rngA: SeededRandomNumberGenerator = await callAsyncBuild(asciiSeed); const rngB: SeededRandomNumberGenerator = await callAsyncBuild(alternateAsciiSeed); const a: number[] = buildActualSequence(rngA, sequenceLength); @@ -215,7 +215,7 @@ describe('RandomNumberGeneratorFactory', (): void => { expect(a).not.toEqual(b); }); - test('changing namespace changes sequence', async (): Promise => { + test('Changing namespace changes sequence', async (): Promise => { const rngA: SeededRandomNumberGenerator = await callAsyncBuild(asciiSeed, asciiNamespace); const rngB: SeededRandomNumberGenerator = await callAsyncBuild(asciiSeed, alternateAsciiNamespace); const a: number[] = buildActualSequence(rngA, sequenceLength); @@ -224,19 +224,19 @@ describe('RandomNumberGeneratorFactory', (): void => { }); }); - describe('input validation', (): void => { - describe('invalid seed inputs', (): void => { + describe('Input validation', (): void => { + describe('Invalid seed inputs', (): void => { test.each( nonStringInputs - )('%# - invalid seed %o should throw a TypeError', async (seed: unknown): Promise => { + )('%# - Invalid seed %o should throw a TypeError', async (seed: unknown): Promise => { await expect(RandomNumberGeneratorFactory.asyncBuild(seed as string)).rejects.toThrow(TypeError); }); }); - describe('invalid namespace inputs', (): void => { + describe('Invalid namespace inputs', (): void => { test.each( nonStringInputs.filter((s: unknown): boolean => s !== undefined) - )('%# - invalid namespace %o should throw a TypeError', async (namespace: unknown): Promise => { + )('%# - Invalid namespace %o should throw a TypeError', async (namespace: unknown): Promise => { await expect(RandomNumberGeneratorFactory.asyncBuild('', namespace as string)).rejects.toThrow(TypeError); }); }); diff --git a/test/random/seeded-random/seed-versions.test.ts b/test/random/seeded-random/seed-versions.test.ts index b4c5369..dafb5c7 100644 --- a/test/random/seeded-random/seed-versions.test.ts +++ b/test/random/seeded-random/seed-versions.test.ts @@ -62,7 +62,7 @@ describe('SeedVersions', () => { }); describe('size', () => { - test(`SeedVersions.size should be ${expectedSeedVersions.length}`, () => { + test(`Size should be ${expectedSeedVersions.length}`, () => { expect(SeedVersions.size).toBe(expectedSeedVersions.length); }); }); @@ -99,7 +99,7 @@ describe('SeedVersions', () => { test.each( testCases - )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(SeedVersions.isValidIndex(testInput as number)).toBe(testExpected); }); }); @@ -112,7 +112,7 @@ describe('SeedVersions', () => { expect(SeedVersions.getVersion(index)).toEqual(expectedSeedVersions[index]); }); - describe('input validation', (): void => { + describe('Input validation', (): void => { test.each([ ...nonNumberInputs, expectedSeedVersions.length, diff --git a/test/random/seeded-random/seeded-random-number-generator.test.ts b/test/random/seeded-random/seeded-random-number-generator.test.ts index d7b6d80..6946778 100644 --- a/test/random/seeded-random/seeded-random-number-generator.test.ts +++ b/test/random/seeded-random/seeded-random-number-generator.test.ts @@ -27,17 +27,17 @@ import { Scenario, TestCase, buildTestCases } from '../../utils/test-case/test-c describe('SeededRandomNumberGenerator', () => { describe('new SeededRandomNumberGenerator()', () => { - describe('input validation', (): void => { + describe('Input validation', (): void => { const scenarios: Scenario[] = [ { - label: 'non-array inputs', + label: 'Non-array inputs', inputs: [ ...nonArrayInputs ], expected: TypeError }, { - label: 'array inputs with incorrect length', + label: 'Array inputs with incorrect length', inputs: [ [], [1], @@ -48,7 +48,7 @@ describe('SeededRandomNumberGenerator', () => { expected: TypeError }, { - label: 'array inputs with non-integer elements', + label: 'Array inputs with non-integer elements', inputs: [ [1.5, 0, 0, 0], [0, 1.5, 0, 0], @@ -58,7 +58,7 @@ describe('SeededRandomNumberGenerator', () => { expected: RangeError }, { - label: 'array inputs greater than 0xFFFFFFFF (max 32-bit unsigned integer)', + label: 'Array inputs greater than 0xFFFFFFFF (max 32-bit unsigned integer)', inputs: [ [(0xFFFFFFFF + 1), 0, 0, 0], [0, (0xFFFFFFFF + 1), 0, 0], @@ -68,7 +68,7 @@ describe('SeededRandomNumberGenerator', () => { expected: RangeError }, { - label: 'array inputs with negative elements', + label: 'Array inputs with negative elements', inputs: [ [-1, 0, 0, 0], [0, -1, 0, 0], @@ -78,7 +78,7 @@ describe('SeededRandomNumberGenerator', () => { expected: RangeError }, { - label: 'array input with zero state (all elements are 0)', + label: 'Array input with zero state (all elements are 0)', inputs: [[0, 0, 0, 0]], expected: RangeError } @@ -91,19 +91,19 @@ describe('SeededRandomNumberGenerator', () => { test.each( testCases - )('%# - invalid state $input should throw an error $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Invalid state $input should throw an error $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect((): SeededRandomNumberGenerator => new SeededRandomNumberGenerator(testInput as [number, number, number, number])).toThrow(testExpected); }); }); }); - describe('valid state', (): void => { + describe('Valid state', (): void => { test.each([ { state: [1, 0, 0, 0] }, { state: [0, 1, 0, 0] }, { state: [0, 0, 1, 0] }, { state: [0, 0, 0, 1] } - ])('%# - state %o should construct successfully', ({ state }: { state: number[]; }): void => { + ])('%# - State %o should construct successfully', ({ state }: { state: number[]; }): void => { expect((): SeededRandomNumberGenerator => new SeededRandomNumberGenerator(state as [number, number, number, number])).not.toThrow(); }); }); diff --git a/test/string/color-string-utility.test.ts b/test/string/color-string-utility.test.ts index bd9411a..c7e8234 100644 --- a/test/string/color-string-utility.test.ts +++ b/test/string/color-string-utility.test.ts @@ -50,21 +50,21 @@ describe('ColorStringUtility', (): void => { describe('isHexColor', (): void => { const scenarios: Scenario[] = [ { - label: 'non-string inputs', + label: 'Non-string inputs', inputs: [ ...nonStringInputs ], expected: false }, { - label: 'empty string inputs', + label: 'Empty string inputs', inputs: [ ...emptyStringInputs ], expected: false }, { - label: 'hex color string failure inputs', + label: 'Hex color string failure inputs', inputs: [ ...hexColorFailureInputs, ...hexColorMixedCaseInputs @@ -72,7 +72,7 @@ describe('ColorStringUtility', (): void => { expected: false }, { - label: 'hex color inputs', + label: 'Hex color inputs', inputs: [ ...hexColorInputs ], @@ -87,7 +87,7 @@ describe('ColorStringUtility', (): void => { test.each( testCases - )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(ColorStringUtility.isHexColor(testInput)).toBe(testExpected); }); }); @@ -96,21 +96,21 @@ describe('ColorStringUtility', (): void => { describe('isHexColorRGB', (): void => { const scenarios: Scenario[] = [ { - label: 'non-string inputs', + label: 'Non-string inputs', inputs: [ ...nonStringInputs ], expected: false }, { - label: 'empty string inputs', + label: 'Empty string inputs', inputs: [ ...emptyStringInputs ], expected: false }, { - label: 'hex color string failure inputs', + label: 'Hex color string failure inputs', inputs: [ ...hexColorFailureInputs, ...hexColorMixedCaseInputs @@ -144,7 +144,7 @@ describe('ColorStringUtility', (): void => { test.each( testCases - )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(ColorStringUtility.isHexColorRGB(testInput)).toBe(testExpected); }); }); @@ -153,21 +153,21 @@ describe('ColorStringUtility', (): void => { describe('isHexColorRGBA', (): void => { const scenarios: Scenario[] = [ { - label: 'non-string inputs', + label: 'Non-string inputs', inputs: [ ...nonStringInputs ], expected: false }, { - label: 'empty string inputs', + label: 'Empty string inputs', inputs: [ ...emptyStringInputs ], expected: false }, { - label: 'hex color string failure inputs', + label: 'Hex color string failure inputs', inputs: [ ...hexColorFailureInputs, ...hexColorMixedCaseInputs @@ -201,7 +201,7 @@ describe('ColorStringUtility', (): void => { test.each( testCases - )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(ColorStringUtility.isHexColorRGBA(testInput)).toBe(testExpected); }); }); diff --git a/test/utils/input/string-inputs.ts b/test/utils/input/string-inputs.ts index a001158..ddb319e 100644 --- a/test/utils/input/string-inputs.ts +++ b/test/utils/input/string-inputs.ts @@ -133,7 +133,10 @@ export const singleLineTrimmedFailureInputsLowercase: string[] = [ 'internal\n spaces\n example', 'internal\t spaces\t example', 'internal spaces example', - 'internal spaces example' + 'internal spaces example', + '\nëë', + 'ë\në', + 'ëë\n' ]; export const singleLineTrimmedFailureInputsUppercase: string[] = [ @@ -156,7 +159,10 @@ export const singleLineTrimmedFailureInputsUppercase: string[] = [ 'INTERNAL\n SPACES\n EXAMPLE', 'INTERNAL\t SPACES\t EXAMPLE', 'INTERNAL SPACES EXAMPLE', - 'INTERNAL SPACES EXAMPLE' + 'INTERNAL SPACES EXAMPLE', + '\nËË', + 'Ë\nË', + 'ËË\n' ]; export const singleLineTrimmedFailureInputsMixedCase: string[] = [ @@ -179,7 +185,10 @@ export const singleLineTrimmedFailureInputsMixedCase: string[] = [ 'Internal\n Spaces\n Example', 'Internal\t Spaces\t Example', 'Internal Spaces Example', - 'Internal Spaces Example' + 'Internal Spaces Example', + '\nëË', + 'ë\nË', + 'ëË\n' ]; export const singleLineTrimmedInputs: string[] = [ From df5c8128889ad5b3a5b03f32b243cf931060ce46 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 23 Jun 2026 09:54:21 -0500 Subject: [PATCH 023/122] Implement full coverage unit tests for string-utility.test.ts --- test/string/string-utility.test.ts | 143 ++++++++++++++++++++++++++++- 1 file changed, 138 insertions(+), 5 deletions(-) diff --git a/test/string/string-utility.test.ts b/test/string/string-utility.test.ts index 83c70b7..e22d70a 100644 --- a/test/string/string-utility.test.ts +++ b/test/string/string-utility.test.ts @@ -30,7 +30,11 @@ import { singleLineTrimmedFailureInputsLowercase, singleLineTrimmedInputsLowercase, singleLineTrimmedInputsMixedCase, - singleLineTrimmedInputsUppercase + singleLineTrimmedInputsUppercase, + singleLineTrimmedFailureInputsUppercase, + singleLineTrimmedFailureInputsMixedCase, + singleLineTrimmedFailureInputs, + singleLineTrimmedInputs } from '../utils/input/string-inputs'; import { Scenario, TestCase, buildTestCases } from '../utils/test-case/test-case'; @@ -66,12 +70,44 @@ describe('StringUtility', (): void => { test.each( testCases - )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(StringUtility.isString(testInput)).toBe(testExpected); }); }); }); + describe('isNonEmptyString', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-string inputs', + inputs: [...nonStringInputs], + expected: false + }, + { + label: 'Empty string inputs', + inputs: [...emptyStringInputs], + expected: false + }, + { + label: 'Non-empty string inputs', + inputs: [...nonEmptyStringInputs], + expected: true + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(StringUtility.isNonEmptyString(testInput)).toBe(testExpected); + }); + }); + }); + describe('isSingleLineLowercaseTrimmedString', (): void => { const scenarios: Scenario[] = [ { @@ -88,13 +124,17 @@ describe('StringUtility', (): void => { label: 'Incorrect case inputs', inputs: [ ...singleLineTrimmedInputsUppercase, - ...singleLineTrimmedInputsMixedCase + ...singleLineTrimmedInputsMixedCase, + ...singleLineTrimmedFailureInputsUppercase, + ...singleLineTrimmedFailureInputsMixedCase ], expected: false }, { label: 'Whitespace failure inputs', - inputs: [...singleLineTrimmedFailureInputsLowercase], + inputs: [ + ...singleLineTrimmedFailureInputsLowercase + ], expected: false }, { @@ -116,9 +156,102 @@ describe('StringUtility', (): void => { test.each( testCases - )('%# - $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(StringUtility.isSingleLineLowercaseTrimmedString(testInput)).toBe(testExpected); }); }); }); + + describe('isSingleLineUppercaseTrimmedString', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-string inputs', + inputs: [...nonStringInputs], + expected: false + }, + { + label: 'Empty string inputs', + inputs: [...emptyStringInputs], + expected: false + }, + { + label: 'Incorrect case inputs', + inputs: [ + ...singleLineTrimmedInputsLowercase, + ...singleLineTrimmedInputsMixedCase, + ...singleLineTrimmedFailureInputsLowercase, + ...singleLineTrimmedFailureInputsMixedCase + ], + expected: false + }, + { + label: 'Whitespace failure inputs', + inputs: [ + ...singleLineTrimmedFailureInputsUppercase + ], + expected: false + }, + { + label: 'Single line uppercase trimmed inputs', + inputs: [...singleLineTrimmedInputsUppercase], + expected: true + }, + { + label: 'Number and symbol trimmed inputs', + inputs: [...singleLineTrimmedInputsNumsAndSymbols], + expected: true + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(StringUtility.isSingleLineUppercaseTrimmedString(testInput)).toBe(testExpected); + }); + }); + }); + + describe('isSingleLineTrimmedString', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-string inputs', + inputs: [...nonStringInputs], + expected: false + }, + { + label: 'Empty string inputs', + inputs: [...emptyStringInputs], + expected: false + }, + { + label: 'Whitespace failure inputs', + inputs: [ + ...singleLineTrimmedFailureInputs + ], + expected: false + }, + { + label: 'Single line trimmed inputs', + inputs: [...singleLineTrimmedInputs], + expected: true + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(StringUtility.isSingleLineTrimmedString(testInput)).toBe(testExpected); + }); + }); + }); }); From 92483396dae3e0d4fabba59e491972c0f7dcffd1 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 23 Jun 2026 11:44:10 -0500 Subject: [PATCH 024/122] Update package.json keywords --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index b92b5e1..d77b407 100644 --- a/package.json +++ b/package.json @@ -78,6 +78,9 @@ "discriminator", "number", "string", + "color", + "hex", + "hex-color", "random", "seeded-random", "prng", From 0ef82d4052a5c367b1926e09007c66bbc30e686f Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 23 Jun 2026 11:44:31 -0500 Subject: [PATCH 025/122] Update review instructions in CLAUDE.md and copilot-instructions.md --- .github/copilot-instructions.md | 62 +++++++++++++++++++++++++++++++++ CLAUDE.md | 12 +++++++ 2 files changed, 74 insertions(+) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index bffddaf..61a1848 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -38,6 +38,68 @@ The package is currently in an alpha release line and exports grouped utility mo - Build with `npm run build`. - Run tests with `npm run test`. +## Pre-Merge and Release Review + +Complete the following steps before merging a branch to a release branch or to `main`. + +### 1. Validation + +Run the full validation suite and confirm everything passes cleanly: + +- `npm ci` — install dependencies from the lockfile +- `npm run lint:all` — both ESLint configurations report no errors +- `npm run build` — build completes with no errors +- `npm test` — all Vitest tests pass + +### 2. Portfolio Skills Page (`docs/portfolio-skills.md`) + +Review `docs/portfolio-skills.md` against the current repository state. If anything changed: + +- Update any section where capabilities, tooling, or the skills inventory changed +- Bump `modified_date` to today; do not change the original `date` +- Evidence links must always point to the `main` branch + +Refer to the "Portfolio Page Generation and Maintenance" section for the full review checklist. + +### 3. Instruction File Sync + +Verify that `CLAUDE.md` and `.github/copilot-instructions.md` are consistent with each other and reflect the current project state: + +- Guidance shared between the two files is mirrored +- The Development Status section accurately lists all modules exported by the package +- Any new tooling, conventions, or workflows introduced on the branch are documented + +### 4. `package.json` Keywords + +Review the `keywords` array in `package.json`: + +- Keywords should cover all major utility domains and notable features exported by the package +- Add new keywords when a new utility domain or notable feature is introduced +- Remove keywords for capabilities that no longer exist + +### 5. GitHub Repository Topics + +Verify that the topics on the GitHub repository ([blwatkins/typescript-utils](https://github.com/blwatkins/typescript-utils)) reflect the current capabilities. Topics should align with `package.json` keywords where appropriate. Request the current topics to be updated, if necessary. Provide any topic change suggestions to the project maintainers and any accepted changes will be updated manually. + +### 6. Branch Changes Code Review + +Review all source changes for correctness and convention compliance: + +- New source files follow the static class pattern (private constructor, `@throws` on constructor, public static members only) +- All public/exported members have complete JSDoc per the documentation comment conventions in this file +- Copyright year headers are present and accurate (see "File Headers" section) +- `README.md` and `docs/index.md` are in sync for any shared content changes +- Test coverage is complete and meaningful for all new or changed public API surface + +### 7. Release Readiness (for merges to `main`) + +When preparing a release merge to `main`: + +- Confirm the version in `package.json` is bumped appropriately +- Ensure release documentation under `docs/releases/` covers the new version +- Verify `typedoc.json` entry points include any new module-level index files +- Confirm the npm publish workflow (`npm-publish.yml`) is configured correctly for the release + ## npm Scripts - `npm run lint:js` - lint repository files with `eslint.config.js.mjs` diff --git a/CLAUDE.md b/CLAUDE.md index e426976..b5c05a7 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -38,3 +38,15 @@ Note that the `docs/` Jekyll site separately includes committed sample documenta described in the "Portfolio Page Generation and Maintenance" section of `.github/copilot-instructions.md`. - Release documentation under `docs/releases/` is maintained manually. + +## Pre-Merge and Release Review + +Before merging a branch, complete these review steps (full details in the "Pre-Merge and Release Review" section of [`.github/copilot-instructions.md`](./.github/copilot-instructions.md)): + +1. **Validation** — `npm ci`, `npm run lint:all`, `npm run build`, `npm test` all pass +2. **Portfolio skills page** — review `docs/portfolio-skills.md` for accuracy; update `modified_date` if content changes +3. **Instruction file sync** — `CLAUDE.md` and `copilot-instructions.md` are consistent and current +4. **`package.json` keywords** — reflect current utility domains and features +5. **GitHub repository topics** — align with `package.json` keywords +6. **Branch code review** — static class conventions, JSDoc completeness, copyright headers, README/docs sync, test coverage +7. **Release readiness** (for merges to `main`) — version bump, release docs, TypeDoc entry points, publish workflow From 400ec1ffd9c257c052708ec8c301f7adad8d25db Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 23 Jun 2026 11:49:14 -0500 Subject: [PATCH 026/122] Update CLAUDE.md and copilot-instructions.md --- .github/copilot-instructions.md | 13 ++++++++++++- CLAUDE.md | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 61a1848..c26f9d7 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -83,7 +83,9 @@ Verify that the topics on the GitHub repository ([blwatkins/typescript-utils](ht ### 6. Branch Changes Code Review -Review all source changes for correctness and convention compliance: +Review all source changes for convention compliance and code quality. + +#### Convention Compliance - New source files follow the static class pattern (private constructor, `@throws` on constructor, public static members only) - All public/exported members have complete JSDoc per the documentation comment conventions in this file @@ -91,6 +93,15 @@ Review all source changes for correctness and convention compliance: - `README.md` and `docs/index.md` are in sync for any shared content changes - Test coverage is complete and meaningful for all new or changed public API surface +#### Code Quality + +- **Correctness** — implementations behave exactly as documented; edge cases are handled; patterns (e.g., regex) match precisely what they claim to match +- **API consistency** — new methods and classes follow the naming conventions and structural patterns of existing ones; the public surface is intuitive alongside what is already exported +- **Efficiency** — utility functions avoid unnecessary computation (e.g., no redundant regex compilation, no unnecessary copies or iterations) +- **Backward compatibility** — no unintentional breaking changes to the published API; any intentional breaking changes are reflected in the version bump +- **Reuse and DRY** — new utilities delegate to existing ones where appropriate rather than duplicating logic +- **Runtime safety** — see the "JavaScript Consumer Safety" section for the requirement to retain runtime type guards for JavaScript consumers + ### 7. Release Readiness (for merges to `main`) When preparing a release merge to `main`: diff --git a/CLAUDE.md b/CLAUDE.md index b5c05a7..dd3a7db 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,5 +48,5 @@ Before merging a branch, complete these review steps (full details in the "Pre-M 3. **Instruction file sync** — `CLAUDE.md` and `copilot-instructions.md` are consistent and current 4. **`package.json` keywords** — reflect current utility domains and features 5. **GitHub repository topics** — align with `package.json` keywords -6. **Branch code review** — static class conventions, JSDoc completeness, copyright headers, README/docs sync, test coverage +6. **Branch code review** — convention compliance (static class pattern, JSDoc completeness, copyright headers, README/docs sync, test coverage) and code quality (correctness, API consistency, efficiency, backward compatibility, reuse/DRY, runtime safety) 7. **Release readiness** (for merges to `main`) — version bump, release docs, TypeDoc entry points, publish workflow From 637af1b8616cb7432eaee35e46a8aba783129e98 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 23 Jun 2026 22:48:41 -0500 Subject: [PATCH 027/122] Add initial random.ts. --- src/random/index.ts | 2 + src/random/random.ts | 193 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 src/random/random.ts diff --git a/src/random/index.ts b/src/random/index.ts index 97d0f7e..0278922 100644 --- a/src/random/index.ts +++ b/src/random/index.ts @@ -19,3 +19,5 @@ */ export * from './seeded-random'; + +export * from './random'; diff --git a/src/random/random.ts b/src/random/random.ts new file mode 100644 index 0000000..99cb33a --- /dev/null +++ b/src/random/random.ts @@ -0,0 +1,193 @@ +/* + * Copyright (c) 2024-2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { NumberUtility } from '../number'; + +/** + * Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays. + * + * @since 0.1.0 + */ +export class Random { + /** + * The primary function used to generate random numbers. + * By default, this is set to `Math.random`, but it can be overridden for testing or seeded pseudorandom number generation. + * + * @default Math.random + * + * @type {() => number} + * @private + */ + static #rand: () => number = Math.random; + + /** + * @throws {Error} - Random is a static class and cannot be instantiated. + * + * @private + */ + private constructor() { + throw new Error('Random is a static class and cannot be instantiated.'); + } + + /** + * Set the primary function used to generate random numbers. + * + * @param {() => number} rand - A function that returns a random number in the range [0, 1) (zero inclusive, one exclusive). + * + * @throws {TypeError} - If the given rand is not a function. + * + * @public + * @since 0.1.0 + */ + public static set rand(rand: () => number) { + if (typeof rand !== 'function') { + throw new TypeError('rand must be a function'); + } + + Random.#rand = rand; + } + + /** + * @returns {number} A random number in the range [0, 1) (zero inclusive, one exclusive). + * + * @public + * @since 0.1.0 + */ + public static random(): number { + return Random.#rand(); + } + + /** + * @param {number} min - The minimum value (inclusive). + * @param {number} max - The maximum value (exclusive). + * + * @returns {number} A random floating-point number in the range [min, max) (min inclusive, max exclusive). + * + * @public + * @since 0.1.0 + */ + public static randomFloat(min: number, max: number): number { + Random.#validateRange(min, max); + return (Random.random() * (max - min)) + min; + } + + /** + * @param {number} min - The minimum value (inclusive). + * @param {number} max - The maximum value (exclusive). + * + * @returns {number} A random integer in the range [min, max) (min inclusive, max exclusive). + * + * @public + * @since 0.1.0 + */ + public static randomInt(min: number, max: number): number { + Random.#validateRange(min, max); + return Math.floor(Random.randomFloat(min, max)); + } + + /** + * @param {number} chanceOfTrue - The probability of returning true (between 0 and 1). + * + * @returns {boolean} A random boolean value. + * + * @public + * @since 0.1.0 + */ + public static randomBoolean(chanceOfTrue: number = 0.5): boolean { + Random.#validateChanceOfTrue(chanceOfTrue); + return Random.random() < chanceOfTrue; + } + + /** + * @param {Type[]} elements - An array of elements to choose from. + * + * @returns {Type} A random element from the array. + * + * @public + * @since 0.1.0 + */ + public static randomElement(elements: Type[]): Type { + Random.#validateElements(elements); + return elements[Random.randomInt(0, elements.length)]; + } + + /** + * Validate min and max values for random number generation. + * + * @see {@link NumberUtility.isFiniteNumber} + * + * @param {unknown} min - Minimum value to validate. Should be a finite number less than or equal to the given max. + * @param {unknown} max - Maximum value to validate. Should be a finite number greater than or equal to the given min. + * + * @throws {TypeError} - When the given min is not a finite number. + * @throws {TypeError} - When the given max is not a finite number. + * @throws {RangeError} - When the given min is not less than or equal to the given max. + * + * @private + */ + static #validateRange(min: unknown, max: unknown): void { + if (!NumberUtility.isFiniteNumber(min)) { + throw new TypeError('min must be a finite number'); + } + + if (!NumberUtility.isFiniteNumber(max)) { + throw new TypeError('max must be a finite number'); + } + + if (min > max) { + throw new RangeError(`min (${min}) must be less than max (${max})`); + } + } + + /** + * Validate chanceOfTrue input for random boolean generation. + * + * @param {unknown} chanceOfTrue - Chance of returning true. Should be a finite number between 0 and 1 (inclusive). + * + * @throws {TypeError} - When the given chanceOfTrue is not a finite number. + * @throws {RangeError} - When the given chanceOfTrue is not between 0 and 1 (inclusive). + * + * @private + */ + static #validateChanceOfTrue(chanceOfTrue: unknown): void { + if (!NumberUtility.isFiniteNumber(chanceOfTrue)) { + throw new TypeError('chanceOfTrue must be a finite number'); + } + + if (chanceOfTrue < 0 || chanceOfTrue > 1) { + throw new RangeError(`chance (${chanceOfTrue}) must be between 0 and 1`); + } + } + + /** + * Validate elements input for random element selection. + * + * @param {unknown} elements - Elements to select from. Should be a non-empty array. + * + * @throws {TypeError} - When the given elements is not a non-empty array. + * + * @private + */ + static #validateElements(elements: unknown): void { + if (!elements || !Array.isArray(elements) || elements.length === 0) { + throw new TypeError('elements must be a non-empty array'); + } + } +} From 6ce26be4658bdfef52415135d61a25c8cd6b5bec Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 23 Jun 2026 22:49:00 -0500 Subject: [PATCH 028/122] Update random-number-generator-factory.ts TSDocs --- .../random-number-generator-factory.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/random/seeded-random/random-number-generator-factory.ts b/src/random/seeded-random/random-number-generator-factory.ts index 9000403..ce837ba 100644 --- a/src/random/seeded-random/random-number-generator-factory.ts +++ b/src/random/seeded-random/random-number-generator-factory.ts @@ -110,11 +110,16 @@ export class RandomNumberGeneratorFactory { } /** + * Validate seed, namespace, and version inputs. + * * @see {@link SeedVersions.isValidIndex} * - * @param {string} seed - seed to validate - * @param {string|undefined} namespace - namespace to validate - * @param {number|undefined} version - version to validate + * @param {unknown} seed - Seed to validate. + * Should be a string. + * @param {unknown} namespace - Namespace to validate. + * Should be undefined or a string. + * @param {unknown} version - Version to validate. + * Should be undefined or an integer that is also a valid {@link SeedVersions} index. * * @throws {TypeError} - When the given seed is not a string. * @throws {TypeError} - When the given namespace is not a string. @@ -123,7 +128,7 @@ export class RandomNumberGeneratorFactory { * * @private */ - static #validateBuildInputs(seed: string, namespace?: string, version?: number): void { + static #validateBuildInputs(seed: unknown, namespace?: unknown, version?: unknown): void { if (!StringUtility.isString(seed)) { throw new TypeError('Seed must be a string.'); } From 7193fab32e7fa8c49f5c8c7ce18ec341fb768187 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 23 Jun 2026 22:57:52 -0500 Subject: [PATCH 029/122] Update copilot-instructions.md and CLAUDE.md --- .github/copilot-instructions.md | 5 +++++ CLAUDE.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 4f921be..f76df85 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -102,6 +102,11 @@ Review all source changes for convention compliance and code quality. - **Reuse and DRY** — new utilities delegate to existing ones where appropriate rather than duplicating logic - **Runtime safety** — see the "JavaScript Consumer Safety" section for the requirement to retain runtime type guards for JavaScript consumers +#### Consistency and Pattern Observation + +- **Cross-source consistency** — Compare all changed code, inline comments, and documentation (JSDoc, README, `docs/`) against each other and against implicit patterns visible in the rest of the codebase. Flag any deviation from an established pattern even if that pattern has not been explicitly documented in this file (e.g., consistent phrasing in JSDoc summaries, a structural idiom repeated across utility classes, a naming convention used throughout tests). +- **Implicit pattern detection** — When a consistent pattern is observed in the codebase that is not yet captured in this file, call it out explicitly and ask the maintainer whether it should be documented in the appropriate section of `.github/copilot-instructions.md`. + ### 7. Release Readiness (for merges to `main`) When preparing a release merge to `main`: diff --git a/CLAUDE.md b/CLAUDE.md index dd3a7db..8a2f3b5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -48,5 +48,5 @@ Before merging a branch, complete these review steps (full details in the "Pre-M 3. **Instruction file sync** — `CLAUDE.md` and `copilot-instructions.md` are consistent and current 4. **`package.json` keywords** — reflect current utility domains and features 5. **GitHub repository topics** — align with `package.json` keywords -6. **Branch code review** — convention compliance (static class pattern, JSDoc completeness, copyright headers, README/docs sync, test coverage) and code quality (correctness, API consistency, efficiency, backward compatibility, reuse/DRY, runtime safety) +6. **Branch code review** — convention compliance (static class pattern, JSDoc completeness, copyright headers, README/docs sync, test coverage), code quality (correctness, API consistency, efficiency, backward compatibility, reuse/DRY, runtime safety), and consistency (cross-source consistency across code/comments/docs, implicit pattern detection with maintainer notification) 7. **Release readiness** (for merges to `main`) — version bump, release docs, TypeDoc entry points, publish workflow From 7869c4e41a45e88ee8de49f8b89a8fa341b683a3 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 09:44:51 -0500 Subject: [PATCH 030/122] Add initial weighted-element.ts functionality. --- src/discriminator/discriminators.ts | 23 +++++ src/discriminator/index.ts | 1 + src/random/random.ts | 5 ++ src/random/weighted-element.ts | 129 ++++++++++++++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 src/discriminator/discriminators.ts create mode 100644 src/random/weighted-element.ts diff --git a/src/discriminator/discriminators.ts b/src/discriminator/discriminators.ts new file mode 100644 index 0000000..6ce3508 --- /dev/null +++ b/src/discriminator/discriminators.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +export enum Discriminators { + WeightedElement = '@blwat/utils:WeightedElement' +} diff --git a/src/discriminator/index.ts b/src/discriminator/index.ts index bbbed3c..0936d44 100644 --- a/src/discriminator/index.ts +++ b/src/discriminator/index.ts @@ -20,3 +20,4 @@ export * from './discriminated'; export * from './discriminator-registry'; +export * from './discriminators'; diff --git a/src/random/random.ts b/src/random/random.ts index 99cb33a..84eef28 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -19,6 +19,7 @@ */ import { NumberUtility } from '../number'; +import { WeightedList } from './weighted-element'; /** * Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays. @@ -128,6 +129,10 @@ export class Random { return elements[Random.randomInt(0, elements.length)]; } + public static randomWeightedElement(elements: WeightedList): Type { + return elements[0].value; + } + /** * Validate min and max values for random number generation. * diff --git a/src/random/weighted-element.ts b/src/random/weighted-element.ts new file mode 100644 index 0000000..de10259 --- /dev/null +++ b/src/random/weighted-element.ts @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2024-2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { Type } from 'typebox'; +import Value from 'typebox/schema'; + +import {Discriminators, discriminatedSchema, DiscriminatorRegistry, TypeGuard} from '../discriminator'; + +export const weightedElementSchema = Type.Generic( + [Type.Parameter('T')], + Type.Intersect([ + discriminatedSchema, + Type.Object( + { + value: Type.Readonly(Type.Ref('T')), + weight: Type.Readonly(Type.Number({ + minimum: 0, + maximum: 1 + })), + discriminator: Type.Literal(Discriminators.WeightedElement) + }, + { additionalProperties: false } + ) + ]) +); + +export interface WeightedElement { + readonly value: Type, + readonly weight: number, + readonly discriminator: Discriminators.WeightedElement +} + +export type WeightedList = WeightedElement[]; + +export function buildWeightedList(elements: { value: Type, weight: number }[]): WeightedList { + const outOfRangeWeights: {value: Type, weight: number}[] = elements.filter(element => element.weight < 0 || element.weight > 1); + + if (outOfRangeWeights.length > 0) { + throw new RangeError('Element weights must be between 0 and 1. Out of range weights: ' + JSON.stringify(outOfRangeWeights)); + } + + const weightSum: number = elements.reduce((sum, element) => sum + element.weight, 0); + const precisionSum = Number.parseFloat(weightSum.toFixed(4)); + + if (precisionSum !== 1) { + throw new RangeError('Sum of element weights must be 1'); + } + + return elements.map(element => { + return { + value: element.value, + weight: element.weight, + discriminator: Discriminators.WeightedElement + } + }); +} + +export const isGenericWeightedElement: TypeGuard> = DiscriminatorRegistry.register>({ + discriminator: Discriminators.WeightedElement, + validator: (input: unknown): input is WeightedElement => { + return Value.Check(Type.Call(weightedElementSchema, [Type.Unknown()]), input) + } +}); + +export function isWeightedElement(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedElement { + return isGenericWeightedElement(input) && valueTypeGuard(input.value); +} + +export class WeightedElementUtility { + public static buildWeightedElement(input: { value: Type; weight: number; }): WeightedElement { + const weightedElement = { + ...input, + discriminator: Discriminators.WeightedElement + }; + + if (!isGenericWeightedElement(weightedElement)) { + throw new TypeError('Input does not match schema requirements for weighted element value and weight'); + } + + return weightedElement; + } + + // TODO - check for weight sum + public static isGenericWeightedList(input: unknown): input is WeightedList { + if (!input) { + return false; + } + + if (!Array.isArray(input)) { + return false; + } + + return input.reduce((accumulator: boolean, element: unknown): boolean => { + return accumulator && isGenericWeightedElement(element); + }, true); + } + + // TODO - check for weight sum + public static isWeighedList(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedList { + if (!input) { + return false; + } + + if (!Array.isArray(input)) { + return false; + } + + return input.reduce((accumulator: boolean, element: unknown): boolean => { + return accumulator && isWeightedElement(element, valueTypeGuard); + }, true); + } +} From a494398af7168be3ea7a4b791cb6c03e58ece813 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 14:49:03 -0500 Subject: [PATCH 031/122] Refactor WeitghedElementUtility into weighted-element-utility.ts --- src/discriminator/discriminators.ts | 2 +- src/random/index.ts | 3 +- src/random/random.ts | 2 +- src/random/weighed-element/index.ts | 22 +++ .../weighted-element-utility.ts | 97 +++++++++++++ .../weighed-element/weighted-element.ts | 49 +++++++ src/random/weighted-element.ts | 129 ------------------ test/discriminator/discriminators.test.ts | 23 ++++ 8 files changed, 195 insertions(+), 132 deletions(-) create mode 100644 src/random/weighed-element/index.ts create mode 100644 src/random/weighed-element/weighted-element-utility.ts create mode 100644 src/random/weighed-element/weighted-element.ts delete mode 100644 src/random/weighted-element.ts create mode 100644 test/discriminator/discriminators.test.ts diff --git a/src/discriminator/discriminators.ts b/src/discriminator/discriminators.ts index 6ce3508..3e1fd5e 100644 --- a/src/discriminator/discriminators.ts +++ b/src/discriminator/discriminators.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2026 Brittni Watkins. + * Copyright (c) 2024-2026 Brittni Watkins. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), diff --git a/src/random/index.ts b/src/random/index.ts index 0278922..6bfbc9d 100644 --- a/src/random/index.ts +++ b/src/random/index.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2026 Brittni Watkins. + * Copyright (c) 2024-2026 Brittni Watkins. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), @@ -19,5 +19,6 @@ */ export * from './seeded-random'; +export * from './weighed-element'; export * from './random'; diff --git a/src/random/random.ts b/src/random/random.ts index 84eef28..2fc0f39 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -19,7 +19,7 @@ */ import { NumberUtility } from '../number'; -import { WeightedList } from './weighted-element'; +import { WeightedList } from './weighed-element/weighted-element'; /** * Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays. diff --git a/src/random/weighed-element/index.ts b/src/random/weighed-element/index.ts new file mode 100644 index 0000000..cef2c0d --- /dev/null +++ b/src/random/weighed-element/index.ts @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2024-2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +export * from './weighted-element'; +export * from './weighted-element-utility'; diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts new file mode 100644 index 0000000..92f4ae2 --- /dev/null +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import Value from 'typebox/value'; + +import { Type } from 'typebox'; + +import { DiscriminatorRegistry, Discriminators, TypeGuard } from '../../discriminator'; + +import { WeightedElement, WeightedList, weightedElementSchema } from './weighted-element'; + +export class WeightedElementUtility { + static readonly #isGenericWeightedElement: TypeGuard> = DiscriminatorRegistry.register>({ + discriminator: Discriminators.WeightedElement, + validator: (input: unknown): input is WeightedElement => { + return Value.Check(Type.Call(weightedElementSchema, [Type.Unknown()]), input) + } + }); + + public static buildWeightedElement(input: { value: Type; weight: number; }): WeightedElement { + const weightedElement = { + ...input, + discriminator: Discriminators.WeightedElement + }; + + if (!WeightedElementUtility.isGenericWeightedElement(weightedElement)) { + throw new TypeError('Input does not match schema requirements for weighted element value and weight'); + } + + return weightedElement; + } + + public static buildWeightedList(elements: { value: Type, weight: number }[]): WeightedList { + const weightedElements: WeightedElement[] = elements.map((element: { value: Type, weight: number }): WeightedElement => { + return WeightedElementUtility.buildWeightedElement(element); + }); + + if (!WeightedElementUtility.isGenericWeightedList(weightedElements)) { + throw new TypeError('Input does not match schema requirements for weighted list'); + } + + return weightedElements; + } + + public static isGenericWeightedElement(input: unknown): input is WeightedElement { + return WeightedElementUtility.#isGenericWeightedElement(input); + } + + public static isWeightedElement(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedElement { + return WeightedElementUtility.isGenericWeightedElement(input) && valueTypeGuard(input.value); + } + + public static isGenericWeightedList(input: unknown): input is WeightedList { + if (!input || !Array.isArray(input) || input.length === 0) { + return false; + } + + const containsWeightedElements: boolean = input.reduce((accumulator: boolean, element: unknown): boolean => { + return accumulator && WeightedElementUtility.isGenericWeightedElement(element); + }, true); + + if (!containsWeightedElements) { + return false; + } + + const weightSum: number = input.reduce((sum: number, element: WeightedElement): number => sum + element.weight, 0); + const precisionSum: number = Number.parseFloat(weightSum.toFixed(4)); + return precisionSum === 1; + } + + public static isWeightedList(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedList { + if (!WeightedElementUtility.isGenericWeightedList(input)) { + return false; + } + + return input.reduce((accumulator: boolean, element: unknown): boolean => { + return accumulator && WeightedElementUtility.isWeightedElement(element, valueTypeGuard); + }, true); + } +} diff --git a/src/random/weighed-element/weighted-element.ts b/src/random/weighed-element/weighted-element.ts new file mode 100644 index 0000000..b5a1a11 --- /dev/null +++ b/src/random/weighed-element/weighted-element.ts @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2024-2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { Type } from 'typebox'; + +import { Discriminators, discriminatedSchema } from '../../discriminator'; + +export const weightedElementSchema = Type.Generic( + [Type.Parameter('T')], + Type.Intersect([ + discriminatedSchema, + Type.Object( + { + value: Type.Readonly(Type.Ref('T')), + weight: Type.Readonly(Type.Number({ + minimum: 0, + maximum: 1 + })), + discriminator: Type.Literal(Discriminators.WeightedElement) + }, + { additionalProperties: false } + ) + ]) +); + +export interface WeightedElement { + readonly value: Type, + readonly weight: number, + readonly discriminator: Discriminators.WeightedElement +} + +export type WeightedList = WeightedElement[]; diff --git a/src/random/weighted-element.ts b/src/random/weighted-element.ts deleted file mode 100644 index de10259..0000000 --- a/src/random/weighted-element.ts +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (c) 2024-2026 Brittni Watkins. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), - * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom - * the Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, - * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE - * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE - * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -import { Type } from 'typebox'; -import Value from 'typebox/schema'; - -import {Discriminators, discriminatedSchema, DiscriminatorRegistry, TypeGuard} from '../discriminator'; - -export const weightedElementSchema = Type.Generic( - [Type.Parameter('T')], - Type.Intersect([ - discriminatedSchema, - Type.Object( - { - value: Type.Readonly(Type.Ref('T')), - weight: Type.Readonly(Type.Number({ - minimum: 0, - maximum: 1 - })), - discriminator: Type.Literal(Discriminators.WeightedElement) - }, - { additionalProperties: false } - ) - ]) -); - -export interface WeightedElement { - readonly value: Type, - readonly weight: number, - readonly discriminator: Discriminators.WeightedElement -} - -export type WeightedList = WeightedElement[]; - -export function buildWeightedList(elements: { value: Type, weight: number }[]): WeightedList { - const outOfRangeWeights: {value: Type, weight: number}[] = elements.filter(element => element.weight < 0 || element.weight > 1); - - if (outOfRangeWeights.length > 0) { - throw new RangeError('Element weights must be between 0 and 1. Out of range weights: ' + JSON.stringify(outOfRangeWeights)); - } - - const weightSum: number = elements.reduce((sum, element) => sum + element.weight, 0); - const precisionSum = Number.parseFloat(weightSum.toFixed(4)); - - if (precisionSum !== 1) { - throw new RangeError('Sum of element weights must be 1'); - } - - return elements.map(element => { - return { - value: element.value, - weight: element.weight, - discriminator: Discriminators.WeightedElement - } - }); -} - -export const isGenericWeightedElement: TypeGuard> = DiscriminatorRegistry.register>({ - discriminator: Discriminators.WeightedElement, - validator: (input: unknown): input is WeightedElement => { - return Value.Check(Type.Call(weightedElementSchema, [Type.Unknown()]), input) - } -}); - -export function isWeightedElement(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedElement { - return isGenericWeightedElement(input) && valueTypeGuard(input.value); -} - -export class WeightedElementUtility { - public static buildWeightedElement(input: { value: Type; weight: number; }): WeightedElement { - const weightedElement = { - ...input, - discriminator: Discriminators.WeightedElement - }; - - if (!isGenericWeightedElement(weightedElement)) { - throw new TypeError('Input does not match schema requirements for weighted element value and weight'); - } - - return weightedElement; - } - - // TODO - check for weight sum - public static isGenericWeightedList(input: unknown): input is WeightedList { - if (!input) { - return false; - } - - if (!Array.isArray(input)) { - return false; - } - - return input.reduce((accumulator: boolean, element: unknown): boolean => { - return accumulator && isGenericWeightedElement(element); - }, true); - } - - // TODO - check for weight sum - public static isWeighedList(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedList { - if (!input) { - return false; - } - - if (!Array.isArray(input)) { - return false; - } - - return input.reduce((accumulator: boolean, element: unknown): boolean => { - return accumulator && isWeightedElement(element, valueTypeGuard); - }, true); - } -} diff --git a/test/discriminator/discriminators.test.ts b/test/discriminator/discriminators.test.ts new file mode 100644 index 0000000..3e00bd4 --- /dev/null +++ b/test/discriminator/discriminators.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { test } from 'vitest'; + +test.todo('All discriminators should be unique'); From 360c1b1310131f2356585e0f67910c92b55ec423 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 14:50:14 -0500 Subject: [PATCH 032/122] Add random.test.ts --- test/random/random.test.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 test/random/random.test.ts diff --git a/test/random/random.test.ts b/test/random/random.test.ts new file mode 100644 index 0000000..baec956 --- /dev/null +++ b/test/random/random.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import { test } from 'vitest'; + +test.todo('Random'); From f4ad0f5eb767e4bbd7da284884932a6ec180e979 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 14:50:50 -0500 Subject: [PATCH 033/122] Add weighed-element.test.ts --- .../weighted-element/weighted-element.test.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 test/random/weighted-element/weighted-element.test.ts diff --git a/test/random/weighted-element/weighted-element.test.ts b/test/random/weighted-element/weighted-element.test.ts new file mode 100644 index 0000000..ca7e7b8 --- /dev/null +++ b/test/random/weighted-element/weighted-element.test.ts @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2026 Brittni Watkins. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE + * AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + From bacdc39e7047c2479d828a981913c298cb3d38b4 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 14:53:50 -0500 Subject: [PATCH 034/122] Fix linting errors. --- src/random/random.ts | 2 +- src/random/weighed-element/weighted-element-utility.ts | 10 +++++----- src/random/weighed-element/weighted-element.ts | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/random/random.ts b/src/random/random.ts index 2fc0f39..15ac799 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -129,7 +129,7 @@ export class Random { return elements[Random.randomInt(0, elements.length)]; } - public static randomWeightedElement(elements: WeightedList): Type { + public static randomWeightedElement(elements: WeightedList): Type { return elements[0].value; } diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index 92f4ae2..da48fff 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -30,7 +30,7 @@ export class WeightedElementUtility { static readonly #isGenericWeightedElement: TypeGuard> = DiscriminatorRegistry.register>({ discriminator: Discriminators.WeightedElement, validator: (input: unknown): input is WeightedElement => { - return Value.Check(Type.Call(weightedElementSchema, [Type.Unknown()]), input) + return Value.Check(Type.Call(weightedElementSchema, [Type.Unknown()]), input); } }); @@ -47,8 +47,8 @@ export class WeightedElementUtility { return weightedElement; } - public static buildWeightedList(elements: { value: Type, weight: number }[]): WeightedList { - const weightedElements: WeightedElement[] = elements.map((element: { value: Type, weight: number }): WeightedElement => { + public static buildWeightedList(elements: { value: Type; weight: number; }[]): WeightedList { + const weightedElements: WeightedElement[] = elements.map((element: { value: Type; weight: number; }): WeightedElement => { return WeightedElementUtility.buildWeightedElement(element); }); @@ -72,7 +72,7 @@ export class WeightedElementUtility { return false; } - const containsWeightedElements: boolean = input.reduce((accumulator: boolean, element: unknown): boolean => { + const containsWeightedElements: boolean = input.reduce((accumulator: boolean, element: unknown): boolean => { return accumulator && WeightedElementUtility.isGenericWeightedElement(element); }, true); @@ -80,7 +80,7 @@ export class WeightedElementUtility { return false; } - const weightSum: number = input.reduce((sum: number, element: WeightedElement): number => sum + element.weight, 0); + const weightSum: number = input.reduce((sum: number, element: unknown): number => sum + (element as WeightedElement).weight, 0); const precisionSum: number = Number.parseFloat(weightSum.toFixed(4)); return precisionSum === 1; } diff --git a/src/random/weighed-element/weighted-element.ts b/src/random/weighed-element/weighted-element.ts index b5a1a11..112630f 100644 --- a/src/random/weighed-element/weighted-element.ts +++ b/src/random/weighed-element/weighted-element.ts @@ -41,9 +41,9 @@ export const weightedElementSchema = Type.Generic( ); export interface WeightedElement { - readonly value: Type, - readonly weight: number, - readonly discriminator: Discriminators.WeightedElement + readonly value: Type; + readonly weight: number; + readonly discriminator: Discriminators.WeightedElement; } export type WeightedList = WeightedElement[]; From ccfc9b240ce0aa9e1b502a97020ea98b57af6c8d Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 14:56:19 -0500 Subject: [PATCH 035/122] Add initial todos for weighted-element-utility.test.ts tests. --- .../weighed-element/weighted-element-utility.ts | 9 +++++++++ ...test.ts => weighted-element-utility.test.ts} | 17 +++++++++++++++++ 2 files changed, 26 insertions(+) rename test/random/weighted-element/{weighted-element.test.ts => weighted-element-utility.test.ts} (75%) diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index da48fff..b5af04f 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -27,6 +27,15 @@ import { DiscriminatorRegistry, Discriminators, TypeGuard } from '../../discrimi import { WeightedElement, WeightedList, weightedElementSchema } from './weighted-element'; export class WeightedElementUtility { + /** + * @throws {Error} - WeightedElementUtility is a static class and cannot be instantiated. + * + * @private + */ + private constructor() { + throw new Error('WeightedElementUtility is a static class and cannot be instantiated.'); + } + static readonly #isGenericWeightedElement: TypeGuard> = DiscriminatorRegistry.register>({ discriminator: Discriminators.WeightedElement, validator: (input: unknown): input is WeightedElement => { diff --git a/test/random/weighted-element/weighted-element.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts similarity index 75% rename from test/random/weighted-element/weighted-element.test.ts rename to test/random/weighted-element/weighted-element-utility.test.ts index ca7e7b8..79a4169 100644 --- a/test/random/weighted-element/weighted-element.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -18,3 +18,20 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +import { describe, test } from 'vitest'; + +describe('WeightedElementUtility', (): void => { + test.todo('new WeightedElementUtility()'); + + test.todo('buildWeightedElement') + + test.todo('buildWeightedList') + + test.todo('isGenericWeightedElement') + + test.todo('isWeightedElement') + + test.todo('isGenericWeightedList') + + test.todo('isWeightedList') +}); From 99462344a25d55585668fdd797e90946c97e1bb8 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 20:55:22 -0500 Subject: [PATCH 036/122] Add constructor and initial build unit test for weighted-element-utility.test.ts --- .../weighted-element-utility.ts | 14 +++- .../weighted-element-utility.test.ts | 79 +++++++++++++++++-- 2 files changed, 84 insertions(+), 9 deletions(-) diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index b5af04f..a5503c3 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -44,13 +44,17 @@ export class WeightedElementUtility { }); public static buildWeightedElement(input: { value: Type; weight: number; }): WeightedElement { + if (!input || typeof input !== 'object' || Array.isArray(input)) { + throw new TypeError(`Input (${input}) must be an object`); + } + const weightedElement = { ...input, discriminator: Discriminators.WeightedElement }; if (!WeightedElementUtility.isGenericWeightedElement(weightedElement)) { - throw new TypeError('Input does not match schema requirements for weighted element value and weight'); + throw new TypeError(`Element ${weightedElement} does not match schema requirements for weighted element value and weight`); } return weightedElement; @@ -73,6 +77,10 @@ export class WeightedElementUtility { } public static isWeightedElement(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedElement { + if (typeof valueTypeGuard !== 'function') { + throw new TypeError('Value type guard must be a function'); + } + return WeightedElementUtility.isGenericWeightedElement(input) && valueTypeGuard(input.value); } @@ -95,6 +103,10 @@ export class WeightedElementUtility { } public static isWeightedList(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedList { + if (typeof valueTypeGuard !== 'function') { + throw new TypeError('Value type guard must be a function'); + } + if (!WeightedElementUtility.isGenericWeightedList(input)) { return false; } diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index 79a4169..ec2e8d1 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -18,20 +18,83 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { describe, test } from 'vitest'; +import { describe, test, expect } from 'vitest'; + +import { WeightedElement, WeightedElementUtility } from '../../../src'; +import {Scenario} from "../../utils/test-case/test-case"; describe('WeightedElementUtility', (): void => { - test.todo('new WeightedElementUtility()'); + describe('new WeightedElementUtility()', (): void => { + describe('Runtime behavior guards', (): void => { + test('Constructor should throw an error when instantiated at runtime', (): void => { + const RuntimeConstructor = WeightedElementUtility as unknown as new () => WeightedElementUtility; + expect((): WeightedElementUtility => new RuntimeConstructor()).toThrow(Error); + }); + }); + }); + + describe('buildWeightedElement', (): void => { + test('buildWeightedElement() should return a typed weighed element', (): void => { + const element: WeightedElement = WeightedElementUtility.buildWeightedElement({ value: 'test value', weight: 0.5 }); + + expect(WeightedElementUtility.isWeightedElement(element, (input: unknown): input is string => typeof input === 'string')).toBe(true); + }); + + describe('Input validation', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-object type inputs', + inputs: [], + expected: null + }, + { + label: 'Array type inputs', + inputs: [], + expected: null + }, + { + label: 'Object inputs missing value property', + inputs: [], + expected: null + }, + { + label: 'Object inputs missing weight property', + inputs: [], + expected: null + }, + { + label: 'Object inputs with non-numeric weight property', + inputs: [], + expected: null + }, + { + label: 'Object inputs with non-finite weight property', + inputs: [], + expected: null + }, + { + label: 'Object inputs with out of range weight property', + inputs: [], + expected: null + }, + { + label: 'Object inputs with additional properties', + inputs: [], + expected: null + } + ]; + }); + }); - test.todo('buildWeightedElement') + test.todo('buildWeightedElement'); - test.todo('buildWeightedList') + test.todo('buildWeightedList'); - test.todo('isGenericWeightedElement') + test.todo('isGenericWeightedElement'); - test.todo('isWeightedElement') + test.todo('isWeightedElement'); - test.todo('isGenericWeightedList') + test.todo('isGenericWeightedList'); - test.todo('isWeightedList') + test.todo('isWeightedList'); }); From dd7832d6268c95da17026699f4376c75ec977e67 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 21:24:16 -0500 Subject: [PATCH 037/122] Add unit tests to weighted-element-utility.test.ts for buildWeightedElement method. --- .../weighted-element-utility.ts | 21 +++-- .../weighted-element-utility.test.ts | 89 +++++++++++++++---- 2 files changed, 86 insertions(+), 24 deletions(-) diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index a5503c3..ae084b4 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -44,19 +44,14 @@ export class WeightedElementUtility { }); public static buildWeightedElement(input: { value: Type; weight: number; }): WeightedElement { - if (!input || typeof input !== 'object' || Array.isArray(input)) { - throw new TypeError(`Input (${input}) must be an object`); - } + WeightedElementUtility.#validateBuildWeightedElementInput(input); const weightedElement = { ...input, discriminator: Discriminators.WeightedElement }; - if (!WeightedElementUtility.isGenericWeightedElement(weightedElement)) { - throw new TypeError(`Element ${weightedElement} does not match schema requirements for weighted element value and weight`); - } - + WeightedElementUtility.#validateWeightedElement(weightedElement); return weightedElement; } @@ -115,4 +110,16 @@ export class WeightedElementUtility { return accumulator && WeightedElementUtility.isWeightedElement(element, valueTypeGuard); }, true); } + + static #validateBuildWeightedElementInput(input: unknown): void { + if (!input || typeof input !== 'object' || Array.isArray(input)) { + throw new TypeError('Input must be an object'); + } + } + + static #validateWeightedElement(element: unknown): void { + if (!WeightedElementUtility.isGenericWeightedElement(element)) { + throw new TypeError(`Element does not match schema requirements for weighted element`); + } + } } diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index ec2e8d1..d5ef18c 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -21,7 +21,10 @@ import { describe, test, expect } from 'vitest'; import { WeightedElement, WeightedElementUtility } from '../../../src'; -import {Scenario} from "../../utils/test-case/test-case"; + +import { nonFiniteNumberInputs, nonNumberInputs } from '../../utils/input/number-inputs'; +import { nonObjectInputs } from '../../utils/input/object-inputs'; +import { Scenario, TestCase, buildTestCases } from '../../utils/test-case/test-case'; describe('WeightedElementUtility', (): void => { describe('new WeightedElementUtility()', (): void => { @@ -44,45 +47,97 @@ describe('WeightedElementUtility', (): void => { const scenarios: Scenario[] = [ { label: 'Non-object type inputs', - inputs: [], - expected: null + inputs: [ + ...nonObjectInputs + ], + expected: TypeError }, { label: 'Array type inputs', - inputs: [], - expected: null + inputs: [ + [], + [1, 2, 3], + ['a', 'b', 'c'] + ], + expected: TypeError }, { label: 'Object inputs missing value property', - inputs: [], - expected: null + inputs: [ + { weight: 0 }, + { weight: 0.5 }, + { weight: 1 } + ], + expected: TypeError }, { label: 'Object inputs missing weight property', - inputs: [], - expected: null + inputs: [ + { value: 10 }, + { value: 'hello' }, + { + value: (): number => { + return 100; + } + } + ], + expected: TypeError }, { label: 'Object inputs with non-numeric weight property', - inputs: [], - expected: null + inputs: [ + ...nonNumberInputs.map((input) => { + return { value: 'test', weight: input }; + }) + ], + expected: TypeError }, { label: 'Object inputs with non-finite weight property', - inputs: [], - expected: null + inputs: [ + ...nonFiniteNumberInputs.map((input) => { + return { value: 'test', weight: input }; + }) + ], + expected: TypeError }, { label: 'Object inputs with out of range weight property', - inputs: [], - expected: null + inputs: [ + { value: 10, weight: -5 }, + { value: 10, weight: -1 }, + { value: 10, weight: -0.1 }, + { value: 10, weight: -Number.EPSILON }, + { value: 10, weight: 1 + Number.EPSILON }, + { value: 10, weight: 1.1 }, + { value: 10, weight: 5 } + ], + expected: TypeError }, { label: 'Object inputs with additional properties', - inputs: [], - expected: null + inputs: [ + { value: 'hello', weight: 0, name: 'bob' }, + { value: 'hello', weight: 0.5, age: 42 }, + { value: 'hello', weight: 1, day: 7 } + ], + expected: TypeError } ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect((): void => { + WeightedElementUtility.buildWeightedElement(testInput as { value: unknown; weight: number; }); + }).toThrow(testExpected); + }); + }); }); }); From 21b032a96db9501ca9c95ff1c205f12f64ad984e Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 24 Jun 2026 22:01:12 -0500 Subject: [PATCH 038/122] Add unit tests to weighted-element-utility.test.ts for buildWeightedList method. --- .../weighted-element-utility.ts | 19 ++- .../weighted-element-utility.test.ts | 110 +++++++++++++++++- 2 files changed, 122 insertions(+), 7 deletions(-) diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index ae084b4..b2db455 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -56,14 +56,13 @@ export class WeightedElementUtility { } public static buildWeightedList(elements: { value: Type; weight: number; }[]): WeightedList { + WeightedElementUtility.#validateBuildWeightedListInput(elements); + const weightedElements: WeightedElement[] = elements.map((element: { value: Type; weight: number; }): WeightedElement => { return WeightedElementUtility.buildWeightedElement(element); }); - if (!WeightedElementUtility.isGenericWeightedList(weightedElements)) { - throw new TypeError('Input does not match schema requirements for weighted list'); - } - + WeightedElementUtility.#validateWeightedList(weightedElements); return weightedElements; } @@ -117,9 +116,21 @@ export class WeightedElementUtility { } } + static #validateBuildWeightedListInput(input: unknown): void { + if (!input || !Array.isArray(input) || input.length === 0) { + throw new TypeError('Input must be an non-empty array'); + } + } + static #validateWeightedElement(element: unknown): void { if (!WeightedElementUtility.isGenericWeightedElement(element)) { throw new TypeError(`Element does not match schema requirements for weighted element`); } } + + static #validateWeightedList(list: unknown): void { + if (!WeightedElementUtility.isGenericWeightedList(list)) { + throw new TypeError('Input does not match schema requirements for weighted list'); + } + } } diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index d5ef18c..97ba8a1 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -20,11 +20,12 @@ import { describe, test, expect } from 'vitest'; -import { WeightedElement, WeightedElementUtility } from '../../../src'; +import { WeightedElement, WeightedElementUtility, WeightedList } from '../../../src'; import { nonFiniteNumberInputs, nonNumberInputs } from '../../utils/input/number-inputs'; import { nonObjectInputs } from '../../utils/input/object-inputs'; import { Scenario, TestCase, buildTestCases } from '../../utils/test-case/test-case'; +import { nonArrayInputs } from '../../utils/input/array-inputs'; describe('WeightedElementUtility', (): void => { describe('new WeightedElementUtility()', (): void => { @@ -141,11 +142,114 @@ describe('WeightedElementUtility', (): void => { }); }); - test.todo('buildWeightedElement'); + describe('buildWeightedList', (): void => { + test('buildWeightedList() should return a typed weighted list', (): void => { + const list: WeightedList = WeightedElementUtility.buildWeightedList([ + { value: 'test value 1', weight: 0.5 }, + { value: 'test value 2', weight: 0.5 } + ]); - test.todo('buildWeightedList'); + expect(WeightedElementUtility.isWeightedList(list, (input: unknown): input is string => typeof input === 'string')).toBe(true); + }); + + const scenarios: Scenario[] = [ + { + label: 'Non-array type inputs', + inputs: [ + ...nonArrayInputs + ], + expected: TypeError + }, + { + label: 'Empty array input', + inputs: [ + [] + ], + expected: TypeError + }, + { + label: 'Incorrect type array input', + inputs: [ + [1, 2, 3], + ['a', 'b', 'c'], + [ + { weight: 1 } + ], + [ + { value: 'hello' } + ], + [ + { value: 'hello', weight: 'three' } + ], + [ + { value: 'hello', weight: NaN } + ], + [ + { value: 'hello', weight: Infinity } + ], + [ + { value: 10, weight: -0.1 } + ], + [ + { value: 'hello', weight: 1, name: 'bob' } + ] + ], + expected: TypeError + }, + { + label: 'Weight sum is not equal to one', + inputs: [ + [ + { value: 'test 1', weight: 0.5 }, + { value: 'test 2', weight: 0.5 }, + { value: 'test 3', weight: 0.0001 } + ], + [ + { value: 'test 1', weight: 0.5 }, + { value: 'test 2', weight: 0.5 - 0.0001 } + ], + [ + { value: 'test 1', weight: 0.5 }, + { value: 'test 2', weight: 0.5 + 0.0001 } + ], + [ + { value: 'test 1', weight: 0 } + ], + [ + { value: 'test 1', weight: 1 - 0.0001 } + ], + [ + { value: 'test 1', weight: 1 }, + { value: 'test 2', weight: 1 } + ], + [ + [ + { value: 'test 1', weight: 1 }, + { value: 'test 2', weight: 0.0001 } + ] + ] + ], + expected: TypeError + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect((): void => { + WeightedElementUtility.buildWeightedList(testInput as { value: unknown; weight: number; }[]); + }).toThrow(testExpected); + }); + }); + }); test.todo('isGenericWeightedElement'); + test.todo('Test that TypeBox type and interface type are equivalent/compatible'); test.todo('isWeightedElement'); From 455fdfb8bfdb50edca3a1e82bb946db80a72cd75 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Fri, 26 Jun 2026 11:55:51 -0500 Subject: [PATCH 039/122] Add unit tests for ensuring generic interface and generic schema are equivalent to weighted-element-utility.test.ts --- .../weighted-element-utility.test.ts | 28 ++++++++++++++++--- tsconfig.vitest.json | 5 ++++ vitest.config.ts | 5 ++++ 3 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 tsconfig.vitest.json diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index 97ba8a1..9f76e52 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -18,14 +18,15 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { describe, test, expect } from 'vitest'; +import { describe, test, expect, expectTypeOf } from 'vitest'; -import { WeightedElement, WeightedElementUtility, WeightedList } from '../../../src'; +import {WeightedElement, weightedElementSchema, WeightedElementUtility, WeightedList} from '../../../src'; import { nonFiniteNumberInputs, nonNumberInputs } from '../../utils/input/number-inputs'; import { nonObjectInputs } from '../../utils/input/object-inputs'; import { Scenario, TestCase, buildTestCases } from '../../utils/test-case/test-case'; import { nonArrayInputs } from '../../utils/input/array-inputs'; +import {Static, Type} from "typebox"; describe('WeightedElementUtility', (): void => { describe('new WeightedElementUtility()', (): void => { @@ -248,8 +249,27 @@ describe('WeightedElementUtility', (): void => { }); }); - test.todo('isGenericWeightedElement'); - test.todo('Test that TypeBox type and interface type are equivalent/compatible'); + describe('isGenericWeightedElement()', (): void => { + describe('weightedElementSchema and WeightedElement interface should be equivalent', (): void => { + test('String type', (): void => { + const stringSchema = Type.Call(weightedElementSchema, [Type.String()]); + type StringStatic = Static; + expectTypeOf().toExtend>(); + expectTypeOf>().toExtend(); + }); + + test('Number type', (): void => { + const numberSchema = Type.Call(weightedElementSchema, [Type.Number()]); + type NumberStatic = Static; + expectTypeOf().toExtend>(); + expectTypeOf>().toExtend(); + }); + }); + + describe('Input validation', (): void => { + test.todo('isGenericWeightedElement input validation'); + }); + }); test.todo('isWeightedElement'); diff --git a/tsconfig.vitest.json b/tsconfig.vitest.json new file mode 100644 index 0000000..1c97fb9 --- /dev/null +++ b/tsconfig.vitest.json @@ -0,0 +1,5 @@ +{ + "compilerOptions": { + "skipLibCheck": true, + } +} diff --git a/vitest.config.ts b/vitest.config.ts index 34fe808..4d1e659 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -33,6 +33,11 @@ export default defineConfig({ '_doc/**', 'docs/**' ], + typecheck: { + enabled: true, + tsconfig: './tsconfig.vitest.json', + include: ['test/**/*.{test,spec}.{ts,mts,cts,tsx}'] + }, coverage: { provider: 'v8', reporter: ['text', 'lcov', 'json', 'json-summary', 'clover', 'html'], From 8e980fd06164ad589eab27b726cc66b31abe351f Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sat, 27 Jun 2026 01:16:39 -0500 Subject: [PATCH 040/122] Add unit tests to weighted-element-utility.test.ts --- .../weighted-element-utility.test.ts | 131 +++++++++++++++++- 1 file changed, 128 insertions(+), 3 deletions(-) diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index 9f76e52..f49e0fd 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -20,13 +20,19 @@ import { describe, test, expect, expectTypeOf } from 'vitest'; -import {WeightedElement, weightedElementSchema, WeightedElementUtility, WeightedList} from '../../../src'; +import { + Discriminators, + WeightedElement, + weightedElementSchema, + WeightedElementUtility, + WeightedList +} from '../../../src'; import { nonFiniteNumberInputs, nonNumberInputs } from '../../utils/input/number-inputs'; import { nonObjectInputs } from '../../utils/input/object-inputs'; import { Scenario, TestCase, buildTestCases } from '../../utils/test-case/test-case'; import { nonArrayInputs } from '../../utils/input/array-inputs'; -import {Static, Type} from "typebox"; +import { Static, Type } from 'typebox'; describe('WeightedElementUtility', (): void => { describe('new WeightedElementUtility()', (): void => { @@ -267,7 +273,126 @@ describe('WeightedElementUtility', (): void => { }); describe('Input validation', (): void => { - test.todo('isGenericWeightedElement input validation'); + const scenarios: Scenario[] = [ + { + label: 'Non-object type inputs', + inputs: [ + ...nonObjectInputs + ], + expected: false + }, + { + label: 'Array type inputs', + inputs: [ + [], + [1, 2, 3], + ['a', 'b', 'c'] + ], + expected: false + }, + { + label: 'Object inputs missing value property', + inputs: [ + { weight: 0, discriminator: Discriminators.WeightedElement }, + { weight: 0.5, discriminator: Discriminators.WeightedElement }, + { weight: 1, discriminator: Discriminators.WeightedElement } + ], + expected: false + }, + { + label: 'Object inputs missing weight property', + inputs: [ + { value: 10, discriminator: Discriminators.WeightedElement }, + { value: 'hello', discriminator: Discriminators.WeightedElement }, + { + value: (): number => { + return 100; + }, + discriminator: Discriminators.WeightedElement + } + ], + expected: false + }, + { + label: 'Object inputs missing discriminator property', + inputs: [ + { value: 'hi', weight: 0 }, + { value: 'hello', weight: 0.5 }, + { value: 'test', weight: 1 } + ], + expected: false + }, + { + label: 'Object inputs with non-numeric weight property', + inputs: [ + ...nonNumberInputs.map((input) => { + return { value: 'test', weight: input, discriminator: Discriminators.WeightedElement }; + }) + ], + expected: false + }, + { + label: 'Object inputs with non-finite weight property', + inputs: [ + ...nonFiniteNumberInputs.map((input) => { + return { value: 'test', weight: input, discriminator: Discriminators.WeightedElement }; + }) + ], + expected: false + }, + { + label: 'Object inputs with out of range weight property', + inputs: [ + { value: 10, weight: -5, discriminator: Discriminators.WeightedElement }, + { value: 10, weight: -1, discriminator: Discriminators.WeightedElement }, + { value: 10, weight: -0.1, discriminator: Discriminators.WeightedElement }, + { value: 10, weight: -Number.EPSILON, discriminator: Discriminators.WeightedElement }, + { value: 10, weight: 1 + Number.EPSILON, discriminator: Discriminators.WeightedElement }, + { value: 10, weight: 1.1, discriminator: Discriminators.WeightedElement }, + { value: 10, weight: 5, discriminator: Discriminators.WeightedElement } + ], + expected: false + }, + { + label: 'Object inputs with additional properties', + inputs: [ + { value: 'hello', weight: 0, name: 'bob', discriminator: Discriminators.WeightedElement }, + { value: 'hello', weight: 0.5, age: 42, discriminator: Discriminators.WeightedElement }, + { value: 'hello', weight: 1, day: 7, discriminator: Discriminators.WeightedElement } + ], + expected: false + }, + { + label: 'Object inputs with incorrect discriminator', + inputs: [ + { value: 'hello', weight: 0, discriminator: 'invalid' }, + { value: 'hello', weight: 0.5, discriminator: '' }, + { value: 'hello', weight: 1, discriminator: 'other discriminator' } + ], + expected: false + }, + { + label: 'Valid weighted element object', + inputs: [ + { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, + { value: 'hey', weight: 1, discriminator: Discriminators.WeightedElement } + ], + expected: true + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(WeightedElementUtility.isGenericWeightedElement(testInput)).toBe(testExpected); + }); + }); }); }); From 6c17e9fbd6a1db9e364feb4f9831de8c77dbb51f Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sat, 27 Jun 2026 01:30:42 -0500 Subject: [PATCH 041/122] Fix linting errors. --- test/random/weighted-element/weighted-element-utility.test.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index f49e0fd..478388c 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -260,6 +260,7 @@ describe('WeightedElementUtility', (): void => { test('String type', (): void => { const stringSchema = Type.Call(weightedElementSchema, [Type.String()]); type StringStatic = Static; + expect(stringSchema).toBeDefined(); expectTypeOf().toExtend>(); expectTypeOf>().toExtend(); }); @@ -267,6 +268,7 @@ describe('WeightedElementUtility', (): void => { test('Number type', (): void => { const numberSchema = Type.Call(weightedElementSchema, [Type.Number()]); type NumberStatic = Static; + expect(numberSchema).toBeDefined(); expectTypeOf().toExtend>(); expectTypeOf>().toExtend(); }); From 72d13fb60d00f5c19df82e70c051d8801dcb12dc Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sat, 27 Jun 2026 23:45:53 -0500 Subject: [PATCH 042/122] Update weighted-element-utility.test.ts unit tests --- .../weighted-element-utility.test.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index 478388c..fcdb0bd 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -33,6 +33,7 @@ import { nonObjectInputs } from '../../utils/input/object-inputs'; import { Scenario, TestCase, buildTestCases } from '../../utils/test-case/test-case'; import { nonArrayInputs } from '../../utils/input/array-inputs'; import { Static, Type } from 'typebox'; +import { nonFunctionInputs } from '../../utils/input/function-inputs'; describe('WeightedElementUtility', (): void => { describe('new WeightedElementUtility()', (): void => { @@ -49,6 +50,7 @@ describe('WeightedElementUtility', (): void => { const element: WeightedElement = WeightedElementUtility.buildWeightedElement({ value: 'test value', weight: 0.5 }); expect(WeightedElementUtility.isWeightedElement(element, (input: unknown): input is string => typeof input === 'string')).toBe(true); + expect(WeightedElementUtility.isWeightedElement(element, (input: unknown): input is number => typeof input === 'number')).toBe(false); }); describe('Input validation', (): void => { @@ -157,6 +159,7 @@ describe('WeightedElementUtility', (): void => { ]); expect(WeightedElementUtility.isWeightedList(list, (input: unknown): input is string => typeof input === 'string')).toBe(true); + expect(WeightedElementUtility.isWeightedList(list, (input: unknown): input is number => typeof input === 'number')).toBe(false); }); const scenarios: Scenario[] = [ @@ -398,7 +401,33 @@ describe('WeightedElementUtility', (): void => { }); }); - test.todo('isWeightedElement'); + describe('isWeightedElement', (): void => { + describe('Input validation', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-function type inputs', + inputs: [ + ...nonFunctionInputs + ], + expected: TypeError + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect((): void => { + WeightedElementUtility.isWeightedElement({}, testInput as ((value: unknown) => value is unknown)); + }).toThrow(testExpected); + }); + }); + }); + }); test.todo('isGenericWeightedList'); From b55d94c5f88b2aa27f96e00943ca7beb6384951b Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 28 Jun 2026 17:07:18 -0500 Subject: [PATCH 043/122] Update weighted-element-utility.test.ts unit tests. Add isGenericWeightedList tests. --- .../weighted-element-utility.test.ts | 100 ++++++++++++++++-- 1 file changed, 92 insertions(+), 8 deletions(-) diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index fcdb0bd..4ebfdb2 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -18,7 +18,7 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { describe, test, expect, expectTypeOf } from 'vitest'; +import {describe, expect, expectTypeOf, test} from 'vitest'; import { Discriminators, @@ -28,12 +28,12 @@ import { WeightedList } from '../../../src'; -import { nonFiniteNumberInputs, nonNumberInputs } from '../../utils/input/number-inputs'; -import { nonObjectInputs } from '../../utils/input/object-inputs'; -import { Scenario, TestCase, buildTestCases } from '../../utils/test-case/test-case'; -import { nonArrayInputs } from '../../utils/input/array-inputs'; -import { Static, Type } from 'typebox'; -import { nonFunctionInputs } from '../../utils/input/function-inputs'; +import {nonFiniteNumberInputs, nonNumberInputs} from '../../utils/input/number-inputs'; +import {nonObjectInputs} from '../../utils/input/object-inputs'; +import {buildTestCases, Scenario, TestCase} from '../../utils/test-case/test-case'; +import {nonArrayInputs} from '../../utils/input/array-inputs'; +import {Static, Type} from 'typebox'; +import {nonFunctionInputs} from '../../utils/input/function-inputs'; describe('WeightedElementUtility', (): void => { describe('new WeightedElementUtility()', (): void => { @@ -429,7 +429,91 @@ describe('WeightedElementUtility', (): void => { }); }); - test.todo('isGenericWeightedList'); + describe('isGenericWeightedList', (): void => { + describe('Input validation', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-array type inputs', + inputs: [ + ...nonArrayInputs + ], + expected: false + }, + { + label: 'Empty array inputs', + inputs: [ + [] + ], + expected: false + }, + { + label: 'Array inputs do not contain weighted elements', + inputs: [ + [1, 2, 3], + ['a', 'b', 'c'] + ], + expected: false + }, + { + label: 'Array inputs contain weighted elements and other type', + inputs: [ + [ + { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, + 500 + ], + [ + { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, + 'string value' + ], + [ + { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, + { key: 'value' } + ], + [ + { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, + { key: 'value', discriminator: Discriminators.WeightedElement }, + ] + ], + expected: false + }, + { + label: 'Weighted elements weight sum is not equal to 1', + inputs: [ + [ + { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0, discriminator: Discriminators.WeightedElement }, + ], + [ + { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, + ], + [ + { value: 'hello', weight: 0.5, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, + { value: 'howdy', weight: 0.0001, discriminator: Discriminators.WeightedElement }, + ] + ], + expected: false + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(WeightedElementUtility.isGenericWeightedList(testInput)).toBe(testExpected); + }); + }); + }); + }); test.todo('isWeightedList'); }); From 4d3e96503e16b8c1cb7c45a628f2fd64da81f0ef Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 28 Jun 2026 22:19:35 -0500 Subject: [PATCH 044/122] Complete weighted-element-utility.test.ts unit tests. --- .../weighted-element-utility.test.ts | 58 +++++++++++++++---- 1 file changed, 46 insertions(+), 12 deletions(-) diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index 4ebfdb2..72635aa 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -18,7 +18,8 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import {describe, expect, expectTypeOf, test} from 'vitest'; +import { Static, Type } from 'typebox'; +import { describe, expect, expectTypeOf, test } from 'vitest'; import { Discriminators, @@ -28,12 +29,11 @@ import { WeightedList } from '../../../src'; -import {nonFiniteNumberInputs, nonNumberInputs} from '../../utils/input/number-inputs'; -import {nonObjectInputs} from '../../utils/input/object-inputs'; -import {buildTestCases, Scenario, TestCase} from '../../utils/test-case/test-case'; -import {nonArrayInputs} from '../../utils/input/array-inputs'; -import {Static, Type} from 'typebox'; -import {nonFunctionInputs} from '../../utils/input/function-inputs'; +import { nonArrayInputs } from '../../utils/input/array-inputs'; +import { nonFunctionInputs } from '../../utils/input/function-inputs'; +import { nonFiniteNumberInputs, nonNumberInputs } from '../../utils/input/number-inputs'; +import { nonObjectInputs } from '../../utils/input/object-inputs'; +import { buildTestCases, Scenario, TestCase } from '../../utils/test-case/test-case'; describe('WeightedElementUtility', (): void => { describe('new WeightedElementUtility()', (): void => { @@ -475,7 +475,7 @@ describe('WeightedElementUtility', (): void => { [ { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, - { key: 'value', discriminator: Discriminators.WeightedElement }, + { key: 'value', discriminator: Discriminators.WeightedElement } ] ], expected: false @@ -485,16 +485,16 @@ describe('WeightedElementUtility', (): void => { inputs: [ [ { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, - { value: 'hi', weight: 0, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0, discriminator: Discriminators.WeightedElement } ], [ { value: 'hello', weight: 0, discriminator: Discriminators.WeightedElement }, - { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, + { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement } ], [ { value: 'hello', weight: 0.5, discriminator: Discriminators.WeightedElement }, { value: 'hi', weight: 0.5, discriminator: Discriminators.WeightedElement }, - { value: 'howdy', weight: 0.0001, discriminator: Discriminators.WeightedElement }, + { value: 'howdy', weight: 0.0001, discriminator: Discriminators.WeightedElement } ] ], expected: false @@ -515,5 +515,39 @@ describe('WeightedElementUtility', (): void => { }); }); - test.todo('isWeightedList'); + describe('isWeightedList', (): void => { + describe('Input validation', (): void => { + describe('Value type guard function', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-function type inputs', + inputs: [ + ...nonFunctionInputs + ], + expected: TypeError + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect((): void => { + WeightedElementUtility.isWeightedList([{ value: 'test', weight: 1, discriminator: Discriminators.WeightedElement }], testInput as ((value: unknown) => value is unknown)); + }).toThrow(testExpected); + }); + }); + }); + + describe('Invalid generic weighted list', (): void => { + test('Invalid generic weighted list should return false', (): void => { + expect(WeightedElementUtility.isWeightedList([], (input: unknown): input is WeightedElement => input === undefined)).toBe(false); + }); + }); + }); + }); }); From 8b214f566509e9b164a7d7c9158b546f5726263e Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 28 Jun 2026 22:25:24 -0500 Subject: [PATCH 045/122] Update weighted-element-utility.test.ts type check unit tests. --- .../weighted-element-utility.test.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index 72635aa..8742a94 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -260,20 +260,29 @@ describe('WeightedElementUtility', (): void => { describe('isGenericWeightedElement()', (): void => { describe('weightedElementSchema and WeightedElement interface should be equivalent', (): void => { + const numberSchema = Type.Call(weightedElementSchema, [Type.Number()]); + type NumberStatic = Static; + const stringSchema = Type.Call(weightedElementSchema, [Type.String()]); + type StringStatic = Static; + test('String type', (): void => { - const stringSchema = Type.Call(weightedElementSchema, [Type.String()]); - type StringStatic = Static; expect(stringSchema).toBeDefined(); + expectTypeOf().toExtend>(); expectTypeOf>().toExtend(); + + expectTypeOf().not.toExtend>(); + expectTypeOf>().not.toExtend(); }); test('Number type', (): void => { - const numberSchema = Type.Call(weightedElementSchema, [Type.Number()]); - type NumberStatic = Static; expect(numberSchema).toBeDefined(); + expectTypeOf().toExtend>(); expectTypeOf>().toExtend(); + + expectTypeOf().not.toExtend>(); + expectTypeOf>().not.toExtend(); }); }); From 2d7654ce4175784d2b57b6ae7dcad787487acf86 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 28 Jun 2026 22:33:40 -0500 Subject: [PATCH 046/122] Add TSDocs to weighted-element.ts --- .../weighed-element/weighted-element.ts | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/src/random/weighed-element/weighted-element.ts b/src/random/weighed-element/weighted-element.ts index 112630f..9211d3b 100644 --- a/src/random/weighed-element/weighted-element.ts +++ b/src/random/weighed-element/weighted-element.ts @@ -22,17 +22,44 @@ import { Type } from 'typebox'; import { Discriminators, discriminatedSchema } from '../../discriminator'; +/** + * TypeBox schema to validate a {@link WeightedElement} object. + * + * @since 0.1.0 + */ export const weightedElementSchema = Type.Generic( [Type.Parameter('T')], Type.Intersect([ discriminatedSchema, Type.Object( { + /** + * The value to be selected from the weighted list. + * + * @readonly + */ value: Type.Readonly(Type.Ref('T')), + + /** + * The probability weight of the element. + * Should be a number between 0 and 1, inclusive. + * + * @type {number} + * + * @readonly + */ weight: Type.Readonly(Type.Number({ minimum: 0, maximum: 1 })), + + /** + * The discriminator for the weighted element. + * + * @type {Discriminators.WeightedElement} + * + * @readonly + */ discriminator: Type.Literal(Discriminators.WeightedElement) }, { additionalProperties: false } @@ -40,10 +67,43 @@ export const weightedElementSchema = Type.Generic( ]) ); +/** + * Interface for a weighted element, which can be used for non-uniform random selection from a list. + * + * @since 0.1.0 + */ export interface WeightedElement { + /** + * The value to be selected from the weighted list. + * + * @readonly + * @since 0.1.0 + */ readonly value: Type; + + /** + * The probability weight of the element. + * Should be a number between 0 and 1, inclusive. + * + * @type {number} + * + * @readonly + * @since 0.1.0 + */ readonly weight: number; + + /** + * The discriminator for the weighted element. + * + * @type {Discriminators.WeightedElement} + * + * @readonly + * @since 0.1.0 + */ readonly discriminator: Discriminators.WeightedElement; } +/** + * Type alias for a list of {@link WeightedElement} objects. + */ export type WeightedList = WeightedElement[]; From ac1f8811fee7403bb4500ae4e4d87f846d191929 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 28 Jun 2026 23:00:09 -0500 Subject: [PATCH 047/122] Add partial TSDocs to weighted-element-utility.ts --- .../weighted-element-utility.ts | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index b2db455..680e57d 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -26,6 +26,11 @@ import { DiscriminatorRegistry, Discriminators, TypeGuard } from '../../discrimi import { WeightedElement, WeightedList, weightedElementSchema } from './weighted-element'; +/** + * Static methods and properties for building and validating {@link WeightedElement} and {@link WeightedList} objects. + * + * @since 0.1.0 + */ export class WeightedElementUtility { /** * @throws {Error} - WeightedElementUtility is a static class and cannot be instantiated. @@ -36,6 +41,15 @@ export class WeightedElementUtility { throw new Error('WeightedElementUtility is a static class and cannot be instantiated.'); } + /** + * A type guard for {@link WeightedElement} objects. + * + * @param input - The input to check. + * + * @returns {boolean} `true` if the input is a {@link WeightedElement}, `false` otherwise. + * + * @private + */ static readonly #isGenericWeightedElement: TypeGuard> = DiscriminatorRegistry.register>({ discriminator: Discriminators.WeightedElement, validator: (input: unknown): input is WeightedElement => { @@ -43,6 +57,16 @@ export class WeightedElementUtility { } }); + /** + * Builds a {@link WeightedElement} object with a value of the given type. + * + * @param {{ value: Type; weight: number; }} input - The input to build the {@link WeightedElement} from. + * + * @returns {WeightedElement} A {@link WeightedElement} object with a value of the given type. + * + * @public + * @since 0.1.0 + */ public static buildWeightedElement(input: { value: Type; weight: number; }): WeightedElement { WeightedElementUtility.#validateBuildWeightedElementInput(input); @@ -55,6 +79,17 @@ export class WeightedElementUtility { return weightedElement; } + /** + * Builds a {@link WeightedList} object from the given elements list. + * + * @param {{ value: Type; weight: number }[]} elements - The elements to build the {@link WeightedList} from. + * Each element will be converted into a {@link WeightedElement} using {@link WeightedElementUtility.buildWeightedElement}. + * + * @returns {WeightedList} A {@link WeightedList} object containing the given elements. + * + * @public + * @since 0.1.0 + */ public static buildWeightedList(elements: { value: Type; weight: number; }[]): WeightedList { WeightedElementUtility.#validateBuildWeightedListInput(elements); From dfa57414765b3ea13f380c7b48183d465275fdbe Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 12:12:25 -0500 Subject: [PATCH 048/122] Add TSDocs to weighted-element-utility.ts --- .../weighted-element-utility.ts | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index 680e57d..94adacb 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -60,10 +60,16 @@ export class WeightedElementUtility { /** * Builds a {@link WeightedElement} object with a value of the given type. * + * @see {@link WeightedElementUtility.isGenericWeightedElement} + * * @param {{ value: Type; weight: number; }} input - The input to build the {@link WeightedElement} from. * * @returns {WeightedElement} A {@link WeightedElement} object with a value of the given type. * + * @throws {TypeError} - If the given input is not an object. + * @throws {TypeError} - If the given input does not result in a valid {@link WeightedElement}. + * See {@link weightedElementSchema} for the requirements of a valid {@link WeightedElement}. + * * @public * @since 0.1.0 */ @@ -87,6 +93,9 @@ export class WeightedElementUtility { * * @returns {WeightedList} A {@link WeightedList} object containing the given elements. * + * @throws {TypeError} - If the given elements are not a non-empty array. + * @throws {TypeError} - If the given elements do not result in a valid {@link WeightedList}. + * * @public * @since 0.1.0 */ @@ -101,10 +110,36 @@ export class WeightedElementUtility { return weightedElements; } + /** + * Is the given input a {@link WeightedElement} object? + * This method does not enforce type checking for {@link WeightedElement.value}. + * + * @param {unknown} input - The input to check. + * + * @returns {input is WeightedElement} - `true` if the given input is a {@link WeightedElement} object; `false` otherwise. + * + * @public + * @since 0.1.0 + */ public static isGenericWeightedElement(input: unknown): input is WeightedElement { return WeightedElementUtility.#isGenericWeightedElement(input); } + /** + * Is the given input a {@link WeightedElement} object, whose {@link WeightedElement.value} property passes the given type guard function? + * + * @param {unknown} input - The input to check. + * @param {(value: unknown) => boolean} valueTypeGuard - The method used to validate the type of {@link WeightedElement.value}. + * This method should return `true` if the value is of the expected type, and `false` otherwise. + * The type validated by the function should match the assigned type of the {@link WeightedElement}. + * + * @returns {input is WeightedElement} - `true` if the given input is a {@link WeightedElement} object with a value of the correct type; `false` otherwise. + * + * @throws {TypeError} - If the given `valueTypeGuard` is not a function. + * + * @public + * @since 0.1.0 + */ public static isWeightedElement(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedElement { if (typeof valueTypeGuard !== 'function') { throw new TypeError('Value type guard must be a function'); @@ -113,6 +148,20 @@ export class WeightedElementUtility { return WeightedElementUtility.isGenericWeightedElement(input) && valueTypeGuard(input.value); } + /** + * Is the given input a {@link WeightedList} object? + * This method does not enforce type checking for the {@link WeightedElement.value} property of the list elements. + * + * @see {WeightedElementUtility.isGenericWeightedElement} + * + * @param {unknown} input - The input to check. + * + * @returns {input is WeightedList} - `true` if the given input is a valid {@link WeightedList} object; `false` otherwise. + * For a {@link WeightedList} to be valid, it must be a non-empty array of {@link WeightedElement} objects, where the sum of {@link WeightedElement.weight} properties in the array is equal to 1. + * + * @public + * @since 0.1.0 + */ public static isGenericWeightedList(input: unknown): input is WeightedList { if (!input || !Array.isArray(input) || input.length === 0) { return false; @@ -131,6 +180,24 @@ export class WeightedElementUtility { return precisionSum === 1; } + /** + * Is the given input a {@link WeightedList} object, where each {@link WeightedElement} object in the array contains a {@link WeightedElement.value} property that passes the given type guard function? + * + * @see {@link WeightedElementUtility.isGenericWeightedList} + * + * @param {unknown} input - The input to check. + * @param {(value: unknown) => boolean} valueTypeGuard - The method used to validate the type of each {@link WeightedElement.value} in the array. + * This method should return `true` if the value is of the expected type, and `false` otherwise. + * The type validated by the function should match the assigned type of the {@link WeightedList}. + * + * @returns {input is WeightedList} - `true` if the given input is a {@link WeightedList} object with elements of the correct type; `false` otherwise. + * For a {@link WeightedList} to be valid, it must be a non-empty array of {@link WeightedElement} objects, where the sum of {@link WeightedElement.weight} properties in the array is equal to 1. + * + * @throws {TypeError} - If the given `valueTypeGuard` is not a function. + * + * @public + * @since 0.1.0 + */ public static isWeightedList(input: unknown, valueTypeGuard: (value: unknown) => value is Type): input is WeightedList { if (typeof valueTypeGuard !== 'function') { throw new TypeError('Value type guard must be a function'); @@ -145,24 +212,74 @@ export class WeightedElementUtility { }, true); } + /** + * Validate the input of {@link WeightedElement.buildWeightedElement}. + * + * @param {unknown} input - The input to validate. + * + * @returns {void} + * + * @throws {TypeError} - If the given input is not an object. + * + * @private + */ static #validateBuildWeightedElementInput(input: unknown): void { if (!input || typeof input !== 'object' || Array.isArray(input)) { throw new TypeError('Input must be an object'); } } + /** + * Validate the input of {@link WeightedElement.buildWeightedList}. + * + * @param {unknown} input - The input to validate. + * + * @returns {void} + * + * @throws {TypeError} - If the given input is not a non-empty array. + * + * @private + */ static #validateBuildWeightedListInput(input: unknown): void { if (!input || !Array.isArray(input) || input.length === 0) { throw new TypeError('Input must be an non-empty array'); } } + /** + * Validate that an object is a valid {@link WeightedElement}. + * This method does not enforce type checking for the {@link WeightedElement.value} property of the given element. + * + * @see {@link WeightedElementUtility.isGenericWeightedElement} + * + * @param {unknown} element - The element to validate. + * + * @returns {void} + * + * @throws {TypeError} - If the given element is not a valid {@link WeightedElement}. + * + * @private + */ static #validateWeightedElement(element: unknown): void { if (!WeightedElementUtility.isGenericWeightedElement(element)) { throw new TypeError(`Element does not match schema requirements for weighted element`); } } + /** + * Validate that an object is a valid {@link WeightedList}. + * This method does not enforce type checking for the {@link WeightedElement.value} property of the given elements in the list. + * + * @see {@link WeightedElementUtility.isGenericWeightedList} + * + * @param {unknown} list - The list to validate. + * + * @returns {void} + * + * @throws {TypeError} - If the given list is not a valid {@link WeightedList}. + * + * @private + */ static #validateWeightedList(list: unknown): void { if (!WeightedElementUtility.isGenericWeightedList(list)) { throw new TypeError('Input does not match schema requirements for weighted list'); From 291fe0de42a1d2f38fd38d5a5bf1f864f65e0a5c Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 12:19:32 -0500 Subject: [PATCH 049/122] Update resources-and-references.md --- docs/resources-and-references.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/resources-and-references.md b/docs/resources-and-references.md index 943eec8..2888516 100644 --- a/docs/resources-and-references.md +++ b/docs/resources-and-references.md @@ -15,6 +15,10 @@ toc: true - [MDN Web Docs - Number.isFinite()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite) - [MDN Web Docs - Number.isInteger()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isInteger) +### TypeScript + +- [TypeScript Reference - Enums](https://www.typescriptlang.org/docs/handbook/enums.html) + ## Pseudorandom Number Generation - [Xoshiro128** Algorithm](https://github.com/bryc/code/blob/master/jshash/PRNGs.md#xoshiro) From a0f68ee1a3f64b7f0d70d5b1eb3731d8d6473399 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 12:19:50 -0500 Subject: [PATCH 050/122] Add TSDocs to discriminators.ts --- src/discriminator/discriminators.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/discriminator/discriminators.ts b/src/discriminator/discriminators.ts index 3e1fd5e..27bad84 100644 --- a/src/discriminator/discriminators.ts +++ b/src/discriminator/discriminators.ts @@ -18,6 +18,16 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/** + * Valid discriminators for package types and interfaces. + * + * @since 0.1.0 + */ export enum Discriminators { - WeightedElement = '@blwat/utils:WeightedElement' + /** + * Discriminator value for the WeightedElement interface. + * + * @since 0.1.0 + */ + WeightedElement = '@blwat/utils:WeightedElement' } From 5beac10b23ac89f857eb32a6d17eaa78f5ac88d8 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 12:52:24 -0500 Subject: [PATCH 051/122] Update TSDocs in weighted-element-utility.ts and random.ts. Make validateWeightedList method public. --- src/random/random.ts | 25 +++++++- .../weighted-element-utility.ts | 61 ++++++++++--------- 2 files changed, 55 insertions(+), 31 deletions(-) diff --git a/src/random/random.ts b/src/random/random.ts index 15ac799..880e9b9 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -20,6 +20,7 @@ import { NumberUtility } from '../number'; import { WeightedList } from './weighed-element/weighted-element'; +import {WeightedElementUtility} from "./weighed-element"; /** * Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays. @@ -129,8 +130,30 @@ export class Random { return elements[Random.randomInt(0, elements.length)]; } + /** + * @see {@link WeightedElementUtility.isGenericWeightedList} + * @see {@link WeightedElementUtility.isGenericWeightedElement} + * + * @param {WeightedList} elements - The {@link WeightedList} to select a random element from. + * + * @returns {Type} A random element from the given {@link WeightedList}, where the selection probability is equal to the {@link WeightedElement.weight} of each element. + * + * @throws {TypeError} - When the given list is not a valid {@link WeightedList}. + * For a {@link WeightedList} to be valid, it must be a non-empty array of {@link WeightedElement} objects, where the sum of {@link WeightedElement.weight} properties in the array is equal to 1. + */ public static randomWeightedElement(elements: WeightedList): Type { - return elements[0].value; + WeightedElementUtility.validateWeightedList(elements); + const r: number = Random.random(); + let cumulativeWeight: number = 0; + + for (const element of elements) { + cumulativeWeight += element.weight; + if (r < cumulativeWeight) { + return element.value; + } + } + + return elements[elements.length - 1].value; } /** diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index 94adacb..0b83a4e 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -66,8 +66,8 @@ export class WeightedElementUtility { * * @returns {WeightedElement} A {@link WeightedElement} object with a value of the given type. * - * @throws {TypeError} - If the given input is not an object. - * @throws {TypeError} - If the given input does not result in a valid {@link WeightedElement}. + * @throws {TypeError} - When the given input is not an object. + * @throws {TypeError} - When the given input does not result in a valid {@link WeightedElement}. * See {@link weightedElementSchema} for the requirements of a valid {@link WeightedElement}. * * @public @@ -93,8 +93,8 @@ export class WeightedElementUtility { * * @returns {WeightedList} A {@link WeightedList} object containing the given elements. * - * @throws {TypeError} - If the given elements are not a non-empty array. - * @throws {TypeError} - If the given elements do not result in a valid {@link WeightedList}. + * @throws {TypeError} - When the given elements are not a non-empty array. + * @throws {TypeError} - When the given elements do not result in a valid {@link WeightedList}. * * @public * @since 0.1.0 @@ -106,7 +106,7 @@ export class WeightedElementUtility { return WeightedElementUtility.buildWeightedElement(element); }); - WeightedElementUtility.#validateWeightedList(weightedElements); + WeightedElementUtility.validateWeightedList(weightedElements); return weightedElements; } @@ -135,7 +135,7 @@ export class WeightedElementUtility { * * @returns {input is WeightedElement} - `true` if the given input is a {@link WeightedElement} object with a value of the correct type; `false` otherwise. * - * @throws {TypeError} - If the given `valueTypeGuard` is not a function. + * @throws {TypeError} - When the given `valueTypeGuard` is not a function. * * @public * @since 0.1.0 @@ -193,7 +193,7 @@ export class WeightedElementUtility { * @returns {input is WeightedList} - `true` if the given input is a {@link WeightedList} object with elements of the correct type; `false` otherwise. * For a {@link WeightedList} to be valid, it must be a non-empty array of {@link WeightedElement} objects, where the sum of {@link WeightedElement.weight} properties in the array is equal to 1. * - * @throws {TypeError} - If the given `valueTypeGuard` is not a function. + * @throws {TypeError} - When the given `valueTypeGuard` is not a function. * * @public * @since 0.1.0 @@ -212,6 +212,27 @@ export class WeightedElementUtility { }, true); } + /** + * Validate that an object is a valid {@link WeightedList}. + * This method does not enforce type checking for the {@link WeightedElement.value} property of the given elements in the list. + * + * @see {@link WeightedElementUtility.isGenericWeightedList} + * + * @param {unknown} list - The list to validate. + * + * @returns {void} + * + * @throws {TypeError} - When the given list is not a valid {@link WeightedList}. + * + * @public + * @since 0.1.0 + */ + static validateWeightedList(list: unknown): void { + if (!WeightedElementUtility.isGenericWeightedList(list)) { + throw new TypeError('Input does not match schema requirements for weighted list'); + } + } + /** * Validate the input of {@link WeightedElement.buildWeightedElement}. * @@ -219,7 +240,7 @@ export class WeightedElementUtility { * * @returns {void} * - * @throws {TypeError} - If the given input is not an object. + * @throws {TypeError} - When the given input is not an object. * * @private */ @@ -236,7 +257,7 @@ export class WeightedElementUtility { * * @returns {void} * - * @throws {TypeError} - If the given input is not a non-empty array. + * @throws {TypeError} - When the given input is not a non-empty array. * * @private */ @@ -256,7 +277,7 @@ export class WeightedElementUtility { * * @returns {void} * - * @throws {TypeError} - If the given element is not a valid {@link WeightedElement}. + * @throws {TypeError} - When the given element is not a valid {@link WeightedElement}. * * @private */ @@ -265,24 +286,4 @@ export class WeightedElementUtility { throw new TypeError(`Element does not match schema requirements for weighted element`); } } - - /** - * Validate that an object is a valid {@link WeightedList}. - * This method does not enforce type checking for the {@link WeightedElement.value} property of the given elements in the list. - * - * @see {@link WeightedElementUtility.isGenericWeightedList} - * - * @param {unknown} list - The list to validate. - * - * @returns {void} - * - * @throws {TypeError} - If the given list is not a valid {@link WeightedList}. - * - * @private - */ - static #validateWeightedList(list: unknown): void { - if (!WeightedElementUtility.isGenericWeightedList(list)) { - throw new TypeError('Input does not match schema requirements for weighted list'); - } - } } From 91940f143510c5d111f28c570ff840a2d0afc423 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 12:58:04 -0500 Subject: [PATCH 052/122] Fix linting errors. --- src/discriminator/discriminators.ts | 2 +- src/random/random.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/discriminator/discriminators.ts b/src/discriminator/discriminators.ts index 27bad84..28d0032 100644 --- a/src/discriminator/discriminators.ts +++ b/src/discriminator/discriminators.ts @@ -29,5 +29,5 @@ export enum Discriminators { * * @since 0.1.0 */ - WeightedElement = '@blwat/utils:WeightedElement' + WeightedElement = '@blwat/utils:WeightedElement' } diff --git a/src/random/random.ts b/src/random/random.ts index 880e9b9..1509b73 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -19,8 +19,8 @@ */ import { NumberUtility } from '../number'; -import { WeightedList } from './weighed-element/weighted-element'; -import {WeightedElementUtility} from "./weighed-element"; + +import { WeightedElementUtility, WeightedList } from './weighed-element'; /** * Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays. From f40fab930b35791dcc69b0bf335275bf5b7c431b Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 12:58:09 -0500 Subject: [PATCH 053/122] Add discriminators.test.ts --- test/discriminator/discriminators.test.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/test/discriminator/discriminators.test.ts b/test/discriminator/discriminators.test.ts index 3e00bd4..4905074 100644 --- a/test/discriminator/discriminators.test.ts +++ b/test/discriminator/discriminators.test.ts @@ -18,6 +18,14 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { test } from 'vitest'; +import { describe, test, expect } from 'vitest'; -test.todo('All discriminators should be unique'); +import { Discriminators } from '../../src'; + +describe('Discriminators', (): void => { + test('All discriminators should be unique', (): void => { + const discriminatorsArray: Discriminators[] = Array.from(Object.values(Discriminators)); + const uniqueDiscriminators = new Set(discriminatorsArray); + expect(uniqueDiscriminators.size).toBe(discriminatorsArray.length); + }); +}); From 161383c952d84400f10869a7d3cc7137cfde2af2 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 13:05:18 -0500 Subject: [PATCH 054/122] Update TSDocs in random module --- src/random/random.ts | 3 +++ src/random/weighed-element/weighted-element.ts | 4 ++++ 2 files changed, 7 insertions(+) diff --git a/src/random/random.ts b/src/random/random.ts index 1509b73..daedad6 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -140,6 +140,9 @@ export class Random { * * @throws {TypeError} - When the given list is not a valid {@link WeightedList}. * For a {@link WeightedList} to be valid, it must be a non-empty array of {@link WeightedElement} objects, where the sum of {@link WeightedElement.weight} properties in the array is equal to 1. + * + * @public + * @since 0.1.0 */ public static randomWeightedElement(elements: WeightedList): Type { WeightedElementUtility.validateWeightedList(elements); diff --git a/src/random/weighed-element/weighted-element.ts b/src/random/weighed-element/weighted-element.ts index 9211d3b..7fd4dba 100644 --- a/src/random/weighed-element/weighted-element.ts +++ b/src/random/weighed-element/weighted-element.ts @@ -105,5 +105,9 @@ export interface WeightedElement { /** * Type alias for a list of {@link WeightedElement} objects. + * + * @see {weightedElementSchema} + * + * @since 0.1.0 */ export type WeightedList = WeightedElement[]; From 7bb0c9ca134d5a8c2aceaa23f86eb840ad79fc79 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 13:05:37 -0500 Subject: [PATCH 055/122] Update generated docs for v0.1.0-alpha.3 --- .../v0.1.0-alpha.3/doc/assets/navigation.js | 2 +- .../v0.1.0-alpha.3/doc/assets/search.js | 2 +- .../discriminator.DiscriminatorRegistry.html | 8 +- .../doc/classes/number.NumberUtility.html | 8 +- .../doc/classes/random.Random.html | 43 ++++++++++ .../random.RandomNumberGeneratorFactory.html | 6 +- .../doc/classes/random.SeedVersions.html | 8 +- .../random.SeededRandomNumberGenerator.html | 6 +- .../random.WeightedElementUtility.html | 82 +++++++++++++++++++ .../classes/string.ColorStringUtility.html | 14 ++-- .../doc/classes/string.StringUtility.html | 18 ++-- .../enums/discriminator.Discriminators.html | 6 ++ .../v0.1.0-alpha.3/doc/index.html | 2 +- ...scriminator.DiscriminatorRegistration.html | 6 +- .../doc/interfaces/random.SeedVersion.html | 4 +- .../interfaces/random.WeightedElement.html | 13 +++ .../doc/modules/discriminator.html | 2 +- .../v0.1.0-alpha.3/doc/modules/random.html | 2 +- .../types/discriminator.Discriminated.html | 2 +- .../doc/types/discriminator.TypeGuard.html | 2 +- .../doc/types/random.WeightedList.html | 3 + .../discriminator.discriminatedSchema.html | 2 +- .../random.weightedElementSchema.html | 3 + 23 files changed, 197 insertions(+), 47 deletions(-) create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.Random.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.WeightedElementUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.WeightedElement.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/random.WeightedList.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/random.weightedElementSchema.html diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js index 69c1398..b715950 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "eJytlE1PAjEQhv+KmfNGZQ1+7I1gJB70AMqFcCjbkZ3YbUlbjMTw3w1b2M+yrJHsrZ33fd5OZzv7AYvfFiJ4UXwt0EAAcUKCa5QQzfJdTibWlJJkVmkIYMVsAhGkTnRV2b5MbCoggE+SHKLQbzgUzJijuMey3xiXZKzeFNjYiWtYr6gaphfeb+fbIOc8S4v6g8V/CsIsKVmEodyjQ55MW2tQ/7aS6W2zwouBINapPciLJHazaguBvAa+frjr9cMaerRm+oRnXub3Kx9myjSxRae5Qj6JE0xZwf46iGt8j6ia5GYXohxDrtMFeubWrZ9hYF8zo3dLgqxnUPecSpVvMsuZNZNcpc3Mbv0MmceZkcs0Qol619wnFlvl+9f22DZR80TFaSaIHLlXfZTVojmFmqI2pKRp9T4U/fONKFl5X4Um0fcAlJHGapLL5tW79TNc/VAJpSeZ29GZ3cOapa297+R5wm7uvl/sIVKP" \ No newline at end of file +window.navigationData = "eJytlElPwzAQhf8K8jliKSpLb6iUCgk4tFAOVQ9uPDQWtlPZDlCh/neUPXacBbXqLZl535t05i1/kYYfjUboOSQRA4U85AeUEQkCjZbFW0KVLymnAutQIg9tsQ7QCPG06cx4fRpozpCHPqkgaDRwC05ExEFiTUPRxLyviqoSCiLiNtKsNR3c7Fd7r1AdM6xU45yGzgw2VGm5K9F+2twGz5tMDxcD08Wj0CA/sP8vI8nXKs3QQqOHn6TX+meGV4an190WTu4Yxb0+D5DSid5t20wAscDnt9cXw4GFnkZYdmgWZW696jALLCle91poIHM/AI5L9lfebPEdTaaTy9hE1YaI+BocB5M+73Up7Qv7kgi9acqodixqxjGqXJtZ9SyxICGve06fH8HzzALkZjPAzMGJXXqWQDrUFEScI6F8wL4OXcdqyLqb2mBzAALE2d3IaunpQi1AqiwUm7Xzojaxd6CbQAOZMOAgdOOKZLLu8gNTrOLVmVv1keoR1ThRm6JVenDw5XpPVGk7oyxkXHJ4Pn2bAzQnVEZ31neEk9KSik390NPnRzj0cchCOU/UGtcvg9VLWw+ll2aH3Cr9/QHQ6SnC" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js index 55b2924..b972ef9 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js @@ -1 +1 @@ -window.searchData = "eJy1mt1u2zgQhd+FvhVS88d27Lt2d9stUBRF0/bGCBaKxTjE2pIhyWmyQd59QUmWZsSRTMvOXSDrHB6Sn8iJxBeWJr8ztli+sH9NHLGFCFgcbjVbsMhkq9RsTRzmScoCtk83bMG2SbTf6Owd+vXqId9uWMBWmzDLdMYWjL0GB0curmvPP6Hqu16bLE+fa+9K3vImNUSLAduFqY5zJ3oTRYxVk+UhzAa3PCrFHq3TJl2Z0uJ3nQ4PBhwunu4x3JgozPXwdMDhIukm0160wtwkcZ3WxLlO78OVV+BCOowyPhbqyFM0MMqo7TZ0EMuB6YhcTdIF4kKnS0UV4/mMTwQ17zqqE+fPu76wOhq6gODGfzzv9Kd9mPY3XN81rFFJrsk6ulk96G1Yt/wYpia8c9dmQjOw83WMeL+90+6eUF723gy+Frf/zM3G5O4mUJmhm/pzV6k6Fi+TfTSxyfVXnP1ocyOT3RfCutN9rWOD7iyf41yvT4xhas0lEnxLMpObRz0kya7Snpuo2ffCOEq2DlDlZW+gvhe3l6190rFOLcAfw1WeEEVG5d2n6cetytwxwGH2HK8+7M0mGtzyqPC4qzz6QvR6dSW8Oy/cJXPBSbzROtIRKewK2yM5cQonvGFylcRZnu5XZzQ8wh69Q9XX744ZjPVTPjhaJb5Apvbs/dJpZpLYra6B6+GeUx+xqeCqqVQy859bjHa1MqruPtrjOn/HsK91Xt3i3/Za54+15uwEJvtlK6vPcaSf/DOYrKjHTKUalAIU3OAWqlB0jU6ca1STJvf3mc6zExoaNRLfnpJbU5anJl47W1N52Xtr+iPZJOlNoekqeCpH987+cavydT4jD/qpsPwW5rlOXWT7mx096KeV/WlXy/tiEDbeyb5/+nBmuHR997b53p8fMDwvIV4F/q4SnhrLZIdgb5FmwEQ2gc6ew85MJ08eCnXevKEt0mcVuOACkJl4vdFfTKy/JL91ugoz/SM1262OjiwJxJCUXhsT683BKy+9PNcHz0evyXyBqG+c8Odud7FR3R+8LpQZPwxfk/iv7S5/vsFb2vGAJouTWFtpvRteIs9NJ5kDEnaj+UaZLxH1bRO2yTwrahvNy2YekGxI+7cBK8vfxQs71OMLJq7k1ZwF7N7oTWQ/hpTBArZKtltrF7AoWe2LP2+r235p+0+dvbm8+92YBctxIOZXUs5vb4PlQVz8UFw4eDRXCiFnwZIHUl0pNUNC7gg5EgoWLAUlFI5QIKFkwVJSQukIJRIqFiwVJVSOUCHhhAXLCSWcOMIJEk67RnXqCKdIOGPBckq1OHOEMyS8ZsFyRgmvHeE1Es5ZsLymhHNHOMcAWB7mJAEuO7wFT0HPmBQT/GCAuMWC0+y5DHEMEbdocJI/7nLEMUjc4sFJBrnLEscwcYsIJznkLk8cA8UtJpxkkbtMcQwVt6hwEivucsUxWNziwkm0uMsWx3Bxiwwn8eIuXxwDJiwznCRMuIQJTJiwzAiSMOESJlpLVLFGkYQJYpXChAnLjKBXOJcwgQkTlhlBEiZcwgQmTFhmBEmYcAkTmDBhmREkYcIlTGDChGVGkIQJlzCBCROWGUESJlzCBCZMWGYESZhwCROYMGmZESRh0iVMYsKkZUaShEmXMIkJk5YZSRImXcJkayMsdkKSMEnshZgwaZmR9D7qEiYxYdIyI0nCpEuYxIRJy4wkCZMuYRITJi0zkiRMuoRJTJi0zEiSMOkSJjFh0jIjScKkS5jEhCnLjCQJUy5hChOmLDOKJEy5hClMmLLMKJIw5RKmMGHKMqNIwpRLmGqVW0W9RRKmiIoLE6YsM4qu1lzCqktFffyo01xXL5dteQs/Q72wf6oCms8O9fsL49ds8fL62hTMi5dXUDPb32xrrsc18Jh7eRTvY8rifn94hdIYinljKMeehuATDXAaN06CezlF+CRC4wVGym+gkFNWfeZv/EAnuV8nW+dGGivQy3GpnZ5umKLTNo35pDGfDHZF88tBz70c4XcXMLkKTK5ftOLAF3AABn769nv0xkuCSZB+3aJefANDMExyULzyhSdwBP2V0suxfWwCTCIw475mzQtrkEqCVOpEo/aYASSkHxLt98PADJAv/R4ocLwDjBToIPftYPtVXWOnAGjKDzTirAeIB8aM+47Z8fd0IDAAWfmB3PN2DfgCApUvgcdfhYEGwMQp34kjbMAAK98Bhh95wYIFkBR+SJYnBIAFmA3hNxvEww8Y5H4MlibEbs/hduAXqP4oDLoFtmfhtz8fjiuBKGB4ud/wliZl59aHYxX3h9NKwHoKrGd+1vUhYLAmgSXJyyQrDn+QKVE8UI0Iv2rEOlO7Muio8OsocMJzCvdnz+4e/7QFBhMwI/2Y6f4eBWxBPSz96mGPb0fAH8yV8pyr4tAMGFnAkfBb2dx1TYB+Cs9+dpX8ElAj/aixZ3TX5andxgdE8kvUnGUHCzYY31NM8CMFeuTRoduA7cyuQIAtlrevr/8DVXu+WQ=="; \ No newline at end of file +window.searchData = "eJy1nF1v2zoShv+LfCvkmJ+JfbfdPe0WKIqD9pzuhREsHJtxhLVlQ5LTZoP89wNKsjSjGdmU7VwlsDUvX5IPhxQl+jXKtj/zaDp7jf6XpMtoKuMonW9cNI2WSb7Ikk2SzottFsXRPltH02izXe7XLv8NfXvzVGzWURwt1vM8d3k0jaK3+KB41yj+C8bkjaRL95uuIL6U0Y+j3TxzaUGMtgUL25T8H5esngq3/H3tNj5oYNGjn3W8a+IDrHSUoDPZ0yjf3CrJi+ylMVgXc8ziIea8RpJj3Xp5mudnlzyqgge3S1PlHk9Z+b3LzjcGFK7u7nm+Tpbzwp3vDihcxZ2xR9GaF8k2bdwmaeGyx/kiyHAZeuZQHEt9IrGcaWXUVTu3EauG6bFcd9IV7EKla1mV48mtMJLrd7dsHBcvu2Nm3fLcBIIL//Nl5z7t59nxgpurzitUsdOUW35fPLnNvCn5eZ4l8wc6XTExZ1a+sZHuNw+OTpPVx0fnRzgZfC0v/6tI1klBJ4FaDF103Hftqid5JfnHJE0K9xV7P1ncKMkfy8Cm0sdKxwL9Xj6nhVsNtJE0Mddw8Mc2T4rk2Z3jZFfHXuqonffm6XK7IUBVHwcD9Q2rHGpSq3zrEwOGax/AopVCa+QzQH9UX3eskPr63pVAaF1GzZUXl/Zhu127eRpe6EMTcHHZ3cXqybJPrU4HlP1xvZ0PKPmxvvzicj8PqW9ynbr23RycLD/0rqDPCx2oVVr45FKX+Znm43xRbJm7ASTIxwwd1LBZ5vlLuviwT9YnBvaRkkelxkOtEdAsPTXvcfhwmblr+oKd+N25pVuygX1mj4QM7EIj2sljsU3zItsvLih4hDWONtWxevf0YOp+9Y60k9bq4Ct46vbeD5flyTalt8FA9XDNZfNmnvyf3jX2lTKqrz5Z48Z/T7OvXFFfEl72yhXPTczFDpL8h78F+pwu3a9wD0le3jglddQ5LmBXd1J+34K7FuSvviTDlgkocN45UnqVyAZOQz11D3H6Jckvt7muRK7oMcnLoZ0srtCiSb6qtN61VYnjc1uW2H2P1r1Ks75ze17ekO/Xgoctvks9HnSu6xRsGILMyW100fw6MAeiPbXt42PuinxAQaM2JHQC6KloH9HUQ+fKSyp8ct/zSJGB25y8wpFdzb0bauQQdA0DFchDHTRRZ1ro7liyw7LatOxo+SsGEgB2Kn9iR717lXWh7OVDFx3tcrPIknRFtpOqj4O3k/65XW+z72VM35qpVqRXHrde++tdLj+5X6XkH/OicBldvR4vdvTkfi38V7sm/JgNRibY2bdPHy40l60e3tffPy43OL/MIZ67/107HGoryQ/G3sPNGR3ZGrq4D3s9De48ZOqyfkN3yyFZ4IoJIE/S1dp9SVL3ZfvTZYt57v7Mks3GLU+kBKZJKq11krr1QauotALzQ+DQaz1fweo7O/xrt7taq+4PWlfyjAfD1236+2ZXvHzHU9ppg0meblPnQ5vZ8Bp+vveSeYbDfjTfyfM1rL6vwy6ZF1ntonldz2c4O6f8+ziqdsKmr9Fha24ayRt1M4ni6DFx66V/p6syFkeL7aa+y1luF/vy3/v6sh9uUb6bNJ1VV/82juLZOFbjm/Fkcn8fzw7B5RflBweN9pMyUETxTMTq7sbcShQoSKBAgTKKZzJW6kZbjQIlCZQoUEXxTHElKhKoUKCO4pnmAjUJ1CjQRPHMcIGGBBoUaKN4ZrlASwItCryN4tktF3hLAm9R4F1fP96RwDsUOIni2R1X4oQETjAAnocJSwBlR3TgKekZs8EMPxgg4bEQPHuUIYEhEh4NIdlgypHAIAmPh2AZFJQlgWESHhHBcigoTwIDJTwmgmVRUKYEhkp4VATLo6BcCQyW8LiIWw4tQdkSGC4x6Q+mfAkMmPTMCJZNSQmTmDApekuWlDDZSVElYSzbkslSmDDpmZEs25ISJjFh0jMjWbYlJUxiwqRnRrJsS0qYxIRJz4xk2ZaUMIkJk54ZybItKWESEyY9M5JlW1LCJCZMemYky7akhElMmPLMSDbfKkqYwoQpz4xk8VSUMIUJU+UsyBKmKGGqMxGWMyFLmGLmQkyY8swoljBFCVOYMOWZUSxhihKmMGHKM6P4GZwSpjBhyjOjWMIUJUxhwpRnRrGEKUqYwoQpz4xiCVOUMIUJ054ZxRKmKWEaE6Y9M4olTFPCNCZMe2YUS5imhGlMmPbMaJYwTQnTneVWud5iCdPMigsTpj0zmiVMU8I0Jkx7ZjRLmKaEaUyYvu1bmGoKmMaA6d7ll6Z8acyX9sRofn1K+dKYL+OJ0fwalfJlMF/GE6NZsg3ly2C+jCdGs2QbypfBfJmSL5ZsQ/kymC9T8sWSbShfprOkL9f0LNmGWdVjvownxrBkG8qXwXwZj4xhyTYUMIMBM54Zw5JtKGEGE2Y8M4YlzFDCDCbMemYMS5ilhFlMmPXMGP5OiBJmMWHWM2NYwiwlzGLCrGfGsIRZSpjFhFnPjGEJs5QwiwmznhnLEmYpYbZz41jeObKEWebeERNmPTOWJcxSwiwmzHpmLEuYpYRZTJj1zFiWMEsJqz8qdzWeXVa4+u0gvykB3yN8jf5bb3tIc9h1eY3kXTR9fXtrtzmmr29gp8N/50ujGhZoTMI1yIsMraQCttQAW/iBPtADFlWYxXKjv9o12h/25ltBPWkFjQ4UBK8Bgta7A9ZEkNISH0tptYApMR4uldcPUltBIYCiHKqIKzpupcZV7F31R4d1MBLO0CGstpDbtpDbs1VRTyvQPcMVc9SaoDGDpOALg8CRBJZMkFB5pBDQ2wqEsUue+rZaBvSrCXTDPKYFgqCZjD1TEFFsQIOZMCy6B3NAJ4LGE2H17X8VDnQqIFeHjd2eV9aAJkgtOow4+CQYNCAYBCZstHae4AIt0H4mLBV3H7wCMTBP2NBWa04WgU4FOiKMOfoMrJWzYEzYUEbIwSdgD0xfIhTg0w/AgGEw5mxo/XsfWwFdMPLscON9z5hAAYBMG0omIwOgtKFQwhepwaCDE0ZoUx5LDGBS12FTcPcVTJD4AZg6bDqrjgiA9Qrwo8L8MEkUcCECfZQizFJMgAYXYdNZ8/ojaBmgosO6rTqIB4yAdCvDktHhfB0QAfOAqBdIYlL9lWE5vHN+DmiDrpNhXdc5DwcwACTJsB5EJ9yAEsg9Mqz/wKk1oAOYkmFJt9KpyFodDrU8Hs6KAWmQHmRYGus52AY0AXAyELjm9xfADAhm0yCRvDzOw9Yc2QMcqjCYvTKzXNWgX3S4x+fmABHIhQA6FQZdwBtKoDFBpW3YAOl/rQjIgsRgh9rufQUI6INxbcNGUHUMCrQsGIQqUILMohrU0wTWs+8G24Aljw3Le/5N41X1gwkg5wFkRJhO+0MiYIEA3AwS6Z2JQYPrsAYHv3jR6oAmD1u3PFevnQMn8G4wTOPw4jgQgXkoLF0cy40gNVbROizrdjTphoYGI9yEjfCOJsOqAi2ohhklWADQTACu93G0S3Zlooims/u3t78BSY31CA=="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html index 83f80a3..787bac5 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html @@ -1,7 +1,7 @@ DiscriminatorRegistry | @blwat/utils - v0.1.0-alpha.3

    Class DiscriminatorRegistry

    Static registry for managing discriminators and their associated type guards. Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

    0.1.0

    -
    Index

    Methods

    has +
    Index

    Methods

    • Checks if a discriminator is already registered.

      @@ -10,7 +10,7 @@
    • true if the discriminator is registered, false otherwise.

    0.1.0

    -
    • Validates an input against a specific discriminator.

      Parameters

      • input: unknown

        The input to validate.

      • discriminator: string

        The discriminator value to check.

      Returns boolean

      • true if the input matches the type associated with the discriminator, false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html index b5664fd..3e1e1a7 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html @@ -1,18 +1,18 @@ NumberUtility | @blwat/utils - v0.1.0-alpha.3

    Class NumberUtility

    Static properties and methods for validating number types.

    0.1.0

    -
    Index
    Index

    Methods

    • Is the given input a finite number?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is a finite number; false otherwise.

      0.1.0

      -
    • Is the given input an integer?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is an integer; false otherwise.

      0.1.0

      -
    • Is the given input a positive integer?

      +
    • Is the given input a positive integer?

      Parameters

      • input: unknown
      • zeroInclusive: boolean = false

        true if zero should be considered a valid input. false if zero should be considered an invalid input. Default value is false.

      Returns input is number

      true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.Random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.Random.html new file mode 100644 index 0000000..ebb701c --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.Random.html @@ -0,0 +1,43 @@ +Random | @blwat/utils - v0.1.0-alpha.3

    Class Random

    Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays.

    +

    0.1.0

    +
    Index

    Accessors

    • set rand(rand: () => number): void

      Set the primary function used to generate random numbers.

      +

      Parameters

      • rand: () => number

        A function that returns a random number in the range [0, 1) (zero inclusive, one exclusive).

        +

      Returns void

        +
      • If the given rand is not a function.
      • +
      +

      0.1.0

      +

    Methods

    • Returns number

      A random number in the range [0, 1) (zero inclusive, one exclusive).

      +

      0.1.0

      +
    • Parameters

      • chanceOfTrue: number = 0.5

        The probability of returning true (between 0 and 1).

        +

      Returns boolean

      A random boolean value.

      +

      0.1.0

      +
    • Type Parameters

      • Type

      Parameters

      • elements: Type[]

        An array of elements to choose from.

        +

      Returns Type

      A random element from the array.

      +

      0.1.0

      +
    • Parameters

      • min: number

        The minimum value (inclusive).

        +
      • max: number

        The maximum value (exclusive).

        +

      Returns number

      A random floating-point number in the range [min, max) (min inclusive, max exclusive).

      +

      0.1.0

      +
    • Parameters

      • min: number

        The minimum value (inclusive).

        +
      • max: number

        The maximum value (exclusive).

        +

      Returns number

      A random integer in the range [min, max) (min inclusive, max exclusive).

      +

      0.1.0

      +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html index d894edc..d8f38fd 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html @@ -1,6 +1,6 @@ RandomNumberGeneratorFactory | @blwat/utils - v0.1.0-alpha.3

    Class RandomNumberGeneratorFactory

    A static factory class for creating a SeededRandomNumberGenerator object.

    0.1.0

    -
    Index

    Methods

    Index

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html index a8ef8f4..85b13b5 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html @@ -1,14 +1,14 @@ SeedVersions | @blwat/utils - v0.1.0-alpha.3

    Class SeedVersions

    A static class for accessing different seed versions. Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    Methods

    Accessors

    Methods

    Methods

    • Parameters

      • index: number

        The index of the seed version to retrieve. Must be a valid SeedVersions index.

      Returns SeedVersion

      • The seed version with the given index.
      • @@ -17,7 +17,7 @@
      • If the index is not a valid seed version index.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html index 571b86a..ca49b18 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html @@ -1,7 +1,7 @@ SeededRandomNumberGenerator | @blwat/utils - v0.1.0-alpha.3

    Class SeededRandomNumberGenerator

    Deterministic seeded pseudorandom number generator. This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

    0.1.0

    -
    Index

    Constructors

    Index

    Constructors

    Methods

    Constructors

    • Parameters

      • state: [number, number, number, number]

        Initial 128-bit state. Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

        @@ -9,10 +9,10 @@

        If each element of state is not a 32-bit unsigned integer.

        If state does not have at least one element that is greater than 0.

        0.1.0

        -

    Methods

    • Returns number

        +

    Methods

    • Returns number

      • The next pseudorandom float in the range [0, 1).

      This method advances the internal 128-bit xoshiro128** state by one step. Successive calls produce an independent, uniformly distributed sequence.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.WeightedElementUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.WeightedElementUtility.html new file mode 100644 index 0000000..bb7b6ff --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.WeightedElementUtility.html @@ -0,0 +1,82 @@ +WeightedElementUtility | @blwat/utils - v0.1.0-alpha.3

    Class WeightedElementUtility

    Static methods and properties for building and validating WeightedElement and WeightedList objects.

    +

    0.1.0

    +
    Index

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html index 9770a27..96b8e17 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html @@ -1,6 +1,6 @@ ColorStringUtility | @blwat/utils - v0.1.0-alpha.3

    Class ColorStringUtility

    Static properties and methods for validating formatted color strings.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    • get hexColorPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -
    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. +

    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -
    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. +

    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -

    Methods

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html index 593511a..dd1dd38 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html @@ -1,6 +1,6 @@ StringUtility | @blwat/utils - v0.1.0-alpha.3

    Class StringUtility

    Static properties and methods for validating string types.

    0.1.0

    -
    Index
    Index

    Accessors

    • get singleLineLowercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line lowercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      +
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      +
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -

    Methods

    Methods

    • Is the given input a non-empty string? Non-empty strings must contain at least one non-whitespace character.

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -
    • Is the given input a single-line lowercase string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a single-line string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a single-line uppercase string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a string?

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html new file mode 100644 index 0000000..5690fa8 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html @@ -0,0 +1,6 @@ +Discriminators | @blwat/utils - v0.1.0-alpha.3

    Enumeration Discriminators

    Valid discriminators for package types and interfaces.

    +

    0.1.0

    +
    Index

    Enumeration Members

    Enumeration Members

    WeightedElement: "@blwat/utils:WeightedElement"

    Discriminator value for the WeightedElement interface.

    +

    0.1.0

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html index 11b4d05..52c2c89 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html @@ -52,7 +52,7 @@

    A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation.

    -

    A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. +

    A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of algorithmic art, web development, and computer science. Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer.


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html index 805117c..304da60 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -1,14 +1,14 @@ DiscriminatorRegistration | @blwat/utils - v0.1.0-alpha.3

    Interface DiscriminatorRegistration

    A registration for a discriminator to the DiscriminatorRegistry.

    0.1.0

    -
    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    discriminator: string

    The discriminator value that identifies the type of a Discriminated object. This value must be unique across all registered discriminators.

    0.1.0

    -
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    +
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    Type Declaration

      • (input: unknown): boolean
      • Parameters

        • input: unknown

          The input to validate.

        Returns boolean

        • true if the input matches the type associated with the discriminator, false otherwise.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html index 0440fca..96c55d9 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html @@ -1,8 +1,8 @@ SeedVersion | @blwat/utils - v0.1.0-alpha.3

    Interface SeedVersion

    A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

    0.1.0

    -
    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    Properties

    offsets: readonly [number, number, number, number]

    A collection of offset values for the FNV-1a hashing algorithm. Each offset value should be a 32-bit unsigned integer.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.WeightedElement.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.WeightedElement.html new file mode 100644 index 0000000..8f80ad2 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.WeightedElement.html @@ -0,0 +1,13 @@ +WeightedElement | @blwat/utils - v0.1.0-alpha.3

    Interface WeightedElement<Type>

    Interface for a weighted element, which can be used for non-uniform random selection from a list.

    +

    0.1.0

    +
    interface WeightedElement<Type> {
        discriminator: WeightedElement;
        value: Type;
        weight: number;
    }

    Type Parameters

    • Type
    Index

    Properties

    Properties

    discriminator: WeightedElement

    The discriminator for the weighted element.

    +

    0.1.0

    +
    value: Type

    The value to be selected from the weighted list.

    +

    0.1.0

    +
    weight: number

    The probability weight of the element. +Should be a number between 0 and 1, inclusive.

    +

    0.1.0

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html index 0f75c72..e721c31 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html @@ -1 +1 @@ -discriminator | @blwat/utils - v0.1.0-alpha.3

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +discriminator | @blwat/utils - v0.1.0-alpha.3

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html index d8d8edb..1ce245f 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html @@ -1 +1 @@ -random | @blwat/utils - v0.1.0-alpha.3

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +random | @blwat/utils - v0.1.0-alpha.3

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html index 43b5a85..ab3460a 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html @@ -1,3 +1,3 @@ Discriminated | @blwat/utils - v0.1.0-alpha.3

    Type Alias Discriminated

    Discriminated: Static<typeof discriminatedSchema>

    Discriminated objects can be type checked using the discriminator registry.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html index c49b642..5dcb426 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html @@ -1,3 +1,3 @@ TypeGuard | @blwat/utils - v0.1.0-alpha.3

    Type Alias TypeGuard<T>

    TypeGuard: (input: unknown) => input is T

    A type guard function that checks if an input is of a specific Discriminated type.

    Type Parameters

    Type Declaration

      • (input: unknown): input is T
      • Parameters

        • input: unknown

        Returns input is T

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/random.WeightedList.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/random.WeightedList.html new file mode 100644 index 0000000..57a9df0 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/random.WeightedList.html @@ -0,0 +1,3 @@ +WeightedList | @blwat/utils - v0.1.0-alpha.3

    Type Alias WeightedList<Type>

    WeightedList: WeightedElement<Type>[]

    Type alias for a list of WeightedElement objects.

    +

    Type Parameters

    • Type

    0.1.0

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html index 15c0078..44cfaf6 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html @@ -1,3 +1,3 @@ discriminatedSchema | @blwat/utils - v0.1.0-alpha.3

    Variable discriminatedSchemaConst

    discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

    TypeBox schema for validating that an object implements the Discriminated type.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/random.weightedElementSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/random.weightedElementSchema.html new file mode 100644 index 0000000..4551608 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/random.weightedElementSchema.html @@ -0,0 +1,3 @@ +weightedElementSchema | @blwat/utils - v0.1.0-alpha.3

    Variable weightedElementSchemaConst

    weightedElementSchema: TGeneric<
        [TParameter<"T", TUnknown, TUnknown>],
        TIntersect<
            [
                TObject<{ discriminator: TReadonly<TString> }>,
                TObject<
                    {
                        discriminator: TLiteral<WeightedElement>;
                        value: TReadonly<TRef<"T">>;
                        weight: TReadonly<TNumber>;
                    },
                >,
            ],
        >,
    > = ...

    TypeBox schema to validate a WeightedElement object.

    +

    0.1.0

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    From b2930c58ad032005e02ac8f4a5b4fbea1d91d3dc Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 14:30:58 -0500 Subject: [PATCH 056/122] Accepted updates from Claude Code pull request review. --- .github/copilot-instructions.md | 1 + docs/portfolio-skills.md | 7 +++++-- docs/resources-and-references.md | 2 +- package.json | 1 + src/random/random.ts | 2 ++ src/random/weighed-element/weighted-element-utility.ts | 6 +++--- src/random/weighed-element/weighted-element.ts | 2 +- 7 files changed, 14 insertions(+), 7 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index f76df85..f6e779a 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -187,6 +187,7 @@ Static utility classes must: When writing or reviewing code, follow these documentation standards for maximum compatibility: - **Use `@returns` instead of `@return`**: Always use `@returns` in documentation comments for compatibility with documentation generators. +- **Use `{@link ...}` syntax in `@see` tags**: Always use `{@link ClassName.method}` (or `{@link symbol}`) inside `@see` tags. Do not use bare `{ClassName.method}` without `@link`. - **Use `@param {type} name` format**: Always specify parameter types with the format `@param {type} name` (e.g., `@param {string} hex`) rather than `@param name {type}`. - **Always specify return types with `@returns`**: Include a type indicator in every `@returns` annotation (e.g., `@returns {boolean}`). - **Document void returns with `@returns {void}`**: For methods that do not return a value, explicitly use `@returns {void}`. diff --git a/docs/portfolio-skills.md b/docs/portfolio-skills.md index 68577eb..94eb302 100644 --- a/docs/portfolio-skills.md +++ b/docs/portfolio-skills.md @@ -5,7 +5,7 @@ author: - GitHub Copilot layout: post date: 2026-05-27 -modified_date: 2026-06-22 +modified_date: 2026-06-29 toc: true --- @@ -15,7 +15,7 @@ This page is a technical record of the skills, tools, and engineering practices ## Project Overview -TypeScript Utilities (`@blwat/utils`) is a growing, domain-agnostic utility package that provides reusable helpers for number checks, string checks, deterministic seeded pseudorandom number generation, and a discriminator-based type guard registry. The repository is maintained at [blwatkins/typescript-utils](https://github.com/blwatkins/typescript-utils), and it is built with TypeScript and tsdown. +TypeScript Utilities (`@blwat/utils`) is a growing, domain-agnostic utility package that provides reusable helpers for number checks, string checks, random number and element selection (including weighted selection), deterministic seeded pseudorandom number generation, and a discriminator-based type guard registry. The repository is maintained at [blwatkins/typescript-utils](https://github.com/blwatkins/typescript-utils), and it is built with TypeScript and tsdown. ## At a Glance @@ -54,6 +54,8 @@ TypeScript Utilities (`@blwat/utils`) is a growing, domain-agnostic utility pack - Implements reusable static utility classes for string and number type checks to improve consistency across consuming code. - Provides a static discriminator registry with TypeBox schema validation to enable runtime type narrowing and reusable type guard generation for discriminated union patterns. +- Provides a static `Random` class for generating random numbers, booleans, and selecting random elements from arrays, with a configurable underlying random function to enable use with seeded generators or custom sources. +- Provides typed weighted random selection via `WeightedElementUtility` and `WeightedList`, using discriminator-validated element objects and a cumulative-weight selection strategy, enabling non-uniform random sampling from explicit probability distributions. - Provides a deterministic seeded pseudorandom number generator (xoshiro128**) with synchronous (FNV-1a) and asynchronous (SHA-256 via Web Crypto API) seed-hashing strategies, enabling reproducible random sequences from string seeds. - Uses explicit package export and type declaration mappings to improve compatibility for ESM consumers and TypeScript tooling. - Applies strict TypeScript compiler settings and type-aware lint rules to improve early detection of implementation defects. @@ -138,5 +140,6 @@ Security analysis is automated with a dedicated CodeQL workflow covering Actions ## Current Gaps / Future Improvements - The package is currently in an alpha release line; additional utility domains and API surface are still being developed. +- Unit tests for the `Random` class are not yet implemented; the test file exists as a placeholder pending a future change set. - Tests currently focus on unit-level utility behavior; higher-level integration or consumer-facing examples are not yet part of the verification strategy. - Release documentation under `docs/releases/...` is maintained manually, which can increase maintenance overhead as release volume grows. diff --git a/docs/resources-and-references.md b/docs/resources-and-references.md index 2888516..21d58c7 100644 --- a/docs/resources-and-references.md +++ b/docs/resources-and-references.md @@ -4,7 +4,7 @@ author: - Brittni Watkins layout: post date: 2026-06-05 -modified_date: 2026-06-22 +modified_date: 2026-06-29 toc: true --- diff --git a/package.json b/package.json index bb82b60..f37a6e0 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "hex-color", "random", "seeded-random", + "weighted-random", "prng", "pseudorandom", "deterministic", diff --git a/src/random/random.ts b/src/random/random.ts index daedad6..d6eefb8 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -53,6 +53,8 @@ export class Random { * * @param {() => number} rand - A function that returns a random number in the range [0, 1) (zero inclusive, one exclusive). * + * @returns {void} + * * @throws {TypeError} - If the given rand is not a function. * * @public diff --git a/src/random/weighed-element/weighted-element-utility.ts b/src/random/weighed-element/weighted-element-utility.ts index 0b83a4e..3d50c10 100644 --- a/src/random/weighed-element/weighted-element-utility.ts +++ b/src/random/weighed-element/weighted-element-utility.ts @@ -44,7 +44,7 @@ export class WeightedElementUtility { /** * A type guard for {@link WeightedElement} objects. * - * @param input - The input to check. + * @param {unknown} input - The input to check. * * @returns {boolean} `true` if the input is a {@link WeightedElement}, `false` otherwise. * @@ -152,7 +152,7 @@ export class WeightedElementUtility { * Is the given input a {@link WeightedList} object? * This method does not enforce type checking for the {@link WeightedElement.value} property of the list elements. * - * @see {WeightedElementUtility.isGenericWeightedElement} + * @see {@link WeightedElementUtility.isGenericWeightedElement} * * @param {unknown} input - The input to check. * @@ -227,7 +227,7 @@ export class WeightedElementUtility { * @public * @since 0.1.0 */ - static validateWeightedList(list: unknown): void { + public static validateWeightedList(list: unknown): void { if (!WeightedElementUtility.isGenericWeightedList(list)) { throw new TypeError('Input does not match schema requirements for weighted list'); } diff --git a/src/random/weighed-element/weighted-element.ts b/src/random/weighed-element/weighted-element.ts index 7fd4dba..e16d7ae 100644 --- a/src/random/weighed-element/weighted-element.ts +++ b/src/random/weighed-element/weighted-element.ts @@ -106,7 +106,7 @@ export interface WeightedElement { /** * Type alias for a list of {@link WeightedElement} objects. * - * @see {weightedElementSchema} + * @see {@link weightedElementSchema} * * @since 0.1.0 */ From 072c15593efbd0cce473a8529196c17a68032e09 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 14:31:28 -0500 Subject: [PATCH 057/122] Update random.ts TSDocs --- src/random/random.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/random/random.ts b/src/random/random.ts index d6eefb8..6fc0518 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -55,7 +55,7 @@ export class Random { * * @returns {void} * - * @throws {TypeError} - If the given rand is not a function. + * @throws {TypeError} - If the given `rand` is not a function. * * @public * @since 0.1.0 From c4e7b48f9f02868eaecdc9ddd3f1675331e86167 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 14:32:33 -0500 Subject: [PATCH 058/122] Update generated docs for v0.1.0-alpha.3 --- .../discriminator.DiscriminatorRegistry.html | 8 ++++---- .../doc/classes/number.NumberUtility.html | 8 ++++---- .../doc/classes/random.Random.html | 18 +++++++++--------- .../random.RandomNumberGeneratorFactory.html | 6 +++--- .../doc/classes/random.SeedVersions.html | 8 ++++---- .../random.SeededRandomNumberGenerator.html | 6 +++--- .../random.WeightedElementUtility.html | 19 ++++++++++--------- .../classes/string.ColorStringUtility.html | 14 +++++++------- .../doc/classes/string.StringUtility.html | 18 +++++++++--------- .../enums/discriminator.Discriminators.html | 4 ++-- ...scriminator.DiscriminatorRegistration.html | 6 +++--- .../doc/interfaces/random.SeedVersion.html | 4 ++-- .../interfaces/random.WeightedElement.html | 8 ++++---- .../types/discriminator.Discriminated.html | 2 +- .../doc/types/discriminator.TypeGuard.html | 2 +- .../doc/types/random.WeightedList.html | 5 +++-- .../discriminator.discriminatedSchema.html | 2 +- .../random.weightedElementSchema.html | 2 +- 18 files changed, 71 insertions(+), 69 deletions(-) diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html index 787bac5..bad97a3 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html @@ -1,7 +1,7 @@ DiscriminatorRegistry | @blwat/utils - v0.1.0-alpha.3

    Class DiscriminatorRegistry

    Static registry for managing discriminators and their associated type guards. Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

    0.1.0

    -
    Index

    Methods

    has +
    Index

    Methods

    • Checks if a discriminator is already registered.

      @@ -10,7 +10,7 @@
    • true if the discriminator is registered, false otherwise.

    0.1.0

    -
    • Validates an input against a specific discriminator.

      Parameters

      • input: unknown

        The input to validate.

      • discriminator: string

        The discriminator value to check.

      Returns boolean

      • true if the input matches the type associated with the discriminator, false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html index 3e1e1a7..350786b 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html @@ -1,18 +1,18 @@ NumberUtility | @blwat/utils - v0.1.0-alpha.3

    Class NumberUtility

    Static properties and methods for validating number types.

    0.1.0

    -
    Index
    Index

    Methods

    • Is the given input a finite number?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is a finite number; false otherwise.

      0.1.0

      -
    • Is the given input an integer?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is an integer; false otherwise.

      0.1.0

      -
    • Is the given input a positive integer?

      +
    • Is the given input a positive integer?

      Parameters

      • input: unknown
      • zeroInclusive: boolean = false

        true if zero should be considered a valid input. false if zero should be considered an invalid input. Default value is false.

      Returns input is number

      true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.Random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.Random.html index ebb701c..6b033ea 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.Random.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.Random.html @@ -1,6 +1,6 @@ Random | @blwat/utils - v0.1.0-alpha.3

    Class Random

    Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    Methods

    random randomBoolean randomElement @@ -10,26 +10,26 @@

    Accessors

    • set rand(rand: () => number): void

      Set the primary function used to generate random numbers.

      Parameters

      • rand: () => number

        A function that returns a random number in the range [0, 1) (zero inclusive, one exclusive).

      Returns void

        -
      • If the given rand is not a function.
      • +
      • If the given rand is not a function.

      0.1.0

      -

    Methods

    • Returns number

      A random number in the range [0, 1) (zero inclusive, one exclusive).

      +

    Methods

    • Returns number

      A random number in the range [0, 1) (zero inclusive, one exclusive).

      0.1.0

      -
    • Parameters

      • chanceOfTrue: number = 0.5

        The probability of returning true (between 0 and 1).

        +
    • Parameters

      • chanceOfTrue: number = 0.5

        The probability of returning true (between 0 and 1).

      Returns boolean

      A random boolean value.

      0.1.0

      -
    • Type Parameters

      • Type

      Parameters

      • elements: Type[]

        An array of elements to choose from.

      Returns Type

      A random element from the array.

      0.1.0

      -
    • Parameters

      • min: number

        The minimum value (inclusive).

        +
    • Parameters

      • min: number

        The minimum value (inclusive).

      • max: number

        The maximum value (exclusive).

      Returns number

      A random floating-point number in the range [min, max) (min inclusive, max exclusive).

      0.1.0

      -
    • Parameters

      • min: number

        The minimum value (inclusive).

        +
    • Parameters

      • min: number

        The minimum value (inclusive).

      • max: number

        The maximum value (exclusive).

      Returns number

      A random integer in the range [min, max) (min inclusive, max exclusive).

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html index d8f38fd..b062814 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html @@ -1,6 +1,6 @@ RandomNumberGeneratorFactory | @blwat/utils - v0.1.0-alpha.3

    Class RandomNumberGeneratorFactory

    A static factory class for creating a SeededRandomNumberGenerator object.

    0.1.0

    -
    Index

    Methods

    Index

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html index 85b13b5..cd47925 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html @@ -1,14 +1,14 @@ SeedVersions | @blwat/utils - v0.1.0-alpha.3

    Class SeedVersions

    A static class for accessing different seed versions. Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    Methods

    Accessors

    Methods

    Methods

    • Parameters

      • index: number

        The index of the seed version to retrieve. Must be a valid SeedVersions index.

      Returns SeedVersion

      • The seed version with the given index.
      • @@ -17,7 +17,7 @@
      • If the index is not a valid seed version index.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html index ca49b18..a49fb6a 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html @@ -1,7 +1,7 @@ SeededRandomNumberGenerator | @blwat/utils - v0.1.0-alpha.3

    Class SeededRandomNumberGenerator

    Deterministic seeded pseudorandom number generator. This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

    0.1.0

    -
    Index

    Constructors

    Index

    Constructors

    Methods

    Constructors

    • Parameters

      • state: [number, number, number, number]

        Initial 128-bit state. Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

        @@ -9,10 +9,10 @@

        If each element of state is not a 32-bit unsigned integer.

        If state does not have at least one element that is greater than 0.

        0.1.0

        -

    Methods

    • Returns number

        +

    Methods

    • Returns number

      • The next pseudorandom float in the range [0, 1).

      This method advances the internal 128-bit xoshiro128** state by one step. Successive calls produce an independent, uniformly distributed sequence.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.WeightedElementUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.WeightedElementUtility.html index bb7b6ff..148ebaf 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.WeightedElementUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.WeightedElementUtility.html @@ -1,6 +1,6 @@ WeightedElementUtility | @blwat/utils - v0.1.0-alpha.3

    Class WeightedElementUtility

    Static methods and properties for building and validating WeightedElement and WeightedList objects.

    0.1.0

    -
    Index
    Index

    Methods

    0.1.0

    -

    0.1.0

    -

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html index 96b8e17..6e9ce80 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html @@ -1,6 +1,6 @@ ColorStringUtility | @blwat/utils - v0.1.0-alpha.3

    Class ColorStringUtility

    Static properties and methods for validating formatted color strings.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    • get hexColorPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -
    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. +

    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -
    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. +

    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -

    Methods

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html index dd1dd38..1a80a6b 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html @@ -1,6 +1,6 @@ StringUtility | @blwat/utils - v0.1.0-alpha.3

    Class StringUtility

    Static properties and methods for validating string types.

    0.1.0

    -
    Index
    Index

    Accessors

    • get singleLineLowercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line lowercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      +
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      +
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -

    Methods

    Methods

    • Is the given input a non-empty string? Non-empty strings must contain at least one non-whitespace character.

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -
    • Is the given input a single-line lowercase string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a single-line string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a single-line uppercase string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a string?

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html index 5690fa8..b3d2c5f 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html @@ -1,6 +1,6 @@ Discriminators | @blwat/utils - v0.1.0-alpha.3

    Enumeration Discriminators

    Valid discriminators for package types and interfaces.

    0.1.0

    -
    Index

    Enumeration Members

    Index

    Enumeration Members

    Enumeration Members

    WeightedElement: "@blwat/utils:WeightedElement"

    Discriminator value for the WeightedElement interface.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html index 304da60..61cdff0 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -1,14 +1,14 @@ DiscriminatorRegistration | @blwat/utils - v0.1.0-alpha.3

    Interface DiscriminatorRegistration

    A registration for a discriminator to the DiscriminatorRegistry.

    0.1.0

    -
    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    discriminator: string

    The discriminator value that identifies the type of a Discriminated object. This value must be unique across all registered discriminators.

    0.1.0

    -
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    +
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    Type Declaration

      • (input: unknown): boolean
      • Parameters

        • input: unknown

          The input to validate.

        Returns boolean

        • true if the input matches the type associated with the discriminator, false otherwise.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html index 96c55d9..ec08913 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html @@ -1,8 +1,8 @@ SeedVersion | @blwat/utils - v0.1.0-alpha.3

    Interface SeedVersion

    A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

    0.1.0

    -
    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    Properties

    offsets: readonly [number, number, number, number]

    A collection of offset values for the FNV-1a hashing algorithm. Each offset value should be a 32-bit unsigned integer.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.WeightedElement.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.WeightedElement.html index 8f80ad2..f8d313c 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.WeightedElement.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.WeightedElement.html @@ -1,13 +1,13 @@ WeightedElement | @blwat/utils - v0.1.0-alpha.3

    Interface WeightedElement<Type>

    Interface for a weighted element, which can be used for non-uniform random selection from a list.

    0.1.0

    -
    interface WeightedElement<Type> {
        discriminator: WeightedElement;
        value: Type;
        weight: number;
    }

    Type Parameters

    • Type
    Index

    Properties

    interface WeightedElement<Type> {
        discriminator: WeightedElement;
        value: Type;
        weight: number;
    }

    Type Parameters

    • Type
    Index

    Properties

    discriminator: WeightedElement

    The discriminator for the weighted element.

    0.1.0

    -
    value: Type

    The value to be selected from the weighted list.

    +
    value: Type

    The value to be selected from the weighted list.

    0.1.0

    -
    weight: number

    The probability weight of the element. +

    weight: number

    The probability weight of the element. Should be a number between 0 and 1, inclusive.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html index ab3460a..85ff583 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html @@ -1,3 +1,3 @@ Discriminated | @blwat/utils - v0.1.0-alpha.3

    Type Alias Discriminated

    Discriminated: Static<typeof discriminatedSchema>

    Discriminated objects can be type checked using the discriminator registry.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html index 5dcb426..06ffc15 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html @@ -1,3 +1,3 @@ TypeGuard | @blwat/utils - v0.1.0-alpha.3

    Type Alias TypeGuard<T>

    TypeGuard: (input: unknown) => input is T

    A type guard function that checks if an input is of a specific Discriminated type.

    Type Parameters

    Type Declaration

      • (input: unknown): input is T
      • Parameters

        • input: unknown

        Returns input is T

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/random.WeightedList.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/random.WeightedList.html index 57a9df0..5d591f9 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/random.WeightedList.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/random.WeightedList.html @@ -1,3 +1,4 @@ WeightedList | @blwat/utils - v0.1.0-alpha.3

    Type Alias WeightedList<Type>

    WeightedList: WeightedElement<Type>[]

    Type alias for a list of WeightedElement objects.

    -

    Type Parameters

    • Type

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Type Parameters

    • Type

    0.1.0

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html index 44cfaf6..d51df9d 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html @@ -1,3 +1,3 @@ discriminatedSchema | @blwat/utils - v0.1.0-alpha.3

    Variable discriminatedSchemaConst

    discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

    TypeBox schema for validating that an object implements the Discriminated type.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/random.weightedElementSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/random.weightedElementSchema.html index 4551608..3938854 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/random.weightedElementSchema.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/random.weightedElementSchema.html @@ -1,3 +1,3 @@ weightedElementSchema | @blwat/utils - v0.1.0-alpha.3

    Variable weightedElementSchemaConst

    weightedElementSchema: TGeneric<
        [TParameter<"T", TUnknown, TUnknown>],
        TIntersect<
            [
                TObject<{ discriminator: TReadonly<TString> }>,
                TObject<
                    {
                        discriminator: TLiteral<WeightedElement>;
                        value: TReadonly<TRef<"T">>;
                        weight: TReadonly<TNumber>;
                    },
                >,
            ],
        >,
    > = ...

    TypeBox schema to validate a WeightedElement object.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    From b8dad221c53f6fee006e106e09b22127ac6ce2f2 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 29 Jun 2026 22:39:06 -0500 Subject: [PATCH 059/122] Begin implementing unit tests for random.ts --- src/random/random.ts | 16 ++++++------- test/random/random.test.ts | 49 ++++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/random/random.ts b/src/random/random.ts index 6fc0518..ecadd18 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -37,7 +37,7 @@ export class Random { * @type {() => number} * @private */ - static #rand: () => number = Math.random; + static #rng: () => number = Math.random; /** * @throws {Error} - Random is a static class and cannot be instantiated. @@ -51,21 +51,21 @@ export class Random { /** * Set the primary function used to generate random numbers. * - * @param {() => number} rand - A function that returns a random number in the range [0, 1) (zero inclusive, one exclusive). + * @param {() => number} rng - A function that returns a random number in the range [0, 1) (zero inclusive, one exclusive). * * @returns {void} * - * @throws {TypeError} - If the given `rand` is not a function. + * @throws {TypeError} - If the given random number generator is not a function. * * @public * @since 0.1.0 */ - public static set rand(rand: () => number) { - if (typeof rand !== 'function') { - throw new TypeError('rand must be a function'); + public static set randomNumberGenerator(rng: () => number) { + if (typeof rng !== 'function') { + throw new TypeError('rng must be a function'); } - Random.#rand = rand; + Random.#rng = rng; } /** @@ -75,7 +75,7 @@ export class Random { * @since 0.1.0 */ public static random(): number { - return Random.#rand(); + return Random.#rng(); } /** diff --git a/test/random/random.test.ts b/test/random/random.test.ts index baec956..07bb17b 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -18,6 +18,51 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { test } from 'vitest'; +import { describe, test, afterEach, expect } from 'vitest'; -test.todo('Random'); +import { Random } from '../../src'; + +describe('Random', (): void => { + const testRepeatTotal: number = 20; + + afterEach((): void => { + Random.randomNumberGenerator = Math.random; + }); + + describe('new Random()', (): void => { + describe('Runtime behavior guards', (): void => { + test('Constructor should throw an error when instantiated at runtime', (): void => { + const RuntimeConstructor = Random as unknown as new () => Random; + expect((): Random => new RuntimeConstructor()).toThrow(Error); + }); + }); + }); + + describe('Random.randomNumberGenerator', (): void => { + describe('Setting random number generator should impact the values returned by all other methods', (): void => { + test('random', (): void => { + const expected: number = 1.5; + + Random.randomNumberGenerator = (): number => { + return expected; + } + + for (let i: number = 0; i < testRepeatTotal; i++) { + expect(Random.random()).toBe(expected); + } + }); + + test.todo('randomFloat'); + + test.todo('randomInt'); + }); + + describe('Setting random number generator with a seeded pseudorandom number generator', (): void => { + test.todo('Setting random number generator with a seeded pseudorandom number generator'); + }); + + describe('Input validation', (): void => { + test.todo('Input validation'); + }); + }); +}); From 88415a5d9fbbf54696a4eafffeb416b96439ce7c Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 30 Jun 2026 06:57:14 -0500 Subject: [PATCH 060/122] Update unit tests for random.test.ts --- test/random/random.test.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 07bb17b..6d666e2 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -52,6 +52,18 @@ describe('Random', (): void => { } }); + test('randomFloat', (): void => { + const expected: number = 2; + + Random.randomNumberGenerator = (): number => { + return expected; + } + + for (let i: number = 0; i < testRepeatTotal; i++) { + expect(Random.randomFloat(0, 1)).toBe(expected); + } + }); + test.todo('randomFloat'); test.todo('randomInt'); From ab3c8d071aa6e58d69809c5e743f3227f1c80622 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 30 Jun 2026 08:13:12 -0500 Subject: [PATCH 061/122] Add randomFloat unit tests to random.test.ts --- src/random/random.ts | 27 ++++++++++++ test/random/random.test.ts | 87 +++++++++++++++++++++++++++++++++++--- 2 files changed, 108 insertions(+), 6 deletions(-) diff --git a/src/random/random.ts b/src/random/random.ts index ecadd18..3eb60e9 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -84,6 +84,10 @@ export class Random { * * @returns {number} A random floating-point number in the range [min, max) (min inclusive, max exclusive). * + * @throws {TypeError} When `min` is not a finite number. + * @throws {TypeError} When `max` is not a finite number. + * @throws {RangeError} When `min` is not less than or equal `max`. + * * @public * @since 0.1.0 */ @@ -98,6 +102,10 @@ export class Random { * * @returns {number} A random integer in the range [min, max) (min inclusive, max exclusive). * + * @throws {TypeError} When `min` is not a finite number. + * @throws {TypeError} When `max` is not a finite number. + * @throws {RangeError} When `min` is not less than or equal `max`. + * * @public * @since 0.1.0 */ @@ -106,6 +114,25 @@ export class Random { return Math.floor(Random.randomFloat(min, max)); } + /** + * @see {@link Random.randomInt} + * + * @param {number} min - The minimum value (inclusive). + * @param {number} max - The maximum value (exclusive). + * + * @returns {number} A random integer in the range [min, max) (min inclusive, max exclusive). + * + * @throws {TypeError} When `min` is not a finite number. + * @throws {TypeError} When `max` is not a finite number. + * @throws {RangeError} When `min` is not less than or equal `max`. + * + * @public + * @since 0.1.0 + */ + public static randomInteger(min: number, max: number): number { + return Random.randomInt(min, max); + } + /** * @param {number} chanceOfTrue - The probability of returning true (between 0 and 1). * diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 6d666e2..a1a5f0a 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -18,7 +18,7 @@ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import { describe, test, afterEach, expect } from 'vitest'; +import { describe, test, afterEach, expect, expectTypeOf } from 'vitest'; import { Random } from '../../src'; @@ -29,6 +29,18 @@ describe('Random', (): void => { Random.randomNumberGenerator = Math.random; }); + function validateRandomFloatValues(numbers: number[], min: number, max: number): void { + for (const num of numbers) { + expectTypeOf(num).toBeNumber(); + expect(num).not.toBeNaN(); + expect(num).toBeGreaterThanOrEqual(min); + expect(num).toBeLessThan(max); + } + + const numbersSet: Set = new Set(numbers); + expect(numbersSet.size).toBe(numbers.length); + } + describe('new Random()', (): void => { describe('Runtime behavior guards', (): void => { test('Constructor should throw an error when instantiated at runtime', (): void => { @@ -38,14 +50,14 @@ describe('Random', (): void => { }); }); - describe('Random.randomNumberGenerator', (): void => { + describe('randomNumberGenerator', (): void => { describe('Setting random number generator should impact the values returned by all other methods', (): void => { test('random', (): void => { const expected: number = 1.5; Random.randomNumberGenerator = (): number => { return expected; - } + }; for (let i: number = 0; i < testRepeatTotal; i++) { expect(Random.random()).toBe(expected); @@ -57,16 +69,38 @@ describe('Random', (): void => { Random.randomNumberGenerator = (): number => { return expected; - } + }; for (let i: number = 0; i < testRepeatTotal; i++) { expect(Random.randomFloat(0, 1)).toBe(expected); } }); - test.todo('randomFloat'); + test('randomInt', (): void => { + const random: number = 2.5; + const expected: number = Math.floor(random); + + Random.randomNumberGenerator = (): number => { + return random; + }; + + for (let i: number = 0; i < testRepeatTotal; i++) { + expect(Random.randomInt(0, 1)).toBe(expected); + } + }); + + test('randomInteger', (): void => { + const random: number = 3.5; + const expected: number = Math.floor(random); + + Random.randomNumberGenerator = (): number => { + return random; + }; - test.todo('randomInt'); + for (let i: number = 0; i < testRepeatTotal; i++) { + expect(Random.randomInteger(0, 1)).toBe(expected); + } + }); }); describe('Setting random number generator with a seeded pseudorandom number generator', (): void => { @@ -77,4 +111,45 @@ describe('Random', (): void => { test.todo('Input validation'); }); }); + + describe('random', (): void => { + test('random() should return a positive number between 0 inclusive and 1 exclusive', (): void => { + const min: 0 = 0 as const; + const max: 1 = 1 as const; + const numbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + const r: number = Random.random(); + numbers.push(r); + } + + validateRandomFloatValues(numbers, min, max); + }); + }); + + describe('randomFloat', (): void => { + describe('randomFloat should return a number between the given min and max', (): void => { + test.each([ + { min: 0, max: 1 }, + { min: 0, max: 50 }, + { min: 100, max: 500 }, + { min: -1, max: 0 }, + { min: -50, max: 0 }, + { min: -500, max: -100 } + ])('randomFloat($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { + const numbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + const r: number = Random.randomFloat(min, max); + numbers.push(r); + } + + validateRandomFloatValues(numbers, min, max); + }); + }); + + test.todo('randomFloat should return min when min and max are equal'); + + test.todo('Input validation'); + }); }); From 0599825592cdbe0c3e0099a13c617965f13a7840 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 30 Jun 2026 08:20:11 -0500 Subject: [PATCH 062/122] Update test cases for randomFloat unit tests in random.test.ts --- test/random/random.test.ts | 44 +++++++++++++++++++++++++++++++++----- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index a1a5f0a..4190f7c 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -33,12 +33,22 @@ describe('Random', (): void => { for (const num of numbers) { expectTypeOf(num).toBeNumber(); expect(num).not.toBeNaN(); - expect(num).toBeGreaterThanOrEqual(min); - expect(num).toBeLessThan(max); + + if (min !== max) { + expect(num).toBeGreaterThanOrEqual(min); + expect(num).toBeLessThan(max); + } else { + expect(num).toBe(min); + } } const numbersSet: Set = new Set(numbers); - expect(numbersSet.size).toBe(numbers.length); + + if (min !== max) { + expect(numbersSet.size).toBe(numbers.length); + } else { + expect(numbersSet.size).toBe(1); + } } describe('new Random()', (): void => { @@ -135,7 +145,13 @@ describe('Random', (): void => { { min: 100, max: 500 }, { min: -1, max: 0 }, { min: -50, max: 0 }, - { min: -500, max: -100 } + { min: -500, max: -100 }, + { min: 0.5, max: 0.75 }, + { min: 0, max: 0.5 }, + { min: -0.5, max: 0 }, + { min: -0.75, max: -0.5 }, + { min: -100, max: 100 }, + { min: -0.5, max: 0.5 } ])('randomFloat($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { const numbers: number[] = []; @@ -148,7 +164,25 @@ describe('Random', (): void => { }); }); - test.todo('randomFloat should return min when min and max are equal'); + describe('randomFloat should return min when min and max are equal', (): void => { + test.each([ + { min: 0, max: 0 }, + { min: 1, max: 1 }, + { min: 10, max: 10 }, + { min: -10, max: -10 }, + { min: 0.5, max: 0.5 }, + { min: -0.5, max: -0.5 } + ])('randomFloat($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + const numbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + const r: number = Random.randomFloat(min, max); + numbers.push(r); + } + + validateRandomFloatValues(numbers, min, max); + }); + }); test.todo('Input validation'); }); From 1747cf6f3a79a3a2ac94da0beb2dc01239b34cbc Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 30 Jun 2026 21:58:08 -0500 Subject: [PATCH 063/122] Add placeholders for randomInt and randomInteger to random.test.ts --- test/random/random.test.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 4190f7c..2130772 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -186,4 +186,12 @@ describe('Random', (): void => { test.todo('Input validation'); }); + + describe('randomInt', (): void => { + test.todo('randomInt'); + }); + + describe('randomInteger', (): void => { + test.todo('randomInteger'); + }); }); From dec52d48e555b29a18cfe050a63e6814203d122f Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 1 Jul 2026 22:05:08 -0500 Subject: [PATCH 064/122] Begin implementing randomInt unit tests for random.test.ts --- src/random/random.ts | 6 +- test/random/random.test.ts | 121 ++++++++++++++++++++++++++++++++++++- 2 files changed, 122 insertions(+), 5 deletions(-) diff --git a/src/random/random.ts b/src/random/random.ts index 3eb60e9..8c01c42 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -110,8 +110,10 @@ export class Random { * @since 0.1.0 */ public static randomInt(min: number, max: number): number { - Random.#validateRange(min, max); - return Math.floor(Random.randomFloat(min, max)); + const floorMin: number = Math.floor(min); + const floorMax: number = Math.floor(max); + Random.#validateRange(floorMin, floorMax); + return Math.floor(Random.randomFloat(floorMin, floorMax)); } /** diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 2130772..7ad1bc5 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -51,6 +51,30 @@ describe('Random', (): void => { } } + function validateRandomIntValues(numbers: number[], min: number, max: number): void { + for (const num of numbers) { + expectTypeOf(num).toBeNumber(); + expect(num).not.toBeNaN(); + expect(Number.isInteger(num)).toBe(true); + + if (min !== max) { + expect(num).toBeGreaterThanOrEqual(Math.floor(min)); + expect(num).toBeLessThan(Math.floor(max)); + } else { + expect(num).toBe(Math.floor(min)); + } + } + + const numbersSet: Set = new Set(numbers); + + if (Math.floor(max) - Math.floor(min) > 1) { + expect(numbersSet.size).toBeGreaterThan(1); + expect(numbersSet.size).toBeLessThanOrEqual(Math.floor(max) - Math.floor(min)); + } else { + expect(numbersSet.size).toBe(1); + } + } + describe('new Random()', (): void => { describe('Runtime behavior guards', (): void => { test('Constructor should throw an error when instantiated at runtime', (): void => { @@ -188,10 +212,101 @@ describe('Random', (): void => { }); describe('randomInt', (): void => { - test.todo('randomInt'); + describe('randomInt should return a number between the given min and max', (): void => { + test.each([ + { min: 0, max: 1 }, + { min: 0, max: 50 }, + { min: 100, max: 500 }, + { min: -1, max: 0 }, + { min: -50, max: 0 }, + { min: -500, max: -100 }, + { min: -100, max: 100 } + ])('randomInt($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { + const numbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + const r: number = Random.randomInt(min, max); + numbers.push(r); + } + + validateRandomIntValues(numbers, min, max); + }); + }); + + describe('randomInt should return a number between Math.floor(min) and Math.floor(max) when the given min and max are float number types', (): void => { + test.each([ + { min: 0.33, max: 1.5 }, + { min: 0.5, max: 50.34 }, + + { min: 125.555, max: 400.444 }, + { min: -1.6, max: 0.7 }, + { min: -50.41, max: 0.78 }, + { min: -500.234, max: -100.987 }, + { min: 0.5, max: 10.314 }, + { min: 1.5, max: 9.75 }, + { min: 0, max: 5.5 }, + { min: -0.5, max: 0 }, + { min: -3.75, max: -0.5 }, + { min: -100.777, max: 100.222 }, + { min: -0.5, max: 0.5 } + ])('randomInt($min, $max) should return a number between Math.floor($min) and Math.floor($max)', ({ min, max }: { min: number; max: number; }): void => { + const numbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + const r: number = Random.randomInt(min, max); + numbers.push(r); + } + + validateRandomIntValues(numbers, min, max); + }); + }); + + // describe('randomInt should return min when min and max are equal', (): void => { + // test.todo('not done'); + // + // test.each([ + // { min: 0, max: 0 }, + // { min: 1, max: 1 }, + // { min: 10, max: 10 }, + // { min: -10, max: -10 }, + // { min: 0.5, max: 0.5 }, + // { min: -0.5, max: -0.5 } + // ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + // const numbers: number[] = []; + // + // for (let i: number = 0; i < testRepeatTotal; i++) { + // const r: number = Random.randomInt(min, max); + // numbers.push(r); + // } + // + // validateRandomIntValues(numbers, min, max); + // }); + // }); + // + // describe('randomInt should return Math.floor(min) when min and max are equal and float number types', (): void => { + // test.todo('not done'); + // + // test.each([ + // { min: 0, max: 0 }, + // { min: 1, max: 1 }, + // { min: 10, max: 10 }, + // { min: -10, max: -10 }, + // { min: 0.5, max: 0.5 }, + // { min: -0.5, max: -0.5 } + // ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + // const numbers: number[] = []; + // + // for (let i: number = 0; i < testRepeatTotal; i++) { + // const r: number = Random.randomInt(min, max); + // numbers.push(r); + // } + // + // validateRandomIntValues(numbers, min, max); + // }); + // }); }); - describe('randomInteger', (): void => { - test.todo('randomInteger'); + describe('randomInteger', (): void => { + test.todo('randomInteger'); }); }); From 4006da8abff4cc1931c1cc2f66e38f9733862af8 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Thu, 2 Jul 2026 22:09:24 -0500 Subject: [PATCH 065/122] Complete base case randomInt unit tests for random.test.ts --- test/random/random.test.ts | 115 +++++++++++++++++++++---------------- 1 file changed, 67 insertions(+), 48 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 7ad1bc5..83397ff 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -30,11 +30,13 @@ describe('Random', (): void => { }); function validateRandomFloatValues(numbers: number[], min: number, max: number): void { + const sameMinMax: boolean = min !== max; + for (const num of numbers) { expectTypeOf(num).toBeNumber(); expect(num).not.toBeNaN(); - if (min !== max) { + if (sameMinMax) { expect(num).toBeGreaterThanOrEqual(min); expect(num).toBeLessThan(max); } else { @@ -44,7 +46,7 @@ describe('Random', (): void => { const numbersSet: Set = new Set(numbers); - if (min !== max) { + if (sameMinMax) { expect(numbersSet.size).toBe(numbers.length); } else { expect(numbersSet.size).toBe(1); @@ -52,12 +54,14 @@ describe('Random', (): void => { } function validateRandomIntValues(numbers: number[], min: number, max: number): void { + const sameMinMax: boolean = Math.floor(max) - Math.floor(min) > 1; + for (const num of numbers) { expectTypeOf(num).toBeNumber(); expect(num).not.toBeNaN(); expect(Number.isInteger(num)).toBe(true); - if (min !== max) { + if (sameMinMax) { expect(num).toBeGreaterThanOrEqual(Math.floor(min)); expect(num).toBeLessThan(Math.floor(max)); } else { @@ -67,7 +71,7 @@ describe('Random', (): void => { const numbersSet: Set = new Set(numbers); - if (Math.floor(max) - Math.floor(min) > 1) { + if (sameMinMax) { expect(numbersSet.size).toBeGreaterThan(1); expect(numbersSet.size).toBeLessThanOrEqual(Math.floor(max) - Math.floor(min)); } else { @@ -237,7 +241,6 @@ describe('Random', (): void => { test.each([ { min: 0.33, max: 1.5 }, { min: 0.5, max: 50.34 }, - { min: 125.555, max: 400.444 }, { min: -1.6, max: 0.7 }, { min: -50.41, max: 0.78 }, @@ -261,49 +264,65 @@ describe('Random', (): void => { }); }); - // describe('randomInt should return min when min and max are equal', (): void => { - // test.todo('not done'); - // - // test.each([ - // { min: 0, max: 0 }, - // { min: 1, max: 1 }, - // { min: 10, max: 10 }, - // { min: -10, max: -10 }, - // { min: 0.5, max: 0.5 }, - // { min: -0.5, max: -0.5 } - // ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { - // const numbers: number[] = []; - // - // for (let i: number = 0; i < testRepeatTotal; i++) { - // const r: number = Random.randomInt(min, max); - // numbers.push(r); - // } - // - // validateRandomIntValues(numbers, min, max); - // }); - // }); - // - // describe('randomInt should return Math.floor(min) when min and max are equal and float number types', (): void => { - // test.todo('not done'); - // - // test.each([ - // { min: 0, max: 0 }, - // { min: 1, max: 1 }, - // { min: 10, max: 10 }, - // { min: -10, max: -10 }, - // { min: 0.5, max: 0.5 }, - // { min: -0.5, max: -0.5 } - // ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { - // const numbers: number[] = []; - // - // for (let i: number = 0; i < testRepeatTotal; i++) { - // const r: number = Random.randomInt(min, max); - // numbers.push(r); - // } - // - // validateRandomIntValues(numbers, min, max); - // }); - // }); + describe('randomInt should return min when min and max are equal', (): void => { + test.each([ + { min: 0, max: 0 }, + { min: 1, max: 1 }, + { min: -1, max: -1 }, + { min: 10, max: 10 }, + { min: -10, max: -10 }, + ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + const numbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + const r: number = Random.randomInt(min, max); + numbers.push(r); + } + + validateRandomIntValues(numbers, min, max); + }); + }); + + describe('randomInt should return Math.floor(min) when min and max are equal and float number types', (): void => { + test.each([ + { min: 1.8, max: 1.8 }, + { min: 10.5, max: 10.5 }, + { min: -10.5, max: -10.5 }, + { min: 0.5, max: 0.5 }, + { min: -0.5, max: -0.5 } + ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + const numbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + const r: number = Random.randomInt(min, max); + numbers.push(r); + } + + validateRandomIntValues(numbers, min, max); + }); + }); + + describe('randomInt should return Math.floor(min) when Math.floor(min) and Math.floor(max) are equal', (): void => { + test.each([ + { min: 1.5, max: 1.89 }, + { min: 10.01, max: 10.99 }, + { min: 10.001, max: 10.999 }, + { min: -10.4, max: -10.25 }, + { min: 0.5, max: 0.75 }, + { min: -0.99, max: -0.999 } + ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + const numbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + const r: number = Random.randomInt(min, max); + numbers.push(r); + } + + validateRandomIntValues(numbers, min, max); + }); + }); + + test.todo('Input validation'); }); describe('randomInteger', (): void => { From 00a374ee4859bfff5c76efead1e9b952cea38c4e Mon Sep 17 00:00:00 2001 From: blwatkins Date: Fri, 3 Jul 2026 00:03:02 -0500 Subject: [PATCH 066/122] Update package version to v0.1.0-alpha.1 and add generated docs for v0.1.0-alpha.1 --- .../doc/.nojekyll | 0 .../doc/assets/hierarchy.js | 0 .../doc/assets/highlight.css | 0 .../doc/assets/icons.js | 0 .../doc/assets/icons.svg | 0 .../doc/assets/main.js | 0 .../doc/assets/navigation.js | 0 .../doc/assets/search.js | 0 .../doc/assets/style.css | 0 .../discriminator.DiscriminatorRegistry.html | 10 ++--- .../doc/classes/number.NumberUtility.html | 10 ++--- .../random.RandomNumberGeneratorFactory.html | 8 ++-- .../doc/classes/random.SeedVersions.html | 10 ++--- .../random.SeededRandomNumberGenerator.html | 8 ++-- .../classes/string.ColorStringUtility.html | 16 +++---- .../doc/classes/string.StringUtility.html | 20 ++++----- .../v0.1.0-alpha.1/doc/hierarchy.html | 1 + .../doc/index.html | 44 +++++++++---------- ...scriminator.DiscriminatorRegistration.html | 8 ++-- .../doc/interfaces/random.SeedVersion.html | 6 +-- .../v0.1.0-alpha.1/doc/modules.html | 1 + .../doc/modules/discriminator.html | 1 + .../v0.1.0-alpha.1/doc/modules/number.html | 1 + .../v0.1.0-alpha.1/doc/modules/random.html | 1 + .../v0.1.0-alpha.1/doc/modules/string.html | 1 + .../types/discriminator.Discriminated.html | 4 +- .../doc/types/discriminator.TypeGuard.html | 4 +- .../discriminator.discriminatedSchema.html | 4 +- .../v0.1.0-alpha.3/doc/hierarchy.html | 1 - .../v0.1.0-alpha.3/doc/modules.html | 1 - .../doc/modules/discriminator.html | 1 - .../v0.1.0-alpha.3/doc/modules/number.html | 1 - .../v0.1.0-alpha.3/doc/modules/random.html | 1 - .../v0.1.0-alpha.3/doc/modules/string.html | 1 - package-lock.json | 4 +- package.json | 2 +- 36 files changed, 85 insertions(+), 85 deletions(-) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/.nojekyll (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/assets/hierarchy.js (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/assets/highlight.css (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/assets/icons.js (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/assets/icons.svg (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/assets/main.js (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/assets/navigation.js (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/assets/search.js (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/assets/style.css (100%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/classes/discriminator.DiscriminatorRegistry.html (83%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/classes/number.NumberUtility.html (81%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/classes/random.RandomNumberGeneratorFactory.html (83%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/classes/random.SeedVersions.html (81%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/classes/random.SeededRandomNumberGenerator.html (80%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/classes/string.ColorStringUtility.html (84%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/classes/string.StringUtility.html (87%) create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/index.html (67%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/interfaces/discriminator.DiscriminatorRegistration.html (77%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/interfaces/random.SeedVersion.html (74%) create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/types/discriminator.Discriminated.html (57%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/types/discriminator.TypeGuard.html (62%) rename docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/{v0.1.0-alpha.3 => v0.1.0-alpha.1}/doc/variables/discriminator.discriminatedSchema.html (54%) delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/hierarchy.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/number.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/.nojekyll b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/.nojekyll rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/hierarchy.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/hierarchy.js rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/highlight.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/highlight.css rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.js rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.svg b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/icons.svg rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/main.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/main.js rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/navigation.js rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/search.js rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/style.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css similarity index 100% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/assets/style.css rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html similarity index 83% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html index 83f80a3..e558034 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/discriminator.DiscriminatorRegistry.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html @@ -1,7 +1,7 @@ -DiscriminatorRegistry | @blwat/utils - v0.1.0-alpha.3

    Class DiscriminatorRegistry

    Static registry for managing discriminators and their associated type guards. +DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.1

    Class DiscriminatorRegistry

    Static registry for managing discriminators and their associated type guards. Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

    0.1.0

    -
    Index

    Methods

    has +
    Index

    Methods

    • Checks if a discriminator is already registered.

      @@ -10,7 +10,7 @@
    • true if the discriminator is registered, false otherwise.

    0.1.0

    -
    • Validates an input against a specific discriminator.

      Parameters

      • input: unknown

        The input to validate.

      • discriminator: string

        The discriminator value to check.

      Returns boolean

      • true if the input matches the type associated with the discriminator, false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html similarity index 81% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html index b5664fd..86fc589 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/number.NumberUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html @@ -1,18 +1,18 @@ -NumberUtility | @blwat/utils - v0.1.0-alpha.3

    Class NumberUtility

    Static properties and methods for validating number types.

    +NumberUtility | @blwatkins/utils - v0.1.0-alpha.1

    Class NumberUtility

    Static properties and methods for validating number types.

    0.1.0

    -
    Index
    Index

    Methods

    • Is the given input a finite number?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is a finite number; false otherwise.

      0.1.0

      -
    • Is the given input an integer?

      Parameters

      • input: unknown

      Returns input is number

      true when the input is an integer; false otherwise.

      0.1.0

      -
    • Is the given input a positive integer?

      +
    • Is the given input a positive integer?

      Parameters

      • input: unknown
      • zeroInclusive: boolean = false

        true if zero should be considered a valid input. false if zero should be considered an invalid input. Default value is false.

      Returns input is number

      true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html similarity index 83% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html index d894edc..12189dd 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.RandomNumberGeneratorFactory.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html @@ -1,6 +1,6 @@ -RandomNumberGeneratorFactory | @blwat/utils - v0.1.0-alpha.3

    Class RandomNumberGeneratorFactory

    A static factory class for creating a SeededRandomNumberGenerator object.

    +RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.1

    Class RandomNumberGeneratorFactory

    A static factory class for creating a SeededRandomNumberGenerator object.

    0.1.0

    -
    Index

    Methods

    Index

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html similarity index 81% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html index a8ef8f4..810f2a9 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeedVersions.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html @@ -1,14 +1,14 @@ -SeedVersions | @blwat/utils - v0.1.0-alpha.3

    Class SeedVersions

    A static class for accessing different seed versions. +SeedVersions | @blwatkins/utils - v0.1.0-alpha.1

    Class SeedVersions

    A static class for accessing different seed versions. Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    Methods

    Accessors

    Methods

    Methods

    • Parameters

      • index: number

        The index of the seed version to retrieve. Must be a valid SeedVersions index.

      Returns SeedVersion

      • The seed version with the given index.
      • @@ -17,7 +17,7 @@
      • If the index is not a valid seed version index.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html similarity index 80% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html index 571b86a..7d7e971 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/random.SeededRandomNumberGenerator.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html @@ -1,7 +1,7 @@ -SeededRandomNumberGenerator | @blwat/utils - v0.1.0-alpha.3

    Class SeededRandomNumberGenerator

    Deterministic seeded pseudorandom number generator. +SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.1

    Class SeededRandomNumberGenerator

    Deterministic seeded pseudorandom number generator. This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

    0.1.0

    -
    Index

    Constructors

    Index

    Constructors

    Methods

    Constructors

    • Parameters

      • state: [number, number, number, number]

        Initial 128-bit state. Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

        @@ -9,10 +9,10 @@

        If each element of state is not a 32-bit unsigned integer.

        If state does not have at least one element that is greater than 0.

        0.1.0

        -

    Methods

    • Returns number

        +

    Methods

    • Returns number

      • The next pseudorandom float in the range [0, 1).

      This method advances the internal 128-bit xoshiro128** state by one step. Successive calls produce an independent, uniformly distributed sequence.

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html similarity index 84% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html index 9770a27..9469753 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.ColorStringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html @@ -1,6 +1,6 @@ -ColorStringUtility | @blwat/utils - v0.1.0-alpha.3

    Class ColorStringUtility

    Static properties and methods for validating formatted color strings.

    +ColorStringUtility | @blwatkins/utils - v0.1.0-alpha.1

    Class ColorStringUtility

    Static properties and methods for validating formatted color strings.

    0.1.0

    -
    Index

    Accessors

    Index

    Accessors

    • get hexColorPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -
    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. +

    • get hexColorPatternRGB(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBB. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -
    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. +

    • get hexColorPatternRGBA(): RegExp

      Returns RegExp

      Regular expression pattern for validating hex color strings in the format #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

      0.1.0

      -

    Methods

    Methods

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html similarity index 87% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html index 593511a..c33a023 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/classes/string.StringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html @@ -1,6 +1,6 @@ -StringUtility | @blwat/utils - v0.1.0-alpha.3

    Class StringUtility

    Static properties and methods for validating string types.

    +StringUtility | @blwatkins/utils - v0.1.0-alpha.1

    Class StringUtility

    Static properties and methods for validating string types.

    0.1.0

    -
    Index
    Index

    Accessors

    • get singleLineLowercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line lowercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      +
    • get singleLineTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line mixed-case strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      +
    • get singleLineUppercaseTrimmedPattern(): RegExp

      Returns RegExp

      Regular expression pattern for validating single-line uppercase strings.

      This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

      0.1.0

      -

    Methods

    Methods

    • Is the given input a non-empty string? Non-empty strings must contain at least one non-whitespace character.

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -
    • Is the given input a single-line lowercase string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a single-line string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a single-line uppercase string that is trimmed (no leading or trailing whitespace)?

      +
    • Is the given input a string?

      Parameters

      • input: unknown

      Returns input is string

      0.1.0

      -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html new file mode 100644 index 0000000..4e2ccdc --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html @@ -0,0 +1 @@ +@blwatkins/utils - v0.1.0-alpha.1

    @blwatkins/utils - v0.1.0-alpha.1

    Hierarchy Summary

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html similarity index 67% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html index 11b4d05..66ef8b3 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/index.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html @@ -1,4 +1,4 @@ -@blwat/utils - v0.1.0-alpha.3

    @blwat/utils - v0.1.0-alpha.3

    TypeScript Utilities

    +@blwatkins/utils - v0.1.0-alpha.1

    @blwatkins/utils - v0.1.0-alpha.1

    TypeScript Utilities

    A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development.

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html similarity index 77% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html index 805117c..db6a6d4 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -1,14 +1,14 @@ -DiscriminatorRegistration | @blwat/utils - v0.1.0-alpha.3

    Interface DiscriminatorRegistration

    A registration for a discriminator to the DiscriminatorRegistry.

    +DiscriminatorRegistration | @blwatkins/utils - v0.1.0-alpha.1

    Interface DiscriminatorRegistration

    A registration for a discriminator to the DiscriminatorRegistry.

    0.1.0

    -
    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    interface DiscriminatorRegistration {
        discriminator: string;
        validator: (input: unknown) => boolean;
    }
    Index

    Properties

    discriminator: string

    The discriminator value that identifies the type of a Discriminated object. This value must be unique across all registered discriminators.

    0.1.0

    -
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    +
    validator: (input: unknown) => boolean

    A method that validates whether an input matches the type associated with the discriminator.

    Type Declaration

      • (input: unknown): boolean
      • Parameters

        • input: unknown

          The input to validate.

        Returns boolean

        • true if the input matches the type associated with the discriminator, false otherwise.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html similarity index 74% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html index 0440fca..8b1ad75 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/interfaces/random.SeedVersion.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html @@ -1,8 +1,8 @@ -SeedVersion | @blwat/utils - v0.1.0-alpha.3

    Interface SeedVersion

    A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. +SeedVersion | @blwatkins/utils - v0.1.0-alpha.1

    Interface SeedVersion

    A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

    0.1.0

    -
    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    interface SeedVersion {
        offsets: readonly [number, number, number, number];
    }
    Index

    Properties

    Properties

    offsets: readonly [number, number, number, number]

    A collection of offset values for the FNV-1a hashing algorithm. Each offset value should be a 32-bit unsigned integer.

    0.1.0

    -

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    +

    Generated using TypeDoc


    Copyright © 2024-2026 Brittni Watkins.

    diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html new file mode 100644 index 0000000..33fa2cd --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html @@ -0,0 +1 @@ +@blwatkins/utils - v0.1.0-alpha.1

      @blwatkins/utils - v0.1.0-alpha.1

      Modules

      discriminator
      number
      random
      string

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html new file mode 100644 index 0000000..582d4da --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html @@ -0,0 +1 @@ +discriminator | @blwatkins/utils - v0.1.0-alpha.1

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html new file mode 100644 index 0000000..c8bb1d4 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html @@ -0,0 +1 @@ +number | @blwatkins/utils - v0.1.0-alpha.1

      Module number

      Classes

      NumberUtility

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html new file mode 100644 index 0000000..a132feb --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html @@ -0,0 +1 @@ +random | @blwatkins/utils - v0.1.0-alpha.1

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html new file mode 100644 index 0000000..a92cba6 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html @@ -0,0 +1 @@ +string | @blwatkins/utils - v0.1.0-alpha.1

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html similarity index 57% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html index 43b5a85..a576633 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.Discriminated.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html @@ -1,3 +1,3 @@ -Discriminated | @blwat/utils - v0.1.0-alpha.3

      Type Alias Discriminated

      Discriminated: Static<typeof discriminatedSchema>

      Discriminated objects can be type checked using the discriminator registry.

      +Discriminated | @blwatkins/utils - v0.1.0-alpha.1

      Type Alias Discriminated

      Discriminated: Static<typeof discriminatedSchema>

      Discriminated objects can be type checked using the discriminator registry.

      0.1.0

      -

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      +

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html similarity index 62% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html index c49b642..2e23777 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/types/discriminator.TypeGuard.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html @@ -1,3 +1,3 @@ -TypeGuard | @blwat/utils - v0.1.0-alpha.3

      Type Alias TypeGuard<T>

      TypeGuard: (input: unknown) => input is T

      A type guard function that checks if an input is of a specific Discriminated type.

      +TypeGuard | @blwatkins/utils - v0.1.0-alpha.1

      Type Alias TypeGuard<T>

      TypeGuard: (input: unknown) => input is T

      A type guard function that checks if an input is of a specific Discriminated type.

      Type Parameters

      Type Declaration

        • (input: unknown): input is T
        • Parameters

          • input: unknown

          Returns input is T

      0.1.0

      -

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      +

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html similarity index 54% rename from docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html rename to docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html index 15c0078..3d8811e 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/variables/discriminator.discriminatedSchema.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html @@ -1,3 +1,3 @@ -discriminatedSchema | @blwat/utils - v0.1.0-alpha.3

      Variable discriminatedSchemaConst

      discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

      TypeBox schema for validating that an object implements the Discriminated type.

      +discriminatedSchema | @blwatkins/utils - v0.1.0-alpha.1

      Variable discriminatedSchemaConst

      discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

      TypeBox schema for validating that an object implements the Discriminated type.

      0.1.0

      -

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      +

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/hierarchy.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/hierarchy.html deleted file mode 100644 index c6467b3..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/hierarchy.html +++ /dev/null @@ -1 +0,0 @@ -@blwat/utils - v0.1.0-alpha.3

      @blwat/utils - v0.1.0-alpha.3

      Hierarchy Summary

      Generated using TypeDoc


      Copyright © 2024-2026 Brittni Watkins.

      diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules.html deleted file mode 100644 index 00c886e..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules.html +++ /dev/null @@ -1 +0,0 @@ -@blwat/utils - v0.1.0-alpha.3

        @blwat/utils - v0.1.0-alpha.3

        Modules

        discriminator
        number
        random
        string

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html deleted file mode 100644 index 0f75c72..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/discriminator.html +++ /dev/null @@ -1 +0,0 @@ -discriminator | @blwat/utils - v0.1.0-alpha.3

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/number.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/number.html deleted file mode 100644 index 50159c0..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/number.html +++ /dev/null @@ -1 +0,0 @@ -number | @blwat/utils - v0.1.0-alpha.3

        Module number

        Classes

        NumberUtility

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html deleted file mode 100644 index d8d8edb..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/random.html +++ /dev/null @@ -1 +0,0 @@ -random | @blwat/utils - v0.1.0-alpha.3

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html deleted file mode 100644 index 9717f12..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/modules/string.html +++ /dev/null @@ -1 +0,0 @@ -string | @blwat/utils - v0.1.0-alpha.3

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/package-lock.json b/package-lock.json index dbd3a0e..f820404 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@blwatkins/utils", - "version": "0.1.0-alpha.0", + "version": "0.1.0-alpha.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@blwatkins/utils", - "version": "0.1.0-alpha.0", + "version": "0.1.0-alpha.1", "license": "MIT", "dependencies": { "typebox": "^1.3.2" diff --git a/package.json b/package.json index 4c84a28..b0431c8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@blwatkins/utils", - "version": "0.1.0-alpha.0", + "version": "0.1.0-alpha.1", "license": "MIT", "private": false, "description": "A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development.", From 1ff3d9f1aa1e981507dee0effa665e151ce44deb Mon Sep 17 00:00:00 2001 From: blwatkins Date: Fri, 3 Jul 2026 00:27:12 -0500 Subject: [PATCH 067/122] Repository cleanup after scope and version update merges --- .github/copilot-instructions.md | 2 +- CLAUDE.md | 2 +- .../doc/enums/discriminator.Discriminators.html | 6 ------ 3 files changed, 2 insertions(+), 8 deletions(-) delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 491f145..c322feb 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -2,7 +2,7 @@ ## Project Overview -This repository contains `@blwatkins/utils`, a growing ESM-first TypeScript utility package for reusable number, random, and string helpers. +This repository contains `@blwatkins/utils`, a growing ESM-first TypeScript utility package for reusable number, random, string, and discriminator type-guard helpers. The package source is maintained in `src/`, bundled to `_dist/` with `tsdown`, and documented through TypeDoc output plus manually maintained GitHub Pages release docs under `docs/`. diff --git a/CLAUDE.md b/CLAUDE.md index 8a2f3b5..0a49679 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -14,7 +14,7 @@ Updates to `CLAUDE.md` should be reflected, when appropriate, in `.github/copilo ## Project Summary -A growing ESM-first TypeScript utility package for reusable number, random, and string helpers. +A growing ESM-first TypeScript utility package for reusable number, random, string, and discriminator type-guard helpers. ## Common Commands diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html deleted file mode 100644 index b3d2c5f..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.3/doc/enums/discriminator.Discriminators.html +++ /dev/null @@ -1,6 +0,0 @@ -Discriminators | @blwat/utils - v0.1.0-alpha.3

        Enumeration Discriminators

        Valid discriminators for package types and interfaces.

        -

        0.1.0

        -
        Index

        Enumeration Members

        Enumeration Members

        WeightedElement: "@blwat/utils:WeightedElement"

        Discriminator value for the WeightedElement interface.

        -

        0.1.0

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        From 10676f61cc12eb5e166a30a48c255c2c8ff892ff Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sat, 4 Jul 2026 13:38:11 -0500 Subject: [PATCH 068/122] Add unit tests for randomInteger to random.test.ts --- test/random/random.test.ts | 76 ++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 83397ff..e59242d 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -215,8 +215,8 @@ describe('Random', (): void => { test.todo('Input validation'); }); - describe('randomInt', (): void => { - describe('randomInt should return a number between the given min and max', (): void => { + describe('randomInt and randomInteger', (): void => { + describe('randomInt and randomInteger should return a number between the given min and max', (): void => { test.each([ { min: 0, max: 1 }, { min: 0, max: 50 }, @@ -225,19 +225,21 @@ describe('Random', (): void => { { min: -50, max: 0 }, { min: -500, max: -100 }, { min: -100, max: 100 } - ])('randomInt($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { - const numbers: number[] = []; + ])('randomInt($min, $max) and randomInteger($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { + const intNumbers: number[] = []; + const integerNumbers: number[] = []; for (let i: number = 0; i < testRepeatTotal; i++) { - const r: number = Random.randomInt(min, max); - numbers.push(r); + intNumbers.push(Random.randomInt(min, max)); + integerNumbers.push(Random.randomInteger(min, max)); } - validateRandomIntValues(numbers, min, max); + validateRandomIntValues(intNumbers, min, max); + validateRandomIntValues(integerNumbers, min, max); }); }); - describe('randomInt should return a number between Math.floor(min) and Math.floor(max) when the given min and max are float number types', (): void => { + describe('randomInt and randomInteger should return a number between Math.floor(min) and Math.floor(max) when the given min and max are float number types', (): void => { test.each([ { min: 0.33, max: 1.5 }, { min: 0.5, max: 50.34 }, @@ -252,57 +254,63 @@ describe('Random', (): void => { { min: -3.75, max: -0.5 }, { min: -100.777, max: 100.222 }, { min: -0.5, max: 0.5 } - ])('randomInt($min, $max) should return a number between Math.floor($min) and Math.floor($max)', ({ min, max }: { min: number; max: number; }): void => { - const numbers: number[] = []; + ])('randomInt($min, $max) and randomInteger($min, $max) should return a number between Math.floor($min) and Math.floor($max)', ({ min, max }: { min: number; max: number; }): void => { + const intNumbers: number[] = []; + const integerNumbers: number[] = []; for (let i: number = 0; i < testRepeatTotal; i++) { - const r: number = Random.randomInt(min, max); - numbers.push(r); + intNumbers.push(Random.randomInt(min, max)); + integerNumbers.push(Random.randomInteger(min, max)); } - validateRandomIntValues(numbers, min, max); + validateRandomIntValues(intNumbers, min, max); + validateRandomIntValues(integerNumbers, min, max); }); }); - describe('randomInt should return min when min and max are equal', (): void => { + describe('randomInt and randomInteger should return min when min and max are equal', (): void => { test.each([ { min: 0, max: 0 }, { min: 1, max: 1 }, { min: -1, max: -1 }, { min: 10, max: 10 }, { min: -10, max: -10 }, - ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { - const numbers: number[] = []; + ])('randomInt($min, $max) and randomInteger($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + const intNumbers: number[] = []; + const integerNumbers: number[] = []; for (let i: number = 0; i < testRepeatTotal; i++) { - const r: number = Random.randomInt(min, max); - numbers.push(r); + intNumbers.push(Random.randomInt(min, max)); + integerNumbers.push(Random.randomInteger(min, max)); } - validateRandomIntValues(numbers, min, max); + validateRandomIntValues(intNumbers, min, max); + validateRandomIntValues(integerNumbers, min, max); }); }); - describe('randomInt should return Math.floor(min) when min and max are equal and float number types', (): void => { + describe('randomInt and randomInteger should return Math.floor(min) when min and max are equal and float number types', (): void => { test.each([ { min: 1.8, max: 1.8 }, { min: 10.5, max: 10.5 }, { min: -10.5, max: -10.5 }, { min: 0.5, max: 0.5 }, { min: -0.5, max: -0.5 } - ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { - const numbers: number[] = []; + ])('randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { + const intNumbers: number[] = []; + const integerNumbers: number[] = []; for (let i: number = 0; i < testRepeatTotal; i++) { - const r: number = Random.randomInt(min, max); - numbers.push(r); + intNumbers.push(Random.randomInt(min, max)); + integerNumbers.push(Random.randomInteger(min, max)); } - validateRandomIntValues(numbers, min, max); + validateRandomIntValues(intNumbers, min, max); + validateRandomIntValues(integerNumbers, min, max); }); }); - describe('randomInt should return Math.floor(min) when Math.floor(min) and Math.floor(max) are equal', (): void => { + describe('randomInt and randomInteger should return Math.floor(min) when Math.floor(min) and Math.floor(max) are equal', (): void => { test.each([ { min: 1.5, max: 1.89 }, { min: 10.01, max: 10.99 }, @@ -310,22 +318,20 @@ describe('Random', (): void => { { min: -10.4, max: -10.25 }, { min: 0.5, max: 0.75 }, { min: -0.99, max: -0.999 } - ])('randomInt($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { - const numbers: number[] = []; + ])('randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { + const intNumbers: number[] = []; + const integerNumbers: number[] = []; for (let i: number = 0; i < testRepeatTotal; i++) { - const r: number = Random.randomInt(min, max); - numbers.push(r); + intNumbers.push(Random.randomInt(min, max)); + integerNumbers.push(Random.randomInteger(min, max)); } - validateRandomIntValues(numbers, min, max); + validateRandomIntValues(intNumbers, min, max); + validateRandomIntValues(integerNumbers, min, max); }); }); test.todo('Input validation'); }); - - describe('randomInteger', (): void => { - test.todo('randomInteger'); - }); }); From f5fc79d8e082828f4be2e7ba10edffdff05a3199 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sat, 4 Jul 2026 15:03:50 -0500 Subject: [PATCH 069/122] Add base unit tests for randomBoolean to random.test.ts --- test/random/random.test.ts | 56 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index e59242d..97b9a45 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -79,6 +79,28 @@ describe('Random', (): void => { } } + function validateRandomBooleans(booleans: boolean[], expectedValue?: boolean): void { + for (const bool of booleans) { + expectTypeOf(bool).toBeBoolean(); + + if (expectedValue === undefined) { + expect(bool).toBeOneOf([true, false]); + } else if (expectedValue) { + expect(bool).toBe(true); + } else { + expect(bool).toBe(false); + } + } + + const booleanSet: Set = new Set(booleans); + + if (expectedValue === undefined) { + expect(booleanSet.size).toBe(2); + } else { + expect(booleanSet.size).toBe(1); + } + } + describe('new Random()', (): void => { describe('Runtime behavior guards', (): void => { test('Constructor should throw an error when instantiated at runtime', (): void => { @@ -334,4 +356,38 @@ describe('Random', (): void => { test.todo('Input validation'); }); + + describe('randomBoolean', (): void => { + test('randomBoolean should only return true or false', (): void => { + const booleans: boolean[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + booleans.push(Random.randomBoolean()); + } + + validateRandomBooleans(booleans); + }); + + test('randomBoolean(0) should always return false', (): void => { + const booleans: boolean[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + booleans.push(Random.randomBoolean(0)); + } + + validateRandomBooleans(booleans, false); + }); + + test('randomBoolean(1) should always return true', (): void => { + const booleans: boolean[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + booleans.push(Random.randomBoolean(1)); + } + + validateRandomBooleans(booleans, true); + }); + + test.todo('Input validation'); + }); }); From 951395dfefadafe017785b3744c0d6e7f21f105c Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sat, 4 Jul 2026 16:46:44 -0500 Subject: [PATCH 070/122] Add base unit tests for randomElement to random.test.ts --- test/random/random.test.ts | 52 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 97b9a45..0a8161a 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -101,6 +101,16 @@ describe('Random', (): void => { } } + function validateRandomElements(selected: unknown[], input: unknown[], type: string): void { + for (const element of selected) { + expect(typeof element).toBe(type); + expect(element).toBeOneOf(input); + } + + const elementSet: Set = new Set(selected); + expect(elementSet.size).toBe(input.length); + } + describe('new Random()', (): void => { describe('Runtime behavior guards', (): void => { test('Constructor should throw an error when instantiated at runtime', (): void => { @@ -390,4 +400,46 @@ describe('Random', (): void => { test.todo('Input validation'); }); + + describe('randomElement', (): void => { + describe('randomElement should return an element from the given list with the proper element type', (): void => { + test.each([ + { + input: [1, 2, 3, 4, 5], + type: 'number' + }, + { + input: [1.1, 2.2, 3.3, 4.4, 5.5], + type: 'number' + }, + { + input: [1], + type: 'number' + }, + { + input: ['it', 'was', 'the', 'best', 'of', 'times'], + type: 'string' + }, + { + input: ['see', 'spot', 'run'], + type: 'string' + }, + { + input: ['hello'], + type: 'string' + } + ])('randomElement($input) should return an element from ($input)', ({ input, type }: { input: unknown[]; type: string }): void => { + const selected: unknown[] = []; + const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); + + for (let i: number = 0; i < repeatTotal; i++) { + selected.push(Random.randomElement(input)); + } + + validateRandomElements(selected, input, type); + }); + }); + + test.todo('Input validation'); + }); }); From 444bd2e86c048eae4791f2df8250ebe069e4f440 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sat, 4 Jul 2026 23:00:48 -0500 Subject: [PATCH 071/122] Add unit tests for randomWeightedElement to random.test.ts --- test/random/random.test.ts | 154 ++++++++++++++++++++++++++++++++++++- 1 file changed, 153 insertions(+), 1 deletion(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 0a8161a..9f84ab1 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -20,7 +20,7 @@ import { describe, test, afterEach, expect, expectTypeOf } from 'vitest'; -import { Random } from '../../src'; +import {Random, WeightedElementUtility, WeightedList} from '../../src'; describe('Random', (): void => { const testRepeatTotal: number = 20; @@ -442,4 +442,156 @@ describe('Random', (): void => { test.todo('Input validation'); }); + + describe('randomWeightedElement', (): void => { + describe('randomWeightedElement should return an element from the given list with the proper element type', (): void => { + test.each([ + { + input: [ + { value: 1, weight: 0.25 }, + { value: 2, weight: 0.25 }, + { value: 3, weight: 0.25 }, + { value: 4, weight: 0.25 } + ], + type: 'number' + }, + { + input: [ + { value: 1, weight: 0.5 }, + { value: 2, weight: 0.2 }, + { value: 3, weight: 0.2 }, + { value: 4, weight: 0.1 } + ], + type: 'number' + }, + { + input: [ + { value: 1.1, weight: 0.25 }, + { value: 2.2, weight: 0.25 }, + { value: 3.3, weight: 0.25 }, + { value: 4.4, weight: 0.25 } + ], + type: 'number' + }, + { + input: [ + { value: 1, weight: 1 } + ], + type: 'number' + }, + { + input: [ + { value: 'it', weight: 0.25 }, + { value: 'was', weight: 0.25 }, + { value: 'the', weight: 0.25 }, + { value: 'best', weight: 0.25 } + ], + type: 'string' + }, + { + input: [ + { value: 'see', weight: 0.33 }, + { value: 'spot', weight: 0.33 }, + { value: 'run', weight: 0.34 } + ], + type: 'string' + }, + { + input: [ + { value: 'hello', weight: 1 } + ], + type: 'string' + } + ])('randomWeightedElement($input) should return an element from ($input)', ({ input, type }: { input: { value: unknown; weight: number }[]; type: string }): void => { + const selected: unknown[] = []; + const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); + const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); + const expectedElements: unknown[] = input.map((item: { value: unknown; weight: number}): unknown => item.value); + + for (let i: number = 0; i < repeatTotal; i++) { + selected.push(Random.randomWeightedElement(weightedElements)); + } + + validateRandomElements(selected, expectedElements, type); + }); + }); + + describe('randomWeightedElement should not return an element from the given list if the weight is zero', (): void => { + test.each([ + { + input: [ + { value: 1, weight: 0.25 }, + { value: 2, weight: 0 }, + { value: 3, weight: 0.25 }, + { value: 4, weight: 0.25 }, + { value: 5, weight: 0.25 } + ], + expected: [1, 3, 4, 5], + type: 'number' + }, + { + input: [ + { value: 1, weight: 0.5 }, + { value: 2, weight: 0 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0.2 } + ], + expected: [1, 3, 4], + type: 'number' + }, + { + input: [ + { value: 1, weight: 0 }, + { value: 2, weight: 0.3 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0.4 } + ], + expected: [2, 3, 4], + type: 'number' + }, + { + input: [ + { value: 1, weight: 0.4 }, + { value: 2, weight: 0.3 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0 } + ], + expected: [1, 2, 3], + type: 'number' + }, + { + input: [ + { value: 1.1, weight: 0 }, + { value: 2.2, weight: 0.25 }, + { value: 3.3, weight: 0.25 }, + { value: 4.4, weight: 0.5 } + ], + expected: [2.2, 3.3, 4.4], + type: 'number' + }, + { + input: [ + { value: 'it', weight: 0.2 }, + { value: 'was', weight: 0.4 }, + { value: 'the', weight: 0 }, + { value: 'best', weight: 0.4 } + ], + expected: ['it', 'was', 'best'], + type: 'string' + } + ])('randomWeightedElement should not return an element from ($input) if the weight is zero', ({ input, expected, type }: { input: { value: unknown; weight: number }[]; expected: unknown[]; type: string }): void => { + const selected: unknown[] = []; + const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); + const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); + + for (let i: number = 0; i < repeatTotal; i++) { + selected.push(Random.randomWeightedElement(weightedElements)); + } + + validateRandomElements(selected, expected, type); + }); + }); + + test.todo('Input validation'); + }); }); From 28ca5b58ac4f8c304248dbd99eb7e775bfbefc1f Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 5 Jul 2026 12:33:06 -0500 Subject: [PATCH 072/122] regenerate v0.1.0-alpha.0 docs to make sure they're in line with release. --- .../discriminator.DiscriminatorRegistry.html | 6 +++--- .../doc/classes/number.NumberUtility.html | 8 ++++---- .../random.RandomNumberGeneratorFactory.html | 6 +++--- .../doc/classes/random.SeedVersions.html | 8 ++++---- .../random.SeededRandomNumberGenerator.html | 6 +++--- .../doc/classes/string.StringUtility.html | 18 +++++++++--------- ...iscriminator.DiscriminatorRegistration.html | 6 +++--- .../doc/interfaces/random.SeedVersion.html | 4 ++-- .../doc/types/discriminator.Discriminated.html | 2 +- .../doc/types/discriminator.TypeGuard.html | 2 +- .../discriminator.discriminatedSchema.html | 2 +- 11 files changed, 34 insertions(+), 34 deletions(-) diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html index 6b4fd20..bc5c292 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html @@ -1,7 +1,7 @@ DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.0

        Class DiscriminatorRegistry

        Static registry for managing discriminators and their associated type guards. Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

        0.1.0

        -
        Index

        Methods

        has +
        Index

        Methods

        Methods

        • Checks if a discriminator is already registered.

          Parameters

          • discriminator: string

            The discriminator value to check.

            @@ -9,7 +9,7 @@
          • true if the discriminator is registered, false otherwise.

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html index 76982ea..65c6dd5 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html @@ -1,17 +1,17 @@ NumberUtility | @blwatkins/utils - v0.1.0-alpha.0

        Class NumberUtility

        Static properties and methods for validating number types.

        0.1.0

        -
        Index
        Index

        Methods

        • Is the given input a finite number?

          Parameters

          • input: unknown

          Returns input is number

          true when the input is a finite number; false otherwise.

          0.1.0

          -
        • Is the given input an integer?

          Parameters

          • input: unknown

          Returns input is number

          true when the input is an integer; false otherwise.

          0.1.0

          -
        • Is the given input a positive integer?

          +
        • Is the given input a positive integer?

          Parameters

          • input: unknown
          • OptionalzeroInclusive: boolean

            true if zero should be considered a valid input. false if zero should be considered an invalid input.

          Returns input is number

          true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html index d1cf318..09ef6a3 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html @@ -1,6 +1,6 @@ RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.0

        Class RandomNumberGeneratorFactory

        A static factory class for creating a SeededRandomNumberGenerator object.

        0.1.0

        -
        Index

        Methods

        Index

        Methods

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html index 3a10ac4..dce9e0e 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html @@ -1,14 +1,14 @@ SeedVersions | @blwatkins/utils - v0.1.0-alpha.0

        Class SeedVersions

        A static class for accessing different seed versions. Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

        0.1.0

        -
        Index

        Accessors

        Index

        Accessors

        Methods

        Accessors

        Methods

        Methods

        • Parameters

          • index: number

            The index of the seed version to retrieve. Must be a valid SeedVersions index.

          Returns SeedVersion

          • The seed version with the given index.
          • @@ -17,7 +17,7 @@
          • If the index is not a valid seed version index.

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html index 3a6db7b..fcb21b7 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html @@ -1,7 +1,7 @@ SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.0

        Class SeededRandomNumberGenerator

        Deterministic seeded pseudorandom number generator. This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

        0.1.0

        -
        Index

        Constructors

        Index

        Constructors

        Methods

        Constructors

        • Parameters

          • state: [number, number, number, number]

            Initial 128-bit state. Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

            @@ -9,10 +9,10 @@

            If each element of state is not a 32-bit unsigned integer.

            If state does not have at least one element that is greater than 0.

            0.1.0

            -

        Methods

        • Returns number

            +

        Methods

        • Returns number

          • The next pseudorandom float in the range [0, 1).

          This method advances the internal 128-bit xoshiro128** state by one step. Successive calls produce an independent, uniformly distributed sequence.

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html index f0228c0..f7d090f 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html @@ -1,6 +1,6 @@ StringUtility | @blwatkins/utils - v0.1.0-alpha.0

        Class StringUtility

        Static properties and methods for validating string types.

        0.1.0

        -
        Index
        Index

        Accessors

        • get singleLineLowercaseTrimmedPattern(): RegExp

          Returns RegExp

          Regular expression pattern for validating single-line lowercase strings.

          This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

          0.1.0

          -
        • get singleLineTrimmedPattern(): RegExp

          Returns RegExp

          Regular expression pattern for validating single-line mixed-case strings.

          +
        • get singleLineTrimmedPattern(): RegExp

          Returns RegExp

          Regular expression pattern for validating single-line mixed-case strings.

          This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

          0.1.0

          -
        • get singleLineUppercaseTrimmedPattern(): RegExp

          Returns RegExp

          Regular expression pattern for validating single-line uppercase strings.

          +
        • get singleLineUppercaseTrimmedPattern(): RegExp

          Returns RegExp

          Regular expression pattern for validating single-line uppercase strings.

          This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

          0.1.0

          -

        Methods

        Methods

        • Is the given input a non-empty string? Non-empty strings must contain at least one non-whitespace character.

          Parameters

          • input: unknown

          Returns boolean

          0.1.0

          -
        • Is the given input a single-line lowercase string that is trimmed (no leading or trailing whitespace)?

          +
        • Is the given input a single-line string that is trimmed (no leading or trailing whitespace)?

          +
        • Is the given input a single-line uppercase string that is trimmed (no leading or trailing whitespace)?

          +
        • Is the given input a string?

          Parameters

          • input: unknown

          Returns input is string

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html index e27de8f..bc8bab8 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -1,14 +1,14 @@ DiscriminatorRegistration | @blwatkins/utils - v0.1.0-alpha.0

        Interface DiscriminatorRegistration

        A registration for a discriminator to the DiscriminatorRegistry.

        0.1.0

        -
        interface DiscriminatorRegistration {
            discriminator: string;
            validator: (input: unknown) => boolean;
        }
        Index

        Properties

        interface DiscriminatorRegistration {
            discriminator: string;
            validator: (input: unknown) => boolean;
        }
        Index

        Properties

        discriminator: string

        The discriminator value that identifies the type of a Discriminated object. This value must be unique across all registered discriminators.

        0.1.0

        -
        validator: (input: unknown) => boolean

        A method that validates whether an input matches the type associated with the discriminator.

        +
        validator: (input: unknown) => boolean

        A method that validates whether an input matches the type associated with the discriminator.

        Type Declaration

          • (input: unknown): boolean
          • Parameters

            • input: unknown

              The input to validate.

            Returns boolean

            • true if the input matches the type associated with the discriminator, false otherwise.

        0.1.0

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html index 1ea9b9c..6ac3bdd 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html @@ -1,8 +1,8 @@ SeedVersion | @blwatkins/utils - v0.1.0-alpha.0

        Interface SeedVersion

        A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

        0.1.0

        -
        interface SeedVersion {
            offsets: readonly [number, number, number, number];
        }
        Index

        Properties

        interface SeedVersion {
            offsets: readonly [number, number, number, number];
        }
        Index

        Properties

        Properties

        offsets: readonly [number, number, number, number]

        A collection of offset values for the FNV-1a hashing algorithm. Each offset value should be a 32-bit unsigned integer.

        0.1.0

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html index 54c63cf..f74dfea 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html @@ -1,3 +1,3 @@ Discriminated | @blwatkins/utils - v0.1.0-alpha.0

        Type Alias Discriminated

        Discriminated: Static<typeof discriminatedSchema>

        Discriminated objects can be type checked using the discriminator registry.

        0.1.0

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html index 89a0309..69d3ae5 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html @@ -1,3 +1,3 @@ TypeGuard | @blwatkins/utils - v0.1.0-alpha.0

        Type Alias TypeGuard<T>

        TypeGuard: (input: unknown) => input is T

        A type guard function that checks if an input is of a specific Discriminated type.

        Type Parameters

        Type Declaration

          • (input: unknown): input is T
          • Parameters

            • input: unknown

            Returns input is T

        0.1.0

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html index e193874..6e7c94b 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html @@ -1,3 +1,3 @@ discriminatedSchema | @blwatkins/utils - v0.1.0-alpha.0

        Variable discriminatedSchemaConst

        discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

        TypeBox schema for validating that an object implements the Discriminated type.

        0.1.0

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        +

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        From 5b24c660eb5b371670ebae2a48c7ab6c71a49d2f Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 5 Jul 2026 12:35:11 -0500 Subject: [PATCH 073/122] Deleted generated docs to make sure everything is up to date with current and upcoming releases --- .../v0.1.0-alpha.0/doc/.nojekyll | 1 - .../v0.1.0-alpha.0/doc/assets/hierarchy.js | 1 - .../v0.1.0-alpha.0/doc/assets/highlight.css | 22 - .../v0.1.0-alpha.0/doc/assets/icons.js | 18 - .../v0.1.0-alpha.0/doc/assets/icons.svg | 1 - .../v0.1.0-alpha.0/doc/assets/main.js | 60 - .../v0.1.0-alpha.0/doc/assets/navigation.js | 1 - .../v0.1.0-alpha.0/doc/assets/search.js | 1 - .../v0.1.0-alpha.0/doc/assets/style.css | 1633 ----------------- .../discriminator.DiscriminatorRegistry.html | 22 - .../doc/classes/number.NumberUtility.html | 17 - .../doc/classes/random.Random.html | 0 .../random.RandomNumberGeneratorFactory.html | 39 - .../doc/classes/random.SeedVersions.html | 23 - .../random.SeededRandomNumberGenerator.html | 18 - .../random.WeightedElementUtility.html | 0 .../doc/classes/string.StringUtility.html | 34 - .../v0.1.0-alpha.0/doc/hierarchy.html | 1 - .../v0.1.0-alpha.0/doc/index.html | 59 - ...scriminator.DiscriminatorRegistration.html | 14 - .../doc/interfaces/random.SeedVersion.html | 8 - .../interfaces/random.WeightedElement.html | 0 .../v0.1.0-alpha.0/doc/modules.html | 1 - .../doc/modules/discriminator.html | 1 - .../v0.1.0-alpha.0/doc/modules/number.html | 1 - .../v0.1.0-alpha.0/doc/modules/random.html | 1 - .../v0.1.0-alpha.0/doc/modules/string.html | 1 - .../types/discriminator.Discriminated.html | 3 - .../doc/types/discriminator.TypeGuard.html | 3 - .../doc/types/random.WeightedList.html | 0 .../discriminator.discriminatedSchema.html | 3 - .../random.weightedElementSchema.html | 0 .../v0.1.0-alpha.1/doc/.nojekyll | 1 - .../v0.1.0-alpha.1/doc/assets/hierarchy.js | 1 - .../v0.1.0-alpha.1/doc/assets/highlight.css | 22 - .../v0.1.0-alpha.1/doc/assets/icons.js | 18 - .../v0.1.0-alpha.1/doc/assets/icons.svg | 1 - .../v0.1.0-alpha.1/doc/assets/main.js | 60 - .../v0.1.0-alpha.1/doc/assets/navigation.js | 1 - .../v0.1.0-alpha.1/doc/assets/search.js | 1 - .../v0.1.0-alpha.1/doc/assets/style.css | 1633 ----------------- .../discriminator.DiscriminatorRegistry.html | 30 - .../doc/classes/number.NumberUtility.html | 18 - .../random.RandomNumberGeneratorFactory.html | 39 - .../doc/classes/random.SeedVersions.html | 23 - .../random.SeededRandomNumberGenerator.html | 18 - .../classes/string.ColorStringUtility.html | 27 - .../doc/classes/string.StringUtility.html | 34 - .../v0.1.0-alpha.1/doc/hierarchy.html | 1 - .../v0.1.0-alpha.1/doc/index.html | 59 - ...scriminator.DiscriminatorRegistration.html | 14 - .../doc/interfaces/random.SeedVersion.html | 8 - .../v0.1.0-alpha.1/doc/modules.html | 1 - .../doc/modules/discriminator.html | 1 - .../v0.1.0-alpha.1/doc/modules/number.html | 1 - .../v0.1.0-alpha.1/doc/modules/random.html | 1 - .../v0.1.0-alpha.1/doc/modules/string.html | 1 - .../types/discriminator.Discriminated.html | 3 - .../doc/types/discriminator.TypeGuard.html | 3 - .../discriminator.discriminatedSchema.html | 3 - 60 files changed, 4010 deletions(-) delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/.nojekyll delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/hierarchy.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/highlight.css delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.svg delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/main.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/navigation.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/search.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/style.css delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.Random.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.WeightedElementUtility.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/hierarchy.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.WeightedElement.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/discriminator.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/number.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/random.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/string.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/random.WeightedList.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/random.weightedElementSchema.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/.nojekyll b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/.nojekyll deleted file mode 100644 index e2ac661..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/hierarchy.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/hierarchy.js deleted file mode 100644 index fb85f0a..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/hierarchy.js +++ /dev/null @@ -1 +0,0 @@ -window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/highlight.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/highlight.css deleted file mode 100644 index 5674cf3..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/highlight.css +++ /dev/null @@ -1,22 +0,0 @@ -:root { - --light-code-background: #FFFFFF; - --dark-code-background: #1E1E1E; -} - -@media (prefers-color-scheme: light) { :root { - --code-background: var(--light-code-background); -} } - -@media (prefers-color-scheme: dark) { :root { - --code-background: var(--dark-code-background); -} } - -:root[data-theme='light'] { - --code-background: var(--light-code-background); -} - -:root[data-theme='dark'] { - --code-background: var(--dark-code-background); -} - -pre, code { background: var(--code-background); } diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.js deleted file mode 100644 index 4fbadc5..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.js +++ /dev/null @@ -1,18 +0,0 @@ -(function() { - addIcons(); - function addIcons() { - if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); - const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); - svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; - svg.style.display = "none"; - if (location.protocol === "file:") updateUseElements(); - } - - function updateUseElements() { - document.querySelectorAll("use").forEach(el => { - if (el.getAttribute("href").includes("#icon-")) { - el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); - } - }); - } -})() \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.svg b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.svg deleted file mode 100644 index be7798f..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.svg +++ /dev/null @@ -1 +0,0 @@ -MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/main.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/main.js deleted file mode 100644 index 8182cee..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/main.js +++ /dev/null @@ -1,60 +0,0 @@ -"use strict"; -window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","search_index_not_available":"The search index is not available","search_no_results_found_for_0":"No results found for {0}","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; -"use strict";(()=>{var Ke=Object.create;var he=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var et=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var tt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ze(e))!Ye.call(t,i)&&i!==n&&he(t,i,{get:()=>e[i],enumerable:!(r=Ge(e,i))||r.enumerable});return t};var nt=(t,e,n)=>(n=t!=null?Ke(Xe(t)):{},tt(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var ye=et((me,ge)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=(function(e){return function(n){e.console&&console.warn&&console.warn(n)}})(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,l],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?d+=2:a==c&&(n+=r[l+1]*i[d+1],l+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),f=s.str.charAt(1),p;f in s.node.edges?p=s.node.edges[f]:(p=new t.TokenSet,s.node.edges[f]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}if(s.type===t.QueryLexer.TERM)return t.QueryParser.parseTerm;var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},(function(e,n){typeof define=="function"&&define.amd?define(n):typeof me=="object"?ge.exports=n():e.lunr=n()})(this,function(){return t})})()});var M,G={getItem(){return null},setItem(){}},K;try{K=localStorage,M=K}catch{K=G,M=G}var S={getItem:t=>M.getItem(t),setItem:(t,e)=>M.setItem(t,e),disableWritingLocalStorage(){M=G},disable(){localStorage.clear(),M=G},enable(){M=K}};window.TypeDoc||={disableWritingLocalStorage(){S.disableWritingLocalStorage()},disableLocalStorage:()=>{S.disable()},enableLocalStorage:()=>{S.enable()}};window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",search_index_not_available:"The search index is not available",search_no_results_found_for_0:"No results found for {0}",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var pe=[];function X(t,e){pe.push({selector:e,constructor:t})}var Z=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){pe.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!rt(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function rt(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var fe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var Ie=nt(ye(),1);async function R(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}var Y="closing",ae="tsd-overlay";function it(){let t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.body.style.overflow="hidden",document.body.style.paddingRight=`${t}px`}function st(){document.body.style.removeProperty("overflow"),document.body.style.removeProperty("padding-right")}function Ee(t,e){t.addEventListener("animationend",()=>{t.classList.contains(Y)&&(t.classList.remove(Y),document.getElementById(ae)?.remove(),t.close(),st())}),t.addEventListener("cancel",n=>{n.preventDefault(),ve(t)}),e?.closeOnClick&&document.addEventListener("click",n=>{t.open&&!t.contains(n.target)&&ve(t)},!0)}function xe(t){if(t.open)return;let e=document.createElement("div");e.id=ae,document.body.appendChild(e),t.showModal(),it()}function ve(t){if(!t.open)return;document.getElementById(ae)?.classList.add(Y),t.classList.add(Y)}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var le={};function Le(t){for(let e of t.split(/\s+/))if(le.hasOwnProperty(e)&&!le[e])return!0;return!1}var ee=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=S.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){S.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),le[`tsd-is-${this.el.name}`]=this.value,this.app.filterChanged(),this.app.updateIndexVisibility()}};var we=0;async function Se(t,e){if(!window.searchData)return;let n=await R(window.searchData);t.data=n,t.index=Ie.Index.load(n.index),e.innerHTML=""}function _e(){let t=document.getElementById("tsd-search-trigger"),e=document.getElementById("tsd-search"),n=document.getElementById("tsd-search-input"),r=document.getElementById("tsd-search-results"),i=document.getElementById("tsd-search-script"),s=document.getElementById("tsd-search-status");if(!(t&&e&&n&&r&&i&&s))throw new Error("Search controls missing");let o={base:document.documentElement.dataset.base};o.base.endsWith("/")||(o.base+="/"),i.addEventListener("error",()=>{let a=window.translations.search_index_not_available;Pe(s,a)}),i.addEventListener("load",()=>{Se(o,s)}),Se(o,s),ot({trigger:t,searchEl:e,results:r,field:n,status:s},o)}function ot(t,e){let{field:n,results:r,searchEl:i,status:s,trigger:o}=t;Ee(i,{closeOnClick:!0});function a(){xe(i),n.setSelectionRange(0,n.value.length)}o.addEventListener("click",a),n.addEventListener("input",fe(()=>{at(r,n,s,e)},200)),n.addEventListener("keydown",l=>{if(r.childElementCount===0||l.ctrlKey||l.metaKey||l.altKey)return;let d=n.getAttribute("aria-activedescendant"),f=d?document.getElementById(d):null;if(f){let p=!1,v=!1;switch(l.key){case"Home":case"End":case"ArrowLeft":case"ArrowRight":v=!0;break;case"ArrowDown":case"ArrowUp":p=l.shiftKey;break}(p||v)&&ke(n)}if(!l.shiftKey)switch(l.key){case"Enter":f?.querySelector("a")?.click();break;case"ArrowUp":Te(r,n,f,-1),l.preventDefault();break;case"ArrowDown":Te(r,n,f,1),l.preventDefault();break}});function c(){ke(n)}n.addEventListener("change",c),n.addEventListener("blur",c),n.addEventListener("click",c),document.body.addEventListener("keydown",l=>{if(l.altKey||l.metaKey||l.shiftKey)return;let d=l.ctrlKey&&l.key==="k",f=!l.ctrlKey&&!ut()&&l.key==="/";(d||f)&&(l.preventDefault(),a())})}function at(t,e,n,r){if(!r.index||!r.data)return;t.innerHTML="",n.innerHTML="",we+=1;let i=e.value.trim(),s;if(i){let a=i.split(" ").map(c=>c.length?`*${c}*`:"").join(" ");s=r.index.search(a).filter(({ref:c})=>{let l=r.data.rows[Number(c)].classes;return!l||!Le(l)})}else s=[];if(s.length===0&&i){let a=window.translations.search_no_results_found_for_0.replace("{0}",` "${te(i)}" `);Pe(n,a);return}for(let a=0;ac.score-a.score);let o=Math.min(10,s.length);for(let a=0;a`,f=Ce(c.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(f+=` (score: ${s[a].score.toFixed(2)})`),c.parent&&(f=` - ${Ce(c.parent,i)}.${f}`);let p=document.createElement("li");p.id=`tsd-search:${we}-${a}`,p.role="option",p.ariaSelected="false",p.classList.value=c.classes??"";let v=document.createElement("a");v.tabIndex=-1,v.href=r.base+c.url,v.innerHTML=d+`${f}`,p.append(v),t.appendChild(p)}}function Te(t,e,n,r){let i;if(r===1?i=n?.nextElementSibling||t.firstElementChild:i=n?.previousElementSibling||t.lastElementChild,i!==n){if(!i||i.role!=="option"){console.error("Option missing");return}i.ariaSelected="true",i.scrollIntoView({behavior:"smooth",block:"nearest"}),e.setAttribute("aria-activedescendant",i.id),n?.setAttribute("aria-selected","false")}}function ke(t){let e=t.getAttribute("aria-activedescendant");(e?document.getElementById(e):null)?.setAttribute("aria-selected","false"),t.setAttribute("aria-activedescendant","")}function Ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var lt={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>lt[e])}function Pe(t,e){t.innerHTML=e?`
        ${e}
        `:""}var ct=["button","checkbox","file","hidden","image","radio","range","reset","submit"];function ut(){let t=document.activeElement;return t?t.isContentEditable||t.tagName==="TEXTAREA"||t.tagName==="SEARCH"?!0:t.tagName==="INPUT"&&!ct.includes(t.type):!1}var D="mousedown",Me="mousemove",$="mouseup",ne={x:0,y:0},Qe=!1,ce=!1,dt=!1,F=!1,Oe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Oe?"is-mobile":"not-mobile");Oe&&"ontouchstart"in document.documentElement&&(dt=!0,D="touchstart",Me="touchmove",$="touchend");document.addEventListener(D,t=>{ce=!0,F=!1;let e=D=="touchstart"?t.targetTouches[0]:t;ne.y=e.pageY||0,ne.x=e.pageX||0});document.addEventListener(Me,t=>{if(ce&&!F){let e=D=="touchstart"?t.targetTouches[0]:t,n=ne.x-(e.pageX||0),r=ne.y-(e.pageY||0);F=Math.sqrt(n*n+r*r)>10}});document.addEventListener($,()=>{ce=!1});document.addEventListener("click",t=>{Qe&&(t.preventDefault(),t.stopImmediatePropagation(),Qe=!1)});var re=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener($,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(D,n=>this.onDocumentPointerDown(n)),document.addEventListener($,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){F||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!F&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ue=new Map,de=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;S.setItem(this.key,e.toString())}},ie=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(ue.has(i))s=ue.get(i);else{let o=S.getItem(i),a=o?o==="true":this.el.open;s=new de(i,a),ue.set(i,s)}s.add(this.el)}};function He(t){let e=S.getItem("tsd-theme")||"os";t.value=e,Ae(e),t.addEventListener("change",()=>{S.setItem("tsd-theme",t.value),Ae(t.value)})}function Ae(t){document.documentElement.dataset.theme=t}var se;function Ne(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Re),Re())}async function Re(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await R(window.navigationData);se=document.documentElement.dataset.base,se.endsWith("/")||(se+="/"),t.innerHTML="";for(let n of e)Ve(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ve(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',De(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let c=a.appendChild(document.createElement("ul"));c.className="tsd-nested-navigation";for(let l of t.children)Ve(l,c,i)}else De(t,r,t.class)}function De(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=se+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&(r.classList.add("current"),r.ariaCurrent="page"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(Fe(t.text,document.createElement("span")))}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(Fe(t.text,document.createElement("span")))}}function Fe(t,e){let n=t.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);for(let r=0;r{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=gt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function pt(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Be),Be())}async function Be(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await R(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),ft(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function ft(t,e,n){let r=e.roots.filter(i=>mt(e,i,n));for(let i of r)t.appendChild(je(e,i,n))}function je(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let c=t.reflections[a],l=s.appendChild(document.createElement("a"));l.textContent=c.name,l.href=oe+c.url,l.className=c.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=oe+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let c=je(t,a,n,r);c&&o.appendChild(c)}}return r.delete(e),s}function mt(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function gt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='',t}X(re,"a[data-toggle]");X(ie,".tsd-accordion");X(ee,".tsd-filter-item input[type=checkbox]");var qe=document.getElementById("tsd-theme");qe&&He(qe);var yt=new Z;Object.defineProperty(window,"app",{value:yt});_e();Ne();$e();"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0);})(); -/*! Bundled license information: - -lunr/lunr.js: - (** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - *) - (*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - *) - (*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - *) -*/ diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/navigation.js deleted file mode 100644 index 475b836..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/navigation.js +++ /dev/null @@ -1 +0,0 @@ -window.navigationData = "eJytlEtPwzAQhP8K2nMEtKg8ckMgKg5waKGXqgc3XpoViVPZW0SE8t9RkzZPJw0iV2dnvrE98fIHGL8ZXHiJ5C5AAw54PgVSowJ3mX+VZDxNISnBkQYHtoJ9cCHMRBeVz+c+hwE48ElKgju2Gz4EwphW3GPZb4YbMqzjAutl4hrWKqqGGY1vk1Xi5Jxnxag/hPenIIIpUkUYyj165Em1tQOaXFcyvcVbPLsPSPQ6HpRFEo63XSFQ1sCXdzejybiGnu6EPuGZj9n9yptZCE1i3atXKOeej6Eo2F9HcY1vEVWTXO1DlGOoXbhGS2+z9QEK+5oavTMFxJaiHjiVKVszy5m1UDIKm5mz9QEyz1KjLNMUFer94T4JjyPbv3bAdomaOyp2M0eUKK3qVlaH5hRqgdpQpEyn93Hon29Eycr6KjSJtgegjDSsSW2aV5+tD3D189Sota4HTmXKXtdVsvoFogoyxQ==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/search.js deleted file mode 100644 index 1c782d3..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/search.js +++ /dev/null @@ -1 +0,0 @@ -window.searchData = "eJy1mt1u2zgQhd+FvhVSz9D/l4vdFgWKoGja3hhGoViMQ6wtGZKcNmvk3ReUZGnGpBRace4Cm+fMIfmJZEQfRZr8zsRieRT/6jgSCwxEHO6UWIhIZ+tU73Qc5kkqAnFIt2Ihdkl02KrsA/v25jHfbUUg1tswy1QmFkK8BCdHwFnt+TdVfVMbneXpc+1dyc+8nRpHxUDsw1TFuRW9iYLDUZPlMcx6Vx6UYo/qbpO2TGnxvUr7ByMOV0k3nnROXpjrJK7T6jhX6UO49gpcSPvNIwxx9AqnPaMMzt36DmI5MC2Rn8Ktjq4SlzpdKyoO51MYo2veVVQnzp/3XWFV1PcR5cW/P+/Vp0OYdheuW/UrKp2rnoru1o9qF9aVn8JUh/f26ufQ9Ox8HSM+7O6VveqWH3svt7dF8x+53urcXmYrM9aoO3eVqmXx0tlHHetc3fLsr5Yb6OyhENad7qrODdqzfI5ztbkwhq4110jwNcl0rp9UnyT7SvvWRM3OEsZRsrOAKj/2Bupb0bys9knFKjUAfwzXeeLYxivvLk03blXmlgEOs+d4/ddBb6PelQeFx33l0RWi06st4f3bwl0zF53EO6UiFTmFbWE7JBdO4RgaJtdJnOXpYf2GwgPu0TlUXf1umcFY/cl7R6vEV8h0Pns/VZrpJLbPr8T11ObSR2yCMGpOKpn+T3lXGVStX+1xnb9l2Dcqr5r4196o/KnWvDmBzn6ak9XnOFJ//DPorDiP6UrVKwU5cJMmroOibXThXLMzafLwkKk8u6DQoJH49tS5NWV5quONtTWVH3tvTXdF87azTmXGGnWPVpWq48mIN1v1RcfqS/JbpeswU99Tvdup6GuY5yq10W3NMCi9tjpW25NXXnrta6+ulNzTJ/MVor5zwh/7/dVG9XDyulJmvlLcJvE/u33+fMc5fj2gzuIkVkZaPwLXyHPXSmaPhO1ovlPma0R934TnZL4p6jma183cI1mf+qtAlHve4ihOm/BC4I28mYtAPGi1jcw7xjJYINbJbmfsAhEl60Px56pq9lOZk5xpXLb+MBTBchjg9GY0latVsDyJiy+KD04ezSeFEESwhEDizXgGTAiWEJgQRbBElxAtITKhFMFSuoTSEkomHIlgOXIJR5ZwxITjtsEZW8IxE05EsBy7Kk4s4YQJpyJYTlzCqSWcMuFMBMupSzizhDMmnItgOXMJ55ZwzgEwPMydBNjswBk8BT1Dp9jBDwcIDBbgZs9mCDhEYNAAJ39gcwQcJDB4gJNBsFkCDhMYRMDJIdg8AQcKDCbgRApspoBDBQYVcGIFNlfAwQKDCzjRApst4HCBQQaceIHNF3DA0DADTsLQJgw5YWiYQSdhaBOGZ0tUsUY5CUPHKsUJQ8MMulc4mzDkhKFhBp2EoU0YcsLQMINOwtAmDDlhaJhBJ2FoE4acMDTMoJMwtAlDThgaZtBJGNqEIScMDTPoJAxtwpATJg0z6CRM2oRJTpg0zEgnYdImTHLCpGFGOgmTNmHybCMsdkInYdKxF3LCpGFGuvdRmzDJCZOGGekkTNqESU6YNMxIJ2HSJkxywqRhRjoJkzZh1UfFuelJpbmq3jSYYw99J3kUv6qDFdSvBY4CpmJxfHlpDlKL4ws5S5nvTDXbY0o8Zl4e7PUacZo3Tjj0cor4LVLjRTrm1y/mlFVXNI3frPGbX+rHezlsnIaldny5YcouShvzUWM+6u36zCaFzK6XI31l1tigJHPrF624DScOxMBLf34BRPpEO+VrVl+aEB+SCaSnz/l/542dJHbS18660yHxyJiD35j7/GtOApMC8vIC7b4EY+n3dPj890sKjEmBiW8B24asMtJvmeEvcwndpMvo1+XyJoBYkJUF/Z5V+9EgSzD4LcGlx+H0ipTgR/KAX5763S/pFRlj9Bvj060kiUJGF/xGtzQpO7c53Z48nC4liTVBCfxQan5NQ1AiJHmZZMUdjzMli0c2LvDbuYyzawUnHUW/jhInPqdk/UW/9dfjZTbxJxRLP4rb30CTOSJASz+gPd4WE38yLNJ3WMzdGOk53SU9QbKWNSQnOvQ70ZUmjkUACX/ox5/5Kc6m/HFO40Mi+SUiv2FqXAjCHgSvArHX+2L2xGK5enn5H39Tt60="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/style.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/style.css deleted file mode 100644 index 44328e9..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/style.css +++ /dev/null @@ -1,1633 +0,0 @@ -@layer typedoc { - :root { - --dim-toolbar-contents-height: 2.5rem; - --dim-toolbar-border-bottom-width: 1px; - --dim-header-height: calc( - var(--dim-toolbar-border-bottom-width) + - var(--dim-toolbar-contents-height) - ); - - /* 0rem For mobile; unit is required for calculation in `calc` */ - --dim-container-main-margin-y: 0rem; - - --dim-footer-height: 3.5rem; - - --modal-animation-duration: 0.2s; - } - - :root { - /* Light */ - --light-color-background: #f2f4f8; - --light-color-background-secondary: #eff0f1; - /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ - --light-color-background-active: #d6d8da; - --light-color-background-warning: #e6e600; - --light-color-warning-text: #222; - --light-color-accent: #c5c7c9; - --light-color-active-menu-item: var(--light-color-background-active); - --light-color-text: #222; - --light-color-contrast-text: #000; - --light-color-text-aside: #5e5e5e; - - --light-color-icon-background: var(--light-color-background); - --light-color-icon-text: var(--light-color-text); - - --light-color-comment-tag-text: var(--light-color-text); - --light-color-comment-tag: var(--light-color-background); - - --light-color-link: #1f70c2; - --light-color-focus-outline: #3584e4; - - --light-color-ts-keyword: #056bd6; - --light-color-ts-project: #b111c9; - --light-color-ts-module: var(--light-color-ts-project); - --light-color-ts-namespace: var(--light-color-ts-project); - --light-color-ts-enum: #7e6f15; - --light-color-ts-enum-member: var(--light-color-ts-enum); - --light-color-ts-variable: #4760ec; - --light-color-ts-function: #572be7; - --light-color-ts-class: #1f70c2; - --light-color-ts-interface: #108024; - --light-color-ts-constructor: var(--light-color-ts-class); - --light-color-ts-property: #9f5f30; - --light-color-ts-method: #be3989; - --light-color-ts-reference: #ff4d82; - --light-color-ts-call-signature: var(--light-color-ts-method); - --light-color-ts-index-signature: var(--light-color-ts-property); - --light-color-ts-constructor-signature: var( - --light-color-ts-constructor - ); - --light-color-ts-parameter: var(--light-color-ts-variable); - /* type literal not included as links will never be generated to it */ - --light-color-ts-type-parameter: #a55c0e; - --light-color-ts-accessor: #c73c3c; - --light-color-ts-get-signature: var(--light-color-ts-accessor); - --light-color-ts-set-signature: var(--light-color-ts-accessor); - --light-color-ts-type-alias: #d51270; - /* reference not included as links will be colored with the kind that it points to */ - --light-color-document: #000000; - - --light-color-alert-note: #0969d9; - --light-color-alert-tip: #1a7f37; - --light-color-alert-important: #8250df; - --light-color-alert-warning: #9a6700; - --light-color-alert-caution: #cf222e; - - --light-external-icon: url("data:image/svg+xml;utf8,"); - --light-color-scheme: light; - } - - :root { - /* Dark */ - --dark-color-background: #2b2e33; - --dark-color-background-secondary: #1e2024; - /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ - --dark-color-background-active: #5d5d6a; - --dark-color-background-warning: #bebe00; - --dark-color-warning-text: #222; - --dark-color-accent: #9096a2; - --dark-color-active-menu-item: var(--dark-color-background-active); - --dark-color-text: #f5f5f5; - --dark-color-contrast-text: #ffffff; - --dark-color-text-aside: #dddddd; - - --dark-color-icon-background: var(--dark-color-background-secondary); - --dark-color-icon-text: var(--dark-color-text); - - --dark-color-comment-tag-text: var(--dark-color-text); - --dark-color-comment-tag: var(--dark-color-background); - - --dark-color-link: #00aff4; - --dark-color-focus-outline: #4c97f2; - - --dark-color-ts-keyword: #3399ff; - --dark-color-ts-project: #e358ff; - --dark-color-ts-module: var(--dark-color-ts-project); - --dark-color-ts-namespace: var(--dark-color-ts-project); - --dark-color-ts-enum: #f4d93e; - --dark-color-ts-enum-member: var(--dark-color-ts-enum); - --dark-color-ts-variable: #798dff; - --dark-color-ts-function: #a280ff; - --dark-color-ts-class: #8ac4ff; - --dark-color-ts-interface: #6cff87; - --dark-color-ts-constructor: var(--dark-color-ts-class); - --dark-color-ts-property: #ff984d; - --dark-color-ts-method: #ff4db8; - --dark-color-ts-reference: #ff4d82; - --dark-color-ts-call-signature: var(--dark-color-ts-method); - --dark-color-ts-index-signature: var(--dark-color-ts-property); - --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); - --dark-color-ts-parameter: var(--dark-color-ts-variable); - /* type literal not included as links will never be generated to it */ - --dark-color-ts-type-parameter: #e07d13; - --dark-color-ts-accessor: #ff6060; - --dark-color-ts-get-signature: var(--dark-color-ts-accessor); - --dark-color-ts-set-signature: var(--dark-color-ts-accessor); - --dark-color-ts-type-alias: #ff6492; - /* reference not included as links will be colored with the kind that it points to */ - --dark-color-document: #ffffff; - - --dark-color-alert-note: #0969d9; - --dark-color-alert-tip: #1a7f37; - --dark-color-alert-important: #8250df; - --dark-color-alert-warning: #9a6700; - --dark-color-alert-caution: #cf222e; - - --dark-external-icon: url("data:image/svg+xml;utf8,"); - --dark-color-scheme: dark; - } - - @media (prefers-color-scheme: light) { - :root { - --color-background: var(--light-color-background); - --color-background-secondary: var( - --light-color-background-secondary - ); - --color-background-active: var(--light-color-background-active); - --color-background-warning: var(--light-color-background-warning); - --color-warning-text: var(--light-color-warning-text); - --color-accent: var(--light-color-accent); - --color-active-menu-item: var(--light-color-active-menu-item); - --color-text: var(--light-color-text); - --color-contrast-text: var(--light-color-contrast-text); - --color-text-aside: var(--light-color-text-aside); - - --color-icon-background: var(--light-color-icon-background); - --color-icon-text: var(--light-color-icon-text); - - --color-comment-tag-text: var(--light-color-text); - --color-comment-tag: var(--light-color-background); - - --color-link: var(--light-color-link); - --color-focus-outline: var(--light-color-focus-outline); - - --color-ts-keyword: var(--light-color-ts-keyword); - --color-ts-project: var(--light-color-ts-project); - --color-ts-module: var(--light-color-ts-module); - --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-enum-member: var(--light-color-ts-enum-member); - --color-ts-variable: var(--light-color-ts-variable); - --color-ts-function: var(--light-color-ts-function); - --color-ts-class: var(--light-color-ts-class); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-constructor: var(--light-color-ts-constructor); - --color-ts-property: var(--light-color-ts-property); - --color-ts-method: var(--light-color-ts-method); - --color-ts-reference: var(--light-color-ts-reference); - --color-ts-call-signature: var(--light-color-ts-call-signature); - --color-ts-index-signature: var(--light-color-ts-index-signature); - --color-ts-constructor-signature: var( - --light-color-ts-constructor-signature - ); - --color-ts-parameter: var(--light-color-ts-parameter); - --color-ts-type-parameter: var(--light-color-ts-type-parameter); - --color-ts-accessor: var(--light-color-ts-accessor); - --color-ts-get-signature: var(--light-color-ts-get-signature); - --color-ts-set-signature: var(--light-color-ts-set-signature); - --color-ts-type-alias: var(--light-color-ts-type-alias); - --color-document: var(--light-color-document); - - --color-alert-note: var(--light-color-alert-note); - --color-alert-tip: var(--light-color-alert-tip); - --color-alert-important: var(--light-color-alert-important); - --color-alert-warning: var(--light-color-alert-warning); - --color-alert-caution: var(--light-color-alert-caution); - - --external-icon: var(--light-external-icon); - --color-scheme: var(--light-color-scheme); - } - } - - @media (prefers-color-scheme: dark) { - :root { - --color-background: var(--dark-color-background); - --color-background-secondary: var( - --dark-color-background-secondary - ); - --color-background-active: var(--dark-color-background-active); - --color-background-warning: var(--dark-color-background-warning); - --color-warning-text: var(--dark-color-warning-text); - --color-accent: var(--dark-color-accent); - --color-active-menu-item: var(--dark-color-active-menu-item); - --color-text: var(--dark-color-text); - --color-contrast-text: var(--dark-color-contrast-text); - --color-text-aside: var(--dark-color-text-aside); - - --color-icon-background: var(--dark-color-icon-background); - --color-icon-text: var(--dark-color-icon-text); - - --color-comment-tag-text: var(--dark-color-text); - --color-comment-tag: var(--dark-color-background); - - --color-link: var(--dark-color-link); - --color-focus-outline: var(--dark-color-focus-outline); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --color-ts-project: var(--dark-color-ts-project); - --color-ts-module: var(--dark-color-ts-module); - --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-enum-member: var(--dark-color-ts-enum-member); - --color-ts-variable: var(--dark-color-ts-variable); - --color-ts-function: var(--dark-color-ts-function); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-constructor: var(--dark-color-ts-constructor); - --color-ts-property: var(--dark-color-ts-property); - --color-ts-method: var(--dark-color-ts-method); - --color-ts-reference: var(--dark-color-ts-reference); - --color-ts-call-signature: var(--dark-color-ts-call-signature); - --color-ts-index-signature: var(--dark-color-ts-index-signature); - --color-ts-constructor-signature: var( - --dark-color-ts-constructor-signature - ); - --color-ts-parameter: var(--dark-color-ts-parameter); - --color-ts-type-parameter: var(--dark-color-ts-type-parameter); - --color-ts-accessor: var(--dark-color-ts-accessor); - --color-ts-get-signature: var(--dark-color-ts-get-signature); - --color-ts-set-signature: var(--dark-color-ts-set-signature); - --color-ts-type-alias: var(--dark-color-ts-type-alias); - --color-document: var(--dark-color-document); - - --color-alert-note: var(--dark-color-alert-note); - --color-alert-tip: var(--dark-color-alert-tip); - --color-alert-important: var(--dark-color-alert-important); - --color-alert-warning: var(--dark-color-alert-warning); - --color-alert-caution: var(--dark-color-alert-caution); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); - } - } - - :root[data-theme="light"] { - --color-background: var(--light-color-background); - --color-background-secondary: var(--light-color-background-secondary); - --color-background-active: var(--light-color-background-active); - --color-background-warning: var(--light-color-background-warning); - --color-warning-text: var(--light-color-warning-text); - --color-icon-background: var(--light-color-icon-background); - --color-accent: var(--light-color-accent); - --color-active-menu-item: var(--light-color-active-menu-item); - --color-text: var(--light-color-text); - --color-contrast-text: var(--light-color-contrast-text); - --color-text-aside: var(--light-color-text-aside); - --color-icon-text: var(--light-color-icon-text); - - --color-comment-tag-text: var(--light-color-text); - --color-comment-tag: var(--light-color-background); - - --color-link: var(--light-color-link); - --color-focus-outline: var(--light-color-focus-outline); - - --color-ts-keyword: var(--light-color-ts-keyword); - --color-ts-project: var(--light-color-ts-project); - --color-ts-module: var(--light-color-ts-module); - --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-enum-member: var(--light-color-ts-enum-member); - --color-ts-variable: var(--light-color-ts-variable); - --color-ts-function: var(--light-color-ts-function); - --color-ts-class: var(--light-color-ts-class); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-constructor: var(--light-color-ts-constructor); - --color-ts-property: var(--light-color-ts-property); - --color-ts-method: var(--light-color-ts-method); - --color-ts-reference: var(--light-color-ts-reference); - --color-ts-call-signature: var(--light-color-ts-call-signature); - --color-ts-index-signature: var(--light-color-ts-index-signature); - --color-ts-constructor-signature: var( - --light-color-ts-constructor-signature - ); - --color-ts-parameter: var(--light-color-ts-parameter); - --color-ts-type-parameter: var(--light-color-ts-type-parameter); - --color-ts-accessor: var(--light-color-ts-accessor); - --color-ts-get-signature: var(--light-color-ts-get-signature); - --color-ts-set-signature: var(--light-color-ts-set-signature); - --color-ts-type-alias: var(--light-color-ts-type-alias); - --color-document: var(--light-color-document); - - --color-note: var(--light-color-note); - --color-tip: var(--light-color-tip); - --color-important: var(--light-color-important); - --color-warning: var(--light-color-warning); - --color-caution: var(--light-color-caution); - - --external-icon: var(--light-external-icon); - --color-scheme: var(--light-color-scheme); - } - - :root[data-theme="dark"] { - --color-background: var(--dark-color-background); - --color-background-secondary: var(--dark-color-background-secondary); - --color-background-active: var(--dark-color-background-active); - --color-background-warning: var(--dark-color-background-warning); - --color-warning-text: var(--dark-color-warning-text); - --color-icon-background: var(--dark-color-icon-background); - --color-accent: var(--dark-color-accent); - --color-active-menu-item: var(--dark-color-active-menu-item); - --color-text: var(--dark-color-text); - --color-contrast-text: var(--dark-color-contrast-text); - --color-text-aside: var(--dark-color-text-aside); - --color-icon-text: var(--dark-color-icon-text); - - --color-comment-tag-text: var(--dark-color-text); - --color-comment-tag: var(--dark-color-background); - - --color-link: var(--dark-color-link); - --color-focus-outline: var(--dark-color-focus-outline); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --color-ts-project: var(--dark-color-ts-project); - --color-ts-module: var(--dark-color-ts-module); - --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-enum-member: var(--dark-color-ts-enum-member); - --color-ts-variable: var(--dark-color-ts-variable); - --color-ts-function: var(--dark-color-ts-function); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-constructor: var(--dark-color-ts-constructor); - --color-ts-property: var(--dark-color-ts-property); - --color-ts-method: var(--dark-color-ts-method); - --color-ts-reference: var(--dark-color-ts-reference); - --color-ts-call-signature: var(--dark-color-ts-call-signature); - --color-ts-index-signature: var(--dark-color-ts-index-signature); - --color-ts-constructor-signature: var( - --dark-color-ts-constructor-signature - ); - --color-ts-parameter: var(--dark-color-ts-parameter); - --color-ts-type-parameter: var(--dark-color-ts-type-parameter); - --color-ts-accessor: var(--dark-color-ts-accessor); - --color-ts-get-signature: var(--dark-color-ts-get-signature); - --color-ts-set-signature: var(--dark-color-ts-set-signature); - --color-ts-type-alias: var(--dark-color-ts-type-alias); - --color-document: var(--dark-color-document); - - --color-note: var(--dark-color-note); - --color-tip: var(--dark-color-tip); - --color-important: var(--dark-color-important); - --color-warning: var(--dark-color-warning); - --color-caution: var(--dark-color-caution); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); - } - - html { - color-scheme: var(--color-scheme); - @media (prefers-reduced-motion: no-preference) { - scroll-behavior: smooth; - } - } - - *:focus-visible, - .tsd-accordion-summary:focus-visible svg { - outline: 2px solid var(--color-focus-outline); - } - - .always-visible, - .always-visible .tsd-signatures { - display: inherit !important; - } - - h1, - h2, - h3, - h4, - h5, - h6 { - line-height: 1.2; - } - - h1 { - font-size: 1.875rem; - margin: 0.67rem 0; - } - - h2 { - font-size: 1.5rem; - margin: 0.83rem 0; - } - - h3 { - font-size: 1.25rem; - margin: 1rem 0; - } - - h4 { - font-size: 1.05rem; - margin: 1.33rem 0; - } - - h5 { - font-size: 1rem; - margin: 1.5rem 0; - } - - h6 { - font-size: 0.875rem; - margin: 2.33rem 0; - } - - dl, - menu, - ol, - ul { - margin: 1em 0; - } - - dd { - margin: 0 0 0 34px; - } - - .container { - max-width: 1700px; - padding: 0 2rem; - } - - /* Footer */ - footer { - border-top: 1px solid var(--color-accent); - padding-top: 1rem; - padding-bottom: 1rem; - max-height: var(--dim-footer-height); - } - footer > p { - margin: 0 1em; - } - - .container-main { - margin: var(--dim-container-main-margin-y) auto; - /* toolbar, footer, margin */ - min-height: calc( - 100svh - var(--dim-header-height) - var(--dim-footer-height) - - 2 * var(--dim-container-main-margin-y) - ); - } - - @keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } - } - @keyframes fade-out { - from { - opacity: 1; - visibility: visible; - } - to { - opacity: 0; - } - } - @keyframes pop-in-from-right { - from { - transform: translate(100%, 0); - } - to { - transform: translate(0, 0); - } - } - @keyframes pop-out-to-right { - from { - transform: translate(0, 0); - visibility: visible; - } - to { - transform: translate(100%, 0); - } - } - body { - background: var(--color-background); - font-family: - -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", - Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; - font-size: 16px; - color: var(--color-text); - margin: 0; - } - - a { - color: var(--color-link); - text-decoration: none; - } - a:hover { - text-decoration: underline; - } - a.external[target="_blank"] { - background-image: var(--external-icon); - background-position: top 3px right; - background-repeat: no-repeat; - padding-right: 13px; - } - a.tsd-anchor-link { - color: var(--color-text); - } - :target { - scroll-margin-block: calc(var(--dim-header-height) + 0.5rem); - } - - code, - pre { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - padding: 0.2em; - margin: 0; - font-size: 0.875rem; - border-radius: 0.8em; - } - - pre { - position: relative; - white-space: pre-wrap; - word-wrap: break-word; - padding: 10px; - border: 1px solid var(--color-accent); - margin-bottom: 8px; - } - pre code { - padding: 0; - font-size: 100%; - } - pre > button { - position: absolute; - top: 10px; - right: 10px; - opacity: 0; - transition: opacity 0.1s; - box-sizing: border-box; - } - pre:hover > button, - pre > button.visible, - pre > button:focus-visible { - opacity: 1; - } - - blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; - } - - img { - max-width: 100%; - } - - * { - scrollbar-width: thin; - scrollbar-color: var(--color-accent) var(--color-icon-background); - } - - *::-webkit-scrollbar { - width: 0.75rem; - } - - *::-webkit-scrollbar-track { - background: var(--color-icon-background); - } - - *::-webkit-scrollbar-thumb { - background-color: var(--color-accent); - border-radius: 999rem; - border: 0.25rem solid var(--color-icon-background); - } - - dialog { - border: none; - outline: none; - padding: 0; - background-color: var(--color-background); - } - dialog::backdrop { - display: none; - } - #tsd-overlay { - background-color: rgba(0, 0, 0, 0.5); - position: fixed; - z-index: 9999; - top: 0; - left: 0; - right: 0; - bottom: 0; - animation: fade-in var(--modal-animation-duration) forwards; - } - #tsd-overlay.closing { - animation-name: fade-out; - } - - .tsd-typography { - line-height: 1.333em; - } - .tsd-typography ul { - list-style: square; - padding: 0 0 0 20px; - margin: 0; - } - .tsd-typography .tsd-index-panel h3, - .tsd-index-panel .tsd-typography h3, - .tsd-typography h4, - .tsd-typography h5, - .tsd-typography h6 { - font-size: 1em; - } - .tsd-typography h5, - .tsd-typography h6 { - font-weight: normal; - } - .tsd-typography p, - .tsd-typography ul, - .tsd-typography ol { - margin: 1em 0; - } - .tsd-typography table { - border-collapse: collapse; - border: none; - } - .tsd-typography td, - .tsd-typography th { - padding: 6px 13px; - border: 1px solid var(--color-accent); - } - .tsd-typography thead, - .tsd-typography tr:nth-child(even) { - background-color: var(--color-background-secondary); - } - - .tsd-alert { - padding: 8px 16px; - margin-bottom: 16px; - border-left: 0.25em solid var(--alert-color); - } - .tsd-alert blockquote > :last-child, - .tsd-alert > :last-child { - margin-bottom: 0; - } - .tsd-alert-title { - color: var(--alert-color); - display: inline-flex; - align-items: center; - } - .tsd-alert-title span { - margin-left: 4px; - } - - .tsd-alert-note { - --alert-color: var(--color-alert-note); - } - .tsd-alert-tip { - --alert-color: var(--color-alert-tip); - } - .tsd-alert-important { - --alert-color: var(--color-alert-important); - } - .tsd-alert-warning { - --alert-color: var(--color-alert-warning); - } - .tsd-alert-caution { - --alert-color: var(--color-alert-caution); - } - - .tsd-breadcrumb { - margin: 0; - margin-top: 1rem; - padding: 0; - color: var(--color-text-aside); - } - .tsd-breadcrumb a { - color: var(--color-text-aside); - text-decoration: none; - } - .tsd-breadcrumb a:hover { - text-decoration: underline; - } - .tsd-breadcrumb li { - display: inline; - } - .tsd-breadcrumb li:after { - content: " / "; - } - - .tsd-comment-tags { - display: flex; - flex-direction: column; - } - dl.tsd-comment-tag-group { - display: flex; - align-items: center; - overflow: hidden; - margin: 0.5em 0; - } - dl.tsd-comment-tag-group dt { - display: flex; - margin-right: 0.5em; - font-size: 0.875em; - font-weight: normal; - } - dl.tsd-comment-tag-group dd { - margin: 0; - } - code.tsd-tag { - padding: 0.25em 0.4em; - border: 0.1em solid var(--color-accent); - margin-right: 0.25em; - font-size: 70%; - } - h1 code.tsd-tag:first-of-type { - margin-left: 0.25em; - } - - dl.tsd-comment-tag-group dd:before, - dl.tsd-comment-tag-group dd:after { - content: " "; - } - dl.tsd-comment-tag-group dd pre, - dl.tsd-comment-tag-group dd:after { - clear: both; - } - dl.tsd-comment-tag-group p { - margin: 0; - } - - .tsd-panel.tsd-comment .lead { - font-size: 1.1em; - line-height: 1.333em; - margin-bottom: 2em; - } - .tsd-panel.tsd-comment .lead:last-child { - margin-bottom: 0; - } - - .tsd-filter-visibility h4 { - font-size: 1rem; - padding-top: 0.75rem; - padding-bottom: 0.5rem; - margin: 0; - } - .tsd-filter-item:not(:last-child) { - margin-bottom: 0.5rem; - } - .tsd-filter-input { - display: flex; - width: -moz-fit-content; - width: fit-content; - align-items: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - } - .tsd-filter-input input[type="checkbox"] { - cursor: pointer; - position: absolute; - width: 1.5em; - height: 1.5em; - opacity: 0; - } - .tsd-filter-input input[type="checkbox"]:disabled { - pointer-events: none; - } - .tsd-filter-input svg { - cursor: pointer; - width: 1.5em; - height: 1.5em; - margin-right: 0.5em; - border-radius: 0.33em; - /* Leaving this at full opacity breaks event listeners on Firefox. - Don't remove unless you know what you're doing. */ - opacity: 0.99; - } - .tsd-filter-input input[type="checkbox"]:focus-visible + svg { - outline: 2px solid var(--color-focus-outline); - } - .tsd-checkbox-background { - fill: var(--color-accent); - } - input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { - stroke: var(--color-text); - } - .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { - fill: var(--color-background); - stroke: var(--color-accent); - stroke-width: 0.25rem; - } - .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { - stroke: var(--color-accent); - } - - .settings-label { - font-weight: bold; - text-transform: uppercase; - display: inline-block; - } - - .tsd-filter-visibility .settings-label { - margin: 0.75rem 0 0.5rem 0; - } - - .tsd-theme-toggle .settings-label { - margin: 0.75rem 0.75rem 0 0; - } - - .tsd-hierarchy h4 label:hover span { - text-decoration: underline; - } - - .tsd-hierarchy { - list-style: square; - margin: 0; - } - .tsd-hierarchy-target { - font-weight: bold; - } - .tsd-hierarchy-toggle { - color: var(--color-link); - cursor: pointer; - } - - .tsd-full-hierarchy:not(:last-child) { - margin-bottom: 1em; - padding-bottom: 1em; - border-bottom: 1px solid var(--color-accent); - } - .tsd-full-hierarchy, - .tsd-full-hierarchy ul { - list-style: none; - margin: 0; - padding: 0; - } - .tsd-full-hierarchy ul { - padding-left: 1.5rem; - } - .tsd-full-hierarchy a { - padding: 0.25rem 0 !important; - font-size: 1rem; - display: inline-flex; - align-items: center; - color: var(--color-text); - } - .tsd-full-hierarchy svg[data-dropdown] { - cursor: pointer; - } - .tsd-full-hierarchy svg[data-dropdown="false"] { - transform: rotate(-90deg); - } - .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { - display: none; - } - - .tsd-panel-group.tsd-index-group { - margin-bottom: 0; - } - .tsd-index-panel .tsd-index-list { - list-style: none; - line-height: 1.333em; - margin: 0; - padding: 0.25rem 0 0 0; - overflow: hidden; - display: grid; - grid-template-columns: repeat(3, 1fr); - column-gap: 1rem; - grid-template-rows: auto; - } - @media (max-width: 1024px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(2, 1fr); - } - } - @media (max-width: 768px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(1, 1fr); - } - } - .tsd-index-panel .tsd-index-list li { - -webkit-page-break-inside: avoid; - -moz-page-break-inside: avoid; - -ms-page-break-inside: avoid; - -o-page-break-inside: avoid; - page-break-inside: avoid; - } - - .tsd-flag { - display: inline-block; - padding: 0.25em 0.4em; - border-radius: 4px; - color: var(--color-comment-tag-text); - background-color: var(--color-comment-tag); - text-indent: 0; - font-size: 75%; - line-height: 1; - font-weight: normal; - } - - .tsd-anchor { - position: relative; - top: -100px; - } - - .tsd-member { - position: relative; - } - .tsd-member .tsd-anchor + h3 { - display: flex; - align-items: center; - margin-top: 0; - margin-bottom: 0; - border-bottom: none; - } - - .tsd-navigation.settings { - margin: 0; - margin-bottom: 1rem; - } - .tsd-navigation > a, - .tsd-navigation .tsd-accordion-summary { - width: calc(100% - 0.25rem); - display: flex; - align-items: center; - } - .tsd-navigation a, - .tsd-navigation summary > span, - .tsd-page-navigation a { - display: flex; - width: calc(100% - 0.25rem); - align-items: center; - padding: 0.25rem; - color: var(--color-text); - text-decoration: none; - box-sizing: border-box; - } - .tsd-navigation a.current, - .tsd-page-navigation a.current { - background: var(--color-active-menu-item); - color: var(--color-contrast-text); - } - .tsd-navigation a:hover, - .tsd-page-navigation a:hover { - text-decoration: underline; - } - .tsd-navigation ul, - .tsd-page-navigation ul { - margin-top: 0; - margin-bottom: 0; - padding: 0; - list-style: none; - } - .tsd-navigation li, - .tsd-page-navigation li { - padding: 0; - max-width: 100%; - } - .tsd-navigation .tsd-nav-link { - display: none; - } - .tsd-nested-navigation { - margin-left: 3rem; - } - .tsd-nested-navigation > li > details { - margin-left: -1.5rem; - } - .tsd-small-nested-navigation { - margin-left: 1.5rem; - } - .tsd-small-nested-navigation > li > details { - margin-left: -1.5rem; - } - - .tsd-page-navigation-section > summary { - padding: 0.25rem; - } - .tsd-page-navigation-section > summary > svg { - margin-right: 0.25rem; - } - .tsd-page-navigation-section > div { - margin-left: 30px; - } - .tsd-page-navigation ul { - padding-left: 1.75rem; - } - - #tsd-sidebar-links a { - margin-top: 0; - margin-bottom: 0.5rem; - line-height: 1.25rem; - } - #tsd-sidebar-links a:last-of-type { - margin-bottom: 0; - } - - a.tsd-index-link { - padding: 0.25rem 0 !important; - font-size: 1rem; - line-height: 1.25rem; - display: inline-flex; - align-items: center; - color: var(--color-text); - } - .tsd-accordion-summary { - list-style-type: none; /* hide marker on non-safari */ - outline: none; /* broken on safari, so just hide it */ - display: flex; - align-items: center; - gap: 0.25rem; - box-sizing: border-box; - } - .tsd-accordion-summary::-webkit-details-marker { - display: none; /* hide marker on safari */ - } - .tsd-accordion-summary, - .tsd-accordion-summary a { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - - cursor: pointer; - } - .tsd-accordion-summary a { - width: calc(100% - 1.5rem); - } - .tsd-accordion-summary > * { - margin-top: 0; - margin-bottom: 0; - padding-top: 0; - padding-bottom: 0; - } - /* - * We need to be careful to target the arrow indicating whether the accordion - * is open, but not any other SVGs included in the details element. - */ - .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child { - transform: rotate(-90deg); - } - .tsd-index-content > :not(:first-child) { - margin-top: 0.75rem; - } - .tsd-index-summary { - margin-top: 1.5rem; - margin-bottom: 0.75rem; - display: flex; - align-content: center; - } - - .tsd-no-select { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - } - .tsd-kind-icon { - margin-right: 0.5rem; - width: 1.25rem; - height: 1.25rem; - min-width: 1.25rem; - min-height: 1.25rem; - } - .tsd-signature > .tsd-kind-icon { - margin-right: 0.8rem; - } - - .tsd-panel { - margin-bottom: 2.5rem; - } - .tsd-panel.tsd-member { - margin-bottom: 4rem; - } - .tsd-panel:empty { - display: none; - } - .tsd-panel > h1, - .tsd-panel > h2, - .tsd-panel > h3 { - margin: 1.5rem -1.5rem 0.75rem -1.5rem; - padding: 0 1.5rem 0.75rem 1.5rem; - } - .tsd-panel > h1.tsd-before-signature, - .tsd-panel > h2.tsd-before-signature, - .tsd-panel > h3.tsd-before-signature { - margin-bottom: 0; - border-bottom: none; - } - - .tsd-panel-group { - margin: 2rem 0; - } - .tsd-panel-group.tsd-index-group { - margin: 2rem 0; - } - .tsd-panel-group.tsd-index-group details { - margin: 2rem 0; - } - .tsd-panel-group > .tsd-accordion-summary { - margin-bottom: 1rem; - } - - #tsd-search[open] { - animation: fade-in var(--modal-animation-duration) ease-out forwards; - } - #tsd-search[open].closing { - animation-name: fade-out; - } - - /* Avoid setting `display` on closed dialog */ - #tsd-search[open] { - display: flex; - flex-direction: column; - padding: 1rem; - width: 32rem; - max-width: 90vw; - max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh); - /* Anchor dialog to top */ - margin-top: 10vh; - border-radius: 6px; - will-change: max-height; - } - #tsd-search-input { - box-sizing: border-box; - width: 100%; - padding: 0 0.625rem; /* 10px */ - outline: 0; - border: 2px solid var(--color-accent); - background-color: transparent; - color: var(--color-text); - border-radius: 4px; - height: 2.5rem; - flex: 0 0 auto; - font-size: 0.875rem; - transition: border-color 0.2s, background-color 0.2s; - } - #tsd-search-input:focus-visible { - background-color: var(--color-background-active); - border-color: transparent; - color: var(--color-contrast-text); - } - #tsd-search-input::placeholder { - color: inherit; - opacity: 0.8; - } - #tsd-search-results { - margin: 0; - padding: 0; - list-style: none; - flex: 1 1 auto; - display: flex; - flex-direction: column; - overflow-y: auto; - } - #tsd-search-results:not(:empty) { - margin-top: 0.5rem; - } - #tsd-search-results > li { - background-color: var(--color-background); - line-height: 1.5; - box-sizing: border-box; - border-radius: 4px; - } - #tsd-search-results > li:nth-child(even) { - background-color: var(--color-background-secondary); - } - #tsd-search-results > li:is(:hover, [aria-selected="true"]) { - background-color: var(--color-background-active); - color: var(--color-contrast-text); - } - /* It's important that this takes full size of parent `li`, to capture a click on `li` */ - #tsd-search-results > li > a { - display: flex; - align-items: center; - padding: 0.5rem 0.25rem; - box-sizing: border-box; - width: 100%; - } - #tsd-search-results > li > a > .text { - flex: 1 1 auto; - min-width: 0; - overflow-wrap: anywhere; - } - #tsd-search-results > li > a .parent { - color: var(--color-text-aside); - } - #tsd-search-results > li > a mark { - color: inherit; - background-color: inherit; - font-weight: bold; - } - #tsd-search-status { - flex: 1; - display: grid; - place-content: center; - text-align: center; - overflow-wrap: anywhere; - } - #tsd-search-status:not(:empty) { - min-height: 6rem; - } - - .tsd-signature { - margin: 0 0 1rem 0; - padding: 1rem 0.5rem; - border: 1px solid var(--color-accent); - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 14px; - overflow-x: auto; - } - - .tsd-signature-keyword { - color: var(--color-ts-keyword); - font-weight: normal; - } - - .tsd-signature-symbol { - color: var(--color-text-aside); - font-weight: normal; - } - - .tsd-signature-type { - font-style: italic; - font-weight: normal; - } - - .tsd-signatures { - padding: 0; - margin: 0 0 1em 0; - list-style-type: none; - } - .tsd-signatures .tsd-signature { - margin: 0; - border-color: var(--color-accent); - border-width: 1px 0; - transition: background-color 0.1s; - } - .tsd-signatures .tsd-index-signature:not(:last-child) { - margin-bottom: 1em; - } - .tsd-signatures .tsd-index-signature .tsd-signature { - border-width: 1px; - } - .tsd-description .tsd-signatures .tsd-signature { - border-width: 1px; - } - - ul.tsd-parameter-list, - ul.tsd-type-parameter-list { - list-style: square; - margin: 0; - padding-left: 20px; - } - ul.tsd-parameter-list > li.tsd-parameter-signature, - ul.tsd-type-parameter-list > li.tsd-parameter-signature { - list-style: none; - margin-left: -20px; - } - ul.tsd-parameter-list h5, - ul.tsd-type-parameter-list h5 { - font-size: 16px; - margin: 1em 0 0.5em 0; - } - .tsd-sources { - margin-top: 1rem; - font-size: 0.875em; - } - .tsd-sources a { - color: var(--color-text-aside); - text-decoration: underline; - } - .tsd-sources ul { - list-style: none; - padding: 0; - } - - .tsd-page-toolbar { - position: sticky; - z-index: 1; - top: 0; - left: 0; - width: 100%; - color: var(--color-text); - background: var(--color-background-secondary); - border-bottom: var(--dim-toolbar-border-bottom-width) - var(--color-accent) solid; - transition: transform 0.3s ease-in-out; - } - .tsd-page-toolbar a { - color: var(--color-text); - } - .tsd-toolbar-contents { - display: flex; - align-items: center; - height: var(--dim-toolbar-contents-height); - margin: 0 auto; - } - .tsd-toolbar-contents > .title { - font-weight: bold; - margin-right: auto; - } - #tsd-toolbar-links { - display: flex; - align-items: center; - gap: 1.5rem; - margin-right: 1rem; - } - - .tsd-widget { - box-sizing: border-box; - display: inline-block; - opacity: 0.8; - height: 2.5rem; - width: 2.5rem; - transition: opacity 0.1s, background-color 0.1s; - text-align: center; - cursor: pointer; - border: none; - background-color: transparent; - } - .tsd-widget:hover { - opacity: 0.9; - } - .tsd-widget:active { - opacity: 1; - background-color: var(--color-accent); - } - #tsd-toolbar-menu-trigger { - display: none; - } - - .tsd-member-summary-name { - display: inline-flex; - align-items: center; - padding: 0.25rem; - text-decoration: none; - } - - .tsd-anchor-icon { - display: inline-flex; - align-items: center; - margin-left: 0.5rem; - color: var(--color-text); - vertical-align: middle; - } - - .tsd-anchor-icon svg { - width: 1em; - height: 1em; - visibility: hidden; - } - - .tsd-member-summary-name:hover > .tsd-anchor-icon svg, - .tsd-anchor-link:hover > .tsd-anchor-icon svg, - .tsd-anchor-icon:focus-visible svg { - visibility: visible; - } - - .deprecated { - text-decoration: line-through !important; - } - - .warning { - padding: 1rem; - color: var(--color-warning-text); - background: var(--color-background-warning); - } - - .tsd-kind-project { - color: var(--color-ts-project); - } - .tsd-kind-module { - color: var(--color-ts-module); - } - .tsd-kind-namespace { - color: var(--color-ts-namespace); - } - .tsd-kind-enum { - color: var(--color-ts-enum); - } - .tsd-kind-enum-member { - color: var(--color-ts-enum-member); - } - .tsd-kind-variable { - color: var(--color-ts-variable); - } - .tsd-kind-function { - color: var(--color-ts-function); - } - .tsd-kind-class { - color: var(--color-ts-class); - } - .tsd-kind-interface { - color: var(--color-ts-interface); - } - .tsd-kind-constructor { - color: var(--color-ts-constructor); - } - .tsd-kind-property { - color: var(--color-ts-property); - } - .tsd-kind-method { - color: var(--color-ts-method); - } - .tsd-kind-reference { - color: var(--color-ts-reference); - } - .tsd-kind-call-signature { - color: var(--color-ts-call-signature); - } - .tsd-kind-index-signature { - color: var(--color-ts-index-signature); - } - .tsd-kind-constructor-signature { - color: var(--color-ts-constructor-signature); - } - .tsd-kind-parameter { - color: var(--color-ts-parameter); - } - .tsd-kind-type-parameter { - color: var(--color-ts-type-parameter); - } - .tsd-kind-accessor { - color: var(--color-ts-accessor); - } - .tsd-kind-get-signature { - color: var(--color-ts-get-signature); - } - .tsd-kind-set-signature { - color: var(--color-ts-set-signature); - } - .tsd-kind-type-alias { - color: var(--color-ts-type-alias); - } - - /* if we have a kind icon, don't color the text by kind */ - .tsd-kind-icon ~ span { - color: var(--color-text); - } - - /* mobile */ - @media (max-width: 769px) { - #tsd-toolbar-menu-trigger { - display: inline-block; - /* temporary fix to vertically align, for compatibility */ - line-height: 2.5; - } - #tsd-toolbar-links { - display: none; - } - - .container-main { - display: flex; - } - .col-content { - float: none; - max-width: 100%; - width: 100%; - } - .col-sidebar { - position: fixed !important; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - padding: 1.5rem 1.5rem 0 0; - width: 75vw; - visibility: hidden; - background-color: var(--color-background); - transform: translate(100%, 0); - } - .col-sidebar > *:last-child { - padding-bottom: 20px; - } - .overlay { - content: ""; - display: block; - position: fixed; - z-index: 1023; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); - visibility: hidden; - } - - .to-has-menu .overlay { - animation: fade-in 0.4s; - } - - .to-has-menu .col-sidebar { - animation: pop-in-from-right 0.4s; - } - - .from-has-menu .overlay { - animation: fade-out 0.4s; - } - - .from-has-menu .col-sidebar { - animation: pop-out-to-right 0.4s; - } - - .has-menu body { - overflow: hidden; - } - .has-menu .overlay { - visibility: visible; - } - .has-menu .col-sidebar { - visibility: visible; - transform: translate(0, 0); - display: flex; - flex-direction: column; - gap: 1.5rem; - max-height: 100vh; - padding: 1rem 2rem; - } - .has-menu .tsd-navigation { - max-height: 100%; - } - .tsd-navigation .tsd-nav-link { - display: flex; - } - } - - /* one sidebar */ - @media (min-width: 770px) { - .container-main { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); - grid-template-areas: "sidebar content"; - --dim-container-main-margin-y: 2rem; - } - - .tsd-breadcrumb { - margin-top: 0; - } - - .col-sidebar { - grid-area: sidebar; - } - .col-content { - grid-area: content; - padding: 0 1rem; - } - } - @media (min-width: 770px) and (max-width: 1399px) { - .col-sidebar { - max-height: calc( - 100vh - var(--dim-header-height) - var(--dim-footer-height) - - 2 * var(--dim-container-main-margin-y) - ); - overflow: auto; - position: sticky; - top: calc( - var(--dim-header-height) + var(--dim-container-main-margin-y) - ); - } - .site-menu { - margin-top: 1rem; - } - } - - /* two sidebars */ - @media (min-width: 1200px) { - .container-main { - grid-template-columns: - minmax(0, 1fr) minmax(0, 2.5fr) minmax( - 0, - 20rem - ); - grid-template-areas: "sidebar content toc"; - } - - .col-sidebar { - display: contents; - } - - .page-menu { - grid-area: toc; - padding-left: 1rem; - } - .site-menu { - grid-area: sidebar; - } - - .site-menu { - margin-top: 0rem; - } - - .page-menu, - .site-menu { - max-height: calc( - 100vh - var(--dim-header-height) - var(--dim-footer-height) - - 2 * var(--dim-container-main-margin-y) - ); - overflow: auto; - position: sticky; - top: calc( - var(--dim-header-height) + var(--dim-container-main-margin-y) - ); - } - } -} diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html deleted file mode 100644 index 6b4fd20..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html +++ /dev/null @@ -1,22 +0,0 @@ -DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.0

        Class DiscriminatorRegistry

        Static registry for managing discriminators and their associated type guards. -Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

        -

        0.1.0

        -
        Index

        Methods

        Methods

        • Checks if a discriminator is already registered.

          -

          Parameters

          • discriminator: string

            The discriminator value to check.

            -

          Returns boolean

            -
          • true if the discriminator is registered, false otherwise.
          • -
          -

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html deleted file mode 100644 index 76982ea..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html +++ /dev/null @@ -1,17 +0,0 @@ -NumberUtility | @blwatkins/utils - v0.1.0-alpha.0

        Class NumberUtility

        Static properties and methods for validating number types.

        -

        0.1.0

        -
        Index

        Methods

        • Is the given input a finite number?

          -

          Parameters

          • input: unknown

          Returns input is number

          true when the input is a finite number; false otherwise.

          -

          0.1.0

          -
        • Is the given input an integer?

          -

          Parameters

          • input: unknown

          Returns input is number

          true when the input is an integer; false otherwise.

          -

          0.1.0

          -
        • Is the given input a positive integer?

          -

          Parameters

          • input: unknown
          • OptionalzeroInclusive: boolean

            true if zero should be considered a valid input. -false if zero should be considered an invalid input.

            -

          Returns input is number

          true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

          -

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.Random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.Random.html deleted file mode 100644 index e69de29..0000000 diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html deleted file mode 100644 index d1cf318..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html +++ /dev/null @@ -1,39 +0,0 @@ -RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.0

        Class RandomNumberGeneratorFactory

        A static factory class for creating a SeededRandomNumberGenerator object.

        -

        0.1.0

        -
        Index

        Methods

        Methods

        • Build a SeededRandomNumberGenerator object with the given seed and namespace from an asynchronous hashing algorithm.

          -

          Parameters

          • seed: string

            The primary input to determine the random number sequence.

            -
          • Optionalnamespace: string

            Namespace to create different sequences from the same seed.

            -

          Returns Promise<SeededRandomNumberGenerator>

          This method relies on the Web Crypto API via crypto.subtle. -In Node.js environments, ensure you are using a version where the Web Crypto API is available.

          -
            -
          • When the given seed is not a string.
          • -
          -
            -
          • When the given namespace is not a string.
          • -
          -

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html deleted file mode 100644 index 3a10ac4..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html +++ /dev/null @@ -1,23 +0,0 @@ -SeedVersions | @blwatkins/utils - v0.1.0-alpha.0

        Class SeedVersions

        A static class for accessing different seed versions. -Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

        -

        0.1.0

        -
        Index

        Accessors

        Methods

        Accessors

        Methods

        • Is the given index a valid seed version?

          -

          Parameters

          • index: number

            The index to check.

            -

          Returns boolean

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html deleted file mode 100644 index 3a6db7b..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html +++ /dev/null @@ -1,18 +0,0 @@ -SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.0

        Class SeededRandomNumberGenerator

        Deterministic seeded pseudorandom number generator. -This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

        -

        0.1.0

        -
        Index

        Constructors

        Methods

        Constructors

        • Parameters

          • state: [number, number, number, number]

            Initial 128-bit state. -Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

            -

          Returns SeededRandomNumberGenerator

          If state is not an array with 4 elements.

          -

          If each element of state is not a 32-bit unsigned integer.

          -

          If state does not have at least one element that is greater than 0.

          -

          0.1.0

          -

        Methods

        • Returns number

            -
          • The next pseudorandom float in the range [0, 1).
          • -
          -

          This method advances the internal 128-bit xoshiro128** state by one step. -Successive calls produce an independent, uniformly distributed sequence.

          -

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.WeightedElementUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.WeightedElementUtility.html deleted file mode 100644 index e69de29..0000000 diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html deleted file mode 100644 index f0228c0..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html +++ /dev/null @@ -1,34 +0,0 @@ -StringUtility | @blwatkins/utils - v0.1.0-alpha.0

        Class StringUtility

        Static properties and methods for validating string types.

        -

        0.1.0

        -
        Index

        Accessors

        • get singleLineLowercaseTrimmedPattern(): RegExp

          Returns RegExp

          Regular expression pattern for validating single-line lowercase strings.

          -

          This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

          -

          0.1.0

          -
        • get singleLineTrimmedPattern(): RegExp

          Returns RegExp

          Regular expression pattern for validating single-line mixed-case strings.

          -

          This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

          -

          0.1.0

          -
        • get singleLineUppercaseTrimmedPattern(): RegExp

          Returns RegExp

          Regular expression pattern for validating single-line uppercase strings.

          -

          This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

          -

          0.1.0

          -

        Methods

        • Is the given input a non-empty string? -Non-empty strings must contain at least one non-whitespace character.

          -

          Parameters

          • input: unknown

          Returns boolean

          0.1.0

          -
        • Is the given input a string?

          -

          Parameters

          • input: unknown

          Returns input is string

          0.1.0

          -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/hierarchy.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/hierarchy.html deleted file mode 100644 index 4a9ccab..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/hierarchy.html +++ /dev/null @@ -1 +0,0 @@ -@blwatkins/utils - v0.1.0-alpha.0

        @blwatkins/utils - v0.1.0-alpha.0

        Hierarchy Summary

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html deleted file mode 100644 index 85dbfd7..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html +++ /dev/null @@ -1,59 +0,0 @@ -@blwatkins/utils - v0.1.0-alpha.0

        @blwatkins/utils - v0.1.0-alpha.0

        TypeScript Utilities

        -

        A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development.

        - - - -

        The source code of this project is licensed under the MIT License. -The full text of the license is included with the project source code.

        - - -

        npm License -npm Version -npm @alpha Version -npm Types -npm Node Version -npm Weekly Downloads -npm Total Downloads -npm Last Update -npm Unpacked Size

        - -

        Socket Score

        - -

        Bundlephobia Tree Shaking -Bundlephobia Dependency Count -Bundlephobia Minified -Bundlephobia Minified + gzip

        - -

        Package Phobia Install Size -Package Phobia Publish Size

        - -

        GitHub License -GitHub Dependabot -GitHub Latest Release -GitHub Releases -GitHub Last Commit -GitHub Commits -GitHub Commit Activity -GitHub Code Size in Bytes -GitHub Repo Size -GitHub Repo File or Directory Count -GitHub Language Count

        - -

        CodeQL -npm Lint, Build, and Test -Deploy GitHub Pages with Jekyll

        - - - -

        A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation.

        -

        A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. -Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer.

        -
        -

        Copyright © 2024-2026 Brittni Watkins.

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html deleted file mode 100644 index e27de8f..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ /dev/null @@ -1,14 +0,0 @@ -DiscriminatorRegistration | @blwatkins/utils - v0.1.0-alpha.0

        Interface DiscriminatorRegistration

        A registration for a discriminator to the DiscriminatorRegistry.

        -

        0.1.0

        -
        interface DiscriminatorRegistration {
            discriminator: string;
            validator: (input: unknown) => boolean;
        }
        Index

        Properties

        discriminator: string

        The discriminator value that identifies the type of a Discriminated object. -This value must be unique across all registered discriminators.

        -

        0.1.0

        -
        validator: (input: unknown) => boolean

        A method that validates whether an input matches the type associated with the discriminator.

        -

        Type Declaration

          • (input: unknown): boolean
          • Parameters

            • input: unknown

              The input to validate.

              -

            Returns boolean

              -
            • true if the input matches the type associated with the discriminator, false otherwise.
            • -
            -

        0.1.0

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html deleted file mode 100644 index 1ea9b9c..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html +++ /dev/null @@ -1,8 +0,0 @@ -SeedVersion | @blwatkins/utils - v0.1.0-alpha.0

        Interface SeedVersion

        A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. -A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

        -

        0.1.0

        -
        interface SeedVersion {
            offsets: readonly [number, number, number, number];
        }
        Index

        Properties

        Properties

        offsets: readonly [number, number, number, number]

        A collection of offset values for the FNV-1a hashing algorithm. -Each offset value should be a 32-bit unsigned integer.

        -

        0.1.0

        -

        Generated using TypeDoc


        Copyright © 2024-2026 Brittni Watkins.

        diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.WeightedElement.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.WeightedElement.html deleted file mode 100644 index e69de29..0000000 diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules.html deleted file mode 100644 index 125cc76..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules.html +++ /dev/null @@ -1 +0,0 @@ -@blwatkins/utils - v0.1.0-alpha.0

          @blwatkins/utils - v0.1.0-alpha.0

          Modules

          discriminator
          number
          random
          string

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/discriminator.html deleted file mode 100644 index 43f974e..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/discriminator.html +++ /dev/null @@ -1 +0,0 @@ -discriminator | @blwatkins/utils - v0.1.0-alpha.0

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/number.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/number.html deleted file mode 100644 index d626aa2..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/number.html +++ /dev/null @@ -1 +0,0 @@ -number | @blwatkins/utils - v0.1.0-alpha.0

          Module number

          Classes

          NumberUtility

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/random.html deleted file mode 100644 index d24f00d..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/random.html +++ /dev/null @@ -1 +0,0 @@ -random | @blwatkins/utils - v0.1.0-alpha.0

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/string.html deleted file mode 100644 index 0eaa6fb..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/string.html +++ /dev/null @@ -1 +0,0 @@ -string | @blwatkins/utils - v0.1.0-alpha.0

          Module string

          Classes

          StringUtility

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html deleted file mode 100644 index 54c63cf..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html +++ /dev/null @@ -1,3 +0,0 @@ -Discriminated | @blwatkins/utils - v0.1.0-alpha.0

          Type Alias Discriminated

          Discriminated: Static<typeof discriminatedSchema>

          Discriminated objects can be type checked using the discriminator registry.

          -

          0.1.0

          -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html deleted file mode 100644 index 89a0309..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html +++ /dev/null @@ -1,3 +0,0 @@ -TypeGuard | @blwatkins/utils - v0.1.0-alpha.0

          Type Alias TypeGuard<T>

          TypeGuard: (input: unknown) => input is T

          A type guard function that checks if an input is of a specific Discriminated type.

          -

          Type Parameters

          Type Declaration

            • (input: unknown): input is T
            • Parameters

              • input: unknown

              Returns input is T

          0.1.0

          -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/random.WeightedList.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/random.WeightedList.html deleted file mode 100644 index e69de29..0000000 diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html deleted file mode 100644 index e193874..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html +++ /dev/null @@ -1,3 +0,0 @@ -discriminatedSchema | @blwatkins/utils - v0.1.0-alpha.0

          Variable discriminatedSchemaConst

          discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

          TypeBox schema for validating that an object implements the Discriminated type.

          -

          0.1.0

          -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/random.weightedElementSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/random.weightedElementSchema.html deleted file mode 100644 index e69de29..0000000 diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll deleted file mode 100644 index e2ac661..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll +++ /dev/null @@ -1 +0,0 @@ -TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js deleted file mode 100644 index fb85f0a..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js +++ /dev/null @@ -1 +0,0 @@ -window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css deleted file mode 100644 index 5674cf3..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css +++ /dev/null @@ -1,22 +0,0 @@ -:root { - --light-code-background: #FFFFFF; - --dark-code-background: #1E1E1E; -} - -@media (prefers-color-scheme: light) { :root { - --code-background: var(--light-code-background); -} } - -@media (prefers-color-scheme: dark) { :root { - --code-background: var(--dark-code-background); -} } - -:root[data-theme='light'] { - --code-background: var(--light-code-background); -} - -:root[data-theme='dark'] { - --code-background: var(--dark-code-background); -} - -pre, code { background: var(--code-background); } diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js deleted file mode 100644 index 4fbadc5..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js +++ /dev/null @@ -1,18 +0,0 @@ -(function() { - addIcons(); - function addIcons() { - if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); - const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); - svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; - svg.style.display = "none"; - if (location.protocol === "file:") updateUseElements(); - } - - function updateUseElements() { - document.querySelectorAll("use").forEach(el => { - if (el.getAttribute("href").includes("#icon-")) { - el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); - } - }); - } -})() \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg deleted file mode 100644 index be7798f..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg +++ /dev/null @@ -1 +0,0 @@ -MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js deleted file mode 100644 index 8182cee..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js +++ /dev/null @@ -1,60 +0,0 @@ -"use strict"; -window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","search_index_not_available":"The search index is not available","search_no_results_found_for_0":"No results found for {0}","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; -"use strict";(()=>{var Ke=Object.create;var he=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var et=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var tt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ze(e))!Ye.call(t,i)&&i!==n&&he(t,i,{get:()=>e[i],enumerable:!(r=Ge(e,i))||r.enumerable});return t};var nt=(t,e,n)=>(n=t!=null?Ke(Xe(t)):{},tt(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var ye=et((me,ge)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=(function(e){return function(n){e.console&&console.warn&&console.warn(n)}})(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,l],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. -`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?d+=2:a==c&&(n+=r[l+1]*i[d+1],l+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),f=s.str.charAt(1),p;f in s.node.edges?p=s.node.edges[f]:(p=new t.TokenSet,s.node.edges[f]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}if(s.type===t.QueryLexer.TERM)return t.QueryParser.parseTerm;var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},(function(e,n){typeof define=="function"&&define.amd?define(n):typeof me=="object"?ge.exports=n():e.lunr=n()})(this,function(){return t})})()});var M,G={getItem(){return null},setItem(){}},K;try{K=localStorage,M=K}catch{K=G,M=G}var S={getItem:t=>M.getItem(t),setItem:(t,e)=>M.setItem(t,e),disableWritingLocalStorage(){M=G},disable(){localStorage.clear(),M=G},enable(){M=K}};window.TypeDoc||={disableWritingLocalStorage(){S.disableWritingLocalStorage()},disableLocalStorage:()=>{S.disable()},enableLocalStorage:()=>{S.enable()}};window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",search_index_not_available:"The search index is not available",search_no_results_found_for_0:"No results found for {0}",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var pe=[];function X(t,e){pe.push({selector:e,constructor:t})}var Z=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){pe.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!rt(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function rt(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var fe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var Ie=nt(ye(),1);async function R(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}var Y="closing",ae="tsd-overlay";function it(){let t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.body.style.overflow="hidden",document.body.style.paddingRight=`${t}px`}function st(){document.body.style.removeProperty("overflow"),document.body.style.removeProperty("padding-right")}function Ee(t,e){t.addEventListener("animationend",()=>{t.classList.contains(Y)&&(t.classList.remove(Y),document.getElementById(ae)?.remove(),t.close(),st())}),t.addEventListener("cancel",n=>{n.preventDefault(),ve(t)}),e?.closeOnClick&&document.addEventListener("click",n=>{t.open&&!t.contains(n.target)&&ve(t)},!0)}function xe(t){if(t.open)return;let e=document.createElement("div");e.id=ae,document.body.appendChild(e),t.showModal(),it()}function ve(t){if(!t.open)return;document.getElementById(ae)?.classList.add(Y),t.classList.add(Y)}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var le={};function Le(t){for(let e of t.split(/\s+/))if(le.hasOwnProperty(e)&&!le[e])return!0;return!1}var ee=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=S.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){S.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),le[`tsd-is-${this.el.name}`]=this.value,this.app.filterChanged(),this.app.updateIndexVisibility()}};var we=0;async function Se(t,e){if(!window.searchData)return;let n=await R(window.searchData);t.data=n,t.index=Ie.Index.load(n.index),e.innerHTML=""}function _e(){let t=document.getElementById("tsd-search-trigger"),e=document.getElementById("tsd-search"),n=document.getElementById("tsd-search-input"),r=document.getElementById("tsd-search-results"),i=document.getElementById("tsd-search-script"),s=document.getElementById("tsd-search-status");if(!(t&&e&&n&&r&&i&&s))throw new Error("Search controls missing");let o={base:document.documentElement.dataset.base};o.base.endsWith("/")||(o.base+="/"),i.addEventListener("error",()=>{let a=window.translations.search_index_not_available;Pe(s,a)}),i.addEventListener("load",()=>{Se(o,s)}),Se(o,s),ot({trigger:t,searchEl:e,results:r,field:n,status:s},o)}function ot(t,e){let{field:n,results:r,searchEl:i,status:s,trigger:o}=t;Ee(i,{closeOnClick:!0});function a(){xe(i),n.setSelectionRange(0,n.value.length)}o.addEventListener("click",a),n.addEventListener("input",fe(()=>{at(r,n,s,e)},200)),n.addEventListener("keydown",l=>{if(r.childElementCount===0||l.ctrlKey||l.metaKey||l.altKey)return;let d=n.getAttribute("aria-activedescendant"),f=d?document.getElementById(d):null;if(f){let p=!1,v=!1;switch(l.key){case"Home":case"End":case"ArrowLeft":case"ArrowRight":v=!0;break;case"ArrowDown":case"ArrowUp":p=l.shiftKey;break}(p||v)&&ke(n)}if(!l.shiftKey)switch(l.key){case"Enter":f?.querySelector("a")?.click();break;case"ArrowUp":Te(r,n,f,-1),l.preventDefault();break;case"ArrowDown":Te(r,n,f,1),l.preventDefault();break}});function c(){ke(n)}n.addEventListener("change",c),n.addEventListener("blur",c),n.addEventListener("click",c),document.body.addEventListener("keydown",l=>{if(l.altKey||l.metaKey||l.shiftKey)return;let d=l.ctrlKey&&l.key==="k",f=!l.ctrlKey&&!ut()&&l.key==="/";(d||f)&&(l.preventDefault(),a())})}function at(t,e,n,r){if(!r.index||!r.data)return;t.innerHTML="",n.innerHTML="",we+=1;let i=e.value.trim(),s;if(i){let a=i.split(" ").map(c=>c.length?`*${c}*`:"").join(" ");s=r.index.search(a).filter(({ref:c})=>{let l=r.data.rows[Number(c)].classes;return!l||!Le(l)})}else s=[];if(s.length===0&&i){let a=window.translations.search_no_results_found_for_0.replace("{0}",` "${te(i)}" `);Pe(n,a);return}for(let a=0;ac.score-a.score);let o=Math.min(10,s.length);for(let a=0;a`,f=Ce(c.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(f+=` (score: ${s[a].score.toFixed(2)})`),c.parent&&(f=` - ${Ce(c.parent,i)}.${f}`);let p=document.createElement("li");p.id=`tsd-search:${we}-${a}`,p.role="option",p.ariaSelected="false",p.classList.value=c.classes??"";let v=document.createElement("a");v.tabIndex=-1,v.href=r.base+c.url,v.innerHTML=d+`${f}`,p.append(v),t.appendChild(p)}}function Te(t,e,n,r){let i;if(r===1?i=n?.nextElementSibling||t.firstElementChild:i=n?.previousElementSibling||t.lastElementChild,i!==n){if(!i||i.role!=="option"){console.error("Option missing");return}i.ariaSelected="true",i.scrollIntoView({behavior:"smooth",block:"nearest"}),e.setAttribute("aria-activedescendant",i.id),n?.setAttribute("aria-selected","false")}}function ke(t){let e=t.getAttribute("aria-activedescendant");(e?document.getElementById(e):null)?.setAttribute("aria-selected","false"),t.setAttribute("aria-activedescendant","")}function Ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var lt={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>lt[e])}function Pe(t,e){t.innerHTML=e?`
          ${e}
          `:""}var ct=["button","checkbox","file","hidden","image","radio","range","reset","submit"];function ut(){let t=document.activeElement;return t?t.isContentEditable||t.tagName==="TEXTAREA"||t.tagName==="SEARCH"?!0:t.tagName==="INPUT"&&!ct.includes(t.type):!1}var D="mousedown",Me="mousemove",$="mouseup",ne={x:0,y:0},Qe=!1,ce=!1,dt=!1,F=!1,Oe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Oe?"is-mobile":"not-mobile");Oe&&"ontouchstart"in document.documentElement&&(dt=!0,D="touchstart",Me="touchmove",$="touchend");document.addEventListener(D,t=>{ce=!0,F=!1;let e=D=="touchstart"?t.targetTouches[0]:t;ne.y=e.pageY||0,ne.x=e.pageX||0});document.addEventListener(Me,t=>{if(ce&&!F){let e=D=="touchstart"?t.targetTouches[0]:t,n=ne.x-(e.pageX||0),r=ne.y-(e.pageY||0);F=Math.sqrt(n*n+r*r)>10}});document.addEventListener($,()=>{ce=!1});document.addEventListener("click",t=>{Qe&&(t.preventDefault(),t.stopImmediatePropagation(),Qe=!1)});var re=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener($,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(D,n=>this.onDocumentPointerDown(n)),document.addEventListener($,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){F||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!F&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ue=new Map,de=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;S.setItem(this.key,e.toString())}},ie=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(ue.has(i))s=ue.get(i);else{let o=S.getItem(i),a=o?o==="true":this.el.open;s=new de(i,a),ue.set(i,s)}s.add(this.el)}};function He(t){let e=S.getItem("tsd-theme")||"os";t.value=e,Ae(e),t.addEventListener("change",()=>{S.setItem("tsd-theme",t.value),Ae(t.value)})}function Ae(t){document.documentElement.dataset.theme=t}var se;function Ne(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Re),Re())}async function Re(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await R(window.navigationData);se=document.documentElement.dataset.base,se.endsWith("/")||(se+="/"),t.innerHTML="";for(let n of e)Ve(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ve(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',De(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let c=a.appendChild(document.createElement("ul"));c.className="tsd-nested-navigation";for(let l of t.children)Ve(l,c,i)}else De(t,r,t.class)}function De(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=se+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&(r.classList.add("current"),r.ariaCurrent="page"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(Fe(t.text,document.createElement("span")))}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(Fe(t.text,document.createElement("span")))}}function Fe(t,e){let n=t.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);for(let r=0;r{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=gt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function pt(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Be),Be())}async function Be(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await R(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),ft(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function ft(t,e,n){let r=e.roots.filter(i=>mt(e,i,n));for(let i of r)t.appendChild(je(e,i,n))}function je(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let c=t.reflections[a],l=s.appendChild(document.createElement("a"));l.textContent=c.name,l.href=oe+c.url,l.className=c.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=oe+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let c=je(t,a,n,r);c&&o.appendChild(c)}}return r.delete(e),s}function mt(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function gt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='',t}X(re,"a[data-toggle]");X(ie,".tsd-accordion");X(ee,".tsd-filter-item input[type=checkbox]");var qe=document.getElementById("tsd-theme");qe&&He(qe);var yt=new Z;Object.defineProperty(window,"app",{value:yt});_e();Ne();$e();"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0);})(); -/*! Bundled license information: - -lunr/lunr.js: - (** - * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 - * Copyright (C) 2020 Oliver Nightingale - * @license MIT - *) - (*! - * lunr.utils - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Set - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.tokenizer - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Pipeline - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Vector - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.stemmer - * Copyright (C) 2020 Oliver Nightingale - * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt - *) - (*! - * lunr.stopWordFilter - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.trimmer - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.TokenSet - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Index - * Copyright (C) 2020 Oliver Nightingale - *) - (*! - * lunr.Builder - * Copyright (C) 2020 Oliver Nightingale - *) -*/ diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js deleted file mode 100644 index 69c1398..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js +++ /dev/null @@ -1 +0,0 @@ -window.navigationData = "eJytlE1PAjEQhv+KmfNGZQ1+7I1gJB70AMqFcCjbkZ3YbUlbjMTw3w1b2M+yrJHsrZ33fd5OZzv7AYvfFiJ4UXwt0EAAcUKCa5QQzfJdTibWlJJkVmkIYMVsAhGkTnRV2b5MbCoggE+SHKLQbzgUzJijuMey3xiXZKzeFNjYiWtYr6gaphfeb+fbIOc8S4v6g8V/CsIsKVmEodyjQ55MW2tQ/7aS6W2zwouBINapPciLJHazaguBvAa+frjr9cMaerRm+oRnXub3Kx9myjSxRae5Qj6JE0xZwf46iGt8j6ia5GYXohxDrtMFeubWrZ9hYF8zo3dLgqxnUPecSpVvMsuZNZNcpc3Mbv0MmceZkcs0Qol619wnFlvl+9f22DZR80TFaSaIHLlXfZTVojmFmqI2pKRp9T4U/fONKFl5X4Um0fcAlJHGapLL5tW79TNc/VAJpSeZ29GZ3cOapa297+R5wm7uvl/sIVKP" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js deleted file mode 100644 index 55b2924..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js +++ /dev/null @@ -1 +0,0 @@ -window.searchData = "eJy1mt1u2zgQhd+FvhVS88d27Lt2d9stUBRF0/bGCBaKxTjE2pIhyWmyQd59QUmWZsSRTMvOXSDrHB6Sn8iJxBeWJr8ztli+sH9NHLGFCFgcbjVbsMhkq9RsTRzmScoCtk83bMG2SbTf6Owd+vXqId9uWMBWmzDLdMYWjL0GB0curmvPP6Hqu16bLE+fa+9K3vImNUSLAduFqY5zJ3oTRYxVk+UhzAa3PCrFHq3TJl2Z0uJ3nQ4PBhwunu4x3JgozPXwdMDhIukm0160wtwkcZ3WxLlO78OVV+BCOowyPhbqyFM0MMqo7TZ0EMuB6YhcTdIF4kKnS0UV4/mMTwQ17zqqE+fPu76wOhq6gODGfzzv9Kd9mPY3XN81rFFJrsk6ulk96G1Yt/wYpia8c9dmQjOw83WMeL+90+6eUF723gy+Frf/zM3G5O4mUJmhm/pzV6k6Fi+TfTSxyfVXnP1ocyOT3RfCutN9rWOD7iyf41yvT4xhas0lEnxLMpObRz0kya7Snpuo2ffCOEq2DlDlZW+gvhe3l6190rFOLcAfw1WeEEVG5d2n6cetytwxwGH2HK8+7M0mGtzyqPC4qzz6QvR6dSW8Oy/cJXPBSbzROtIRKewK2yM5cQonvGFylcRZnu5XZzQ8wh69Q9XX744ZjPVTPjhaJb5Apvbs/dJpZpLYra6B6+GeUx+xqeCqqVQy859bjHa1MqruPtrjOn/HsK91Xt3i3/Za54+15uwEJvtlK6vPcaSf/DOYrKjHTKUalAIU3OAWqlB0jU6ca1STJvf3mc6zExoaNRLfnpJbU5anJl47W1N52Xtr+iPZJOlNoekqeCpH987+cavydT4jD/qpsPwW5rlOXWT7mx096KeV/WlXy/tiEDbeyb5/+nBmuHR997b53p8fMDwvIV4F/q4SnhrLZIdgb5FmwEQ2gc6ew85MJ08eCnXevKEt0mcVuOACkJl4vdFfTKy/JL91ugoz/SM1262OjiwJxJCUXhsT683BKy+9PNcHz0evyXyBqG+c8Odud7FR3R+8LpQZPwxfk/iv7S5/vsFb2vGAJouTWFtpvRteIs9NJ5kDEnaj+UaZLxH1bRO2yTwrahvNy2YekGxI+7cBK8vfxQs71OMLJq7k1ZwF7N7oTWQ/hpTBArZKtltrF7AoWe2LP2+r235p+0+dvbm8+92YBctxIOZXUs5vb4PlQVz8UFw4eDRXCiFnwZIHUl0pNUNC7gg5EgoWLAUlFI5QIKFkwVJSQukIJRIqFiwVJVSOUCHhhAXLCSWcOMIJEk67RnXqCKdIOGPBckq1OHOEMyS8ZsFyRgmvHeE1Es5ZsLymhHNHOMcAWB7mJAEuO7wFT0HPmBQT/GCAuMWC0+y5DHEMEbdocJI/7nLEMUjc4sFJBrnLEscwcYsIJznkLk8cA8UtJpxkkbtMcQwVt6hwEivucsUxWNziwkm0uMsWx3Bxiwwn8eIuXxwDJiwznCRMuIQJTJiwzAiSMOESJlpLVLFGkYQJYpXChAnLjKBXOJcwgQkTlhlBEiZcwgQmTFhmBEmYcAkTmDBhmREkYcIlTGDChGVGkIQJlzCBCROWGUESJlzCBCZMWGYESZhwCROYMGmZESRh0iVMYsKkZUaShEmXMIkJk5YZSRImXcJkayMsdkKSMEnshZgwaZmR9D7qEiYxYdIyI0nCpEuYxIRJy4wkCZMuYRITJi0zkiRMuoRJTJi0zEiSMOkSJjFh0jIjScKkS5jEhCnLjCQJUy5hChOmLDOKJEy5hClMmLLMKJIw5RKmMGHKMqNIwpRLmGqVW0W9RRKmiIoLE6YsM4qu1lzCqktFffyo01xXL5dteQs/Q72wf6oCms8O9fsL49ds8fL62hTMi5dXUDPb32xrrsc18Jh7eRTvY8rifn94hdIYinljKMeehuATDXAaN06CezlF+CRC4wVGym+gkFNWfeZv/EAnuV8nW+dGGivQy3GpnZ5umKLTNo35pDGfDHZF88tBz70c4XcXMLkKTK5ftOLAF3AABn769nv0xkuCSZB+3aJefANDMExyULzyhSdwBP2V0suxfWwCTCIw475mzQtrkEqCVOpEo/aYASSkHxLt98PADJAv/R4ocLwDjBToIPftYPtVXWOnAGjKDzTirAeIB8aM+47Z8fd0IDAAWfmB3PN2DfgCApUvgcdfhYEGwMQp34kjbMAAK98Bhh95wYIFkBR+SJYnBIAFmA3hNxvEww8Y5H4MlibEbs/hduAXqP4oDLoFtmfhtz8fjiuBKGB4ud/wliZl59aHYxX3h9NKwHoKrGd+1vUhYLAmgSXJyyQrDn+QKVE8UI0Iv2rEOlO7Muio8OsocMJzCvdnz+4e/7QFBhMwI/2Y6f4eBWxBPSz96mGPb0fAH8yV8pyr4tAMGFnAkfBb2dx1TYB+Cs9+dpX8ElAj/aixZ3TX5andxgdE8kvUnGUHCzYY31NM8CMFeuTRoduA7cyuQIAtlrevr/8DVXu+WQ=="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css deleted file mode 100644 index 44328e9..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css +++ /dev/null @@ -1,1633 +0,0 @@ -@layer typedoc { - :root { - --dim-toolbar-contents-height: 2.5rem; - --dim-toolbar-border-bottom-width: 1px; - --dim-header-height: calc( - var(--dim-toolbar-border-bottom-width) + - var(--dim-toolbar-contents-height) - ); - - /* 0rem For mobile; unit is required for calculation in `calc` */ - --dim-container-main-margin-y: 0rem; - - --dim-footer-height: 3.5rem; - - --modal-animation-duration: 0.2s; - } - - :root { - /* Light */ - --light-color-background: #f2f4f8; - --light-color-background-secondary: #eff0f1; - /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ - --light-color-background-active: #d6d8da; - --light-color-background-warning: #e6e600; - --light-color-warning-text: #222; - --light-color-accent: #c5c7c9; - --light-color-active-menu-item: var(--light-color-background-active); - --light-color-text: #222; - --light-color-contrast-text: #000; - --light-color-text-aside: #5e5e5e; - - --light-color-icon-background: var(--light-color-background); - --light-color-icon-text: var(--light-color-text); - - --light-color-comment-tag-text: var(--light-color-text); - --light-color-comment-tag: var(--light-color-background); - - --light-color-link: #1f70c2; - --light-color-focus-outline: #3584e4; - - --light-color-ts-keyword: #056bd6; - --light-color-ts-project: #b111c9; - --light-color-ts-module: var(--light-color-ts-project); - --light-color-ts-namespace: var(--light-color-ts-project); - --light-color-ts-enum: #7e6f15; - --light-color-ts-enum-member: var(--light-color-ts-enum); - --light-color-ts-variable: #4760ec; - --light-color-ts-function: #572be7; - --light-color-ts-class: #1f70c2; - --light-color-ts-interface: #108024; - --light-color-ts-constructor: var(--light-color-ts-class); - --light-color-ts-property: #9f5f30; - --light-color-ts-method: #be3989; - --light-color-ts-reference: #ff4d82; - --light-color-ts-call-signature: var(--light-color-ts-method); - --light-color-ts-index-signature: var(--light-color-ts-property); - --light-color-ts-constructor-signature: var( - --light-color-ts-constructor - ); - --light-color-ts-parameter: var(--light-color-ts-variable); - /* type literal not included as links will never be generated to it */ - --light-color-ts-type-parameter: #a55c0e; - --light-color-ts-accessor: #c73c3c; - --light-color-ts-get-signature: var(--light-color-ts-accessor); - --light-color-ts-set-signature: var(--light-color-ts-accessor); - --light-color-ts-type-alias: #d51270; - /* reference not included as links will be colored with the kind that it points to */ - --light-color-document: #000000; - - --light-color-alert-note: #0969d9; - --light-color-alert-tip: #1a7f37; - --light-color-alert-important: #8250df; - --light-color-alert-warning: #9a6700; - --light-color-alert-caution: #cf222e; - - --light-external-icon: url("data:image/svg+xml;utf8,"); - --light-color-scheme: light; - } - - :root { - /* Dark */ - --dark-color-background: #2b2e33; - --dark-color-background-secondary: #1e2024; - /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ - --dark-color-background-active: #5d5d6a; - --dark-color-background-warning: #bebe00; - --dark-color-warning-text: #222; - --dark-color-accent: #9096a2; - --dark-color-active-menu-item: var(--dark-color-background-active); - --dark-color-text: #f5f5f5; - --dark-color-contrast-text: #ffffff; - --dark-color-text-aside: #dddddd; - - --dark-color-icon-background: var(--dark-color-background-secondary); - --dark-color-icon-text: var(--dark-color-text); - - --dark-color-comment-tag-text: var(--dark-color-text); - --dark-color-comment-tag: var(--dark-color-background); - - --dark-color-link: #00aff4; - --dark-color-focus-outline: #4c97f2; - - --dark-color-ts-keyword: #3399ff; - --dark-color-ts-project: #e358ff; - --dark-color-ts-module: var(--dark-color-ts-project); - --dark-color-ts-namespace: var(--dark-color-ts-project); - --dark-color-ts-enum: #f4d93e; - --dark-color-ts-enum-member: var(--dark-color-ts-enum); - --dark-color-ts-variable: #798dff; - --dark-color-ts-function: #a280ff; - --dark-color-ts-class: #8ac4ff; - --dark-color-ts-interface: #6cff87; - --dark-color-ts-constructor: var(--dark-color-ts-class); - --dark-color-ts-property: #ff984d; - --dark-color-ts-method: #ff4db8; - --dark-color-ts-reference: #ff4d82; - --dark-color-ts-call-signature: var(--dark-color-ts-method); - --dark-color-ts-index-signature: var(--dark-color-ts-property); - --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); - --dark-color-ts-parameter: var(--dark-color-ts-variable); - /* type literal not included as links will never be generated to it */ - --dark-color-ts-type-parameter: #e07d13; - --dark-color-ts-accessor: #ff6060; - --dark-color-ts-get-signature: var(--dark-color-ts-accessor); - --dark-color-ts-set-signature: var(--dark-color-ts-accessor); - --dark-color-ts-type-alias: #ff6492; - /* reference not included as links will be colored with the kind that it points to */ - --dark-color-document: #ffffff; - - --dark-color-alert-note: #0969d9; - --dark-color-alert-tip: #1a7f37; - --dark-color-alert-important: #8250df; - --dark-color-alert-warning: #9a6700; - --dark-color-alert-caution: #cf222e; - - --dark-external-icon: url("data:image/svg+xml;utf8,"); - --dark-color-scheme: dark; - } - - @media (prefers-color-scheme: light) { - :root { - --color-background: var(--light-color-background); - --color-background-secondary: var( - --light-color-background-secondary - ); - --color-background-active: var(--light-color-background-active); - --color-background-warning: var(--light-color-background-warning); - --color-warning-text: var(--light-color-warning-text); - --color-accent: var(--light-color-accent); - --color-active-menu-item: var(--light-color-active-menu-item); - --color-text: var(--light-color-text); - --color-contrast-text: var(--light-color-contrast-text); - --color-text-aside: var(--light-color-text-aside); - - --color-icon-background: var(--light-color-icon-background); - --color-icon-text: var(--light-color-icon-text); - - --color-comment-tag-text: var(--light-color-text); - --color-comment-tag: var(--light-color-background); - - --color-link: var(--light-color-link); - --color-focus-outline: var(--light-color-focus-outline); - - --color-ts-keyword: var(--light-color-ts-keyword); - --color-ts-project: var(--light-color-ts-project); - --color-ts-module: var(--light-color-ts-module); - --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-enum-member: var(--light-color-ts-enum-member); - --color-ts-variable: var(--light-color-ts-variable); - --color-ts-function: var(--light-color-ts-function); - --color-ts-class: var(--light-color-ts-class); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-constructor: var(--light-color-ts-constructor); - --color-ts-property: var(--light-color-ts-property); - --color-ts-method: var(--light-color-ts-method); - --color-ts-reference: var(--light-color-ts-reference); - --color-ts-call-signature: var(--light-color-ts-call-signature); - --color-ts-index-signature: var(--light-color-ts-index-signature); - --color-ts-constructor-signature: var( - --light-color-ts-constructor-signature - ); - --color-ts-parameter: var(--light-color-ts-parameter); - --color-ts-type-parameter: var(--light-color-ts-type-parameter); - --color-ts-accessor: var(--light-color-ts-accessor); - --color-ts-get-signature: var(--light-color-ts-get-signature); - --color-ts-set-signature: var(--light-color-ts-set-signature); - --color-ts-type-alias: var(--light-color-ts-type-alias); - --color-document: var(--light-color-document); - - --color-alert-note: var(--light-color-alert-note); - --color-alert-tip: var(--light-color-alert-tip); - --color-alert-important: var(--light-color-alert-important); - --color-alert-warning: var(--light-color-alert-warning); - --color-alert-caution: var(--light-color-alert-caution); - - --external-icon: var(--light-external-icon); - --color-scheme: var(--light-color-scheme); - } - } - - @media (prefers-color-scheme: dark) { - :root { - --color-background: var(--dark-color-background); - --color-background-secondary: var( - --dark-color-background-secondary - ); - --color-background-active: var(--dark-color-background-active); - --color-background-warning: var(--dark-color-background-warning); - --color-warning-text: var(--dark-color-warning-text); - --color-accent: var(--dark-color-accent); - --color-active-menu-item: var(--dark-color-active-menu-item); - --color-text: var(--dark-color-text); - --color-contrast-text: var(--dark-color-contrast-text); - --color-text-aside: var(--dark-color-text-aside); - - --color-icon-background: var(--dark-color-icon-background); - --color-icon-text: var(--dark-color-icon-text); - - --color-comment-tag-text: var(--dark-color-text); - --color-comment-tag: var(--dark-color-background); - - --color-link: var(--dark-color-link); - --color-focus-outline: var(--dark-color-focus-outline); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --color-ts-project: var(--dark-color-ts-project); - --color-ts-module: var(--dark-color-ts-module); - --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-enum-member: var(--dark-color-ts-enum-member); - --color-ts-variable: var(--dark-color-ts-variable); - --color-ts-function: var(--dark-color-ts-function); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-constructor: var(--dark-color-ts-constructor); - --color-ts-property: var(--dark-color-ts-property); - --color-ts-method: var(--dark-color-ts-method); - --color-ts-reference: var(--dark-color-ts-reference); - --color-ts-call-signature: var(--dark-color-ts-call-signature); - --color-ts-index-signature: var(--dark-color-ts-index-signature); - --color-ts-constructor-signature: var( - --dark-color-ts-constructor-signature - ); - --color-ts-parameter: var(--dark-color-ts-parameter); - --color-ts-type-parameter: var(--dark-color-ts-type-parameter); - --color-ts-accessor: var(--dark-color-ts-accessor); - --color-ts-get-signature: var(--dark-color-ts-get-signature); - --color-ts-set-signature: var(--dark-color-ts-set-signature); - --color-ts-type-alias: var(--dark-color-ts-type-alias); - --color-document: var(--dark-color-document); - - --color-alert-note: var(--dark-color-alert-note); - --color-alert-tip: var(--dark-color-alert-tip); - --color-alert-important: var(--dark-color-alert-important); - --color-alert-warning: var(--dark-color-alert-warning); - --color-alert-caution: var(--dark-color-alert-caution); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); - } - } - - :root[data-theme="light"] { - --color-background: var(--light-color-background); - --color-background-secondary: var(--light-color-background-secondary); - --color-background-active: var(--light-color-background-active); - --color-background-warning: var(--light-color-background-warning); - --color-warning-text: var(--light-color-warning-text); - --color-icon-background: var(--light-color-icon-background); - --color-accent: var(--light-color-accent); - --color-active-menu-item: var(--light-color-active-menu-item); - --color-text: var(--light-color-text); - --color-contrast-text: var(--light-color-contrast-text); - --color-text-aside: var(--light-color-text-aside); - --color-icon-text: var(--light-color-icon-text); - - --color-comment-tag-text: var(--light-color-text); - --color-comment-tag: var(--light-color-background); - - --color-link: var(--light-color-link); - --color-focus-outline: var(--light-color-focus-outline); - - --color-ts-keyword: var(--light-color-ts-keyword); - --color-ts-project: var(--light-color-ts-project); - --color-ts-module: var(--light-color-ts-module); - --color-ts-namespace: var(--light-color-ts-namespace); - --color-ts-enum: var(--light-color-ts-enum); - --color-ts-enum-member: var(--light-color-ts-enum-member); - --color-ts-variable: var(--light-color-ts-variable); - --color-ts-function: var(--light-color-ts-function); - --color-ts-class: var(--light-color-ts-class); - --color-ts-interface: var(--light-color-ts-interface); - --color-ts-constructor: var(--light-color-ts-constructor); - --color-ts-property: var(--light-color-ts-property); - --color-ts-method: var(--light-color-ts-method); - --color-ts-reference: var(--light-color-ts-reference); - --color-ts-call-signature: var(--light-color-ts-call-signature); - --color-ts-index-signature: var(--light-color-ts-index-signature); - --color-ts-constructor-signature: var( - --light-color-ts-constructor-signature - ); - --color-ts-parameter: var(--light-color-ts-parameter); - --color-ts-type-parameter: var(--light-color-ts-type-parameter); - --color-ts-accessor: var(--light-color-ts-accessor); - --color-ts-get-signature: var(--light-color-ts-get-signature); - --color-ts-set-signature: var(--light-color-ts-set-signature); - --color-ts-type-alias: var(--light-color-ts-type-alias); - --color-document: var(--light-color-document); - - --color-note: var(--light-color-note); - --color-tip: var(--light-color-tip); - --color-important: var(--light-color-important); - --color-warning: var(--light-color-warning); - --color-caution: var(--light-color-caution); - - --external-icon: var(--light-external-icon); - --color-scheme: var(--light-color-scheme); - } - - :root[data-theme="dark"] { - --color-background: var(--dark-color-background); - --color-background-secondary: var(--dark-color-background-secondary); - --color-background-active: var(--dark-color-background-active); - --color-background-warning: var(--dark-color-background-warning); - --color-warning-text: var(--dark-color-warning-text); - --color-icon-background: var(--dark-color-icon-background); - --color-accent: var(--dark-color-accent); - --color-active-menu-item: var(--dark-color-active-menu-item); - --color-text: var(--dark-color-text); - --color-contrast-text: var(--dark-color-contrast-text); - --color-text-aside: var(--dark-color-text-aside); - --color-icon-text: var(--dark-color-icon-text); - - --color-comment-tag-text: var(--dark-color-text); - --color-comment-tag: var(--dark-color-background); - - --color-link: var(--dark-color-link); - --color-focus-outline: var(--dark-color-focus-outline); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --color-ts-project: var(--dark-color-ts-project); - --color-ts-module: var(--dark-color-ts-module); - --color-ts-namespace: var(--dark-color-ts-namespace); - --color-ts-enum: var(--dark-color-ts-enum); - --color-ts-enum-member: var(--dark-color-ts-enum-member); - --color-ts-variable: var(--dark-color-ts-variable); - --color-ts-function: var(--dark-color-ts-function); - --color-ts-class: var(--dark-color-ts-class); - --color-ts-interface: var(--dark-color-ts-interface); - --color-ts-constructor: var(--dark-color-ts-constructor); - --color-ts-property: var(--dark-color-ts-property); - --color-ts-method: var(--dark-color-ts-method); - --color-ts-reference: var(--dark-color-ts-reference); - --color-ts-call-signature: var(--dark-color-ts-call-signature); - --color-ts-index-signature: var(--dark-color-ts-index-signature); - --color-ts-constructor-signature: var( - --dark-color-ts-constructor-signature - ); - --color-ts-parameter: var(--dark-color-ts-parameter); - --color-ts-type-parameter: var(--dark-color-ts-type-parameter); - --color-ts-accessor: var(--dark-color-ts-accessor); - --color-ts-get-signature: var(--dark-color-ts-get-signature); - --color-ts-set-signature: var(--dark-color-ts-set-signature); - --color-ts-type-alias: var(--dark-color-ts-type-alias); - --color-document: var(--dark-color-document); - - --color-note: var(--dark-color-note); - --color-tip: var(--dark-color-tip); - --color-important: var(--dark-color-important); - --color-warning: var(--dark-color-warning); - --color-caution: var(--dark-color-caution); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); - } - - html { - color-scheme: var(--color-scheme); - @media (prefers-reduced-motion: no-preference) { - scroll-behavior: smooth; - } - } - - *:focus-visible, - .tsd-accordion-summary:focus-visible svg { - outline: 2px solid var(--color-focus-outline); - } - - .always-visible, - .always-visible .tsd-signatures { - display: inherit !important; - } - - h1, - h2, - h3, - h4, - h5, - h6 { - line-height: 1.2; - } - - h1 { - font-size: 1.875rem; - margin: 0.67rem 0; - } - - h2 { - font-size: 1.5rem; - margin: 0.83rem 0; - } - - h3 { - font-size: 1.25rem; - margin: 1rem 0; - } - - h4 { - font-size: 1.05rem; - margin: 1.33rem 0; - } - - h5 { - font-size: 1rem; - margin: 1.5rem 0; - } - - h6 { - font-size: 0.875rem; - margin: 2.33rem 0; - } - - dl, - menu, - ol, - ul { - margin: 1em 0; - } - - dd { - margin: 0 0 0 34px; - } - - .container { - max-width: 1700px; - padding: 0 2rem; - } - - /* Footer */ - footer { - border-top: 1px solid var(--color-accent); - padding-top: 1rem; - padding-bottom: 1rem; - max-height: var(--dim-footer-height); - } - footer > p { - margin: 0 1em; - } - - .container-main { - margin: var(--dim-container-main-margin-y) auto; - /* toolbar, footer, margin */ - min-height: calc( - 100svh - var(--dim-header-height) - var(--dim-footer-height) - - 2 * var(--dim-container-main-margin-y) - ); - } - - @keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } - } - @keyframes fade-out { - from { - opacity: 1; - visibility: visible; - } - to { - opacity: 0; - } - } - @keyframes pop-in-from-right { - from { - transform: translate(100%, 0); - } - to { - transform: translate(0, 0); - } - } - @keyframes pop-out-to-right { - from { - transform: translate(0, 0); - visibility: visible; - } - to { - transform: translate(100%, 0); - } - } - body { - background: var(--color-background); - font-family: - -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", - Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; - font-size: 16px; - color: var(--color-text); - margin: 0; - } - - a { - color: var(--color-link); - text-decoration: none; - } - a:hover { - text-decoration: underline; - } - a.external[target="_blank"] { - background-image: var(--external-icon); - background-position: top 3px right; - background-repeat: no-repeat; - padding-right: 13px; - } - a.tsd-anchor-link { - color: var(--color-text); - } - :target { - scroll-margin-block: calc(var(--dim-header-height) + 0.5rem); - } - - code, - pre { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - padding: 0.2em; - margin: 0; - font-size: 0.875rem; - border-radius: 0.8em; - } - - pre { - position: relative; - white-space: pre-wrap; - word-wrap: break-word; - padding: 10px; - border: 1px solid var(--color-accent); - margin-bottom: 8px; - } - pre code { - padding: 0; - font-size: 100%; - } - pre > button { - position: absolute; - top: 10px; - right: 10px; - opacity: 0; - transition: opacity 0.1s; - box-sizing: border-box; - } - pre:hover > button, - pre > button.visible, - pre > button:focus-visible { - opacity: 1; - } - - blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; - } - - img { - max-width: 100%; - } - - * { - scrollbar-width: thin; - scrollbar-color: var(--color-accent) var(--color-icon-background); - } - - *::-webkit-scrollbar { - width: 0.75rem; - } - - *::-webkit-scrollbar-track { - background: var(--color-icon-background); - } - - *::-webkit-scrollbar-thumb { - background-color: var(--color-accent); - border-radius: 999rem; - border: 0.25rem solid var(--color-icon-background); - } - - dialog { - border: none; - outline: none; - padding: 0; - background-color: var(--color-background); - } - dialog::backdrop { - display: none; - } - #tsd-overlay { - background-color: rgba(0, 0, 0, 0.5); - position: fixed; - z-index: 9999; - top: 0; - left: 0; - right: 0; - bottom: 0; - animation: fade-in var(--modal-animation-duration) forwards; - } - #tsd-overlay.closing { - animation-name: fade-out; - } - - .tsd-typography { - line-height: 1.333em; - } - .tsd-typography ul { - list-style: square; - padding: 0 0 0 20px; - margin: 0; - } - .tsd-typography .tsd-index-panel h3, - .tsd-index-panel .tsd-typography h3, - .tsd-typography h4, - .tsd-typography h5, - .tsd-typography h6 { - font-size: 1em; - } - .tsd-typography h5, - .tsd-typography h6 { - font-weight: normal; - } - .tsd-typography p, - .tsd-typography ul, - .tsd-typography ol { - margin: 1em 0; - } - .tsd-typography table { - border-collapse: collapse; - border: none; - } - .tsd-typography td, - .tsd-typography th { - padding: 6px 13px; - border: 1px solid var(--color-accent); - } - .tsd-typography thead, - .tsd-typography tr:nth-child(even) { - background-color: var(--color-background-secondary); - } - - .tsd-alert { - padding: 8px 16px; - margin-bottom: 16px; - border-left: 0.25em solid var(--alert-color); - } - .tsd-alert blockquote > :last-child, - .tsd-alert > :last-child { - margin-bottom: 0; - } - .tsd-alert-title { - color: var(--alert-color); - display: inline-flex; - align-items: center; - } - .tsd-alert-title span { - margin-left: 4px; - } - - .tsd-alert-note { - --alert-color: var(--color-alert-note); - } - .tsd-alert-tip { - --alert-color: var(--color-alert-tip); - } - .tsd-alert-important { - --alert-color: var(--color-alert-important); - } - .tsd-alert-warning { - --alert-color: var(--color-alert-warning); - } - .tsd-alert-caution { - --alert-color: var(--color-alert-caution); - } - - .tsd-breadcrumb { - margin: 0; - margin-top: 1rem; - padding: 0; - color: var(--color-text-aside); - } - .tsd-breadcrumb a { - color: var(--color-text-aside); - text-decoration: none; - } - .tsd-breadcrumb a:hover { - text-decoration: underline; - } - .tsd-breadcrumb li { - display: inline; - } - .tsd-breadcrumb li:after { - content: " / "; - } - - .tsd-comment-tags { - display: flex; - flex-direction: column; - } - dl.tsd-comment-tag-group { - display: flex; - align-items: center; - overflow: hidden; - margin: 0.5em 0; - } - dl.tsd-comment-tag-group dt { - display: flex; - margin-right: 0.5em; - font-size: 0.875em; - font-weight: normal; - } - dl.tsd-comment-tag-group dd { - margin: 0; - } - code.tsd-tag { - padding: 0.25em 0.4em; - border: 0.1em solid var(--color-accent); - margin-right: 0.25em; - font-size: 70%; - } - h1 code.tsd-tag:first-of-type { - margin-left: 0.25em; - } - - dl.tsd-comment-tag-group dd:before, - dl.tsd-comment-tag-group dd:after { - content: " "; - } - dl.tsd-comment-tag-group dd pre, - dl.tsd-comment-tag-group dd:after { - clear: both; - } - dl.tsd-comment-tag-group p { - margin: 0; - } - - .tsd-panel.tsd-comment .lead { - font-size: 1.1em; - line-height: 1.333em; - margin-bottom: 2em; - } - .tsd-panel.tsd-comment .lead:last-child { - margin-bottom: 0; - } - - .tsd-filter-visibility h4 { - font-size: 1rem; - padding-top: 0.75rem; - padding-bottom: 0.5rem; - margin: 0; - } - .tsd-filter-item:not(:last-child) { - margin-bottom: 0.5rem; - } - .tsd-filter-input { - display: flex; - width: -moz-fit-content; - width: fit-content; - align-items: center; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - cursor: pointer; - } - .tsd-filter-input input[type="checkbox"] { - cursor: pointer; - position: absolute; - width: 1.5em; - height: 1.5em; - opacity: 0; - } - .tsd-filter-input input[type="checkbox"]:disabled { - pointer-events: none; - } - .tsd-filter-input svg { - cursor: pointer; - width: 1.5em; - height: 1.5em; - margin-right: 0.5em; - border-radius: 0.33em; - /* Leaving this at full opacity breaks event listeners on Firefox. - Don't remove unless you know what you're doing. */ - opacity: 0.99; - } - .tsd-filter-input input[type="checkbox"]:focus-visible + svg { - outline: 2px solid var(--color-focus-outline); - } - .tsd-checkbox-background { - fill: var(--color-accent); - } - input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { - stroke: var(--color-text); - } - .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { - fill: var(--color-background); - stroke: var(--color-accent); - stroke-width: 0.25rem; - } - .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { - stroke: var(--color-accent); - } - - .settings-label { - font-weight: bold; - text-transform: uppercase; - display: inline-block; - } - - .tsd-filter-visibility .settings-label { - margin: 0.75rem 0 0.5rem 0; - } - - .tsd-theme-toggle .settings-label { - margin: 0.75rem 0.75rem 0 0; - } - - .tsd-hierarchy h4 label:hover span { - text-decoration: underline; - } - - .tsd-hierarchy { - list-style: square; - margin: 0; - } - .tsd-hierarchy-target { - font-weight: bold; - } - .tsd-hierarchy-toggle { - color: var(--color-link); - cursor: pointer; - } - - .tsd-full-hierarchy:not(:last-child) { - margin-bottom: 1em; - padding-bottom: 1em; - border-bottom: 1px solid var(--color-accent); - } - .tsd-full-hierarchy, - .tsd-full-hierarchy ul { - list-style: none; - margin: 0; - padding: 0; - } - .tsd-full-hierarchy ul { - padding-left: 1.5rem; - } - .tsd-full-hierarchy a { - padding: 0.25rem 0 !important; - font-size: 1rem; - display: inline-flex; - align-items: center; - color: var(--color-text); - } - .tsd-full-hierarchy svg[data-dropdown] { - cursor: pointer; - } - .tsd-full-hierarchy svg[data-dropdown="false"] { - transform: rotate(-90deg); - } - .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { - display: none; - } - - .tsd-panel-group.tsd-index-group { - margin-bottom: 0; - } - .tsd-index-panel .tsd-index-list { - list-style: none; - line-height: 1.333em; - margin: 0; - padding: 0.25rem 0 0 0; - overflow: hidden; - display: grid; - grid-template-columns: repeat(3, 1fr); - column-gap: 1rem; - grid-template-rows: auto; - } - @media (max-width: 1024px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(2, 1fr); - } - } - @media (max-width: 768px) { - .tsd-index-panel .tsd-index-list { - grid-template-columns: repeat(1, 1fr); - } - } - .tsd-index-panel .tsd-index-list li { - -webkit-page-break-inside: avoid; - -moz-page-break-inside: avoid; - -ms-page-break-inside: avoid; - -o-page-break-inside: avoid; - page-break-inside: avoid; - } - - .tsd-flag { - display: inline-block; - padding: 0.25em 0.4em; - border-radius: 4px; - color: var(--color-comment-tag-text); - background-color: var(--color-comment-tag); - text-indent: 0; - font-size: 75%; - line-height: 1; - font-weight: normal; - } - - .tsd-anchor { - position: relative; - top: -100px; - } - - .tsd-member { - position: relative; - } - .tsd-member .tsd-anchor + h3 { - display: flex; - align-items: center; - margin-top: 0; - margin-bottom: 0; - border-bottom: none; - } - - .tsd-navigation.settings { - margin: 0; - margin-bottom: 1rem; - } - .tsd-navigation > a, - .tsd-navigation .tsd-accordion-summary { - width: calc(100% - 0.25rem); - display: flex; - align-items: center; - } - .tsd-navigation a, - .tsd-navigation summary > span, - .tsd-page-navigation a { - display: flex; - width: calc(100% - 0.25rem); - align-items: center; - padding: 0.25rem; - color: var(--color-text); - text-decoration: none; - box-sizing: border-box; - } - .tsd-navigation a.current, - .tsd-page-navigation a.current { - background: var(--color-active-menu-item); - color: var(--color-contrast-text); - } - .tsd-navigation a:hover, - .tsd-page-navigation a:hover { - text-decoration: underline; - } - .tsd-navigation ul, - .tsd-page-navigation ul { - margin-top: 0; - margin-bottom: 0; - padding: 0; - list-style: none; - } - .tsd-navigation li, - .tsd-page-navigation li { - padding: 0; - max-width: 100%; - } - .tsd-navigation .tsd-nav-link { - display: none; - } - .tsd-nested-navigation { - margin-left: 3rem; - } - .tsd-nested-navigation > li > details { - margin-left: -1.5rem; - } - .tsd-small-nested-navigation { - margin-left: 1.5rem; - } - .tsd-small-nested-navigation > li > details { - margin-left: -1.5rem; - } - - .tsd-page-navigation-section > summary { - padding: 0.25rem; - } - .tsd-page-navigation-section > summary > svg { - margin-right: 0.25rem; - } - .tsd-page-navigation-section > div { - margin-left: 30px; - } - .tsd-page-navigation ul { - padding-left: 1.75rem; - } - - #tsd-sidebar-links a { - margin-top: 0; - margin-bottom: 0.5rem; - line-height: 1.25rem; - } - #tsd-sidebar-links a:last-of-type { - margin-bottom: 0; - } - - a.tsd-index-link { - padding: 0.25rem 0 !important; - font-size: 1rem; - line-height: 1.25rem; - display: inline-flex; - align-items: center; - color: var(--color-text); - } - .tsd-accordion-summary { - list-style-type: none; /* hide marker on non-safari */ - outline: none; /* broken on safari, so just hide it */ - display: flex; - align-items: center; - gap: 0.25rem; - box-sizing: border-box; - } - .tsd-accordion-summary::-webkit-details-marker { - display: none; /* hide marker on safari */ - } - .tsd-accordion-summary, - .tsd-accordion-summary a { - -moz-user-select: none; - -webkit-user-select: none; - -ms-user-select: none; - user-select: none; - - cursor: pointer; - } - .tsd-accordion-summary a { - width: calc(100% - 1.5rem); - } - .tsd-accordion-summary > * { - margin-top: 0; - margin-bottom: 0; - padding-top: 0; - padding-bottom: 0; - } - /* - * We need to be careful to target the arrow indicating whether the accordion - * is open, but not any other SVGs included in the details element. - */ - .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child { - transform: rotate(-90deg); - } - .tsd-index-content > :not(:first-child) { - margin-top: 0.75rem; - } - .tsd-index-summary { - margin-top: 1.5rem; - margin-bottom: 0.75rem; - display: flex; - align-content: center; - } - - .tsd-no-select { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - } - .tsd-kind-icon { - margin-right: 0.5rem; - width: 1.25rem; - height: 1.25rem; - min-width: 1.25rem; - min-height: 1.25rem; - } - .tsd-signature > .tsd-kind-icon { - margin-right: 0.8rem; - } - - .tsd-panel { - margin-bottom: 2.5rem; - } - .tsd-panel.tsd-member { - margin-bottom: 4rem; - } - .tsd-panel:empty { - display: none; - } - .tsd-panel > h1, - .tsd-panel > h2, - .tsd-panel > h3 { - margin: 1.5rem -1.5rem 0.75rem -1.5rem; - padding: 0 1.5rem 0.75rem 1.5rem; - } - .tsd-panel > h1.tsd-before-signature, - .tsd-panel > h2.tsd-before-signature, - .tsd-panel > h3.tsd-before-signature { - margin-bottom: 0; - border-bottom: none; - } - - .tsd-panel-group { - margin: 2rem 0; - } - .tsd-panel-group.tsd-index-group { - margin: 2rem 0; - } - .tsd-panel-group.tsd-index-group details { - margin: 2rem 0; - } - .tsd-panel-group > .tsd-accordion-summary { - margin-bottom: 1rem; - } - - #tsd-search[open] { - animation: fade-in var(--modal-animation-duration) ease-out forwards; - } - #tsd-search[open].closing { - animation-name: fade-out; - } - - /* Avoid setting `display` on closed dialog */ - #tsd-search[open] { - display: flex; - flex-direction: column; - padding: 1rem; - width: 32rem; - max-width: 90vw; - max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh); - /* Anchor dialog to top */ - margin-top: 10vh; - border-radius: 6px; - will-change: max-height; - } - #tsd-search-input { - box-sizing: border-box; - width: 100%; - padding: 0 0.625rem; /* 10px */ - outline: 0; - border: 2px solid var(--color-accent); - background-color: transparent; - color: var(--color-text); - border-radius: 4px; - height: 2.5rem; - flex: 0 0 auto; - font-size: 0.875rem; - transition: border-color 0.2s, background-color 0.2s; - } - #tsd-search-input:focus-visible { - background-color: var(--color-background-active); - border-color: transparent; - color: var(--color-contrast-text); - } - #tsd-search-input::placeholder { - color: inherit; - opacity: 0.8; - } - #tsd-search-results { - margin: 0; - padding: 0; - list-style: none; - flex: 1 1 auto; - display: flex; - flex-direction: column; - overflow-y: auto; - } - #tsd-search-results:not(:empty) { - margin-top: 0.5rem; - } - #tsd-search-results > li { - background-color: var(--color-background); - line-height: 1.5; - box-sizing: border-box; - border-radius: 4px; - } - #tsd-search-results > li:nth-child(even) { - background-color: var(--color-background-secondary); - } - #tsd-search-results > li:is(:hover, [aria-selected="true"]) { - background-color: var(--color-background-active); - color: var(--color-contrast-text); - } - /* It's important that this takes full size of parent `li`, to capture a click on `li` */ - #tsd-search-results > li > a { - display: flex; - align-items: center; - padding: 0.5rem 0.25rem; - box-sizing: border-box; - width: 100%; - } - #tsd-search-results > li > a > .text { - flex: 1 1 auto; - min-width: 0; - overflow-wrap: anywhere; - } - #tsd-search-results > li > a .parent { - color: var(--color-text-aside); - } - #tsd-search-results > li > a mark { - color: inherit; - background-color: inherit; - font-weight: bold; - } - #tsd-search-status { - flex: 1; - display: grid; - place-content: center; - text-align: center; - overflow-wrap: anywhere; - } - #tsd-search-status:not(:empty) { - min-height: 6rem; - } - - .tsd-signature { - margin: 0 0 1rem 0; - padding: 1rem 0.5rem; - border: 1px solid var(--color-accent); - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 14px; - overflow-x: auto; - } - - .tsd-signature-keyword { - color: var(--color-ts-keyword); - font-weight: normal; - } - - .tsd-signature-symbol { - color: var(--color-text-aside); - font-weight: normal; - } - - .tsd-signature-type { - font-style: italic; - font-weight: normal; - } - - .tsd-signatures { - padding: 0; - margin: 0 0 1em 0; - list-style-type: none; - } - .tsd-signatures .tsd-signature { - margin: 0; - border-color: var(--color-accent); - border-width: 1px 0; - transition: background-color 0.1s; - } - .tsd-signatures .tsd-index-signature:not(:last-child) { - margin-bottom: 1em; - } - .tsd-signatures .tsd-index-signature .tsd-signature { - border-width: 1px; - } - .tsd-description .tsd-signatures .tsd-signature { - border-width: 1px; - } - - ul.tsd-parameter-list, - ul.tsd-type-parameter-list { - list-style: square; - margin: 0; - padding-left: 20px; - } - ul.tsd-parameter-list > li.tsd-parameter-signature, - ul.tsd-type-parameter-list > li.tsd-parameter-signature { - list-style: none; - margin-left: -20px; - } - ul.tsd-parameter-list h5, - ul.tsd-type-parameter-list h5 { - font-size: 16px; - margin: 1em 0 0.5em 0; - } - .tsd-sources { - margin-top: 1rem; - font-size: 0.875em; - } - .tsd-sources a { - color: var(--color-text-aside); - text-decoration: underline; - } - .tsd-sources ul { - list-style: none; - padding: 0; - } - - .tsd-page-toolbar { - position: sticky; - z-index: 1; - top: 0; - left: 0; - width: 100%; - color: var(--color-text); - background: var(--color-background-secondary); - border-bottom: var(--dim-toolbar-border-bottom-width) - var(--color-accent) solid; - transition: transform 0.3s ease-in-out; - } - .tsd-page-toolbar a { - color: var(--color-text); - } - .tsd-toolbar-contents { - display: flex; - align-items: center; - height: var(--dim-toolbar-contents-height); - margin: 0 auto; - } - .tsd-toolbar-contents > .title { - font-weight: bold; - margin-right: auto; - } - #tsd-toolbar-links { - display: flex; - align-items: center; - gap: 1.5rem; - margin-right: 1rem; - } - - .tsd-widget { - box-sizing: border-box; - display: inline-block; - opacity: 0.8; - height: 2.5rem; - width: 2.5rem; - transition: opacity 0.1s, background-color 0.1s; - text-align: center; - cursor: pointer; - border: none; - background-color: transparent; - } - .tsd-widget:hover { - opacity: 0.9; - } - .tsd-widget:active { - opacity: 1; - background-color: var(--color-accent); - } - #tsd-toolbar-menu-trigger { - display: none; - } - - .tsd-member-summary-name { - display: inline-flex; - align-items: center; - padding: 0.25rem; - text-decoration: none; - } - - .tsd-anchor-icon { - display: inline-flex; - align-items: center; - margin-left: 0.5rem; - color: var(--color-text); - vertical-align: middle; - } - - .tsd-anchor-icon svg { - width: 1em; - height: 1em; - visibility: hidden; - } - - .tsd-member-summary-name:hover > .tsd-anchor-icon svg, - .tsd-anchor-link:hover > .tsd-anchor-icon svg, - .tsd-anchor-icon:focus-visible svg { - visibility: visible; - } - - .deprecated { - text-decoration: line-through !important; - } - - .warning { - padding: 1rem; - color: var(--color-warning-text); - background: var(--color-background-warning); - } - - .tsd-kind-project { - color: var(--color-ts-project); - } - .tsd-kind-module { - color: var(--color-ts-module); - } - .tsd-kind-namespace { - color: var(--color-ts-namespace); - } - .tsd-kind-enum { - color: var(--color-ts-enum); - } - .tsd-kind-enum-member { - color: var(--color-ts-enum-member); - } - .tsd-kind-variable { - color: var(--color-ts-variable); - } - .tsd-kind-function { - color: var(--color-ts-function); - } - .tsd-kind-class { - color: var(--color-ts-class); - } - .tsd-kind-interface { - color: var(--color-ts-interface); - } - .tsd-kind-constructor { - color: var(--color-ts-constructor); - } - .tsd-kind-property { - color: var(--color-ts-property); - } - .tsd-kind-method { - color: var(--color-ts-method); - } - .tsd-kind-reference { - color: var(--color-ts-reference); - } - .tsd-kind-call-signature { - color: var(--color-ts-call-signature); - } - .tsd-kind-index-signature { - color: var(--color-ts-index-signature); - } - .tsd-kind-constructor-signature { - color: var(--color-ts-constructor-signature); - } - .tsd-kind-parameter { - color: var(--color-ts-parameter); - } - .tsd-kind-type-parameter { - color: var(--color-ts-type-parameter); - } - .tsd-kind-accessor { - color: var(--color-ts-accessor); - } - .tsd-kind-get-signature { - color: var(--color-ts-get-signature); - } - .tsd-kind-set-signature { - color: var(--color-ts-set-signature); - } - .tsd-kind-type-alias { - color: var(--color-ts-type-alias); - } - - /* if we have a kind icon, don't color the text by kind */ - .tsd-kind-icon ~ span { - color: var(--color-text); - } - - /* mobile */ - @media (max-width: 769px) { - #tsd-toolbar-menu-trigger { - display: inline-block; - /* temporary fix to vertically align, for compatibility */ - line-height: 2.5; - } - #tsd-toolbar-links { - display: none; - } - - .container-main { - display: flex; - } - .col-content { - float: none; - max-width: 100%; - width: 100%; - } - .col-sidebar { - position: fixed !important; - overflow-y: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - padding: 1.5rem 1.5rem 0 0; - width: 75vw; - visibility: hidden; - background-color: var(--color-background); - transform: translate(100%, 0); - } - .col-sidebar > *:last-child { - padding-bottom: 20px; - } - .overlay { - content: ""; - display: block; - position: fixed; - z-index: 1023; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); - visibility: hidden; - } - - .to-has-menu .overlay { - animation: fade-in 0.4s; - } - - .to-has-menu .col-sidebar { - animation: pop-in-from-right 0.4s; - } - - .from-has-menu .overlay { - animation: fade-out 0.4s; - } - - .from-has-menu .col-sidebar { - animation: pop-out-to-right 0.4s; - } - - .has-menu body { - overflow: hidden; - } - .has-menu .overlay { - visibility: visible; - } - .has-menu .col-sidebar { - visibility: visible; - transform: translate(0, 0); - display: flex; - flex-direction: column; - gap: 1.5rem; - max-height: 100vh; - padding: 1rem 2rem; - } - .has-menu .tsd-navigation { - max-height: 100%; - } - .tsd-navigation .tsd-nav-link { - display: flex; - } - } - - /* one sidebar */ - @media (min-width: 770px) { - .container-main { - display: grid; - grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); - grid-template-areas: "sidebar content"; - --dim-container-main-margin-y: 2rem; - } - - .tsd-breadcrumb { - margin-top: 0; - } - - .col-sidebar { - grid-area: sidebar; - } - .col-content { - grid-area: content; - padding: 0 1rem; - } - } - @media (min-width: 770px) and (max-width: 1399px) { - .col-sidebar { - max-height: calc( - 100vh - var(--dim-header-height) - var(--dim-footer-height) - - 2 * var(--dim-container-main-margin-y) - ); - overflow: auto; - position: sticky; - top: calc( - var(--dim-header-height) + var(--dim-container-main-margin-y) - ); - } - .site-menu { - margin-top: 1rem; - } - } - - /* two sidebars */ - @media (min-width: 1200px) { - .container-main { - grid-template-columns: - minmax(0, 1fr) minmax(0, 2.5fr) minmax( - 0, - 20rem - ); - grid-template-areas: "sidebar content toc"; - } - - .col-sidebar { - display: contents; - } - - .page-menu { - grid-area: toc; - padding-left: 1rem; - } - .site-menu { - grid-area: sidebar; - } - - .site-menu { - margin-top: 0rem; - } - - .page-menu, - .site-menu { - max-height: calc( - 100vh - var(--dim-header-height) - var(--dim-footer-height) - - 2 * var(--dim-container-main-margin-y) - ); - overflow: auto; - position: sticky; - top: calc( - var(--dim-header-height) + var(--dim-container-main-margin-y) - ); - } - } -} diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html deleted file mode 100644 index e558034..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html +++ /dev/null @@ -1,30 +0,0 @@ -DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.1

          Class DiscriminatorRegistry

          Static registry for managing discriminators and their associated type guards. -Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

          -

          0.1.0

          -
          Index

          Methods

          Methods

          • Checks if a discriminator is already registered.

            -

            Parameters

            • discriminator: string

              The discriminator value to check.

              -

            Returns boolean

              -
            • true if the discriminator is registered, false otherwise.
            • -
            -

            0.1.0

            -
          • Validates an input against a specific discriminator.

            -

            Parameters

            • input: unknown

              The input to validate.

              -
            • discriminator: string

              The discriminator value to check.

              -

            Returns boolean

              -
            • true if the input matches the type associated with the discriminator, false otherwise.
            • -
            -

            0.1.0

            -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html deleted file mode 100644 index 86fc589..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html +++ /dev/null @@ -1,18 +0,0 @@ -NumberUtility | @blwatkins/utils - v0.1.0-alpha.1

          Class NumberUtility

          Static properties and methods for validating number types.

          -

          0.1.0

          -
          Index

          Methods

          • Is the given input a finite number?

            -

            Parameters

            • input: unknown

            Returns input is number

            true when the input is a finite number; false otherwise.

            -

            0.1.0

            -
          • Is the given input an integer?

            -

            Parameters

            • input: unknown

            Returns input is number

            true when the input is an integer; false otherwise.

            -

            0.1.0

            -
          • Is the given input a positive integer?

            -

            Parameters

            • input: unknown
            • zeroInclusive: boolean = false

              true if zero should be considered a valid input. -false if zero should be considered an invalid input. -Default value is false.

              -

            Returns input is number

            true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

            -

            0.1.0

            -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html deleted file mode 100644 index 12189dd..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html +++ /dev/null @@ -1,39 +0,0 @@ -RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.1

          Class RandomNumberGeneratorFactory

          A static factory class for creating a SeededRandomNumberGenerator object.

          -

          0.1.0

          -
          Index

          Methods

          Methods

          • Build a SeededRandomNumberGenerator object with the given seed and namespace from an asynchronous hashing algorithm.

            -

            Parameters

            • seed: string

              The primary input to determine the random number sequence.

              -
            • Optionalnamespace: string

              Namespace to create different sequences from the same seed.

              -

            Returns Promise<SeededRandomNumberGenerator>

            This method relies on the Web Crypto API via crypto.subtle. -In Node.js environments, ensure you are using a version where the Web Crypto API is available.

            -
              -
            • When the given seed is not a string.
            • -
            -
              -
            • When the given namespace is not a string.
            • -
            -

            0.1.0

            -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html deleted file mode 100644 index 810f2a9..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html +++ /dev/null @@ -1,23 +0,0 @@ -SeedVersions | @blwatkins/utils - v0.1.0-alpha.1

          Class SeedVersions

          A static class for accessing different seed versions. -Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

          -

          0.1.0

          -
          Index

          Accessors

          Methods

          Accessors

          Methods

          • Is the given index a valid seed version?

            -

            Parameters

            • index: number

              The index to check.

              -

            Returns boolean

            0.1.0

            -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html deleted file mode 100644 index 7d7e971..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html +++ /dev/null @@ -1,18 +0,0 @@ -SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.1

          Class SeededRandomNumberGenerator

          Deterministic seeded pseudorandom number generator. -This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

          -

          0.1.0

          -
          Index

          Constructors

          Methods

          Constructors

          • Parameters

            • state: [number, number, number, number]

              Initial 128-bit state. -Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

              -

            Returns SeededRandomNumberGenerator

            If state is not an array with 4 elements.

            -

            If each element of state is not a 32-bit unsigned integer.

            -

            If state does not have at least one element that is greater than 0.

            -

            0.1.0

            -

          Methods

          • Returns number

              -
            • The next pseudorandom float in the range [0, 1).
            • -
            -

            This method advances the internal 128-bit xoshiro128** state by one step. -Successive calls produce an independent, uniformly distributed sequence.

            -

            0.1.0

            -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html deleted file mode 100644 index 9469753..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html +++ /dev/null @@ -1,27 +0,0 @@ -ColorStringUtility | @blwatkins/utils - v0.1.0-alpha.1

          Class ColorStringUtility

          Static properties and methods for validating formatted color strings.

          -

          0.1.0

          -
          Index

          Accessors

          • get hexColorPattern(): RegExp

            Returns RegExp

            Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. -Case must be consistent in hex color strings: either all lowercase or all uppercase.

            -

            0.1.0

            -
          • get hexColorPatternRGB(): RegExp

            Returns RegExp

            Regular expression pattern for validating hex color strings in the format #RRGGBB. -Case must be consistent in hex color strings: either all lowercase or all uppercase.

            -

            0.1.0

            -
          • get hexColorPatternRGBA(): RegExp

            Returns RegExp

            Regular expression pattern for validating hex color strings in the format #RRGGBBAA. -Case must be consistent in hex color strings: either all lowercase or all uppercase.

            -

            0.1.0

            -

          Methods

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html deleted file mode 100644 index c33a023..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html +++ /dev/null @@ -1,34 +0,0 @@ -StringUtility | @blwatkins/utils - v0.1.0-alpha.1

          Class StringUtility

          Static properties and methods for validating string types.

          -

          0.1.0

          -
          Index

          Accessors

          • get singleLineLowercaseTrimmedPattern(): RegExp

            Returns RegExp

            Regular expression pattern for validating single-line lowercase strings.

            -

            This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

            -

            0.1.0

            -
          • get singleLineTrimmedPattern(): RegExp

            Returns RegExp

            Regular expression pattern for validating single-line mixed-case strings.

            -

            This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

            -

            0.1.0

            -
          • get singleLineUppercaseTrimmedPattern(): RegExp

            Returns RegExp

            Regular expression pattern for validating single-line uppercase strings.

            -

            This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

            -

            0.1.0

            -

          Methods

          • Is the given input a non-empty string? -Non-empty strings must contain at least one non-whitespace character.

            -

            Parameters

            • input: unknown

            Returns input is string

            0.1.0

            -
          • Is the given input a string?

            -

            Parameters

            • input: unknown

            Returns input is string

            0.1.0

            -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html deleted file mode 100644 index 4e2ccdc..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html +++ /dev/null @@ -1 +0,0 @@ -@blwatkins/utils - v0.1.0-alpha.1

          @blwatkins/utils - v0.1.0-alpha.1

          Hierarchy Summary

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html deleted file mode 100644 index 66ef8b3..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html +++ /dev/null @@ -1,59 +0,0 @@ -@blwatkins/utils - v0.1.0-alpha.1

          @blwatkins/utils - v0.1.0-alpha.1

          TypeScript Utilities

          -

          A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development.

          - - - -

          The source code of this project is licensed under the MIT License. -The full text of the license is included with the project source code.

          - - -

          npm License -npm Version -npm @alpha Version -npm Types -npm Node Version -npm Weekly Downloads -npm Total Downloads -npm Last Update -npm Unpacked Size

          - -

          Socket Score

          - -

          Bundlephobia Tree Shaking -Bundlephobia Dependency Count -Bundlephobia Minified -Bundlephobia Minified + gzip

          - -

          Package Phobia Install Size -Package Phobia Publish Size

          - -

          GitHub License -GitHub Dependabot -GitHub Latest Release -GitHub Releases -GitHub Last Commit -GitHub Commits -GitHub Commit Activity -GitHub Code Size in Bytes -GitHub Repo Size -GitHub Repo File or Directory Count -GitHub Language Count

          - -

          CodeQL -npm Lint, Build, and Test -Deploy GitHub Pages with Jekyll

          - - - -

          A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation.

          -

          A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. -Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer.

          -
          -

          Copyright © 2024-2026 Brittni Watkins.

          -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html deleted file mode 100644 index db6a6d4..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ /dev/null @@ -1,14 +0,0 @@ -DiscriminatorRegistration | @blwatkins/utils - v0.1.0-alpha.1

          Interface DiscriminatorRegistration

          A registration for a discriminator to the DiscriminatorRegistry.

          -

          0.1.0

          -
          interface DiscriminatorRegistration {
              discriminator: string;
              validator: (input: unknown) => boolean;
          }
          Index

          Properties

          discriminator: string

          The discriminator value that identifies the type of a Discriminated object. -This value must be unique across all registered discriminators.

          -

          0.1.0

          -
          validator: (input: unknown) => boolean

          A method that validates whether an input matches the type associated with the discriminator.

          -

          Type Declaration

            • (input: unknown): boolean
            • Parameters

              • input: unknown

                The input to validate.

                -

              Returns boolean

                -
              • true if the input matches the type associated with the discriminator, false otherwise.
              • -
              -

          0.1.0

          -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html deleted file mode 100644 index 8b1ad75..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html +++ /dev/null @@ -1,8 +0,0 @@ -SeedVersion | @blwatkins/utils - v0.1.0-alpha.1

          Interface SeedVersion

          A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. -A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

          -

          0.1.0

          -
          interface SeedVersion {
              offsets: readonly [number, number, number, number];
          }
          Index

          Properties

          Properties

          offsets: readonly [number, number, number, number]

          A collection of offset values for the FNV-1a hashing algorithm. -Each offset value should be a 32-bit unsigned integer.

          -

          0.1.0

          -

          Generated using TypeDoc


          Copyright © 2024-2026 Brittni Watkins.

          diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html deleted file mode 100644 index 33fa2cd..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html +++ /dev/null @@ -1 +0,0 @@ -@blwatkins/utils - v0.1.0-alpha.1

            @blwatkins/utils - v0.1.0-alpha.1

            Modules

            discriminator
            number
            random
            string

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html deleted file mode 100644 index 582d4da..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html +++ /dev/null @@ -1 +0,0 @@ -discriminator | @blwatkins/utils - v0.1.0-alpha.1

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html deleted file mode 100644 index c8bb1d4..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html +++ /dev/null @@ -1 +0,0 @@ -number | @blwatkins/utils - v0.1.0-alpha.1

            Module number

            Classes

            NumberUtility

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html deleted file mode 100644 index a132feb..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html +++ /dev/null @@ -1 +0,0 @@ -random | @blwatkins/utils - v0.1.0-alpha.1

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html deleted file mode 100644 index a92cba6..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html +++ /dev/null @@ -1 +0,0 @@ -string | @blwatkins/utils - v0.1.0-alpha.1

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html deleted file mode 100644 index a576633..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html +++ /dev/null @@ -1,3 +0,0 @@ -Discriminated | @blwatkins/utils - v0.1.0-alpha.1

            Type Alias Discriminated

            Discriminated: Static<typeof discriminatedSchema>

            Discriminated objects can be type checked using the discriminator registry.

            -

            0.1.0

            -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html deleted file mode 100644 index 2e23777..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html +++ /dev/null @@ -1,3 +0,0 @@ -TypeGuard | @blwatkins/utils - v0.1.0-alpha.1

            Type Alias TypeGuard<T>

            TypeGuard: (input: unknown) => input is T

            A type guard function that checks if an input is of a specific Discriminated type.

            -

            Type Parameters

            Type Declaration

              • (input: unknown): input is T
              • Parameters

                • input: unknown

                Returns input is T

            0.1.0

            -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html deleted file mode 100644 index 3d8811e..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html +++ /dev/null @@ -1,3 +0,0 @@ -discriminatedSchema | @blwatkins/utils - v0.1.0-alpha.1

            Variable discriminatedSchemaConst

            discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

            TypeBox schema for validating that an object implements the Discriminated type.

            -

            0.1.0

            -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            From fae1d75859d05c7a50aad742d7f7873c83c52a53 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 5 Jul 2026 12:38:19 -0500 Subject: [PATCH 074/122] Deleted generated docs --- .../discriminator.DiscriminatorRegistry.html | 22 ----------- .../doc/classes/number.NumberUtility.html | 17 -------- .../random.RandomNumberGeneratorFactory.html | 39 ------------------- .../doc/classes/random.SeedVersions.html | 23 ----------- .../random.SeededRandomNumberGenerator.html | 18 --------- .../doc/classes/string.StringUtility.html | 34 ---------------- ...scriminator.DiscriminatorRegistration.html | 14 ------- .../doc/interfaces/random.SeedVersion.html | 8 ---- .../types/discriminator.Discriminated.html | 3 -- .../doc/types/discriminator.TypeGuard.html | 3 -- .../discriminator.discriminatedSchema.html | 3 -- 11 files changed, 184 deletions(-) delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html delete mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html deleted file mode 100644 index bc5c292..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html +++ /dev/null @@ -1,22 +0,0 @@ -DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.0

            Class DiscriminatorRegistry

            Static registry for managing discriminators and their associated type guards. -Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

            -

            0.1.0

            -
            Index

            Methods

            Methods

            • Checks if a discriminator is already registered.

              -

              Parameters

              • discriminator: string

                The discriminator value to check.

                -

              Returns boolean

                -
              • true if the discriminator is registered, false otherwise.
              • -
              -

              0.1.0

              -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html deleted file mode 100644 index 65c6dd5..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html +++ /dev/null @@ -1,17 +0,0 @@ -NumberUtility | @blwatkins/utils - v0.1.0-alpha.0

            Class NumberUtility

            Static properties and methods for validating number types.

            -

            0.1.0

            -
            Index

            Methods

            • Is the given input a finite number?

              -

              Parameters

              • input: unknown

              Returns input is number

              true when the input is a finite number; false otherwise.

              -

              0.1.0

              -
            • Is the given input an integer?

              -

              Parameters

              • input: unknown

              Returns input is number

              true when the input is an integer; false otherwise.

              -

              0.1.0

              -
            • Is the given input a positive integer?

              -

              Parameters

              • input: unknown
              • OptionalzeroInclusive: boolean

                true if zero should be considered a valid input. -false if zero should be considered an invalid input.

                -

              Returns input is number

              true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

              -

              0.1.0

              -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html deleted file mode 100644 index 09ef6a3..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html +++ /dev/null @@ -1,39 +0,0 @@ -RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.0

            Class RandomNumberGeneratorFactory

            A static factory class for creating a SeededRandomNumberGenerator object.

            -

            0.1.0

            -
            Index

            Methods

            Methods

            • Build a SeededRandomNumberGenerator object with the given seed and namespace from an asynchronous hashing algorithm.

              -

              Parameters

              • seed: string

                The primary input to determine the random number sequence.

                -
              • Optionalnamespace: string

                Namespace to create different sequences from the same seed.

                -

              Returns Promise<SeededRandomNumberGenerator>

              This method relies on the Web Crypto API via crypto.subtle. -In Node.js environments, ensure you are using a version where the Web Crypto API is available.

              -
                -
              • When the given seed is not a string.
              • -
              -
                -
              • When the given namespace is not a string.
              • -
              -

              0.1.0

              -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html deleted file mode 100644 index dce9e0e..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html +++ /dev/null @@ -1,23 +0,0 @@ -SeedVersions | @blwatkins/utils - v0.1.0-alpha.0

            Class SeedVersions

            A static class for accessing different seed versions. -Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

            -

            0.1.0

            -
            Index

            Accessors

            Methods

            Accessors

            Methods

            • Is the given index a valid seed version?

              -

              Parameters

              • index: number

                The index to check.

                -

              Returns boolean

              0.1.0

              -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html deleted file mode 100644 index fcb21b7..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html +++ /dev/null @@ -1,18 +0,0 @@ -SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.0

            Class SeededRandomNumberGenerator

            Deterministic seeded pseudorandom number generator. -This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

            -

            0.1.0

            -
            Index

            Constructors

            Methods

            Constructors

            • Parameters

              • state: [number, number, number, number]

                Initial 128-bit state. -Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

                -

              Returns SeededRandomNumberGenerator

              If state is not an array with 4 elements.

              -

              If each element of state is not a 32-bit unsigned integer.

              -

              If state does not have at least one element that is greater than 0.

              -

              0.1.0

              -

            Methods

            • Returns number

                -
              • The next pseudorandom float in the range [0, 1).
              • -
              -

              This method advances the internal 128-bit xoshiro128** state by one step. -Successive calls produce an independent, uniformly distributed sequence.

              -

              0.1.0

              -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html deleted file mode 100644 index f7d090f..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html +++ /dev/null @@ -1,34 +0,0 @@ -StringUtility | @blwatkins/utils - v0.1.0-alpha.0

            Class StringUtility

            Static properties and methods for validating string types.

            -

            0.1.0

            -
            Index

            Accessors

            • get singleLineLowercaseTrimmedPattern(): RegExp

              Returns RegExp

              Regular expression pattern for validating single-line lowercase strings.

              -

              This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

              -

              0.1.0

              -
            • get singleLineTrimmedPattern(): RegExp

              Returns RegExp

              Regular expression pattern for validating single-line mixed-case strings.

              -

              This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

              -

              0.1.0

              -
            • get singleLineUppercaseTrimmedPattern(): RegExp

              Returns RegExp

              Regular expression pattern for validating single-line uppercase strings.

              -

              This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

              -

              0.1.0

              -

            Methods

            • Is the given input a non-empty string? -Non-empty strings must contain at least one non-whitespace character.

              -

              Parameters

              • input: unknown

              Returns boolean

              0.1.0

              -
            • Is the given input a string?

              -

              Parameters

              • input: unknown

              Returns input is string

              0.1.0

              -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html deleted file mode 100644 index bc8bab8..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html +++ /dev/null @@ -1,14 +0,0 @@ -DiscriminatorRegistration | @blwatkins/utils - v0.1.0-alpha.0

            Interface DiscriminatorRegistration

            A registration for a discriminator to the DiscriminatorRegistry.

            -

            0.1.0

            -
            interface DiscriminatorRegistration {
                discriminator: string;
                validator: (input: unknown) => boolean;
            }
            Index

            Properties

            discriminator: string

            The discriminator value that identifies the type of a Discriminated object. -This value must be unique across all registered discriminators.

            -

            0.1.0

            -
            validator: (input: unknown) => boolean

            A method that validates whether an input matches the type associated with the discriminator.

            -

            Type Declaration

              • (input: unknown): boolean
              • Parameters

                • input: unknown

                  The input to validate.

                  -

                Returns boolean

                  -
                • true if the input matches the type associated with the discriminator, false otherwise.
                • -
                -

            0.1.0

            -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html deleted file mode 100644 index 6ac3bdd..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html +++ /dev/null @@ -1,8 +0,0 @@ -SeedVersion | @blwatkins/utils - v0.1.0-alpha.0

            Interface SeedVersion

            A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. -A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

            -

            0.1.0

            -
            interface SeedVersion {
                offsets: readonly [number, number, number, number];
            }
            Index

            Properties

            Properties

            offsets: readonly [number, number, number, number]

            A collection of offset values for the FNV-1a hashing algorithm. -Each offset value should be a 32-bit unsigned integer.

            -

            0.1.0

            -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html deleted file mode 100644 index f74dfea..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html +++ /dev/null @@ -1,3 +0,0 @@ -Discriminated | @blwatkins/utils - v0.1.0-alpha.0

            Type Alias Discriminated

            Discriminated: Static<typeof discriminatedSchema>

            Discriminated objects can be type checked using the discriminator registry.

            -

            0.1.0

            -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html deleted file mode 100644 index 69d3ae5..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html +++ /dev/null @@ -1,3 +0,0 @@ -TypeGuard | @blwatkins/utils - v0.1.0-alpha.0

            Type Alias TypeGuard<T>

            TypeGuard: (input: unknown) => input is T

            A type guard function that checks if an input is of a specific Discriminated type.

            -

            Type Parameters

            Type Declaration

              • (input: unknown): input is T
              • Parameters

                • input: unknown

                Returns input is T

            0.1.0

            -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html deleted file mode 100644 index 6e7c94b..0000000 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html +++ /dev/null @@ -1,3 +0,0 @@ -discriminatedSchema | @blwatkins/utils - v0.1.0-alpha.0

            Variable discriminatedSchemaConst

            discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

            TypeBox schema for validating that an object implements the Discriminated type.

            -

            0.1.0

            -

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            From 2b82207984c9da52176938d576eedcff9ac0e8d4 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 5 Jul 2026 12:40:46 -0500 Subject: [PATCH 075/122] Copy generated v0.1.0-alpha.0 docs from docs-update-branch --- .../v0.1.0-alpha.0/doc/.nojekyll | 1 + .../v0.1.0-alpha.0/doc/assets/hierarchy.js | 1 + .../v0.1.0-alpha.0/doc/assets/highlight.css | 22 + .../v0.1.0-alpha.0/doc/assets/icons.js | 18 + .../v0.1.0-alpha.0/doc/assets/icons.svg | 1 + .../v0.1.0-alpha.0/doc/assets/main.js | 60 + .../v0.1.0-alpha.0/doc/assets/navigation.js | 1 + .../v0.1.0-alpha.0/doc/assets/search.js | 1 + .../v0.1.0-alpha.0/doc/assets/style.css | 1633 +++++++++++++++++ .../discriminator.DiscriminatorRegistry.html | 22 + .../doc/classes/number.NumberUtility.html | 17 + .../random.RandomNumberGeneratorFactory.html | 39 + .../doc/classes/random.SeedVersions.html | 23 + .../random.SeededRandomNumberGenerator.html | 18 + .../doc/classes/string.StringUtility.html | 34 + .../v0.1.0-alpha.0/doc/hierarchy.html | 1 + .../v0.1.0-alpha.0/doc/index.html | 59 + ...scriminator.DiscriminatorRegistration.html | 14 + .../doc/interfaces/random.SeedVersion.html | 8 + .../v0.1.0-alpha.0/doc/modules.html | 1 + .../doc/modules/discriminator.html | 1 + .../v0.1.0-alpha.0/doc/modules/number.html | 1 + .../v0.1.0-alpha.0/doc/modules/random.html | 1 + .../v0.1.0-alpha.0/doc/modules/string.html | 1 + .../types/discriminator.Discriminated.html | 3 + .../doc/types/discriminator.TypeGuard.html | 3 + .../discriminator.discriminatedSchema.html | 3 + 27 files changed, 1987 insertions(+) create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/.nojekyll create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/hierarchy.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/highlight.css create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.svg create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/main.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/navigation.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/search.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/style.css create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/hierarchy.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/discriminator.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/number.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/random.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/string.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/.nojekyll b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/.nojekyll new file mode 100644 index 0000000..e2ac661 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/hierarchy.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/hierarchy.js new file mode 100644 index 0000000..fb85f0a --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/hierarchy.js @@ -0,0 +1 @@ +window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/highlight.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/highlight.css new file mode 100644 index 0000000..5674cf3 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/highlight.css @@ -0,0 +1,22 @@ +:root { + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --code-background: var(--dark-code-background); +} + +pre, code { background: var(--code-background); } diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.js new file mode 100644 index 0000000..4fbadc5 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.svg b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.svg new file mode 100644 index 0000000..be7798f --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/icons.svg @@ -0,0 +1 @@ +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/main.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/main.js new file mode 100644 index 0000000..8182cee --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","search_index_not_available":"The search index is not available","search_no_results_found_for_0":"No results found for {0}","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; +"use strict";(()=>{var Ke=Object.create;var he=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var et=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var tt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ze(e))!Ye.call(t,i)&&i!==n&&he(t,i,{get:()=>e[i],enumerable:!(r=Ge(e,i))||r.enumerable});return t};var nt=(t,e,n)=>(n=t!=null?Ke(Xe(t)):{},tt(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var ye=et((me,ge)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=(function(e){return function(n){e.console&&console.warn&&console.warn(n)}})(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,l],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?d+=2:a==c&&(n+=r[l+1]*i[d+1],l+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),f=s.str.charAt(1),p;f in s.node.edges?p=s.node.edges[f]:(p=new t.TokenSet,s.node.edges[f]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}if(s.type===t.QueryLexer.TERM)return t.QueryParser.parseTerm;var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},(function(e,n){typeof define=="function"&&define.amd?define(n):typeof me=="object"?ge.exports=n():e.lunr=n()})(this,function(){return t})})()});var M,G={getItem(){return null},setItem(){}},K;try{K=localStorage,M=K}catch{K=G,M=G}var S={getItem:t=>M.getItem(t),setItem:(t,e)=>M.setItem(t,e),disableWritingLocalStorage(){M=G},disable(){localStorage.clear(),M=G},enable(){M=K}};window.TypeDoc||={disableWritingLocalStorage(){S.disableWritingLocalStorage()},disableLocalStorage:()=>{S.disable()},enableLocalStorage:()=>{S.enable()}};window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",search_index_not_available:"The search index is not available",search_no_results_found_for_0:"No results found for {0}",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var pe=[];function X(t,e){pe.push({selector:e,constructor:t})}var Z=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){pe.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!rt(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function rt(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var fe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var Ie=nt(ye(),1);async function R(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}var Y="closing",ae="tsd-overlay";function it(){let t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.body.style.overflow="hidden",document.body.style.paddingRight=`${t}px`}function st(){document.body.style.removeProperty("overflow"),document.body.style.removeProperty("padding-right")}function Ee(t,e){t.addEventListener("animationend",()=>{t.classList.contains(Y)&&(t.classList.remove(Y),document.getElementById(ae)?.remove(),t.close(),st())}),t.addEventListener("cancel",n=>{n.preventDefault(),ve(t)}),e?.closeOnClick&&document.addEventListener("click",n=>{t.open&&!t.contains(n.target)&&ve(t)},!0)}function xe(t){if(t.open)return;let e=document.createElement("div");e.id=ae,document.body.appendChild(e),t.showModal(),it()}function ve(t){if(!t.open)return;document.getElementById(ae)?.classList.add(Y),t.classList.add(Y)}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var le={};function Le(t){for(let e of t.split(/\s+/))if(le.hasOwnProperty(e)&&!le[e])return!0;return!1}var ee=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=S.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){S.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),le[`tsd-is-${this.el.name}`]=this.value,this.app.filterChanged(),this.app.updateIndexVisibility()}};var we=0;async function Se(t,e){if(!window.searchData)return;let n=await R(window.searchData);t.data=n,t.index=Ie.Index.load(n.index),e.innerHTML=""}function _e(){let t=document.getElementById("tsd-search-trigger"),e=document.getElementById("tsd-search"),n=document.getElementById("tsd-search-input"),r=document.getElementById("tsd-search-results"),i=document.getElementById("tsd-search-script"),s=document.getElementById("tsd-search-status");if(!(t&&e&&n&&r&&i&&s))throw new Error("Search controls missing");let o={base:document.documentElement.dataset.base};o.base.endsWith("/")||(o.base+="/"),i.addEventListener("error",()=>{let a=window.translations.search_index_not_available;Pe(s,a)}),i.addEventListener("load",()=>{Se(o,s)}),Se(o,s),ot({trigger:t,searchEl:e,results:r,field:n,status:s},o)}function ot(t,e){let{field:n,results:r,searchEl:i,status:s,trigger:o}=t;Ee(i,{closeOnClick:!0});function a(){xe(i),n.setSelectionRange(0,n.value.length)}o.addEventListener("click",a),n.addEventListener("input",fe(()=>{at(r,n,s,e)},200)),n.addEventListener("keydown",l=>{if(r.childElementCount===0||l.ctrlKey||l.metaKey||l.altKey)return;let d=n.getAttribute("aria-activedescendant"),f=d?document.getElementById(d):null;if(f){let p=!1,v=!1;switch(l.key){case"Home":case"End":case"ArrowLeft":case"ArrowRight":v=!0;break;case"ArrowDown":case"ArrowUp":p=l.shiftKey;break}(p||v)&&ke(n)}if(!l.shiftKey)switch(l.key){case"Enter":f?.querySelector("a")?.click();break;case"ArrowUp":Te(r,n,f,-1),l.preventDefault();break;case"ArrowDown":Te(r,n,f,1),l.preventDefault();break}});function c(){ke(n)}n.addEventListener("change",c),n.addEventListener("blur",c),n.addEventListener("click",c),document.body.addEventListener("keydown",l=>{if(l.altKey||l.metaKey||l.shiftKey)return;let d=l.ctrlKey&&l.key==="k",f=!l.ctrlKey&&!ut()&&l.key==="/";(d||f)&&(l.preventDefault(),a())})}function at(t,e,n,r){if(!r.index||!r.data)return;t.innerHTML="",n.innerHTML="",we+=1;let i=e.value.trim(),s;if(i){let a=i.split(" ").map(c=>c.length?`*${c}*`:"").join(" ");s=r.index.search(a).filter(({ref:c})=>{let l=r.data.rows[Number(c)].classes;return!l||!Le(l)})}else s=[];if(s.length===0&&i){let a=window.translations.search_no_results_found_for_0.replace("{0}",` "${te(i)}" `);Pe(n,a);return}for(let a=0;ac.score-a.score);let o=Math.min(10,s.length);for(let a=0;a`,f=Ce(c.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(f+=` (score: ${s[a].score.toFixed(2)})`),c.parent&&(f=` + ${Ce(c.parent,i)}.${f}`);let p=document.createElement("li");p.id=`tsd-search:${we}-${a}`,p.role="option",p.ariaSelected="false",p.classList.value=c.classes??"";let v=document.createElement("a");v.tabIndex=-1,v.href=r.base+c.url,v.innerHTML=d+`${f}`,p.append(v),t.appendChild(p)}}function Te(t,e,n,r){let i;if(r===1?i=n?.nextElementSibling||t.firstElementChild:i=n?.previousElementSibling||t.lastElementChild,i!==n){if(!i||i.role!=="option"){console.error("Option missing");return}i.ariaSelected="true",i.scrollIntoView({behavior:"smooth",block:"nearest"}),e.setAttribute("aria-activedescendant",i.id),n?.setAttribute("aria-selected","false")}}function ke(t){let e=t.getAttribute("aria-activedescendant");(e?document.getElementById(e):null)?.setAttribute("aria-selected","false"),t.setAttribute("aria-activedescendant","")}function Ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var lt={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>lt[e])}function Pe(t,e){t.innerHTML=e?`
            ${e}
            `:""}var ct=["button","checkbox","file","hidden","image","radio","range","reset","submit"];function ut(){let t=document.activeElement;return t?t.isContentEditable||t.tagName==="TEXTAREA"||t.tagName==="SEARCH"?!0:t.tagName==="INPUT"&&!ct.includes(t.type):!1}var D="mousedown",Me="mousemove",$="mouseup",ne={x:0,y:0},Qe=!1,ce=!1,dt=!1,F=!1,Oe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Oe?"is-mobile":"not-mobile");Oe&&"ontouchstart"in document.documentElement&&(dt=!0,D="touchstart",Me="touchmove",$="touchend");document.addEventListener(D,t=>{ce=!0,F=!1;let e=D=="touchstart"?t.targetTouches[0]:t;ne.y=e.pageY||0,ne.x=e.pageX||0});document.addEventListener(Me,t=>{if(ce&&!F){let e=D=="touchstart"?t.targetTouches[0]:t,n=ne.x-(e.pageX||0),r=ne.y-(e.pageY||0);F=Math.sqrt(n*n+r*r)>10}});document.addEventListener($,()=>{ce=!1});document.addEventListener("click",t=>{Qe&&(t.preventDefault(),t.stopImmediatePropagation(),Qe=!1)});var re=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener($,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(D,n=>this.onDocumentPointerDown(n)),document.addEventListener($,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){F||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!F&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ue=new Map,de=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;S.setItem(this.key,e.toString())}},ie=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(ue.has(i))s=ue.get(i);else{let o=S.getItem(i),a=o?o==="true":this.el.open;s=new de(i,a),ue.set(i,s)}s.add(this.el)}};function He(t){let e=S.getItem("tsd-theme")||"os";t.value=e,Ae(e),t.addEventListener("change",()=>{S.setItem("tsd-theme",t.value),Ae(t.value)})}function Ae(t){document.documentElement.dataset.theme=t}var se;function Ne(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Re),Re())}async function Re(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await R(window.navigationData);se=document.documentElement.dataset.base,se.endsWith("/")||(se+="/"),t.innerHTML="";for(let n of e)Ve(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ve(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',De(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let c=a.appendChild(document.createElement("ul"));c.className="tsd-nested-navigation";for(let l of t.children)Ve(l,c,i)}else De(t,r,t.class)}function De(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=se+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&(r.classList.add("current"),r.ariaCurrent="page"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(Fe(t.text,document.createElement("span")))}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(Fe(t.text,document.createElement("span")))}}function Fe(t,e){let n=t.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);for(let r=0;r{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=gt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function pt(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Be),Be())}async function Be(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await R(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),ft(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function ft(t,e,n){let r=e.roots.filter(i=>mt(e,i,n));for(let i of r)t.appendChild(je(e,i,n))}function je(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let c=t.reflections[a],l=s.appendChild(document.createElement("a"));l.textContent=c.name,l.href=oe+c.url,l.className=c.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=oe+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let c=je(t,a,n,r);c&&o.appendChild(c)}}return r.delete(e),s}function mt(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function gt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='',t}X(re,"a[data-toggle]");X(ie,".tsd-accordion");X(ee,".tsd-filter-item input[type=checkbox]");var qe=document.getElementById("tsd-theme");qe&&He(qe);var yt=new Z;Object.defineProperty(window,"app",{value:yt});_e();Ne();$e();"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0);})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/navigation.js new file mode 100644 index 0000000..475b836 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "eJytlEtPwzAQhP8K2nMEtKg8ckMgKg5waKGXqgc3XpoViVPZW0SE8t9RkzZPJw0iV2dnvrE98fIHGL8ZXHiJ5C5AAw54PgVSowJ3mX+VZDxNISnBkQYHtoJ9cCHMRBeVz+c+hwE48ElKgju2Gz4EwphW3GPZb4YbMqzjAutl4hrWKqqGGY1vk1Xi5Jxnxag/hPenIIIpUkUYyj165Em1tQOaXFcyvcVbPLsPSPQ6HpRFEo63XSFQ1sCXdzejybiGnu6EPuGZj9n9yptZCE1i3atXKOeej6Eo2F9HcY1vEVWTXO1DlGOoXbhGS2+z9QEK+5oavTMFxJaiHjiVKVszy5m1UDIKm5mz9QEyz1KjLNMUFer94T4JjyPbv3bAdomaOyp2M0eUKK3qVlaH5hRqgdpQpEyn93Hon29Eycr6KjSJtgegjDSsSW2aV5+tD3D189Sota4HTmXKXtdVsvoFogoyxQ==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/search.js new file mode 100644 index 0000000..1c782d3 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/search.js @@ -0,0 +1 @@ +window.searchData = "eJy1mt1u2zgQhd+FvhVSz9D/l4vdFgWKoGja3hhGoViMQ6wtGZKcNmvk3ReUZGnGpBRace4Cm+fMIfmJZEQfRZr8zsRieRT/6jgSCwxEHO6UWIhIZ+tU73Qc5kkqAnFIt2Ihdkl02KrsA/v25jHfbUUg1tswy1QmFkK8BCdHwFnt+TdVfVMbneXpc+1dyc+8nRpHxUDsw1TFuRW9iYLDUZPlMcx6Vx6UYo/qbpO2TGnxvUr7ByMOV0k3nnROXpjrJK7T6jhX6UO49gpcSPvNIwxx9AqnPaMMzt36DmI5MC2Rn8Ktjq4SlzpdKyoO51MYo2veVVQnzp/3XWFV1PcR5cW/P+/Vp0OYdheuW/UrKp2rnoru1o9qF9aVn8JUh/f26ufQ9Ox8HSM+7O6VveqWH3svt7dF8x+53urcXmYrM9aoO3eVqmXx0tlHHetc3fLsr5Yb6OyhENad7qrODdqzfI5ztbkwhq4110jwNcl0rp9UnyT7SvvWRM3OEsZRsrOAKj/2Bupb0bys9knFKjUAfwzXeeLYxivvLk03blXmlgEOs+d4/ddBb6PelQeFx33l0RWi06st4f3bwl0zF53EO6UiFTmFbWE7JBdO4RgaJtdJnOXpYf2GwgPu0TlUXf1umcFY/cl7R6vEV8h0Pns/VZrpJLbPr8T11ObSR2yCMGpOKpn+T3lXGVStX+1xnb9l2Dcqr5r4196o/KnWvDmBzn6ak9XnOFJ//DPorDiP6UrVKwU5cJMmroOibXThXLMzafLwkKk8u6DQoJH49tS5NWV5quONtTWVH3tvTXdF87azTmXGGnWPVpWq48mIN1v1RcfqS/JbpeswU99Tvdup6GuY5yq10W3NMCi9tjpW25NXXnrta6+ulNzTJ/MVor5zwh/7/dVG9XDyulJmvlLcJvE/u33+fMc5fj2gzuIkVkZaPwLXyHPXSmaPhO1ovlPma0R934TnZL4p6jma183cI1mf+qtAlHve4ihOm/BC4I28mYtAPGi1jcw7xjJYINbJbmfsAhEl60Px56pq9lOZk5xpXLb+MBTBchjg9GY0latVsDyJiy+KD04ezSeFEESwhEDizXgGTAiWEJgQRbBElxAtITKhFMFSuoTSEkomHIlgOXIJR5ZwxITjtsEZW8IxE05EsBy7Kk4s4YQJpyJYTlzCqSWcMuFMBMupSzizhDMmnItgOXMJ55ZwzgEwPMydBNjswBk8BT1Dp9jBDwcIDBbgZs9mCDhEYNAAJ39gcwQcJDB4gJNBsFkCDhMYRMDJIdg8AQcKDCbgRApspoBDBQYVcGIFNlfAwQKDCzjRApst4HCBQQaceIHNF3DA0DADTsLQJgw5YWiYQSdhaBOGZ0tUsUY5CUPHKsUJQ8MMulc4mzDkhKFhBp2EoU0YcsLQMINOwtAmDDlhaJhBJ2FoE4acMDTMoJMwtAlDThgaZtBJGNqEIScMDTPoJAxtwpATJg0z6CRM2oRJTpg0zEgnYdImTHLCpGFGOgmTNmHybCMsdkInYdKxF3LCpGFGuvdRmzDJCZOGGekkTNqESU6YNMxIJ2HSJkxywqRhRjoJkzZh1UfFuelJpbmq3jSYYw99J3kUv6qDFdSvBY4CpmJxfHlpDlKL4ws5S5nvTDXbY0o8Zl4e7PUacZo3Tjj0cor4LVLjRTrm1y/mlFVXNI3frPGbX+rHezlsnIaldny5YcouShvzUWM+6u36zCaFzK6XI31l1tigJHPrF624DScOxMBLf34BRPpEO+VrVl+aEB+SCaSnz/l/542dJHbS18660yHxyJiD35j7/GtOApMC8vIC7b4EY+n3dPj890sKjEmBiW8B24asMtJvmeEvcwndpMvo1+XyJoBYkJUF/Z5V+9EgSzD4LcGlx+H0ipTgR/KAX5763S/pFRlj9Bvj060kiUJGF/xGtzQpO7c53Z48nC4liTVBCfxQan5NQ1AiJHmZZMUdjzMli0c2LvDbuYyzawUnHUW/jhInPqdk/UW/9dfjZTbxJxRLP4rb30CTOSJASz+gPd4WE38yLNJ3WMzdGOk53SU9QbKWNSQnOvQ70ZUmjkUACX/ox5/5Kc6m/HFO40Mi+SUiv2FqXAjCHgSvArHX+2L2xGK5enn5H39Tt60="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/style.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/style.css new file mode 100644 index 0000000..44328e9 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/assets/style.css @@ -0,0 +1,1633 @@ +@layer typedoc { + :root { + --dim-toolbar-contents-height: 2.5rem; + --dim-toolbar-border-bottom-width: 1px; + --dim-header-height: calc( + var(--dim-toolbar-border-bottom-width) + + var(--dim-toolbar-contents-height) + ); + + /* 0rem For mobile; unit is required for calculation in `calc` */ + --dim-container-main-margin-y: 0rem; + + --dim-footer-height: 3.5rem; + + --modal-animation-duration: 0.2s; + } + + :root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --light-color-background-active: #d6d8da; + --light-color-background-warning: #e6e600; + --light-color-warning-text: #222; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-background-active); + --light-color-text: #222; + --light-color-contrast-text: #000; + --light-color-text-aside: #5e5e5e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: #9f5f30; + --light-color-ts-method: #be3989; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var( + --light-color-ts-constructor + ); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #c73c3c; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-color-alert-note: #0969d9; + --light-color-alert-tip: #1a7f37; + --light-color-alert-important: #8250df; + --light-color-alert-warning: #9a6700; + --light-color-alert-caution: #cf222e; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + } + + :root { + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --dark-color-background-active: #5d5d6a; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: var(--dark-color-background-active); + --dark-color-text: #f5f5f5; + --dark-color-contrast-text: #ffffff; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff6060; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-color-alert-note: #0969d9; + --dark-color-alert-tip: #1a7f37; + --dark-color-alert-important: #8250df; + --dark-color-alert-warning: #9a6700; + --dark-color-alert-caution: #cf222e; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; + } + + @media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var( + --light-color-background-secondary + ); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-alert-note: var(--light-color-alert-note); + --color-alert-tip: var(--light-color-alert-tip); + --color-alert-important: var(--light-color-alert-important); + --color-alert-warning: var(--light-color-alert-warning); + --color-alert-caution: var(--light-color-alert-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + } + + @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var( + --dark-color-background-secondary + ); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-alert-note: var(--dark-color-alert-note); + --color-alert-tip: var(--dark-color-alert-tip); + --color-alert-important: var(--dark-color-alert-important); + --color-alert-warning: var(--dark-color-alert-warning); + --color-alert-caution: var(--dark-color-alert-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + } + + :root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-note: var(--light-color-note); + --color-tip: var(--light-color-tip); + --color-important: var(--light-color-important); + --color-warning: var(--light-color-warning); + --color-caution: var(--light-color-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + + :root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-note: var(--dark-color-note); + --color-tip: var(--dark-color-tip); + --color-important: var(--dark-color-important); + --color-warning: var(--dark-color-warning); + --color-caution: var(--dark-color-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + + html { + color-scheme: var(--color-scheme); + @media (prefers-reduced-motion: no-preference) { + scroll-behavior: smooth; + } + } + + *:focus-visible, + .tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); + } + + .always-visible, + .always-visible .tsd-signatures { + display: inherit !important; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.2; + } + + h1 { + font-size: 1.875rem; + margin: 0.67rem 0; + } + + h2 { + font-size: 1.5rem; + margin: 0.83rem 0; + } + + h3 { + font-size: 1.25rem; + margin: 1rem 0; + } + + h4 { + font-size: 1.05rem; + margin: 1.33rem 0; + } + + h5 { + font-size: 1rem; + margin: 1.5rem 0; + } + + h6 { + font-size: 0.875rem; + margin: 2.33rem 0; + } + + dl, + menu, + ol, + ul { + margin: 1em 0; + } + + dd { + margin: 0 0 0 34px; + } + + .container { + max-width: 1700px; + padding: 0 2rem; + } + + /* Footer */ + footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: var(--dim-footer-height); + } + footer > p { + margin: 0 1em; + } + + .container-main { + margin: var(--dim-container-main-margin-y) auto; + /* toolbar, footer, margin */ + min-height: calc( + 100svh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + } + + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } + } + @keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } + } + @keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } + } + body { + background: var(--color-background); + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); + margin: 0; + } + + a { + color: var(--color-link); + text-decoration: none; + } + a:hover { + text-decoration: underline; + } + a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; + } + a.tsd-anchor-link { + color: var(--color-text); + } + :target { + scroll-margin-block: calc(var(--dim-header-height) + 0.5rem); + } + + code, + pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; + } + + pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); + margin-bottom: 8px; + } + pre code { + padding: 0; + font-size: 100%; + } + pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; + } + pre:hover > button, + pre > button.visible, + pre > button:focus-visible { + opacity: 1; + } + + blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; + } + + img { + max-width: 100%; + } + + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); + } + + *::-webkit-scrollbar { + width: 0.75rem; + } + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); + } + + dialog { + border: none; + outline: none; + padding: 0; + background-color: var(--color-background); + } + dialog::backdrop { + display: none; + } + #tsd-overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + z-index: 9999; + top: 0; + left: 0; + right: 0; + bottom: 0; + animation: fade-in var(--modal-animation-duration) forwards; + } + #tsd-overlay.closing { + animation-name: fade-out; + } + + .tsd-typography { + line-height: 1.333em; + } + .tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; + } + .tsd-typography .tsd-index-panel h3, + .tsd-index-panel .tsd-typography h3, + .tsd-typography h4, + .tsd-typography h5, + .tsd-typography h6 { + font-size: 1em; + } + .tsd-typography h5, + .tsd-typography h6 { + font-weight: normal; + } + .tsd-typography p, + .tsd-typography ul, + .tsd-typography ol { + margin: 1em 0; + } + .tsd-typography table { + border-collapse: collapse; + border: none; + } + .tsd-typography td, + .tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); + } + .tsd-typography thead, + .tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); + } + + .tsd-alert { + padding: 8px 16px; + margin-bottom: 16px; + border-left: 0.25em solid var(--alert-color); + } + .tsd-alert blockquote > :last-child, + .tsd-alert > :last-child { + margin-bottom: 0; + } + .tsd-alert-title { + color: var(--alert-color); + display: inline-flex; + align-items: center; + } + .tsd-alert-title span { + margin-left: 4px; + } + + .tsd-alert-note { + --alert-color: var(--color-alert-note); + } + .tsd-alert-tip { + --alert-color: var(--color-alert-tip); + } + .tsd-alert-important { + --alert-color: var(--color-alert-important); + } + .tsd-alert-warning { + --alert-color: var(--color-alert-warning); + } + .tsd-alert-caution { + --alert-color: var(--color-alert-caution); + } + + .tsd-breadcrumb { + margin: 0; + margin-top: 1rem; + padding: 0; + color: var(--color-text-aside); + } + .tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; + } + .tsd-breadcrumb a:hover { + text-decoration: underline; + } + .tsd-breadcrumb li { + display: inline; + } + .tsd-breadcrumb li:after { + content: " / "; + } + + .tsd-comment-tags { + display: flex; + flex-direction: column; + } + dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; + } + dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; + } + dl.tsd-comment-tag-group dd { + margin: 0; + } + code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; + } + h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; + } + + dl.tsd-comment-tag-group dd:before, + dl.tsd-comment-tag-group dd:after { + content: " "; + } + dl.tsd-comment-tag-group dd pre, + dl.tsd-comment-tag-group dd:after { + clear: both; + } + dl.tsd-comment-tag-group p { + margin: 0; + } + + .tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; + } + .tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; + } + + .tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; + } + .tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; + } + .tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + } + .tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; + } + .tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; + } + .tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; + } + .tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); + } + .tsd-checkbox-background { + fill: var(--color-accent); + } + input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); + } + + .settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; + } + + .tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; + } + + .tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; + } + + .tsd-hierarchy h4 label:hover span { + text-decoration: underline; + } + + .tsd-hierarchy { + list-style: square; + margin: 0; + } + .tsd-hierarchy-target { + font-weight: bold; + } + .tsd-hierarchy-toggle { + color: var(--color-link); + cursor: pointer; + } + + .tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); + } + .tsd-full-hierarchy, + .tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; + } + .tsd-full-hierarchy ul { + padding-left: 1.5rem; + } + .tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-full-hierarchy svg[data-dropdown] { + cursor: pointer; + } + .tsd-full-hierarchy svg[data-dropdown="false"] { + transform: rotate(-90deg); + } + .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { + display: none; + } + + .tsd-panel-group.tsd-index-group { + margin-bottom: 0; + } + .tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; + } + @media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } + } + @media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } + } + .tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; + } + + .tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; + } + + .tsd-anchor { + position: relative; + top: -100px; + } + + .tsd-member { + position: relative; + } + .tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; + } + + .tsd-navigation.settings { + margin: 0; + margin-bottom: 1rem; + } + .tsd-navigation > a, + .tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; + } + .tsd-navigation a, + .tsd-navigation summary > span, + .tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background: var(--color-active-menu-item); + color: var(--color-contrast-text); + } + .tsd-navigation a:hover, + .tsd-page-navigation a:hover { + text-decoration: underline; + } + .tsd-navigation ul, + .tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; + } + .tsd-navigation li, + .tsd-page-navigation li { + padding: 0; + max-width: 100%; + } + .tsd-navigation .tsd-nav-link { + display: none; + } + .tsd-nested-navigation { + margin-left: 3rem; + } + .tsd-nested-navigation > li > details { + margin-left: -1.5rem; + } + .tsd-small-nested-navigation { + margin-left: 1.5rem; + } + .tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; + } + + .tsd-page-navigation-section > summary { + padding: 0.25rem; + } + .tsd-page-navigation-section > summary > svg { + margin-right: 0.25rem; + } + .tsd-page-navigation-section > div { + margin-left: 30px; + } + .tsd-page-navigation ul { + padding-left: 1.75rem; + } + + #tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; + } + #tsd-sidebar-links a:last-of-type { + margin-bottom: 0; + } + + a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ + display: flex; + align-items: center; + gap: 0.25rem; + box-sizing: border-box; + } + .tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ + } + .tsd-accordion-summary, + .tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; + } + .tsd-accordion-summary a { + width: calc(100% - 1.5rem); + } + .tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + } + /* + * We need to be careful to target the arrow indicating whether the accordion + * is open, but not any other SVGs included in the details element. + */ + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child { + transform: rotate(-90deg); + } + .tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; + } + .tsd-index-summary { + margin-top: 1.5rem; + margin-bottom: 0.75rem; + display: flex; + align-content: center; + } + + .tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; + } + .tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; + } + + .tsd-panel { + margin-bottom: 2.5rem; + } + .tsd-panel.tsd-member { + margin-bottom: 4rem; + } + .tsd-panel:empty { + display: none; + } + .tsd-panel > h1, + .tsd-panel > h2, + .tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; + } + .tsd-panel > h1.tsd-before-signature, + .tsd-panel > h2.tsd-before-signature, + .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; + } + + .tsd-panel-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group details { + margin: 2rem 0; + } + .tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; + } + + #tsd-search[open] { + animation: fade-in var(--modal-animation-duration) ease-out forwards; + } + #tsd-search[open].closing { + animation-name: fade-out; + } + + /* Avoid setting `display` on closed dialog */ + #tsd-search[open] { + display: flex; + flex-direction: column; + padding: 1rem; + width: 32rem; + max-width: 90vw; + max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh); + /* Anchor dialog to top */ + margin-top: 10vh; + border-radius: 6px; + will-change: max-height; + } + #tsd-search-input { + box-sizing: border-box; + width: 100%; + padding: 0 0.625rem; /* 10px */ + outline: 0; + border: 2px solid var(--color-accent); + background-color: transparent; + color: var(--color-text); + border-radius: 4px; + height: 2.5rem; + flex: 0 0 auto; + font-size: 0.875rem; + transition: border-color 0.2s, background-color 0.2s; + } + #tsd-search-input:focus-visible { + background-color: var(--color-background-active); + border-color: transparent; + color: var(--color-contrast-text); + } + #tsd-search-input::placeholder { + color: inherit; + opacity: 0.8; + } + #tsd-search-results { + margin: 0; + padding: 0; + list-style: none; + flex: 1 1 auto; + display: flex; + flex-direction: column; + overflow-y: auto; + } + #tsd-search-results:not(:empty) { + margin-top: 0.5rem; + } + #tsd-search-results > li { + background-color: var(--color-background); + line-height: 1.5; + box-sizing: border-box; + border-radius: 4px; + } + #tsd-search-results > li:nth-child(even) { + background-color: var(--color-background-secondary); + } + #tsd-search-results > li:is(:hover, [aria-selected="true"]) { + background-color: var(--color-background-active); + color: var(--color-contrast-text); + } + /* It's important that this takes full size of parent `li`, to capture a click on `li` */ + #tsd-search-results > li > a { + display: flex; + align-items: center; + padding: 0.5rem 0.25rem; + box-sizing: border-box; + width: 100%; + } + #tsd-search-results > li > a > .text { + flex: 1 1 auto; + min-width: 0; + overflow-wrap: anywhere; + } + #tsd-search-results > li > a .parent { + color: var(--color-text-aside); + } + #tsd-search-results > li > a mark { + color: inherit; + background-color: inherit; + font-weight: bold; + } + #tsd-search-status { + flex: 1; + display: grid; + place-content: center; + text-align: center; + overflow-wrap: anywhere; + } + #tsd-search-status:not(:empty) { + min-height: 6rem; + } + + .tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; + } + + .tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; + } + + .tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; + } + + .tsd-signature-type { + font-style: italic; + font-weight: normal; + } + + .tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; + } + .tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; + } + .tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; + } + .tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; + } + .tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; + } + + ul.tsd-parameter-list, + ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; + } + ul.tsd-parameter-list > li.tsd-parameter-signature, + ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; + } + ul.tsd-parameter-list h5, + ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; + } + .tsd-sources { + margin-top: 1rem; + font-size: 0.875em; + } + .tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; + } + .tsd-sources ul { + list-style: none; + padding: 0; + } + + .tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: var(--dim-toolbar-border-bottom-width) + var(--color-accent) solid; + transition: transform 0.3s ease-in-out; + } + .tsd-page-toolbar a { + color: var(--color-text); + } + .tsd-toolbar-contents { + display: flex; + align-items: center; + height: var(--dim-toolbar-contents-height); + margin: 0 auto; + } + .tsd-toolbar-contents > .title { + font-weight: bold; + margin-right: auto; + } + #tsd-toolbar-links { + display: flex; + align-items: center; + gap: 1.5rem; + margin-right: 1rem; + } + + .tsd-widget { + box-sizing: border-box; + display: inline-block; + opacity: 0.8; + height: 2.5rem; + width: 2.5rem; + transition: opacity 0.1s, background-color 0.1s; + text-align: center; + cursor: pointer; + border: none; + background-color: transparent; + } + .tsd-widget:hover { + opacity: 0.9; + } + .tsd-widget:active { + opacity: 1; + background-color: var(--color-accent); + } + #tsd-toolbar-menu-trigger { + display: none; + } + + .tsd-member-summary-name { + display: inline-flex; + align-items: center; + padding: 0.25rem; + text-decoration: none; + } + + .tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + color: var(--color-text); + vertical-align: middle; + } + + .tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; + } + + .tsd-member-summary-name:hover > .tsd-anchor-icon svg, + .tsd-anchor-link:hover > .tsd-anchor-icon svg, + .tsd-anchor-icon:focus-visible svg { + visibility: visible; + } + + .deprecated { + text-decoration: line-through !important; + } + + .warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); + } + + .tsd-kind-project { + color: var(--color-ts-project); + } + .tsd-kind-module { + color: var(--color-ts-module); + } + .tsd-kind-namespace { + color: var(--color-ts-namespace); + } + .tsd-kind-enum { + color: var(--color-ts-enum); + } + .tsd-kind-enum-member { + color: var(--color-ts-enum-member); + } + .tsd-kind-variable { + color: var(--color-ts-variable); + } + .tsd-kind-function { + color: var(--color-ts-function); + } + .tsd-kind-class { + color: var(--color-ts-class); + } + .tsd-kind-interface { + color: var(--color-ts-interface); + } + .tsd-kind-constructor { + color: var(--color-ts-constructor); + } + .tsd-kind-property { + color: var(--color-ts-property); + } + .tsd-kind-method { + color: var(--color-ts-method); + } + .tsd-kind-reference { + color: var(--color-ts-reference); + } + .tsd-kind-call-signature { + color: var(--color-ts-call-signature); + } + .tsd-kind-index-signature { + color: var(--color-ts-index-signature); + } + .tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); + } + .tsd-kind-parameter { + color: var(--color-ts-parameter); + } + .tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); + } + .tsd-kind-accessor { + color: var(--color-ts-accessor); + } + .tsd-kind-get-signature { + color: var(--color-ts-get-signature); + } + .tsd-kind-set-signature { + color: var(--color-ts-set-signature); + } + .tsd-kind-type-alias { + color: var(--color-ts-type-alias); + } + + /* if we have a kind icon, don't color the text by kind */ + .tsd-kind-icon ~ span { + color: var(--color-text); + } + + /* mobile */ + @media (max-width: 769px) { + #tsd-toolbar-menu-trigger { + display: inline-block; + /* temporary fix to vertically align, for compatibility */ + line-height: 2.5; + } + #tsd-toolbar-links { + display: none; + } + + .container-main { + display: flex; + } + .col-content { + float: none; + max-width: 100%; + width: 100%; + } + .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + .col-sidebar > *:last-child { + padding-bottom: 20px; + } + .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } + } + + /* one sidebar */ + @media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + --dim-container-main-margin-y: 2rem; + } + + .tsd-breadcrumb { + margin-top: 0; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + .site-menu { + margin-top: 1rem; + } + } + + /* two sidebars */ + @media (min-width: 1200px) { + .container-main { + grid-template-columns: + minmax(0, 1fr) minmax(0, 2.5fr) minmax( + 0, + 20rem + ); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 0rem; + } + + .page-menu, + .site-menu { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + } +} diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html new file mode 100644 index 0000000..bc5c292 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/discriminator.DiscriminatorRegistry.html @@ -0,0 +1,22 @@ +DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.0

            Class DiscriminatorRegistry

            Static registry for managing discriminators and their associated type guards. +Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

            +

            0.1.0

            +
            Index

            Methods

            Methods

            • Checks if a discriminator is already registered.

              +

              Parameters

              • discriminator: string

                The discriminator value to check.

                +

              Returns boolean

                +
              • true if the discriminator is registered, false otherwise.
              • +
              +

              0.1.0

              +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html new file mode 100644 index 0000000..65c6dd5 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/number.NumberUtility.html @@ -0,0 +1,17 @@ +NumberUtility | @blwatkins/utils - v0.1.0-alpha.0

            Class NumberUtility

            Static properties and methods for validating number types.

            +

            0.1.0

            +
            Index

            Methods

            • Is the given input a finite number?

              +

              Parameters

              • input: unknown

              Returns input is number

              true when the input is a finite number; false otherwise.

              +

              0.1.0

              +
            • Is the given input an integer?

              +

              Parameters

              • input: unknown

              Returns input is number

              true when the input is an integer; false otherwise.

              +

              0.1.0

              +
            • Is the given input a positive integer?

              +

              Parameters

              • input: unknown
              • OptionalzeroInclusive: boolean

                true if zero should be considered a valid input. +false if zero should be considered an invalid input.

                +

              Returns input is number

              true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

              +

              0.1.0

              +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html new file mode 100644 index 0000000..09ef6a3 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.RandomNumberGeneratorFactory.html @@ -0,0 +1,39 @@ +RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.0

            Class RandomNumberGeneratorFactory

            A static factory class for creating a SeededRandomNumberGenerator object.

            +

            0.1.0

            +
            Index

            Methods

            Methods

            • Build a SeededRandomNumberGenerator object with the given seed and namespace from an asynchronous hashing algorithm.

              +

              Parameters

              • seed: string

                The primary input to determine the random number sequence.

                +
              • Optionalnamespace: string

                Namespace to create different sequences from the same seed.

                +

              Returns Promise<SeededRandomNumberGenerator>

              This method relies on the Web Crypto API via crypto.subtle. +In Node.js environments, ensure you are using a version where the Web Crypto API is available.

              +
                +
              • When the given seed is not a string.
              • +
              +
                +
              • When the given namespace is not a string.
              • +
              +

              0.1.0

              +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html new file mode 100644 index 0000000..dce9e0e --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeedVersions.html @@ -0,0 +1,23 @@ +SeedVersions | @blwatkins/utils - v0.1.0-alpha.0

            Class SeedVersions

            A static class for accessing different seed versions. +Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

            +

            0.1.0

            +
            Index

            Accessors

            Methods

            Accessors

            Methods

            • Is the given index a valid seed version?

              +

              Parameters

              • index: number

                The index to check.

                +

              Returns boolean

              0.1.0

              +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html new file mode 100644 index 0000000..fcb21b7 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/random.SeededRandomNumberGenerator.html @@ -0,0 +1,18 @@ +SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.0

            Class SeededRandomNumberGenerator

            Deterministic seeded pseudorandom number generator. +This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

            +

            0.1.0

            +
            Index

            Constructors

            Methods

            Constructors

            • Parameters

              • state: [number, number, number, number]

                Initial 128-bit state. +Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

                +

              Returns SeededRandomNumberGenerator

              If state is not an array with 4 elements.

              +

              If each element of state is not a 32-bit unsigned integer.

              +

              If state does not have at least one element that is greater than 0.

              +

              0.1.0

              +

            Methods

            • Returns number

                +
              • The next pseudorandom float in the range [0, 1).
              • +
              +

              This method advances the internal 128-bit xoshiro128** state by one step. +Successive calls produce an independent, uniformly distributed sequence.

              +

              0.1.0

              +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html new file mode 100644 index 0000000..f7d090f --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/classes/string.StringUtility.html @@ -0,0 +1,34 @@ +StringUtility | @blwatkins/utils - v0.1.0-alpha.0

            Class StringUtility

            Static properties and methods for validating string types.

            +

            0.1.0

            +
            Index

            Accessors

            • get singleLineLowercaseTrimmedPattern(): RegExp

              Returns RegExp

              Regular expression pattern for validating single-line lowercase strings.

              +

              This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

              +

              0.1.0

              +
            • get singleLineTrimmedPattern(): RegExp

              Returns RegExp

              Regular expression pattern for validating single-line mixed-case strings.

              +

              This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

              +

              0.1.0

              +
            • get singleLineUppercaseTrimmedPattern(): RegExp

              Returns RegExp

              Regular expression pattern for validating single-line uppercase strings.

              +

              This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

              +

              0.1.0

              +

            Methods

            • Is the given input a non-empty string? +Non-empty strings must contain at least one non-whitespace character.

              +

              Parameters

              • input: unknown

              Returns boolean

              0.1.0

              +
            • Is the given input a string?

              +

              Parameters

              • input: unknown

              Returns input is string

              0.1.0

              +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/hierarchy.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/hierarchy.html new file mode 100644 index 0000000..4a9ccab --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/hierarchy.html @@ -0,0 +1 @@ +@blwatkins/utils - v0.1.0-alpha.0

            @blwatkins/utils - v0.1.0-alpha.0

            Hierarchy Summary

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html new file mode 100644 index 0000000..85dbfd7 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/index.html @@ -0,0 +1,59 @@ +@blwatkins/utils - v0.1.0-alpha.0

            @blwatkins/utils - v0.1.0-alpha.0

            TypeScript Utilities

            +

            A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development.

            + + + +

            The source code of this project is licensed under the MIT License. +The full text of the license is included with the project source code.

            + + +

            npm License +npm Version +npm @alpha Version +npm Types +npm Node Version +npm Weekly Downloads +npm Total Downloads +npm Last Update +npm Unpacked Size

            + +

            Socket Score

            + +

            Bundlephobia Tree Shaking +Bundlephobia Dependency Count +Bundlephobia Minified +Bundlephobia Minified + gzip

            + +

            Package Phobia Install Size +Package Phobia Publish Size

            + +

            GitHub License +GitHub Dependabot +GitHub Latest Release +GitHub Releases +GitHub Last Commit +GitHub Commits +GitHub Commit Activity +GitHub Code Size in Bytes +GitHub Repo Size +GitHub Repo File or Directory Count +GitHub Language Count

            + +

            CodeQL +npm Lint, Build, and Test +Deploy GitHub Pages with Jekyll

            + + + +

            A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation.

            +

            A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of web development and computer science. +Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer.

            +
            +

            Copyright © 2024-2026 Brittni Watkins.

            +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html new file mode 100644 index 0000000..bc8bab8 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -0,0 +1,14 @@ +DiscriminatorRegistration | @blwatkins/utils - v0.1.0-alpha.0

            Interface DiscriminatorRegistration

            A registration for a discriminator to the DiscriminatorRegistry.

            +

            0.1.0

            +
            interface DiscriminatorRegistration {
                discriminator: string;
                validator: (input: unknown) => boolean;
            }
            Index

            Properties

            discriminator: string

            The discriminator value that identifies the type of a Discriminated object. +This value must be unique across all registered discriminators.

            +

            0.1.0

            +
            validator: (input: unknown) => boolean

            A method that validates whether an input matches the type associated with the discriminator.

            +

            Type Declaration

              • (input: unknown): boolean
              • Parameters

                • input: unknown

                  The input to validate.

                  +

                Returns boolean

                  +
                • true if the input matches the type associated with the discriminator, false otherwise.
                • +
                +

            0.1.0

            +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html new file mode 100644 index 0000000..6ac3bdd --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/interfaces/random.SeedVersion.html @@ -0,0 +1,8 @@ +SeedVersion | @blwatkins/utils - v0.1.0-alpha.0

            Interface SeedVersion

            A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. +A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

            +

            0.1.0

            +
            interface SeedVersion {
                offsets: readonly [number, number, number, number];
            }
            Index

            Properties

            Properties

            offsets: readonly [number, number, number, number]

            A collection of offset values for the FNV-1a hashing algorithm. +Each offset value should be a 32-bit unsigned integer.

            +

            0.1.0

            +

            Generated using TypeDoc


            Copyright © 2024-2026 Brittni Watkins.

            diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules.html new file mode 100644 index 0000000..125cc76 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules.html @@ -0,0 +1 @@ +@blwatkins/utils - v0.1.0-alpha.0

              @blwatkins/utils - v0.1.0-alpha.0

              Modules

              discriminator
              number
              random
              string

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/discriminator.html new file mode 100644 index 0000000..43f974e --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/discriminator.html @@ -0,0 +1 @@ +discriminator | @blwatkins/utils - v0.1.0-alpha.0

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/number.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/number.html new file mode 100644 index 0000000..d626aa2 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/number.html @@ -0,0 +1 @@ +number | @blwatkins/utils - v0.1.0-alpha.0

              Module number

              Classes

              NumberUtility

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/random.html new file mode 100644 index 0000000..d24f00d --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/random.html @@ -0,0 +1 @@ +random | @blwatkins/utils - v0.1.0-alpha.0

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/string.html new file mode 100644 index 0000000..0eaa6fb --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/modules/string.html @@ -0,0 +1 @@ +string | @blwatkins/utils - v0.1.0-alpha.0

              Module string

              Classes

              StringUtility

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html new file mode 100644 index 0000000..f74dfea --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.Discriminated.html @@ -0,0 +1,3 @@ +Discriminated | @blwatkins/utils - v0.1.0-alpha.0

              Type Alias Discriminated

              Discriminated: Static<typeof discriminatedSchema>

              Discriminated objects can be type checked using the discriminator registry.

              +

              0.1.0

              +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html new file mode 100644 index 0000000..69d3ae5 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/types/discriminator.TypeGuard.html @@ -0,0 +1,3 @@ +TypeGuard | @blwatkins/utils - v0.1.0-alpha.0

              Type Alias TypeGuard<T>

              TypeGuard: (input: unknown) => input is T

              A type guard function that checks if an input is of a specific Discriminated type.

              +

              Type Parameters

              Type Declaration

                • (input: unknown): input is T
                • Parameters

                  • input: unknown

                  Returns input is T

              0.1.0

              +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html new file mode 100644 index 0000000..6e7c94b --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.0/doc/variables/discriminator.discriminatedSchema.html @@ -0,0 +1,3 @@ +discriminatedSchema | @blwatkins/utils - v0.1.0-alpha.0

              Variable discriminatedSchemaConst

              discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

              TypeBox schema for validating that an object implements the Discriminated type.

              +

              0.1.0

              +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              From b17f7a8f159fe0f92fd9952ca0afd75acb0fb84b Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 5 Jul 2026 12:43:33 -0500 Subject: [PATCH 076/122] Update generated docs for v0.1.0-alpha.1 --- .../v0.1.0-alpha.1/doc/.nojekyll | 1 + .../v0.1.0-alpha.1/doc/assets/hierarchy.js | 1 + .../v0.1.0-alpha.1/doc/assets/highlight.css | 22 + .../v0.1.0-alpha.1/doc/assets/icons.js | 18 + .../v0.1.0-alpha.1/doc/assets/icons.svg | 1 + .../v0.1.0-alpha.1/doc/assets/main.js | 60 + .../v0.1.0-alpha.1/doc/assets/navigation.js | 1 + .../v0.1.0-alpha.1/doc/assets/search.js | 1 + .../v0.1.0-alpha.1/doc/assets/style.css | 1633 +++++++++++++++++ .../discriminator.DiscriminatorRegistry.html | 30 + .../doc/classes/number.NumberUtility.html | 18 + .../doc/classes/random.Random.html | 58 + .../random.RandomNumberGeneratorFactory.html | 39 + .../doc/classes/random.SeedVersions.html | 23 + .../random.SeededRandomNumberGenerator.html | 18 + .../random.WeightedElementUtility.html | 83 + .../classes/string.ColorStringUtility.html | 27 + .../doc/classes/string.StringUtility.html | 34 + .../enums/discriminator.Discriminators.html | 6 + .../v0.1.0-alpha.1/doc/hierarchy.html | 1 + .../v0.1.0-alpha.1/doc/index.html | 59 + ...scriminator.DiscriminatorRegistration.html | 14 + .../doc/interfaces/random.SeedVersion.html | 8 + .../interfaces/random.WeightedElement.html | 13 + .../v0.1.0-alpha.1/doc/modules.html | 1 + .../doc/modules/discriminator.html | 1 + .../v0.1.0-alpha.1/doc/modules/number.html | 1 + .../v0.1.0-alpha.1/doc/modules/random.html | 1 + .../v0.1.0-alpha.1/doc/modules/string.html | 1 + .../types/discriminator.Discriminated.html | 3 + .../doc/types/discriminator.TypeGuard.html | 3 + .../doc/types/random.WeightedList.html | 4 + .../discriminator.discriminatedSchema.html | 3 + .../random.weightedElementSchema.html | 3 + 34 files changed, 2190 insertions(+) create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.Random.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.WeightedElementUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/enums/discriminator.Discriminators.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.WeightedElement.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/random.WeightedList.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html create mode 100644 docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/random.weightedElementSchema.html diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll new file mode 100644 index 0000000..e2ac661 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js new file mode 100644 index 0000000..fb85f0a --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/hierarchy.js @@ -0,0 +1 @@ +window.hierarchyData = "eJyrVirKzy8pVrKKjtVRKkpNy0lNLsnMzytWsqqurQUAmx4Kpg==" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css new file mode 100644 index 0000000..5674cf3 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/highlight.css @@ -0,0 +1,22 @@ +:root { + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --code-background: var(--dark-code-background); +} } + +:root[data-theme='light'] { + --code-background: var(--light-code-background); +} + +:root[data-theme='dark'] { + --code-background: var(--dark-code-background); +} + +pre, code { background: var(--code-background); } diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js new file mode 100644 index 0000000..4fbadc5 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.js @@ -0,0 +1,18 @@ +(function() { + addIcons(); + function addIcons() { + if (document.readyState === "loading") return document.addEventListener("DOMContentLoaded", addIcons); + const svg = document.body.appendChild(document.createElementNS("http://www.w3.org/2000/svg", "svg")); + svg.innerHTML = `MMNEPVFCICPMFPCPTTAAATR`; + svg.style.display = "none"; + if (location.protocol === "file:") updateUseElements(); + } + + function updateUseElements() { + document.querySelectorAll("use").forEach(el => { + if (el.getAttribute("href").includes("#icon-")) { + el.setAttribute("href", el.getAttribute("href").replace(/.*#/, "#")); + } + }); + } +})() \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg new file mode 100644 index 0000000..be7798f --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/icons.svg @@ -0,0 +1 @@ +MMNEPVFCICPMFPCPTTAAATR \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js new file mode 100644 index 0000000..8182cee --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/main.js @@ -0,0 +1,60 @@ +"use strict"; +window.translations={"copy":"Copy","copied":"Copied!","normally_hidden":"This member is normally hidden due to your filter settings.","hierarchy_expand":"Expand","hierarchy_collapse":"Collapse","folder":"Folder","search_index_not_available":"The search index is not available","search_no_results_found_for_0":"No results found for {0}","kind_1":"Project","kind_2":"Module","kind_4":"Namespace","kind_8":"Enumeration","kind_16":"Enumeration Member","kind_32":"Variable","kind_64":"Function","kind_128":"Class","kind_256":"Interface","kind_512":"Constructor","kind_1024":"Property","kind_2048":"Method","kind_4096":"Call Signature","kind_8192":"Index Signature","kind_16384":"Constructor Signature","kind_32768":"Parameter","kind_65536":"Type Literal","kind_131072":"Type Parameter","kind_262144":"Accessor","kind_524288":"Get Signature","kind_1048576":"Set Signature","kind_2097152":"Type Alias","kind_4194304":"Reference","kind_8388608":"Document"}; +"use strict";(()=>{var Ke=Object.create;var he=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Xe=Object.getPrototypeOf,Ye=Object.prototype.hasOwnProperty;var et=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var tt=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Ze(e))!Ye.call(t,i)&&i!==n&&he(t,i,{get:()=>e[i],enumerable:!(r=Ge(e,i))||r.enumerable});return t};var nt=(t,e,n)=>(n=t!=null?Ke(Xe(t)):{},tt(e||!t||!t.__esModule?he(n,"default",{value:t,enumerable:!0}):n,t));var ye=et((me,ge)=>{(function(){var t=function(e){var n=new t.Builder;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),n.searchPipeline.add(t.stemmer),e.call(n,n),n.build()};t.version="2.3.9";t.utils={},t.utils.warn=(function(e){return function(n){e.console&&console.warn&&console.warn(n)}})(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var n=Object.create(null),r=Object.keys(e),i=0;i0){var d=t.utils.clone(n)||{};d.position=[a,l],d.index=s.length,s.push(new t.Token(r.slice(a,o),d))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(r){var i=t.Pipeline.registeredFunctions[r];if(i)n.add(i);else throw new Error("Cannot load unregistered function: "+r)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(n){t.Pipeline.warnIfFunctionNotRegistered(n),this._stack.push(n)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");r=r+1,this._stack.splice(r,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var r=this._stack.indexOf(e);if(r==-1)throw new Error("Cannot find existingFn");this._stack.splice(r,0,n)},t.Pipeline.prototype.remove=function(e){var n=this._stack.indexOf(e);n!=-1&&this._stack.splice(n,1)},t.Pipeline.prototype.run=function(e){for(var n=this._stack.length,r=0;r1&&(oe&&(r=s),o!=e);)i=r-n,s=n+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?d+=2:a==c&&(n+=r[l+1]*i[d+1],l+=2,d+=2);return n},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),n=1,r=0;n0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),f=s.str.charAt(1),p;f in s.node.edges?p=s.node.edges[f]:(p=new t.TokenSet,s.node.edges[f]=p),s.str.length==1&&(p.final=!0),i.push({node:p,editsRemaining:s.editsRemaining-1,str:d+s.str.slice(2)})}}}return r},t.TokenSet.fromString=function(e){for(var n=new t.TokenSet,r=n,i=0,s=e.length;i=e;n--){var r=this.uncheckedNodes[n],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(n){var r=new t.QueryParser(e,n);r.parse()})},t.Index.prototype.query=function(e){for(var n=new t.Query(this.fields),r=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,n){var r=e[this._ref],i=Object.keys(this._fields);this._documents[r]=n||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,n;do e=this.next(),n=e.charCodeAt(0);while(n>47&&n<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var n=e.next();if(n==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(n.charCodeAt(0)==92){e.escapeCharacter();continue}if(n==":")return t.QueryLexer.lexField;if(n=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(n=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(n=="+"&&e.width()===1||n=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(n.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,n){this.lexer=new t.QueryLexer(e),this.query=n,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var n=e.peekLexeme();if(n!=null)switch(n.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expected either a field or a term, found "+n.type;throw n.str.length>=1&&(r+=" with value '"+n.str+"'"),new t.QueryParseError(r,n.start,n.end)}},t.QueryParser.parsePresence=function(e){var n=e.consumeLexeme();if(n!=null){switch(n.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var r="unrecognised presence operator'"+n.str+"'";throw new t.QueryParseError(r,n.start,n.end)}var i=e.peekLexeme();if(i==null){var r="expecting term or field, found nothing";throw new t.QueryParseError(r,n.start,n.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var r="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(r,i.start,i.end)}}},t.QueryParser.parseField=function(e){var n=e.consumeLexeme();if(n!=null){if(e.query.allFields.indexOf(n.str)==-1){var r=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+n.str+"', possible fields: "+r;throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.fields=[n.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,n.start,n.end)}if(s.type===t.QueryLexer.TERM)return t.QueryParser.parseTerm;var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}},t.QueryParser.parseTerm=function(e){var n=e.consumeLexeme();if(n!=null){e.currentClause.term=n.str.toLowerCase(),n.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var r=e.peekLexeme();if(r==null){e.nextClause();return}switch(r.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+r.type+"'";throw new t.QueryParseError(i,r.start,r.end)}}},t.QueryParser.parseEditDistance=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="edit distance must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.editDistance=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var n=e.consumeLexeme();if(n!=null){var r=parseInt(n.str,10);if(isNaN(r)){var i="boost must be numeric";throw new t.QueryParseError(i,n.start,n.end)}e.currentClause.boost=r;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},(function(e,n){typeof define=="function"&&define.amd?define(n):typeof me=="object"?ge.exports=n():e.lunr=n()})(this,function(){return t})})()});var M,G={getItem(){return null},setItem(){}},K;try{K=localStorage,M=K}catch{K=G,M=G}var S={getItem:t=>M.getItem(t),setItem:(t,e)=>M.setItem(t,e),disableWritingLocalStorage(){M=G},disable(){localStorage.clear(),M=G},enable(){M=K}};window.TypeDoc||={disableWritingLocalStorage(){S.disableWritingLocalStorage()},disableLocalStorage:()=>{S.disable()},enableLocalStorage:()=>{S.enable()}};window.translations||={copy:"Copy",copied:"Copied!",normally_hidden:"This member is normally hidden due to your filter settings.",hierarchy_expand:"Expand",hierarchy_collapse:"Collapse",search_index_not_available:"The search index is not available",search_no_results_found_for_0:"No results found for {0}",folder:"Folder",kind_1:"Project",kind_2:"Module",kind_4:"Namespace",kind_8:"Enumeration",kind_16:"Enumeration Member",kind_32:"Variable",kind_64:"Function",kind_128:"Class",kind_256:"Interface",kind_512:"Constructor",kind_1024:"Property",kind_2048:"Method",kind_4096:"Call Signature",kind_8192:"Index Signature",kind_16384:"Constructor Signature",kind_32768:"Parameter",kind_65536:"Type Literal",kind_131072:"Type Parameter",kind_262144:"Accessor",kind_524288:"Get Signature",kind_1048576:"Set Signature",kind_2097152:"Type Alias",kind_4194304:"Reference",kind_8388608:"Document"};var pe=[];function X(t,e){pe.push({selector:e,constructor:t})}var Z=class{alwaysVisibleMember=null;constructor(){this.createComponents(document.body),this.ensureFocusedElementVisible(),this.listenForCodeCopies(),window.addEventListener("hashchange",()=>this.ensureFocusedElementVisible()),document.body.style.display||(this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}createComponents(e){pe.forEach(n=>{e.querySelectorAll(n.selector).forEach(r=>{r.dataset.hasInstance||(new n.constructor({el:r,app:this}),r.dataset.hasInstance=String(!0))})})}filterChanged(){this.ensureFocusedElementVisible()}showPage(){document.body.style.display&&(document.body.style.removeProperty("display"),this.ensureFocusedElementVisible(),this.updateIndexVisibility(),this.scrollToHash())}scrollToHash(){if(location.hash){let e=document.getElementById(location.hash.substring(1));if(!e)return;e.scrollIntoView({behavior:"instant",block:"start"})}}ensureActivePageVisible(){let e=document.querySelector(".tsd-navigation .current"),n=e?.parentElement;for(;n&&!n.classList.contains(".tsd-navigation");)n instanceof HTMLDetailsElement&&(n.open=!0),n=n.parentElement;if(e&&!rt(e)){let r=e.getBoundingClientRect().top-document.documentElement.clientHeight/4;document.querySelector(".site-menu").scrollTop=r,document.querySelector(".col-sidebar").scrollTop=r}}updateIndexVisibility(){let e=document.querySelector(".tsd-index-content"),n=e?.open;e&&(e.open=!0),document.querySelectorAll(".tsd-index-section").forEach(r=>{r.style.display="block";let i=Array.from(r.querySelectorAll(".tsd-index-link")).every(s=>s.offsetParent==null);r.style.display=i?"none":"block"}),e&&(e.open=n)}ensureFocusedElementVisible(){if(this.alwaysVisibleMember&&(this.alwaysVisibleMember.classList.remove("always-visible"),this.alwaysVisibleMember.firstElementChild.remove(),this.alwaysVisibleMember=null),!location.hash)return;let e=document.getElementById(location.hash.substring(1));if(!e)return;let n=e.parentElement;for(;n&&n.tagName!=="SECTION";)n=n.parentElement;if(!n)return;let r=n.offsetParent==null,i=n;for(;i!==document.body;)i instanceof HTMLDetailsElement&&(i.open=!0),i=i.parentElement;if(n.offsetParent==null){this.alwaysVisibleMember=n,n.classList.add("always-visible");let s=document.createElement("p");s.classList.add("warning"),s.textContent=window.translations.normally_hidden,n.prepend(s)}r&&e.scrollIntoView()}listenForCodeCopies(){document.querySelectorAll("pre > button").forEach(e=>{let n;e.addEventListener("click",()=>{e.previousElementSibling instanceof HTMLElement&&navigator.clipboard.writeText(e.previousElementSibling.innerText.trim()),e.textContent=window.translations.copied,e.classList.add("visible"),clearTimeout(n),n=setTimeout(()=>{e.classList.remove("visible"),n=setTimeout(()=>{e.textContent=window.translations.copy},100)},1e3)})})}};function rt(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var fe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var Ie=nt(ye(),1);async function R(t){let e=Uint8Array.from(atob(t),s=>s.charCodeAt(0)),r=new Blob([e]).stream().pipeThrough(new DecompressionStream("deflate")),i=await new Response(r).text();return JSON.parse(i)}var Y="closing",ae="tsd-overlay";function it(){let t=Math.abs(window.innerWidth-document.documentElement.clientWidth);document.body.style.overflow="hidden",document.body.style.paddingRight=`${t}px`}function st(){document.body.style.removeProperty("overflow"),document.body.style.removeProperty("padding-right")}function Ee(t,e){t.addEventListener("animationend",()=>{t.classList.contains(Y)&&(t.classList.remove(Y),document.getElementById(ae)?.remove(),t.close(),st())}),t.addEventListener("cancel",n=>{n.preventDefault(),ve(t)}),e?.closeOnClick&&document.addEventListener("click",n=>{t.open&&!t.contains(n.target)&&ve(t)},!0)}function xe(t){if(t.open)return;let e=document.createElement("div");e.id=ae,document.body.appendChild(e),t.showModal(),it()}function ve(t){if(!t.open)return;document.getElementById(ae)?.classList.add(Y),t.classList.add(Y)}var I=class{el;app;constructor(e){this.el=e.el,this.app=e.app}};var be=document.head.appendChild(document.createElement("style"));be.dataset.for="filters";var le={};function Le(t){for(let e of t.split(/\s+/))if(le.hasOwnProperty(e)&&!le[e])return!0;return!1}var ee=class extends I{key;value;constructor(e){super(e),this.key=`filter-${this.el.name}`,this.value=this.el.checked,this.el.addEventListener("change",()=>{this.setLocalStorage(this.el.checked)}),this.setLocalStorage(this.fromLocalStorage()),be.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } +`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=S.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){S.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),le[`tsd-is-${this.el.name}`]=this.value,this.app.filterChanged(),this.app.updateIndexVisibility()}};var we=0;async function Se(t,e){if(!window.searchData)return;let n=await R(window.searchData);t.data=n,t.index=Ie.Index.load(n.index),e.innerHTML=""}function _e(){let t=document.getElementById("tsd-search-trigger"),e=document.getElementById("tsd-search"),n=document.getElementById("tsd-search-input"),r=document.getElementById("tsd-search-results"),i=document.getElementById("tsd-search-script"),s=document.getElementById("tsd-search-status");if(!(t&&e&&n&&r&&i&&s))throw new Error("Search controls missing");let o={base:document.documentElement.dataset.base};o.base.endsWith("/")||(o.base+="/"),i.addEventListener("error",()=>{let a=window.translations.search_index_not_available;Pe(s,a)}),i.addEventListener("load",()=>{Se(o,s)}),Se(o,s),ot({trigger:t,searchEl:e,results:r,field:n,status:s},o)}function ot(t,e){let{field:n,results:r,searchEl:i,status:s,trigger:o}=t;Ee(i,{closeOnClick:!0});function a(){xe(i),n.setSelectionRange(0,n.value.length)}o.addEventListener("click",a),n.addEventListener("input",fe(()=>{at(r,n,s,e)},200)),n.addEventListener("keydown",l=>{if(r.childElementCount===0||l.ctrlKey||l.metaKey||l.altKey)return;let d=n.getAttribute("aria-activedescendant"),f=d?document.getElementById(d):null;if(f){let p=!1,v=!1;switch(l.key){case"Home":case"End":case"ArrowLeft":case"ArrowRight":v=!0;break;case"ArrowDown":case"ArrowUp":p=l.shiftKey;break}(p||v)&&ke(n)}if(!l.shiftKey)switch(l.key){case"Enter":f?.querySelector("a")?.click();break;case"ArrowUp":Te(r,n,f,-1),l.preventDefault();break;case"ArrowDown":Te(r,n,f,1),l.preventDefault();break}});function c(){ke(n)}n.addEventListener("change",c),n.addEventListener("blur",c),n.addEventListener("click",c),document.body.addEventListener("keydown",l=>{if(l.altKey||l.metaKey||l.shiftKey)return;let d=l.ctrlKey&&l.key==="k",f=!l.ctrlKey&&!ut()&&l.key==="/";(d||f)&&(l.preventDefault(),a())})}function at(t,e,n,r){if(!r.index||!r.data)return;t.innerHTML="",n.innerHTML="",we+=1;let i=e.value.trim(),s;if(i){let a=i.split(" ").map(c=>c.length?`*${c}*`:"").join(" ");s=r.index.search(a).filter(({ref:c})=>{let l=r.data.rows[Number(c)].classes;return!l||!Le(l)})}else s=[];if(s.length===0&&i){let a=window.translations.search_no_results_found_for_0.replace("{0}",` "${te(i)}" `);Pe(n,a);return}for(let a=0;ac.score-a.score);let o=Math.min(10,s.length);for(let a=0;a`,f=Ce(c.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(f+=` (score: ${s[a].score.toFixed(2)})`),c.parent&&(f=` + ${Ce(c.parent,i)}.${f}`);let p=document.createElement("li");p.id=`tsd-search:${we}-${a}`,p.role="option",p.ariaSelected="false",p.classList.value=c.classes??"";let v=document.createElement("a");v.tabIndex=-1,v.href=r.base+c.url,v.innerHTML=d+`${f}`,p.append(v),t.appendChild(p)}}function Te(t,e,n,r){let i;if(r===1?i=n?.nextElementSibling||t.firstElementChild:i=n?.previousElementSibling||t.lastElementChild,i!==n){if(!i||i.role!=="option"){console.error("Option missing");return}i.ariaSelected="true",i.scrollIntoView({behavior:"smooth",block:"nearest"}),e.setAttribute("aria-activedescendant",i.id),n?.setAttribute("aria-selected","false")}}function ke(t){let e=t.getAttribute("aria-activedescendant");(e?document.getElementById(e):null)?.setAttribute("aria-selected","false"),t.setAttribute("aria-activedescendant","")}function Ce(t,e){if(e==="")return t;let n=t.toLocaleLowerCase(),r=e.toLocaleLowerCase(),i=[],s=0,o=n.indexOf(r);for(;o!=-1;)i.push(te(t.substring(s,o)),`${te(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(te(t.substring(s))),i.join("")}var lt={"&":"&","<":"<",">":">","'":"'",'"':"""};function te(t){return t.replace(/[&<>"'"]/g,e=>lt[e])}function Pe(t,e){t.innerHTML=e?`
              ${e}
              `:""}var ct=["button","checkbox","file","hidden","image","radio","range","reset","submit"];function ut(){let t=document.activeElement;return t?t.isContentEditable||t.tagName==="TEXTAREA"||t.tagName==="SEARCH"?!0:t.tagName==="INPUT"&&!ct.includes(t.type):!1}var D="mousedown",Me="mousemove",$="mouseup",ne={x:0,y:0},Qe=!1,ce=!1,dt=!1,F=!1,Oe=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Oe?"is-mobile":"not-mobile");Oe&&"ontouchstart"in document.documentElement&&(dt=!0,D="touchstart",Me="touchmove",$="touchend");document.addEventListener(D,t=>{ce=!0,F=!1;let e=D=="touchstart"?t.targetTouches[0]:t;ne.y=e.pageY||0,ne.x=e.pageX||0});document.addEventListener(Me,t=>{if(ce&&!F){let e=D=="touchstart"?t.targetTouches[0]:t,n=ne.x-(e.pageX||0),r=ne.y-(e.pageY||0);F=Math.sqrt(n*n+r*r)>10}});document.addEventListener($,()=>{ce=!1});document.addEventListener("click",t=>{Qe&&(t.preventDefault(),t.stopImmediatePropagation(),Qe=!1)});var re=class extends I{active;className;constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener($,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(D,n=>this.onDocumentPointerDown(n)),document.addEventListener($,n=>this.onDocumentPointerUp(n))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(e){F||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-sidebar, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!F&&this.active&&e.target.closest(".col-sidebar")){let n=e.target.closest("a");if(n){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substring(0,r.indexOf("#"))),n.href.substring(0,r.length)==r&&setTimeout(()=>this.setActive(!1),250)}}}};var ue=new Map,de=class{open;accordions=[];key;constructor(e,n){this.key=e,this.open=n}add(e){this.accordions.push(e),e.open=this.open,e.addEventListener("toggle",()=>{this.toggle(e.open)})}toggle(e){for(let n of this.accordions)n.open=e;S.setItem(this.key,e.toString())}},ie=class extends I{constructor(e){super(e);let n=this.el.querySelector("summary"),r=n.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)});let i=`tsd-accordion-${n.dataset.key??n.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`,s;if(ue.has(i))s=ue.get(i);else{let o=S.getItem(i),a=o?o==="true":this.el.open;s=new de(i,a),ue.set(i,s)}s.add(this.el)}};function He(t){let e=S.getItem("tsd-theme")||"os";t.value=e,Ae(e),t.addEventListener("change",()=>{S.setItem("tsd-theme",t.value),Ae(t.value)})}function Ae(t){document.documentElement.dataset.theme=t}var se;function Ne(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Re),Re())}async function Re(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let e=await R(window.navigationData);se=document.documentElement.dataset.base,se.endsWith("/")||(se+="/"),t.innerHTML="";for(let n of e)Ve(n,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Ve(t,e,n){let r=e.appendChild(document.createElement("li"));if(t.children){let i=[...n,t.text],s=r.appendChild(document.createElement("details"));s.className=t.class?`${t.class} tsd-accordion`:"tsd-accordion";let o=s.appendChild(document.createElement("summary"));o.className="tsd-accordion-summary",o.dataset.key=i.join("$"),o.innerHTML='',De(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let c=a.appendChild(document.createElement("ul"));c.className="tsd-nested-navigation";for(let l of t.children)Ve(l,c,i)}else De(t,r,t.class)}function De(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));if(r.href=se+t.path,n&&(r.className=n),location.pathname===r.pathname&&!r.href.includes("#")&&(r.classList.add("current"),r.ariaCurrent="page"),t.kind){let i=window.translations[`kind_${t.kind}`].replaceAll('"',""");r.innerHTML=``}r.appendChild(Fe(t.text,document.createElement("span")))}else{let r=e.appendChild(document.createElement("span")),i=window.translations.folder.replaceAll('"',""");r.innerHTML=``,r.appendChild(Fe(t.text,document.createElement("span")))}}function Fe(t,e){let n=t.split(/(?<=[^A-Z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|(?<=[_-])(?=[^_-])/);for(let r=0;r{let i=r.target;for(;i.parentElement&&i.parentElement.tagName!="LI";)i=i.parentElement;i.dataset.dropdown&&(i.dataset.dropdown=String(i.dataset.dropdown!=="true"))});let t=new Map,e=new Set;for(let r of document.querySelectorAll(".tsd-full-hierarchy [data-refl]")){let i=r.querySelector("ul");t.has(r.dataset.refl)?e.add(r.dataset.refl):i&&t.set(r.dataset.refl,i)}for(let r of e)n(r);function n(r){let i=t.get(r).cloneNode(!0);i.querySelectorAll("[id]").forEach(s=>{s.removeAttribute("id")}),i.querySelectorAll("[data-dropdown]").forEach(s=>{s.dataset.dropdown="false"});for(let s of document.querySelectorAll(`[data-refl="${r}"]`)){let o=gt(),a=s.querySelector("ul");s.insertBefore(o,a),o.dataset.dropdown=String(!!a),a||s.appendChild(i.cloneNode(!0))}}}function pt(){let t=document.getElementById("tsd-hierarchy-script");t&&(t.addEventListener("load",Be),Be())}async function Be(){let t=document.querySelector(".tsd-panel.tsd-hierarchy:has(h4 a)");if(!t||!window.hierarchyData)return;let e=+t.dataset.refl,n=await R(window.hierarchyData),r=t.querySelector("ul"),i=document.createElement("ul");if(i.classList.add("tsd-hierarchy"),ft(i,n,e),r.querySelectorAll("li").length==i.querySelectorAll("li").length)return;let s=document.createElement("span");s.classList.add("tsd-hierarchy-toggle"),s.textContent=window.translations.hierarchy_expand,t.querySelector("h4 a")?.insertAdjacentElement("afterend",s),s.insertAdjacentText("beforebegin",", "),s.addEventListener("click",()=>{s.textContent===window.translations.hierarchy_expand?(r.insertAdjacentElement("afterend",i),r.remove(),s.textContent=window.translations.hierarchy_collapse):(i.insertAdjacentElement("afterend",r),i.remove(),s.textContent=window.translations.hierarchy_expand)})}function ft(t,e,n){let r=e.roots.filter(i=>mt(e,i,n));for(let i of r)t.appendChild(je(e,i,n))}function je(t,e,n,r=new Set){if(r.has(e))return;r.add(e);let i=t.reflections[e],s=document.createElement("li");if(s.classList.add("tsd-hierarchy-item"),e===n){let o=s.appendChild(document.createElement("span"));o.textContent=i.name,o.classList.add("tsd-hierarchy-target")}else{for(let a of i.uniqueNameParents||[]){let c=t.reflections[a],l=s.appendChild(document.createElement("a"));l.textContent=c.name,l.href=oe+c.url,l.className=c.class+" tsd-signature-type",s.append(document.createTextNode("."))}let o=s.appendChild(document.createElement("a"));o.textContent=t.reflections[e].name,o.href=oe+i.url,o.className=i.class+" tsd-signature-type"}if(i.children){let o=s.appendChild(document.createElement("ul"));o.classList.add("tsd-hierarchy");for(let a of i.children){let c=je(t,a,n,r);c&&o.appendChild(c)}}return r.delete(e),s}function mt(t,e,n){if(e===n)return!0;let r=new Set,i=[t.reflections[e]];for(;i.length;){let s=i.pop();if(!r.has(s)){r.add(s);for(let o of s.children||[]){if(o===n)return!0;i.push(t.reflections[o])}}}return!1}function gt(){let t=document.createElementNS("http://www.w3.org/2000/svg","svg");return t.setAttribute("width","20"),t.setAttribute("height","20"),t.innerHTML='',t}X(re,"a[data-toggle]");X(ie,".tsd-accordion");X(ee,".tsd-filter-item input[type=checkbox]");var qe=document.getElementById("tsd-theme");qe&&He(qe);var yt=new Z;Object.defineProperty(window,"app",{value:yt});_e();Ne();$e();"virtualKeyboard"in navigator&&(navigator.virtualKeyboard.overlaysContent=!0);})(); +/*! Bundled license information: + +lunr/lunr.js: + (** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + *) + (*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + *) + (*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + *) + (*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + *) +*/ diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js new file mode 100644 index 0000000..b715950 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/navigation.js @@ -0,0 +1 @@ +window.navigationData = "eJytlElPwzAQhf8K8jliKSpLb6iUCgk4tFAOVQ9uPDQWtlPZDlCh/neUPXacBbXqLZl535t05i1/kYYfjUboOSQRA4U85AeUEQkCjZbFW0KVLymnAutQIg9tsQ7QCPG06cx4fRpozpCHPqkgaDRwC05ExEFiTUPRxLyviqoSCiLiNtKsNR3c7Fd7r1AdM6xU45yGzgw2VGm5K9F+2twGz5tMDxcD08Wj0CA/sP8vI8nXKs3QQqOHn6TX+meGV4an190WTu4Yxb0+D5DSid5t20wAscDnt9cXw4GFnkZYdmgWZW696jALLCle91poIHM/AI5L9lfebPEdTaaTy9hE1YaI+BocB5M+73Up7Qv7kgi9acqodixqxjGqXJtZ9SyxICGve06fH8HzzALkZjPAzMGJXXqWQDrUFEScI6F8wL4OXcdqyLqb2mBzAALE2d3IaunpQi1AqiwUm7Xzojaxd6CbQAOZMOAgdOOKZLLu8gNTrOLVmVv1keoR1ThRm6JVenDw5XpPVGk7oyxkXHJ4Pn2bAzQnVEZ31neEk9KSik390NPnRzj0cchCOU/UGtcvg9VLWw+ll2aH3Cr9/QHQ6SnC" \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js new file mode 100644 index 0000000..c11e695 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/search.js @@ -0,0 +1 @@ +window.searchData = "eJy1nF1v2zoShv+LfCvkmJ+OfbfdPe0WKIqD9pzuhREsHJtxhLXlQJLTZoP89wNKsjSjGdmU7Vy1sDUvXw4fDilaymuU7X7m0Wz+Gv0vSVfRTMZRuti6aBatknyZJdskXRS7LIqjfbaJZtF2t9pvXP4b+vbmsdhuojhabhZ57vJoFkVv8UHxtlH8F4zJG0mX7rddQXwpox9HT4vMpQUx2jYsbNPyf1yyfizc6veN2/qggU2PftbxrokPsNJRgs5kT1K+uXWSF9lLY7Bu5pjFQ8x5SZJj3Xp5XORntzyqggfnpelyj6es/N5l5xsDCld397zYJKtF4c53BxSu4s7Yo2gtimSXNm6TtHDZw2IZZLgMPXMqjqU+UVjOtDLqqp2bxCoxPZbrQbqCXah0LatyPJ0II7lxd6vGcfHydMysW51bQHDjf748uU/7RXa84eaq8xpV7DLlVt+Xj267aFp+XmTJ4p4uV0zMmZ1vbKT77b2jy2T18dH1ES4GX8vL/yqSTVLQRaAWQxcd91276ileSf4xSZPCfcXeTzY3SvKHMrDp9LHWsUC/l89p4dYDbSRNzDUc/LHLkyJ5duc4eapjL3XUrnuLdLXbEqCqj4OB+oZVDj2pVb71iQHDtQ9g0Uqhdcdn1Z9PLnUZKpP9DY6qj6p8rEHgMRu1QO9eIbS3o+bKi1v7sNtt3CINb/S+Cbi47e529mTbp/avA9r+uNktBrT8UF9+cbufh/Q3uU5f+wrCsXaPVoEBbffdupz0EHrP0ueFlpHOJP+4WBY75l4FCfIxQ0sOTMsif0mXH/bJZnV2y6NS477WCEhLT897HN5fZu6avuAgfndu5VZsYJ/ZIyEDh9CIdmlb7tK8yPbLCxoeYY2jqTrW754RTN2v3pl20lodfAVP3dH74bI82aX0Jh2oHq65bFXPk//Te9q+Vkb11Sd73PjvSfvaFfUl4W2vXfHcxFzsIMl/+Bu0z+nK/Qr3kOTlbV1SR53jAg51p+T33Q7UgvzVl1TYsgAFrjtHWq8K2cBlqKfvIU6/JPnlNjeVyBU9Jnk5tZPlFTKa5OtK612zShyfm1li9z2ye5W0vnM+L0/k+2XwcAB5qceDznWdguNMUDm5YzhaXwfWQHTit3t4yF2RD2ho1IaELgA9He0jmnroXHlJh0+eyh5pMvAQllc4cua6d0ONHIKuYaACeaiDJupMC93zVHZaVkeqHS1/xUACwDnqT+yo9yS1bpS9fOimo91uFlmSrslhV/Vx8GHXP3ebXfa9jOnbM9WK9Mrj1mt/vdvlR/erlPxjURQuo7vX482OHt2vpf/qqQk/ZoORCXb27dOHC81l6/v39fePyw0uLnOI1+5/1w6H2kryg7H3cHPGQLaGLh7DXk+DBw+Zumzc0N1ySBW4YgHIk3S9cV+S1H3Z/XTZcpG7P7Nku3WrEyWBSUmltUlStzloFZVWYH0InHqt5ytYfWeHfz09XS2r+4PWlTzjyfB1l/6+fSpevuMl7bTBJE93qfOhzWp4DT/fe8k8w2E/mu/k+RpW39dhl8yLrHbRvK7nM5yd0/5dHFUnYbPX6HA0N4vkjbqZRnH0kLjNyj9xVhmLo+VuW9/lrHbLffnfu/qyH25ZPjk1m1dX/zaO4vk4VuMbqaZ3d/H8EFx+UX5w0Gg/KQNFFM9FrG5vJkKiQEECBQqUUTyXsVI3dqxRoCSBEgWqKJ4rrkVFAhUK1FE811ygJoEaBZoonhsu0JBAgwJtFM8tF2hJoEWBkyieT7jACQmcoMDbvnG8JYG3KHAaxfNbrsUpCZxiADwPU5YAyo7owFPSM2aDGX4wQMJjIXj2KEMCQyQ8GkKywZQjgUESHg/BMigoSwLDJDwiguVQUJ4EBkp4TATLoqBMCQyV8KgIlkdBuRIYLOFxERMOLUHZEhguMe0PpnwJDJj0zAiWTUkJk5gwKXpblpQw2SlRJWEs25KpUpgw6ZmRLNuSEiYxYdIzI1m2JSVMYsKkZ0aybEtKmMSESc+MZNmWlDCJCZOeGcmyLSlhEhMmPTOSZVtSwiQmTHpmJMu2pIRJTJjyzEi23ipKmMKEKc+MZPFUlDCFCVPlKsgSpihhqrMQlishS5hi1kJMmPLMKJYwRQlTmDDlmVEsYYoSpjBhyjOj+BWcEqYwYcozo1jCFCVMYcKUZ0axhClKmMKEKc+MYglTlDCFCdOeGcUSpilhGhOmPTOKJUxTwjQmTHtmFEuYpoRpTJj2zGiWME0J053tVrnfYgnTzI4LE6Y9M5olTFPCNCZMe2Y0S5imhGlMmPbMaH6fSAnTmDB927er1RQwjQHT0769m6Z8acyX8cRofo9K+TKYL+OJ0SzZhvJlMF/GE6NZsg3ly2C+TMkXS7ahfBnMlyn5Ysk2lC/T2dKXe3qWbMPs6jFfxhNjWLIN5ctgvownxrBkG8qXwXwZj4xhyTYUMIMBM54Zw5JtKGEGE2Y9M4YlzFLCLCbMemYMfydECbOYMOuZMSxhlhJmMWHWM2NYwiwlzGLCrGfGsIRZSpjFhFnPjGUJs5Qw27lxLO8cWcIsc++ICbOeGcsSZilhFhNmPTOWJcxSwiwmzHpmLEuYpYRZTNjEM2NZwiaUsPqj8kjk2WWFqx8t8ica8CHE1+i/9ZmJbH4Hfo3kNJq9vr21ZySz1zdwTOK/861RjUmrocbhGuQpiFZSAVtqgC38NADQAxZ1mMXyV4LqyGl/ONhvBc24FTQmUBA8QwiyNwVdlUFKK/zGTasFpERYL5FUXv8K2woKARQHm8MdBRkbV7G31T86bICRcIbeL2sbAeM8OVsVjbQCwzNcMUfZBMkMkoJPGwJH0JINEirflmwVNJgNYfHdn4zBTAC9MoFumN94gaAEgmGDyP4mCxRBwsxtkGL3nSMwiCB5Imzm9z9HBwb1FoxJGB09z7sBTVAPdNjshT8jgwSCPpuw2dr5+RdomVbLhhWp7q+2QAysEzY0a83rEmBQgSkRBjH9Aa2Vs2BO2FA58k4XsAe6KcKmRMivZ8AwmHN2eAP9umDm2dCZd/oHKtAAINOGksnIgPGfhEIJn8IGkw44UqGpPFIYNFg3ddgK1H1+E4gBMHVY6a/eLwD9A35UmB+miALexBARZismAGMirE/Ns5MgM3BNDBu2w1t9wArYfoh6dyOm1b8yrDx13toD2qCYy7Bi3nkLD+w5wRjKsPSj9+qAEgBKhiUfvCsHdAAQMmxV7bz7BrQAEDKs+va8HQqyD5ZnGVYgWM2Hw1tswC6oPTKsRva8cgc0Ac0ykObm71aA5RUs+0Eiefmi0clsSpBNFTYvvDKzF9ZgrHXYWAMlVAEUQFmFoRzw7BRIJui0DZt0/Q88AVlQF+xQ270PJ4GlEdQKG0hB+YIWyCyY3CpQgizRGvTTBPaz9+4d1GkbVkv9M9Dr6g9NgKoAciPCOG7/AAtIMXAzSKR3mQcJ12EJB38ppNUBxIbtrZ6rB+KBE1hCwurm4ZF2IAISZMLSfKw2gtJYReuwqtvRpKclGuTLhM3wjibDqgIZVMOMEiwA9iYA+7s4ekqeykIRzeZ3b29/A5cwXvI="; \ No newline at end of file diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css new file mode 100644 index 0000000..44328e9 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/assets/style.css @@ -0,0 +1,1633 @@ +@layer typedoc { + :root { + --dim-toolbar-contents-height: 2.5rem; + --dim-toolbar-border-bottom-width: 1px; + --dim-header-height: calc( + var(--dim-toolbar-border-bottom-width) + + var(--dim-toolbar-contents-height) + ); + + /* 0rem For mobile; unit is required for calculation in `calc` */ + --dim-container-main-margin-y: 0rem; + + --dim-footer-height: 3.5rem; + + --modal-animation-duration: 0.2s; + } + + :root { + /* Light */ + --light-color-background: #f2f4f8; + --light-color-background-secondary: #eff0f1; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --light-color-background-active: #d6d8da; + --light-color-background-warning: #e6e600; + --light-color-warning-text: #222; + --light-color-accent: #c5c7c9; + --light-color-active-menu-item: var(--light-color-background-active); + --light-color-text: #222; + --light-color-contrast-text: #000; + --light-color-text-aside: #5e5e5e; + + --light-color-icon-background: var(--light-color-background); + --light-color-icon-text: var(--light-color-text); + + --light-color-comment-tag-text: var(--light-color-text); + --light-color-comment-tag: var(--light-color-background); + + --light-color-link: #1f70c2; + --light-color-focus-outline: #3584e4; + + --light-color-ts-keyword: #056bd6; + --light-color-ts-project: #b111c9; + --light-color-ts-module: var(--light-color-ts-project); + --light-color-ts-namespace: var(--light-color-ts-project); + --light-color-ts-enum: #7e6f15; + --light-color-ts-enum-member: var(--light-color-ts-enum); + --light-color-ts-variable: #4760ec; + --light-color-ts-function: #572be7; + --light-color-ts-class: #1f70c2; + --light-color-ts-interface: #108024; + --light-color-ts-constructor: var(--light-color-ts-class); + --light-color-ts-property: #9f5f30; + --light-color-ts-method: #be3989; + --light-color-ts-reference: #ff4d82; + --light-color-ts-call-signature: var(--light-color-ts-method); + --light-color-ts-index-signature: var(--light-color-ts-property); + --light-color-ts-constructor-signature: var( + --light-color-ts-constructor + ); + --light-color-ts-parameter: var(--light-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --light-color-ts-type-parameter: #a55c0e; + --light-color-ts-accessor: #c73c3c; + --light-color-ts-get-signature: var(--light-color-ts-accessor); + --light-color-ts-set-signature: var(--light-color-ts-accessor); + --light-color-ts-type-alias: #d51270; + /* reference not included as links will be colored with the kind that it points to */ + --light-color-document: #000000; + + --light-color-alert-note: #0969d9; + --light-color-alert-tip: #1a7f37; + --light-color-alert-important: #8250df; + --light-color-alert-warning: #9a6700; + --light-color-alert-caution: #cf222e; + + --light-external-icon: url("data:image/svg+xml;utf8,"); + --light-color-scheme: light; + } + + :root { + /* Dark */ + --dark-color-background: #2b2e33; + --dark-color-background-secondary: #1e2024; + /* Not to be confused with [:active](https://developer.mozilla.org/en-US/docs/Web/CSS/:active) */ + --dark-color-background-active: #5d5d6a; + --dark-color-background-warning: #bebe00; + --dark-color-warning-text: #222; + --dark-color-accent: #9096a2; + --dark-color-active-menu-item: var(--dark-color-background-active); + --dark-color-text: #f5f5f5; + --dark-color-contrast-text: #ffffff; + --dark-color-text-aside: #dddddd; + + --dark-color-icon-background: var(--dark-color-background-secondary); + --dark-color-icon-text: var(--dark-color-text); + + --dark-color-comment-tag-text: var(--dark-color-text); + --dark-color-comment-tag: var(--dark-color-background); + + --dark-color-link: #00aff4; + --dark-color-focus-outline: #4c97f2; + + --dark-color-ts-keyword: #3399ff; + --dark-color-ts-project: #e358ff; + --dark-color-ts-module: var(--dark-color-ts-project); + --dark-color-ts-namespace: var(--dark-color-ts-project); + --dark-color-ts-enum: #f4d93e; + --dark-color-ts-enum-member: var(--dark-color-ts-enum); + --dark-color-ts-variable: #798dff; + --dark-color-ts-function: #a280ff; + --dark-color-ts-class: #8ac4ff; + --dark-color-ts-interface: #6cff87; + --dark-color-ts-constructor: var(--dark-color-ts-class); + --dark-color-ts-property: #ff984d; + --dark-color-ts-method: #ff4db8; + --dark-color-ts-reference: #ff4d82; + --dark-color-ts-call-signature: var(--dark-color-ts-method); + --dark-color-ts-index-signature: var(--dark-color-ts-property); + --dark-color-ts-constructor-signature: var(--dark-color-ts-constructor); + --dark-color-ts-parameter: var(--dark-color-ts-variable); + /* type literal not included as links will never be generated to it */ + --dark-color-ts-type-parameter: #e07d13; + --dark-color-ts-accessor: #ff6060; + --dark-color-ts-get-signature: var(--dark-color-ts-accessor); + --dark-color-ts-set-signature: var(--dark-color-ts-accessor); + --dark-color-ts-type-alias: #ff6492; + /* reference not included as links will be colored with the kind that it points to */ + --dark-color-document: #ffffff; + + --dark-color-alert-note: #0969d9; + --dark-color-alert-tip: #1a7f37; + --dark-color-alert-important: #8250df; + --dark-color-alert-warning: #9a6700; + --dark-color-alert-caution: #cf222e; + + --dark-external-icon: url("data:image/svg+xml;utf8,"); + --dark-color-scheme: dark; + } + + @media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-background-secondary: var( + --light-color-background-secondary + ); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + + --color-icon-background: var(--light-color-icon-background); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-alert-note: var(--light-color-alert-note); + --color-alert-tip: var(--light-color-alert-tip); + --color-alert-important: var(--light-color-alert-important); + --color-alert-warning: var(--light-color-alert-warning); + --color-alert-caution: var(--light-color-alert-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + } + + @media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-background-secondary: var( + --dark-color-background-secondary + ); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + + --color-icon-background: var(--dark-color-icon-background); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-alert-note: var(--dark-color-alert-note); + --color-alert-tip: var(--dark-color-alert-tip); + --color-alert-important: var(--dark-color-alert-important); + --color-alert-warning: var(--dark-color-alert-warning); + --color-alert-caution: var(--dark-color-alert-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + } + + :root[data-theme="light"] { + --color-background: var(--light-color-background); + --color-background-secondary: var(--light-color-background-secondary); + --color-background-active: var(--light-color-background-active); + --color-background-warning: var(--light-color-background-warning); + --color-warning-text: var(--light-color-warning-text); + --color-icon-background: var(--light-color-icon-background); + --color-accent: var(--light-color-accent); + --color-active-menu-item: var(--light-color-active-menu-item); + --color-text: var(--light-color-text); + --color-contrast-text: var(--light-color-contrast-text); + --color-text-aside: var(--light-color-text-aside); + --color-icon-text: var(--light-color-icon-text); + + --color-comment-tag-text: var(--light-color-text); + --color-comment-tag: var(--light-color-background); + + --color-link: var(--light-color-link); + --color-focus-outline: var(--light-color-focus-outline); + + --color-ts-keyword: var(--light-color-ts-keyword); + --color-ts-project: var(--light-color-ts-project); + --color-ts-module: var(--light-color-ts-module); + --color-ts-namespace: var(--light-color-ts-namespace); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-enum-member: var(--light-color-ts-enum-member); + --color-ts-variable: var(--light-color-ts-variable); + --color-ts-function: var(--light-color-ts-function); + --color-ts-class: var(--light-color-ts-class); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-constructor: var(--light-color-ts-constructor); + --color-ts-property: var(--light-color-ts-property); + --color-ts-method: var(--light-color-ts-method); + --color-ts-reference: var(--light-color-ts-reference); + --color-ts-call-signature: var(--light-color-ts-call-signature); + --color-ts-index-signature: var(--light-color-ts-index-signature); + --color-ts-constructor-signature: var( + --light-color-ts-constructor-signature + ); + --color-ts-parameter: var(--light-color-ts-parameter); + --color-ts-type-parameter: var(--light-color-ts-type-parameter); + --color-ts-accessor: var(--light-color-ts-accessor); + --color-ts-get-signature: var(--light-color-ts-get-signature); + --color-ts-set-signature: var(--light-color-ts-set-signature); + --color-ts-type-alias: var(--light-color-ts-type-alias); + --color-document: var(--light-color-document); + + --color-note: var(--light-color-note); + --color-tip: var(--light-color-tip); + --color-important: var(--light-color-important); + --color-warning: var(--light-color-warning); + --color-caution: var(--light-color-caution); + + --external-icon: var(--light-external-icon); + --color-scheme: var(--light-color-scheme); + } + + :root[data-theme="dark"] { + --color-background: var(--dark-color-background); + --color-background-secondary: var(--dark-color-background-secondary); + --color-background-active: var(--dark-color-background-active); + --color-background-warning: var(--dark-color-background-warning); + --color-warning-text: var(--dark-color-warning-text); + --color-icon-background: var(--dark-color-icon-background); + --color-accent: var(--dark-color-accent); + --color-active-menu-item: var(--dark-color-active-menu-item); + --color-text: var(--dark-color-text); + --color-contrast-text: var(--dark-color-contrast-text); + --color-text-aside: var(--dark-color-text-aside); + --color-icon-text: var(--dark-color-icon-text); + + --color-comment-tag-text: var(--dark-color-text); + --color-comment-tag: var(--dark-color-background); + + --color-link: var(--dark-color-link); + --color-focus-outline: var(--dark-color-focus-outline); + + --color-ts-keyword: var(--dark-color-ts-keyword); + --color-ts-project: var(--dark-color-ts-project); + --color-ts-module: var(--dark-color-ts-module); + --color-ts-namespace: var(--dark-color-ts-namespace); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-enum-member: var(--dark-color-ts-enum-member); + --color-ts-variable: var(--dark-color-ts-variable); + --color-ts-function: var(--dark-color-ts-function); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-constructor: var(--dark-color-ts-constructor); + --color-ts-property: var(--dark-color-ts-property); + --color-ts-method: var(--dark-color-ts-method); + --color-ts-reference: var(--dark-color-ts-reference); + --color-ts-call-signature: var(--dark-color-ts-call-signature); + --color-ts-index-signature: var(--dark-color-ts-index-signature); + --color-ts-constructor-signature: var( + --dark-color-ts-constructor-signature + ); + --color-ts-parameter: var(--dark-color-ts-parameter); + --color-ts-type-parameter: var(--dark-color-ts-type-parameter); + --color-ts-accessor: var(--dark-color-ts-accessor); + --color-ts-get-signature: var(--dark-color-ts-get-signature); + --color-ts-set-signature: var(--dark-color-ts-set-signature); + --color-ts-type-alias: var(--dark-color-ts-type-alias); + --color-document: var(--dark-color-document); + + --color-note: var(--dark-color-note); + --color-tip: var(--dark-color-tip); + --color-important: var(--dark-color-important); + --color-warning: var(--dark-color-warning); + --color-caution: var(--dark-color-caution); + + --external-icon: var(--dark-external-icon); + --color-scheme: var(--dark-color-scheme); + } + + html { + color-scheme: var(--color-scheme); + @media (prefers-reduced-motion: no-preference) { + scroll-behavior: smooth; + } + } + + *:focus-visible, + .tsd-accordion-summary:focus-visible svg { + outline: 2px solid var(--color-focus-outline); + } + + .always-visible, + .always-visible .tsd-signatures { + display: inherit !important; + } + + h1, + h2, + h3, + h4, + h5, + h6 { + line-height: 1.2; + } + + h1 { + font-size: 1.875rem; + margin: 0.67rem 0; + } + + h2 { + font-size: 1.5rem; + margin: 0.83rem 0; + } + + h3 { + font-size: 1.25rem; + margin: 1rem 0; + } + + h4 { + font-size: 1.05rem; + margin: 1.33rem 0; + } + + h5 { + font-size: 1rem; + margin: 1.5rem 0; + } + + h6 { + font-size: 0.875rem; + margin: 2.33rem 0; + } + + dl, + menu, + ol, + ul { + margin: 1em 0; + } + + dd { + margin: 0 0 0 34px; + } + + .container { + max-width: 1700px; + padding: 0 2rem; + } + + /* Footer */ + footer { + border-top: 1px solid var(--color-accent); + padding-top: 1rem; + padding-bottom: 1rem; + max-height: var(--dim-footer-height); + } + footer > p { + margin: 0 1em; + } + + .container-main { + margin: var(--dim-container-main-margin-y) auto; + /* toolbar, footer, margin */ + min-height: calc( + 100svh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + } + + @keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } + } + @keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } + } + @keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } + } + @keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } + } + body { + background: var(--color-background); + font-family: + -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", + Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; + font-size: 16px; + color: var(--color-text); + margin: 0; + } + + a { + color: var(--color-link); + text-decoration: none; + } + a:hover { + text-decoration: underline; + } + a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; + } + a.tsd-anchor-link { + color: var(--color-text); + } + :target { + scroll-margin-block: calc(var(--dim-header-height) + 0.5rem); + } + + code, + pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 0.875rem; + border-radius: 0.8em; + } + + pre { + position: relative; + white-space: pre-wrap; + word-wrap: break-word; + padding: 10px; + border: 1px solid var(--color-accent); + margin-bottom: 8px; + } + pre code { + padding: 0; + font-size: 100%; + } + pre > button { + position: absolute; + top: 10px; + right: 10px; + opacity: 0; + transition: opacity 0.1s; + box-sizing: border-box; + } + pre:hover > button, + pre > button.visible, + pre > button:focus-visible { + opacity: 1; + } + + blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; + } + + img { + max-width: 100%; + } + + * { + scrollbar-width: thin; + scrollbar-color: var(--color-accent) var(--color-icon-background); + } + + *::-webkit-scrollbar { + width: 0.75rem; + } + + *::-webkit-scrollbar-track { + background: var(--color-icon-background); + } + + *::-webkit-scrollbar-thumb { + background-color: var(--color-accent); + border-radius: 999rem; + border: 0.25rem solid var(--color-icon-background); + } + + dialog { + border: none; + outline: none; + padding: 0; + background-color: var(--color-background); + } + dialog::backdrop { + display: none; + } + #tsd-overlay { + background-color: rgba(0, 0, 0, 0.5); + position: fixed; + z-index: 9999; + top: 0; + left: 0; + right: 0; + bottom: 0; + animation: fade-in var(--modal-animation-duration) forwards; + } + #tsd-overlay.closing { + animation-name: fade-out; + } + + .tsd-typography { + line-height: 1.333em; + } + .tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; + } + .tsd-typography .tsd-index-panel h3, + .tsd-index-panel .tsd-typography h3, + .tsd-typography h4, + .tsd-typography h5, + .tsd-typography h6 { + font-size: 1em; + } + .tsd-typography h5, + .tsd-typography h6 { + font-weight: normal; + } + .tsd-typography p, + .tsd-typography ul, + .tsd-typography ol { + margin: 1em 0; + } + .tsd-typography table { + border-collapse: collapse; + border: none; + } + .tsd-typography td, + .tsd-typography th { + padding: 6px 13px; + border: 1px solid var(--color-accent); + } + .tsd-typography thead, + .tsd-typography tr:nth-child(even) { + background-color: var(--color-background-secondary); + } + + .tsd-alert { + padding: 8px 16px; + margin-bottom: 16px; + border-left: 0.25em solid var(--alert-color); + } + .tsd-alert blockquote > :last-child, + .tsd-alert > :last-child { + margin-bottom: 0; + } + .tsd-alert-title { + color: var(--alert-color); + display: inline-flex; + align-items: center; + } + .tsd-alert-title span { + margin-left: 4px; + } + + .tsd-alert-note { + --alert-color: var(--color-alert-note); + } + .tsd-alert-tip { + --alert-color: var(--color-alert-tip); + } + .tsd-alert-important { + --alert-color: var(--color-alert-important); + } + .tsd-alert-warning { + --alert-color: var(--color-alert-warning); + } + .tsd-alert-caution { + --alert-color: var(--color-alert-caution); + } + + .tsd-breadcrumb { + margin: 0; + margin-top: 1rem; + padding: 0; + color: var(--color-text-aside); + } + .tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; + } + .tsd-breadcrumb a:hover { + text-decoration: underline; + } + .tsd-breadcrumb li { + display: inline; + } + .tsd-breadcrumb li:after { + content: " / "; + } + + .tsd-comment-tags { + display: flex; + flex-direction: column; + } + dl.tsd-comment-tag-group { + display: flex; + align-items: center; + overflow: hidden; + margin: 0.5em 0; + } + dl.tsd-comment-tag-group dt { + display: flex; + margin-right: 0.5em; + font-size: 0.875em; + font-weight: normal; + } + dl.tsd-comment-tag-group dd { + margin: 0; + } + code.tsd-tag { + padding: 0.25em 0.4em; + border: 0.1em solid var(--color-accent); + margin-right: 0.25em; + font-size: 70%; + } + h1 code.tsd-tag:first-of-type { + margin-left: 0.25em; + } + + dl.tsd-comment-tag-group dd:before, + dl.tsd-comment-tag-group dd:after { + content: " "; + } + dl.tsd-comment-tag-group dd pre, + dl.tsd-comment-tag-group dd:after { + clear: both; + } + dl.tsd-comment-tag-group p { + margin: 0; + } + + .tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; + } + .tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; + } + + .tsd-filter-visibility h4 { + font-size: 1rem; + padding-top: 0.75rem; + padding-bottom: 0.5rem; + margin: 0; + } + .tsd-filter-item:not(:last-child) { + margin-bottom: 0.5rem; + } + .tsd-filter-input { + display: flex; + width: -moz-fit-content; + width: fit-content; + align-items: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + } + .tsd-filter-input input[type="checkbox"] { + cursor: pointer; + position: absolute; + width: 1.5em; + height: 1.5em; + opacity: 0; + } + .tsd-filter-input input[type="checkbox"]:disabled { + pointer-events: none; + } + .tsd-filter-input svg { + cursor: pointer; + width: 1.5em; + height: 1.5em; + margin-right: 0.5em; + border-radius: 0.33em; + /* Leaving this at full opacity breaks event listeners on Firefox. + Don't remove unless you know what you're doing. */ + opacity: 0.99; + } + .tsd-filter-input input[type="checkbox"]:focus-visible + svg { + outline: 2px solid var(--color-focus-outline); + } + .tsd-checkbox-background { + fill: var(--color-accent); + } + input[type="checkbox"]:checked ~ svg .tsd-checkbox-checkmark { + stroke: var(--color-text); + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-background { + fill: var(--color-background); + stroke: var(--color-accent); + stroke-width: 0.25rem; + } + .tsd-filter-input input:disabled ~ svg > .tsd-checkbox-checkmark { + stroke: var(--color-accent); + } + + .settings-label { + font-weight: bold; + text-transform: uppercase; + display: inline-block; + } + + .tsd-filter-visibility .settings-label { + margin: 0.75rem 0 0.5rem 0; + } + + .tsd-theme-toggle .settings-label { + margin: 0.75rem 0.75rem 0 0; + } + + .tsd-hierarchy h4 label:hover span { + text-decoration: underline; + } + + .tsd-hierarchy { + list-style: square; + margin: 0; + } + .tsd-hierarchy-target { + font-weight: bold; + } + .tsd-hierarchy-toggle { + color: var(--color-link); + cursor: pointer; + } + + .tsd-full-hierarchy:not(:last-child) { + margin-bottom: 1em; + padding-bottom: 1em; + border-bottom: 1px solid var(--color-accent); + } + .tsd-full-hierarchy, + .tsd-full-hierarchy ul { + list-style: none; + margin: 0; + padding: 0; + } + .tsd-full-hierarchy ul { + padding-left: 1.5rem; + } + .tsd-full-hierarchy a { + padding: 0.25rem 0 !important; + font-size: 1rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-full-hierarchy svg[data-dropdown] { + cursor: pointer; + } + .tsd-full-hierarchy svg[data-dropdown="false"] { + transform: rotate(-90deg); + } + .tsd-full-hierarchy svg[data-dropdown="false"] ~ ul { + display: none; + } + + .tsd-panel-group.tsd-index-group { + margin-bottom: 0; + } + .tsd-index-panel .tsd-index-list { + list-style: none; + line-height: 1.333em; + margin: 0; + padding: 0.25rem 0 0 0; + overflow: hidden; + display: grid; + grid-template-columns: repeat(3, 1fr); + column-gap: 1rem; + grid-template-rows: auto; + } + @media (max-width: 1024px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(2, 1fr); + } + } + @media (max-width: 768px) { + .tsd-index-panel .tsd-index-list { + grid-template-columns: repeat(1, 1fr); + } + } + .tsd-index-panel .tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; + } + + .tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; + } + + .tsd-anchor { + position: relative; + top: -100px; + } + + .tsd-member { + position: relative; + } + .tsd-member .tsd-anchor + h3 { + display: flex; + align-items: center; + margin-top: 0; + margin-bottom: 0; + border-bottom: none; + } + + .tsd-navigation.settings { + margin: 0; + margin-bottom: 1rem; + } + .tsd-navigation > a, + .tsd-navigation .tsd-accordion-summary { + width: calc(100% - 0.25rem); + display: flex; + align-items: center; + } + .tsd-navigation a, + .tsd-navigation summary > span, + .tsd-page-navigation a { + display: flex; + width: calc(100% - 0.25rem); + align-items: center; + padding: 0.25rem; + color: var(--color-text); + text-decoration: none; + box-sizing: border-box; + } + .tsd-navigation a.current, + .tsd-page-navigation a.current { + background: var(--color-active-menu-item); + color: var(--color-contrast-text); + } + .tsd-navigation a:hover, + .tsd-page-navigation a:hover { + text-decoration: underline; + } + .tsd-navigation ul, + .tsd-page-navigation ul { + margin-top: 0; + margin-bottom: 0; + padding: 0; + list-style: none; + } + .tsd-navigation li, + .tsd-page-navigation li { + padding: 0; + max-width: 100%; + } + .tsd-navigation .tsd-nav-link { + display: none; + } + .tsd-nested-navigation { + margin-left: 3rem; + } + .tsd-nested-navigation > li > details { + margin-left: -1.5rem; + } + .tsd-small-nested-navigation { + margin-left: 1.5rem; + } + .tsd-small-nested-navigation > li > details { + margin-left: -1.5rem; + } + + .tsd-page-navigation-section > summary { + padding: 0.25rem; + } + .tsd-page-navigation-section > summary > svg { + margin-right: 0.25rem; + } + .tsd-page-navigation-section > div { + margin-left: 30px; + } + .tsd-page-navigation ul { + padding-left: 1.75rem; + } + + #tsd-sidebar-links a { + margin-top: 0; + margin-bottom: 0.5rem; + line-height: 1.25rem; + } + #tsd-sidebar-links a:last-of-type { + margin-bottom: 0; + } + + a.tsd-index-link { + padding: 0.25rem 0 !important; + font-size: 1rem; + line-height: 1.25rem; + display: inline-flex; + align-items: center; + color: var(--color-text); + } + .tsd-accordion-summary { + list-style-type: none; /* hide marker on non-safari */ + outline: none; /* broken on safari, so just hide it */ + display: flex; + align-items: center; + gap: 0.25rem; + box-sizing: border-box; + } + .tsd-accordion-summary::-webkit-details-marker { + display: none; /* hide marker on safari */ + } + .tsd-accordion-summary, + .tsd-accordion-summary a { + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; + + cursor: pointer; + } + .tsd-accordion-summary a { + width: calc(100% - 1.5rem); + } + .tsd-accordion-summary > * { + margin-top: 0; + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; + } + /* + * We need to be careful to target the arrow indicating whether the accordion + * is open, but not any other SVGs included in the details element. + */ + .tsd-accordion:not([open]) > .tsd-accordion-summary > svg:first-child { + transform: rotate(-90deg); + } + .tsd-index-content > :not(:first-child) { + margin-top: 0.75rem; + } + .tsd-index-summary { + margin-top: 1.5rem; + margin-bottom: 0.75rem; + display: flex; + align-content: center; + } + + .tsd-no-select { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + } + .tsd-kind-icon { + margin-right: 0.5rem; + width: 1.25rem; + height: 1.25rem; + min-width: 1.25rem; + min-height: 1.25rem; + } + .tsd-signature > .tsd-kind-icon { + margin-right: 0.8rem; + } + + .tsd-panel { + margin-bottom: 2.5rem; + } + .tsd-panel.tsd-member { + margin-bottom: 4rem; + } + .tsd-panel:empty { + display: none; + } + .tsd-panel > h1, + .tsd-panel > h2, + .tsd-panel > h3 { + margin: 1.5rem -1.5rem 0.75rem -1.5rem; + padding: 0 1.5rem 0.75rem 1.5rem; + } + .tsd-panel > h1.tsd-before-signature, + .tsd-panel > h2.tsd-before-signature, + .tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: none; + } + + .tsd-panel-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group { + margin: 2rem 0; + } + .tsd-panel-group.tsd-index-group details { + margin: 2rem 0; + } + .tsd-panel-group > .tsd-accordion-summary { + margin-bottom: 1rem; + } + + #tsd-search[open] { + animation: fade-in var(--modal-animation-duration) ease-out forwards; + } + #tsd-search[open].closing { + animation-name: fade-out; + } + + /* Avoid setting `display` on closed dialog */ + #tsd-search[open] { + display: flex; + flex-direction: column; + padding: 1rem; + width: 32rem; + max-width: 90vw; + max-height: calc(100vh - env(keyboard-inset-height, 0px) - 25vh); + /* Anchor dialog to top */ + margin-top: 10vh; + border-radius: 6px; + will-change: max-height; + } + #tsd-search-input { + box-sizing: border-box; + width: 100%; + padding: 0 0.625rem; /* 10px */ + outline: 0; + border: 2px solid var(--color-accent); + background-color: transparent; + color: var(--color-text); + border-radius: 4px; + height: 2.5rem; + flex: 0 0 auto; + font-size: 0.875rem; + transition: border-color 0.2s, background-color 0.2s; + } + #tsd-search-input:focus-visible { + background-color: var(--color-background-active); + border-color: transparent; + color: var(--color-contrast-text); + } + #tsd-search-input::placeholder { + color: inherit; + opacity: 0.8; + } + #tsd-search-results { + margin: 0; + padding: 0; + list-style: none; + flex: 1 1 auto; + display: flex; + flex-direction: column; + overflow-y: auto; + } + #tsd-search-results:not(:empty) { + margin-top: 0.5rem; + } + #tsd-search-results > li { + background-color: var(--color-background); + line-height: 1.5; + box-sizing: border-box; + border-radius: 4px; + } + #tsd-search-results > li:nth-child(even) { + background-color: var(--color-background-secondary); + } + #tsd-search-results > li:is(:hover, [aria-selected="true"]) { + background-color: var(--color-background-active); + color: var(--color-contrast-text); + } + /* It's important that this takes full size of parent `li`, to capture a click on `li` */ + #tsd-search-results > li > a { + display: flex; + align-items: center; + padding: 0.5rem 0.25rem; + box-sizing: border-box; + width: 100%; + } + #tsd-search-results > li > a > .text { + flex: 1 1 auto; + min-width: 0; + overflow-wrap: anywhere; + } + #tsd-search-results > li > a .parent { + color: var(--color-text-aside); + } + #tsd-search-results > li > a mark { + color: inherit; + background-color: inherit; + font-weight: bold; + } + #tsd-search-status { + flex: 1; + display: grid; + place-content: center; + text-align: center; + overflow-wrap: anywhere; + } + #tsd-search-status:not(:empty) { + min-height: 6rem; + } + + .tsd-signature { + margin: 0 0 1rem 0; + padding: 1rem 0.5rem; + border: 1px solid var(--color-accent); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; + } + + .tsd-signature-keyword { + color: var(--color-ts-keyword); + font-weight: normal; + } + + .tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; + } + + .tsd-signature-type { + font-style: italic; + font-weight: normal; + } + + .tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + list-style-type: none; + } + .tsd-signatures .tsd-signature { + margin: 0; + border-color: var(--color-accent); + border-width: 1px 0; + transition: background-color 0.1s; + } + .tsd-signatures .tsd-index-signature:not(:last-child) { + margin-bottom: 1em; + } + .tsd-signatures .tsd-index-signature .tsd-signature { + border-width: 1px; + } + .tsd-description .tsd-signatures .tsd-signature { + border-width: 1px; + } + + ul.tsd-parameter-list, + ul.tsd-type-parameter-list { + list-style: square; + margin: 0; + padding-left: 20px; + } + ul.tsd-parameter-list > li.tsd-parameter-signature, + ul.tsd-type-parameter-list > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; + } + ul.tsd-parameter-list h5, + ul.tsd-type-parameter-list h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; + } + .tsd-sources { + margin-top: 1rem; + font-size: 0.875em; + } + .tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; + } + .tsd-sources ul { + list-style: none; + padding: 0; + } + + .tsd-page-toolbar { + position: sticky; + z-index: 1; + top: 0; + left: 0; + width: 100%; + color: var(--color-text); + background: var(--color-background-secondary); + border-bottom: var(--dim-toolbar-border-bottom-width) + var(--color-accent) solid; + transition: transform 0.3s ease-in-out; + } + .tsd-page-toolbar a { + color: var(--color-text); + } + .tsd-toolbar-contents { + display: flex; + align-items: center; + height: var(--dim-toolbar-contents-height); + margin: 0 auto; + } + .tsd-toolbar-contents > .title { + font-weight: bold; + margin-right: auto; + } + #tsd-toolbar-links { + display: flex; + align-items: center; + gap: 1.5rem; + margin-right: 1rem; + } + + .tsd-widget { + box-sizing: border-box; + display: inline-block; + opacity: 0.8; + height: 2.5rem; + width: 2.5rem; + transition: opacity 0.1s, background-color 0.1s; + text-align: center; + cursor: pointer; + border: none; + background-color: transparent; + } + .tsd-widget:hover { + opacity: 0.9; + } + .tsd-widget:active { + opacity: 1; + background-color: var(--color-accent); + } + #tsd-toolbar-menu-trigger { + display: none; + } + + .tsd-member-summary-name { + display: inline-flex; + align-items: center; + padding: 0.25rem; + text-decoration: none; + } + + .tsd-anchor-icon { + display: inline-flex; + align-items: center; + margin-left: 0.5rem; + color: var(--color-text); + vertical-align: middle; + } + + .tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; + } + + .tsd-member-summary-name:hover > .tsd-anchor-icon svg, + .tsd-anchor-link:hover > .tsd-anchor-icon svg, + .tsd-anchor-icon:focus-visible svg { + visibility: visible; + } + + .deprecated { + text-decoration: line-through !important; + } + + .warning { + padding: 1rem; + color: var(--color-warning-text); + background: var(--color-background-warning); + } + + .tsd-kind-project { + color: var(--color-ts-project); + } + .tsd-kind-module { + color: var(--color-ts-module); + } + .tsd-kind-namespace { + color: var(--color-ts-namespace); + } + .tsd-kind-enum { + color: var(--color-ts-enum); + } + .tsd-kind-enum-member { + color: var(--color-ts-enum-member); + } + .tsd-kind-variable { + color: var(--color-ts-variable); + } + .tsd-kind-function { + color: var(--color-ts-function); + } + .tsd-kind-class { + color: var(--color-ts-class); + } + .tsd-kind-interface { + color: var(--color-ts-interface); + } + .tsd-kind-constructor { + color: var(--color-ts-constructor); + } + .tsd-kind-property { + color: var(--color-ts-property); + } + .tsd-kind-method { + color: var(--color-ts-method); + } + .tsd-kind-reference { + color: var(--color-ts-reference); + } + .tsd-kind-call-signature { + color: var(--color-ts-call-signature); + } + .tsd-kind-index-signature { + color: var(--color-ts-index-signature); + } + .tsd-kind-constructor-signature { + color: var(--color-ts-constructor-signature); + } + .tsd-kind-parameter { + color: var(--color-ts-parameter); + } + .tsd-kind-type-parameter { + color: var(--color-ts-type-parameter); + } + .tsd-kind-accessor { + color: var(--color-ts-accessor); + } + .tsd-kind-get-signature { + color: var(--color-ts-get-signature); + } + .tsd-kind-set-signature { + color: var(--color-ts-set-signature); + } + .tsd-kind-type-alias { + color: var(--color-ts-type-alias); + } + + /* if we have a kind icon, don't color the text by kind */ + .tsd-kind-icon ~ span { + color: var(--color-text); + } + + /* mobile */ + @media (max-width: 769px) { + #tsd-toolbar-menu-trigger { + display: inline-block; + /* temporary fix to vertically align, for compatibility */ + line-height: 2.5; + } + #tsd-toolbar-links { + display: none; + } + + .container-main { + display: flex; + } + .col-content { + float: none; + max-width: 100%; + width: 100%; + } + .col-sidebar { + position: fixed !important; + overflow-y: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + padding: 1.5rem 1.5rem 0 0; + width: 75vw; + visibility: hidden; + background-color: var(--color-background); + transform: translate(100%, 0); + } + .col-sidebar > *:last-child { + padding-bottom: 20px; + } + .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu .col-sidebar { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu .col-sidebar { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu .col-sidebar { + visibility: visible; + transform: translate(0, 0); + display: flex; + flex-direction: column; + gap: 1.5rem; + max-height: 100vh; + padding: 1rem 2rem; + } + .has-menu .tsd-navigation { + max-height: 100%; + } + .tsd-navigation .tsd-nav-link { + display: flex; + } + } + + /* one sidebar */ + @media (min-width: 770px) { + .container-main { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(0, 2fr); + grid-template-areas: "sidebar content"; + --dim-container-main-margin-y: 2rem; + } + + .tsd-breadcrumb { + margin-top: 0; + } + + .col-sidebar { + grid-area: sidebar; + } + .col-content { + grid-area: content; + padding: 0 1rem; + } + } + @media (min-width: 770px) and (max-width: 1399px) { + .col-sidebar { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + .site-menu { + margin-top: 1rem; + } + } + + /* two sidebars */ + @media (min-width: 1200px) { + .container-main { + grid-template-columns: + minmax(0, 1fr) minmax(0, 2.5fr) minmax( + 0, + 20rem + ); + grid-template-areas: "sidebar content toc"; + } + + .col-sidebar { + display: contents; + } + + .page-menu { + grid-area: toc; + padding-left: 1rem; + } + .site-menu { + grid-area: sidebar; + } + + .site-menu { + margin-top: 0rem; + } + + .page-menu, + .site-menu { + max-height: calc( + 100vh - var(--dim-header-height) - var(--dim-footer-height) - + 2 * var(--dim-container-main-margin-y) + ); + overflow: auto; + position: sticky; + top: calc( + var(--dim-header-height) + var(--dim-container-main-margin-y) + ); + } + } +} diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html new file mode 100644 index 0000000..c119b1f --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html @@ -0,0 +1,30 @@ +DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.1

              Class DiscriminatorRegistry

              Static registry for managing discriminators and their associated type guards. +Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

              +

              0.1.0

              +
              Index

              Methods

              Methods

              • Checks if a discriminator is already registered.

                +

                Parameters

                • discriminator: string

                  The discriminator value to check.

                  +

                Returns boolean

                  +
                • true if the discriminator is registered, false otherwise.
                • +
                +

                0.1.0

                +
              • Validates an input against a specific discriminator.

                +

                Parameters

                • input: unknown

                  The input to validate.

                  +
                • discriminator: string

                  The discriminator value to check.

                  +

                Returns boolean

                  +
                • true if the input matches the type associated with the discriminator, false otherwise.
                • +
                +

                0.1.0

                +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html new file mode 100644 index 0000000..717d948 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html @@ -0,0 +1,18 @@ +NumberUtility | @blwatkins/utils - v0.1.0-alpha.1

              Class NumberUtility

              Static properties and methods for validating number types.

              +

              0.1.0

              +
              Index

              Methods

              • Is the given input a finite number?

                +

                Parameters

                • input: unknown

                Returns input is number

                true when the input is a finite number; false otherwise.

                +

                0.1.0

                +
              • Is the given input an integer?

                +

                Parameters

                • input: unknown

                Returns input is number

                true when the input is an integer; false otherwise.

                +

                0.1.0

                +
              • Is the given input a positive integer?

                +

                Parameters

                • input: unknown
                • zeroInclusive: boolean = false

                  true if zero should be considered a valid input. +false if zero should be considered an invalid input. +Default value is false.

                  +

                Returns input is number

                true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

                +

                0.1.0

                +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.Random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.Random.html new file mode 100644 index 0000000..6da6555 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.Random.html @@ -0,0 +1,58 @@ +Random | @blwatkins/utils - v0.1.0-alpha.1

              Class Random

              Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays.

              +

              0.1.0

              +
              Index

              Accessors

              • set randomNumberGenerator(rng: () => number): void

                Set the primary function used to generate random numbers.

                +

                Parameters

                • rng: () => number

                  A function that returns a random number in the range [0, 1) (zero inclusive, one exclusive).

                  +

                Returns void

                  +
                • If the given random number generator is not a function.
                • +
                +

                0.1.0

                +

              Methods

              • Returns number

                A random number in the range [0, 1) (zero inclusive, one exclusive).

                +

                0.1.0

                +
              • Parameters

                • chanceOfTrue: number = 0.5

                  The probability of returning true (between 0 and 1).

                  +

                Returns boolean

                A random boolean value.

                +

                0.1.0

                +
              • Type Parameters

                • Type

                Parameters

                • elements: Type[]

                  An array of elements to choose from.

                  +

                Returns Type

                A random element from the array.

                +

                0.1.0

                +
              • Parameters

                • min: number

                  The minimum value (inclusive).

                  +
                • max: number

                  The maximum value (exclusive).

                  +

                Returns number

                A random floating-point number in the range [min, max) (min inclusive, max exclusive).

                +

                When min is not a finite number.

                +

                When max is not a finite number.

                +

                When min is not less than or equal max.

                +

                0.1.0

                +
              • Parameters

                • min: number

                  The minimum value (inclusive).

                  +
                • max: number

                  The maximum value (exclusive).

                  +

                Returns number

                A random integer in the range [min, max) (min inclusive, max exclusive).

                +

                When min is not a finite number.

                +

                When max is not a finite number.

                +

                When min is not less than or equal max.

                +

                0.1.0

                +
              • Parameters

                • min: number

                  The minimum value (inclusive).

                  +
                • max: number

                  The maximum value (exclusive).

                  +

                Returns number

                A random integer in the range [min, max) (min inclusive, max exclusive).

                +

                When min is not a finite number.

                +

                When max is not a finite number.

                +

                When min is not less than or equal max.

                +

                0.1.0

                +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html new file mode 100644 index 0000000..4489b5b --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html @@ -0,0 +1,39 @@ +RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.1

              Class RandomNumberGeneratorFactory

              A static factory class for creating a SeededRandomNumberGenerator object.

              +

              0.1.0

              +
              Index

              Methods

              Methods

              • Build a SeededRandomNumberGenerator object with the given seed and namespace from an asynchronous hashing algorithm.

                +

                Parameters

                • seed: string

                  The primary input to determine the random number sequence.

                  +
                • Optionalnamespace: string

                  Namespace to create different sequences from the same seed.

                  +

                Returns Promise<SeededRandomNumberGenerator>

                This method relies on the Web Crypto API via crypto.subtle. +In Node.js environments, ensure you are using a version where the Web Crypto API is available.

                +
                  +
                • When the given seed is not a string.
                • +
                +
                  +
                • When the given namespace is not a string.
                • +
                +

                0.1.0

                +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html new file mode 100644 index 0000000..27d8db8 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html @@ -0,0 +1,23 @@ +SeedVersions | @blwatkins/utils - v0.1.0-alpha.1

              Class SeedVersions

              A static class for accessing different seed versions. +Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

              +

              0.1.0

              +
              Index

              Accessors

              Methods

              Accessors

              Methods

              • Is the given index a valid seed version?

                +

                Parameters

                • index: number

                  The index to check.

                  +

                Returns boolean

                0.1.0

                +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html new file mode 100644 index 0000000..63435df --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html @@ -0,0 +1,18 @@ +SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.1

              Class SeededRandomNumberGenerator

              Deterministic seeded pseudorandom number generator. +This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

              +

              0.1.0

              +
              Index

              Constructors

              Methods

              Constructors

              • Parameters

                • state: [number, number, number, number]

                  Initial 128-bit state. +Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

                  +

                Returns SeededRandomNumberGenerator

                If state is not an array with 4 elements.

                +

                If each element of state is not a 32-bit unsigned integer.

                +

                If state does not have at least one element that is greater than 0.

                +

                0.1.0

                +

              Methods

              • Returns number

                  +
                • The next pseudorandom float in the range [0, 1).
                • +
                +

                This method advances the internal 128-bit xoshiro128** state by one step. +Successive calls produce an independent, uniformly distributed sequence.

                +

                0.1.0

                +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.WeightedElementUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.WeightedElementUtility.html new file mode 100644 index 0000000..97c0b73 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.WeightedElementUtility.html @@ -0,0 +1,83 @@ +WeightedElementUtility | @blwatkins/utils - v0.1.0-alpha.1

              Class WeightedElementUtility

              Static methods and properties for building and validating WeightedElement and WeightedList objects.

              +

              0.1.0

              +
              Index

              Methods

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html new file mode 100644 index 0000000..8c4e363 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html @@ -0,0 +1,27 @@ +ColorStringUtility | @blwatkins/utils - v0.1.0-alpha.1

              Class ColorStringUtility

              Static properties and methods for validating formatted color strings.

              +

              0.1.0

              +
              Index

              Accessors

              • get hexColorPattern(): RegExp

                Returns RegExp

                Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

                +

                0.1.0

                +
              • get hexColorPatternRGB(): RegExp

                Returns RegExp

                Regular expression pattern for validating hex color strings in the format #RRGGBB. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

                +

                0.1.0

                +
              • get hexColorPatternRGBA(): RegExp

                Returns RegExp

                Regular expression pattern for validating hex color strings in the format #RRGGBBAA. +Case must be consistent in hex color strings: either all lowercase or all uppercase.

                +

                0.1.0

                +

              Methods

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html new file mode 100644 index 0000000..ec4d763 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html @@ -0,0 +1,34 @@ +StringUtility | @blwatkins/utils - v0.1.0-alpha.1

              Class StringUtility

              Static properties and methods for validating string types.

              +

              0.1.0

              +
              Index

              Accessors

              • get singleLineLowercaseTrimmedPattern(): RegExp

                Returns RegExp

                Regular expression pattern for validating single-line lowercase strings.

                +

                This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

                +

                0.1.0

                +
              • get singleLineTrimmedPattern(): RegExp

                Returns RegExp

                Regular expression pattern for validating single-line mixed-case strings.

                +

                This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

                +

                0.1.0

                +
              • get singleLineUppercaseTrimmedPattern(): RegExp

                Returns RegExp

                Regular expression pattern for validating single-line uppercase strings.

                +

                This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

                +

                0.1.0

                +

              Methods

              • Is the given input a non-empty string? +Non-empty strings must contain at least one non-whitespace character.

                +

                Parameters

                • input: unknown

                Returns input is string

                0.1.0

                +
              • Is the given input a string?

                +

                Parameters

                • input: unknown

                Returns input is string

                0.1.0

                +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/enums/discriminator.Discriminators.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/enums/discriminator.Discriminators.html new file mode 100644 index 0000000..d545d5d --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/enums/discriminator.Discriminators.html @@ -0,0 +1,6 @@ +Discriminators | @blwatkins/utils - v0.1.0-alpha.1

              Enumeration Discriminators

              Valid discriminators for package types and interfaces.

              +

              0.1.0

              +
              Index

              Enumeration Members

              Enumeration Members

              WeightedElement: "@blwat/utils:WeightedElement"

              Discriminator value for the WeightedElement interface.

              +

              0.1.0

              +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html new file mode 100644 index 0000000..4e2ccdc --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/hierarchy.html @@ -0,0 +1 @@ +@blwatkins/utils - v0.1.0-alpha.1

              @blwatkins/utils - v0.1.0-alpha.1

              Hierarchy Summary

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html new file mode 100644 index 0000000..a99f1d4 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html @@ -0,0 +1,59 @@ +@blwatkins/utils - v0.1.0-alpha.1

              @blwatkins/utils - v0.1.0-alpha.1

              TypeScript Utilities

              +

              A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utilities for everyday development.

              + + + +

              The source code of this project is licensed under the MIT License. +The full text of the license is included with the project source code.

              + + +

              npm License +npm Version +npm @alpha Version +npm Types +npm Node Version +npm Weekly Downloads +npm Total Downloads +npm Last Update +npm Unpacked Size

              + +

              Socket Score

              + +

              Bundlephobia Tree Shaking +Bundlephobia Dependency Count +Bundlephobia Minified +Bundlephobia Minified + gzip

              + +

              Package Phobia Install Size +Package Phobia Publish Size

              + +

              GitHub License +GitHub Dependabot +GitHub Latest Release +GitHub Releases +GitHub Last Commit +GitHub Commits +GitHub Commit Activity +GitHub Code Size in Bytes +GitHub Repo Size +GitHub Repo File or Directory Count +GitHub Language Count

              + +

              CodeQL +npm Lint, Build, and Test +Deploy GitHub Pages with Jekyll

              + + + +

              A huge thank you to all the open source contributors who have made this project possible by creating and maintaining the libraries and tools used in this project, and to the open source community for fostering collaboration and innovation.

              +

              A special thank you to all the educators, mentors, and content creators who have shared their knowledge and expertise in the fields of algorithmic art, web development, and computer science. +Thank you for giving me the tools, resources, opportunities, support, and inspiration to learn and grow as a developer.

              +
              +

              Copyright © 2024-2026 Brittni Watkins.

              +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html new file mode 100644 index 0000000..55bcecc --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/discriminator.DiscriminatorRegistration.html @@ -0,0 +1,14 @@ +DiscriminatorRegistration | @blwatkins/utils - v0.1.0-alpha.1

              Interface DiscriminatorRegistration

              A registration for a discriminator to the DiscriminatorRegistry.

              +

              0.1.0

              +
              interface DiscriminatorRegistration {
                  discriminator: string;
                  validator: (input: unknown) => boolean;
              }
              Index

              Properties

              discriminator: string

              The discriminator value that identifies the type of a Discriminated object. +This value must be unique across all registered discriminators.

              +

              0.1.0

              +
              validator: (input: unknown) => boolean

              A method that validates whether an input matches the type associated with the discriminator.

              +

              Type Declaration

                • (input: unknown): boolean
                • Parameters

                  • input: unknown

                    The input to validate.

                    +

                  Returns boolean

                    +
                  • true if the input matches the type associated with the discriminator, false otherwise.
                  • +
                  +

              0.1.0

              +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html new file mode 100644 index 0000000..d0ec403 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.SeedVersion.html @@ -0,0 +1,8 @@ +SeedVersion | @blwatkins/utils - v0.1.0-alpha.1

              Interface SeedVersion

              A seed version defines a specific set of offsets for the FNV-1a hashing algorithm. +A different set of offsets results in a different hash for the same input, which results in a different initial state for the seeded random number generator, which results in a different sequence of pseudorandom numbers.

              +

              0.1.0

              +
              interface SeedVersion {
                  offsets: readonly [number, number, number, number];
              }
              Index

              Properties

              Properties

              offsets: readonly [number, number, number, number]

              A collection of offset values for the FNV-1a hashing algorithm. +Each offset value should be a 32-bit unsigned integer.

              +

              0.1.0

              +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.WeightedElement.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.WeightedElement.html new file mode 100644 index 0000000..e731166 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/interfaces/random.WeightedElement.html @@ -0,0 +1,13 @@ +WeightedElement | @blwatkins/utils - v0.1.0-alpha.1

              Interface WeightedElement<Type>

              Interface for a weighted element, which can be used for non-uniform random selection from a list.

              +

              0.1.0

              +
              interface WeightedElement<Type> {
                  discriminator: WeightedElement;
                  value: Type;
                  weight: number;
              }

              Type Parameters

              • Type
              Index

              Properties

              Properties

              discriminator: WeightedElement

              The discriminator for the weighted element.

              +

              0.1.0

              +
              value: Type

              The value to be selected from the weighted list.

              +

              0.1.0

              +
              weight: number

              The probability weight of the element. +Should be a number between 0 and 1, inclusive.

              +

              0.1.0

              +

              Generated using TypeDoc


              Copyright © 2024-2026 Brittni Watkins.

              diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html new file mode 100644 index 0000000..33fa2cd --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules.html @@ -0,0 +1 @@ +@blwatkins/utils - v0.1.0-alpha.1

                @blwatkins/utils - v0.1.0-alpha.1

                Modules

                discriminator
                number
                random
                string

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html new file mode 100644 index 0000000..16b131f --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/discriminator.html @@ -0,0 +1 @@ +discriminator | @blwatkins/utils - v0.1.0-alpha.1

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html new file mode 100644 index 0000000..c8bb1d4 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/number.html @@ -0,0 +1 @@ +number | @blwatkins/utils - v0.1.0-alpha.1

                Module number

                Classes

                NumberUtility

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html new file mode 100644 index 0000000..132cc35 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/random.html @@ -0,0 +1 @@ +random | @blwatkins/utils - v0.1.0-alpha.1

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html new file mode 100644 index 0000000..a92cba6 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/modules/string.html @@ -0,0 +1 @@ +string | @blwatkins/utils - v0.1.0-alpha.1

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html new file mode 100644 index 0000000..08f5eca --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.Discriminated.html @@ -0,0 +1,3 @@ +Discriminated | @blwatkins/utils - v0.1.0-alpha.1

                Type Alias Discriminated

                Discriminated: Static<typeof discriminatedSchema>

                Discriminated objects can be type checked using the discriminator registry.

                +

                0.1.0

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html new file mode 100644 index 0000000..e5b59f4 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/discriminator.TypeGuard.html @@ -0,0 +1,3 @@ +TypeGuard | @blwatkins/utils - v0.1.0-alpha.1

                Type Alias TypeGuard<T>

                TypeGuard: (input: unknown) => input is T

                A type guard function that checks if an input is of a specific Discriminated type.

                +

                Type Parameters

                Type Declaration

                  • (input: unknown): input is T
                  • Parameters

                    • input: unknown

                    Returns input is T

                0.1.0

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/random.WeightedList.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/random.WeightedList.html new file mode 100644 index 0000000..c72f50c --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/types/random.WeightedList.html @@ -0,0 +1,4 @@ +WeightedList | @blwatkins/utils - v0.1.0-alpha.1

                Type Alias WeightedList<Type>

                WeightedList: WeightedElement<Type>[]

                Type alias for a list of WeightedElement objects.

                +

                Type Parameters

                • Type

                0.1.0

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html new file mode 100644 index 0000000..a774be6 --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/discriminator.discriminatedSchema.html @@ -0,0 +1,3 @@ +discriminatedSchema | @blwatkins/utils - v0.1.0-alpha.1

                Variable discriminatedSchemaConst

                discriminatedSchema: TObject<{ discriminator: TReadonly<TString> }> = ...

                TypeBox schema for validating that an object implements the Discriminated type.

                +

                0.1.0

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/random.weightedElementSchema.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/random.weightedElementSchema.html new file mode 100644 index 0000000..f89b39c --- /dev/null +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/variables/random.weightedElementSchema.html @@ -0,0 +1,3 @@ +weightedElementSchema | @blwatkins/utils - v0.1.0-alpha.1

                Variable weightedElementSchemaConst

                weightedElementSchema: TGeneric<
                    [TParameter<"T", TUnknown, TUnknown>],
                    TIntersect<
                        [
                            TObject<{ discriminator: TReadonly<TString> }>,
                            TObject<
                                {
                                    discriminator: TLiteral<WeightedElement>;
                                    value: TReadonly<TRef<"T">>;
                                    weight: TReadonly<TNumber>;
                                },
                            >,
                        ],
                    >,
                > = ...

                TypeBox schema to validate a WeightedElement object.

                +

                0.1.0

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                From 4a6748a3a1bd131cebaee33e76109b6a7eb3274b Mon Sep 17 00:00:00 2001 From: blwatkins Date: Sun, 5 Jul 2026 12:52:28 -0500 Subject: [PATCH 077/122] Update portfolio-skills.md --- docs/portfolio-skills.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/portfolio-skills.md b/docs/portfolio-skills.md index d0f8502..da2ff6b 100644 --- a/docs/portfolio-skills.md +++ b/docs/portfolio-skills.md @@ -5,7 +5,7 @@ author: - GitHub Copilot layout: post date: 2026-05-27 -modified_date: 2026-06-29 +modified_date: 2026-07-05 toc: true --- @@ -22,7 +22,7 @@ TypeScript Utilities (`@blwatkins/utils`) is a growing, domain-agnostic utility - **Project Type:** TypeScript utility library package - **Primary Language:** TypeScript - **Primary Runtime:** Node.js -- **Build Pipeline:** tsdown (ESM) +- **Build Pipeline:** tsdown - **Quality Controls:** ESLint - **Automation:** GitHub Actions - **Dependency Automation:** Dependabot From 5de0288bee91626d90276c76109beebe514fc96c Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 6 Jul 2026 22:19:03 -0500 Subject: [PATCH 078/122] Add new unit tests to random.test.ts --- test/random/random.test.ts | 248 +++++++++++++++++++++++++++++++++++-- 1 file changed, 235 insertions(+), 13 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 9f84ab1..b3d7cbe 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -20,10 +20,10 @@ import { describe, test, afterEach, expect, expectTypeOf } from 'vitest'; -import {Random, WeightedElementUtility, WeightedList} from '../../src'; +import { Random, WeightedElementUtility, WeightedList } from '../../src'; describe('Random', (): void => { - const testRepeatTotal: number = 20; + const testRepeatTotal: number = 25; afterEach((): void => { Random.randomNumberGenerator = Math.random; @@ -212,7 +212,7 @@ describe('Random', (): void => { { min: -0.75, max: -0.5 }, { min: -100, max: 100 }, { min: -0.5, max: 0.5 } - ])('randomFloat($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { + ])('%# - randomFloat($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { const numbers: number[] = []; for (let i: number = 0; i < testRepeatTotal; i++) { @@ -232,7 +232,7 @@ describe('Random', (): void => { { min: -10, max: -10 }, { min: 0.5, max: 0.5 }, { min: -0.5, max: -0.5 } - ])('randomFloat($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + ])('%# - randomFloat($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { const numbers: number[] = []; for (let i: number = 0; i < testRepeatTotal; i++) { @@ -257,7 +257,7 @@ describe('Random', (): void => { { min: -50, max: 0 }, { min: -500, max: -100 }, { min: -100, max: 100 } - ])('randomInt($min, $max) and randomInteger($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { + ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return a number between $min and $max', ({ min, max }: { min: number; max: number; }): void => { const intNumbers: number[] = []; const integerNumbers: number[] = []; @@ -286,7 +286,7 @@ describe('Random', (): void => { { min: -3.75, max: -0.5 }, { min: -100.777, max: 100.222 }, { min: -0.5, max: 0.5 } - ])('randomInt($min, $max) and randomInteger($min, $max) should return a number between Math.floor($min) and Math.floor($max)', ({ min, max }: { min: number; max: number; }): void => { + ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return a number between Math.floor($min) and Math.floor($max)', ({ min, max }: { min: number; max: number; }): void => { const intNumbers: number[] = []; const integerNumbers: number[] = []; @@ -307,7 +307,7 @@ describe('Random', (): void => { { min: -1, max: -1 }, { min: 10, max: 10 }, { min: -10, max: -10 }, - ])('randomInt($min, $max) and randomInteger($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { + ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { const intNumbers: number[] = []; const integerNumbers: number[] = []; @@ -328,7 +328,7 @@ describe('Random', (): void => { { min: -10.5, max: -10.5 }, { min: 0.5, max: 0.5 }, { min: -0.5, max: -0.5 } - ])('randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { + ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { const intNumbers: number[] = []; const integerNumbers: number[] = []; @@ -350,7 +350,7 @@ describe('Random', (): void => { { min: -10.4, max: -10.25 }, { min: 0.5, max: 0.75 }, { min: -0.99, max: -0.999 } - ])('randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { + ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { const intNumbers: number[] = []; const integerNumbers: number[] = []; @@ -428,7 +428,7 @@ describe('Random', (): void => { input: ['hello'], type: 'string' } - ])('randomElement($input) should return an element from ($input)', ({ input, type }: { input: unknown[]; type: string }): void => { + ])('%# - randomElement($input) should return an element from ($input)', ({ input, type }: { input: unknown[]; type: string }): void => { const selected: unknown[] = []; const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); @@ -502,7 +502,7 @@ describe('Random', (): void => { ], type: 'string' } - ])('randomWeightedElement($input) should return an element from ($input)', ({ input, type }: { input: { value: unknown; weight: number }[]; type: string }): void => { + ])('%# - randomWeightedElement($input) should return an element from ($input)', ({ input, type }: { input: { value: unknown; weight: number }[]; type: string }): void => { const selected: unknown[] = []; const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); @@ -579,9 +579,9 @@ describe('Random', (): void => { expected: ['it', 'was', 'best'], type: 'string' } - ])('randomWeightedElement should not return an element from ($input) if the weight is zero', ({ input, expected, type }: { input: { value: unknown; weight: number }[]; expected: unknown[]; type: string }): void => { + ])('%# - randomWeightedElement should not return an element from ($input) if the weight is zero', ({ input, expected, type }: { input: { value: unknown; weight: number }[]; expected: unknown[]; type: string }): void => { const selected: unknown[] = []; - const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); + const repeatTotal: number = Math.max(testRepeatTotal, input.length * 10); const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); for (let i: number = 0; i < repeatTotal; i++) { @@ -592,6 +592,228 @@ describe('Random', (): void => { }); }); + describe('randomWeightedElement should return elements[0] if the rng function returns a negative number', (): void => { + test.each([ + { + input: [ + { value: 1, weight: 0.25 }, + { value: 2, weight: 0.25 }, + { value: 3, weight: 0.25 }, + { value: 4, weight: 0.25 } + ] + }, + { + input: [ + { value: 1, weight: 0.5 }, + { value: 2, weight: 0.2 }, + { value: 3, weight: 0.2 }, + { value: 4, weight: 0.1 } + ] + }, + { + input: [ + { value: 1.1, weight: 0.25 }, + { value: 2.2, weight: 0.25 }, + { value: 3.3, weight: 0.25 }, + { value: 4.4, weight: 0.25 } + ] + }, + { + input: [ + { value: 1, weight: 1 } + ] + }, + { + input: [ + { value: 'it', weight: 0.25 }, + { value: 'was', weight: 0.25 }, + { value: 'the', weight: 0.25 }, + { value: 'best', weight: 0.25 } + ] + }, + { + input: [ + { value: 'see', weight: 0.33 }, + { value: 'spot', weight: 0.33 }, + { value: 'run', weight: 0.34 } + ] + }, + { + input: [ + { value: 'hello', weight: 1 } + ] + }, + { + input: [ + { value: 1, weight: 0.25 }, + { value: 2, weight: 0 }, + { value: 3, weight: 0.25 }, + { value: 4, weight: 0.25 }, + { value: 5, weight: 0.25 } + ] + }, + { + input: [ + { value: 1, weight: 0.5 }, + { value: 2, weight: 0 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0.2 } + ] + }, + { + input: [ + { value: 1, weight: 0 }, + { value: 2, weight: 0.3 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0.4 } + ] + }, + { + input: [ + { value: 1, weight: 0.4 }, + { value: 2, weight: 0.3 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0 } + ] + }, + { + input: [ + { value: 1.1, weight: 0 }, + { value: 2.2, weight: 0.25 }, + { value: 3.3, weight: 0.25 }, + { value: 4.4, weight: 0.5 } + ] + }, + { + input: [ + { value: 'it', weight: 0.2 }, + { value: 'was', weight: 0.4 }, + { value: 'the', weight: 0 }, + { value: 'best', weight: 0.4 } + ] + } + ])('%# - randomWeightedElement($input) should return elements[0] if the rng function returns a negative number', ({ input }: { input: { value: unknown; weight: number }[] }): void => { + Random.randomNumberGenerator = (): number => { + return -0.1; + } + + const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); + const selected: unknown = Random.randomWeightedElement(weightedElements); + expect(selected).toBe(input[0].value); + }); + }); + + describe('randomWeightedElement should return elements[length - 1] if the rng function returns a number greater than 1', (): void => { + test.each([ + { + input: [ + { value: 1, weight: 0.25 }, + { value: 2, weight: 0.25 }, + { value: 3, weight: 0.25 }, + { value: 4, weight: 0.25 } + ] + }, + { + input: [ + { value: 1, weight: 0.5 }, + { value: 2, weight: 0.2 }, + { value: 3, weight: 0.2 }, + { value: 4, weight: 0.1 } + ] + }, + { + input: [ + { value: 1.1, weight: 0.25 }, + { value: 2.2, weight: 0.25 }, + { value: 3.3, weight: 0.25 }, + { value: 4.4, weight: 0.25 } + ] + }, + { + input: [ + { value: 1, weight: 1 } + ] + }, + { + input: [ + { value: 'it', weight: 0.25 }, + { value: 'was', weight: 0.25 }, + { value: 'the', weight: 0.25 }, + { value: 'best', weight: 0.25 } + ] + }, + { + input: [ + { value: 'see', weight: 0.33 }, + { value: 'spot', weight: 0.33 }, + { value: 'run', weight: 0.34 } + ] + }, + { + input: [ + { value: 'hello', weight: 1 } + ] + }, + { + input: [ + { value: 1, weight: 0.25 }, + { value: 2, weight: 0 }, + { value: 3, weight: 0.25 }, + { value: 4, weight: 0.25 }, + { value: 5, weight: 0.25 } + ] + }, + { + input: [ + { value: 1, weight: 0.5 }, + { value: 2, weight: 0 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0.2 } + ] + }, + { + input: [ + { value: 1, weight: 0 }, + { value: 2, weight: 0.3 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0.4 } + ] + }, + { + input: [ + { value: 1, weight: 0.4 }, + { value: 2, weight: 0.3 }, + { value: 3, weight: 0.3 }, + { value: 4, weight: 0 } + ] + }, + { + input: [ + { value: 1.1, weight: 0 }, + { value: 2.2, weight: 0.25 }, + { value: 3.3, weight: 0.25 }, + { value: 4.4, weight: 0.5 } + ] + }, + { + input: [ + { value: 'it', weight: 0.2 }, + { value: 'was', weight: 0.4 }, + { value: 'the', weight: 0 }, + { value: 'best', weight: 0.4 } + ] + } + ])('%# - randomWeightedElement($input) should return elements[length - 1] if the rng function returns a number greater than 1', ({ input }: { input: { value: unknown; weight: number }[] }): void => { + Random.randomNumberGenerator = (): number => { + return 1.1; + } + + const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); + const selected: unknown = Random.randomWeightedElement(weightedElements); + expect(selected).toBe(input[input.length - 1].value); + }); + }); + test.todo('Input validation'); }); }); From 02a3b0b03dafaa422cc03b93783ced111a92d830 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 6 Jul 2026 22:19:12 -0500 Subject: [PATCH 079/122] Update test names in weighted-element-utility.test.ts --- .../weighted-element-utility.test.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/random/weighted-element/weighted-element-utility.test.ts b/test/random/weighted-element/weighted-element-utility.test.ts index 8742a94..2b513bf 100644 --- a/test/random/weighted-element/weighted-element-utility.test.ts +++ b/test/random/weighted-element/weighted-element-utility.test.ts @@ -142,7 +142,7 @@ describe('WeightedElementUtility', (): void => { test.each( testCases - )('Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect((): void => { WeightedElementUtility.buildWeightedElement(testInput as { value: unknown; weight: number; }); }).toThrow(testExpected); @@ -250,7 +250,7 @@ describe('WeightedElementUtility', (): void => { test.each( testCases - )('Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect((): void => { WeightedElementUtility.buildWeightedList(testInput as { value: unknown; weight: number; }[]); }).toThrow(testExpected); @@ -403,7 +403,7 @@ describe('WeightedElementUtility', (): void => { test.each( testCases - )('Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(WeightedElementUtility.isGenericWeightedElement(testInput)).toBe(testExpected); }); }); @@ -429,7 +429,7 @@ describe('WeightedElementUtility', (): void => { test.each( testCases - )('Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect((): void => { WeightedElementUtility.isWeightedElement({}, testInput as ((value: unknown) => value is unknown)); }).toThrow(testExpected); @@ -517,7 +517,7 @@ describe('WeightedElementUtility', (): void => { test.each( testCases - )('Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should return $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect(WeightedElementUtility.isGenericWeightedList(testInput)).toBe(testExpected); }); }); @@ -544,7 +544,7 @@ describe('WeightedElementUtility', (): void => { test.each( testCases - )('Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + )('%# - Input $input should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { expect((): void => { WeightedElementUtility.isWeightedList([{ value: 'test', weight: 1, discriminator: Discriminators.WeightedElement }], testInput as ((value: unknown) => value is unknown)); }).toThrow(testExpected); From 930befc7f593308f402bfdf46b6de808a54b35ec Mon Sep 17 00:00:00 2001 From: blwatkins Date: Mon, 6 Jul 2026 22:32:47 -0500 Subject: [PATCH 080/122] Update weighted element selection tests for random.test.ts --- test/random/random.test.ts | 143 ++++++------------------------------- 1 file changed, 22 insertions(+), 121 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index b3d7cbe..2219675 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -592,8 +592,8 @@ describe('Random', (): void => { }); }); - describe('randomWeightedElement should return elements[0] if the rng function returns a negative number', (): void => { - test.each([ + describe('randomWeightedElement should return a fallback element if the randomNumberGenerator returns a number outside the range of 0 to 1', (): void => { + describe.each([ { input: [ { value: 1, weight: 0.25 }, @@ -692,125 +692,26 @@ describe('Random', (): void => { { value: 'best', weight: 0.4 } ] } - ])('%# - randomWeightedElement($input) should return elements[0] if the rng function returns a negative number', ({ input }: { input: { value: unknown; weight: number }[] }): void => { - Random.randomNumberGenerator = (): number => { - return -0.1; - } - - const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); - const selected: unknown = Random.randomWeightedElement(weightedElements); - expect(selected).toBe(input[0].value); - }); - }); - - describe('randomWeightedElement should return elements[length - 1] if the rng function returns a number greater than 1', (): void => { - test.each([ - { - input: [ - { value: 1, weight: 0.25 }, - { value: 2, weight: 0.25 }, - { value: 3, weight: 0.25 }, - { value: 4, weight: 0.25 } - ] - }, - { - input: [ - { value: 1, weight: 0.5 }, - { value: 2, weight: 0.2 }, - { value: 3, weight: 0.2 }, - { value: 4, weight: 0.1 } - ] - }, - { - input: [ - { value: 1.1, weight: 0.25 }, - { value: 2.2, weight: 0.25 }, - { value: 3.3, weight: 0.25 }, - { value: 4.4, weight: 0.25 } - ] - }, - { - input: [ - { value: 1, weight: 1 } - ] - }, - { - input: [ - { value: 'it', weight: 0.25 }, - { value: 'was', weight: 0.25 }, - { value: 'the', weight: 0.25 }, - { value: 'best', weight: 0.25 } - ] - }, - { - input: [ - { value: 'see', weight: 0.33 }, - { value: 'spot', weight: 0.33 }, - { value: 'run', weight: 0.34 } - ] - }, - { - input: [ - { value: 'hello', weight: 1 } - ] - }, - { - input: [ - { value: 1, weight: 0.25 }, - { value: 2, weight: 0 }, - { value: 3, weight: 0.25 }, - { value: 4, weight: 0.25 }, - { value: 5, weight: 0.25 } - ] - }, - { - input: [ - { value: 1, weight: 0.5 }, - { value: 2, weight: 0 }, - { value: 3, weight: 0.3 }, - { value: 4, weight: 0.2 } - ] - }, - { - input: [ - { value: 1, weight: 0 }, - { value: 2, weight: 0.3 }, - { value: 3, weight: 0.3 }, - { value: 4, weight: 0.4 } - ] - }, - { - input: [ - { value: 1, weight: 0.4 }, - { value: 2, weight: 0.3 }, - { value: 3, weight: 0.3 }, - { value: 4, weight: 0 } - ] - }, - { - input: [ - { value: 1.1, weight: 0 }, - { value: 2.2, weight: 0.25 }, - { value: 3.3, weight: 0.25 }, - { value: 4.4, weight: 0.5 } - ] - }, - { - input: [ - { value: 'it', weight: 0.2 }, - { value: 'was', weight: 0.4 }, - { value: 'the', weight: 0 }, - { value: 'best', weight: 0.4 } - ] - } - ])('%# - randomWeightedElement($input) should return elements[length - 1] if the rng function returns a number greater than 1', ({ input }: { input: { value: unknown; weight: number }[] }): void => { - Random.randomNumberGenerator = (): number => { - return 1.1; - } - - const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); - const selected: unknown = Random.randomWeightedElement(weightedElements); - expect(selected).toBe(input[input.length - 1].value); + ])('%# - randomWeightedElement($input) with a randomNumberGenerator outside the range of 0 to 1', ({ input }: { input: { value: unknown; weight: number }[] }): void => { + test('Should return elements[0] if the rng function returns a negative number', (): void => { + Random.randomNumberGenerator = (): number => { + return -0.1; + } + + const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); + const selected: unknown = Random.randomWeightedElement(weightedElements); + expect(selected).toBe(input[0].value); + }); + + test('Should return elements[length - 1] if the rng function returns a number greater than 1', (): void => { + Random.randomNumberGenerator = (): number => { + return 1.1; + } + + const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); + const selected: unknown = Random.randomWeightedElement(weightedElements); + expect(selected).toBe(input[input.length - 1].value); + }); }); }); From 59ab56b2d21a2aecaa8329d7977c0e4be4ef8ac3 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 7 Jul 2026 08:38:12 -0500 Subject: [PATCH 081/122] Add history and origins section to README.md and index.md --- README.md | 5 +++++ docs/index.md | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/README.md b/README.md index a652fa8..fee7c67 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,11 @@ A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utiliti - [Latest Release](https://blwatkins.github.io/typescript-utils/doc/index.html) - [Documentation by Version Number](https://blwatkins.github.io/typescript-utils/releases.html) +## History and Origins + +Development for this project originally began in March 2022, when I started creating utility classes in JavaScript to use across my personal algorithmic generative art projects. +Over the years, the utilities have been refined, expanded, updated, and organized into a series of cohesive libraries that can be used in a variety of projects. + ## License The source code of this project is licensed under the [MIT License](https://opensource.org/license/mit). diff --git a/docs/index.md b/docs/index.md index d5b657c..ef6ad36 100644 --- a/docs/index.md +++ b/docs/index.md @@ -12,6 +12,11 @@ A growing toolkit of reusable, domain-agnostic TypeScript and JavaScript utiliti - [Latest Release](./doc/index.html) - [Documentation by Version Number](./releases.md) +## History and Origins + +Development for this project originally began in March 2022, when I started creating utility classes in JavaScript to use across my personal algorithmic generative art projects. +Over the years, the utilities have been refined, expanded, updated, and organized into a series of cohesive libraries that can be used in a variety of projects. + ## License The source code of this project is licensed under the [MIT License](https://opensource.org/license/mit). From de83f92b7795cd2d09bb6660101ed4e6235fd6dc Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 7 Jul 2026 12:44:32 -0500 Subject: [PATCH 082/122] Update unit tests for `randomNumberGenerator` setter with input validation. --- src/random/random.ts | 2 +- test/random/random.test.ts | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/random/random.ts b/src/random/random.ts index 8c01c42..f0cb348 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -62,7 +62,7 @@ export class Random { */ public static set randomNumberGenerator(rng: () => number) { if (typeof rng !== 'function') { - throw new TypeError('rng must be a function'); + throw new TypeError('Random number generator must be a function'); } Random.#rng = rng; diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 2219675..54010ad 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -21,6 +21,7 @@ import { describe, test, afterEach, expect, expectTypeOf } from 'vitest'; import { Random, WeightedElementUtility, WeightedList } from '../../src'; +import { nonFunctionInputs } from "../utils/input/function-inputs"; describe('Random', (): void => { const testRepeatTotal: number = 25; @@ -178,7 +179,15 @@ describe('Random', (): void => { }); describe('Input validation', (): void => { - test.todo('Input validation'); + describe('randomNumberGenerator must be a function', (): void => { + test.each( + nonFunctionInputs + )('%# - Random.randomNumberGenerator = %o should throw a TypeError', (input: unknown): void => { + expect((): void => { + Random.randomNumberGenerator = input as (() => number); + }).toThrow(TypeError); + }); + }); }); }); From 8f7543fbcd8ea7dd7e8ab2db823f14cc96ab4bfc Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 7 Jul 2026 18:03:47 -0500 Subject: [PATCH 083/122] Complete unit tests for `randomNumberGenerator` in random.test.ts --- test/random/random.test.ts | 48 +++++++++++++++++-- ...ndom-number-generator-factory-scenarios.ts | 4 +- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 54010ad..ed18c8b 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -20,11 +20,22 @@ import { describe, test, afterEach, expect, expectTypeOf } from 'vitest'; -import { Random, WeightedElementUtility, WeightedList } from '../../src'; +import { + Random, + RandomNumberGeneratorFactory, + SeededRandomNumberGenerator, + WeightedElementUtility, + WeightedList +} from '../../src'; import { nonFunctionInputs } from "../utils/input/function-inputs"; +import { + asciiNamespace, + asciiSeed, getExpectedAsyncSequence, + getExpectedSequence +} from "../utils/test-case/scenarios/random-number-generator-factory-scenarios"; describe('Random', (): void => { - const testRepeatTotal: number = 25; + const testRepeatTotal: number = 50; afterEach((): void => { Random.randomNumberGenerator = Math.random; @@ -174,8 +185,37 @@ describe('Random', (): void => { }); }); - describe('Setting random number generator with a seeded pseudorandom number generator', (): void => { - test.todo('Setting random number generator with a seeded pseudorandom number generator'); + describe('Setting random number generator with a seeded pseudorandom number generator should return the correct sequence of values', (): void => { + const seed: string = asciiSeed; + const namespace: string = asciiNamespace; + + test('With RandomNumberGeneratorFactory.build', (): void => { + const rng: SeededRandomNumberGenerator = RandomNumberGeneratorFactory.build(seed, namespace); + const expected: number[] = getExpectedSequence(seed, namespace); + + Random.randomNumberGenerator = rng.next.bind(rng); + const selected: number[] = []; + + for (let i: number = 0; i < expected.length; i++) { + selected.push(Random.random()); + } + + expect(selected).toEqual(expected); + }); + + test('With RandomNumberGeneratorFactory.asyncBuild', async (): Promise => { + const rng: SeededRandomNumberGenerator = await RandomNumberGeneratorFactory.asyncBuild(seed, namespace); + const expected: number[] = getExpectedAsyncSequence(seed, namespace); + + Random.randomNumberGenerator = rng.next.bind(rng); + const selected: number[] = []; + + for (let i: number = 0; i < expected.length; i++) { + selected.push(Random.random()); + } + + expect(selected).toEqual(expected); + }); }); describe('Input validation', (): void => { diff --git a/test/utils/test-case/scenarios/random-number-generator-factory-scenarios.ts b/test/utils/test-case/scenarios/random-number-generator-factory-scenarios.ts index d916b98..30dda98 100644 --- a/test/utils/test-case/scenarios/random-number-generator-factory-scenarios.ts +++ b/test/utils/test-case/scenarios/random-number-generator-factory-scenarios.ts @@ -119,13 +119,13 @@ function buildKey(seed: string, namespace?: string): string { } } -function getExpectedSequence(seed: string, namespace?: string, version?: number): number[] { +export function getExpectedSequence(seed: string, namespace?: string, version?: number): number[] { const key: string = buildKey(seed, namespace); const index: number = version ?? 0; return sequences[key][index]; } -function getExpectedAsyncSequence(seed: string, namespace?: string): number[] { +export function getExpectedAsyncSequence(seed: string, namespace?: string): number[] { const key: string = buildKey(seed, namespace); return asyncSequences[key]; } From bd1dd1797806c527e61d924304269345de65ca4a Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 7 Jul 2026 18:23:59 -0500 Subject: [PATCH 084/122] Add test for randomInt and randomInteger to random.test.ts --- test/random/random.test.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index ed18c8b..c2e4ed7 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -398,6 +398,30 @@ describe('Random', (): void => { { min: 10.001, max: 10.999 }, { min: -10.4, max: -10.25 }, { min: 0.5, max: 0.75 }, + { min: 0.99, max: 0.999 }, + { min: -0.999, max: -0.99 } + ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { + const intNumbers: number[] = []; + const integerNumbers: number[] = []; + + for (let i: number = 0; i < testRepeatTotal; i++) { + intNumbers.push(Random.randomInt(min, max)); + integerNumbers.push(Random.randomInteger(min, max)); + } + + validateRandomIntValues(intNumbers, min, max); + validateRandomIntValues(integerNumbers, min, max); + }); + }); + + describe('randomInt and randomInteger should return Math.floor(min) when min > max, but Math.floor(min) and Math.floor(max) are equal', (): void => { + test.each([ + { min: 1.89, max: 1.5 }, + { min: 10.99, max: 10.01 }, + { min: 10.999, max: 10.001 }, + { min: -10.25, max: -10.4 }, + { min: 0.75, max: 0.5 }, + { min: 0.999, max: 0.99 }, { min: -0.99, max: -0.999 } ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { const intNumbers: number[] = []; From 657b0972c4fbf98d9fa4d1b98626726cf3bb3efa Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 7 Jul 2026 18:37:35 -0500 Subject: [PATCH 085/122] Add min range input validation to random.test.ts. Refactor random.ts parameter validation. --- src/random/random.ts | 2 +- test/random/random.test.ts | 70 +++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/random/random.ts b/src/random/random.ts index f0cb348..870edb7 100644 --- a/src/random/random.ts +++ b/src/random/random.ts @@ -110,9 +110,9 @@ export class Random { * @since 0.1.0 */ public static randomInt(min: number, max: number): number { + Random.#validateRange(min, max); const floorMin: number = Math.floor(min); const floorMax: number = Math.floor(max); - Random.#validateRange(floorMin, floorMax); return Math.floor(Random.randomFloat(floorMin, floorMax)); } diff --git a/test/random/random.test.ts b/test/random/random.test.ts index c2e4ed7..04de14d 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -33,6 +33,8 @@ import { asciiSeed, getExpectedAsyncSequence, getExpectedSequence } from "../utils/test-case/scenarios/random-number-generator-factory-scenarios"; +import {nonFiniteNumberInputs, nonNumberInputs} from "../utils/input/number-inputs"; +import {buildTestCases, Scenario, TestCase} from "../utils/test-case/test-case"; describe('Random', (): void => { const testRepeatTotal: number = 50; @@ -292,8 +294,6 @@ describe('Random', (): void => { validateRandomFloatValues(numbers, min, max); }); }); - - test.todo('Input validation'); }); describe('randomInt and randomInteger', (): void => { @@ -413,31 +413,6 @@ describe('Random', (): void => { validateRandomIntValues(integerNumbers, min, max); }); }); - - describe('randomInt and randomInteger should return Math.floor(min) when min > max, but Math.floor(min) and Math.floor(max) are equal', (): void => { - test.each([ - { min: 1.89, max: 1.5 }, - { min: 10.99, max: 10.01 }, - { min: 10.999, max: 10.001 }, - { min: -10.25, max: -10.4 }, - { min: 0.75, max: 0.5 }, - { min: 0.999, max: 0.99 }, - { min: -0.99, max: -0.999 } - ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return Math.floor($min)', ({ min, max }: { min: number; max: number; }): void => { - const intNumbers: number[] = []; - const integerNumbers: number[] = []; - - for (let i: number = 0; i < testRepeatTotal; i++) { - intNumbers.push(Random.randomInt(min, max)); - integerNumbers.push(Random.randomInteger(min, max)); - } - - validateRandomIntValues(intNumbers, min, max); - validateRandomIntValues(integerNumbers, min, max); - }); - }); - - test.todo('Input validation'); }); describe('randomBoolean', (): void => { @@ -790,4 +765,45 @@ describe('Random', (): void => { test.todo('Input validation'); }); + + describe('Input validation', (): void => { + describe('Min and max range validation', (): void => { + describe('Min parameter must be a finite number', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-number inputs', + inputs: [...nonNumberInputs], + expected: TypeError + }, + { + label: 'Non-finite number inputs', + inputs: [...nonFiniteNumberInputs], + expected: TypeError + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - min ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect((): void => { + Random.randomFloat(testInput as number, Number.MAX_SAFE_INTEGER); + }).toThrow(testExpected); + + expect((): void => { + Random.randomInt(testInput as number, Number.MAX_SAFE_INTEGER); + }).toThrow(testExpected); + + expect((): void => { + Random.randomInteger(testInput as number, Number.MAX_SAFE_INTEGER); + }).toThrow(testExpected); + }); + }); + }); + }); + }); }); From a9c882a61b1421bd836d7ee456439bc543bc5c0a Mon Sep 17 00:00:00 2001 From: blwatkins Date: Tue, 7 Jul 2026 18:46:21 -0500 Subject: [PATCH 086/122] Fix linting errors and add tests for max parameter. --- test/random/random.test.ts | 136 ++++++++++++++++++++++--------------- 1 file changed, 80 insertions(+), 56 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 04de14d..aa961a9 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -27,14 +27,16 @@ import { WeightedElementUtility, WeightedList } from '../../src'; -import { nonFunctionInputs } from "../utils/input/function-inputs"; + +import { nonFunctionInputs } from '../utils/input/function-inputs'; +import { nonFiniteNumberInputs, nonNumberInputs } from '../utils/input/number-inputs'; +import { buildTestCases, Scenario, TestCase } from '../utils/test-case/test-case'; + import { asciiNamespace, asciiSeed, getExpectedAsyncSequence, getExpectedSequence -} from "../utils/test-case/scenarios/random-number-generator-factory-scenarios"; -import {nonFiniteNumberInputs, nonNumberInputs} from "../utils/input/number-inputs"; -import {buildTestCases, Scenario, TestCase} from "../utils/test-case/test-case"; +} from '../utils/test-case/scenarios/random-number-generator-factory-scenarios'; describe('Random', (): void => { const testRepeatTotal: number = 50; @@ -194,11 +196,12 @@ describe('Random', (): void => { test('With RandomNumberGeneratorFactory.build', (): void => { const rng: SeededRandomNumberGenerator = RandomNumberGeneratorFactory.build(seed, namespace); const expected: number[] = getExpectedSequence(seed, namespace); + const repeatTotal: number = expected.length; Random.randomNumberGenerator = rng.next.bind(rng); const selected: number[] = []; - for (let i: number = 0; i < expected.length; i++) { + for (let i: number = 0; i < repeatTotal; i++) { selected.push(Random.random()); } @@ -208,11 +211,12 @@ describe('Random', (): void => { test('With RandomNumberGeneratorFactory.asyncBuild', async (): Promise => { const rng: SeededRandomNumberGenerator = await RandomNumberGeneratorFactory.asyncBuild(seed, namespace); const expected: number[] = getExpectedAsyncSequence(seed, namespace); + const repeatTotal: number = expected.length; Random.randomNumberGenerator = rng.next.bind(rng); const selected: number[] = []; - for (let i: number = 0; i < expected.length; i++) { + for (let i: number = 0; i < repeatTotal; i++) { selected.push(Random.random()); } @@ -355,7 +359,7 @@ describe('Random', (): void => { { min: 1, max: 1 }, { min: -1, max: -1 }, { min: 10, max: 10 }, - { min: -10, max: -10 }, + { min: -10, max: -10 } ])('%# - randomInt($min, $max) and randomInteger($min, $max) should return $min', ({ min, max }: { min: number; max: number; }): void => { const intNumbers: number[] = []; const integerNumbers: number[] = []; @@ -476,15 +480,15 @@ describe('Random', (): void => { input: ['hello'], type: 'string' } - ])('%# - randomElement($input) should return an element from ($input)', ({ input, type }: { input: unknown[]; type: string }): void => { - const selected: unknown[] = []; - const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); + ])('%# - randomElement($input) should return an element from ($input)', ({ input, type }: { input: unknown[]; type: string; }): void => { + const selected: unknown[] = []; + const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); - for (let i: number = 0; i < repeatTotal; i++) { - selected.push(Random.randomElement(input)); - } + for (let i: number = 0; i < repeatTotal; i++) { + selected.push(Random.randomElement(input)); + } - validateRandomElements(selected, input, type); + validateRandomElements(selected, input, type); }); }); @@ -550,11 +554,11 @@ describe('Random', (): void => { ], type: 'string' } - ])('%# - randomWeightedElement($input) should return an element from ($input)', ({ input, type }: { input: { value: unknown; weight: number }[]; type: string }): void => { + ])('%# - randomWeightedElement($input) should return an element from ($input)', ({ input, type }: { input: { value: unknown; weight: number; }[]; type: string; }): void => { const selected: unknown[] = []; const repeatTotal: number = Math.max(testRepeatTotal, input.length * 6); const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); - const expectedElements: unknown[] = input.map((item: { value: unknown; weight: number}): unknown => item.value); + const expectedElements: unknown[] = input.map((item: { value: unknown; weight: number; }): unknown => item.value); for (let i: number = 0; i < repeatTotal; i++) { selected.push(Random.randomWeightedElement(weightedElements)); @@ -627,7 +631,7 @@ describe('Random', (): void => { expected: ['it', 'was', 'best'], type: 'string' } - ])('%# - randomWeightedElement should not return an element from ($input) if the weight is zero', ({ input, expected, type }: { input: { value: unknown; weight: number }[]; expected: unknown[]; type: string }): void => { + ])('%# - randomWeightedElement should not return an element from ($input) if the weight is zero', ({ input, expected, type }: { input: { value: unknown; weight: number; }[]; expected: unknown[]; type: string; }): void => { const selected: unknown[] = []; const repeatTotal: number = Math.max(testRepeatTotal, input.length * 10); const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); @@ -740,11 +744,11 @@ describe('Random', (): void => { { value: 'best', weight: 0.4 } ] } - ])('%# - randomWeightedElement($input) with a randomNumberGenerator outside the range of 0 to 1', ({ input }: { input: { value: unknown; weight: number }[] }): void => { + ])('%# - randomWeightedElement($input) with a randomNumberGenerator outside the range of 0 to 1', ({ input }: { input: { value: unknown; weight: number; }[]; }): void => { test('Should return elements[0] if the rng function returns a negative number', (): void => { Random.randomNumberGenerator = (): number => { return -0.1; - } + }; const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); const selected: unknown = Random.randomWeightedElement(weightedElements); @@ -754,7 +758,7 @@ describe('Random', (): void => { test('Should return elements[length - 1] if the rng function returns a number greater than 1', (): void => { Random.randomNumberGenerator = (): number => { return 1.1; - } + }; const weightedElements: WeightedList = WeightedElementUtility.buildWeightedList(input); const selected: unknown = Random.randomWeightedElement(weightedElements); @@ -767,43 +771,63 @@ describe('Random', (): void => { }); describe('Input validation', (): void => { - describe('Min and max range validation', (): void => { - describe('Min parameter must be a finite number', (): void => { - const scenarios: Scenario[] = [ - { - label: 'Non-number inputs', - inputs: [...nonNumberInputs], - expected: TypeError - }, - { - label: 'Non-finite number inputs', - inputs: [...nonFiniteNumberInputs], - expected: TypeError - } - ]; - - describe.each( - scenarios - )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { - const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); - - test.each( - testCases - )('%# - min ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { - expect((): void => { - Random.randomFloat(testInput as number, Number.MAX_SAFE_INTEGER); - }).toThrow(testExpected); - - expect((): void => { - Random.randomInt(testInput as number, Number.MAX_SAFE_INTEGER); - }).toThrow(testExpected); - - expect((): void => { - Random.randomInteger(testInput as number, Number.MAX_SAFE_INTEGER); - }).toThrow(testExpected); + describe('Min and max range validation', (): void => { + describe('Min and max parameters must be a finite number', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-number inputs', + inputs: [...nonNumberInputs], + expected: TypeError + }, + { + label: 'Non-finite number inputs', + inputs: [...nonFiniteNumberInputs], + expected: TypeError + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + describe('Min parameter validation', (): void => { + test.each( + testCases + )('%# - Min ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect((): void => { + Random.randomFloat(testInput as number, Number.MAX_SAFE_INTEGER); + }).toThrow(testExpected); + + expect((): void => { + Random.randomInt(testInput as number, Number.MAX_SAFE_INTEGER); + }).toThrow(testExpected); + + expect((): void => { + Random.randomInteger(testInput as number, Number.MAX_SAFE_INTEGER); + }).toThrow(testExpected); + }); + }); + + describe('Max parameter validation', (): void => { + test.each( + testCases + )('%# - Max ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect((): void => { + Random.randomFloat(Number.MIN_SAFE_INTEGER, testInput as number); + }).toThrow(testExpected); + + expect((): void => { + Random.randomInt(Number.MIN_SAFE_INTEGER, testInput as number); + }).toThrow(testExpected); + + expect((): void => { + Random.randomInteger(Number.MIN_SAFE_INTEGER, testInput as number); + }).toThrow(testExpected); + }); + }); }); }); - }); - }); + }); }); }); From 341ca96c97cfd562f8e5fe67007d8bf1f528b1d3 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 8 Jul 2026 18:41:50 -0500 Subject: [PATCH 087/122] Compelete input validation for range random methods in random.test.ts --- test/random/random.test.ts | 83 +++++++++++++++++++++++++++++++++++++- 1 file changed, 82 insertions(+), 1 deletion(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index aa961a9..a1325b8 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -450,7 +450,9 @@ describe('Random', (): void => { validateRandomBooleans(booleans, true); }); - test.todo('Input validation'); + describe('Chance of true validation', (): void => { + test.todo('validate'); + }); }); describe('randomElement', (): void => { @@ -828,6 +830,85 @@ describe('Random', (): void => { }); }); }); + + describe('Min must be less than max', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Integer min and max', + inputs: [ + { min: 0, max: -1 }, + { min: 10, max: 9 }, + { min: 10, max: 0 }, + { min: 10, max: 1 }, + { min: 10, max: -10 }, + { min: -10, max: -11 }, + { min: -10, max: -20 } + ], + expected: RangeError + }, + { + label: 'Float min and max', + inputs: [ + { min: 0.123, max: -1.123 }, + { min: 10.123, max: 9.123 }, + { min: 10.123, max: 0.123 }, + { min: 10.123, max: 1.123 }, + { min: 10.123, max: -10.123 }, + { min: -10.123, max: -11.123 }, + { min: -10.123, max: -20.123 } + ], + expected: RangeError + }, + { + label: 'Float min and max with equal floors', + inputs: [ + { min: 0.456, max: 0.123 }, + { min: 10.456, max: 10.1234 }, + { min: -10.123, max: -10.456 } + ], + expected: RangeError + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + describe('randomFloat', (): void => { + test.each( + testCases + )('%# - randomFloat with input ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + const { min, max} = testInput as { min: number; max: number }; + expect((): void => { + Random.randomFloat(min, max); + }).toThrow(testExpected); + }); + }); + + describe('randomInt', (): void => { + test.each( + testCases + )('%# - randomInt with input ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + const { min, max} = testInput as { min: number; max: number }; + expect((): void => { + Random.randomInt(min, max); + }).toThrow(testExpected); + }); + }); + + describe('randomInteger', (): void => { + test.each( + testCases + )('%# - randomInteger with input ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + const { min, max} = testInput as { min: number; max: number }; + expect((): void => { + Random.randomInteger(min, max); + }).toThrow(testExpected); + }); + }); + }); + }); }); }); }); From b772736e8ba19d2f9d3d34de00e72e481cfa0425 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 8 Jul 2026 18:43:17 -0500 Subject: [PATCH 088/122] Fix linting errors in random.test.ts --- test/random/random.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index a1325b8..93821dd 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -879,7 +879,7 @@ describe('Random', (): void => { test.each( testCases )('%# - randomFloat with input ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { - const { min, max} = testInput as { min: number; max: number }; + const { min, max } = testInput as { min: number; max: number; }; expect((): void => { Random.randomFloat(min, max); }).toThrow(testExpected); @@ -890,7 +890,7 @@ describe('Random', (): void => { test.each( testCases )('%# - randomInt with input ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { - const { min, max} = testInput as { min: number; max: number }; + const { min, max } = testInput as { min: number; max: number; }; expect((): void => { Random.randomInt(min, max); }).toThrow(testExpected); @@ -901,7 +901,7 @@ describe('Random', (): void => { test.each( testCases )('%# - randomInteger with input ($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { - const { min, max} = testInput as { min: number; max: number }; + const { min, max } = testInput as { min: number; max: number; }; expect((): void => { Random.randomInteger(min, max); }).toThrow(testExpected); From f5567643b9c82589a5e67cf9ebf4490d49ccf6ca Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 8 Jul 2026 18:52:45 -0500 Subject: [PATCH 089/122] Add input validation to random.test.ts for randomBoolean method. --- test/random/random.test.ts | 43 ++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 93821dd..9eb61e0 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -451,7 +451,44 @@ describe('Random', (): void => { }); describe('Chance of true validation', (): void => { - test.todo('validate'); + const scenarios: Scenario[] = [ + { + label: 'Non-number type inputs', + inputs: [...nonNumberInputs.filter((input: unknown): boolean => input !== undefined)], + expected: TypeError + }, + { + label: 'Non-finite number inputs', + inputs: [...nonFiniteNumberInputs], + expected: TypeError + }, + { + label: 'Out of range finite number inputs', + inputs: [ + -Number.EPSILON, + 1 + Number.EPSILON, + Number.MIN_SAFE_INTEGER, + Number.MAX_SAFE_INTEGER, + -1, + 2, + -10, + 10 + ], + expected: RangeError + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - randomBoolean($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect(() => Random.randomBoolean(testInput as number)).toThrow(testExpected); + }); + }); }); }); @@ -768,11 +805,9 @@ describe('Random', (): void => { }); }); }); - - test.todo('Input validation'); }); - describe('Input validation', (): void => { + describe('Range input validation', (): void => { describe('Min and max range validation', (): void => { describe('Min and max parameters must be a finite number', (): void => { const scenarios: Scenario[] = [ From 9f4de62e4dbd9b6be2d50772c35f8380599ae6f4 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 8 Jul 2026 18:59:18 -0500 Subject: [PATCH 090/122] Complete unit tests for random.test.ts --- test/random/random.test.ts | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/test/random/random.test.ts b/test/random/random.test.ts index 9eb61e0..cb8f492 100644 --- a/test/random/random.test.ts +++ b/test/random/random.test.ts @@ -37,6 +37,7 @@ import { asciiSeed, getExpectedAsyncSequence, getExpectedSequence } from '../utils/test-case/scenarios/random-number-generator-factory-scenarios'; +import { nonArrayInputs } from '../utils/input/array-inputs'; describe('Random', (): void => { const testRepeatTotal: number = 50; @@ -531,7 +532,38 @@ describe('Random', (): void => { }); }); - test.todo('Input validation'); + describe('Input validation', (): void => { + describe('Input must be a non-empty array', (): void => { + const scenarios: Scenario[] = [ + { + label: 'Non-array type inputs', + inputs: [...nonArrayInputs], + expected: TypeError + }, + { + label: 'Empty array input', + inputs: [ + [] + ], + expected: TypeError + } + ]; + + describe.each( + scenarios + )('%# - $label', ({ inputs: scenarioInputs, expected: scenarioExpected }: Scenario): void => { + const testCases: TestCase[] = buildTestCases(scenarioInputs, scenarioExpected); + + test.each( + testCases + )('%# - randomElement($input) should throw $expected', ({ input: testInput, expected: testExpected }: TestCase): void => { + expect((): void => { + Random.randomElement(testInput as unknown[]); + }).toThrow(testExpected); + }); + }); + }); + }); }); describe('randomWeightedElement', (): void => { From 8618244dc77cbb64451f036678c46be7c1908673 Mon Sep 17 00:00:00 2001 From: blwatkins Date: Wed, 8 Jul 2026 19:01:24 -0500 Subject: [PATCH 091/122] Update generated v0.1.0-alpha.1 docs. --- .../discriminator.DiscriminatorRegistry.html | 8 ++++---- .../doc/classes/number.NumberUtility.html | 8 ++++---- .../doc/classes/random.Random.html | 18 +++++++++--------- .../random.RandomNumberGeneratorFactory.html | 6 +++--- .../doc/classes/random.SeedVersions.html | 8 ++++---- .../random.SeededRandomNumberGenerator.html | 6 +++--- .../classes/random.WeightedElementUtility.html | 16 ++++++++-------- .../doc/classes/string.ColorStringUtility.html | 14 +++++++------- .../doc/classes/string.StringUtility.html | 18 +++++++++--------- .../enums/discriminator.Discriminators.html | 4 ++-- .../v0.1.0-alpha.1/doc/index.html | 5 ++++- ...iscriminator.DiscriminatorRegistration.html | 6 +++--- .../doc/interfaces/random.SeedVersion.html | 4 ++-- .../doc/interfaces/random.WeightedElement.html | 8 ++++---- .../doc/types/discriminator.Discriminated.html | 2 +- .../doc/types/discriminator.TypeGuard.html | 2 +- .../doc/types/random.WeightedList.html | 2 +- .../discriminator.discriminatedSchema.html | 2 +- .../random.weightedElementSchema.html | 2 +- 19 files changed, 71 insertions(+), 68 deletions(-) diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html index c119b1f..b5a5bae 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/discriminator.DiscriminatorRegistry.html @@ -1,7 +1,7 @@ DiscriminatorRegistry | @blwatkins/utils - v0.1.0-alpha.1

                Class DiscriminatorRegistry

                Static registry for managing discriminators and their associated type guards. Discriminators are used to identify the type of a Discriminated object and validate it using a registered type guard function.

                0.1.0

                -
                Index

                Methods

                has +
                Index

                Methods

                • Checks if a discriminator is already registered.

                  @@ -10,7 +10,7 @@
                • true if the discriminator is registered, false otherwise.

                0.1.0

                -
                • Validates an input against a specific discriminator.

                  Parameters

                  • input: unknown

                    The input to validate.

                  • discriminator: string

                    The discriminator value to check.

                  Returns boolean

                  • true if the input matches the type associated with the discriminator, false otherwise.

                  0.1.0

                  -

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html index 717d948..eef66e5 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/number.NumberUtility.html @@ -1,18 +1,18 @@ NumberUtility | @blwatkins/utils - v0.1.0-alpha.1

                Class NumberUtility

                Static properties and methods for validating number types.

                0.1.0

                -
                Index
                Index

                Methods

                • Is the given input a finite number?

                  Parameters

                  • input: unknown

                  Returns input is number

                  true when the input is a finite number; false otherwise.

                  0.1.0

                  -
                • Is the given input an integer?

                  Parameters

                  • input: unknown

                  Returns input is number

                  true when the input is an integer; false otherwise.

                  0.1.0

                  -
                • Is the given input a positive integer?

                  +
                • Is the given input a positive integer?

                  Parameters

                  • input: unknown
                  • zeroInclusive: boolean = false

                    true if zero should be considered a valid input. false if zero should be considered an invalid input. Default value is false.

                  Returns input is number

                  true if the given input is a positive integer, or zero when zeroInclusive is true; false otherwise.

                  0.1.0

                  -

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.Random.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.Random.html index 6da6555..ca7031f 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.Random.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.Random.html @@ -1,6 +1,6 @@ Random | @blwatkins/utils - v0.1.0-alpha.1

                Class Random

                Static properties and methods for generating random numbers and booleans, and for selecting random elements from arrays.

                0.1.0

                -
                Index
                Index

                Accessors

                Methods

                random randomBoolean randomElement @@ -14,29 +14,29 @@
              • If the given random number generator is not a function.
              • 0.1.0

                -

                Methods

                • Returns number

                  A random number in the range [0, 1) (zero inclusive, one exclusive).

                  +

                Methods

                • Returns number

                  A random number in the range [0, 1) (zero inclusive, one exclusive).

                  0.1.0

                  -
                • Parameters

                  • chanceOfTrue: number = 0.5

                    The probability of returning true (between 0 and 1).

                    +
                • Parameters

                  • chanceOfTrue: number = 0.5

                    The probability of returning true (between 0 and 1).

                  Returns boolean

                  A random boolean value.

                  0.1.0

                  -
                • Type Parameters

                  • Type

                  Parameters

                  • elements: Type[]

                    An array of elements to choose from.

                  Returns Type

                  A random element from the array.

                  0.1.0

                  -
                • Parameters

                  • min: number

                    The minimum value (inclusive).

                    +
                • Parameters

                  • min: number

                    The minimum value (inclusive).

                  • max: number

                    The maximum value (exclusive).

                  Returns number

                  A random floating-point number in the range [min, max) (min inclusive, max exclusive).

                  When min is not a finite number.

                  When max is not a finite number.

                  When min is not less than or equal max.

                  0.1.0

                  -
                • Parameters

                  • min: number

                    The minimum value (inclusive).

                    +
                • Parameters

                  • min: number

                    The minimum value (inclusive).

                  • max: number

                    The maximum value (exclusive).

                  Returns number

                  A random integer in the range [min, max) (min inclusive, max exclusive).

                  When min is not a finite number.

                  When max is not a finite number.

                  When min is not less than or equal max.

                  0.1.0

                  -
                • Parameters

                  • min: number

                    The minimum value (inclusive).

                    +
                • Parameters

                  • min: number

                    The minimum value (inclusive).

                  • max: number

                    The maximum value (exclusive).

                  Returns number

                  A random integer in the range [min, max) (min inclusive, max exclusive).

                  Random.randomInt

                  @@ -44,7 +44,7 @@

                  When max is not a finite number.

                  When min is not less than or equal max.

                  0.1.0

                  -

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html index 4489b5b..c1b7de0 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.RandomNumberGeneratorFactory.html @@ -1,6 +1,6 @@ RandomNumberGeneratorFactory | @blwatkins/utils - v0.1.0-alpha.1

                Class RandomNumberGeneratorFactory

                A static factory class for creating a SeededRandomNumberGenerator object.

                0.1.0

                -
                Index

                Methods

                Index

                Methods

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html index 27d8db8..395a428 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeedVersions.html @@ -1,14 +1,14 @@ SeedVersions | @blwatkins/utils - v0.1.0-alpha.1

                Class SeedVersions

                A static class for accessing different seed versions. Each seed version index is guaranteed to always return the same seed version object, so that the same seed and version will always produce the same sequence of pseudorandom numbers.

                0.1.0

                -
                Index

                Accessors

                Index

                Accessors

                Methods

                Accessors

                Methods

                Methods

                • Parameters

                  • index: number

                    The index of the seed version to retrieve. Must be a valid SeedVersions index.

                  Returns SeedVersion

                  • The seed version with the given index.
                  • @@ -17,7 +17,7 @@
                  • If the index is not a valid seed version index.

                  0.1.0

                  -

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html index 63435df..313b328 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.SeededRandomNumberGenerator.html @@ -1,7 +1,7 @@ SeededRandomNumberGenerator | @blwatkins/utils - v0.1.0-alpha.1

                Class SeededRandomNumberGenerator

                Deterministic seeded pseudorandom number generator. This generator utilizes the xoshiro128** algorithm, which is a pseudorandom number generator suitable for general-purpose use.

                0.1.0

                -
                Index

                Constructors

                Index

                Constructors

                Methods

                Constructors

                • Parameters

                  • state: [number, number, number, number]

                    Initial 128-bit state. Must be an array with 4 32-bit unsigned integers, where at least one element is greater than 0.

                    @@ -9,10 +9,10 @@

                    If each element of state is not a 32-bit unsigned integer.

                    If state does not have at least one element that is greater than 0.

                    0.1.0

                    -

                Methods

                • Returns number

                    +

                Methods

                • Returns number

                  • The next pseudorandom float in the range [0, 1).

                  This method advances the internal 128-bit xoshiro128** state by one step. Successive calls produce an independent, uniformly distributed sequence.

                  0.1.0

                  -

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.WeightedElementUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.WeightedElementUtility.html index 97c0b73..e9c77e2 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.WeightedElementUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/random.WeightedElementUtility.html @@ -1,6 +1,6 @@ WeightedElementUtility | @blwatkins/utils - v0.1.0-alpha.1

                Class WeightedElementUtility

                Static methods and properties for building and validating WeightedElement and WeightedList objects.

                0.1.0

                -
                Index
                Index

                Methods

                0.1.0

                -

                0.1.0

                -

                0.1.0

                -

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html index 8c4e363..c1cf694 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.ColorStringUtility.html @@ -1,6 +1,6 @@ ColorStringUtility | @blwatkins/utils - v0.1.0-alpha.1

                Class ColorStringUtility

                Static properties and methods for validating formatted color strings.

                0.1.0

                -
                Index

                Accessors

                Index

                Accessors

                • get hexColorPattern(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating hex color strings in the format #RRGGBB or #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

                  0.1.0

                  -
                • get hexColorPatternRGB(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating hex color strings in the format #RRGGBB. +

                • get hexColorPatternRGB(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating hex color strings in the format #RRGGBB. Case must be consistent in hex color strings: either all lowercase or all uppercase.

                  0.1.0

                  -
                • get hexColorPatternRGBA(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating hex color strings in the format #RRGGBBAA. +

                • get hexColorPatternRGBA(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating hex color strings in the format #RRGGBBAA. Case must be consistent in hex color strings: either all lowercase or all uppercase.

                  0.1.0

                  -

                Methods

                Methods

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html index ec4d763..97af6a6 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/classes/string.StringUtility.html @@ -1,6 +1,6 @@ StringUtility | @blwatkins/utils - v0.1.0-alpha.1

                Class StringUtility

                Static properties and methods for validating string types.

                0.1.0

                -
                Index
                Index

                Accessors

                • get singleLineLowercaseTrimmedPattern(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating single-line lowercase strings.

                  This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

                  0.1.0

                  -
                • get singleLineTrimmedPattern(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating single-line mixed-case strings.

                  +
                • get singleLineTrimmedPattern(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating single-line mixed-case strings.

                  This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

                  0.1.0

                  -
                • get singleLineUppercaseTrimmedPattern(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating single-line uppercase strings.

                  +
                • get singleLineUppercaseTrimmedPattern(): RegExp

                  Returns RegExp

                  Regular expression pattern for validating single-line uppercase strings.

                  This expression does not allow tab breaks, new lines, leading whitespace, trailing whitespace, or consecutive spaces within the string.

                  0.1.0

                  -

                Methods

                Methods

                • Is the given input a non-empty string? Non-empty strings must contain at least one non-whitespace character.

                  Parameters

                  • input: unknown

                  Returns input is string

                  0.1.0

                  -
                • Is the given input a single-line lowercase string that is trimmed (no leading or trailing whitespace)?

                  +
                • Is the given input a single-line string that is trimmed (no leading or trailing whitespace)?

                  +
                • Is the given input a single-line uppercase string that is trimmed (no leading or trailing whitespace)?

                  +
                • Is the given input a string?

                  Parameters

                  • input: unknown

                  Returns input is string

                  0.1.0

                  -

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/enums/discriminator.Discriminators.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/enums/discriminator.Discriminators.html index d545d5d..d2664b0 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/enums/discriminator.Discriminators.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/enums/discriminator.Discriminators.html @@ -1,6 +1,6 @@ Discriminators | @blwatkins/utils - v0.1.0-alpha.1

                Enumeration Discriminators

                Valid discriminators for package types and interfaces.

                0.1.0

                -
                Index

                Enumeration Members

                Index

                Enumeration Members

                Enumeration Members

                WeightedElement: "@blwat/utils:WeightedElement"

                Discriminator value for the WeightedElement interface.

                0.1.0

                -

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                +

                Generated using TypeDoc


                Copyright © 2024-2026 Brittni Watkins.

                diff --git a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html index a99f1d4..f2d5b82 100644 --- a/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html +++ b/docs/releases/v0.x/v0.1.x/v0.1.0-alpha.x/v0.1.0-alpha.1/doc/index.html @@ -5,6 +5,9 @@ +

                Development for this project originally began in March 2022, when I started creating utility classes in JavaScript to use across my personal algorithmic generative art projects. +Over the years, the utilities have been refined, expanded, updated, and organized into a series of cohesive libraries that can be used in a variety of projects.

                The source code of this project is licensed under the MIT License. The full text of the license is included with the project source code.

                @@ -56,4 +59,4 @@