@vielzeug/deposit 1.0.4 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/deposit.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("./logit/dist/logit.cjs");require("./toolkit/dist/logit/dist/logit.cjs");require("./toolkit/dist/array/filter.cjs");const f=require("./toolkit/dist/array/group.cjs"),S=require("./toolkit/dist/array/search.cjs"),A=require("./toolkit/dist/array/sortBy.cjs"),E=require("./toolkit/dist/math/max.cjs"),T=require("./toolkit/dist/math/min.cjs");class D{adapter;constructor(t){this.adapter=this.createAdapter(t)}createAdapter(t){if(!("type"in t))return t;const{type:e,dbName:r,version:s,schema:a,migrationFn:i}=t;switch(e){case"localStorage":return new g(r,s,a);case"indexedDB":return new w(r,s,a,i);default:throw new Error(`Unknown adapter type: ${e}`)}}bulkDelete(t,e){return this.adapter.bulkDelete(t,e)}bulkPut(t,e,r){return this.adapter.bulkPut(t,e,r)}clear(t){return this.adapter.clear(t)}count(t){return this.adapter.count(t)}delete(t,e){return this.adapter.delete(t,e)}get(t,e,r){return this.adapter.get(t,e,r)}getAll(t){return this.adapter.getAll(t)}put(t,e,r){return this.adapter.put(t,e,r)}query(t){return new m(this.adapter,String(t))}async transaction(t,e,r){const s=await this.loadStores(t),a=this.createStoreProxy(s);try{await e(a),await this.commitStores(t,a,r)}catch(i){throw new Error(`Transaction failed for tables: ${t.map(String).join(", ")}`,{cause:i})}}async loadStores(t){const e={},r=t.map(async s=>{e[s]=await this.getAll(s)});return await Promise.all(r),e}createStoreProxy(t){return new Proxy(t,{get(e,r){return e[r]},set(e,r,s){return e[r]=s,!0}})}async commitStores(t,e,r){const s=t.map(async a=>{await this.clear(a),await this.bulkPut(a,e[a],r)});await Promise.all(s)}async patch(t,e){const r=e.map(s=>this.applyPatch(t,s));await Promise.all(r)}async applyPatch(t,e){switch(e.type){case"put":return this.put(t,e.value,e.ttl);case"delete":return this.delete(t,e.key);case"clear":return this.clear(t)}}}class m{operations=[];adapter;table;memoCache=new Map;dataVersion=0;hasMutatingOp=!1;cachedSignature=null;constructor(t,e){this.adapter=t,this.table=e}getOpSignature(){return this.cachedSignature===null&&(this.cachedSignature=this.operations.map(t=>`${t.name}:${JSON.stringify(t.args)}`).join("|")),this.cachedSignature}getMemoKey(){return`${this.getOpSignature()}|v${this.dataVersion}`}invalidateMemo(t){if(!t){this.memoCache.clear();return}const e=Array.from(this.memoCache.keys()).filter(t);for(const r of e)this.memoCache.delete(r)}pushOp(t,e="op",r=[]){this.operations.push({args:r,name:e,op:t}),this.cachedSignature=null;const s=this.getOpSignature();return this.invalidateMemo(a=>a.startsWith(s)),this}where(t,e){return this.pushOp(r=>r.filter(s=>e(s[t],s)),"where",[t,e])}equals(t,e){return this.pushOp(r=>r.filter(s=>s[t]===e),"equals",[t,e])}between(t,e,r){return this.pushOp(s=>s.filter(a=>{const i=a[t];return i>=e&&i<=r}),"between",[t,e,r])}startsWith(t,e,r=!1){const s=r?e.toLowerCase():e;return this.pushOp(a=>a.filter(i=>{const n=i[t];return typeof n!="string"?!1:(r?n.toLowerCase():n).startsWith(s)}),"startsWith",[t,e,r])}filter(t){return this.pushOp(e=>e.filter(t),"filter",[t])}not(t){return this.pushOp(e=>e.filter((r,s,a)=>!t(r,s,a)),"not",[t])}and(...t){return this.pushOp(e=>e.filter((r,s,a)=>t.every(i=>i(r,s,a))),"and",t)}or(...t){return this.pushOp(e=>e.filter((r,s,a)=>t.some(i=>i(r,s,a))),"or",t)}orderBy(t,e="asc"){return this.pushOp(r=>A.sortBy(r,{[t]:e}),"orderBy",[t,e])}limit(t){return this.pushOp(e=>e.slice(0,t),"limit",[t])}offset(t){return this.pushOp(e=>e.slice(t),"offset",[t])}page(t,e){return this.pushOp(r=>{const s=(t-1)*e,a=s+e;return r.slice(s,a)},"page",[t,e])}reverse(){return this.pushOp(t=>[...t].reverse(),"reverse",[])}async count(){return(await this.toArray()).length}async first(){return(await this.toArray())[0]}async last(){const t=await this.toArray();return t[t.length-1]}async average(t){const e=await this.toArray();return e.length===0?0:e.reduce((s,a)=>s+(Number(a[t])||0),0)/e.length}async min(t){return T.min(await this.toArray(),e=>e[t])}async max(t){return E.max(await this.toArray(),e=>e[t])}async sum(t){return(await this.toArray()).reduce((r,s)=>r+(Number(s[t])||0),0)}modify(t,e){return this.hasMutatingOp=!0,this.dataVersion++,this.invalidateModifyCache(e),this.pushOp(r=>r.map(s=>t(s)??s),"modify",[t])}invalidateModifyCache(t){if(!t?.field){this.invalidateMemo(r=>r.includes("modify"));return}const e=String(t.field);this.invalidateMemo(r=>r.includes(`"${e}"`)&&(t.value===void 0||r.includes(JSON.stringify(t.value))))}groupBy(t){return this.pushOp(e=>f.group(e,r=>r[t]))}search(t,e){return this.pushOp(r=>S.search(r,t,e))}reset(){return this.operations=[],this.hasMutatingOp=!1,this.cachedSignature=null,this.invalidateMemo(),this}async toArray(){const t=this.getMemoKey(),e=this.memoCache.get(t);if(e)return e;const r=this.executeOperations();return this.hasMutatingOp||this.memoCache.set(t,r),r}async executeOperations(){let e=(await this.adapter.getAll(this.table)).slice();for(const{op:r}of this.operations)e=r(e);return e}build(t){for(const e of t)this.applyCondition(e);return this}applyCondition(t){switch(t.type){case"equals":this.equals(t.field,t.value);break;case"between":this.between(t.field,t.lower,t.upper);break;case"startsWith":this.startsWith(t.field,t.value);break;case"where":this.where(t.field,t.fn);break;case"filter":this.filter(t.fn);break;case"orderBy":this.orderBy(t.field,t.value??"asc");break;case"limit":this.limit(t.value);break;case"offset":this.offset(t.value);break;case"page":this.page(t.pageNumber,t.pageSize);break;default:throw new Error(`Unknown query type: ${t.type}`)}}}class g{dbName;version;schema;constructor(t,e,r){this.dbName=t,this.version=e,this.schema=r}bulkDelete=o(async(t,e)=>{const r=e.map(s=>this.delete(t,s));await Promise.all(r)},"BULK_DELETE_FAILED");bulkPut=o(async(t,e,r)=>{const s=e.map(a=>this.put(t,a,r));await Promise.all(s)},"BULK_PUT_FAILED");clear=o(async t=>{const e=this.getStorageKey(t),r=this.getTableKeys(e);for(const s of r)localStorage.removeItem(s)},"CLEAR_FAILED");count=o(async t=>(await this.getAll(t)).length,"COUNT_FAILED");delete=o(async(t,e)=>{localStorage.removeItem(this.getStorageKey(t,String(e)))},"DELETE_FAILED");get=o(async(t,e,r)=>{const s=this.getStorageKey(t,String(e)),a=localStorage.getItem(s);if(!a)return r;try{const i=JSON.parse(a),n=Date.now();return u(i,n,async()=>await this.delete(t,e))??r}catch{return await this.delete(t,e),r}},"GET_FAILED");getAll=o(async t=>{const e=this.getStorageKey(t),r=Date.now(),s=this.getTableKeys(e),a=[];for(const i of s){const n=await this.parseStorageRecord(i,t,r);n&&a.push(n)}return a},"GET_ALL_FAILED");put=o(async(t,e,r)=>{const s=this.getRecordKey(e,t);if(s===void 0)throw new Error("Missing key for localStorage put");localStorage.setItem(this.getStorageKey(t,String(s)),JSON.stringify(y(e,r)))},"PUT_FAILED");getTableKeys(t){return Object.keys(localStorage).filter(e=>e.startsWith(t))}async parseStorageRecord(t,e,r){try{const s=JSON.parse(localStorage.getItem(t)??"{}");return u(s,r,async()=>{const a=this.extractKeyFromStorageKey(t);await this.delete(e,a)})}catch(s){const a=this.extractKeyFromStorageKey(t);throw await this.delete(e,a),new Error(`Corrupted JSON for key: ${t}`,{cause:s})}}extractKeyFromStorageKey(t){const e=t.split(":");return e[e.length-1]}getRecordKey(t,e){const r=String(this.schema[e].key);return t[r]}getStorageKey(t,e){const r=`${this.dbName}:${this.version}:${String(t)}:`;return e===void 0||e===""?r:`${r}${String(e)}`}}class w{db=null;dbName;schema;version;migrationFn;constructor(t,e,r,s){this.dbName=t,this.version=e,this.schema=r,this.migrationFn=s}async connect(){return new Promise((t,e)=>{const r=indexedDB.open(this.dbName,this.version);r.onupgradeneeded=s=>{const a=r.result,i=r.transaction;this.createObjectStores(a),this.executeMigration(a,s,i,e)},r.onsuccess=()=>{this.db=r.result,t()},r.onerror=()=>e(new Error("Failed to open IndexedDB"))})}bulkDelete=o(async(t,e)=>{await this.withTransaction(t,"readwrite",async r=>{const s=e.map(a=>this.requestToPromise(r.delete(a)));await Promise.all(s)})},"BULK_DELETE_FAILED");bulkPut=o(async(t,e,r)=>{await this.withTransaction(t,"readwrite",async s=>{const a=e.map(i=>this.requestToPromise(s.put(y(i,r))));await Promise.all(a)})},"BULK_PUT_FAILED");clear=o(async t=>{await this.withTransaction(t,"readwrite",async e=>{await this.requestToPromise(e.clear())})},"CLEAR_FAILED");count=o(async t=>(await this.getAll(t)).length,"COUNT_FAILED");delete=o(async(t,e)=>{await this.withTransaction(t,"readwrite",async r=>{await this.requestToPromise(r.delete(e))})},"DELETE_FAILED");get=o(async(t,e,r)=>await this.withTransaction(t,"readonly",async s=>{const a=await this.requestToPromise(s.get(e));if(!a)return r;const i=Date.now();return u(a,i,async()=>await this.delete(t,e))??r}),"GET_FAILED");getAll=o(async t=>await this.withTransaction(t,"readonly",async e=>{const r=await this.requestToPromise(e.getAll()),s=Date.now();return r.map(a=>u(a,s)).filter(a=>a!==void 0)}),"GET_ALL_FAILED");put=o(async(t,e,r)=>{await this.withTransaction(t,"readwrite",async s=>{await this.requestToPromise(s.put(y(e,r)))})},"PUT_FAILED");createObjectStores(t){for(const[e,r]of Object.entries(this.schema)){if(t.objectStoreNames.contains(e))continue;const s=r.key,a=t.createObjectStore(e,{keyPath:s}),i=r.indexes;if(i)for(const n of i)a.createIndex(n,n)}}executeMigration(t,e,r,s){if(this.migrationFn)try{const a=this.migrationFn(t,e.oldVersion,e.newVersion??null,r,this.schema);Promise.resolve(a).catch(i=>{this.abortTransaction(r),s(new Error("Migration failed",{cause:i}))})}catch(a){this.abortTransaction(r),s(new Error("Migration failed",{cause:a}))}}abortTransaction(t){o(()=>t.abort(),"TRANSACTION_ABORT_FAILED")()}async withTransaction(t,e,r){return this.db||await this.connect(),new Promise((s,a)=>{const i=Array.isArray(t)?t.map(String):[String(t)],n=this.db.transaction(i,e),l=n.objectStore(i[0]);let d;r(l).then(p=>{d=p}).catch(p=>{this.abortTransaction(n),a(new Error(`Transaction callback failed for ${i.join(", ")}`,{cause:p}))}),n.oncomplete=()=>s(d),n.onerror=()=>a(new Error(`Transaction error for ${i.join(", ")}`,{cause:n.error})),n.onabort=()=>a(new Error(`Transaction aborted for ${i.join(", ")}`))})}requestToPromise(t){return new Promise((e,r)=>{t.onsuccess=()=>e(t.result),t.onerror=()=>r(t.error??new Error("IndexedDB request failed"))})}}function y(c,t){return t===void 0?c:{...c,expiresAt:Date.now()+t}}function u(c,t,e){if(c.expiresAt===void 0)return c;if(t>=c.expiresAt){if(e){const r=e();r&&typeof r.then=="function"&&r.catch(s=>{h.Logit.setPrefix("Deposit"),h.Logit.warn("Failed to clean up expired entry",s)})}return}return c}function o(c,t="OPERATION_FAILED"){return((...e)=>{try{const r=c(...e);return r&&typeof r.then=="function"?r.catch(s=>{h.Logit.setPrefix("Deposit"),h.Logit.error(t,s)}):r}catch(r){h.Logit.setPrefix("Deposit"),h.Logit.error(t,r);return}})}exports.Deposit=D;exports.IndexedDBAdapter=w;exports.LocalStorageAdapter=g;exports.QueryBuilder=m;exports.runSafe=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("./logit/dist/logit.cjs");require("./toolkit/dist/logit/dist/logit.cjs");require("./toolkit/dist/array/filter.cjs");const f=require("./toolkit/dist/array/group.cjs"),S=require("./toolkit/dist/array/search.cjs"),A=require("./toolkit/dist/array/arrange.cjs"),E=require("./toolkit/dist/math/max.cjs"),T=require("./toolkit/dist/math/min.cjs");class D{adapter;constructor(t){this.adapter=this.createAdapter(t)}createAdapter(t){if(!("type"in t))return t;const{type:e,dbName:r,version:s,schema:a,migrationFn:i}=t;switch(e){case"localStorage":return new m(r,s,a);case"indexedDB":return new w(r,s,a,i);default:throw new Error(`Unknown adapter type: ${e}`)}}bulkDelete(t,e){return this.adapter.bulkDelete(t,e)}bulkPut(t,e,r){return this.adapter.bulkPut(t,e,r)}clear(t){return this.adapter.clear(t)}count(t){return this.adapter.count(t)}delete(t,e){return this.adapter.delete(t,e)}get(t,e,r){return this.adapter.get(t,e,r)}getAll(t){return this.adapter.getAll(t)}put(t,e,r){return this.adapter.put(t,e,r)}query(t){return new g(this.adapter,String(t))}async transaction(t,e,r){const s=await this.loadStores(t),a=this.createStoreProxy(s);try{await e(a),await this.commitStores(t,a,r)}catch(i){throw new Error(`Transaction failed for tables: ${t.map(String).join(", ")}`,{cause:i})}}async loadStores(t){const e={},r=t.map(async s=>{e[s]=await this.getAll(s)});return await Promise.all(r),e}createStoreProxy(t){return new Proxy(t,{get(e,r){return e[r]},set(e,r,s){return e[r]=s,!0}})}async commitStores(t,e,r){const s=t.map(async a=>{await this.clear(a),await this.bulkPut(a,e[a],r)});await Promise.all(s)}async patch(t,e){const r=e.map(s=>this.applyPatch(t,s));await Promise.all(r)}async applyPatch(t,e){switch(e.type){case"put":return this.put(t,e.value,e.ttl);case"delete":return this.delete(t,e.key);case"clear":return this.clear(t)}}}class g{operations=[];adapter;table;memoCache=new Map;dataVersion=0;hasMutatingOp=!1;cachedSignature=null;constructor(t,e){this.adapter=t,this.table=e}getOpSignature(){return this.cachedSignature===null&&(this.cachedSignature=this.operations.map(t=>`${t.name}:${JSON.stringify(t.args)}`).join("|")),this.cachedSignature}getMemoKey(){return`${this.getOpSignature()}|v${this.dataVersion}`}invalidateMemo(t){if(!t){this.memoCache.clear();return}const e=Array.from(this.memoCache.keys()).filter(t);for(const r of e)this.memoCache.delete(r)}pushOp(t,e="op",r=[]){this.operations.push({args:r,name:e,op:t}),this.cachedSignature=null;const s=this.getOpSignature();return this.invalidateMemo(a=>a.startsWith(s)),this}where(t,e){return this.pushOp(r=>r.filter(s=>e(s[t],s)),"where",[t,e])}equals(t,e){return this.pushOp(r=>r.filter(s=>s[t]===e),"equals",[t,e])}between(t,e,r){return this.pushOp(s=>s.filter(a=>{const i=a[t];return i>=e&&i<=r}),"between",[t,e,r])}startsWith(t,e,r=!1){const s=r?e.toLowerCase():e;return this.pushOp(a=>a.filter(i=>{const n=i[t];return typeof n!="string"?!1:(r?n.toLowerCase():n).startsWith(s)}),"startsWith",[t,e,r])}filter(t){return this.pushOp(e=>e.filter(t),"filter",[t])}not(t){return this.pushOp(e=>e.filter((r,s,a)=>!t(r,s,a)),"not",[t])}and(...t){return this.pushOp(e=>e.filter((r,s,a)=>t.every(i=>i(r,s,a))),"and",t)}or(...t){return this.pushOp(e=>e.filter((r,s,a)=>t.some(i=>i(r,s,a))),"or",t)}orderBy(t,e="asc"){return this.pushOp(r=>A.arrange(r,{[t]:e}),"orderBy",[t,e])}limit(t){return this.pushOp(e=>e.slice(0,t),"limit",[t])}offset(t){return this.pushOp(e=>e.slice(t),"offset",[t])}page(t,e){return this.pushOp(r=>{const s=(t-1)*e,a=s+e;return r.slice(s,a)},"page",[t,e])}reverse(){return this.pushOp(t=>[...t].reverse(),"reverse",[])}async count(){return(await this.toArray()).length}async first(){return(await this.toArray())[0]}async last(){const t=await this.toArray();return t[t.length-1]}async average(t){const e=await this.toArray();return e.length===0?0:e.reduce((s,a)=>s+(Number(a[t])||0),0)/e.length}async min(t){return T.min(await this.toArray(),e=>e[t])}async max(t){return E.max(await this.toArray(),e=>e[t])}async sum(t){return(await this.toArray()).reduce((r,s)=>r+(Number(s[t])||0),0)}modify(t,e){return this.hasMutatingOp=!0,this.dataVersion++,this.invalidateModifyCache(e),this.pushOp(r=>r.map(s=>t(s)??s),"modify",[t])}invalidateModifyCache(t){if(!t?.field){this.invalidateMemo(r=>r.includes("modify"));return}const e=String(t.field);this.invalidateMemo(r=>r.includes(`"${e}"`)&&(t.value===void 0||r.includes(JSON.stringify(t.value))))}groupBy(t){return this.pushOp(e=>f.group(e,r=>r[t]))}search(t,e){return this.pushOp(r=>S.search(r,t,e))}reset(){return this.operations=[],this.hasMutatingOp=!1,this.cachedSignature=null,this.invalidateMemo(),this}async toArray(){const t=this.getMemoKey(),e=this.memoCache.get(t);if(e)return e;const r=this.executeOperations();return this.hasMutatingOp||this.memoCache.set(t,r),r}async executeOperations(){let e=(await this.adapter.getAll(this.table)).slice();for(const{op:r}of this.operations)e=r(e);return e}build(t){for(const e of t)this.applyCondition(e);return this}applyCondition(t){switch(t.type){case"equals":this.equals(t.field,t.value);break;case"between":this.between(t.field,t.lower,t.upper);break;case"startsWith":this.startsWith(t.field,t.value);break;case"where":this.where(t.field,t.fn);break;case"filter":this.filter(t.fn);break;case"orderBy":this.orderBy(t.field,t.value??"asc");break;case"limit":this.limit(t.value);break;case"offset":this.offset(t.value);break;case"page":this.page(t.pageNumber,t.pageSize);break;default:throw new Error(`Unknown query type: ${t.type}`)}}}class m{dbName;version;schema;constructor(t,e,r){this.dbName=t,this.version=e,this.schema=r}bulkDelete=o(async(t,e)=>{const r=e.map(s=>this.delete(t,s));await Promise.all(r)},"BULK_DELETE_FAILED");bulkPut=o(async(t,e,r)=>{const s=e.map(a=>this.put(t,a,r));await Promise.all(s)},"BULK_PUT_FAILED");clear=o(async t=>{const e=this.getStorageKey(t),r=this.getTableKeys(e);for(const s of r)localStorage.removeItem(s)},"CLEAR_FAILED");count=o(async t=>(await this.getAll(t)).length,"COUNT_FAILED");delete=o(async(t,e)=>{localStorage.removeItem(this.getStorageKey(t,String(e)))},"DELETE_FAILED");get=o(async(t,e,r)=>{const s=this.getStorageKey(t,String(e)),a=localStorage.getItem(s);if(!a)return r;try{const i=JSON.parse(a),n=Date.now();return u(i,n,async()=>await this.delete(t,e))??r}catch{return await this.delete(t,e),r}},"GET_FAILED");getAll=o(async t=>{const e=this.getStorageKey(t),r=Date.now(),s=this.getTableKeys(e),a=[];for(const i of s){const n=await this.parseStorageRecord(i,t,r);n&&a.push(n)}return a},"GET_ALL_FAILED");put=o(async(t,e,r)=>{const s=this.getRecordKey(e,t);if(s===void 0)throw new Error("Missing key for localStorage put");localStorage.setItem(this.getStorageKey(t,String(s)),JSON.stringify(d(e,r)))},"PUT_FAILED");getTableKeys(t){return Object.keys(localStorage).filter(e=>e.startsWith(t))}async parseStorageRecord(t,e,r){try{const s=JSON.parse(localStorage.getItem(t)??"{}");return u(s,r,async()=>{const a=this.extractKeyFromStorageKey(t);await this.delete(e,a)})}catch(s){const a=this.extractKeyFromStorageKey(t);throw await this.delete(e,a),new Error(`Corrupted JSON for key: ${t}`,{cause:s})}}extractKeyFromStorageKey(t){const e=t.split(":");return e[e.length-1]}getRecordKey(t,e){const r=String(this.schema[e].key);return t[r]}getStorageKey(t,e){const r=`${this.dbName}:${this.version}:${String(t)}:`;return e===void 0||e===""?r:`${r}${String(e)}`}}class w{db=null;dbName;schema;version;migrationFn;constructor(t,e,r,s){this.dbName=t,this.version=e,this.schema=r,this.migrationFn=s}async connect(){return new Promise((t,e)=>{const r=indexedDB.open(this.dbName,this.version);r.onupgradeneeded=s=>{const a=r.result,i=r.transaction;this.createObjectStores(a),this.executeMigration(a,s,i,e)},r.onsuccess=()=>{this.db=r.result,t()},r.onerror=()=>e(new Error("Failed to open IndexedDB"))})}bulkDelete=o(async(t,e)=>{await this.withTransaction(t,"readwrite",async r=>{const s=e.map(a=>this.requestToPromise(r.delete(a)));await Promise.all(s)})},"BULK_DELETE_FAILED");bulkPut=o(async(t,e,r)=>{await this.withTransaction(t,"readwrite",async s=>{const a=e.map(i=>this.requestToPromise(s.put(d(i,r))));await Promise.all(a)})},"BULK_PUT_FAILED");clear=o(async t=>{await this.withTransaction(t,"readwrite",async e=>{await this.requestToPromise(e.clear())})},"CLEAR_FAILED");count=o(async t=>(await this.getAll(t)).length,"COUNT_FAILED");delete=o(async(t,e)=>{await this.withTransaction(t,"readwrite",async r=>{await this.requestToPromise(r.delete(e))})},"DELETE_FAILED");get=o(async(t,e,r)=>await this.withTransaction(t,"readonly",async s=>{const a=await this.requestToPromise(s.get(e));if(!a)return r;const i=Date.now();return u(a,i,async()=>await this.delete(t,e))??r}),"GET_FAILED");getAll=o(async t=>await this.withTransaction(t,"readonly",async e=>{const r=await this.requestToPromise(e.getAll()),s=Date.now();return r.map(a=>u(a,s)).filter(a=>a!==void 0)}),"GET_ALL_FAILED");put=o(async(t,e,r)=>{await this.withTransaction(t,"readwrite",async s=>{await this.requestToPromise(s.put(d(e,r)))})},"PUT_FAILED");createObjectStores(t){for(const[e,r]of Object.entries(this.schema)){if(t.objectStoreNames.contains(e))continue;const s=r.key,a=t.createObjectStore(e,{keyPath:s}),i=r.indexes;if(i)for(const n of i)a.createIndex(n,n)}}executeMigration(t,e,r,s){if(this.migrationFn)try{const a=this.migrationFn(t,e.oldVersion,e.newVersion??null,r,this.schema);Promise.resolve(a).catch(i=>{this.abortTransaction(r),s(new Error("Migration failed",{cause:i}))})}catch(a){this.abortTransaction(r),s(new Error("Migration failed",{cause:a}))}}abortTransaction(t){o(()=>t.abort(),"TRANSACTION_ABORT_FAILED")()}async withTransaction(t,e,r){return this.db||await this.connect(),new Promise((s,a)=>{const i=Array.isArray(t)?t.map(String):[String(t)],n=this.db.transaction(i,e),l=n.objectStore(i[0]);let y;r(l).then(p=>{y=p}).catch(p=>{this.abortTransaction(n),a(new Error(`Transaction callback failed for ${i.join(", ")}`,{cause:p}))}),n.oncomplete=()=>s(y),n.onerror=()=>a(new Error(`Transaction error for ${i.join(", ")}`,{cause:n.error})),n.onabort=()=>a(new Error(`Transaction aborted for ${i.join(", ")}`))})}requestToPromise(t){return new Promise((e,r)=>{t.onsuccess=()=>e(t.result),t.onerror=()=>r(t.error??new Error("IndexedDB request failed"))})}}function d(c,t){return t===void 0?c:{...c,expiresAt:Date.now()+t}}function u(c,t,e){if(c.expiresAt===void 0)return c;if(t>=c.expiresAt){if(e){const r=e();r&&typeof r.then=="function"&&r.catch(s=>{h.Logit.setPrefix("Deposit"),h.Logit.warn("Failed to clean up expired entry",s)})}return}return c}function o(c,t="OPERATION_FAILED"){return((...e)=>{try{const r=c(...e);return r&&typeof r.then=="function"?r.catch(s=>{h.Logit.setPrefix("Deposit"),h.Logit.error(t,s)}):r}catch(r){h.Logit.setPrefix("Deposit"),h.Logit.error(t,r);return}})}exports.Deposit=D;exports.IndexedDBAdapter=w;exports.LocalStorageAdapter=m;exports.QueryBuilder=g;exports.runSafe=o;
2
2
  //# sourceMappingURL=deposit.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"deposit.cjs","sources":["../src/deposit.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport { Logit } from '@vielzeug/logit';\nimport { group, max, min, type Predicate, search, sortBy } from '@vielzeug/toolkit';\n\nexport type DepotDataRecord<T, K extends keyof T = keyof T> = {\n indexes?: K[];\n key: K;\n record: T;\n};\n\ntype DataSchemaDef = Record<string, Record<string, unknown>>;\n\nexport type DepositDataSchema<S = DataSchemaDef> = {\n [K in keyof S]: DepotDataRecord<S[K], keyof S[K]>;\n};\n\nexport type DepositMigrationFn<S extends DepositDataSchema> = (\n db: IDBDatabase,\n oldVersion: number,\n newVersion: number | null,\n transaction: IDBTransaction,\n schema: S,\n) => void | Promise<void>;\n\nexport type DepositStorageAdapter<S extends DepositDataSchema> = {\n bulkDelete<K extends keyof S>(table: K, keys: KeyType<S, K>[]): Promise<void>;\n bulkPut<K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number): Promise<void>;\n clear<K extends keyof S>(table: K): Promise<void>;\n count<K extends keyof S>(table: K): Promise<number>;\n delete<K extends keyof S>(table: K, key: KeyType<S, K>): Promise<void>;\n get<K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined>;\n getAll<K extends keyof S>(table: K): Promise<S[K]['record'][]>;\n put<K extends keyof S>(table: K, value: S[K]['record'], ttl?: number): Promise<void>;\n connect?(): Promise<void>;\n};\n\ntype QueryCondition<T, K extends keyof T = keyof T> =\n | { type: 'equals'; field: K; value: T[K] }\n | { type: 'between'; field: K; lower: T[K]; upper: T[K] }\n | { type: 'startsWith'; field: Extract<K, string & keyof T>; value: string }\n | { type: 'where'; field: K; fn: (value: T[K], record: T) => boolean }\n | { type: 'filter'; fn: (record: T) => boolean }\n | { type: 'orderBy'; field: K; value?: 'asc' | 'desc' }\n | { type: 'limit'; value: number }\n | { type: 'offset'; value: number }\n | { type: 'page'; pageNumber: number; pageSize: number };\n\ntype PatchOperation<T, K = any> =\n | { type: 'put'; value: T; ttl?: number }\n | { type: 'delete'; key: K }\n | { type: 'clear' };\n\n/**\n * Extracts the key type for a given table in the schema.\n * Returns the type of the record's key field.\n */\ntype KeyType<S extends DepositDataSchema, K extends keyof S> = S[K]['record'][S[K]['key']];\n\ntype AdapterConfig<S extends DepositDataSchema> = {\n type: 'localStorage' | 'indexedDB';\n dbName: string;\n version: number;\n schema: S;\n migrationFn?: DepositMigrationFn<S>;\n};\n\nexport class Deposit<S extends DepositDataSchema> {\n private readonly adapter: DepositStorageAdapter<S>;\n\n constructor(adapterOrConfig: DepositStorageAdapter<S> | AdapterConfig<S>) {\n this.adapter = this.createAdapter(adapterOrConfig);\n }\n\n private createAdapter(adapterOrConfig: DepositStorageAdapter<S> | AdapterConfig<S>): DepositStorageAdapter<S> {\n if (!('type' in adapterOrConfig)) {\n return adapterOrConfig;\n }\n\n const { type, dbName, version, schema, migrationFn } = adapterOrConfig;\n\n switch (type) {\n case 'localStorage':\n return new LocalStorageAdapter(dbName, version, schema);\n case 'indexedDB':\n return new IndexedDBAdapter(dbName, version, schema, migrationFn);\n default:\n throw new Error(`Unknown adapter type: ${type}`);\n }\n }\n\n bulkDelete<K extends keyof S>(table: K, keys: KeyType<S, K>[]) {\n return this.adapter.bulkDelete(table, keys);\n }\n\n bulkPut<K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number) {\n return this.adapter.bulkPut(table, values, ttl);\n }\n\n clear<K extends keyof S>(table: K) {\n return this.adapter.clear(table);\n }\n\n count<K extends keyof S>(table: K): Promise<number> {\n return this.adapter.count(table);\n }\n\n delete<K extends keyof S>(table: K, key: KeyType<S, K>) {\n return this.adapter.delete(table, key);\n }\n\n get<K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> {\n return this.adapter.get(table, key, defaultValue);\n }\n\n getAll<K extends keyof S>(table: K): Promise<S[K]['record'][]> {\n return this.adapter.getAll(table);\n }\n\n put<K extends keyof S>(table: K, value: S[K]['record'], ttl?: number) {\n return this.adapter.put(table, value, ttl);\n }\n\n query<K extends keyof S>(table: K): QueryBuilder<S[K]['record']> {\n return new QueryBuilder<S[K]['record']>(this.adapter, String(table));\n }\n\n async transaction<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(\n tables: K[],\n fn: (stores: T) => Promise<void>,\n ttl?: number,\n ) {\n const storeMap = await this.loadStores<K, T>(tables);\n const proxy = this.createStoreProxy(storeMap);\n\n try {\n await fn(proxy as T);\n await this.commitStores(tables, proxy, ttl);\n } catch (err) {\n throw new Error(`Transaction failed for tables: ${tables.map(String).join(', ')}`, { cause: err });\n }\n }\n\n private async loadStores<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(tables: K[]): Promise<T> {\n const storeMap = {} as T;\n const promises = tables.map(async (table) => {\n (storeMap as any)[table] = await this.getAll(table);\n });\n await Promise.all(promises);\n return storeMap;\n }\n\n private createStoreProxy<T extends Record<string, any>>(storeMap: T): T {\n return new Proxy(storeMap, {\n get(target, prop) {\n return target[prop as keyof T];\n },\n set(target, prop, value) {\n target[prop as keyof T] = value;\n return true;\n },\n }) as T;\n }\n\n private async commitStores<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(\n tables: K[],\n stores: T,\n ttl?: number,\n ): Promise<void> {\n const commits = tables.map(async (table) => {\n await this.clear(table);\n await this.bulkPut(table, stores[table], ttl);\n });\n await Promise.all(commits);\n }\n\n async patch<K extends keyof S>(table: K, patches: PatchOperation<S[K]['record'], KeyType<S, K>>[]): Promise<void> {\n const operations = patches.map((patch) => this.applyPatch(table, patch));\n await Promise.all(operations);\n }\n\n private async applyPatch<K extends keyof S>(\n table: K,\n patch: PatchOperation<S[K]['record'], KeyType<S, K>>,\n ): Promise<void> {\n switch (patch.type) {\n case 'put':\n return this.put(table, patch.value, patch.ttl);\n case 'delete':\n return this.delete(table, patch.key);\n case 'clear':\n return this.clear(table);\n }\n }\n}\n\n/** -------------------- QueryBuilder -------------------- **/\n\nexport class QueryBuilder<T extends Record<string, unknown>> {\n private operations: Array<{ op: (data: T[]) => T[]; name: string; args: unknown[] }> = [];\n private readonly adapter: DepositStorageAdapter<any>;\n private readonly table: string;\n private memoCache: Map<string, Promise<T[]>> = new Map();\n private dataVersion = 0;\n private hasMutatingOp = false;\n private cachedSignature: string | null = null;\n\n constructor(adapter: DepositStorageAdapter<any>, table: string) {\n this.adapter = adapter;\n this.table = table;\n }\n\n private getOpSignature(): string {\n if (this.cachedSignature === null) {\n this.cachedSignature = this.operations.map((o) => `${o.name}:${JSON.stringify(o.args)}`).join('|');\n }\n return this.cachedSignature;\n }\n\n private getMemoKey(): string {\n return `${this.getOpSignature()}|v${this.dataVersion}`;\n }\n\n private invalidateMemo(predicate?: (key: string) => boolean): void {\n if (!predicate) {\n this.memoCache.clear();\n return;\n }\n const keysToDelete = Array.from(this.memoCache.keys()).filter(predicate);\n for (const key of keysToDelete) {\n this.memoCache.delete(key);\n }\n }\n\n private pushOp(op: (data: T[]) => T[], name = 'op', args: unknown[] = []): this {\n this.operations.push({ args, name, op });\n this.cachedSignature = null; // Invalidate cached signature\n const opSignature = this.getOpSignature();\n this.invalidateMemo((key: string) => key.startsWith(opSignature));\n return this;\n }\n\n /** ---- Core select/where operations (no implicit state) ---- */\n\n where<K extends keyof T>(field: K, predicate: (value: T[K], record: T) => boolean): this {\n return this.pushOp((data) => data.filter((r) => predicate(r[field], r)), 'where', [field, predicate]);\n }\n\n equals<K extends keyof T>(field: K, value: T[K]): this {\n return this.pushOp((data) => data.filter((r) => r[field] === value), 'equals', [field, value]);\n }\n\n between<K extends keyof T>(field: K, lower: number, upper: number): this {\n return this.pushOp(\n (data) =>\n data.filter((r) => {\n const val = r[field] as any;\n return val >= lower && val <= upper;\n }),\n 'between',\n [field, lower, upper],\n );\n }\n\n startsWith<K extends keyof T>(field: K, prefix: string, ignoreCase = false): this {\n const lowerPrefix = ignoreCase ? prefix.toLowerCase() : prefix;\n return this.pushOp(\n (data) =>\n data.filter((r) => {\n const value = r[field];\n if (typeof value !== 'string') return false;\n const str = ignoreCase ? value.toLowerCase() : value;\n return str.startsWith(lowerPrefix);\n }),\n 'startsWith',\n [field, prefix, ignoreCase],\n );\n }\n\n filter(fn: Predicate<T>): this {\n return this.pushOp((data) => data.filter(fn), 'filter', [fn]);\n }\n\n not(fn: Predicate<T>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => !fn(item, idx, arr)), 'not', [fn]);\n }\n\n and(...fns: Array<Predicate<T>>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => fns.every((fn) => fn(item, idx, arr))), 'and', fns);\n }\n\n or(...fns: Array<Predicate<T>>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => fns.some((fn) => fn(item, idx, arr))), 'or', fns);\n }\n\n /** ---- Ordering / slicing ---- */\n\n orderBy<K extends keyof T>(field: K, direction: 'asc' | 'desc' = 'asc'): this {\n return this.pushOp(\n (data) => sortBy(data, { [field]: direction } as Partial<Record<keyof T, 'asc' | 'desc'>>) as T[],\n 'orderBy',\n [field, direction],\n );\n }\n\n limit(n: number): this {\n return this.pushOp((data) => data.slice(0, n), 'limit', [n]);\n }\n\n offset(n: number): this {\n return this.pushOp((data) => data.slice(n), 'offset', [n]);\n }\n\n page(pageNumber: number, pageSize: number): this {\n return this.pushOp(\n (data) => {\n const start = (pageNumber - 1) * pageSize;\n const end = start + pageSize;\n return data.slice(start, end);\n },\n 'page',\n [pageNumber, pageSize],\n );\n }\n\n reverse(): this {\n return this.pushOp((data) => [...data].reverse(), 'reverse', []);\n }\n\n /** ---- Aggregations ---- */\n\n async count(): Promise<number> {\n return (await this.toArray()).length;\n }\n\n async first(): Promise<T | undefined> {\n return (await this.toArray())[0];\n }\n\n async last(): Promise<T | undefined> {\n const arr = await this.toArray();\n return arr[arr.length - 1];\n }\n\n async average<K extends keyof T>(field: K): Promise<number> {\n const arr = await this.toArray();\n if (arr.length === 0) return 0;\n const total = arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n return total / arr.length;\n }\n\n async min<K extends keyof T>(field: K): Promise<T | undefined> {\n return min(await this.toArray(), (item) => item[field] as any);\n }\n\n async max<K extends keyof T>(field: K): Promise<T | undefined> {\n return max(await this.toArray(), (item) => item[field] as any);\n }\n\n async sum<K extends keyof T>(field: K): Promise<number> {\n const arr = await this.toArray();\n return arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n }\n\n /** ---- Transformations ---- */\n\n modify(callback: (record: T) => T | undefined, context?: { field: keyof T; value: unknown }): this {\n this.hasMutatingOp = true;\n this.dataVersion++;\n this.invalidateModifyCache(context);\n\n return this.pushOp((data) => data.map((item) => callback(item) ?? item), 'modify', [callback]);\n }\n\n private invalidateModifyCache(context?: { field: keyof T; value: unknown }): void {\n if (!context?.field) {\n this.invalidateMemo((key: string) => key.includes('modify'));\n return;\n }\n\n const fieldStr = String(context.field);\n this.invalidateMemo(\n (key: string) =>\n key.includes(`\"${fieldStr}\"`) && (context.value === undefined || key.includes(JSON.stringify(context.value))),\n );\n }\n\n groupBy<K extends keyof T>(field: K): this {\n return this.pushOp((data) => group(data, (item) => item[field] as any) as unknown as T[]);\n }\n\n search(query: string, tone?: number): this {\n return this.pushOp((data) => search(data as unknown as any[], query, tone) as unknown as T[]);\n }\n\n /** ---- Execution / state ---- */\n\n reset(): this {\n this.operations = [];\n this.hasMutatingOp = false;\n this.cachedSignature = null;\n this.invalidateMemo();\n return this;\n }\n\n async toArray(): Promise<T[]> {\n const key = this.getMemoKey();\n const cached = this.memoCache.get(key);\n if (cached) return cached;\n\n const promise = this.executeOperations();\n if (!this.hasMutatingOp) {\n this.memoCache.set(key, promise);\n }\n return promise;\n }\n\n private async executeOperations(): Promise<T[]> {\n const originalData = (await this.adapter.getAll(this.table)) as T[];\n let data = originalData.slice(); // Create a shallow copy\n\n for (const { op } of this.operations) {\n data = op(data);\n }\n\n return data;\n }\n\n /** ---- Query builder DSL (typed) ---- */\n\n build(conditions: Array<QueryCondition<T>>): this {\n for (const cond of conditions) {\n this.applyCondition(cond);\n }\n return this;\n }\n\n private applyCondition(cond: QueryCondition<T>): void {\n switch (cond.type) {\n case 'equals':\n this.equals(cond.field as any, cond.value as any);\n break;\n case 'between':\n this.between(cond.field as any, cond.lower as any, cond.upper as any);\n break;\n case 'startsWith':\n this.startsWith(cond.field as any, cond.value);\n break;\n case 'where':\n this.where(cond.field as any, cond.fn as any);\n break;\n case 'filter':\n this.filter(cond.fn);\n break;\n case 'orderBy':\n this.orderBy(cond.field as any, cond.value ?? 'asc');\n break;\n case 'limit':\n this.limit(cond.value);\n break;\n case 'offset':\n this.offset(cond.value);\n break;\n case 'page':\n this.page(cond.pageNumber, cond.pageSize);\n break;\n default:\n throw new Error(`Unknown query type: ${(cond as any).type}`);\n }\n }\n}\n\n/** -------------------- LocalStorageAdapter -------------------- **/\n\nexport class LocalStorageAdapter<S extends DepositDataSchema> implements DepositStorageAdapter<S> {\n private readonly dbName: string;\n private readonly version: number;\n private schema: S;\n\n constructor(dbName: string, version: number, schema: S) {\n this.dbName = dbName;\n this.version = version;\n this.schema = schema;\n }\n\n /** ---- Public API Methods ---- */\n\n bulkDelete = runSafe(async <K extends keyof S>(table: K, keys: KeyType<S, K>[]) => {\n const promises = keys.map((key) => this.delete(table, key));\n await Promise.all(promises);\n }, 'BULK_DELETE_FAILED');\n\n bulkPut = runSafe(async <K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number) => {\n const promises = values.map((v) => this.put(table, v, ttl));\n await Promise.all(promises);\n }, 'BULK_PUT_FAILED');\n\n clear = runSafe(async <K extends keyof S>(table: K) => {\n const prefix = this.getStorageKey(table);\n const keysToRemove = this.getTableKeys(prefix);\n for (const k of keysToRemove) {\n localStorage.removeItem(k);\n }\n }, 'CLEAR_FAILED');\n\n count = runSafe(async <K extends keyof S>(table: K): Promise<number> => {\n return (await this.getAll(table)).length;\n }, 'COUNT_FAILED');\n\n delete = runSafe(async <K extends keyof S>(table: K, key: KeyType<S, K>) => {\n localStorage.removeItem(this.getStorageKey(table, String(key)));\n }, 'DELETE_FAILED');\n\n get = runSafe(\n async <K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> => {\n const storageKey = this.getStorageKey(table, String(key));\n const item = localStorage.getItem(storageKey);\n if (!item) return defaultValue;\n\n try {\n const raw = JSON.parse(item);\n const now = Date.now();\n const value = unwrapWithExpiry<T>(raw, now, async () => await this.delete(table, key));\n return value ?? defaultValue;\n } catch {\n await this.delete(table, key);\n return defaultValue;\n }\n },\n 'GET_FAILED',\n );\n\n getAll = runSafe(async <K extends keyof S>(table: K): Promise<S[K]['record'][]> => {\n const prefix = this.getStorageKey(table);\n const now = Date.now();\n const keys = this.getTableKeys(prefix);\n const records: S[K]['record'][] = [];\n\n for (const k of keys) {\n const record = await this.parseStorageRecord<K>(k, table, now);\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n }, 'GET_ALL_FAILED');\n\n put = runSafe(async <K extends keyof S>(table: K, value: S[K]['record'], ttl?: number) => {\n const key = this.getRecordKey(value, table);\n if (key === undefined) throw new Error('Missing key for localStorage put');\n localStorage.setItem(this.getStorageKey(table, String(key)), JSON.stringify(wrapWithExpiry(value, ttl)));\n }, 'PUT_FAILED');\n\n /** ---- Private Helper Methods ---- */\n\n private getTableKeys(prefix: string): string[] {\n return Object.keys(localStorage).filter((k) => k.startsWith(prefix));\n }\n\n private async parseStorageRecord<K extends keyof S>(\n storageKey: string,\n table: K,\n now: number,\n ): Promise<S[K]['record'] | undefined> {\n try {\n const raw = JSON.parse(localStorage.getItem(storageKey) ?? '{}');\n return unwrapWithExpiry<S[K]['record']>(raw, now, async () => {\n const idPart = this.extractKeyFromStorageKey(storageKey);\n await this.delete(table, idPart as KeyType<S, typeof table>);\n });\n } catch (err) {\n const idPart = this.extractKeyFromStorageKey(storageKey);\n await this.delete(table, idPart as KeyType<S, typeof table>);\n throw new Error(`Corrupted JSON for key: ${storageKey}`, { cause: err });\n }\n }\n\n private extractKeyFromStorageKey(storageKey: string): string {\n const parts = storageKey.split(':');\n return parts[parts.length - 1];\n }\n\n private getRecordKey<K extends keyof S>(value: Record<string, unknown>, table: K): string | number | undefined {\n const keyField = String((this.schema[table] as DepotDataRecord<any>).key);\n return value[keyField] as string | number | undefined;\n }\n\n private getStorageKey<K extends keyof S>(table: K, key?: string | number): string {\n const prefix = `${this.dbName}:${this.version}:${String(table)}:`;\n return key === undefined || key === '' ? prefix : `${prefix}${String(key)}`;\n }\n}\n\n/** -------------------- IndexedDBAdapter -------------------- **/\n\nexport class IndexedDBAdapter<S extends DepositDataSchema> implements DepositStorageAdapter<S> {\n private db: IDBDatabase | null = null;\n private readonly dbName: string;\n private readonly schema: S;\n private readonly version: number;\n private readonly migrationFn?: DepositMigrationFn<S>;\n\n constructor(dbName: string, version: number, schema: S, migrationFn?: DepositMigrationFn<S>) {\n this.dbName = dbName;\n this.version = version;\n this.schema = schema;\n this.migrationFn = migrationFn;\n }\n\n /** ---- Public API Methods ---- */\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.version);\n\n request.onupgradeneeded = (event) => {\n const db = request.result;\n const tx = request.transaction!;\n\n this.createObjectStores(db);\n this.executeMigration(db, event, tx, reject);\n };\n\n request.onsuccess = () => {\n this.db = request.result;\n resolve();\n };\n\n request.onerror = () => reject(new Error('Failed to open IndexedDB'));\n });\n }\n\n bulkDelete = runSafe(async <K extends keyof S>(table: K, keys: KeyType<S, K>[]): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n const promises = keys.map((key) => this.requestToPromise(store.delete(key as IDBKeyRange)));\n await Promise.all(promises);\n });\n }, 'BULK_DELETE_FAILED');\n\n bulkPut = runSafe(async <K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n const promises = values.map((value) => this.requestToPromise(store.put(wrapWithExpiry(value, ttl))));\n await Promise.all(promises);\n });\n }, 'BULK_PUT_FAILED');\n\n clear = runSafe(async <K extends keyof S>(table: K): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.clear());\n });\n }, 'CLEAR_FAILED');\n\n count = runSafe(async <K extends keyof S>(table: K): Promise<number> => {\n const records = await this.getAll(table);\n return records.length;\n }, 'COUNT_FAILED');\n\n delete = runSafe(async <K extends keyof S>(table: K, key: KeyType<S, K>): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.delete(key as IDBKeyRange));\n });\n }, 'DELETE_FAILED');\n\n get = runSafe(\n async <K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> => {\n return await this.withTransaction(table, 'readonly', async (store) => {\n const result = (await this.requestToPromise(store.get(key as IDBKeyRange))) as any;\n if (!result) return defaultValue;\n\n const now = Date.now();\n const value = unwrapWithExpiry<T>(result, now, async () => await this.delete(table, key));\n return value ?? defaultValue;\n });\n },\n 'GET_FAILED',\n );\n\n getAll = runSafe(async <K extends keyof S>(table: K): Promise<S[K]['record'][]> => {\n return await this.withTransaction(table, 'readonly', async (store) => {\n const result = await this.requestToPromise(store.getAll());\n const now = Date.now();\n return result\n .map((rec) => unwrapWithExpiry<S[K]['record']>(rec, now))\n .filter((v): v is S[K]['record'] => v !== undefined);\n });\n }, 'GET_ALL_FAILED');\n\n put = runSafe(async <K extends keyof S>(table: K, value: S[K]['record'], ttl?: number): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.put(wrapWithExpiry(value, ttl)));\n });\n }, 'PUT_FAILED');\n\n /** ---- Private Helper Methods ---- */\n\n private createObjectStores(db: IDBDatabase): void {\n for (const [name, def] of Object.entries(this.schema)) {\n if (db.objectStoreNames.contains(name)) continue;\n\n const keyPath = (def as DepotDataRecord<any>).key as string;\n const store = db.createObjectStore(name, { keyPath });\n\n const indexes = (def as DepotDataRecord<any>).indexes;\n if (indexes) {\n for (const index of indexes) {\n store.createIndex(index as string, index as string);\n }\n }\n }\n }\n\n private executeMigration(\n db: IDBDatabase,\n event: IDBVersionChangeEvent,\n tx: IDBTransaction,\n reject: (error: Error) => void,\n ): void {\n if (!this.migrationFn) return;\n\n try {\n const result = this.migrationFn(db, event.oldVersion, (event as any).newVersion ?? null, tx, this.schema);\n\n // Wrap result in Promise.resolve to handle both sync and async\n Promise.resolve(result).catch((err) => {\n this.abortTransaction(tx);\n reject(new Error('Migration failed', { cause: err }));\n });\n } catch (err) {\n this.abortTransaction(tx);\n reject(new Error('Migration failed', { cause: err }));\n }\n }\n\n private abortTransaction(tx: IDBTransaction): void {\n runSafe(() => tx.abort(), 'TRANSACTION_ABORT_FAILED')();\n }\n\n private async withTransaction<T>(\n tables: keyof S | (keyof S)[],\n mode: 'readonly' | 'readwrite',\n fn: (store: IDBObjectStore) => Promise<T>,\n ): Promise<T> {\n if (!this.db) await this.connect();\n\n return new Promise<T>((resolve, reject) => {\n const tableNames = Array.isArray(tables) ? tables.map(String) : [String(tables)];\n const tx = this.db!.transaction(tableNames, mode);\n const store = tx.objectStore(tableNames[0]);\n\n let result: T | undefined;\n\n fn(store)\n .then((r) => {\n result = r;\n })\n .catch((err) => {\n this.abortTransaction(tx);\n reject(new Error(`Transaction callback failed for ${tableNames.join(', ')}`, { cause: err }));\n });\n\n tx.oncomplete = () => resolve(result as T);\n tx.onerror = () => reject(new Error(`Transaction error for ${tableNames.join(', ')}`, { cause: tx.error }));\n tx.onabort = () => reject(new Error(`Transaction aborted for ${tableNames.join(', ')}`));\n });\n }\n\n private requestToPromise<R>(req: IDBRequest<R>): Promise<R> {\n return new Promise<R>((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error ?? new Error('IndexedDB request failed'));\n });\n }\n}\n\n/**\n * Wraps a value with an expiry timestamp if TTL is provided.\n */\nfunction wrapWithExpiry<T extends Record<string, unknown>>(value: T, ttl?: number): T & { expiresAt?: number } {\n if (ttl === undefined) return value;\n return { ...value, expiresAt: Date.now() + ttl };\n}\n\n/**\n * Unwraps a value from an expiry wrapper, returns undefined if expired.\n * If expired, calls onExpire callback synchronously (fire-and-forget for async cleanup).\n */\nfunction unwrapWithExpiry<T extends Record<string, unknown>>(\n value: T & { expiresAt?: number },\n now: number,\n onExpire?: () => void | Promise<void>,\n): T | undefined {\n if (value.expiresAt === undefined) return value;\n\n if (now >= value.expiresAt) {\n // Fire-and-forget cleanup - don't block on async deletion\n if (onExpire) {\n const result = onExpire();\n // If it's a promise, catch errors to prevent unhandled rejections\n if (result && typeof (result as Promise<void>).then === 'function') {\n (result as Promise<void>).catch((err) => {\n Logit.setPrefix('Deposit');\n Logit.warn('Failed to clean up expired entry', err);\n });\n }\n }\n return undefined;\n }\n\n return value;\n}\n\n/** -------------------- runSafe -------------------- **/\n\n/**\n * Wraps a function to suppress errors and log them with consistent prefix.\n * For async functions, catches both sync and async errors.\n */\nexport function runSafe<T extends (...args: any[]) => any>(fn: T, label = 'OPERATION_FAILED'): T {\n return ((...args: any[]) => {\n try {\n const result = fn(...args);\n\n // Handle async functions\n if (result && typeof result.then === 'function') {\n return result.catch((err: Error) => {\n Logit.setPrefix('Deposit');\n Logit.error(label, err);\n return undefined;\n });\n }\n\n return result;\n } catch (err) {\n Logit.setPrefix('Deposit');\n Logit.error(label, err);\n return undefined;\n }\n }) as unknown as T;\n}\n"],"names":["Deposit","adapterOrConfig","type","dbName","version","schema","migrationFn","LocalStorageAdapter","IndexedDBAdapter","table","keys","values","ttl","key","defaultValue","value","QueryBuilder","tables","fn","storeMap","proxy","err","promises","target","prop","stores","commits","patches","operations","patch","adapter","o","predicate","keysToDelete","op","name","args","opSignature","field","data","r","lower","upper","val","prefix","ignoreCase","lowerPrefix","item","idx","arr","fns","direction","sortBy","n","pageNumber","pageSize","start","end","acc","min","max","callback","context","fieldStr","group","query","tone","search","cached","promise","conditions","cond","runSafe","v","keysToRemove","k","storageKey","raw","now","unwrapWithExpiry","records","record","wrapWithExpiry","idPart","parts","keyField","resolve","reject","request","event","db","tx","store","result","rec","def","keyPath","indexes","index","mode","tableNames","req","onExpire","Logit","label"],"mappings":"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"}
