tiny-idb 1.3.0 → 1.4.0

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/README.md CHANGED
@@ -77,12 +77,31 @@ npm install tiny-idb
77
77
  | `values()` | Returns an array of all values. |
78
78
  | `entries()` | Returns an array of `[key, value]` pairs. |
79
79
  | `count()` | Returns the total number of entries. |
80
+ | `raw(cb, mode?)` | Provides direct access to the `IDBObjectStore`. |
80
81
  | `update(key, fn)` | Performs an **atomic** read-modify-write. |
81
82
  | `push(key, value)` | **Atomically** appends to an array. |
82
83
  | `merge(key, patch)` | **Atomically** shallow-merges an object. |
83
84
 
84
85
  ## Example Use Cases
85
86
 
87
+ ### Direct IndexedDB Access (Cursors & Search)
88
+ For large datasets where loading everything via `entries()` is inefficient, use `raw()` to perform cursor-based searches or filtered queries.
89
+ ```javascript
90
+ const fruits = await tinyIDB.raw(store => {
91
+ return new Promise((resolve) => {
92
+ const matches = [];
93
+ const request = store.openCursor();
94
+ request.onsuccess = () => {
95
+ const cursor = request.result;
96
+ if (cursor) {
97
+ if (cursor.value.type === 'fruit') matches.push(cursor.value);
98
+ cursor.continue();
99
+ } else resolve(matches);
100
+ };
101
+ });
102
+ });
103
+ ```
104
+
86
105
  ### Iterating over Data
87
106
  Use `entries()` to easily process all stored key-value pairs.
88
107
  ```javascript
package/index.d.ts CHANGED
@@ -54,6 +54,14 @@ export interface TinyIDBInstance {
54
54
  */
55
55
  count(): Promise<number>;
56
56
 
57
+ /**
58
+ * Direct access to the IDBObjectStore within a transaction.
59
+ * This provides an "escape hatch" to use native IndexedDB features like cursors, ranges, and search.
60
+ * @param cb A callback that receives the IDBObjectStore.
61
+ * @param mode The transaction mode ('readonly' or 'readwrite').
62
+ */
63
+ raw<T = any>(cb: (store: IDBObjectStore) => T | Promise<T>, mode?: IDBTransactionMode): Promise<T>;
64
+
57
65
  /**
58
66
  * Performs an atomic read-modify-write operation within a single transaction.
59
67
  * Note: The function 'fn' must be synchronous or microtask-only (no await on fetch/setTimeout)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tiny-idb",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "An extremely fast, super simple, and dependency-free IndexedDB wrapper. A drop-in replacement for localStorage with reliability and durability.",
5
5
  "main": "tiny-idb.js",
6
6
  "module": "tiny-idb.js",
package/tiny-idb.js CHANGED
@@ -52,6 +52,7 @@ const getAPI = (dbName = 'tiny-idb', storeName = undefined) => {
52
52
  return k.map((key, i) => [key, v[i]]);
53
53
  }),
54
54
  count: () => tx(RO, s => prom(s.count())),
55
+ raw: (cb, mode = RO) => tx(mode, cb),
55
56
  update,
56
57
  push: (key, val) => update(key, (c = []) => [...(Array.isArray(c) ? c : []), val]),
57
58
  merge: (key, obj) => update(key, (c = {}) => ({ ...(c && typeof c === 'object' ? c : {}), ...obj }))
package/tiny-idb.min.js CHANGED
@@ -1,2 +1,2 @@
1
1
  /** tiny-idb - MIT © Jelodar */
2
- const e=new Map,t=e=>new Promise((t,r)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>r(e.error)}),r="readonly",o="readwrite",n=(s="tiny-idb",a=void 0)=>{const c=s+"\0"+(a=a||s);if(e.has(c))return e.get(c);let l;const i=async(e,t)=>{const r=await(l||(l=new Promise((e,t)=>{const r=indexedDB.open(s,1);r.onupgradeneeded=()=>r.result.createObjectStore(a),r.onsuccess=()=>{const t=r.result;t.onversionchange=()=>{t.close(),l=null},e(t)},r.onerror=()=>{l=null,t(r.error)}})));return new Promise(async(o,n)=>{const s=r.transaction(a,e);s.onabort=s.onerror=()=>n(s.error||new DOMException("Aborted"));try{const e=await t(s.objectStore(a));s.oncomplete=()=>o(e)}catch(e){try{s.abort()}catch{}n(e)}})},u=(e,r)=>i(o,async o=>t(o.put(await r(await t(o.get(e))),e))),y={open:n,set:(e,r)=>i(o,o=>t(o.put(r,e))),get:e=>i(r,r=>t(r.get(e))),remove:e=>i(o,r=>t(r.delete(e))),clear:()=>i(o,e=>t(e.clear())),keys:()=>i(r,e=>t(e.getAllKeys())),values:()=>i(r,e=>t(e.getAll())),entries:()=>i(r,async e=>{const[r,o]=await Promise.all([t(e.getAllKeys()),t(e.getAll())]);return r.map((e,t)=>[e,o[t]])}),count:()=>i(r,e=>t(e.count())),update:u,push:(e,t)=>u(e,(e=[])=>[...Array.isArray(e)?e:[],t]),merge:(e,t)=>u(e,(e={})=>({...e&&"object"==typeof e?e:{},...t}))};return["get","set","remove"].forEach(e=>y[e+"Item"]=y[e]),e.set(c,y),y};export const tinyIDB=n();export default tinyIDB;
2
+ const e=new Map,t=e=>new Promise((t,r)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>r(e.error)}),r="readonly",o="readwrite",n=(s="tiny-idb",a=void 0)=>{const c=s+"\0"+(a=a||s);if(e.has(c))return e.get(c);let l;const i=async(e,t)=>{const r=await(l||(l=new Promise((e,t)=>{const r=indexedDB.open(s,1);r.onupgradeneeded=()=>r.result.createObjectStore(a),r.onsuccess=()=>{const t=r.result;t.onversionchange=()=>{t.close(),l=null},e(t)},r.onerror=()=>{l=null,t(r.error)}})));return new Promise(async(o,n)=>{const s=r.transaction(a,e);s.onabort=s.onerror=()=>n(s.error||new DOMException("Aborted"));try{const e=await t(s.objectStore(a));s.oncomplete=()=>o(e)}catch(e){try{s.abort()}catch{}n(e)}})},u=(e,r)=>i(o,async o=>t(o.put(await r(await t(o.get(e))),e))),y={open:n,set:(e,r)=>i(o,o=>t(o.put(r,e))),get:e=>i(r,r=>t(r.get(e))),remove:e=>i(o,r=>t(r.delete(e))),clear:()=>i(o,e=>t(e.clear())),keys:()=>i(r,e=>t(e.getAllKeys())),values:()=>i(r,e=>t(e.getAll())),entries:()=>i(r,async e=>{const[r,o]=await Promise.all([t(e.getAllKeys()),t(e.getAll())]);return r.map((e,t)=>[e,o[t]])}),count:()=>i(r,e=>t(e.count())),raw:(e,t=r)=>i(t,e),update:u,push:(e,t)=>u(e,(e=[])=>[...Array.isArray(e)?e:[],t]),merge:(e,t)=>u(e,(e={})=>({...e&&"object"==typeof e?e:{},...t}))};return["get","set","remove"].forEach(e=>y[e+"Item"]=y[e]),e.set(c,y),y};export const tinyIDB=n();export default tinyIDB;