From 5c1456f2bf2a75d0beb3dc8b7755f6afa5094f9b Mon Sep 17 00:00:00 2001 From: Gerold Penz Date: Sun, 4 Aug 2024 12:41:30 +0200 Subject: [PATCH] Tests with Typedoc --- _scripts/bun_run_typedoc_watch.ts | 8 + docs/.nojekyll | 1 - docs/assets/highlight.css | 92 -- docs/assets/icons.js | 18 - docs/assets/icons.svg | 1 - docs/assets/main.js | 60 -- docs/assets/navigation.js | 1 - docs/assets/search.js | 1 - docs/assets/style.css | 1448 --------------------------- docs/classes/BunSqliteKeyValue.html | 48 - docs/index.html | 370 ------- docs/index.md | 915 +++++++++++++++++ docs/interfaces/Item.html | 3 - docs/interfaces/Options.html | 5 - docs/interfaces/Record.html | 4 - docs/modules.html | 5 - package.json | 3 +- typedoc.json | 17 +- 18 files changed, 941 insertions(+), 2059 deletions(-) create mode 100644 _scripts/bun_run_typedoc_watch.ts delete mode 100644 docs/.nojekyll delete mode 100644 docs/assets/highlight.css delete mode 100644 docs/assets/icons.js delete mode 100644 docs/assets/icons.svg delete mode 100644 docs/assets/main.js delete mode 100644 docs/assets/navigation.js delete mode 100644 docs/assets/search.js delete mode 100644 docs/assets/style.css delete mode 100644 docs/classes/BunSqliteKeyValue.html delete mode 100644 docs/index.html create mode 100644 docs/index.md delete mode 100644 docs/interfaces/Item.html delete mode 100644 docs/interfaces/Options.html delete mode 100644 docs/interfaces/Record.html delete mode 100644 docs/modules.html diff --git a/_scripts/bun_run_typedoc_watch.ts b/_scripts/bun_run_typedoc_watch.ts new file mode 100644 index 0000000..c269e92 --- /dev/null +++ b/_scripts/bun_run_typedoc_watch.ts @@ -0,0 +1,8 @@ +import { $ } from "bun" +import { join } from "node:path" + + +$.cwd(join(__dirname, "..")) + +// @ts-ignore +await $`bun run typedoc:watch` diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e2ac661..0000000 --- a/docs/.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/assets/highlight.css b/docs/assets/highlight.css deleted file mode 100644 index 677ff21..0000000 --- a/docs/assets/highlight.css +++ /dev/null @@ -1,92 +0,0 @@ -:root { - --light-hl-0: #795E26; - --dark-hl-0: #DCDCAA; - --light-hl-1: #000000; - --dark-hl-1: #D4D4D4; - --light-hl-2: #A31515; - --dark-hl-2: #CE9178; - --light-hl-3: #AF00DB; - --dark-hl-3: #C586C0; - --light-hl-4: #001080; - --dark-hl-4: #9CDCFE; - --light-hl-5: #0000FF; - --dark-hl-5: #569CD6; - --light-hl-6: #0070C1; - --dark-hl-6: #4FC1FF; - --light-hl-7: #008000; - --dark-hl-7: #6A9955; - --light-hl-8: #098658; - --dark-hl-8: #B5CEA8; - --light-hl-9: #267F99; - --dark-hl-9: #4EC9B0; - --light-code-background: #FFFFFF; - --dark-code-background: #1E1E1E; -} - -@media (prefers-color-scheme: light) { :root { - --hl-0: var(--light-hl-0); - --hl-1: var(--light-hl-1); - --hl-2: var(--light-hl-2); - --hl-3: var(--light-hl-3); - --hl-4: var(--light-hl-4); - --hl-5: var(--light-hl-5); - --hl-6: var(--light-hl-6); - --hl-7: var(--light-hl-7); - --hl-8: var(--light-hl-8); - --hl-9: var(--light-hl-9); - --code-background: var(--light-code-background); -} } - -@media (prefers-color-scheme: dark) { :root { - --hl-0: var(--dark-hl-0); - --hl-1: var(--dark-hl-1); - --hl-2: var(--dark-hl-2); - --hl-3: var(--dark-hl-3); - --hl-4: var(--dark-hl-4); - --hl-5: var(--dark-hl-5); - --hl-6: var(--dark-hl-6); - --hl-7: var(--dark-hl-7); - --hl-8: var(--dark-hl-8); - --hl-9: var(--dark-hl-9); - --code-background: var(--dark-code-background); -} } - -:root[data-theme='light'] { - --hl-0: var(--light-hl-0); - --hl-1: var(--light-hl-1); - --hl-2: var(--light-hl-2); - --hl-3: var(--light-hl-3); - --hl-4: var(--light-hl-4); - --hl-5: var(--light-hl-5); - --hl-6: var(--light-hl-6); - --hl-7: var(--light-hl-7); - --hl-8: var(--light-hl-8); - --hl-9: var(--light-hl-9); - --code-background: var(--light-code-background); -} - -:root[data-theme='dark'] { - --hl-0: var(--dark-hl-0); - --hl-1: var(--dark-hl-1); - --hl-2: var(--dark-hl-2); - --hl-3: var(--dark-hl-3); - --hl-4: var(--dark-hl-4); - --hl-5: var(--dark-hl-5); - --hl-6: var(--dark-hl-6); - --hl-7: var(--dark-hl-7); - --hl-8: var(--dark-hl-8); - --hl-9: var(--dark-hl-9); - --code-background: var(--dark-code-background); -} - -.hl-0 { color: var(--hl-0); } -.hl-1 { color: var(--hl-1); } -.hl-2 { color: var(--hl-2); } -.hl-3 { color: var(--hl-3); } -.hl-4 { color: var(--hl-4); } -.hl-5 { color: var(--hl-5); } -.hl-6 { color: var(--hl-6); } -.hl-7 { color: var(--hl-7); } -.hl-8 { color: var(--hl-8); } -.hl-9 { color: var(--hl-9); } -pre, code { background: var(--code-background); } diff --git a/docs/assets/icons.js b/docs/assets/icons.js deleted file mode 100644 index e88e8ca..0000000 --- a/docs/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 = `""`; - 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/assets/icons.svg b/docs/assets/icons.svg deleted file mode 100644 index e371b8b..0000000 --- a/docs/assets/icons.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/docs/assets/main.js b/docs/assets/main.js deleted file mode 100644 index 3572881..0000000 --- a/docs/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."}; -"use strict";(()=>{var Pe=Object.create;var ie=Object.defineProperty;var Oe=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of _e(e))!Me.call(t,i)&&i!==n&&ie(t,i,{get:()=>e[i],enumerable:!(r=Oe(e,i))||r.enumerable});return t};var Ae=(t,e,n)=>(n=t!=null?Pe(Re(t)):{},De(e||!t||!t.__esModule?ie(n,"default",{value:t,enumerable:!0}):n,t));var ue=Fe((ae,le)=>{(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,u],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(ol?d+=2:a==l&&(n+=r[u+1]*i[d+1],u+=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 l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}if(s.str.length==0&&(l.final=!0),i.push({node:l,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 u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}s.str.length==1&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var d=s.str.charAt(0),m=s.str.charAt(1),p;m in s.node.edges?p=s.node.edges[m]:(p=new t.TokenSet,s.node.edges[m]=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),l=0;l1?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)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default: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 ae=="object"?le.exports=n():e.lunr=n()}(this,function(){return t})})()});var se=[];function G(t,e){se.push({selector:e,constructor:t})}var U=class{constructor(){this.alwaysVisibleMember=null;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){se.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&&!Ve(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 Ve(t){let e=t.getBoundingClientRect(),n=Math.max(document.documentElement.clientHeight,window.innerHeight);return!(e.bottom<0||e.top-n>=0)}var oe=(t,e=100)=>{let n;return()=>{clearTimeout(n),n=setTimeout(()=>t(),e)}};var pe=Ae(ue());async function ce(t,e){if(!window.searchData)return;let n=await fetch(window.searchData),r=new Blob([await n.arrayBuffer()]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();t.data=i,t.index=pe.Index.load(i.index),e.classList.remove("loading"),e.classList.add("ready")}function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e={base:t.dataset.base+"/"},n=document.getElementById("tsd-search-script");t.classList.add("loading"),n&&(n.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),n.addEventListener("load",()=>{ce(e,t)}),ce(e,t));let r=document.querySelector("#tsd-search input"),i=document.querySelector("#tsd-search .results");if(!r||!i)throw new Error("The input field or the result list wrapper was not found");i.addEventListener("mouseup",()=>{te(t)}),r.addEventListener("focus",()=>t.classList.add("has-focus")),He(t,i,r,e)}function He(t,e,n,r){n.addEventListener("input",oe(()=>{Ne(t,e,n,r)},200)),n.addEventListener("keydown",i=>{i.key=="Enter"?Be(e,t):i.key=="ArrowUp"?(de(e,n,-1),i.preventDefault()):i.key==="ArrowDown"&&(de(e,n,1),i.preventDefault())}),document.body.addEventListener("keypress",i=>{i.altKey||i.ctrlKey||i.metaKey||!n.matches(":focus")&&i.key==="/"&&(i.preventDefault(),n.focus())}),document.body.addEventListener("keyup",i=>{t.classList.contains("has-focus")&&(i.key==="Escape"||!e.matches(":focus-within")&&!n.matches(":focus"))&&(n.blur(),te(t))})}function te(t){t.classList.remove("has-focus")}function Ne(t,e,n,r){if(!r.index||!r.data)return;e.textContent="";let i=n.value.trim(),s;if(i){let o=i.split(" ").map(a=>a.length?`*${a}*`:"").join(" ");s=r.index.search(o)}else s=[];for(let o=0;oa.score-o.score);for(let o=0,a=Math.min(10,s.length);o`,d=he(l.name,i);globalThis.DEBUG_SEARCH_WEIGHTS&&(d+=` (score: ${s[o].score.toFixed(2)})`),l.parent&&(d=` - ${he(l.parent,i)}.${d}`);let m=document.createElement("li");m.classList.value=l.classes??"";let p=document.createElement("a");p.href=r.base+l.url,p.innerHTML=u+d,m.append(p),p.addEventListener("focus",()=>{e.querySelector(".current")?.classList.remove("current"),m.classList.add("current")}),e.appendChild(m)}}function de(t,e,n){let r=t.querySelector(".current");if(!r)r=t.querySelector(n==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let i=r;if(n===1)do i=i.nextElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);else do i=i.previousElementSibling??void 0;while(i instanceof HTMLElement&&i.offsetParent==null);i?(r.classList.remove("current"),i.classList.add("current")):n===-1&&(r.classList.remove("current"),e.focus())}}function Be(t,e){let n=t.querySelector(".current");if(n||(n=t.querySelector("li:first-child")),n){let r=n.querySelector("a");r&&(window.location.href=r.href),te(e)}}function he(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(ee(t.substring(s,o)),`${ee(t.substring(o,o+r.length))}`),s=o+r.length,o=n.indexOf(r,s);return i.push(ee(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function ee(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var I=class{constructor(e){this.el=e.el,this.app=e.app}};var F="mousedown",ye="mousemove",N="mouseup",J={x:0,y:0},me=!1,ne=!1,qe=!1,D=!1,ve=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(ve?"is-mobile":"not-mobile");ve&&"ontouchstart"in document.documentElement&&(qe=!0,F="touchstart",ye="touchmove",N="touchend");document.addEventListener(F,t=>{ne=!0,D=!1;let e=F=="touchstart"?t.targetTouches[0]:t;J.y=e.pageY||0,J.x=e.pageX||0});document.addEventListener(ye,t=>{if(ne&&!D){let e=F=="touchstart"?t.targetTouches[0]:t,n=J.x-(e.pageX||0),r=J.y-(e.pageY||0);D=Math.sqrt(n*n+r*r)>10}});document.addEventListener(N,()=>{ne=!1});document.addEventListener("click",t=>{me&&(t.preventDefault(),t.stopImmediatePropagation(),me=!1)});var X=class extends I{constructor(e){super(e),this.className=this.el.dataset.toggle||"",this.el.addEventListener(N,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(F,n=>this.onDocumentPointerDown(n)),document.addEventListener(N,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){D||(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(!D&&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 re;try{re=localStorage}catch{re={getItem(){return null},setItem(){}}}var Q=re;var ge=document.head.appendChild(document.createElement("style"));ge.dataset.for="filters";var Y=class extends I{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()),ge.innerHTML+=`html:not(.${this.key}) .tsd-is-${this.el.name} { display: none; } -`,this.app.updateIndexVisibility()}fromLocalStorage(){let e=Q.getItem(this.key);return e?e==="true":this.el.checked}setLocalStorage(e){Q.setItem(this.key,e.toString()),this.value=e,this.handleValueChange()}handleValueChange(){this.el.checked=this.value,document.documentElement.classList.toggle(this.key,this.value),this.app.filterChanged(),this.app.updateIndexVisibility()}};var Z=class extends I{constructor(e){super(e),this.summary=this.el.querySelector(".tsd-accordion-summary"),this.icon=this.summary.querySelector("svg"),this.key=`tsd-accordion-${this.summary.dataset.key??this.summary.textContent.trim().replace(/\s+/g,"-").toLowerCase()}`;let n=Q.getItem(this.key);this.el.open=n?n==="true":this.el.open,this.el.addEventListener("toggle",()=>this.update());let r=this.summary.querySelector("a");r&&r.addEventListener("click",()=>{location.assign(r.href)}),this.update()}update(){this.icon.style.transform=`rotate(${this.el.open?0:-90}deg)`,Q.setItem(this.key,this.el.open.toString())}};function Ee(t){let e=Q.getItem("tsd-theme")||"os";t.value=e,xe(e),t.addEventListener("change",()=>{Q.setItem("tsd-theme",t.value),xe(t.value)})}function xe(t){document.documentElement.dataset.theme=t}var K;function we(){let t=document.getElementById("tsd-nav-script");t&&(t.addEventListener("load",Le),Le())}async function Le(){let t=document.getElementById("tsd-nav-container");if(!t||!window.navigationData)return;let n=await(await fetch(window.navigationData)).arrayBuffer(),r=new Blob([n]).stream().pipeThrough(new DecompressionStream("gzip")),i=await new Response(r).json();K=t.dataset.base,K.endsWith("/")||(K+="/"),t.innerHTML="";for(let s of i)Se(s,t,[]);window.app.createComponents(t),window.app.showPage(),window.app.ensureActivePageVisible()}function Se(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='',be(t,o);let a=s.appendChild(document.createElement("div"));a.className="tsd-accordion-details";let l=a.appendChild(document.createElement("ul"));l.className="tsd-nested-navigation";for(let u of t.children)Se(u,l,i)}else be(t,r,t.class)}function be(t,e,n){if(t.path){let r=e.appendChild(document.createElement("a"));r.href=K+t.path,n&&(r.className=n),location.pathname===r.pathname&&r.classList.add("current"),t.kind&&(r.innerHTML=``),r.appendChild(document.createElement("span")).textContent=t.text}else e.appendChild(document.createElement("span")).textContent=t.text}G(X,"a[data-toggle]");G(Z,".tsd-accordion");G(Y,".tsd-filter-item input[type=checkbox]");var Te=document.getElementById("tsd-theme");Te&&Ee(Te);var $e=new U;Object.defineProperty(window,"app",{value:$e});fe();we();})(); -/*! 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/assets/navigation.js b/docs/assets/navigation.js deleted file mode 100644 index 3797d61..0000000 --- a/docs/assets/navigation.js +++ /dev/null @@ -1 +0,0 @@ -window.navigationData = "data:application/octet-stream;base64,H4sIAAAAAAAAA4uuVipJrShRslJyKs0LLszJLEn1Tq0MS8wpTVXSUSpILMlQslJKzkksLk4t1sdQopdRkpujpKOUnZmXomRlaGRRqwM3z7MkNRdhRGZeSWpRWmJyarE+SAJVo5GpGZJG/4KSzPy8Yqx6oXL4tAelJucXpWDVDZHC1BwLAKWRDksGAQAA" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js deleted file mode 100644 index bd9ad5d..0000000 --- a/docs/assets/search.js +++ /dev/null @@ -1 +0,0 @@ -window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAA8WcS28bORKA/0v72uOIz5Z8m13sYRAMAswAuQhGoEgcRWtZ0rbanhiG//uC7FdVF9suugXPSbHEerG+KlIUO89Zefz7nN0sn7O73WGT3Uhj8+ywunfZTfZb5e6zPHso99lNtjtUrvxrtXbnT/796x/V/T7Ls/V+dT67c3aTZS95q0TMpO603LmnV5Vc1QOAojw7rUp3qFoXRhQ/rvYP7nXV7RCWchj6H259LDcx5fUnk8MHal6dgMaR1CmA6l+fhNcNuJ+nXenOb5nohzGNwLn+cqp2x0PURvMRf7ZLt9ocD/volENlV2Bg3OXWqxFD69KtqujUIzPdsHcZ8U7+Xe4YduDId5mqqv3vb6bgqh3FNiHnnYV/PRz+/N9+V7nP7ukr4rbR9omMeDXvRsg+G8fDuSof1tWxZGq9wiLxgKjLI7O3+c41G0ZOtIZz9YbB11PGj3BVrdgx1mPTLVpjVN8Xvn2rnk5cSoLR61rkF8W3fh2cHQuabfzjw21jlSmxwg48031tbtzeVe4/oYvzgx4IpU9AxIc04xfg2u0TTH58mt2+TbROSbTbj03zeu9W/CbZDJ6Y2vX+eGaH3A6eaHPrqn8fHw4V1ywYPxGpdYrZ9bttTsEqWL3uZLhY1c6CCbdS6D7wvTtsqx9cH7rRF0r019V+x+5dQ6GJPpwdO+H10ImInV2VsoW6AuM/FrTWcLdapXSxzuuRWTg9sGe9HvqxsZ8e2hL7RdiEsL2v45z5L63szR8YP73KEmprOuHbRMK3/xTh2wHhImVDtqWED2cdHcK87UszfHq2kzjbTuFsmPeg6deyXD2lmm+FPpyA3nqHwSwNA+D/6Pq6S0nJ7mJ1Hz5PQaETuFAPSIYBS/0z/WCAQ8q6N4hglIfHpMQ8vj8r0d7w5ft/3TplUcBSF/Li99Up1YVa5FJ18WfSwghlJnrwY8VOfT10YjW6n7tzxTbZjf7Y6qvNtlU3Tyi6xuHxdH92TylNsBn+jiTjIr9LMHv3bpuDWMOhzu6wDfWS+jU6KnyRw6Ev+w1SnnZYFJGefnhU63XnappjEQUfftAU96StpZRvMONhjaR3d1izz6SasZOB4ltsxk60uDqd3IF9QNGNnl7MaSvURdamrav+WB02x/vPLmXfBmUmlmaZar6cZHtK6XWWu0OSlO8Ovd9v5SLxmyQSukg2Uhwop1mfno9wiaDdvadsJIDnb2Uk9YQDS10kJ0kulBPtT88KPkxMOWqBvr/c5tnusHE/s5vn7NGV593xkN1k8lpdL7I8+2vn9ht/Kab2NM/Wx/t7F7Yxm+P6Ifzzthn21flfkP3gevSnWZYvZ7laXAt5e5svW9nwfnijVdG/E+REli9FrvT1bCAoiKBAgjLLlzImKImgRIIqy5cq4qkicgrJ6TFPNRHUSNCMeWqIoEGCNsuXOuKpJXIWyRVZvjQRuYLIFUhunuVLG5GbE7k5kltk+bKIyC2I3ALn3qMwjwgKSo0YYONhWES5iYCDyfFHlUsRg1VQdgSGR3gmhIjJUn4EBkgEgmRMliIkMEPCjMZLKRIYI38KvxQx5AUlSWCUhCdE6FzYa60UFqY4CcyTXz+WIkaioEgJzJRYjBumXAkMlt9JLEUMZUnJkpgsGTpSDGdJyZKDnhTIihEtI10JkyXVaMCSoiUxWjKgtYgZpmhJjJYM/SlWDpKiJTFa0tMiY+UgKVoSoyU9LDJWDpKSJTFZcj4+WRQtidGSHhYZqwdJyZKYLOVhkbGmrChZCpOlPCwyVg6KkqUwWSosdzGiFSVLDRa8cbJUZNHDZCkPi4yVg6JkKUyWMuOGKVoKo6UCWrFaUhQthdFSAa1YOSiKlsJoKQ+LipWDomQpTJYab1qKoqUwWtrTomK1pClaGqOlPS0qVkuaoqUxWtrTomLloClaGqOlx9HSFC092FB5WlSslnRkS4XR0h4WFaslTcnSmCztYVGxWtKULI3J0uProaZoaYyWDmjFaklTtDRGS3tYVKwcNCVLY7JMICtWDoaSZTBZxsOiY+VgKFkGk2U8LDpGtKFkGUyW8azoGNGGgmUwWEaPJslQssxgt+5h0bFyMJH9OibLhB17jGhDyTKYLONZ0TGiDQXLYLCMZ0XHiDYULIPBMp4VHYPSULAMBsvORifaUrIsJssGsmJEW0qWxWTZQFaMaEvJspgs62ExMaItJctisqxnxcSIthQsi8GynhUTI9pSsOzgm6BnxcSgtJEvgxgsO96yLCXLYrKsh8VEv4RSsiwmy3pYTIxoS8mymKxinKyCklVgsgoPi4mVQ0HJKjBZhYfFxMqhoGQVmKxifDUsKFrNW+FM5tGVldv8Vp/NLJfdGdFz9q05sBHdCdZzJors5vklz8SifpWqeZ3Xr6r5W5nmtRmnm/d1I290/WpnzWvzftH8XYTxL/1BUHi3Owvyn/mI2jP73lkz6521PCXfHw7ncHJ1556aJ3dA8ECfkCx9zRVeoGPR65CaqSNcye11SOCHNDwd8HkL4I0AEfFmqLkyC7yRwJuCp6N5LqdXUvQ6FiwVKNHCgDDmPPnwlARQoYAKy1PxHSkA0yB4ia1/2epVaMCG5fEVbsUDJ+YgF2wNDudCgGRIkaDEtQ8jAF0W6Jol6DqGny9d8/Nlc50KTBXw0TCJ6fSOKgXOGh5G7UULoARwYHgl1T2/B7QAElg6wrVPUJQAJcUryq2raG2D/iDZjgQ1j/XdbqALxKR4KGwdJoD4p0HhG3aYu/C7Vq9FgSg12zOCjwKZ17y6adWs6styQBdoR5pXyK2ue3/BCmgCJJi04I7NbTGgDPQXzSu7ravqizEgayA4w1u/tq6qf0Ia5s7ASuHVbKcrPPkLVIH82US3yF7BgF5SsGE44yo2AEzLW1O2riK+KLBfUOw5am8sAj2g2jR7gmo9lHAwQZrdWmplg2nSID7Dm+twJw9oABNteOVWX4QBKkBpWJ4TQ5ZBGLxCpS0IVIPmATMoArghrCXYavCMAk8ML73tI0lgyQCNQvLazbF9nB1UEahElo7wuArwAuw1FG82RnoV8MTywok3KjAtlje3Y10KhFbwuO8f3e/VgFLmtRfwwHyvBRSQ4PFfNv9PBCgAkCqWikErkSBFilfF58hWQIJYFC9D50jjlmBiFS89VbXHroDlXzQVLXi9m7oDqrGWSVCE+xTgTjOQuc2z0+7k9ruDy26Wty8v/wcyNR47OkUAAA=="; \ No newline at end of file diff --git a/docs/assets/style.css b/docs/assets/style.css deleted file mode 100644 index 9d619a6..0000000 --- a/docs/assets/style.css +++ /dev/null @@ -1,1448 +0,0 @@ -:root { - /* Light */ - --light-color-background: #f2f4f8; - --light-color-background-secondary: #eff0f1; - --light-color-warning-text: #222; - --light-color-background-warning: #e6e600; - --light-color-icon-background: var(--light-color-background); - --light-color-accent: #c5c7c9; - --light-color-active-menu-item: var(--light-color-accent); - --light-color-text: #222; - --light-color-text-aside: #6e6e6e; - --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: var(--light-color-ts-variable); - --light-color-ts-method: var(--light-color-ts-function); - --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: var(--light-color-ts-property); - --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-external-icon: url("data:image/svg+xml;utf8,"); - --light-color-scheme: light; - - /* Dark */ - --dark-color-background: #2b2e33; - --dark-color-background-secondary: #1e2024; - --dark-color-background-warning: #bebe00; - --dark-color-warning-text: #222; - --dark-color-icon-background: var(--dark-color-background-secondary); - --dark-color-accent: #9096a2; - --dark-color-active-menu-item: #5d5d6a; - --dark-color-text: #f5f5f5; - --dark-color-text-aside: #dddddd; - --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: var(--dark-color-ts-variable); - --dark-color-ts-method: var(--dark-color-ts-function); - --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: var(--dark-color-ts-property); - --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-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-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-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - --color-focus-outline: var(--light-color-focus-outline); - - --color-ts-keyword: var(--light-color-ts-keyword); - --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-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); - - --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-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-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - --color-focus-outline: var(--dark-color-focus-outline); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --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-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); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); - } -} - -html { - color-scheme: var(--color-scheme); -} - -body { - margin: 0; -} - -:root[data-theme="light"] { - --color-background: var(--light-color-background); - --color-background-secondary: var(--light-color-background-secondary); - --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-text-aside: var(--light-color-text-aside); - --color-link: var(--light-color-link); - --color-focus-outline: var(--light-color-focus-outline); - - --color-ts-keyword: var(--light-color-ts-keyword); - --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-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); - - --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-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-text-aside: var(--dark-color-text-aside); - --color-link: var(--dark-color-link); - --color-focus-outline: var(--dark-color-focus-outline); - - --color-ts-keyword: var(--dark-color-ts-keyword); - --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-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); - - --external-icon: var(--dark-external-icon); - --color-scheme: var(--dark-color-scheme); -} - -*: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 40px; -} - -.container { - max-width: 1700px; - padding: 0 2rem; -} - -/* Footer */ -footer { - border-top: 1px solid var(--color-accent); - padding-top: 1rem; - padding-bottom: 1rem; - max-height: 3.5rem; -} -footer > p { - margin: 0 1em; -} - -.container-main { - margin: 0 auto; - /* toolbar, footer, margin */ - min-height: calc(100vh - 41px - 56px - 4rem); -} - -@keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fade-out { - from { - opacity: 1; - visibility: visible; - } - to { - opacity: 0; - } -} -@keyframes fade-in-delayed { - 0% { - opacity: 0; - } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes fade-out-delayed { - 0% { - opacity: 1; - visibility: visible; - } - 66% { - opacity: 0; - } - 100% { - 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); -} - -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); -} - -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; - white-space: pre-wrap; - word-wrap: break-word; - padding: 10px; - border: 1px solid var(--color-accent); -} -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 { - opacity: 1; -} - -blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; -} - -.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-breadcrumb { - margin: 0; - 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 { - list-style: square; - margin: 0; -} -.tsd-hierarchy .target { - font-weight: bold; -} - -.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-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: 1rem 0; -} -.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); -} -.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 { - margin-left: 10px; -} -.tsd-page-navigation-section > summary { - padding: 0.25rem; -} -.tsd-page-navigation-section > div { - margin-left: 20px; -} -.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 */ -} -.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; -} -.tsd-accordion .tsd-accordion-summary > svg { - margin-left: 0.25rem; - vertical-align: text-top; -} -.tsd-index-content > :not(:first-child) { - margin-top: 0.75rem; -} -.tsd-index-heading { - margin-top: 1.5rem; - margin-bottom: 0.75rem; -} - -.tsd-kind-icon { - margin-right: 0.5rem; - width: 1.25rem; - height: 1.25rem; - min-width: 1.25rem; - min-height: 1.25rem; -} -.tsd-kind-icon path { - transform-origin: center; - transform: scale(1.1); -} -.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 { - transition: background-color 0.2s; -} -#tsd-search .title { - position: relative; - z-index: 2; -} -#tsd-search .field { - position: absolute; - left: 0; - top: 0; - right: 2.5rem; - height: 100%; -} -#tsd-search .field input { - box-sizing: border-box; - position: relative; - top: -50px; - z-index: 1; - width: 100%; - padding: 0 10px; - opacity: 0; - outline: 0; - border: 0; - background: transparent; - color: var(--color-text); -} -#tsd-search .field label { - position: absolute; - overflow: hidden; - right: -40px; -} -#tsd-search .field input, -#tsd-search .title, -#tsd-toolbar-links a { - transition: opacity 0.2s; -} -#tsd-search .results { - position: absolute; - visibility: hidden; - top: 40px; - width: 100%; - margin: 0; - padding: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -#tsd-search .results li { - background-color: var(--color-background); - line-height: initial; - padding: 4px; -} -#tsd-search .results li:nth-child(even) { - background-color: var(--color-background-secondary); -} -#tsd-search .results li.state { - display: none; -} -#tsd-search .results li.current:not(.no-results), -#tsd-search .results li:hover:not(.no-results) { - background-color: var(--color-accent); -} -#tsd-search .results a { - display: flex; - align-items: center; - padding: 0.25rem; - box-sizing: border-box; -} -#tsd-search .results a:before { - top: 10px; -} -#tsd-search .results span.parent { - color: var(--color-text-aside); - font-weight: normal; -} -#tsd-search.has-focus { - background-color: var(--color-accent); -} -#tsd-search.has-focus .field input { - top: 0; - opacity: 1; -} -#tsd-search.has-focus .title, -#tsd-search.has-focus #tsd-toolbar-links a { - z-index: 0; - opacity: 0; -} -#tsd-search.has-focus .results { - visibility: visible; -} -#tsd-search.loading .results li.state.loading { - display: block; -} -#tsd-search.failure .results li.state.failure { - display: block; -} - -#tsd-toolbar-links { - position: absolute; - top: 0; - right: 2rem; - height: 100%; - display: flex; - align-items: center; - justify-content: flex-end; -} -#tsd-toolbar-links a { - margin-left: 1.5rem; -} -#tsd-toolbar-links a:hover { - text-decoration: underline; -} - -.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: 1px var(--color-accent) solid; - transition: transform 0.3s ease-in-out; -} -.tsd-page-toolbar a { - color: var(--color-text); - text-decoration: none; -} -.tsd-page-toolbar a.title { - font-weight: bold; -} -.tsd-page-toolbar a.title:hover { - text-decoration: underline; -} -.tsd-page-toolbar .tsd-toolbar-contents { - display: flex; - justify-content: space-between; - height: 2.5rem; - margin: 0 auto; -} -.tsd-page-toolbar .table-cell { - position: relative; - white-space: nowrap; - line-height: 40px; -} -.tsd-page-toolbar .table-cell:first-child { - width: 100%; -} -.tsd-page-toolbar .tsd-toolbar-icon { - box-sizing: border-box; - line-height: 0; - padding: 12px 0; -} - -.tsd-widget { - display: inline-block; - overflow: hidden; - opacity: 0.8; - height: 40px; - transition: - opacity 0.1s, - background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-widget:hover { - opacity: 0.9; -} -.tsd-widget.active { - opacity: 1; - background-color: var(--color-accent); -} -.tsd-widget.no-caption { - width: 40px; -} -.tsd-widget.no-caption:before { - margin: 0; -} - -.tsd-widget.options, -.tsd-widget.menu { - display: none; -} -input[type="checkbox"] + .tsd-widget:before { - background-position: -120px 0; -} -input[type="checkbox"]:checked + .tsd-widget:before { - background-position: -160px 0; -} - -img { - max-width: 100%; -} - -.tsd-anchor-icon { - display: inline-flex; - align-items: center; - margin-left: 0.5rem; - vertical-align: middle; - color: var(--color-text); -} - -.tsd-anchor-icon svg { - width: 1em; - height: 1em; - visibility: hidden; -} - -.tsd-anchor-link:hover > .tsd-anchor-icon 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-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-literal { - color: var(--color-ts-type-literal); -} -.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); -} - -* { - 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); -} - -/* mobile */ -@media (max-width: 769px) { - .tsd-widget.options, - .tsd-widget.menu { - display: inline-block; - } - - .container-main { - display: flex; - } - html .col-content { - float: none; - max-width: 100%; - width: 100%; - } - html .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); - } - html .col-sidebar > *:last-child { - padding-bottom: 20px; - } - html .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-toolbar-links { - display: none; - } - .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"; - margin: 2rem auto; - } - - .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 - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; - padding-top: 1rem; - } - .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: 1rem 0; - } - - .page-menu, - .site-menu { - max-height: calc(100vh - 2rem - 42px); - overflow: auto; - position: sticky; - top: 42px; - } -} diff --git a/docs/classes/BunSqliteKeyValue.html b/docs/classes/BunSqliteKeyValue.html deleted file mode 100644 index 5ded24d..0000000 --- a/docs/classes/BunSqliteKeyValue.html +++ /dev/null @@ -1,48 +0,0 @@ -BunSqliteKeyValue | bun-sqlite-key-value

