use-idb-storage 0.2.0 → 0.2.1
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/index.d.ts +17 -10
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -143,16 +143,6 @@ declare class IDBStorage {
|
|
|
143
143
|
close(): void;
|
|
144
144
|
}
|
|
145
145
|
//#endregion
|
|
146
|
-
//#region src/config.d.ts
|
|
147
|
-
/**
|
|
148
|
-
* Configure global defaults for IDBStorage.
|
|
149
|
-
*/
|
|
150
|
-
declare function configureIDBStorage(config: Partial<IDBConfigValues>): void;
|
|
151
|
-
/**
|
|
152
|
-
* Get the current global configuration.
|
|
153
|
-
*/
|
|
154
|
-
declare function getGlobalConfig(): IDBConfigValues;
|
|
155
|
-
//#endregion
|
|
156
146
|
//#region src/hook.d.ts
|
|
157
147
|
/**
|
|
158
148
|
* Hook to persist state in IndexedDB with a clean object-based API.
|
|
@@ -211,6 +201,13 @@ declare function getGlobalConfig(): IDBConfigValues;
|
|
|
211
201
|
declare function useIDBStorage<T>(options: IDBStorageOptions<T>): UseIDBStorageReturn<T>;
|
|
212
202
|
//#endregion
|
|
213
203
|
//#region src/idb-config.d.ts
|
|
204
|
+
/**
|
|
205
|
+
* React component to configure global defaults for IDBStorage.
|
|
206
|
+
* Wrap your app or components to set database, version, and store defaults.
|
|
207
|
+
*
|
|
208
|
+
* @param children - Child components to render
|
|
209
|
+
* @param conf - Configuration values to set globally
|
|
210
|
+
*/
|
|
214
211
|
declare const IDBConfig: ({
|
|
215
212
|
children,
|
|
216
213
|
...conf
|
|
@@ -218,6 +215,16 @@ declare const IDBConfig: ({
|
|
|
218
215
|
children: React.ReactNode;
|
|
219
216
|
} & Partial<IDBConfigValues>) => React.ReactNode;
|
|
220
217
|
//#endregion
|
|
218
|
+
//#region src/utils.d.ts
|
|
219
|
+
/**
|
|
220
|
+
* Configure global defaults for IDBStorage.
|
|
221
|
+
*/
|
|
222
|
+
declare function configureIDBStorage(config: Partial<IDBConfigValues>): void;
|
|
223
|
+
/**
|
|
224
|
+
* Get the current global configuration.
|
|
225
|
+
*/
|
|
226
|
+
declare function getGlobalConfig(): IDBConfigValues;
|
|
227
|
+
//#endregion
|
|
221
228
|
//#region src/index.d.ts
|
|
222
229
|
declare const idb: IDBStorage;
|
|
223
230
|
//#endregion
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as e from"react";const t=new Map;function n(){return typeof indexedDB<`u`}function r(e,r,a=1,o){if(!n())throw Error(`IndexedDB is not available in this environment`);let s=`${e}:${a}:${r}`;if(t.has(s))return t.get(s);let c=i(e,r,a,o);return t.set(s,c),c}function i(e,n,r,a){return new Promise((o,s)=>{let c=indexedDB.open(e,r);c.onerror=()=>{let l=`${e}:${r??`current`}:${n}`;if(t.delete(l),c.error?.name===`VersionError`&&c.error.message.includes(`less than`)){o(i(e,n,void 0,a));return}s(c.error)},c.onupgradeneeded=e=>{let t=e.target.result;t.objectStoreNames.contains(n)||t.createObjectStore(n)},c.onsuccess=()=>{let s=c.result,l=s.version;if(!s.objectStoreNames.contains(n)){s.close();let c=`${e}:${r??`current`}:${n}`;t.delete(c),o(i(e,n,l+1,a));return}s.onversionchange=()=>{s.close();for(let[n]of t)n.startsWith(`${e}:`)&&t.delete(n);a?.()},o(s)}})}function a(e,t,n){return new Promise((r,i)=>{try{let a=e.transaction([t],`readonly`).objectStore(t).get(n);a.onerror=()=>i(a.error),a.onsuccess=()=>r(a.result)}catch(e){i(e)}})}function o(e,t,n,r){return new Promise((i,a)=>{try{let o=e.transaction([t],`readwrite`).objectStore(t).put(r,n);o.onerror=()=>a(o.error),o.onsuccess=()=>i()}catch(e){a(e)}})}function s(e,t,n){return new Promise((r,i)=>{try{let a=e.transaction([t],`readwrite`).objectStore(t).delete(n);a.onerror=()=>i(a.error),a.onsuccess=()=>r()}catch(e){i(e)}})}
|
|
1
|
+
import*as e from"react";const t=new Map;function n(){return typeof indexedDB<`u`}function r(e,r,a=1,o){if(!n())throw Error(`IndexedDB is not available in this environment`);let s=`${e}:${a}:${r}`;if(t.has(s))return t.get(s);let c=i(e,r,a,o);return t.set(s,c),c}function i(e,n,r,a){return new Promise((o,s)=>{let c=indexedDB.open(e,r);c.onerror=()=>{let l=`${e}:${r??`current`}:${n}`;if(t.delete(l),c.error?.name===`VersionError`&&c.error.message.includes(`less than`)){o(i(e,n,void 0,a));return}s(c.error)},c.onupgradeneeded=e=>{let t=e.target.result;t.objectStoreNames.contains(n)||t.createObjectStore(n)},c.onsuccess=()=>{let s=c.result,l=s.version;if(!s.objectStoreNames.contains(n)){s.close();let c=`${e}:${r??`current`}:${n}`;t.delete(c),o(i(e,n,l+1,a));return}s.onversionchange=()=>{s.close();for(let[n]of t)n.startsWith(`${e}:`)&&t.delete(n);a?.()},o(s)}})}function a(e,t,n){return new Promise((r,i)=>{try{let a=e.transaction([t],`readonly`).objectStore(t).get(n);a.onerror=()=>i(a.error),a.onsuccess=()=>r(a.result)}catch(e){i(e)}})}function o(e,t,n,r){return new Promise((i,a)=>{try{let o=e.transaction([t],`readwrite`).objectStore(t).put(r,n);o.onerror=()=>a(o.error),o.onsuccess=()=>i()}catch(e){a(e)}})}function s(e,t,n){return new Promise((r,i)=>{try{let a=e.transaction([t],`readwrite`).objectStore(t).delete(n);a.onerror=()=>i(a.error),a.onsuccess=()=>r()}catch(e){i(e)}})}var c=class{db;storeName;constructor(e,t){this.db=e,this.storeName=t}async get(e){try{return await a(this.db,this.storeName,e)}catch(t){throw console.error(`Failed to get value for key "${e}":`,t),t}}async set(e,t){try{await o(this.db,this.storeName,e,t)}catch(t){throw console.error(`Failed to set value for key "${e}":`,t),t}}async delete(e){try{await s(this.db,this.storeName,e)}catch(t){throw console.error(`Failed to delete key "${e}":`,t),t}}async getMany(e){try{let t=e.map(e=>this.get(e));return await Promise.all(t)}catch(e){throw console.error(`Failed to get multiple values:`,e),e}}async setMany(e){try{let t=this.db.transaction([this.storeName],`readwrite`).objectStore(this.storeName),n=e.map(([e,n])=>new Promise((r,i)=>{let a=t.put(n,e);a.onerror=()=>i(a.error),a.onsuccess=()=>r()}));await Promise.all(n)}catch(e){throw console.error(`Failed to set multiple values:`,e),e}}async deleteMany(e){try{let t=this.db.transaction([this.storeName],`readwrite`).objectStore(this.storeName),n=e.map(e=>new Promise((n,r)=>{let i=t.delete(e);i.onerror=()=>r(i.error),i.onsuccess=()=>n()}));await Promise.all(n)}catch(e){throw console.error(`Failed to delete multiple keys:`,e),e}}async update(e,t){try{let n=t(await this.get(e));await this.set(e,n)}catch(t){throw console.error(`Failed to update value for key "${e}":`,t),t}}async clear(){try{let e=this.db.transaction([this.storeName],`readwrite`).objectStore(this.storeName).clear();await new Promise((t,n)=>{e.onerror=()=>n(e.error),e.onsuccess=()=>t()})}catch(e){throw console.error(`Failed to clear store:`,e),e}}async keys(){try{let e=this.db.transaction([this.storeName],`readonly`).objectStore(this.storeName).getAllKeys();return await new Promise((t,n)=>{e.onerror=()=>n(e.error),e.onsuccess=()=>t(Array.from(e.result))})}catch(e){throw console.error(`Failed to get keys:`,e),e}}async values(){try{let e=this.db.transaction([this.storeName],`readonly`).objectStore(this.storeName).getAll();return await new Promise((t,n)=>{e.onerror=()=>n(e.error),e.onsuccess=()=>t(e.result)})}catch(e){throw console.error(`Failed to get values:`,e),e}}async entries(){try{let e=this.db.transaction([this.storeName],`readonly`).objectStore(this.storeName).openCursor(),t=[];return new Promise((n,r)=>{e.onerror=()=>r(e.error),e.onsuccess=()=>{let r=e.result;r?(t.push([r.key,r.value]),r.continue()):n(t)}})}catch(e){throw console.error(`Failed to get entries:`,e),e}}},l=class{config;db=null;dbPromise=null;constructor(e){this.config={database:`sohanemon-idb`,version:1,store:`default`,...h(),...e},this.config.version=Math.max(1,Math.floor(this.config.version))}async getDB(){return this.db?this.db:this.dbPromise?this.dbPromise:(this.dbPromise=r(this.config.database,this.config.store,this.config.version,()=>{this.db=null,this.dbPromise=null}),this.db=await this.dbPromise,this.dbPromise=null,this.db)}async get(e){return new c(await this.getDB(),e)}get store(){return this.get(this.config.store)}async drop(e){await(await this.get(e)).clear()}close(){this.db&&=(this.db.close(),null)}};const u=(e,t)=>{switch(t.type){case`UPDATE_VALUE`:return{...e,value:t.value,lastUpdated:new Date,error:null};case`SET_ERROR`:return{...e,error:t.error};case`LOAD_VALUE`:return{...e,value:t.value,lastUpdated:new Date,error:null};case`RESET`:return{...e,value:t.defaultValue,lastUpdated:null,error:null};case`REFRESH_SUCCESS`:return{...e,value:t.value,lastUpdated:new Date,error:null};case`REFRESH_ERROR`:return{...e,error:t.error};default:return e}};function d(t){let{key:r,defaultValue:i,...a}=t,o=h(),s=e.useMemo(()=>({...o,...a}),[o,a]),[c,d]=e.useReducer(u,{value:i,error:null,lastUpdated:null}),f=e.useRef(!1),p=e.useRef(null),m=e.useRef(null),g=e.useRef(null),_=e.useRef(null),v=e.useRef(!1),y=e.useRef(null),b=e.useRef(!1);e.useEffect(()=>{if(typeof window>`u`)return;let e=!0;return(async()=>{try{if(!n()){console.warn(`IndexedDB is not available, using default values only`),y.current=i,f.current=!0,v.current=!0;return}p.current&&p.current.close();let t=new l(s),a=await t.get(s.store);if(!e)return;p.current=t,m.current=a;let o=await a.get(r);e&&(b.current=!0,d({type:`LOAD_VALUE`,value:o===void 0?i:o}),y.current=o===void 0?i:o),f.current=!0,v.current=!0}catch(e){console.info(`⚡[useIDBStorage] error:`,e),d({type:`SET_ERROR`,error:e instanceof Error?e:Error(String(e))}),y.current=i,f.current=!0,v.current=!0}})(),()=>{e=!1,g.current&&(clearTimeout(g.current),_.current!==null&&m.current&&m.current.set(r,_.current).catch(console.error)),p.current&&(p.current.close(),p.current=null,m.current=null)}},[s.database,s.version,s.store,r]);let x=e.useCallback(e=>{!f.current||!m.current||!v.current||(_.current=e,g.current&&clearTimeout(g.current),g.current=setTimeout(()=>{let e=_.current;_.current=null,e!==null&&m.current&&m.current.set(r,e).then(()=>{y.current=e}).catch(e=>{console.error(`Failed to save value to IndexedDB:`,e),d({type:`SET_ERROR`,error:e instanceof Error?e:Error(String(e))})})},0))},[r]);e.useEffect(()=>{if(!f.current||!v.current||b.current){b.current=!1;return}x(c.value)},[c.value,x]);let S=e.useCallback(e=>{d({type:`UPDATE_VALUE`,value:typeof e==`function`?e(c.value):e})},[c.value]),C=e.useCallback(()=>{d({type:`RESET`,defaultValue:i}),y.current=i},[i]),w=e.useCallback(async()=>{if(!(!n()||!m.current))try{let e=await m.current.get(r);b.current=!0,d({type:`REFRESH_SUCCESS`,value:e===void 0?i:e}),y.current=e===void 0?i:e}catch(e){d({type:`REFRESH_ERROR`,error:e instanceof Error?e:Error(String(e))})}},[r,i]),T=e.useCallback(()=>{C()},[C]),E=e.useCallback(e=>{S(e)},[S]);return Object.assign({0:c.value,1:S,2:C,data:c.value,update:E,reset:T,loading:!v.current,persisted:v.current,error:c.error,lastUpdated:c.lastUpdated,refresh:w,length:3},{[Symbol.iterator]:function*(){yield c.value,yield S,yield C}})}const f=({children:t,...n})=>(e.useEffect(()=>{m(n)},[n]),t);let p={database:`sohanemon-idb`,version:1,store:`default`};function m(e){p={...p,...e}}function h(){return{...p}}const g=new l;export{f as IDBConfig,l as IDBStorage,c as IDBStore,m as configureIDBStorage,h as getGlobalConfig,g as idb,d as useIDBStorage};
|