1
+ {"version":3,"file":"deposit.cjs","sources":["../src/deposit.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport { Logit } from '@vielzeug/logit';\nimport { arrange, group, max, min, type Predicate, search } from '@vielzeug/toolkit';\n\nexport type DepotDataRecord<T, K extends keyof T = keyof T> = {\n indexes?: K[];\n key: K;\n record: T;\n};\n\ntype DataSchemaDef = Record<string, Record<string, unknown>>;\n\nexport type DepositDataSchema<S = DataSchemaDef> = {\n [K in keyof S]: DepotDataRecord<S[K], keyof S[K]>;\n};\n\nexport type DepositMigrationFn<S extends DepositDataSchema> = (\n db: IDBDatabase,\n oldVersion: number,\n newVersion: number | null,\n transaction: IDBTransaction,\n schema: S,\n) => void | Promise<void>;\n\nexport type DepositStorageAdapter<S extends DepositDataSchema> = {\n bulkDelete<K extends keyof S>(table: K, keys: KeyType<S, K>[]): Promise<void>;\n bulkPut<K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number): Promise<void>;\n clear<K extends keyof S>(table: K): Promise<void>;\n count<K extends keyof S>(table: K): Promise<number>;\n delete<K extends keyof S>(table: K, key: KeyType<S, K>): Promise<void>;\n get<K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined>;\n getAll<K extends keyof S>(table: K): Promise<S[K]['record'][]>;\n put<K extends keyof S>(table: K, value: S[K]['record'], ttl?: number): Promise<void>;\n connect?(): Promise<void>;\n};\n\ntype QueryCondition<T, K extends keyof T = keyof T> =\n | { type: 'equals'; field: K; value: T[K] }\n | { type: 'between'; field: K; lower: T[K]; upper: T[K] }\n | { type: 'startsWith'; field: Extract<K, string & keyof T>; value: string }\n | { type: 'where'; field: K; fn: (value: T[K], record: T) => boolean }\n | { type: 'filter'; fn: (record: T) => boolean }\n | { type: 'orderBy'; field: K; value?: 'asc' | 'desc' }\n | { type: 'limit'; value: number }\n | { type: 'offset'; value: number }\n | { type: 'page'; pageNumber: number; pageSize: number };\n\ntype PatchOperation<T, K = any> =\n | { type: 'put'; value: T; ttl?: number }\n | { type: 'delete'; key: K }\n | { type: 'clear' };\n\n/**\n * Extracts the key type for a given table in the schema.\n * Returns the type of the record's key field.\n */\ntype KeyType<S extends DepositDataSchema, K extends keyof S> = S[K]['record'][S[K]['key']];\n\ntype AdapterConfig<S extends DepositDataSchema> = {\n type: 'localStorage' | 'indexedDB';\n dbName: string;\n version: number;\n schema: S;\n migrationFn?: DepositMigrationFn<S>;\n};\n\nexport class Deposit<S extends DepositDataSchema> {\n private readonly adapter: DepositStorageAdapter<S>;\n\n constructor(adapterOrConfig: DepositStorageAdapter<S> | AdapterConfig<S>) {\n this.adapter = this.createAdapter(adapterOrConfig);\n }\n\n private createAdapter(adapterOrConfig: DepositStorageAdapter<S> | AdapterConfig<S>): DepositStorageAdapter<S> {\n if (!('type' in adapterOrConfig)) {\n return adapterOrConfig;\n }\n\n const { type, dbName, version, schema, migrationFn } = adapterOrConfig;\n\n switch (type) {\n case 'localStorage':\n return new LocalStorageAdapter(dbName, version, schema);\n case 'indexedDB':\n return new IndexedDBAdapter(dbName, version, schema, migrationFn);\n default:\n throw new Error(`Unknown adapter type: ${type}`);\n }\n }\n\n bulkDelete<K extends keyof S>(table: K, keys: KeyType<S, K>[]) {\n return this.adapter.bulkDelete(table, keys);\n }\n\n bulkPut<K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number) {\n return this.adapter.bulkPut(table, values, ttl);\n }\n\n clear<K extends keyof S>(table: K) {\n return this.adapter.clear(table);\n }\n\n count<K extends keyof S>(table: K): Promise<number> {\n return this.adapter.count(table);\n }\n\n delete<K extends keyof S>(table: K, key: KeyType<S, K>) {\n return this.adapter.delete(table, key);\n }\n\n get<K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> {\n return this.adapter.get(table, key, defaultValue);\n }\n\n getAll<K extends keyof S>(table: K): Promise<S[K]['record'][]> {\n return this.adapter.getAll(table);\n }\n\n put<K extends keyof S>(table: K, value: S[K]['record'], ttl?: number) {\n return this.adapter.put(table, value, ttl);\n }\n\n query<K extends keyof S>(table: K): QueryBuilder<S[K]['record']> {\n return new QueryBuilder<S[K]['record']>(this.adapter, String(table));\n }\n\n async transaction<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(\n tables: K[],\n fn: (stores: T) => Promise<void>,\n ttl?: number,\n ) {\n const storeMap = await this.loadStores<K, T>(tables);\n const proxy = this.createStoreProxy(storeMap);\n\n try {\n await fn(proxy as T);\n await this.commitStores(tables, proxy, ttl);\n } catch (err) {\n throw new Error(`Transaction failed for tables: ${tables.map(String).join(', ')}`, { cause: err });\n }\n }\n\n private async loadStores<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(tables: K[]): Promise<T> {\n const storeMap = {} as T;\n const promises = tables.map(async (table) => {\n (storeMap as any)[table] = await this.getAll(table);\n });\n await Promise.all(promises);\n return storeMap;\n }\n\n private createStoreProxy<T extends Record<string, any>>(storeMap: T): T {\n return new Proxy(storeMap, {\n get(target, prop) {\n return target[prop as keyof T];\n },\n set(target, prop, value) {\n target[prop as keyof T] = value;\n return true;\n },\n }) as T;\n }\n\n private async commitStores<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(\n tables: K[],\n stores: T,\n ttl?: number,\n ): Promise<void> {\n const commits = tables.map(async (table) => {\n await this.clear(table);\n await this.bulkPut(table, stores[table], ttl);\n });\n await Promise.all(commits);\n }\n\n async patch<K extends keyof S>(table: K, patches: PatchOperation<S[K]['record'], KeyType<S, K>>[]): Promise<void> {\n const operations = patches.map((patch) => this.applyPatch(table, patch));\n await Promise.all(operations);\n }\n\n private async applyPatch<K extends keyof S>(\n table: K,\n patch: PatchOperation<S[K]['record'], KeyType<S, K>>,\n ): Promise<void> {\n switch (patch.type) {\n case 'put':\n return this.put(table, patch.value, patch.ttl);\n case 'delete':\n return this.delete(table, patch.key);\n case 'clear':\n return this.clear(table);\n }\n }\n}\n\n/** -------------------- QueryBuilder -------------------- **/\n\nexport class QueryBuilder<T extends Record<string, unknown>> {\n private operations: Array<{ op: (data: T[]) => T[]; name: string; args: unknown[] }> = [];\n private readonly adapter: DepositStorageAdapter<any>;\n private readonly table: string;\n private memoCache: Map<string, Promise<T[]>> = new Map();\n private dataVersion = 0;\n private hasMutatingOp = false;\n private cachedSignature: string | null = null;\n\n constructor(adapter: DepositStorageAdapter<any>, table: string) {\n this.adapter = adapter;\n this.table = table;\n }\n\n private getOpSignature(): string {\n if (this.cachedSignature === null) {\n this.cachedSignature = this.operations.map((o) => `${o.name}:${JSON.stringify(o.args)}`).join('|');\n }\n return this.cachedSignature;\n }\n\n private getMemoKey(): string {\n return `${this.getOpSignature()}|v${this.dataVersion}`;\n }\n\n private invalidateMemo(predicate?: (key: string) => boolean): void {\n if (!predicate) {\n this.memoCache.clear();\n return;\n }\n const keysToDelete = Array.from(this.memoCache.keys()).filter(predicate);\n for (const key of keysToDelete) {\n this.memoCache.delete(key);\n }\n }\n\n private pushOp(op: (data: T[]) => T[], name = 'op', args: unknown[] = []): this {\n this.operations.push({ args, name, op });\n this.cachedSignature = null; // Invalidate cached signature\n const opSignature = this.getOpSignature();\n this.invalidateMemo((key: string) => key.startsWith(opSignature));\n return this;\n }\n\n /** ---- Core select/where operations (no implicit state) ---- */\n\n where<K extends keyof T>(field: K, predicate: (value: T[K], record: T) => boolean): this {\n return this.pushOp((data) => data.filter((r) => predicate(r[field], r)), 'where', [field, predicate]);\n }\n\n equals<K extends keyof T>(field: K, value: T[K]): this {\n return this.pushOp((data) => data.filter((r) => r[field] === value), 'equals', [field, value]);\n }\n\n between<K extends keyof T>(field: K, lower: number, upper: number): this {\n return this.pushOp(\n (data) =>\n data.filter((r) => {\n const val = r[field] as any;\n return val >= lower && val <= upper;\n }),\n 'between',\n [field, lower, upper],\n );\n }\n\n startsWith<K extends keyof T>(field: K, prefix: string, ignoreCase = false): this {\n const lowerPrefix = ignoreCase ? prefix.toLowerCase() : prefix;\n return this.pushOp(\n (data) =>\n data.filter((r) => {\n const value = r[field];\n if (typeof value !== 'string') return false;\n const str = ignoreCase ? value.toLowerCase() : value;\n return str.startsWith(lowerPrefix);\n }),\n 'startsWith',\n [field, prefix, ignoreCase],\n );\n }\n\n filter(fn: Predicate<T>): this {\n return this.pushOp((data) => data.filter(fn), 'filter', [fn]);\n }\n\n not(fn: Predicate<T>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => !fn(item, idx, arr)), 'not', [fn]);\n }\n\n and(...fns: Array<Predicate<T>>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => fns.every((fn) => fn(item, idx, arr))), 'and', fns);\n }\n\n or(...fns: Array<Predicate<T>>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => fns.some((fn) => fn(item, idx, arr))), 'or', fns);\n }\n\n /** ---- Ordering / slicing ---- */\n\n orderBy<K extends keyof T>(field: K, direction: 'asc' | 'desc' = 'asc'): this {\n return this.pushOp(\n (data) => arrange(data, { [field]: direction } as Partial<Record<keyof T, 'asc' | 'desc'>>) as T[],\n 'orderBy',\n [field, direction],\n );\n }\n\n limit(n: number): this {\n return this.pushOp((data) => data.slice(0, n), 'limit', [n]);\n }\n\n offset(n: number): this {\n return this.pushOp((data) => data.slice(n), 'offset', [n]);\n }\n\n page(pageNumber: number, pageSize: number): this {\n return this.pushOp(\n (data) => {\n const start = (pageNumber - 1) * pageSize;\n const end = start + pageSize;\n return data.slice(start, end);\n },\n 'page',\n [pageNumber, pageSize],\n );\n }\n\n reverse(): this {\n return this.pushOp((data) => [...data].reverse(), 'reverse', []);\n }\n\n /** ---- Aggregations ---- */\n\n async count(): Promise<number> {\n return (await this.toArray()).length;\n }\n\n async first(): Promise<T | undefined> {\n return (await this.toArray())[0];\n }\n\n async last(): Promise<T | undefined> {\n const arr = await this.toArray();\n return arr[arr.length - 1];\n }\n\n async average<K extends keyof T>(field: K): Promise<number> {\n const arr = await this.toArray();\n if (arr.length === 0) return 0;\n const total = arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n return total / arr.length;\n }\n\n async min<K extends keyof T>(field: K): Promise<T | undefined> {\n return min(await this.toArray(), (item) => item[field] as any);\n }\n\n async max<K extends keyof T>(field: K): Promise<T | undefined> {\n return max(await this.toArray(), (item) => item[field] as any);\n }\n\n async sum<K extends keyof T>(field: K): Promise<number> {\n const arr = await this.toArray();\n return arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n }\n\n /** ---- Transformations ---- */\n\n modify(callback: (record: T) => T | undefined, context?: { field: keyof T; value: unknown }): this {\n this.hasMutatingOp = true;\n this.dataVersion++;\n this.invalidateModifyCache(context);\n\n return this.pushOp((data) => data.map((item) => callback(item) ?? item), 'modify', [callback]);\n }\n\n private invalidateModifyCache(context?: { field: keyof T; value: unknown }): void {\n if (!context?.field) {\n this.invalidateMemo((key: string) => key.includes('modify'));\n return;\n }\n\n const fieldStr = String(context.field);\n this.invalidateMemo(\n (key: string) =>\n key.includes(`\"${fieldStr}\"`) && (context.value === undefined || key.includes(JSON.stringify(context.value))),\n );\n }\n\n groupBy<K extends keyof T>(field: K): this {\n return this.pushOp((data) => group(data, (item) => item[field] as any) as unknown as T[]);\n }\n\n search(query: string, tone?: number): this {\n return this.pushOp((data) => search(data as unknown as any[], query, tone) as unknown as T[]);\n }\n\n /** ---- Execution / state ---- */\n\n reset(): this {\n this.operations = [];\n this.hasMutatingOp = false;\n this.cachedSignature = null;\n this.invalidateMemo();\n return this;\n }\n\n async toArray(): Promise<T[]> {\n const key = this.getMemoKey();\n const cached = this.memoCache.get(key);\n if (cached) return cached;\n\n const promise = this.executeOperations();\n if (!this.hasMutatingOp) {\n this.memoCache.set(key, promise);\n }\n return promise;\n }\n\n private async executeOperations(): Promise<T[]> {\n const originalData = (await this.adapter.getAll(this.table)) as T[];\n let data = originalData.slice(); // Create a shallow copy\n\n for (const { op } of this.operations) {\n data = op(data);\n }\n\n return data;\n }\n\n /** ---- Query builder DSL (typed) ---- */\n\n build(conditions: Array<QueryCondition<T>>): this {\n for (const cond of conditions) {\n this.applyCondition(cond);\n }\n return this;\n }\n\n private applyCondition(cond: QueryCondition<T>): void {\n switch (cond.type) {\n case 'equals':\n this.equals(cond.field as any, cond.value as any);\n break;\n case 'between':\n this.between(cond.field as any, cond.lower as any, cond.upper as any);\n break;\n case 'startsWith':\n this.startsWith(cond.field as any, cond.value);\n break;\n case 'where':\n this.where(cond.field as any, cond.fn as any);\n break;\n case 'filter':\n this.filter(cond.fn);\n break;\n case 'orderBy':\n this.orderBy(cond.field as any, cond.value ?? 'asc');\n break;\n case 'limit':\n this.limit(cond.value);\n break;\n case 'offset':\n this.offset(cond.value);\n break;\n case 'page':\n this.page(cond.pageNumber, cond.pageSize);\n break;\n default:\n throw new Error(`Unknown query type: ${(cond as any).type}`);\n }\n }\n}\n\n/** -------------------- LocalStorageAdapter -------------------- **/\n\nexport class LocalStorageAdapter<S extends DepositDataSchema> implements DepositStorageAdapter<S> {\n private readonly dbName: string;\n private readonly version: number;\n private schema: S;\n\n constructor(dbName: string, version: number, schema: S) {\n this.dbName = dbName;\n this.version = version;\n this.schema = schema;\n }\n\n /** ---- Public API Methods ---- */\n\n bulkDelete = runSafe(async <K extends keyof S>(table: K, keys: KeyType<S, K>[]) => {\n const promises = keys.map((key) => this.delete(table, key));\n await Promise.all(promises);\n }, 'BULK_DELETE_FAILED');\n\n bulkPut = runSafe(async <K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number) => {\n const promises = values.map((v) => this.put(table, v, ttl));\n await Promise.all(promises);\n }, 'BULK_PUT_FAILED');\n\n clear = runSafe(async <K extends keyof S>(table: K) => {\n const prefix = this.getStorageKey(table);\n const keysToRemove = this.getTableKeys(prefix);\n for (const k of keysToRemove) {\n localStorage.removeItem(k);\n }\n }, 'CLEAR_FAILED');\n\n count = runSafe(async <K extends keyof S>(table: K): Promise<number> => {\n return (await this.getAll(table)).length;\n }, 'COUNT_FAILED');\n\n delete = runSafe(async <K extends keyof S>(table: K, key: KeyType<S, K>) => {\n localStorage.removeItem(this.getStorageKey(table, String(key)));\n }, 'DELETE_FAILED');\n\n get = runSafe(\n async <K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> => {\n const storageKey = this.getStorageKey(table, String(key));\n const item = localStorage.getItem(storageKey);\n if (!item) return defaultValue;\n\n try {\n const raw = JSON.parse(item);\n const now = Date.now();\n const value = unwrapWithExpiry<T>(raw, now, async () => await this.delete(table, key));\n return value ?? defaultValue;\n } catch {\n await this.delete(table, key);\n return defaultValue;\n }\n },\n 'GET_FAILED',\n );\n\n getAll = runSafe(async <K extends keyof S>(table: K): Promise<S[K]['record'][]> => {\n const prefix = this.getStorageKey(table);\n const now = Date.now();\n const keys = this.getTableKeys(prefix);\n const records: S[K]['record'][] = [];\n\n for (const k of keys) {\n const record = await this.parseStorageRecord<K>(k, table, now);\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n }, 'GET_ALL_FAILED');\n\n put = runSafe(async <K extends keyof S>(table: K, value: S[K]['record'], ttl?: number) => {\n const key = this.getRecordKey(value, table);\n if (key === undefined) throw new Error('Missing key for localStorage put');\n localStorage.setItem(this.getStorageKey(table, String(key)), JSON.stringify(wrapWithExpiry(value, ttl)));\n }, 'PUT_FAILED');\n\n /** ---- Private Helper Methods ---- */\n\n private getTableKeys(prefix: string): string[] {\n return Object.keys(localStorage).filter((k) => k.startsWith(prefix));\n }\n\n private async parseStorageRecord<K extends keyof S>(\n storageKey: string,\n table: K,\n now: number,\n ): Promise<S[K]['record'] | undefined> {\n try {\n const raw = JSON.parse(localStorage.getItem(storageKey) ?? '{}');\n return unwrapWithExpiry<S[K]['record']>(raw, now, async () => {\n const idPart = this.extractKeyFromStorageKey(storageKey);\n await this.delete(table, idPart as KeyType<S, typeof table>);\n });\n } catch (err) {\n const idPart = this.extractKeyFromStorageKey(storageKey);\n await this.delete(table, idPart as KeyType<S, typeof table>);\n throw new Error(`Corrupted JSON for key: ${storageKey}`, { cause: err });\n }\n }\n\n private extractKeyFromStorageKey(storageKey: string): string {\n const parts = storageKey.split(':');\n return parts[parts.length - 1];\n }\n\n private getRecordKey<K extends keyof S>(value: Record<string, unknown>, table: K): string | number | undefined {\n const keyField = String((this.schema[table] as DepotDataRecord<any>).key);\n return value[keyField] as string | number | undefined;\n }\n\n private getStorageKey<K extends keyof S>(table: K, key?: string | number): string {\n const prefix = `${this.dbName}:${this.version}:${String(table)}:`;\n return key === undefined || key === '' ? prefix : `${prefix}${String(key)}`;\n }\n}\n\n/** -------------------- IndexedDBAdapter -------------------- **/\n\nexport class IndexedDBAdapter<S extends DepositDataSchema> implements DepositStorageAdapter<S> {\n private db: IDBDatabase | null = null;\n private readonly dbName: string;\n private readonly schema: S;\n private readonly version: number;\n private readonly migrationFn?: DepositMigrationFn<S>;\n\n constructor(dbName: string, version: number, schema: S, migrationFn?: DepositMigrationFn<S>) {\n this.dbName = dbName;\n this.version = version;\n this.schema = schema;\n this.migrationFn = migrationFn;\n }\n\n /** ---- Public API Methods ---- */\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.version);\n\n request.onupgradeneeded = (event) => {\n const db = request.result;\n const tx = request.transaction!;\n\n this.createObjectStores(db);\n this.executeMigration(db, event, tx, reject);\n };\n\n request.onsuccess = () => {\n this.db = request.result;\n resolve();\n };\n\n request.onerror = () => reject(new Error('Failed to open IndexedDB'));\n });\n }\n\n bulkDelete = runSafe(async <K extends keyof S>(table: K, keys: KeyType<S, K>[]): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n const promises = keys.map((key) => this.requestToPromise(store.delete(key as IDBKeyRange)));\n await Promise.all(promises);\n });\n }, 'BULK_DELETE_FAILED');\n\n bulkPut = runSafe(async <K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n const promises = values.map((value) => this.requestToPromise(store.put(wrapWithExpiry(value, ttl))));\n await Promise.all(promises);\n });\n }, 'BULK_PUT_FAILED');\n\n clear = runSafe(async <K extends keyof S>(table: K): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.clear());\n });\n }, 'CLEAR_FAILED');\n\n count = runSafe(async <K extends keyof S>(table: K): Promise<number> => {\n const records = await this.getAll(table);\n return records.length;\n }, 'COUNT_FAILED');\n\n delete = runSafe(async <K extends keyof S>(table: K, key: KeyType<S, K>): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.delete(key as IDBKeyRange));\n });\n }, 'DELETE_FAILED');\n\n get = runSafe(\n async <K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> => {\n return await this.withTransaction(table, 'readonly', async (store) => {\n const result = (await this.requestToPromise(store.get(key as IDBKeyRange))) as any;\n if (!result) return defaultValue;\n\n const now = Date.now();\n const value = unwrapWithExpiry<T>(result, now, async () => await this.delete(table, key));\n return value ?? defaultValue;\n });\n },\n 'GET_FAILED',\n );\n\n getAll = runSafe(async <K extends keyof S>(table: K): Promise<S[K]['record'][]> => {\n return await this.withTransaction(table, 'readonly', async (store) => {\n const result = await this.requestToPromise(store.getAll());\n const now = Date.now();\n return result\n .map((rec) => unwrapWithExpiry<S[K]['record']>(rec, now))\n .filter((v): v is S[K]['record'] => v !== undefined);\n });\n }, 'GET_ALL_FAILED');\n\n put = runSafe(async <K extends keyof S>(table: K, value: S[K]['record'], ttl?: number): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.put(wrapWithExpiry(value, ttl)));\n });\n }, 'PUT_FAILED');\n\n /** ---- Private Helper Methods ---- */\n\n private createObjectStores(db: IDBDatabase): void {\n for (const [name, def] of Object.entries(this.schema)) {\n if (db.objectStoreNames.contains(name)) continue;\n\n const keyPath = (def as DepotDataRecord<any>).key as string;\n const store = db.createObjectStore(name, { keyPath });\n\n const indexes = (def as DepotDataRecord<any>).indexes;\n if (indexes) {\n for (const index of indexes) {\n store.createIndex(index as string, index as string);\n }\n }\n }\n }\n\n private executeMigration(\n db: IDBDatabase,\n event: IDBVersionChangeEvent,\n tx: IDBTransaction,\n reject: (error: Error) => void,\n ): void {\n if (!this.migrationFn) return;\n\n try {\n const result = this.migrationFn(db, event.oldVersion, (event as any).newVersion ?? null, tx, this.schema);\n\n // Wrap result in Promise.resolve to handle both sync and async\n Promise.resolve(result).catch((err) => {\n this.abortTransaction(tx);\n reject(new Error('Migration failed', { cause: err }));\n });\n } catch (err) {\n this.abortTransaction(tx);\n reject(new Error('Migration failed', { cause: err }));\n }\n }\n\n private abortTransaction(tx: IDBTransaction): void {\n runSafe(() => tx.abort(), 'TRANSACTION_ABORT_FAILED')();\n }\n\n private async withTransaction<T>(\n tables: keyof S | (keyof S)[],\n mode: 'readonly' | 'readwrite',\n fn: (store: IDBObjectStore) => Promise<T>,\n ): Promise<T> {\n if (!this.db) await this.connect();\n\n return new Promise<T>((resolve, reject) => {\n const tableNames = Array.isArray(tables) ? tables.map(String) : [String(tables)];\n const tx = this.db!.transaction(tableNames, mode);\n const store = tx.objectStore(tableNames[0]);\n\n let result: T | undefined;\n\n fn(store)\n .then((r) => {\n result = r;\n })\n .catch((err) => {\n this.abortTransaction(tx);\n reject(new Error(`Transaction callback failed for ${tableNames.join(', ')}`, { cause: err }));\n });\n\n tx.oncomplete = () => resolve(result as T);\n tx.onerror = () => reject(new Error(`Transaction error for ${tableNames.join(', ')}`, { cause: tx.error }));\n tx.onabort = () => reject(new Error(`Transaction aborted for ${tableNames.join(', ')}`));\n });\n }\n\n private requestToPromise<R>(req: IDBRequest<R>): Promise<R> {\n return new Promise<R>((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error ?? new Error('IndexedDB request failed'));\n });\n }\n}\n\n/**\n * Wraps a value with an expiry timestamp if TTL is provided.\n */\nfunction wrapWithExpiry<T extends Record<string, unknown>>(value: T, ttl?: number): T & { expiresAt?: number } {\n if (ttl === undefined) return value;\n return { ...value, expiresAt: Date.now() + ttl };\n}\n\n/**\n * Unwraps a value from an expiry wrapper, returns undefined if expired.\n * If expired, calls onExpire callback synchronously (fire-and-forget for async cleanup).\n */\nfunction unwrapWithExpiry<T extends Record<string, unknown>>(\n value: T & { expiresAt?: number },\n now: number,\n onExpire?: () => void | Promise<void>,\n): T | undefined {\n if (value.expiresAt === undefined) return value;\n\n if (now >= value.expiresAt) {\n // Fire-and-forget cleanup - don't block on async deletion\n if (onExpire) {\n const result = onExpire();\n // If it's a promise, catch errors to prevent unhandled rejections\n if (result && typeof (result as Promise<void>).then === 'function') {\n (result as Promise<void>).catch((err) => {\n Logit.setPrefix('Deposit');\n Logit.warn('Failed to clean up expired entry', err);\n });\n }\n }\n return undefined;\n }\n\n return value;\n}\n\n/** -------------------- runSafe -------------------- **/\n\n/**\n * Wraps a function to suppress errors and log them with consistent prefix.\n * For async functions, catches both sync and async errors.\n */\nexport function runSafe<T extends (...args: any[]) => any>(fn: T, label = 'OPERATION_FAILED'): T {\n return ((...args: any[]) => {\n try {\n const result = fn(...args);\n\n // Handle async functions\n if (result && typeof result.then === 'function') {\n return result.catch((err: Error) => {\n Logit.setPrefix('Deposit');\n Logit.error(label, err);\n return undefined;\n });\n }\n\n return result;\n } catch (err) {\n Logit.setPrefix('Deposit');\n Logit.error(label, err);\n return undefined;\n }\n }) as unknown as T;\n}\n"],"names":["Deposit","adapterOrConfig","type","dbName","version","schema","migrationFn","LocalStorageAdapter","IndexedDBAdapter","table","keys","values","ttl","key","defaultValue","value","QueryBuilder","tables","fn","storeMap","proxy","err","promises","target","prop","stores","commits","patches","operations","patch","adapter","o","predicate","keysToDelete","op","name","args","opSignature","field","data","r","lower","upper","val","prefix","ignoreCase","lowerPrefix","item","idx","arr","fns","direction","arrange","n","pageNumber","pageSize","start","end","acc","min","max","callback","context","fieldStr","group","query","tone","search","cached","promise","conditions","cond","runSafe","v","keysToRemove","k","storageKey","raw","now","unwrapWithExpiry","records","record","wrapWithExpiry","idPart","parts","keyField","resolve","reject","request","event","db","tx","store","result","rec","def","keyPath","indexes","index","mode","tableNames","req","onExpire","Logit","label"],"mappings":"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"}
package/dist/deposit.js CHANGED
@@ -3,7 +3,7 @@ import "./toolkit/dist/logit/dist/logit.js";
3
3
  import "./toolkit/dist/array/filter.js";