Constructors

Properties

count: (() => number) = ...
d: {
    [key: string]: any;
} = ...
data: {
    [key: string]: any;
} = ...
db: Database
del: ((keyOrKeys?: string | string[]) => void) = ...
deleteOldestExpiringItems: ((maxExpiringItemsInDb: number) => void) = ...
exists: ((key: string) => boolean) = ...
getItemsArray: (<T>(startsWithOrKeys?: string | string[]) => undefined | Item<T>[]) = ...
getValue: (<T>(key: string) => undefined | T) = ...
getValuesArray: (<T>(startsWithOrKeys?: string | string[]) => undefined | (undefined | T)[]) = ...
put: (<T>(key: string, value: T, ttlMs?: number) => void) = ...
randomItem: (<T>() => undefined | Item<T>) = ...
randomKey: (() => undefined | string) = ...
randomValue: (<T>() => undefined | T) = ...
setValue: (<T>(key: string, value: T, ttlMs?: number) => void) = ...
ttlMs: undefined | number

Accessors

  • get keys(): undefined | string[]
  • Returns undefined | string[]

  • get values(): undefined | any[]
  • Returns undefined | any[]

Methods

  • Parameters

    • key: string
    • value: string
    • OptionalttlMs: number

    Returns number

  • Parameters

    • key: string
    • decrBy: number = 1
    • OptionalttlMs: number

    Returns number

  • Parameters

    • OptionalkeyOrKeys: string | string[]

    Returns void

  • Parameters

    • maxExpiringItemsInDb: number

    Returns void

  • Type Parameters

    • T = any

    Parameters

    • key: string

    Returns undefined | T

  • Parameters

    • OptionaldeleteExpired: boolean

    Returns number

  • Returns number

  • Type Parameters

    • T = any

    Parameters

    • key: string

    Returns undefined | Item<T>

  • Type Parameters

    • T = any

    Parameters

    • OptionalstartsWithOrKeys: string | string[]

    Returns undefined | Item<T>[]

  • Type Parameters

    • T = any

    Parameters

    • OptionalstartsWithOrKeys: string | string[]

    Returns undefined | Map<string, undefined | T>

  • Type Parameters

    • T = any

    Parameters

    • OptionalstartsWithOrKeys: string | string[]

    Returns undefined | {
        [key: string]: T | undefined;
    }

  • Parameters

    • OptionalstartsWithOrKeys: string | string[]

    Returns undefined | string[]

  • Returns undefined | string

  • Type Parameters

    • T = any

    Returns undefined | T

  • Type Parameters

    • T = any

    Parameters

    • key: string
    • value: T
    • OptionalttlMs: number

    Returns undefined | T

  • Type Parameters

    • T = any

    Parameters

    • OptionalstartsWithOrKeys: string | string[]

    Returns undefined | (undefined | T)[]

  • Type Parameters

    • T = any

    Parameters

    • OptionalstartsWithOrKeys: string | string[]

    Returns undefined | Set<T>

  • Parameters

    • key: string

    Returns boolean

  • Parameters

    • key: string
    • incrBy: number = 1
    • OptionalttlMs: number

    Returns number

  • Type Parameters

    • T = any

    Parameters

    • key: string
    • value: T
    • OptionalttlMs: number

    Returns void

  • Type Parameters

    • T = any

    Parameters

    • items: {
          key: string;
          ttlMs?: number;
          value: T;
      }[]

    Returns void

diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 4253526..0000000 --- a/docs/index.html +++ /dev/null @@ -1,370 +0,0 @@ -bun-sqlite-key-value

bun-sqlite-key-value

Bun SQLite Key Value

A super fast key-value store with SQLite that uses bun:sqlite -and v8 as a fast JSON replacement.

-

Bun's lightning-fast -SQLite implementation makes Bun-SQLite-Key-Value -perfect for a fast storage and cache solution with TTL support. -You need Bun to be able to use this package.

-

The ideas for the implementation come from -bun-sqlite-cache and -bun-kv. Thank you very much!

-
bun add bun-sqlite-key-value
-
- -

Using this key value store is dead simple: -create a new BunSqliteKeyValue instance and you're set. -And if you want to save the data permanently, enter the path to the database.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

// Use regular methods to write and read values.
store.set("myKey", [1, 2, 3, 4])
store.get("myKey") // --> [ 1, 2, 3, 4 ]

// Or use the data proxy object.
store.data.myKey = "Hello world!"
store.data.myKey // --> "Hello World"

// Or use the short name for the data proxy object.
store.d.myKey = 123456789
store.d.myKey // --> 123456789 -
- -
const store = new BunSqliteKeyValue(filename?, options?)
-
- -

Opens and creates the SQLite database either in memory or on the file system.