4
4
  import { group as d } from "./toolkit/dist/array/group.js";
5
5
  import { search as w } from "./toolkit/dist/array/search.js";
6
- import { sortBy as g } from "./toolkit/dist/array/sortBy.js";
6
+ import { arrange as g } from "./toolkit/dist/array/arrange.js";
7
7
  import { max as f } from "./toolkit/dist/math/max.js";
8
8
  import { min as S } from "./toolkit/dist/math/min.js";
9
9
  class F {
@@ -1 +1 @@
1
- {"version":3,"file":"deposit.js","sources":["../src/deposit.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport { Logit } from '@vielzeug/logit';\nimport { group, max, min, type Predicate, search, sortBy } from '@vielzeug/toolkit';\n\nexport type DepotDataRecord<T, K extends keyof T = keyof T> = {\n indexes?: K[];\n key: K;\n record: T;\n};\n\ntype DataSchemaDef = Record<string, Record<string, unknown>>;\n\nexport type DepositDataSchema<S = DataSchemaDef> = {\n [K in keyof S]: DepotDataRecord<S[K], keyof S[K]>;\n};\n\nexport type DepositMigrationFn<S extends DepositDataSchema> = (\n db: IDBDatabase,\n oldVersion: number,\n newVersion: number | null,\n transaction: IDBTransaction,\n schema: S,\n) => void | Promise<void>;\n\nexport type DepositStorageAdapter<S extends DepositDataSchema> = {\n bulkDelete<K extends keyof S>(table: K, keys: KeyType<S, K>[]): Promise<void>;\n bulkPut<K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number): Promise<void>;\n clear<K extends keyof S>(table: K): Promise<void>;\n count<K extends keyof S>(table: K): Promise<number>;\n delete<K extends keyof S>(table: K, key: KeyType<S, K>): Promise<void>;\n get<K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined>;\n getAll<K extends keyof S>(table: K): Promise<S[K]['record'][]>;\n put<K extends keyof S>(table: K, value: S[K]['record'], ttl?: number): Promise<void>;\n connect?(): Promise<void>;\n};\n\ntype QueryCondition<T, K extends keyof T = keyof T> =\n | { type: 'equals'; field: K; value: T[K] }\n | { type: 'between'; field: K; lower: T[K]; upper: T[K] }\n | { type: 'startsWith'; field: Extract<K, string & keyof T>; value: string }\n | { type: 'where'; field: K; fn: (value: T[K], record: T) => boolean }\n | { type: 'filter'; fn: (record: T) => boolean }\n | { type: 'orderBy'; field: K; value?: 'asc' | 'desc' }\n | { type: 'limit'; value: number }\n | { type: 'offset'; value: number }\n | { type: 'page'; pageNumber: number; pageSize: number };\n\ntype PatchOperation<T, K = any> =\n | { type: 'put'; value: T; ttl?: number }\n | { type: 'delete'; key: K }\n | { type: 'clear' };\n\n/**\n * Extracts the key type for a given table in the schema.\n * Returns the type of the record's key field.\n */\ntype KeyType<S extends DepositDataSchema, K extends keyof S> = S[K]['record'][S[K]['key']];\n\ntype AdapterConfig<S extends DepositDataSchema> = {\n type: 'localStorage' | 'indexedDB';\n dbName: string;\n version: number;\n schema: S;\n migrationFn?: DepositMigrationFn<S>;\n};\n\nexport class Deposit<S extends DepositDataSchema> {\n private readonly adapter: DepositStorageAdapter<S>;\n\n constructor(adapterOrConfig: DepositStorageAdapter<S> | AdapterConfig<S>) {\n this.adapter = this.createAdapter(adapterOrConfig);\n }\n\n private createAdapter(adapterOrConfig: DepositStorageAdapter<S> | AdapterConfig<S>): DepositStorageAdapter<S> {\n if (!('type' in adapterOrConfig)) {\n return adapterOrConfig;\n }\n\n const { type, dbName, version, schema, migrationFn } = adapterOrConfig;\n\n switch (type) {\n case 'localStorage':\n return new LocalStorageAdapter(dbName, version, schema);\n case 'indexedDB':\n return new IndexedDBAdapter(dbName, version, schema, migrationFn);\n default:\n throw new Error(`Unknown adapter type: ${type}`);\n }\n }\n\n bulkDelete<K extends keyof S>(table: K, keys: KeyType<S, K>[]) {\n return this.adapter.bulkDelete(table, keys);\n }\n\n bulkPut<K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number) {\n return this.adapter.bulkPut(table, values, ttl);\n }\n\n clear<K extends keyof S>(table: K) {\n return this.adapter.clear(table);\n }\n\n count<K extends keyof S>(table: K): Promise<number> {\n return this.adapter.count(table);\n }\n\n delete<K extends keyof S>(table: K, key: KeyType<S, K>) {\n return this.adapter.delete(table, key);\n }\n\n get<K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> {\n return this.adapter.get(table, key, defaultValue);\n }\n\n getAll<K extends keyof S>(table: K): Promise<S[K]['record'][]> {\n return this.adapter.getAll(table);\n }\n\n put<K extends keyof S>(table: K, value: S[K]['record'], ttl?: number) {\n return this.adapter.put(table, value, ttl);\n }\n\n query<K extends keyof S>(table: K): QueryBuilder<S[K]['record']> {\n return new QueryBuilder<S[K]['record']>(this.adapter, String(table));\n }\n\n async transaction<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(\n tables: K[],\n fn: (stores: T) => Promise<void>,\n ttl?: number,\n ) {\n const storeMap = await this.loadStores<K, T>(tables);\n const proxy = this.createStoreProxy(storeMap);\n\n try {\n await fn(proxy as T);\n await this.commitStores(tables, proxy, ttl);\n } catch (err) {\n throw new Error(`Transaction failed for tables: ${tables.map(String).join(', ')}`, { cause: err });\n }\n }\n\n private async loadStores<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(tables: K[]): Promise<T> {\n const storeMap = {} as T;\n const promises = tables.map(async (table) => {\n (storeMap as any)[table] = await this.getAll(table);\n });\n await Promise.all(promises);\n return storeMap;\n }\n\n private createStoreProxy<T extends Record<string, any>>(storeMap: T): T {\n return new Proxy(storeMap, {\n get(target, prop) {\n return target[prop as keyof T];\n },\n set(target, prop, value) {\n target[prop as keyof T] = value;\n return true;\n },\n }) as T;\n }\n\n private async commitStores<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(\n tables: K[],\n stores: T,\n ttl?: number,\n ): Promise<void> {\n const commits = tables.map(async (table) => {\n await this.clear(table);\n await this.bulkPut(table, stores[table], ttl);\n });\n await Promise.all(commits);\n }\n\n async patch<K extends keyof S>(table: K, patches: PatchOperation<S[K]['record'], KeyType<S, K>>[]): Promise<void> {\n const operations = patches.map((patch) => this.applyPatch(table, patch));\n await Promise.all(operations);\n }\n\n private async applyPatch<K extends keyof S>(\n table: K,\n patch: PatchOperation<S[K]['record'], KeyType<S, K>>,\n ): Promise<void> {\n switch (patch.type) {\n case 'put':\n return this.put(table, patch.value, patch.ttl);\n case 'delete':\n return this.delete(table, patch.key);\n case 'clear':\n return this.clear(table);\n }\n }\n}\n\n/** -------------------- QueryBuilder -------------------- **/\n\nexport class QueryBuilder<T extends Record<string, unknown>> {\n private operations: Array<{ op: (data: T[]) => T[]; name: string; args: unknown[] }> = [];\n private readonly adapter: DepositStorageAdapter<any>;\n private readonly table: string;\n private memoCache: Map<string, Promise<T[]>> = new Map();\n private dataVersion = 0;\n private hasMutatingOp = false;\n private cachedSignature: string | null = null;\n\n constructor(adapter: DepositStorageAdapter<any>, table: string) {\n this.adapter = adapter;\n this.table = table;\n }\n\n private getOpSignature(): string {\n if (this.cachedSignature === null) {\n this.cachedSignature = this.operations.map((o) => `${o.name}:${JSON.stringify(o.args)}`).join('|');\n }\n return this.cachedSignature;\n }\n\n private getMemoKey(): string {\n return `${this.getOpSignature()}|v${this.dataVersion}`;\n }\n\n private invalidateMemo(predicate?: (key: string) => boolean): void {\n if (!predicate) {\n this.memoCache.clear();\n return;\n }\n const keysToDelete = Array.from(this.memoCache.keys()).filter(predicate);\n for (const key of keysToDelete) {\n this.memoCache.delete(key);\n }\n }\n\n private pushOp(op: (data: T[]) => T[], name = 'op', args: unknown[] = []): this {\n this.operations.push({ args, name, op });\n this.cachedSignature = null; // Invalidate cached signature\n const opSignature = this.getOpSignature();\n this.invalidateMemo((key: string) => key.startsWith(opSignature));\n return this;\n }\n\n /** ---- Core select/where operations (no implicit state) ---- */\n\n where<K extends keyof T>(field: K, predicate: (value: T[K], record: T) => boolean): this {\n return this.pushOp((data) => data.filter((r) => predicate(r[field], r)), 'where', [field, predicate]);\n }\n\n equals<K extends keyof T>(field: K, value: T[K]): this {\n return this.pushOp((data) => data.filter((r) => r[field] === value), 'equals', [field, value]);\n }\n\n between<K extends keyof T>(field: K, lower: number, upper: number): this {\n return this.pushOp(\n (data) =>\n data.filter((r) => {\n const val = r[field] as any;\n return val >= lower && val <= upper;\n }),\n 'between',\n [field, lower, upper],\n );\n }\n\n startsWith<K extends keyof T>(field: K, prefix: string, ignoreCase = false): this {\n const lowerPrefix = ignoreCase ? prefix.toLowerCase() : prefix;\n return this.pushOp(\n (data) =>\n data.filter((r) => {\n const value = r[field];\n if (typeof value !== 'string') return false;\n const str = ignoreCase ? value.toLowerCase() : value;\n return str.startsWith(lowerPrefix);\n }),\n 'startsWith',\n [field, prefix, ignoreCase],\n );\n }\n\n filter(fn: Predicate<T>): this {\n return this.pushOp((data) => data.filter(fn), 'filter', [fn]);\n }\n\n not(fn: Predicate<T>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => !fn(item, idx, arr)), 'not', [fn]);\n }\n\n and(...fns: Array<Predicate<T>>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => fns.every((fn) => fn(item, idx, arr))), 'and', fns);\n }\n\n or(...fns: Array<Predicate<T>>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => fns.some((fn) => fn(item, idx, arr))), 'or', fns);\n }\n\n /** ---- Ordering / slicing ---- */\n\n orderBy<K extends keyof T>(field: K, direction: 'asc' | 'desc' = 'asc'): this {\n return this.pushOp(\n (data) => sortBy(data, { [field]: direction } as Partial<Record<keyof T, 'asc' | 'desc'>>) as T[],\n 'orderBy',\n [field, direction],\n );\n }\n\n limit(n: number): this {\n return this.pushOp((data) => data.slice(0, n), 'limit', [n]);\n }\n\n offset(n: number): this {\n return this.pushOp((data) => data.slice(n), 'offset', [n]);\n }\n\n page(pageNumber: number, pageSize: number): this {\n return this.pushOp(\n (data) => {\n const start = (pageNumber - 1) * pageSize;\n const end = start + pageSize;\n return data.slice(start, end);\n },\n 'page',\n [pageNumber, pageSize],\n );\n }\n\n reverse(): this {\n return this.pushOp((data) => [...data].reverse(), 'reverse', []);\n }\n\n /** ---- Aggregations ---- */\n\n async count(): Promise<number> {\n return (await this.toArray()).length;\n }\n\n async first(): Promise<T | undefined> {\n return (await this.toArray())[0];\n }\n\n async last(): Promise<T | undefined> {\n const arr = await this.toArray();\n return arr[arr.length - 1];\n }\n\n async average<K extends keyof T>(field: K): Promise<number> {\n const arr = await this.toArray();\n if (arr.length === 0) return 0;\n const total = arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n return total / arr.length;\n }\n\n async min<K extends keyof T>(field: K): Promise<T | undefined> {\n return min(await this.toArray(), (item) => item[field] as any);\n }\n\n async max<K extends keyof T>(field: K): Promise<T | undefined> {\n return max(await this.toArray(), (item) => item[field] as any);\n }\n\n async sum<K extends keyof T>(field: K): Promise<number> {\n const arr = await this.toArray();\n return arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n }\n\n /** ---- Transformations ---- */\n\n modify(callback: (record: T) => T | undefined, context?: { field: keyof T; value: unknown }): this {\n this.hasMutatingOp = true;\n this.dataVersion++;\n this.invalidateModifyCache(context);\n\n return this.pushOp((data) => data.map((item) => callback(item) ?? item), 'modify', [callback]);\n }\n\n private invalidateModifyCache(context?: { field: keyof T; value: unknown }): void {\n if (!context?.field) {\n this.invalidateMemo((key: string) => key.includes('modify'));\n return;\n }\n\n const fieldStr = String(context.field);\n this.invalidateMemo(\n (key: string) =>\n key.includes(`\"${fieldStr}\"`) && (context.value === undefined || key.includes(JSON.stringify(context.value))),\n );\n }\n\n groupBy<K extends keyof T>(field: K): this {\n return this.pushOp((data) => group(data, (item) => item[field] as any) as unknown as T[]);\n }\n\n search(query: string, tone?: number): this {\n return this.pushOp((data) => search(data as unknown as any[], query, tone) as unknown as T[]);\n }\n\n /** ---- Execution / state ---- */\n\n reset(): this {\n this.operations = [];\n this.hasMutatingOp = false;\n this.cachedSignature = null;\n this.invalidateMemo();\n return this;\n }\n\n async toArray(): Promise<T[]> {\n const key = this.getMemoKey();\n const cached = this.memoCache.get(key);\n if (cached) return cached;\n\n const promise = this.executeOperations();\n if (!this.hasMutatingOp) {\n this.memoCache.set(key, promise);\n }\n return promise;\n }\n\n private async executeOperations(): Promise<T[]> {\n const originalData = (await this.adapter.getAll(this.table)) as T[];\n let data = originalData.slice(); // Create a shallow copy\n\n for (const { op } of this.operations) {\n data = op(data);\n }\n\n return data;\n }\n\n /** ---- Query builder DSL (typed) ---- */\n\n build(conditions: Array<QueryCondition<T>>): this {\n for (const cond of conditions) {\n this.applyCondition(cond);\n }\n return this;\n }\n\n private applyCondition(cond: QueryCondition<T>): void {\n switch (cond.type) {\n case 'equals':\n this.equals(cond.field as any, cond.value as any);\n break;\n case 'between':\n this.between(cond.field as any, cond.lower as any, cond.upper as any);\n break;\n case 'startsWith':\n this.startsWith(cond.field as any, cond.value);\n break;\n case 'where':\n this.where(cond.field as any, cond.fn as any);\n break;\n case 'filter':\n this.filter(cond.fn);\n break;\n case 'orderBy':\n this.orderBy(cond.field as any, cond.value ?? 'asc');\n break;\n case 'limit':\n this.limit(cond.value);\n break;\n case 'offset':\n this.offset(cond.value);\n break;\n case 'page':\n this.page(cond.pageNumber, cond.pageSize);\n break;\n default:\n throw new Error(`Unknown query type: ${(cond as any).type}`);\n }\n }\n}\n\n/** -------------------- LocalStorageAdapter -------------------- **/\n\nexport class LocalStorageAdapter<S extends DepositDataSchema> implements DepositStorageAdapter<S> {\n private readonly dbName: string;\n private readonly version: number;\n private schema: S;\n\n constructor(dbName: string, version: number, schema: S) {\n this.dbName = dbName;\n this.version = version;\n this.schema = schema;\n }\n\n /** ---- Public API Methods ---- */\n\n bulkDelete = runSafe(async <K extends keyof S>(table: K, keys: KeyType<S, K>[]) => {\n const promises = keys.map((key) => this.delete(table, key));\n await Promise.all(promises);\n }, 'BULK_DELETE_FAILED');\n\n bulkPut = runSafe(async <K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number) => {\n const promises = values.map((v) => this.put(table, v, ttl));\n await Promise.all(promises);\n }, 'BULK_PUT_FAILED');\n\n clear = runSafe(async <K extends keyof S>(table: K) => {\n const prefix = this.getStorageKey(table);\n const keysToRemove = this.getTableKeys(prefix);\n for (const k of keysToRemove) {\n localStorage.removeItem(k);\n }\n }, 'CLEAR_FAILED');\n\n count = runSafe(async <K extends keyof S>(table: K): Promise<number> => {\n return (await this.getAll(table)).length;\n }, 'COUNT_FAILED');\n\n delete = runSafe(async <K extends keyof S>(table: K, key: KeyType<S, K>) => {\n localStorage.removeItem(this.getStorageKey(table, String(key)));\n }, 'DELETE_FAILED');\n\n get = runSafe(\n async <K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> => {\n const storageKey = this.getStorageKey(table, String(key));\n const item = localStorage.getItem(storageKey);\n if (!item) return defaultValue;\n\n try {\n const raw = JSON.parse(item);\n const now = Date.now();\n const value = unwrapWithExpiry<T>(raw, now, async () => await this.delete(table, key));\n return value ?? defaultValue;\n } catch {\n await this.delete(table, key);\n return defaultValue;\n }\n },\n 'GET_FAILED',\n );\n\n getAll = runSafe(async <K extends keyof S>(table: K): Promise<S[K]['record'][]> => {\n const prefix = this.getStorageKey(table);\n const now = Date.now();\n const keys = this.getTableKeys(prefix);\n const records: S[K]['record'][] = [];\n\n for (const k of keys) {\n const record = await this.parseStorageRecord<K>(k, table, now);\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n }, 'GET_ALL_FAILED');\n\n put = runSafe(async <K extends keyof S>(table: K, value: S[K]['record'], ttl?: number) => {\n const key = this.getRecordKey(value, table);\n if (key === undefined) throw new Error('Missing key for localStorage put');\n localStorage.setItem(this.getStorageKey(table, String(key)), JSON.stringify(wrapWithExpiry(value, ttl)));\n }, 'PUT_FAILED');\n\n /** ---- Private Helper Methods ---- */\n\n private getTableKeys(prefix: string): string[] {\n return Object.keys(localStorage).filter((k) => k.startsWith(prefix));\n }\n\n private async parseStorageRecord<K extends keyof S>(\n storageKey: string,\n table: K,\n now: number,\n ): Promise<S[K]['record'] | undefined> {\n try {\n const raw = JSON.parse(localStorage.getItem(storageKey) ?? '{}');\n return unwrapWithExpiry<S[K]['record']>(raw, now, async () => {\n const idPart = this.extractKeyFromStorageKey(storageKey);\n await this.delete(table, idPart as KeyType<S, typeof table>);\n });\n } catch (err) {\n const idPart = this.extractKeyFromStorageKey(storageKey);\n await this.delete(table, idPart as KeyType<S, typeof table>);\n throw new Error(`Corrupted JSON for key: ${storageKey}`, { cause: err });\n }\n }\n\n private extractKeyFromStorageKey(storageKey: string): string {\n const parts = storageKey.split(':');\n return parts[parts.length - 1];\n }\n\n private getRecordKey<K extends keyof S>(value: Record<string, unknown>, table: K): string | number | undefined {\n const keyField = String((this.schema[table] as DepotDataRecord<any>).key);\n return value[keyField] as string | number | undefined;\n }\n\n private getStorageKey<K extends keyof S>(table: K, key?: string | number): string {\n const prefix = `${this.dbName}:${this.version}:${String(table)}:`;\n return key === undefined || key === '' ? prefix : `${prefix}${String(key)}`;\n }\n}\n\n/** -------------------- IndexedDBAdapter -------------------- **/\n\nexport class IndexedDBAdapter<S extends DepositDataSchema> implements DepositStorageAdapter<S> {\n private db: IDBDatabase | null = null;\n private readonly dbName: string;\n private readonly schema: S;\n private readonly version: number;\n private readonly migrationFn?: DepositMigrationFn<S>;\n\n constructor(dbName: string, version: number, schema: S, migrationFn?: DepositMigrationFn<S>) {\n this.dbName = dbName;\n this.version = version;\n this.schema = schema;\n this.migrationFn = migrationFn;\n }\n\n /** ---- Public API Methods ---- */\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.version);\n\n request.onupgradeneeded = (event) => {\n const db = request.result;\n const tx = request.transaction!;\n\n this.createObjectStores(db);\n this.executeMigration(db, event, tx, reject);\n };\n\n request.onsuccess = () => {\n this.db = request.result;\n resolve();\n };\n\n request.onerror = () => reject(new Error('Failed to open IndexedDB'));\n });\n }\n\n bulkDelete = runSafe(async <K extends keyof S>(table: K, keys: KeyType<S, K>[]): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n const promises = keys.map((key) => this.requestToPromise(store.delete(key as IDBKeyRange)));\n await Promise.all(promises);\n });\n }, 'BULK_DELETE_FAILED');\n\n bulkPut = runSafe(async <K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n const promises = values.map((value) => this.requestToPromise(store.put(wrapWithExpiry(value, ttl))));\n await Promise.all(promises);\n });\n }, 'BULK_PUT_FAILED');\n\n clear = runSafe(async <K extends keyof S>(table: K): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.clear());\n });\n }, 'CLEAR_FAILED');\n\n count = runSafe(async <K extends keyof S>(table: K): Promise<number> => {\n const records = await this.getAll(table);\n return records.length;\n }, 'COUNT_FAILED');\n\n delete = runSafe(async <K extends keyof S>(table: K, key: KeyType<S, K>): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.delete(key as IDBKeyRange));\n });\n }, 'DELETE_FAILED');\n\n get = runSafe(\n async <K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> => {\n return await this.withTransaction(table, 'readonly', async (store) => {\n const result = (await this.requestToPromise(store.get(key as IDBKeyRange))) as any;\n if (!result) return defaultValue;\n\n const now = Date.now();\n const value = unwrapWithExpiry<T>(result, now, async () => await this.delete(table, key));\n return value ?? defaultValue;\n });\n },\n 'GET_FAILED',\n );\n\n getAll = runSafe(async <K extends keyof S>(table: K): Promise<S[K]['record'][]> => {\n return await this.withTransaction(table, 'readonly', async (store) => {\n const result = await this.requestToPromise(store.getAll());\n const now = Date.now();\n return result\n .map((rec) => unwrapWithExpiry<S[K]['record']>(rec, now))\n .filter((v): v is S[K]['record'] => v !== undefined);\n });\n }, 'GET_ALL_FAILED');\n\n put = runSafe(async <K extends keyof S>(table: K, value: S[K]['record'], ttl?: number): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.put(wrapWithExpiry(value, ttl)));\n });\n }, 'PUT_FAILED');\n\n /** ---- Private Helper Methods ---- */\n\n private createObjectStores(db: IDBDatabase): void {\n for (const [name, def] of Object.entries(this.schema)) {\n if (db.objectStoreNames.contains(name)) continue;\n\n const keyPath = (def as DepotDataRecord<any>).key as string;\n const store = db.createObjectStore(name, { keyPath });\n\n const indexes = (def as DepotDataRecord<any>).indexes;\n if (indexes) {\n for (const index of indexes) {\n store.createIndex(index as string, index as string);\n }\n }\n }\n }\n\n private executeMigration(\n db: IDBDatabase,\n event: IDBVersionChangeEvent,\n tx: IDBTransaction,\n reject: (error: Error) => void,\n ): void {\n if (!this.migrationFn) return;\n\n try {\n const result = this.migrationFn(db, event.oldVersion, (event as any).newVersion ?? null, tx, this.schema);\n\n // Wrap result in Promise.resolve to handle both sync and async\n Promise.resolve(result).catch((err) => {\n this.abortTransaction(tx);\n reject(new Error('Migration failed', { cause: err }));\n });\n } catch (err) {\n this.abortTransaction(tx);\n reject(new Error('Migration failed', { cause: err }));\n }\n }\n\n private abortTransaction(tx: IDBTransaction): void {\n runSafe(() => tx.abort(), 'TRANSACTION_ABORT_FAILED')();\n }\n\n private async withTransaction<T>(\n tables: keyof S | (keyof S)[],\n mode: 'readonly' | 'readwrite',\n fn: (store: IDBObjectStore) => Promise<T>,\n ): Promise<T> {\n if (!this.db) await this.connect();\n\n return new Promise<T>((resolve, reject) => {\n const tableNames = Array.isArray(tables) ? tables.map(String) : [String(tables)];\n const tx = this.db!.transaction(tableNames, mode);\n const store = tx.objectStore(tableNames[0]);\n\n let result: T | undefined;\n\n fn(store)\n .then((r) => {\n result = r;\n })\n .catch((err) => {\n this.abortTransaction(tx);\n reject(new Error(`Transaction callback failed for ${tableNames.join(', ')}`, { cause: err }));\n });\n\n tx.oncomplete = () => resolve(result as T);\n tx.onerror = () => reject(new Error(`Transaction error for ${tableNames.join(', ')}`, { cause: tx.error }));\n tx.onabort = () => reject(new Error(`Transaction aborted for ${tableNames.join(', ')}`));\n });\n }\n\n private requestToPromise<R>(req: IDBRequest<R>): Promise<R> {\n return new Promise<R>((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error ?? new Error('IndexedDB request failed'));\n });\n }\n}\n\n/**\n * Wraps a value with an expiry timestamp if TTL is provided.\n */\nfunction wrapWithExpiry<T extends Record<string, unknown>>(value: T, ttl?: number): T & { expiresAt?: number } {\n if (ttl === undefined) return value;\n return { ...value, expiresAt: Date.now() + ttl };\n}\n\n/**\n * Unwraps a value from an expiry wrapper, returns undefined if expired.\n * If expired, calls onExpire callback synchronously (fire-and-forget for async cleanup).\n */\nfunction unwrapWithExpiry<T extends Record<string, unknown>>(\n value: T & { expiresAt?: number },\n now: number,\n onExpire?: () => void | Promise<void>,\n): T | undefined {\n if (value.expiresAt === undefined) return value;\n\n if (now >= value.expiresAt) {\n // Fire-and-forget cleanup - don't block on async deletion\n if (onExpire) {\n const result = onExpire();\n // If it's a promise, catch errors to prevent unhandled rejections\n if (result && typeof (result as Promise<void>).then === 'function') {\n (result as Promise<void>).catch((err) => {\n Logit.setPrefix('Deposit');\n Logit.warn('Failed to clean up expired entry', err);\n });\n }\n }\n return undefined;\n }\n\n return value;\n}\n\n/** -------------------- runSafe -------------------- **/\n\n/**\n * Wraps a function to suppress errors and log them with consistent prefix.\n * For async functions, catches both sync and async errors.\n */\nexport function runSafe<T extends (...args: any[]) => any>(fn: T, label = 'OPERATION_FAILED'): T {\n return ((...args: any[]) => {\n try {\n const result = fn(...args);\n\n // Handle async functions\n if (result && typeof result.then === 'function') {\n return result.catch((err: Error) => {\n Logit.setPrefix('Deposit');\n Logit.error(label, err);\n return undefined;\n });\n }\n\n return result;\n } catch (err) {\n Logit.setPrefix('Deposit');\n Logit.error(label, err);\n return undefined;\n }\n }) as unknown as T;\n}\n"],"names":["Deposit","adapterOrConfig","type","dbName","version","schema","migrationFn","LocalStorageAdapter","IndexedDBAdapter","table","keys","values","ttl","key","defaultValue","value","QueryBuilder","tables","fn","storeMap","proxy","err","promises","target","prop","stores","commits","patches","operations","patch","adapter","o","predicate","keysToDelete","op","name","args","opSignature","field","data","r","lower","upper","val","prefix","ignoreCase","lowerPrefix","item","idx","arr","fns","direction","sortBy","n","pageNumber","pageSize","start","end","acc","min","max","callback","context","fieldStr","group","query","tone","search","cached","promise","conditions","cond","runSafe","v","keysToRemove","k","storageKey","raw","now","unwrapWithExpiry","records","record","wrapWithExpiry","idPart","parts","keyField","resolve","reject","request","event","db","tx","store","result","rec","def","keyPath","indexes","index","mode","tableNames","req","onExpire","Logit","label"],"mappings":"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"}
1
+ {"version":3,"file":"deposit.js","sources":["../src/deposit.ts"],"sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: - */\nimport { Logit } from '@vielzeug/logit';\nimport { arrange, group, max, min, type Predicate, search } from '@vielzeug/toolkit';\n\nexport type DepotDataRecord<T, K extends keyof T = keyof T> = {\n indexes?: K[];\n key: K;\n record: T;\n};\n\ntype DataSchemaDef = Record<string, Record<string, unknown>>;\n\nexport type DepositDataSchema<S = DataSchemaDef> = {\n [K in keyof S]: DepotDataRecord<S[K], keyof S[K]>;\n};\n\nexport type DepositMigrationFn<S extends DepositDataSchema> = (\n db: IDBDatabase,\n oldVersion: number,\n newVersion: number | null,\n transaction: IDBTransaction,\n schema: S,\n) => void | Promise<void>;\n\nexport type DepositStorageAdapter<S extends DepositDataSchema> = {\n bulkDelete<K extends keyof S>(table: K, keys: KeyType<S, K>[]): Promise<void>;\n bulkPut<K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number): Promise<void>;\n clear<K extends keyof S>(table: K): Promise<void>;\n count<K extends keyof S>(table: K): Promise<number>;\n delete<K extends keyof S>(table: K, key: KeyType<S, K>): Promise<void>;\n get<K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined>;\n getAll<K extends keyof S>(table: K): Promise<S[K]['record'][]>;\n put<K extends keyof S>(table: K, value: S[K]['record'], ttl?: number): Promise<void>;\n connect?(): Promise<void>;\n};\n\ntype QueryCondition<T, K extends keyof T = keyof T> =\n | { type: 'equals'; field: K; value: T[K] }\n | { type: 'between'; field: K; lower: T[K]; upper: T[K] }\n | { type: 'startsWith'; field: Extract<K, string & keyof T>; value: string }\n | { type: 'where'; field: K; fn: (value: T[K], record: T) => boolean }\n | { type: 'filter'; fn: (record: T) => boolean }\n | { type: 'orderBy'; field: K; value?: 'asc' | 'desc' }\n | { type: 'limit'; value: number }\n | { type: 'offset'; value: number }\n | { type: 'page'; pageNumber: number; pageSize: number };\n\ntype PatchOperation<T, K = any> =\n | { type: 'put'; value: T; ttl?: number }\n | { type: 'delete'; key: K }\n | { type: 'clear' };\n\n/**\n * Extracts the key type for a given table in the schema.\n * Returns the type of the record's key field.\n */\ntype KeyType<S extends DepositDataSchema, K extends keyof S> = S[K]['record'][S[K]['key']];\n\ntype AdapterConfig<S extends DepositDataSchema> = {\n type: 'localStorage' | 'indexedDB';\n dbName: string;\n version: number;\n schema: S;\n migrationFn?: DepositMigrationFn<S>;\n};\n\nexport class Deposit<S extends DepositDataSchema> {\n private readonly adapter: DepositStorageAdapter<S>;\n\n constructor(adapterOrConfig: DepositStorageAdapter<S> | AdapterConfig<S>) {\n this.adapter = this.createAdapter(adapterOrConfig);\n }\n\n private createAdapter(adapterOrConfig: DepositStorageAdapter<S> | AdapterConfig<S>): DepositStorageAdapter<S> {\n if (!('type' in adapterOrConfig)) {\n return adapterOrConfig;\n }\n\n const { type, dbName, version, schema, migrationFn } = adapterOrConfig;\n\n switch (type) {\n case 'localStorage':\n return new LocalStorageAdapter(dbName, version, schema);\n case 'indexedDB':\n return new IndexedDBAdapter(dbName, version, schema, migrationFn);\n default:\n throw new Error(`Unknown adapter type: ${type}`);\n }\n }\n\n bulkDelete<K extends keyof S>(table: K, keys: KeyType<S, K>[]) {\n return this.adapter.bulkDelete(table, keys);\n }\n\n bulkPut<K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number) {\n return this.adapter.bulkPut(table, values, ttl);\n }\n\n clear<K extends keyof S>(table: K) {\n return this.adapter.clear(table);\n }\n\n count<K extends keyof S>(table: K): Promise<number> {\n return this.adapter.count(table);\n }\n\n delete<K extends keyof S>(table: K, key: KeyType<S, K>) {\n return this.adapter.delete(table, key);\n }\n\n get<K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> {\n return this.adapter.get(table, key, defaultValue);\n }\n\n getAll<K extends keyof S>(table: K): Promise<S[K]['record'][]> {\n return this.adapter.getAll(table);\n }\n\n put<K extends keyof S>(table: K, value: S[K]['record'], ttl?: number) {\n return this.adapter.put(table, value, ttl);\n }\n\n query<K extends keyof S>(table: K): QueryBuilder<S[K]['record']> {\n return new QueryBuilder<S[K]['record']>(this.adapter, String(table));\n }\n\n async transaction<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(\n tables: K[],\n fn: (stores: T) => Promise<void>,\n ttl?: number,\n ) {\n const storeMap = await this.loadStores<K, T>(tables);\n const proxy = this.createStoreProxy(storeMap);\n\n try {\n await fn(proxy as T);\n await this.commitStores(tables, proxy, ttl);\n } catch (err) {\n throw new Error(`Transaction failed for tables: ${tables.map(String).join(', ')}`, { cause: err });\n }\n }\n\n private async loadStores<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(tables: K[]): Promise<T> {\n const storeMap = {} as T;\n const promises = tables.map(async (table) => {\n (storeMap as any)[table] = await this.getAll(table);\n });\n await Promise.all(promises);\n return storeMap;\n }\n\n private createStoreProxy<T extends Record<string, any>>(storeMap: T): T {\n return new Proxy(storeMap, {\n get(target, prop) {\n return target[prop as keyof T];\n },\n set(target, prop, value) {\n target[prop as keyof T] = value;\n return true;\n },\n }) as T;\n }\n\n private async commitStores<K extends keyof S, T extends { [P in K]: S[P]['record'][] }>(\n tables: K[],\n stores: T,\n ttl?: number,\n ): Promise<void> {\n const commits = tables.map(async (table) => {\n await this.clear(table);\n await this.bulkPut(table, stores[table], ttl);\n });\n await Promise.all(commits);\n }\n\n async patch<K extends keyof S>(table: K, patches: PatchOperation<S[K]['record'], KeyType<S, K>>[]): Promise<void> {\n const operations = patches.map((patch) => this.applyPatch(table, patch));\n await Promise.all(operations);\n }\n\n private async applyPatch<K extends keyof S>(\n table: K,\n patch: PatchOperation<S[K]['record'], KeyType<S, K>>,\n ): Promise<void> {\n switch (patch.type) {\n case 'put':\n return this.put(table, patch.value, patch.ttl);\n case 'delete':\n return this.delete(table, patch.key);\n case 'clear':\n return this.clear(table);\n }\n }\n}\n\n/** -------------------- QueryBuilder -------------------- **/\n\nexport class QueryBuilder<T extends Record<string, unknown>> {\n private operations: Array<{ op: (data: T[]) => T[]; name: string; args: unknown[] }> = [];\n private readonly adapter: DepositStorageAdapter<any>;\n private readonly table: string;\n private memoCache: Map<string, Promise<T[]>> = new Map();\n private dataVersion = 0;\n private hasMutatingOp = false;\n private cachedSignature: string | null = null;\n\n constructor(adapter: DepositStorageAdapter<any>, table: string) {\n this.adapter = adapter;\n this.table = table;\n }\n\n private getOpSignature(): string {\n if (this.cachedSignature === null) {\n this.cachedSignature = this.operations.map((o) => `${o.name}:${JSON.stringify(o.args)}`).join('|');\n }\n return this.cachedSignature;\n }\n\n private getMemoKey(): string {\n return `${this.getOpSignature()}|v${this.dataVersion}`;\n }\n\n private invalidateMemo(predicate?: (key: string) => boolean): void {\n if (!predicate) {\n this.memoCache.clear();\n return;\n }\n const keysToDelete = Array.from(this.memoCache.keys()).filter(predicate);\n for (const key of keysToDelete) {\n this.memoCache.delete(key);\n }\n }\n\n private pushOp(op: (data: T[]) => T[], name = 'op', args: unknown[] = []): this {\n this.operations.push({ args, name, op });\n this.cachedSignature = null; // Invalidate cached signature\n const opSignature = this.getOpSignature();\n this.invalidateMemo((key: string) => key.startsWith(opSignature));\n return this;\n }\n\n /** ---- Core select/where operations (no implicit state) ---- */\n\n where<K extends keyof T>(field: K, predicate: (value: T[K], record: T) => boolean): this {\n return this.pushOp((data) => data.filter((r) => predicate(r[field], r)), 'where', [field, predicate]);\n }\n\n equals<K extends keyof T>(field: K, value: T[K]): this {\n return this.pushOp((data) => data.filter((r) => r[field] === value), 'equals', [field, value]);\n }\n\n between<K extends keyof T>(field: K, lower: number, upper: number): this {\n return this.pushOp(\n (data) =>\n data.filter((r) => {\n const val = r[field] as any;\n return val >= lower && val <= upper;\n }),\n 'between',\n [field, lower, upper],\n );\n }\n\n startsWith<K extends keyof T>(field: K, prefix: string, ignoreCase = false): this {\n const lowerPrefix = ignoreCase ? prefix.toLowerCase() : prefix;\n return this.pushOp(\n (data) =>\n data.filter((r) => {\n const value = r[field];\n if (typeof value !== 'string') return false;\n const str = ignoreCase ? value.toLowerCase() : value;\n return str.startsWith(lowerPrefix);\n }),\n 'startsWith',\n [field, prefix, ignoreCase],\n );\n }\n\n filter(fn: Predicate<T>): this {\n return this.pushOp((data) => data.filter(fn), 'filter', [fn]);\n }\n\n not(fn: Predicate<T>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => !fn(item, idx, arr)), 'not', [fn]);\n }\n\n and(...fns: Array<Predicate<T>>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => fns.every((fn) => fn(item, idx, arr))), 'and', fns);\n }\n\n or(...fns: Array<Predicate<T>>): this {\n return this.pushOp((data) => data.filter((item, idx, arr) => fns.some((fn) => fn(item, idx, arr))), 'or', fns);\n }\n\n /** ---- Ordering / slicing ---- */\n\n orderBy<K extends keyof T>(field: K, direction: 'asc' | 'desc' = 'asc'): this {\n return this.pushOp(\n (data) => arrange(data, { [field]: direction } as Partial<Record<keyof T, 'asc' | 'desc'>>) as T[],\n 'orderBy',\n [field, direction],\n );\n }\n\n limit(n: number): this {\n return this.pushOp((data) => data.slice(0, n), 'limit', [n]);\n }\n\n offset(n: number): this {\n return this.pushOp((data) => data.slice(n), 'offset', [n]);\n }\n\n page(pageNumber: number, pageSize: number): this {\n return this.pushOp(\n (data) => {\n const start = (pageNumber - 1) * pageSize;\n const end = start + pageSize;\n return data.slice(start, end);\n },\n 'page',\n [pageNumber, pageSize],\n );\n }\n\n reverse(): this {\n return this.pushOp((data) => [...data].reverse(), 'reverse', []);\n }\n\n /** ---- Aggregations ---- */\n\n async count(): Promise<number> {\n return (await this.toArray()).length;\n }\n\n async first(): Promise<T | undefined> {\n return (await this.toArray())[0];\n }\n\n async last(): Promise<T | undefined> {\n const arr = await this.toArray();\n return arr[arr.length - 1];\n }\n\n async average<K extends keyof T>(field: K): Promise<number> {\n const arr = await this.toArray();\n if (arr.length === 0) return 0;\n const total = arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n return total / arr.length;\n }\n\n async min<K extends keyof T>(field: K): Promise<T | undefined> {\n return min(await this.toArray(), (item) => item[field] as any);\n }\n\n async max<K extends keyof T>(field: K): Promise<T | undefined> {\n return max(await this.toArray(), (item) => item[field] as any);\n }\n\n async sum<K extends keyof T>(field: K): Promise<number> {\n const arr = await this.toArray();\n return arr.reduce((acc, item) => acc + (Number(item[field]) || 0), 0);\n }\n\n /** ---- Transformations ---- */\n\n modify(callback: (record: T) => T | undefined, context?: { field: keyof T; value: unknown }): this {\n this.hasMutatingOp = true;\n this.dataVersion++;\n this.invalidateModifyCache(context);\n\n return this.pushOp((data) => data.map((item) => callback(item) ?? item), 'modify', [callback]);\n }\n\n private invalidateModifyCache(context?: { field: keyof T; value: unknown }): void {\n if (!context?.field) {\n this.invalidateMemo((key: string) => key.includes('modify'));\n return;\n }\n\n const fieldStr = String(context.field);\n this.invalidateMemo(\n (key: string) =>\n key.includes(`\"${fieldStr}\"`) && (context.value === undefined || key.includes(JSON.stringify(context.value))),\n );\n }\n\n groupBy<K extends keyof T>(field: K): this {\n return this.pushOp((data) => group(data, (item) => item[field] as any) as unknown as T[]);\n }\n\n search(query: string, tone?: number): this {\n return this.pushOp((data) => search(data as unknown as any[], query, tone) as unknown as T[]);\n }\n\n /** ---- Execution / state ---- */\n\n reset(): this {\n this.operations = [];\n this.hasMutatingOp = false;\n this.cachedSignature = null;\n this.invalidateMemo();\n return this;\n }\n\n async toArray(): Promise<T[]> {\n const key = this.getMemoKey();\n const cached = this.memoCache.get(key);\n if (cached) return cached;\n\n const promise = this.executeOperations();\n if (!this.hasMutatingOp) {\n this.memoCache.set(key, promise);\n }\n return promise;\n }\n\n private async executeOperations(): Promise<T[]> {\n const originalData = (await this.adapter.getAll(this.table)) as T[];\n let data = originalData.slice(); // Create a shallow copy\n\n for (const { op } of this.operations) {\n data = op(data);\n }\n\n return data;\n }\n\n /** ---- Query builder DSL (typed) ---- */\n\n build(conditions: Array<QueryCondition<T>>): this {\n for (const cond of conditions) {\n this.applyCondition(cond);\n }\n return this;\n }\n\n private applyCondition(cond: QueryCondition<T>): void {\n switch (cond.type) {\n case 'equals':\n this.equals(cond.field as any, cond.value as any);\n break;\n case 'between':\n this.between(cond.field as any, cond.lower as any, cond.upper as any);\n break;\n case 'startsWith':\n this.startsWith(cond.field as any, cond.value);\n break;\n case 'where':\n this.where(cond.field as any, cond.fn as any);\n break;\n case 'filter':\n this.filter(cond.fn);\n break;\n case 'orderBy':\n this.orderBy(cond.field as any, cond.value ?? 'asc');\n break;\n case 'limit':\n this.limit(cond.value);\n break;\n case 'offset':\n this.offset(cond.value);\n break;\n case 'page':\n this.page(cond.pageNumber, cond.pageSize);\n break;\n default:\n throw new Error(`Unknown query type: ${(cond as any).type}`);\n }\n }\n}\n\n/** -------------------- LocalStorageAdapter -------------------- **/\n\nexport class LocalStorageAdapter<S extends DepositDataSchema> implements DepositStorageAdapter<S> {\n private readonly dbName: string;\n private readonly version: number;\n private schema: S;\n\n constructor(dbName: string, version: number, schema: S) {\n this.dbName = dbName;\n this.version = version;\n this.schema = schema;\n }\n\n /** ---- Public API Methods ---- */\n\n bulkDelete = runSafe(async <K extends keyof S>(table: K, keys: KeyType<S, K>[]) => {\n const promises = keys.map((key) => this.delete(table, key));\n await Promise.all(promises);\n }, 'BULK_DELETE_FAILED');\n\n bulkPut = runSafe(async <K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number) => {\n const promises = values.map((v) => this.put(table, v, ttl));\n await Promise.all(promises);\n }, 'BULK_PUT_FAILED');\n\n clear = runSafe(async <K extends keyof S>(table: K) => {\n const prefix = this.getStorageKey(table);\n const keysToRemove = this.getTableKeys(prefix);\n for (const k of keysToRemove) {\n localStorage.removeItem(k);\n }\n }, 'CLEAR_FAILED');\n\n count = runSafe(async <K extends keyof S>(table: K): Promise<number> => {\n return (await this.getAll(table)).length;\n }, 'COUNT_FAILED');\n\n delete = runSafe(async <K extends keyof S>(table: K, key: KeyType<S, K>) => {\n localStorage.removeItem(this.getStorageKey(table, String(key)));\n }, 'DELETE_FAILED');\n\n get = runSafe(\n async <K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> => {\n const storageKey = this.getStorageKey(table, String(key));\n const item = localStorage.getItem(storageKey);\n if (!item) return defaultValue;\n\n try {\n const raw = JSON.parse(item);\n const now = Date.now();\n const value = unwrapWithExpiry<T>(raw, now, async () => await this.delete(table, key));\n return value ?? defaultValue;\n } catch {\n await this.delete(table, key);\n return defaultValue;\n }\n },\n 'GET_FAILED',\n );\n\n getAll = runSafe(async <K extends keyof S>(table: K): Promise<S[K]['record'][]> => {\n const prefix = this.getStorageKey(table);\n const now = Date.now();\n const keys = this.getTableKeys(prefix);\n const records: S[K]['record'][] = [];\n\n for (const k of keys) {\n const record = await this.parseStorageRecord<K>(k, table, now);\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n }, 'GET_ALL_FAILED');\n\n put = runSafe(async <K extends keyof S>(table: K, value: S[K]['record'], ttl?: number) => {\n const key = this.getRecordKey(value, table);\n if (key === undefined) throw new Error('Missing key for localStorage put');\n localStorage.setItem(this.getStorageKey(table, String(key)), JSON.stringify(wrapWithExpiry(value, ttl)));\n }, 'PUT_FAILED');\n\n /** ---- Private Helper Methods ---- */\n\n private getTableKeys(prefix: string): string[] {\n return Object.keys(localStorage).filter((k) => k.startsWith(prefix));\n }\n\n private async parseStorageRecord<K extends keyof S>(\n storageKey: string,\n table: K,\n now: number,\n ): Promise<S[K]['record'] | undefined> {\n try {\n const raw = JSON.parse(localStorage.getItem(storageKey) ?? '{}');\n return unwrapWithExpiry<S[K]['record']>(raw, now, async () => {\n const idPart = this.extractKeyFromStorageKey(storageKey);\n await this.delete(table, idPart as KeyType<S, typeof table>);\n });\n } catch (err) {\n const idPart = this.extractKeyFromStorageKey(storageKey);\n await this.delete(table, idPart as KeyType<S, typeof table>);\n throw new Error(`Corrupted JSON for key: ${storageKey}`, { cause: err });\n }\n }\n\n private extractKeyFromStorageKey(storageKey: string): string {\n const parts = storageKey.split(':');\n return parts[parts.length - 1];\n }\n\n private getRecordKey<K extends keyof S>(value: Record<string, unknown>, table: K): string | number | undefined {\n const keyField = String((this.schema[table] as DepotDataRecord<any>).key);\n return value[keyField] as string | number | undefined;\n }\n\n private getStorageKey<K extends keyof S>(table: K, key?: string | number): string {\n const prefix = `${this.dbName}:${this.version}:${String(table)}:`;\n return key === undefined || key === '' ? prefix : `${prefix}${String(key)}`;\n }\n}\n\n/** -------------------- IndexedDBAdapter -------------------- **/\n\nexport class IndexedDBAdapter<S extends DepositDataSchema> implements DepositStorageAdapter<S> {\n private db: IDBDatabase | null = null;\n private readonly dbName: string;\n private readonly schema: S;\n private readonly version: number;\n private readonly migrationFn?: DepositMigrationFn<S>;\n\n constructor(dbName: string, version: number, schema: S, migrationFn?: DepositMigrationFn<S>) {\n this.dbName = dbName;\n this.version = version;\n this.schema = schema;\n this.migrationFn = migrationFn;\n }\n\n /** ---- Public API Methods ---- */\n\n async connect(): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(this.dbName, this.version);\n\n request.onupgradeneeded = (event) => {\n const db = request.result;\n const tx = request.transaction!;\n\n this.createObjectStores(db);\n this.executeMigration(db, event, tx, reject);\n };\n\n request.onsuccess = () => {\n this.db = request.result;\n resolve();\n };\n\n request.onerror = () => reject(new Error('Failed to open IndexedDB'));\n });\n }\n\n bulkDelete = runSafe(async <K extends keyof S>(table: K, keys: KeyType<S, K>[]): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n const promises = keys.map((key) => this.requestToPromise(store.delete(key as IDBKeyRange)));\n await Promise.all(promises);\n });\n }, 'BULK_DELETE_FAILED');\n\n bulkPut = runSafe(async <K extends keyof S>(table: K, values: S[K]['record'][], ttl?: number): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n const promises = values.map((value) => this.requestToPromise(store.put(wrapWithExpiry(value, ttl))));\n await Promise.all(promises);\n });\n }, 'BULK_PUT_FAILED');\n\n clear = runSafe(async <K extends keyof S>(table: K): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.clear());\n });\n }, 'CLEAR_FAILED');\n\n count = runSafe(async <K extends keyof S>(table: K): Promise<number> => {\n const records = await this.getAll(table);\n return records.length;\n }, 'COUNT_FAILED');\n\n delete = runSafe(async <K extends keyof S>(table: K, key: KeyType<S, K>): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.delete(key as IDBKeyRange));\n });\n }, 'DELETE_FAILED');\n\n get = runSafe(\n async <K extends keyof S, T extends S[K]['record']>(\n table: K,\n key: KeyType<S, K>,\n defaultValue?: T,\n ): Promise<T | undefined> => {\n return await this.withTransaction(table, 'readonly', async (store) => {\n const result = (await this.requestToPromise(store.get(key as IDBKeyRange))) as any;\n if (!result) return defaultValue;\n\n const now = Date.now();\n const value = unwrapWithExpiry<T>(result, now, async () => await this.delete(table, key));\n return value ?? defaultValue;\n });\n },\n 'GET_FAILED',\n );\n\n getAll = runSafe(async <K extends keyof S>(table: K): Promise<S[K]['record'][]> => {\n return await this.withTransaction(table, 'readonly', async (store) => {\n const result = await this.requestToPromise(store.getAll());\n const now = Date.now();\n return result\n .map((rec) => unwrapWithExpiry<S[K]['record']>(rec, now))\n .filter((v): v is S[K]['record'] => v !== undefined);\n });\n }, 'GET_ALL_FAILED');\n\n put = runSafe(async <K extends keyof S>(table: K, value: S[K]['record'], ttl?: number): Promise<void> => {\n await this.withTransaction(table, 'readwrite', async (store) => {\n await this.requestToPromise(store.put(wrapWithExpiry(value, ttl)));\n });\n }, 'PUT_FAILED');\n\n /** ---- Private Helper Methods ---- */\n\n private createObjectStores(db: IDBDatabase): void {\n for (const [name, def] of Object.entries(this.schema)) {\n if (db.objectStoreNames.contains(name)) continue;\n\n const keyPath = (def as DepotDataRecord<any>).key as string;\n const store = db.createObjectStore(name, { keyPath });\n\n const indexes = (def as DepotDataRecord<any>).indexes;\n if (indexes) {\n for (const index of indexes) {\n store.createIndex(index as string, index as string);\n }\n }\n }\n }\n\n private executeMigration(\n db: IDBDatabase,\n event: IDBVersionChangeEvent,\n tx: IDBTransaction,\n reject: (error: Error) => void,\n ): void {\n if (!this.migrationFn) return;\n\n try {\n const result = this.migrationFn(db, event.oldVersion, (event as any).newVersion ?? null, tx, this.schema);\n\n // Wrap result in Promise.resolve to handle both sync and async\n Promise.resolve(result).catch((err) => {\n this.abortTransaction(tx);\n reject(new Error('Migration failed', { cause: err }));\n });\n } catch (err) {\n this.abortTransaction(tx);\n reject(new Error('Migration failed', { cause: err }));\n }\n }\n\n private abortTransaction(tx: IDBTransaction): void {\n runSafe(() => tx.abort(), 'TRANSACTION_ABORT_FAILED')();\n }\n\n private async withTransaction<T>(\n tables: keyof S | (keyof S)[],\n mode: 'readonly' | 'readwrite',\n fn: (store: IDBObjectStore) => Promise<T>,\n ): Promise<T> {\n if (!this.db) await this.connect();\n\n return new Promise<T>((resolve, reject) => {\n const tableNames = Array.isArray(tables) ? tables.map(String) : [String(tables)];\n const tx = this.db!.transaction(tableNames, mode);\n const store = tx.objectStore(tableNames[0]);\n\n let result: T | undefined;\n\n fn(store)\n .then((r) => {\n result = r;\n })\n .catch((err) => {\n this.abortTransaction(tx);\n reject(new Error(`Transaction callback failed for ${tableNames.join(', ')}`, { cause: err }));\n });\n\n tx.oncomplete = () => resolve(result as T);\n tx.onerror = () => reject(new Error(`Transaction error for ${tableNames.join(', ')}`, { cause: tx.error }));\n tx.onabort = () => reject(new Error(`Transaction aborted for ${tableNames.join(', ')}`));\n });\n }\n\n private requestToPromise<R>(req: IDBRequest<R>): Promise<R> {\n return new Promise<R>((resolve, reject) => {\n req.onsuccess = () => resolve(req.result);\n req.onerror = () => reject(req.error ?? new Error('IndexedDB request failed'));\n });\n }\n}\n\n/**\n * Wraps a value with an expiry timestamp if TTL is provided.\n */\nfunction wrapWithExpiry<T extends Record<string, unknown>>(value: T, ttl?: number): T & { expiresAt?: number } {\n if (ttl === undefined) return value;\n return { ...value, expiresAt: Date.now() + ttl };\n}\n\n/**\n * Unwraps a value from an expiry wrapper, returns undefined if expired.\n * If expired, calls onExpire callback synchronously (fire-and-forget for async cleanup).\n */\nfunction unwrapWithExpiry<T extends Record<string, unknown>>(\n value: T & { expiresAt?: number },\n now: number,\n onExpire?: () => void | Promise<void>,\n): T | undefined {\n if (value.expiresAt === undefined) return value;\n\n if (now >= value.expiresAt) {\n // Fire-and-forget cleanup - don't block on async deletion\n if (onExpire) {\n const result = onExpire();\n // If it's a promise, catch errors to prevent unhandled rejections\n if (result && typeof (result as Promise<void>).then === 'function') {\n (result as Promise<void>).catch((err) => {\n Logit.setPrefix('Deposit');\n Logit.warn('Failed to clean up expired entry', err);\n });\n }\n }\n return undefined;\n }\n\n return value;\n}\n\n/** -------------------- runSafe -------------------- **/\n\n/**\n * Wraps a function to suppress errors and log them with consistent prefix.\n * For async functions, catches both sync and async errors.\n */\nexport function runSafe<T extends (...args: any[]) => any>(fn: T, label = 'OPERATION_FAILED'): T {\n return ((...args: any[]) => {\n try {\n const result = fn(...args);\n\n // Handle async functions\n if (result && typeof result.then === 'function') {\n return result.catch((err: Error) => {\n Logit.setPrefix('Deposit');\n Logit.error(label, err);\n return undefined;\n });\n }\n\n return result;\n } catch (err) {\n Logit.setPrefix('Deposit');\n Logit.error(label, err);\n return undefined;\n }\n }) as unknown as T;\n}\n"],"names":["Deposit","adapterOrConfig","type","dbName","version","schema","migrationFn","LocalStorageAdapter","IndexedDBAdapter","table","keys","values","ttl","key","defaultValue","value","QueryBuilder","tables","fn","storeMap","proxy","err","promises","target","prop","stores","commits","patches","operations","patch","adapter","o","predicate","keysToDelete","op","name","args","opSignature","field","data","r","lower","upper","val","prefix","ignoreCase","lowerPrefix","item","idx","arr","fns","direction","arrange","n","pageNumber","pageSize","start","end","acc","min","max","callback","context","fieldStr","group","query","tone","search","cached","promise","conditions","cond","runSafe","v","keysToRemove","k","storageKey","raw","now","unwrapWithExpiry","records","record","wrapWithExpiry","idPart","parts","keyField","resolve","reject","request","event","db","tx","store","result","rec","def","keyPath","indexes","index","mode","tableNames","req","onExpire","Logit","label"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("../function/compareBy.cjs"),t=(e,r)=>[...e].sort(o.compareBy(r));exports.arrange=t;
2
+ //# sourceMappingURL=arrange.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrange.cjs","sources":["../../../../../toolkit/dist/array/arrange.js"],"sourcesContent":["import { compareBy as t } from \"../function/compareBy.js\";\nconst a = (r, o) => [...r].sort(t(o));\nexport {\n a as arrange\n};\n//# sourceMappingURL=arrange.js.map\n"],"names":["a","r","o","t"],"mappings":"6HACMA,EAAI,CAACC,EAAGC,IAAM,CAAC,GAAGD,CAAC,EAAE,KAAKE,EAAAA,UAAED,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { compareBy as o } from "../function/compareBy.js";
2
+ const t = (r, a) => [...r].sort(o(a));
3
+ export {
4
+ t as arrange
5
+ };
6
+ //# sourceMappingURL=arrange.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrange.js","sources":["../../../../../toolkit/dist/array/arrange.js"],"sourcesContent":["import { compareBy as t } from \"../function/compareBy.js\";\nconst a = (r, o) => [...r].sort(t(o));\nexport {\n a as arrange\n};\n//# sourceMappingURL=arrange.js.map\n"],"names":["a","o","t"],"mappings":";AACK,MAACA,IAAI,CAAC,GAAGC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAKC,EAAED,CAAC,CAAC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vielzeug/deposit",
3
- "version": "1.0.4",
3
+ "version": "1.0.5",
4
4
  "type": "module",
5
5
  "files": [
6
6
  "dist"
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("../function/compareBy.cjs"),t=(e,o)=>[...e].sort(r.compareBy(o));exports.sortBy=t;
2
- //# sourceMappingURL=sortBy.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sortBy.cjs","sources":["../../../../../toolkit/dist/array/sortBy.js"],"sourcesContent":["import { compareBy as t } from \"../function/compareBy.js\";\nconst m = (r, o) => [...r].sort(t(o));\nexport {\n m as sortBy\n};\n//# sourceMappingURL=sortBy.js.map\n"],"names":["m","r","t"],"mappings":"6HACMA,EAAI,CAACC,EAAG,IAAM,CAAC,GAAGA,CAAC,EAAE,KAAKC,EAAAA,UAAE,CAAC,CAAC"}
@@ -1,6 +0,0 @@
1
- import { compareBy as s } from "../function/compareBy.js";
2
- const m = (o, r) => [...o].sort(s(r));
3
- export {
4
- m as sortBy
5
- };
6
- //# sourceMappingURL=sortBy.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sortBy.js","sources":["../../../../../toolkit/dist/array/sortBy.js"],"sourcesContent":["import { compareBy as t } from \"../function/compareBy.js\";\nconst m = (r, o) => [...r].sort(t(o));\nexport {\n m as sortBy\n};\n//# sourceMappingURL=sortBy.js.map\n"],"names":["r","o","t"],"mappings":";AACK,MAAC,IAAI,CAACA,GAAGC,MAAM,CAAC,GAAGD,CAAC,EAAE,KAAKE,EAAED,CAAC,CAAC;"}