-

The full path of the SQLite database to open. -Pass an empty string ("") or ":memory:" or undefined for an in-memory database.

-

readonly?: boolean: -Open the database as read-only (default: false).

-

create?: boolean: -Allow creating a new database (default: true). -If the database folder does not exist, it will be created.

-

readwrite?: boolean: -Open the database as read-write (default: true).

-

ttlMs?: boolean: -Standard time period in milliseconds before -an entry written to the DB becomes invalid.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

// In-memory
const store1 = new BunSqliteKeyValue()
// In-memory with 30 seconds default expiration timeout
const store2 = new BunSqliteKeyValue(undefined, {ttlMs: 30000})
// Store items in file system
const store3 = new BunSqliteKeyValue("./store3.sqlite") -
- -
set(key: string, value: any, ttlMs?: number)

data.<key> = <value>
data[<key>] = <value>

d.<key> = <value>
d[<key>] = <value> -
- -

Writes a value into the database.

-

The key must be a string.

-

The value can be any object that can be serialized with -v8. -This means that not only simple data types (string, number) are possible, -but also more complex types such as sets or maps. -You can find a list of the -supported data types here.

-

"Time to live" in milliseconds. After this time, -the item becomes invalid and is deleted from the database -the next time it is accessed or when the application is started. -Set the value to 0 if you want to explicitly deactivate the process.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

// Stays in database
store.set("myKey1", "my-value")

store.data.myKey2 = "my-value"
store.data["myKey3"] = "my-value"

store.d.myKey4 = "my-value"
store.d["myKey5"] = "my-value"

// Becomes invalid after 30 seconds
store.set("myKey6", "item-with-ttl", 30000) -
- -
get(key: string): any

data.<key>: any
data[<key>]: any

d.<key>: any
d[<key>]: any -
- -

Reads a value from the database.

-

The key must be a string.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("myKey", "my-value")

store.get("myKey") // --> "my-value"

store.data.myKey // --> "my-value"
store.data["myKey"] // --> "my-value"

store.d.myKey // --> "my-value"
store.d["myKey"] // --> "my-value" -
- -
getRandomValue(): any // --> random value

randomValue() // --> alias for getRandomValue() -
- -

Returns a random value or undefined if no valid item was found. -Inspired by: https://docs.keydb.dev/docs/commands/#randomkey

-

Reads the key and the value from the database.

-
getItem(key: string): {key: string, value: any}
-
- -

The key must be a string.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()
store.set("my-key", "my-value")

const item = store.getItem("my-key")
console.log(item) // --> {key: "my-key", value: "my-value"} -
- -
getRandomItem() // --> random item

randomItem() // --> alias for getRandomItem() -
- -

Returns a random item or undefined if no valid item was found. -Inspired by: https://docs.keydb.dev/docs/commands/#randomkey

-
setItems(items: {key: string, value: T, ttlMs?: number}[]) {
-
- -

Adds a large number of items to the database and takes only -a small fraction of the time that set() would take individually.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

// Add many records
store.setItems([
{key: "a:1", value: "test-value-1"},
{key: "a:2", value: "test-value-2"},
]) -
- -
getValues(startsWithOrKeys?: string | string[]): any[]

<store>.values -
- -

Reads the data from the database and returns an array with the values.

-

undefined: Returns all values in an array.

-

string: Returns all values in an array whose keys begin with the passed string. -If you plan the names of the keys well, more complex data can be stored. -It is advisable to divide keys into ranges using separators. -For example "language:de", "language:en", "language:it". -A search for "language:" would return all languages.

-

string[]: Array with keys. The returned array is exactly -the same size as the passed array. -Entries that are not found are returned as undefined. -Only exact matches with the keys are returned.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("language:de", "German")
store.set("language:en", "English")
store.set("language:it", "Italian")

store.getValues() // --> [ "German", "English", "Italian" ]
store.getValues("language:") // --> [ "German", "English", "Italian" ]

store.values // --> [ "German", "English", "Italian" ] -
- -
getItems(startsWithOrKeys?: string | string[]): {key: string, value: any}[]

<store>.items -
- -

Reads the data from the database and returns entries in an array as key-value pairs.

-

undefined: Returns all items (key, value) in an array.

-

string: Returns all items (key, value) in an array whose keys begin with -the passed string. -If you plan the names of the keys well, more complex data can be stored. -It is advisable to divide keys into ranges using separators. -For example "language:de", "language:en", "language:it". -A search for "language:" would return all languages.

-

string[]: Array with keys. The returned array is exactly -the same size as the passed array. -Entries that are not found are returned as undefined. -Only exact matches with the keys are returned.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("language:de", "German")
store.set("language:en", "English")
store.set("language:it", "Italian")

store.getItems("language:") // --> [
// {key: "language:de", value: "German"},
// {key: "language:en", value: "English"},
// {key: "language:it", value: "Italian"}
// ]

store.items // --> [
// {key: "language:de", value: "German"},
// {key: "language:en", value: "English"},
// {key: "language:it", value: "Italian"}
// ]
-
- -

It is no problem at all to use several databases and access them at the same time.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"
import { join } from "node:path"

const dbDir = join(__dirname, "databases")
const settingsPath = join(dbDir, "settings.sqlite")
const languagesPath = join(dbDir, "languages.sqlite")

const settingsStore = new BunSqliteKeyValue(settingsPath)
const languagesStore = new BunSqliteKeyValue(languagesPath)

// Write settings
settingsStore.set("language", "de")
settingsStore.set("page-size", "A4")
settingsStore.set("screen-position", {top: 100, left: 100})

// Write languages
languagesStore.set("de", "German")
languagesStore.set("en", "English")
languagesStore.set("it", "Italian")

// Read all settings
const settingItems = settingsStore.getItems()
console.log(settingItems) // -> [
// {key: "language", value: "de"},
// {key: "page-size", value: "A4"},
// {key: "screen-position", value: {top: 100, left: 100}},
// ]

// Read all languages
const languageValues = languagesStore.getValues()
console.log(languageValues) // -> [ "German", "English", "Italian" ]

// Read current language
const languageKey = settingsStore.get("language")
const currentLanguage = languagesStore.get(languageKey)
console.log(`Current language: "${currentLanguage}"`) // -> Current language: "German"

// Close DBs
settingsStore.close()
languagesStore.close() -
- -

SQLite has no problem with images and other binaries. -The maximum size of a binary file is 2 GB.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

// Read file from filesystem
const sourceFile = Bun.file("<Source File Path>")

// Write ArrayBuffer into database (async !!!)
store.set("my-image", await sourceFile.arrayBuffer())

// Read ArrayBuffer from database
const targetArrayBuffer = store.get("my-image")

// Write target file to filesystem (async !!!)
await Bun.write(Bun.file("<Target File Path>"), targetArrayBuffer) -
- -
import { BunSqliteKeyValue } from "bun-sqlite-key-value"
import { readFileSync, writeFileSync } from "node:fs"

const store = new BunSqliteKeyValue()

// Read content from filesystem
const sourceContent = readFileSync("<Source File Path>")

// Write Buffer into database
store.set("my-image", sourceContent)

// Read Buffer from database
const targetBuffer = store.get("my-image")

// Write target file to filesystem
writeFileSync("<Target File Path>", targetBuffer) -
- -

You can specify a caching period when you open the database. -This period in milliseconds is then added with each write. -If you read the value within this period, the value is returned. -If the value is read after this period, undefined is returned.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue(undefined, {ttlMs: 1000})

const KEY = "cache-key"
store.set(KEY, 12345)

await Bun.sleep(500)
console.log(store.get(KEY)) // --> 12345

await Bun.sleep(1000)
console.log(store.get(KEY)) // --> undefined -
- -
has(key: string): boolean

<key> in <store>.data
<key> in <store>.d -
- -

Checks if key exists. Returns false if the item is expired.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.has("my-key") // --> false
console.log("my-key" in store.data) // --> false -
- -
getKeys(startsWithOrKeys?: string | string[]): string[]

<store>.keys // --> all keys -
- -

Reads the keys from the database and returns an array.

-

undefined: Returns all keys in an array.

-

string: Returns an array with the keys that begin with the passed string. -If you plan the names of the keys well, more complex data can be stored. -It is advisable to divide keys into ranges using separators. -For example "language:de", "language:en", "language:it". -A search for "language:" would return all languages.

-

string[]: Array with keys. -Only exact matches with the keys are returned.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("language:de", "German")
store.set("language:en", "English")
store.set("language:es", "Esperanto")

store.getKeys() // --> ["language:de", "language:en", "language:es"]

store.keys // --> ["language:de", "language:en", "language:es"]

store.getKeys("language:e") // --> ["language:en", "language:es"]

store.getKeys(["language:de", "language:fr"]) // --> ["language:de"]
-
- -
getRandomKey() // --> random key

randomKey() // --> alias for getRandomKey() -
- -

Returns a random key or undefined if no valid item was found. -Inspired by: https://docs.keydb.dev/docs/commands/#randomkey

-
delete()
delete(key: string)
delete(keys: string[])
clear() // --> alias for `delete()`

delete <store>.data.<key>
delete <store>.d.<key> -
- -

Deletes all items if no parameter was passed.

-

key: string: Deletes the entry whose key was passed as a string.

-

keys: string[]: Deletes the entries whose keys were passed in an array.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

// Delete all items
store.delete()
store.clear()

// Delete one item
store.delete("myKey")
delete store.data.myKey
delete store.d.myKey

// Delete multiple items
store.delete(["key1", "key2"]) -
- -
deleteOldExpiringItems(maxExpiringItemsInDb: number)
-
- -

If there are more expiring items in the database than maxExpiringItemsInDb, -the oldest items are deleted until there are only maxExpiringItemsInDb items with -an expiration date in the database.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("static:1", "my-value")
store.set("static:2", "my-value")
store.set("dynamic:1", "my-value", 40)
store.set("dynamic:2", "my-value", 45)
store.set("dynamic:3", "my-value", 50)

store.deleteOldExpiringItems(2)
console.log(store.getKeys("dynamic:"))
// --> [ "dynamic:2", "dynamic:3" ] -
- -
getCount(): number

length // --> alias for `getCount()` -
- -

Returns the number of all items, including those that have already expired. -The fact that possibly expired entries are also counted is for reasons of speed. -Use getCountValid() if you want to get the number of items that have not yet expired. -If you do not use ttlMs (time to live), getCount() is faster than getCountValid().

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("my-key1", "my-value1")
store.set("my-key2", "my-value2")

store.getCount() // --> 2
store.length // --> 2 -
- -
getCountValid(deleteExpired?: boolean): number
-
- -

Returns the number of valid (non-expired) items. -Can also delete the expired items.

-

If the parameter is not specified or false is passed, -then only the entries that have no expiration date or -whose expiration date is in the future are counted.

-

If true is passed, the expired entries are deleted first -before the entries are counted.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("my-key1", "my-value1")
store.set("my-key2", "my-value2", 100)

store.getCountValid() // --> 2

await Bun.sleep(500)
store.getCountValid() // --> 1 -
- -
incr(key: string, incrBy: number = 1, ttlMs?: number): number
-
- -

Increments the saved number by incrBy (default = 1), -saves the new number and returns it. -If the key does not yet exist in the database, -the value is set to 0 before being incremented by incrBy. -If a string is stored in the database that can be converted into a number, -this is converted first. -If the stored value cannot be converted into a number, NaN is returned.

-

The key must be a string.

-

The stored number is increased by this value.

-

"Time to live" in milliseconds. After this time, -the item becomes invalid and is deleted from the database -the next time it is accessed or when the application is started. -Set the value to 0 if you want to explicitly deactivate the process.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.incr("my-key") // --> 1
store.incr("my-key") // --> 2 -
- -
decr(key: string, decrBy: number = 1, ttlMs?: number): number
-
- -

Decrements the saved number by decrBy (default = 1), -saves the new number and returns it. -If the key does not yet exist in the database, -the value is set to 0 before being decremented by decrBy. -If a string is stored in the database that can be converted into a number, -this is converted first. -If the stored value cannot be converted into a number, NaN is returned.

-

The key must be a string.

-

The stored number is decreased by this value.

-

"Time to live" in milliseconds. After this time, -the item becomes invalid and is deleted from the database -the next time it is accessed or when the application is started. -Set the value to 0 if you want to explicitly deactivate the process.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.set("my-key", 10)
store.decr("my-key") // --> 9
store.decr("my-key") // --> 8 -
- -
append(key: string, value: string, ttlMs?: number): number
-
- -

If key already exists, this command appends the value at the end of the string. -If key does not exist it is created and set as an empty string, -so append() will be similar to set() in this special case. -Inspired by: https://docs.keydb.dev/docs/commands/#append

-

Returns the length of the string after the append operation.

-

The key must be a string.

-

The string that is appended to the existing string.

-

"Time to live" in milliseconds. After this time, -the item becomes invalid and is deleted from the database -the next time it is accessed or when the application is started. -Set the value to 0 if you want to explicitly deactivate the process.

-
import { BunSqliteKeyValue } from "bun-sqlite-key-value"

const store = new BunSqliteKeyValue()

store.append("my-key", "Hello!") // --> 6
store.append("my-key", "World!") // --> 12
store.get("my-key") // --> "Hello!World!" -
- -
    -
  • new BunSqliteKeyValue() --> Open database
  • -
  • close() --> Close database
  • -
-
    -
  • set(key: string, value: any)
  • -
  • setValue(key: string, value: any) --> alias for set()
  • -
  • <store>.data.<key> = <value>
  • -
  • <store>.d.<key> = <value>
  • -
-
    -
  • setItems({key: string, value: any}[])
  • -
-
    -
  • get(key: string): any
  • -
  • getValue(key: string) --> alias for get()
  • -
  • <store>.data.<key>
  • -
  • <store>.d.<key>
  • -
  • getSet(key: string, value: any): any
  • -
  • getRandomValue(): any
  • -
  • randomValue(): any --> alias for getRandomValue()
  • -
-
    -
  • getItem(key: string) --> Object
  • -
  • getRandomItem() --> Object
  • -
  • randomItem() --> Alias for getRandomItem()
  • -
-
    -
  • getItems() --> Array with all items
  • -
  • getItems(startsWith: string) --> Array
  • -
  • getItems(keys: string[]) --> Array
  • -
  • getItemsArray() --> alias for getItems()
  • -
  • getItemsArray(startsWith: string) --> alias for getItems()
  • -
  • getItemsArray(keys: string[]) --> alias for getItems()
  • -
  • items --> alias for getItems()
  • -
-
    -
  • getItemsObject() --> Object with all items
  • -
  • getItemsObject(startsWith: string) --> Object
  • -
  • getItemsObject(keys: string[]) --> Object
  • -
-
    -
  • getItemsMap() --> Map with all items
  • -
  • getItemsMap(startsWith: string) --> Map
  • -
  • getItemsMap(keys: string[]) --> Map
  • -
-
    -
  • getValues() --> Array with all values
  • -
  • getValues(startsWith: string) --> Array
  • -
  • getValues(keys: string[]) --> Array
  • -
  • getValuesArray() --> alias for getValues()
  • -
  • getValuesArray(startsWith: string) --> alias for getValues()
  • -
  • getValuesArray(keys: string[]) --> alias for getValues()
  • -
  • values --> alias for getValues()
  • -
-
    -
  • getValuesSet() --> Set with all values
  • -
  • getValuesSet(startsWith: string) --> Set
  • -
  • getValuesSet(keys: string[]) --> Set
  • -
-
    -
  • delete() --> Delete all items
  • -
  • delete(key: string) --> Delete item
  • -
  • delete(keys: string[]) --> Delete items
  • -
  • clear() --> alias for delete()
  • -
  • deleteOldExpiringItems(maxExpiringItemsInDb: number) --> Delete items
  • -
  • delete <store>.data.<key>
  • -
  • delete <store>.d.<key>
  • -
-
    -
  • getCount() --> Number
  • -
  • length --> alias for getCount()
  • -
  • getCountValid(deleteExpired?: boolean) --> Number
  • -
-
    -
  • has(key: string) --> Boolean
  • -
  • getKeys() --> Array with all Keys
  • -
  • getKeys(startsWith: string) --> Array
  • -
  • getKeys(keys: string[]) --> Array
  • -
  • keys --> alias for getKeys()
  • -
  • <key> in <store>.data
  • -
  • <key> in <store>.d
  • -
  • getRandomKey()
  • -
  • randomKey() --> alias for getRandomKey()
  • -
-
    -
  • incr() --> Number
  • -
  • decr() --> Number
  • -
-
    -
  • append() --> Number
  • -
-

SQLite provides a solid and well-tested foundation. -SQLite reliably takes care of saving and reading data - -both for short strings and for larger BLOBs. -It provides a robust foundation on which to build. -Even if SQLite is not fully utilized and no relations between tables are required, -this is not a disadvantage.

-

Please give this GitHub project -a ⭐ if this project is useful to you. Thank you very much! -And if you speak German, here is my business homepage: -GP-Softwaretechnik -Maybe you will find something interesting for you there. 😃

-
diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..38adc93 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,915 @@ +# Bun SQLite Key Value + +A super fast key-value store with SQLite that uses **bun:sqlite** +and v8 as a fast JSON replacement. + +[Bun's](https://bun.sh/) lightning-fast +[SQLite implementation](https://bun.sh/docs/api/sqlite) makes Bun-SQLite-Key-Value +perfect for a fast storage and cache solution with TTL support. +*You need [Bun](https://bun.sh/) to be able to use this package.* + +The ideas for the implementation come from +[bun-sqlite-cache](https://github.com/notskamr/bun-sqlite-cache) and +[bun-kv](https://github.com/kirill-dev-pro/bun-kv). Thank you very much! + + +## Installation + +```bash +bun add bun-sqlite-key-value +``` + +## Usage + +Using this key value store is dead simple: +create a new BunSqliteKeyValue instance and you're set. +And if you want to save the data permanently, enter the path to the database. + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +// Use regular methods to write and read values. +store.set("myKey", [1, 2, 3, 4]) +store.get("myKey") // --> [ 1, 2, 3, 4 ] + +// Or use the data proxy object. +store.data.myKey = "Hello world!" +store.data.myKey // --> "Hello World" + +// Or use the short name for the data proxy object. +store.d.myKey = 123456789 +store.d.myKey // --> 123456789 +``` + +## Open Database + +```typescript +const store = new BunSqliteKeyValue(filename?, options?) +``` + +Opens and creates the SQLite database either in memory or on the file system. + +### filename (optional) + +The full path of the SQLite database to open. +Pass an empty string (`""`) or `":memory:"` or `undefined` for an in-memory database. + +### options (optional) + +`readonly?: boolean`: + Open the database as read-only (default: false). + +`create?: boolean`: + Allow creating a new database (default: true). + If the database folder does not exist, it will be created. + +`readwrite?: boolean`: + Open the database as read-write (default: true). + +`ttlMs?: boolean`: + Standard time period in milliseconds before + an entry written to the DB becomes invalid. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +// In-memory +const store1 = new BunSqliteKeyValue() +// In-memory with 30 seconds default expiration timeout +const store2 = new BunSqliteKeyValue(undefined, {ttlMs: 30000}) +// Store items in file system +const store3 = new BunSqliteKeyValue("./store3.sqlite") +``` + + +## Write Value + +```typescript +set(key: string, value: any, ttlMs?: number) + +data. = +data[] = + +d. = +d[] = +``` + +Writes a value into the database. + +### key + +The key must be a string. + +### value + +The value can be any object that can be serialized with +[v8](https://github.com/nodejs/node/blob/main/doc/api/v8.md#serialization-api). +This means that not only simple data types (string, number) are possible, +but also more complex types such as sets or maps. +You can find a list of the +[supported data types](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#supported_types) here. + +### ttlMs (optional) + +"Time to live" in milliseconds. After this time, +the item becomes invalid and is deleted from the database +the next time it is accessed or when the application is started. +Set the value to 0 if you want to explicitly deactivate the process. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +// Stays in database +store.set("myKey1", "my-value") + +store.data.myKey2 = "my-value" +store.data["myKey3"] = "my-value" + +store.d.myKey4 = "my-value" +store.d["myKey5"] = "my-value" + +// Becomes invalid after 30 seconds +store.set("myKey6", "item-with-ttl", 30000) +``` + + +## Read Value + +```typescript +get(key: string): any + +data.: any +data[]: any + +d.: any +d[]: any +``` + +Reads a value from the database. + +### key + +The key must be a string. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.set("myKey", "my-value") + +store.get("myKey") // --> "my-value" + +store.data.myKey // --> "my-value" +store.data["myKey"] // --> "my-value" + +store.d.myKey // --> "my-value" +store.d["myKey"] // --> "my-value" +``` + + +## Random Value + +```typescript +getRandomValue(): any // --> random value + +randomValue() // --> alias for getRandomValue() +``` + +Returns a random value or `undefined` if no valid item was found. +Inspired by: https://docs.keydb.dev/docs/commands/#randomkey + + +## Read Item + +Reads the key and the value from the database. + +```typescript +getItem(key: string): {key: string, value: any} +``` + +### key + +The key must be a string. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() +store.set("my-key", "my-value") + +const item = store.getItem("my-key") +console.log(item) // --> {key: "my-key", value: "my-value"} +``` + + +## Random Item + +```typescript +getRandomItem() // --> random item + +randomItem() // --> alias for getRandomItem() +``` + +Returns a random item or `undefined` if no valid item was found. +Inspired by: https://docs.keydb.dev/docs/commands/#randomkey + + +## Write Multiple Items + +```typescript +setItems(items: {key: string, value: T, ttlMs?: number}[]) { +``` + +Adds a large number of items to the database and takes only +a small fraction of the time that `set()` would take individually. + + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +// Add many records +store.setItems([ + {key: "a:1", value: "test-value-1"}, + {key: "a:2", value: "test-value-2"}, +]) +``` + + +## Read Values + +```typescript +getValues(startsWithOrKeys?: string | string[]): any[] + +.values +``` + +Reads the data from the database and returns an array with the values. + +### startsWithOrKeys + +`undefined`: Returns all values in an array. + +`string`: Returns all values in an array whose keys begin with the passed string. + If you plan the names of the keys well, more complex data can be stored. + It is advisable to divide keys into ranges using separators. + For example `"language:de"`, `"language:en"`, `"language:it"`. + A search for `"language:"` would return all languages. + +`string[]`: Array with keys. The returned array is exactly + the same size as the passed array. + Entries that are not found are returned as `undefined`. + Only exact matches with the keys are returned. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.set("language:de", "German") +store.set("language:en", "English") +store.set("language:it", "Italian") + +store.getValues() // --> [ "German", "English", "Italian" ] +store.getValues("language:") // --> [ "German", "English", "Italian" ] + +store.values // --> [ "German", "English", "Italian" ] +``` + + +## Read Items + +```typescript +getItems(startsWithOrKeys?: string | string[]): {key: string, value: any}[] + +.items +``` +Reads the data from the database and returns entries in an array as key-value pairs. + +### startsWithOrKeys + +`undefined`: Returns all items (key, value) in an array. + +`string`: Returns all items (key, value) in an array whose keys begin with + the passed string. + If you plan the names of the keys well, more complex data can be stored. + It is advisable to divide keys into ranges using separators. + For example `"language:de"`, `"language:en"`, `"language:it"`. + A search for `"language:"` would return all languages. + +`string[]`: Array with keys. The returned array is exactly + the same size as the passed array. + Entries that are not found are returned as `undefined`. + Only exact matches with the keys are returned. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.set("language:de", "German") +store.set("language:en", "English") +store.set("language:it", "Italian") + +store.getItems("language:") // --> [ +// {key: "language:de", value: "German"}, +// {key: "language:en", value: "English"}, +// {key: "language:it", value: "Italian"} +// ] + +store.items // --> [ +// {key: "language:de", value: "German"}, +// {key: "language:en", value: "English"}, +// {key: "language:it", value: "Italian"} +// ] + +``` + + +## Multiple Databases + +It is no problem at all to use several databases and access them at the same time. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" +import { join } from "node:path" + +const dbDir = join(__dirname, "databases") +const settingsPath = join(dbDir, "settings.sqlite") +const languagesPath = join(dbDir, "languages.sqlite") + +const settingsStore = new BunSqliteKeyValue(settingsPath) +const languagesStore = new BunSqliteKeyValue(languagesPath) + +// Write settings +settingsStore.set("language", "de") +settingsStore.set("page-size", "A4") +settingsStore.set("screen-position", {top: 100, left: 100}) + +// Write languages +languagesStore.set("de", "German") +languagesStore.set("en", "English") +languagesStore.set("it", "Italian") + +// Read all settings +const settingItems = settingsStore.getItems() +console.log(settingItems) // -> [ +// {key: "language", value: "de"}, +// {key: "page-size", value: "A4"}, +// {key: "screen-position", value: {top: 100, left: 100}}, +// ] + +// Read all languages +const languageValues = languagesStore.getValues() +console.log(languageValues) // -> [ "German", "English", "Italian" ] + +// Read current language +const languageKey = settingsStore.get("language") +const currentLanguage = languagesStore.get(languageKey) +console.log(`Current language: "${currentLanguage}"`) // -> Current language: "German" + +// Close DBs +settingsStore.close() +languagesStore.close() +``` + + +## Read and Write Binary Files (Images) + +SQLite has no problem with images and other binaries. +The maximum size of a binary file is 2 GB. + +### Example (async) + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +// Read file from filesystem +const sourceFile = Bun.file("") + +// Write ArrayBuffer into database (async !!!) +store.set("my-image", await sourceFile.arrayBuffer()) + +// Read ArrayBuffer from database +const targetArrayBuffer = store.get("my-image") + +// Write target file to filesystem (async !!!) +await Bun.write(Bun.file(""), targetArrayBuffer) +``` + +### Example (sync) + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" +import { readFileSync, writeFileSync } from "node:fs" + +const store = new BunSqliteKeyValue() + +// Read content from filesystem +const sourceContent = readFileSync("") + +// Write Buffer into database +store.set("my-image", sourceContent) + +// Read Buffer from database +const targetBuffer = store.get("my-image") + +// Write target file to filesystem +writeFileSync("", targetBuffer) +``` + +## Cache Values with TTL + +You can specify a caching period when you open the database. +This period in milliseconds is then added with each write. +If you read the value within this period, the value is returned. +If the value is read after this period, `undefined` is returned. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue(undefined, {ttlMs: 1000}) + +const KEY = "cache-key" +store.set(KEY, 12345) + +await Bun.sleep(500) +console.log(store.get(KEY)) // --> 12345 + +await Bun.sleep(1000) +console.log(store.get(KEY)) // --> undefined +``` + + +## Has (key) + +```typescript +has(key: string): boolean + + in .data + in .d +``` + +Checks if key exists. Returns `false` if the item is expired. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.has("my-key") // --> false +console.log("my-key" in store.data) // --> false +``` + + +## Read Keys + +```typescript +getKeys(startsWithOrKeys?: string | string[]): string[] + +.keys // --> all keys +``` + +Reads the keys from the database and returns an array. + +### startsWithOrKeys + +`undefined`: Returns all keys in an array. + +`string`: Returns an array with the keys that begin with the passed string. + If you plan the names of the keys well, more complex data can be stored. + It is advisable to divide keys into ranges using separators. + For example `"language:de"`, `"language:en"`, `"language:it"`. + A search for `"language:"` would return all languages. + +`string[]`: Array with keys. + Only exact matches with the keys are returned. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.set("language:de", "German") +store.set("language:en", "English") +store.set("language:es", "Esperanto") + +store.getKeys() // --> ["language:de", "language:en", "language:es"] + +store.keys // --> ["language:de", "language:en", "language:es"] + +store.getKeys("language:e") // --> ["language:en", "language:es"] + +store.getKeys(["language:de", "language:fr"]) // --> ["language:de"] + +``` + + +## Random Key + +```typescript +getRandomKey() // --> random key + +randomKey() // --> alias for getRandomKey() +``` + +Returns a random key or `undefined` if no valid item was found. +Inspired by: https://docs.keydb.dev/docs/commands/#randomkey + + +## Delete Items + +```typescript +delete() +delete(key: string) +delete(keys: string[]) +clear() // --> alias for `delete()` + +delete .data. +delete .d. +``` + +Deletes all items if no parameter was passed. + +`key: string`: Deletes the entry whose key was passed as a string. + +`keys: string[]`: Deletes the entries whose keys were passed in an array. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +// Delete all items +store.delete() +store.clear() + +// Delete one item +store.delete("myKey") +delete store.data.myKey +delete store.d.myKey + +// Delete multiple items +store.delete(["key1", "key2"]) +``` + + +## Delete Old Expiring Items + +```typescript +deleteOldExpiringItems(maxExpiringItemsInDb: number) +``` + +If there are more expiring items in the database than `maxExpiringItemsInDb`, +the oldest items are deleted until there are only `maxExpiringItemsInDb` items with +an expiration date in the database. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.set("static:1", "my-value") +store.set("static:2", "my-value") +store.set("dynamic:1", "my-value", 40) +store.set("dynamic:2", "my-value", 45) +store.set("dynamic:3", "my-value", 50) + +store.deleteOldExpiringItems(2) +console.log(store.getKeys("dynamic:")) +// --> [ "dynamic:2", "dynamic:3" ] +``` + + +## Count All Items + +```typescript +getCount(): number + +length // --> alias for `getCount()` +``` + +Returns the number of all items, including those that have already expired. +The fact that possibly expired entries are also counted is for reasons of speed. +Use `getCountValid()` if you want to get the number of items that have not yet expired. +If you do not use `ttlMs` (time to live), `getCount()` is faster than `getCountValid()`. + + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.set("my-key1", "my-value1") +store.set("my-key2", "my-value2") + +store.getCount() // --> 2 +store.length // --> 2 +``` + + +## Count Valid Items + +```typescript +getCountValid(deleteExpired?: boolean): number +``` + +Returns the number of valid (non-expired) items. +Can also delete the expired items. + +### deleteExpired + +If the parameter is not specified or `false` is passed, +then only the entries that have no expiration date or +whose expiration date is in the future are counted. + +If `true` is passed, the expired entries are deleted first +before the entries are counted. + + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.set("my-key1", "my-value1") +store.set("my-key2", "my-value2", 100) + +store.getCountValid() // --> 2 + +await Bun.sleep(500) +store.getCountValid() // --> 1 +``` + +## Increment + +```typescript +incr(key: string, incrBy: number = 1, ttlMs?: number): number +``` + +Increments the saved number by `incrBy` (default = 1), +saves the new number and returns it. +If the key does not yet exist in the database, +the value is set to 0 before being incremented by `incrBy`. +If a string is stored in the database that can be converted into a number, +this is converted first. +If the stored value cannot be converted into a number, `NaN` is returned. + + +### key + +The key must be a string. + +### incrBy + +The stored number is increased by this value. + +### ttlMs (optional) + +"Time to live" in milliseconds. After this time, +the item becomes invalid and is deleted from the database +the next time it is accessed or when the application is started. +Set the value to 0 if you want to explicitly deactivate the process. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.incr("my-key") // --> 1 +store.incr("my-key") // --> 2 +``` + + +## Decrement + +```typescript +decr(key: string, decrBy: number = 1, ttlMs?: number): number +``` + +Decrements the saved number by `decrBy` (default = 1), +saves the new number and returns it. +If the key does not yet exist in the database, +the value is set to 0 before being decremented by `decrBy`. +If a string is stored in the database that can be converted into a number, +this is converted first. +If the stored value cannot be converted into a number, `NaN` is returned. + + +### key + +The key must be a string. + +### incrBy + +The stored number is decreased by this value. + +### ttlMs (optional) + +"Time to live" in milliseconds. After this time, +the item becomes invalid and is deleted from the database +the next time it is accessed or when the application is started. +Set the value to 0 if you want to explicitly deactivate the process. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.set("my-key", 10) +store.decr("my-key") // --> 9 +store.decr("my-key") // --> 8 +``` + +## Append + +```typescript +append(key: string, value: string, ttlMs?: number): number +``` + +If key already exists, this command appends the value at the end of the string. +If key does not exist it is created and set as an empty string, +so `append()` will be similar to `set()` in this special case. +Inspired by: https://docs.keydb.dev/docs/commands/#append + +Returns the length of the string after the append operation. + +### key + +The key must be a string. + +### value + +The string that is appended to the existing string. + +### ttlMs (optional) + +"Time to live" in milliseconds. After this time, +the item becomes invalid and is deleted from the database +the next time it is accessed or when the application is started. +Set the value to 0 if you want to explicitly deactivate the process. + +### Example + +```typescript +import { BunSqliteKeyValue } from "bun-sqlite-key-value" + +const store = new BunSqliteKeyValue() + +store.append("my-key", "Hello!") // --> 6 +store.append("my-key", "World!") // --> 12 +store.get("my-key") // --> "Hello!World!" +``` + + +## All Functions + +### Database +- `new BunSqliteKeyValue()` --> Open database +- `close()` --> Close database + +### Set value +- `set(key: string, value: any)` +- `setValue(key: string, value: any)` --> alias for set() +- `.data. = ` +- `.d. = ` + +### Set items +- `setItems({key: string, value: any}[])` + +### Get value +- `get(key: string): any` +- `getValue(key: string)` --> alias for get() +- `.data.` +- `.d.` +- `getSet(key: string, value: any): any` +- `getRandomValue(): any` +- `randomValue(): any` --> alias for getRandomValue() + +### Get item +- `getItem(key: string)` --> Object +- `getRandomItem()` --> Object +- `randomItem()` --> Alias for getRandomItem() + +### Get items as Array +- `getItems()` --> Array with all items +- `getItems(startsWith: string)` --> Array +- `getItems(keys: string[])` --> Array +- `getItemsArray()` --> alias for getItems() +- `getItemsArray(startsWith: string)` --> alias for getItems() +- `getItemsArray(keys: string[])` --> alias for getItems() +- `items` --> alias for getItems() + +### Get items as Object +- `getItemsObject()` --> Object with all items +- `getItemsObject(startsWith: string)` --> Object +- `getItemsObject(keys: string[])` --> Object + +### Get items as Map() +- `getItemsMap()` --> Map with all items +- `getItemsMap(startsWith: string)` --> Map +- `getItemsMap(keys: string[])` --> Map + +### Get values as Array +- `getValues()` --> Array with all values +- `getValues(startsWith: string)` --> Array +- `getValues(keys: string[])` --> Array +- `getValuesArray()` --> alias for getValues() +- `getValuesArray(startsWith: string)` --> alias for getValues() +- `getValuesArray(keys: string[])` --> alias for getValues() +- `values` --> alias for getValues() + +### Get values as Set() +- `getValuesSet()` --> Set with all values +- `getValuesSet(startsWith: string)` --> Set +- `getValuesSet(keys: string[])` --> Set + +### Delete +- `delete()` --> Delete all items +- `delete(key: string)` --> Delete item +- `delete(keys: string[])` --> Delete items +- `clear()` --> alias for delete() +- `deleteOldExpiringItems(maxExpiringItemsInDb: number)` --> Delete items +- `delete .data.` +- `delete .d.` + +### Count +- `getCount()` --> Number +- `length` --> alias for getCount() +- `getCountValid(deleteExpired?: boolean)` --> Number + +### Get keys +- `has(key: string)` --> Boolean +- `getKeys()` --> Array with all Keys +- `getKeys(startsWith: string)` --> Array +- `getKeys(keys: string[])` --> Array +- `keys` --> alias for getKeys() +- ` in .data` +- ` in .d` +- `getRandomKey()` +- `randomKey()` --> alias for getRandomKey() + +### Math operations +- `incr()` --> Number +- `decr()` --> Number + +### String operations +- `append()` --> Number + + +## SQLite as base for a key value storage + +SQLite provides a solid and well-tested foundation. +SQLite reliably takes care of saving and reading data - +both for short strings and for larger BLOBs. +It provides a robust foundation on which to build. +Even if SQLite is not fully utilized and no relations between tables are required, +this is not a disadvantage. + +Please give this [GitHub project](https://github.com/gerold-penz/bun-sqlite-key-value) +a ⭐ if this project is useful to you. Thank you very much! +And if you speak German, here is my business homepage: +[GP-Softwaretechnik](https://gp-softwaretechnik.at/) +Maybe you will find something interesting for you there. 😃 diff --git a/docs/interfaces/Item.html b/docs/interfaces/Item.html deleted file mode 100644 index 113845b..0000000 --- a/docs/interfaces/Item.html +++ /dev/null @@ -1,3 +0,0 @@ -Item | bun-sqlite-key-value

Interface Item<T>

interface Item<T> {
    key: string;
    value: undefined | T;
}

Type Parameters

  • T

Properties

Properties

key: string
value: undefined | T
diff --git a/docs/interfaces/Options.html b/docs/interfaces/Options.html deleted file mode 100644 index 541465d..0000000 --- a/docs/interfaces/Options.html +++ /dev/null @@ -1,5 +0,0 @@ -Options | bun-sqlite-key-value
interface Options {
    create?: boolean;
    readonly?: boolean;
    readwrite?: boolean;
    ttlMs?: number;
}

Properties

create?: boolean
readonly?: boolean
readwrite?: boolean
ttlMs?: number
diff --git a/docs/interfaces/Record.html b/docs/interfaces/Record.html deleted file mode 100644 index 806cf96..0000000 --- a/docs/interfaces/Record.html +++ /dev/null @@ -1,4 +0,0 @@ -Record | bun-sqlite-key-value
interface Record {
    expires: null | number;
    key: string;
    value: null | Buffer;
}

Properties

Properties

expires: null | number
key: string
value: null | Buffer
diff --git a/docs/modules.html b/docs/modules.html deleted file mode 100644 index d65abb3..0000000 --- a/docs/modules.html +++ /dev/null @@ -1,5 +0,0 @@ -bun-sqlite-key-value

bun-sqlite-key-value

Index

Classes

Interfaces

diff --git a/package.json b/package.json index b2f69bf..827780b 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,8 @@ "prepublishOnly": "bun run test && bun run build", "npm:publish": "bun run increment_package_version && npm publish --access public", "jsr:publish": "bunx jsr publish", - "typedoc": "bunx typedoc" + "typedoc": "bunx typedoc", + "typedoc:watch": "bunx typedoc --watch --preserveWatchOutput" }, "type": "module", "files": [ diff --git a/typedoc.json b/typedoc.json index 714ecad..a671902 100644 --- a/typedoc.json +++ b/typedoc.json @@ -1,6 +1,21 @@ { + "$schema": "https://typedoc.org/schema.json", "entryPoints": [ "src/index.ts" ], - "out": "docs" + "out": "docs", + "name": "Bun SQlite Key Value", + "lightHighlightTheme": "github-light", + "darkHighlightTheme": "github-dark", + "sourceLinkExternal": true, + "searchInComments": true, + "searchInDocuments": true, + "navigationLinks": { + "GitHub": "https://github.com/gerold-penz/bun-sqlite-key-value" + }, + "projectDocuments": [ + "README.md" + ], + "excludeNotDocumented": true, + "theme": "typedoc-github-theme" }