| # Copyright | ||
| Copyright (c) 2026, Dario Passariello. All rights reserved. | ||
| <https://dario.passariello.ca> | ||
| This software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. |
+12
| # These are supported funding model platforms | ||
| github: passariello | ||
| patreon: passariello | ||
| ko_fi: passariello | ||
| liberapay: passariello | ||
| issuehunt: passariello | ||
| custom: | ||
| [ | ||
| "https://dario.passariello.ca", | ||
| "https://www.indiegogo.com/individuals/28513718", | ||
| ] |
Sorry, the diff of this file is too big to display
+23
| var a=(e,o)=>()=>(e&&(o=e(e=0)),o);var $e={};var N=a(()=>{"use strict";idb.db.create=(e,o=1)=>{idb.db.support();let t=indexedDB.open(e,o);t.onerror=()=>{console.error(`IndexedDB error: ${t.errorCode}`)},t.onsuccess=()=>{console.debug("Successful database connection")},t.onupgradeneeded=()=>{console.debug("Database created")},idb.db.list()}});var ze={};var q=a(()=>{"use strict";idb.db.list=()=>(indexedDB.databases().then(e=>e).then(e=>{e&&(idbases=e)}).catch(e=>{console.error(e)}),idb.db.size(),idbases);setInterval(()=>{idb.db.list()},1e3)});var Re={};var G=a(()=>{"use strict";idb.db.exist=e=>idbases?.find(o=>o.name===e)!==void 0});var Ae={};var H=a(()=>{"use strict";idb.db.quota=()=>navigator.storage.estimate()});var Fe={};var K=a(()=>{"use strict";idb.db.delete=e=>{if(globalThis.memorio?.debug&&console.debug(`Remove ${e}...`),!!idb.db.exist(e))if(typeof globalThis.layerpro=="function"){confirm(`Are you sure to remove "${e}" database?`,()=>{setTimeout(()=>{indexedDB.deleteDatabase(e),console.debug(`${e} removed`),idb.db.list()},1e3)},()=>alert("Operation cancelled."));return}else{confirm(`Are you sure to remove "${e}" database?`)?setTimeout(()=>{indexedDB.deleteDatabase(e),console.debug(`${e} removed`),idb.db.list()},1e3):alert("Operation cancelled.");return}}});var Je={};var U=a(()=>{"use strict";idb.db.size=()=>{idbases?.map(e=>{if(!idb.db.exist(e))return null;let o=dphelper.array.findindex(idbases,e.name),t=indexedDB?.open(e.name,idb.db.version(e.name));return t.onerror=n=>console.error("Error on IndexedDB"),t.onsuccess=n=>{let r=n.target.result,s=[...r.objectStoreNames];((l,u)=>{let m=l.reduce((d,D)=>(d.push(idb.table.size(u,D)),d),[]);m.map(d=>{let D=d.reduce((te,re)=>te+re,0);return Number.parseInt(dphelper.dev.byteSize(D))||0}),idbases[o].size=m.length>0?m:0})(s,r)},null})}});var Be={};var V=a(()=>{"use strict";idb.db.version=e=>{let o=0;for(let t of idbases){t.name===e&&(o=t.version);break}return o}});var Me={};var k=a(()=>{"use strict";idb.db.support=()=>{if("indexedDB"in window)return!0;console.error("Your browser doesn't support IndexedBD")}});var Le={};var _=a(()=>{"use strict";idb.table.create=(e,o)=>{try{let t=Number(idb.db.version(e))+1,n=indexedDB.open(e,t);try{n.onupgradeneeded=r=>{let s=r.target,i=s.result,l=i.createObjectStore(o,{keyPath:"id",unique:!0,autoincrement:!0});l.createIndex("id","id"),l.createIndex("data","data"),i.close(),n?.result?.close(),n=void 0,idb.db.list()}}catch(r){console.error(">>",r);return}}catch(t){console.error(">>>",t);return}return!1}});var Ne={};var W=a(()=>{"use strict";idb.table.size=(e,o)=>(idb.db.list(),new Promise((t,n)=>{if(e==null)return n();let r=event,s=0;e=r.target.result;let i=e.transaction([o]).objectStore(o).openCursor();i.onsuccess=(l=>{let u=l.target.result;if(u){let m=u.value,d=JSON.stringify(m);s+=d.length,u.continue()}else t(s)}),i.onerror=l=>n(`error in ${o}: ${l}`)}))});var qe={};var Y=a(()=>{"use strict";idb.data.delete=(e,o,t)=>{if(!idb.db.exist(e))return;let n=indexedDB.open(e,idb.db.version(e));n.onsuccess=()=>{let r=n.result,s=r.transaction(o,"readwrite");s.objectStore(o).put(t),n.onerror=l=>{console.debug(l,`Database insert error: ${l.target.errorCode}`)},s.onerror=l=>{console.debug(event,`Database insert error: ${l.target.errorCode}`)},r.close(),idb.db.list(),console.debug("Store inserted"),globalThis.memorioIdbTrigger&&globalThis.memorioIdbTrigger()}};idb.data.delete.all=(e,o)=>{idb.db.list();let t=indexedDB.open(e);t.onsuccess=n=>{let s=n.target.result.transaction(o).objectStore(o).set({});s.onsuccess=i=>{globalThis.memorio?.debug&&console.debug(i)}}}});var Ge={};var Q=a(()=>{"use strict";idb.data.set=(e,o,t)=>{if(!idb.db?.exist(e))return;let n=indexedDB.open(e,idb.version(e));n.onsuccess=()=>{let r=n.result,s=r.transaction(o,"readwrite");s.objectStore(o).put(t),n.onerror=l=>{console.debug(l,`Database insert error: ${l.target.errorCode}`)},s.onerror=l=>{console.debug(event,`Database insert error: ${l.target.errorCode}`)},r.close(),idb.databases(),console.debug("IndexDB inserted"),globalThis.memorioIdbTrigger&&globalThis.memorioIdbTrigger()}}});var He={};var X,Z=a(()=>{"use strict";idb.data.get=(e,o,t)=>{idb.db.list();let n=indexedDB.open(e);return n.onsuccess=r=>{let s=r.target.result,i=s.transaction(o).objectStore(o).get(t);i.onsuccess=l=>(X=i.result,i.result)},X}});var F={name:"memorio",version:"3.0.0",type:"module",main:"dist/index.js",module:"dist/index.mjs",license:"MIT",types:"./index.d.ts",typings:"./types/*",description:"Memorio, State + Store for an easy life - Lightweight storage for small projects",copyright:"Copyright (c) 2026 Dario Passariello",homepage:"https://a51.gitbook.io/memorio",author:"Dario Passariello <dariopassariello@gmail.com>",support:{name:"Dario Passariello",url:"https://github.com/passariello/",email:"dariopassariello@gmail.com"},bugs:{url:"https://github.com/passariello/"},contributors:[{name:"Dario Passariello",email:"dariopassarielloa@gmail.com"},{name:"Valeria Cala Scaglitta",email:"valeriacalascaglitta@gmail.com"}],keywords:["biglogic","a51","memorio","state","store"],funding:[{type:"patreon",url:"https://www.patreon.com/passariello"}],typing:["types/*"],exports:{".":{types:"./types/index.d.ts",import:"./dist/index.mjs",default:"./dist/index.js"},"./types/*":"./types/*"},scripts:{build:"rimraf dist && node esbuild.config.mjs",dev:"node esbuild.config.mjs --watch-and-serve","npm:pack":"npm run build && cd dist && npm pack","npm:publish":"npm run build && npm publish ./dist",test:"cd tests && npm run test",lint:"cd tests && npm run lint",tsc:"cd tests && tsc --noEmit"},devDependencies:{"@types/node":"25.3.0",esbuild:"0.27.3","esbuild-node-externals":"1.20.1","esbuild-plugin-alias":"0.2.1","esbuild-plugin-copy":"2.1.1","esbuild-sass-plugin":"3.6.0","esbuild-scss-modules-plugin":"1.1.1","jest-util":"30.2.0",rimraf:"6.1.3","ts-jest":"29.4.6",tsx:"^4.21.0",typescript:"5.9.3"}};var ne=globalThis.memorio||{},y=ne.globals;function ie(e){return y===!1?!1:y&&typeof y=="object"?y[e]!==!1:!0}var le=Symbol("memorio-undefined");globalThis.memorioUNDEFINED=le;ie("memorio")&&(Object.defineProperty(globalThis,"memorio",{value:{},writable:!1,configurable:!0,enumerable:!1}),Object.defineProperty(globalThis,"events",{value:{},writable:!0,enumerable:!1}),Object.defineProperty(memorio,"version",{writable:!1,enumerable:!1,value:F.version}),Object.defineProperty(memorio,"debug",{writable:!0,enumerable:!0,value:!1}));var J=["list","state","store","idb","remove","removeAll"];Object.defineProperty(memorio,"dispatch",{writable:!1,enumerable:!1,value:{set:(e,o={})=>{dispatchEvent(new CustomEvent(String(e),o))},listen:(e,o=null,t=!1)=>{let n=r=>o?setTimeout(()=>o(r),1):null;globalThis.addEventListener(e,n),globalThis.events=globalThis.events||{},globalThis.events[e]=n},remove:e=>{let o=globalThis.events||{};globalThis.removeEventListener(e,o[e]),delete o[e]}}});memorio.propertyName=function(e,o){return String(o).replace("() => ","")};var ae={enabled:!0,logToConsole:!0,modules:["state","store","session","cache","idb"],maxEntries:1e3};function ce(){return globalThis.memorio?.debug===!0}var c={...ae},g=[],ue=e=>{c={...c,...e}},ge=()=>{c.enabled=!0},be=()=>{c.enabled=!1},B=e=>c.enabled&&c.modules.includes(e),de=(e,o,t,n,r)=>{if(!B(e))return;let s={timestamp:new Date().toISOString(),module:e,action:o,path:t,value:n,previousValue:r};if(g.push(s),g.length>c.maxEntries&&g.shift(),c.logToConsole&&ce()){let i=`[Memorio:${e.toUpperCase()}]`,l=fe(e);console.debug(`%c${i}%c ${o} ${t}`,`color: ${l}; font-weight: bold`,"color: inherit"),n!==void 0&&console.debug(" \u2192 value:",n),r!==void 0&&console.debug(" \u2190 previous:",r)}c.customHandler&&c.customHandler(s)},fe=e=>({state:"#4CAF50",store:"#2196F3",session:"#FF9800",cache:"#9C27B0",idb:"#F44336"})[e]||"#888888",me=()=>[...g],pe=()=>{g.length=0},he=()=>{let e={total:g.length,state:0,store:0,session:0,cache:0,idb:0,set:0,get:0,delete:0,clear:0};return g.forEach(o=>{e[o.module]++,e[o.action]++}),e},ye=()=>JSON.stringify(g,null,2);typeof globalThis.memorio<"u"&&Object.defineProperty(globalThis.memorio,"logger",{enumerable:!1,configurable:!0,value:{configure:ue,enable:ge,disable:be,isEnabled:B,log:de,getHistory:me,clearHistory:pe,getStats:he,exportLogs:ye}});var Te=globalThis.memorio||{},T=Te.globals;function ve(e){return T===!1?!1:T&&typeof T=="object"?T[e]!==!1:!0}var v=new Set;function Se(e){return v.add(e),()=>v.delete(e)}var xe=0;var I=Se;function je(){xe++,v.forEach(e=>e())}Object.defineProperty(memorio,"objPath",{writable:!1,enumerable:!1,value:(e,o,t=".")=>o.concat(e).join(t)});var M=(e,o,t=[])=>{let n=r=>{let s=r.split(".");s.forEach((i,l)=>{let u=s.slice(0,l+1).join(".");globalThis.memorio.dispatch.set(u,{detail:{name:u}})})};return new Proxy(e,{get(r,s){if(s==="list")return globalThis.memorio?.debug&&console.debug('Some state could be hidden when you use "state.list". Use "state" to see the complete list '),JSON.parse(JSON.stringify(r));if(s==="remove")return function(i){return delete r[i],!0};if(s==="removeAll")return function(){try{for(let i in r)typeof r[i]!="function"&&!["list","remove","removeAll"].includes(i)&&(Object.isFrozen(r[i])||delete r[i],delete r[i])}catch(i){console.error(i)}};if(Object.isFrozen(r[s]))return r[s];try{let i=Reflect.get(r,s);return i&&typeof i=="object"&&["Array","Object"].includes(i.constructor.name)?M(i,o,t.concat(s)):i}catch(i){console.error("Error: ",i);return}},set(r,s,i){if(J.includes(s))return console.error("key "+s+" is protected"),!1;if(r[s]&&typeof r[s]=="object"&&Object.isFrozen(r[s]))return console.error(`Error: state '${s}' is locked`),!1;try{let l=globalThis.memorio.objPath(s,t);return o({action:"set",path:l,target:r,newValue:i,previousValue:Reflect.get(r,s)}),n("state."+l),v.size>0&&je(),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("state","set",l,i,Reflect.get(r,s)),i===void 0?r[s]=globalThis.memorio:Reflect.set(r,s,i),r[s]&&typeof r[s]=="object"&&Reflect.defineProperty(r[s],"lock",{value(){Object.defineProperty(r,s,{writable:!1,enumerable:!1}),Object.freeze(r[s])}}),!0}catch(l){return console.error("Error in set trap:",l),!1}},deleteProperty(r,s){try{let i=globalThis.memorio.objPath(s,t);return o({action:"delete",path:i,target:r}),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("state","delete",i,void 0,Reflect.get(r,s)),Reflect.deleteProperty(r,s)}catch(i){return console.error("Error in deleteProperty trap:",i),!1}}})},b=M({},()=>{});ve("state")&&(globalThis.state=b,Object.defineProperty(globalThis,"state",{enumerable:!1,configurable:!0}));var Oe=globalThis.memorio||{},S=Oe.globals;function Ce(e){return S===!1?!1:S&&typeof S=="object"?S[e]!==!1:!0}var x=b.subscribers||new Set;function $(){x.forEach(e=>e())}var p=new Proxy({},{});Ce("store")&&Object.defineProperty(globalThis,"store",{value:p,enumerable:!1,configurable:!0});Object.defineProperties(p,{get:{value(e){if(e){try{let o=localStorage.getItem(e);return o&&JSON.parse(o)}catch(o){console.error(`Error parsing store item '${e}':`,o)}return null}}},set:{value(e,o){if(e){try{if(o==null?localStorage.setItem(e,JSON.stringify(null)):typeof o=="object"||typeof o=="number"||typeof o=="boolean"||typeof o=="string"?localStorage.setItem(e,JSON.stringify(o)):typeof o=="function"&&console.error("It's not secure to store functions."),x.size>0&&$(),typeof globalThis.memorio?.logger?.log=="function"){let t=localStorage.getItem(e);globalThis.memorio.logger.log("store","set",e,o,t?JSON.parse(t):void 0)}}catch(t){console.error(`Error setting store item '${e}':`,t)}return null}}},remove:{value(e){if(e){if(localStorage.getItem(e)){let o=localStorage.getItem(e);return localStorage.removeItem(e),x.size>0&&$(),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("store","delete",e,void 0,o?JSON.parse(o):void 0),!0}return!1}}},delete:{value(e){return p.remove(e),!0}},removeAll:{value(){return localStorage.clear(),x.size>0&&$(),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("store","clear","*"),!0}},clearAll:{value(){return p.removeAll(),!0}},quota:{value(){"storage"in navigator&&"estimate"in navigator.storage&&navigator.storage.estimate().then(({usage:e,quota:o})=>{if(e&&o)return console.debug(`Using ${e/1024} out of ${o/1024} Mb.`),[e/1024,o/1024]}).catch(e=>{console.error("Error estimating quota:",e)})}},size:{value(){let e=0;for(let o in localStorage)if(Object.prototype.hasOwnProperty.call(localStorage,o)){let t=localStorage.getItem(o);t&&(e+=t.length)}return e}},list:{value(){let e={};for(let o in localStorage)if(Object.prototype.hasOwnProperty.call(localStorage,o))try{e[o]=JSON.parse(localStorage.getItem(o)||"null")}catch{e[o]=localStorage.getItem(o)}return e}}});Object.freeze(p);var we=globalThis.memorio||{},j=we.globals;function Ee(e){return j===!1?!1:j&&typeof j=="object"?j[e]!==!1:!0}var O=b.subscribers||new Set;function z(){O.forEach(e=>e())}var L=new Proxy({},{});Ee("session")&&Object.defineProperty(globalThis,"session",{value:L,enumerable:!1,configurable:!0});Object.defineProperties(L,{get:{value(e){if(e)try{let o=sessionStorage.getItem(e);return o&&JSON.parse(o)}catch(o){console.error(`Error parsing session item '${e}':`,o)}}},set:{value(e,o){if(e)try{if(o==null?sessionStorage.setItem(e,JSON.stringify(null)):typeof o=="object"||typeof o=="number"||typeof o=="boolean"||typeof o=="string"?sessionStorage.setItem(e,JSON.stringify(o)):typeof o=="function"&&console.error("It's not secure to session functions."),O.size>0&&z(),typeof globalThis.memorio?.logger?.log=="function"){let t=sessionStorage.getItem(e);globalThis.memorio.logger.log("session","set",e,o,t?JSON.parse(t):void 0)}}catch(t){console.error(`Error setting session item '${e}':`,t)}}},remove:{value(e){if(e&&sessionStorage.getItem(e)){let o=sessionStorage.getItem(e);return sessionStorage.removeItem(e),O.size>0&&z(),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("session","delete",e,void 0,o?JSON.parse(o):void 0),!0}}},delete:{value(e){return session.remove(e),!0}},removeAll:{value(){return sessionStorage.clear(),O.size>0&&z(),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("session","clear","*"),!0}},clearAll:{value(){return session.removeAll(),!0}},quota:{value(){"storage"in navigator&&"estimate"in navigator.storage&&navigator.storage.estimate().then(({usage:e,quota:o})=>{e&&o&&console.debug(`Using ${e/1024} out of ${o/1024} Mb.`)}).catch(e=>{console.error("Error estimating quota:",e)})}},size:{value(){let e=0;for(let o in sessionStorage)if(Object.prototype.hasOwnProperty.call(sessionStorage,o)){let t=sessionStorage.getItem(o);t&&(e+=t.length)}return e}},list:{value(){let e={};for(let o in sessionStorage)if(Object.prototype.hasOwnProperty.call(sessionStorage,o))try{e[o]=JSON.parse(sessionStorage.getItem(o)||"null")}catch{e[o]=sessionStorage.getItem(o)}return e}}});Object.freeze(session);var Pe=globalThis.memorio||{},C=Pe.globals;function De(e){return C===!1?!1:C&&typeof C=="object"?C[e]!==!1:!0}var w=b.subscribers||new Set;function R(){w.forEach(e=>e())}var Ie=new Proxy({},{set(e,o,t){let n=e[o];return e[o]=t,w.size>0&&R(),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("cache","set",String(o),t,n),!0},deleteProperty(e,o){let t=e[o];return delete e[o],w.size>0&&R(),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("cache","delete",String(o),void 0,t),!0},get(e,o){return o==="clear"?()=>{Object.keys(e).forEach(t=>{delete e[t]}),w.size>0&&R(),typeof globalThis.memorio?.logger?.log=="function"&&globalThis.memorio.logger.log("cache","clear","*")}:e[o]}});De("cache")&&Object.defineProperty(globalThis,"cache",{value:Ie,enumerable:!1,configurable:!0});var Ke=globalThis.memorio||{},E=Ke.globals;function ee(e){return E===!1?!1:E&&typeof E=="object"?E[e]!==!1:!0}var oe=(()=>{let e=null,o=0;if(typeof globalThis.useEffect<"u")try{let t=globalThis.React;if(t&&t.useState){let[,n]=t.useState(0);e=()=>{o++,n(o)}}}catch{}return e})();globalThis.memorioIdbTrigger=()=>{oe&&oe()};(()=>{ee("idb")&&(Object.defineProperty(window,"idb",{value:{db:{},table:{},data:{}},writable:!0,configurable:!0,enumerable:!1}),Object.defineProperty(window,"idbases",{value:[],writable:!0,configurable:!0,enumerable:!1}));let e={db:{},table:{},data:{}};Promise.resolve().then(()=>N()),Promise.resolve().then(()=>q()),Promise.resolve().then(()=>G()),Promise.resolve().then(()=>H()),Promise.resolve().then(()=>K()),Promise.resolve().then(()=>U()),Promise.resolve().then(()=>V()),Promise.resolve().then(()=>k()),Promise.resolve().then(()=>_()),Promise.resolve().then(()=>W()),Promise.resolve().then(()=>Y()),Promise.resolve().then(()=>Q()),Promise.resolve().then(()=>Z()),ee("idb")&&(Object.preventExtensions(e),Object.seal(e),Object.freeze(e))})();var Ue=globalThis.memorio||{},P=Ue.globals;function Ve(e){return P===!1?!1:P&&typeof P=="object"?P[e]!==!1:!0}function f(){return globalThis.memorio?.debug===!0}var ke=()=>{f()&&(console.debug("%c\u{1F9E0} Memorio State Inspector","font-size: 16px; font-weight: bold; color: #4CAF50"),console.debug(""),globalThis.state&&(console.debug("%c\u{1F4E6} STATE","color: #4CAF50; font-weight: bold"),console.table(globalThis.state.list?globalThis.state.list():globalThis.state),console.debug("")),globalThis.store&&(console.debug("%c\u{1F3EA} STORE","color: #2196F3; font-weight: bold"),console.table(globalThis.store.list?globalThis.store.list():globalThis.store),console.debug("")),globalThis.session&&(console.debug("%c\u{1F510} SESSION","color: #FF9800; font-weight: bold"),console.table(globalThis.session.list?globalThis.session.list():globalThis.session),console.debug("")),globalThis.cache&&(console.debug("%c\u26A1 CACHE","color: #9C27B0; font-weight: bold"),console.table(globalThis.cache.list?globalThis.cache.list():globalThis.cache),console.debug("")))},_e=()=>{let e=o=>{if(!o)return 0;if(typeof o.list=="function"){let t=o.list();return Object.keys(t).length}return Object.keys(o).length};return{stateKeys:e(globalThis.state),storeKeys:e(globalThis.store),sessionKeys:e(globalThis.session),cacheKeys:e(globalThis.cache),idbDatabases:0,lastUpdate:new Date().toISOString()}},h=e=>{globalThis[e]&&typeof globalThis[e].clear=="function"?(globalThis[e].clear(),f()&&console.debug(`%c\u2713 Cleared ${e}`,"color: #4CAF50")):console.error(`Module ${e} not found or does not support clear()`)},We=()=>{h("state"),h("store"),h("session"),h("cache"),f()&&console.debug("%c\u2713 Cleared all Memorio modules","color: #4CAF50; font-weight: bold")},Ye=(e,o)=>{if(!f())return;console.debug(`%c\u{1F441} Watching ${e}.${o}`,"color: #FF9800");let t=globalThis[e];if(t){let n=t[o];n!==void 0&&Object.defineProperty(t,o,{get:function(){return console.debug(`%c\u{1F441} Access: ${e}.${o}`,"color: #FF9800"),n},set:function(r){return console.debug(`%c\u{1F441} Change: ${e}.${o} =`,"color: #FF9800",r),r}})}},Qe=()=>{let e={state:globalThis.state?.list?globalThis.state.list():globalThis.state,store:globalThis.store?.list?globalThis.store.list():globalThis.store,session:globalThis.session?.list?globalThis.session.list():globalThis.session,cache:globalThis.cache?.list?globalThis.cache.list():globalThis.cache,exportedAt:new Date().toISOString()};return JSON.stringify(e,null,2)},Xe=e=>{try{let o=JSON.parse(e);o.state&&Object.entries(o.state).forEach(([t,n])=>{globalThis.state&&(globalThis.state[t]=n)}),o.store&&Object.entries(o.store).forEach(([t,n])=>{globalThis.store&&(globalThis.store[t]=n)}),o.session&&Object.entries(o.session).forEach(([t,n])=>{globalThis.session&&(globalThis.session[t]=n)}),o.cache&&Object.entries(o.cache).forEach(([t,n])=>{globalThis.cache&&(globalThis.cache[t]=n)}),f()&&console.debug("%c\u2713 Data imported successfully","color: #4CAF50")}catch(o){console.error("%c\u2717 Import failed:","color: #F44336",o)}},Ze=()=>{f()&&console.debug(` | ||
| %c\u{1F9E0} Memorio DevTools Help | ||
| Available commands: | ||
| memorio.devtools.inspect() - Inspect all state modules | ||
| memorio.devtools.stats() - Show statistics | ||
| memorio.devtools.clear('module') - Clear specific module | ||
| memorio.devtools.clearAll() - Clear all modules | ||
| memorio.devtools.watch('module', 'path') - Watch a path | ||
| memorio.devtools.exportData() - Export all data as JSON | ||
| memorio.devtools.importData(json) - Import data from JSON | ||
| memorio.devtools.help() - Show this help | ||
| Shortcuts: | ||
| state - globalThis.state | ||
| store - globalThis.store | ||
| session - globalThis.session | ||
| cache - globalThis.cache | ||
| Shortcuts are also available in console as: | ||
| $state, $store, $session, $cache | ||
| `,"font-family: monospace; font-size: 12px")};typeof globalThis.memorio<"u"&&Object.defineProperty(globalThis.memorio,"devtools",{enumerable:!1,configurable:!0,value:{inspect:ke,stats:_e,clear:h,clearAll:We,watch:Ye,exportData:Qe,importData:Xe,help:Ze}});Ve("devtools")&&(Object.defineProperty(globalThis,"$state",{get:()=>globalThis.state,configurable:!0}),Object.defineProperty(globalThis,"$store",{get:()=>globalThis.store,configurable:!0}),Object.defineProperty(globalThis,"$session",{get:()=>globalThis.session,configurable:!0}),Object.defineProperty(globalThis,"$cache",{get:()=>globalThis.cache,configurable:!0}),globalThis.memorio?.debug&&console.debug("%c\u{1F9E0} Memorio DevTools loaded. Type memorio.devtools.help() for info.","color: #4CAF50; font-weight: bold"));function A(){let e=globalThis.React;if(!e)throw new Error("React not found. Make sure React is installed and memorio is imported in a React app.");return e}function eo(){return A().createContext(null)}function oo({children:e}){let o=A(),[,t]=o.useState(0);o.useEffect(()=>I(()=>{t(s=>s+1)}),[]);let n=eo();return o.createElement(n.Provider,{value:!0},e)}function to(){let e=A(),[,o]=e.useState(0);e.useEffect(()=>I(()=>{o(n=>n+1)}),[])}function ro(){return globalThis.state}export{oo as MemorioProvider,ro as useMemorio,to as useMemorioState}; | ||
| //# sourceMappingURL=index.mjs.map |
Sorry, the diff of this file is too big to display
| # Security | ||
| Please email [@passariello](https://github.com/passariello) or see https://dario.passariello.ca/contact/ if you have a potential security vulnerability to report. |
+1
-1
@@ -1,1 +0,1 @@ | ||
| var c=(e,r)=>()=>(e&&(r=e(e=0)),r);var m,g=c(()=>{m={name:"memorio",version:"2.2.1",type:"module",private:!1,main:"index.js",license:"CC-BY 4.0",types:"index.d.ts",typings:"./types/*",description:"Memorio, State + Observer and Store for a easy life ",copyright:"Dario Passariello, BigLogic ca - a51.dev is a BigLogic project",homepage:"https://a51.gitbook.io/memorio",author:{name:"Dario Passariello",url:"https://dario.passariello.ca/",email:"dariopassariello@gmail.com"},support:{name:"Dario Passariello",url:"https://github.com/passariello/",email:"dariopassariello@gmail.com"},contributors:[{name:"Dario Passariello",email:"dariopassarielloa@gmail.com"},{name:"Valeria Cala Scaglitta",email:"valeriacalascaglitta@gmail.com"}],keywords:["biglogic","a51","memorio","state","store","observer","useObserver","dario","passariello"],funding:[{type:"patreon",url:"https://www.patreon.com/passariello"}],typing:["types/*"],exports:{import:"./index.js",require:"./index.js",default:"./index.js"},scripts:{build:"node ./esbuild.config.mjs",watch:'nodemon --watch * --exec "npm run build "',test:"cd tests/jest && npm run test","-----------":"","npm:publish":"npm run build && npm publish ./dist"},dependencies:{"dphelper.types":"0.0.20"},devDependencies:{"@babel/eslint-parser":"^7.28.6","@eslint/js":"9.39.2","@testing-library/jest-dom":"6.9.1","@types/jest":"30.0.0","@types/node":"25.2.0","@typescript-eslint/eslint-plugin":"8.54.0","@typescript-eslint/parser":"8.54.0",esbuild:"0.27.2","esbuild-node-externals":"1.20.1","esbuild-plugin-alias":"0.2.1","esbuild-plugin-clean":"1.0.1","esbuild-plugin-copy":"2.1.1","esbuild-sass-plugin":"3.6.0","esbuild-scss-modules-plugin":"1.1.1",eslint:"9.39.2",jest:"30.2.0","jest-environment-jsdom":"30.2.0","ts-jest":"29.4.6","ts-loader":"^9.5.4","ts-node":"10.9.2",tslib:"^2.8.1",typescript:"5.9.3"}}});var v,f=c(()=>{"use strict";s();g();Object.defineProperty(globalThis,"memorio",{value:{},writable:!1,configurable:!0,enumerable:!1});Object.defineProperty(globalThis,"events",{value:{},writable:!0,enumerable:!1});Object.defineProperty(memorio,"version",{writable:!1,enumerable:!1,value:m.version});v=["list","state","store","idb","observer","useObserver","remove","removeAll"]});var y=c(()=>{"use strict";s();Object.defineProperty(memorio,"dispatch",{writable:!1,enumerable:!1,value:{set:(e,r={})=>{dispatchEvent(new CustomEvent(String(e),r))},listen:(e,r=null,o=!1)=>{observer.list?.[e]?.length>0&&observer.remove(e);let a=t=>r?setTimeout(()=>r(t),1):null;globalThis.addEventListener(e,a),globalThis.events[e]=a},remove:e=>{globalThis.removeEventListener(e,globalThis.events[e]),delete globalThis.events[e]}}})});var h=c(()=>{"use strict";s();memorio.propertyName=function(e,r){return String(r).replace("() => ","")}});var j,S,O=c(()=>{"use strict";s();f();Object.defineProperty(memorio,"objPath",{writable:!1,enumerable:!1,value:(e,r,o=".")=>r.concat(e).join(o)});j=(e,r,o=[])=>{let a=t=>{let n=t.split(".");n.forEach((i,l)=>{let u=n.slice(0,l+1).join(".");globalThis.memorio.dispatch.set(u,{detail:{name:u}})})};return new Proxy(e,{get(t,n){if(n==="list")return console.log('Some state could be hidden when you use "state.list". Use "state" to see the complete list '),JSON.parse(JSON.stringify(state));if(n==="remove")return function(i){return delete t[i],!0};if(n==="removeAll")return function(){try{for(let i in t)typeof t[i]!="function"&&!["list","remove","removeAll"].includes(i)&&(Object.isFrozen(t[i])||delete t[i],delete t[i])}catch(i){console.error(i)}};if(Object.isFrozen(t[n]))return t[n];try{let i=Reflect.get(t,n);return i&&typeof i=="object"&&["Array","Object"].includes(i.constructor.name)?j(i,r,o.concat(n)):i}catch(i){console.error("Error: ",i);return}},set(t,n,i){if(v.includes(n))return console.error("key "+n+" is protected"),!1;if(t[n]&&typeof t[n]=="object"&&Object.isFrozen(t[n]))return console.error(`Error: state '${n}' is locked`),!1;try{let l=globalThis.memorio.objPath(n,o);return r({action:"set",path:l,target:t,newValue:i,previousValue:Reflect.get(t,n)}),a("state."+l),Reflect.set(t,n,i),t[n]&&typeof t[n]=="object"&&Reflect.defineProperty(t[n],"lock",{value(){Object.defineProperty(t,n,{writable:!1,enumerable:!1}),Object.freeze(t[n])}}),!0}catch(l){console.error("Error in set trap:",l);return}},deleteProperty(t,n){try{let i=globalThis.memorio.objPath(n,o);return r({action:"delete",path:i,target:t}),Reflect.deleteProperty(t,n)}catch(i){console.error("Error in deleteProperty trap:",i);return}}})};globalThis?.state?globalThis.state=state:globalThis.state=j({},()=>{});S=new WeakSet;S.add(state);setInterval(()=>{if(!S.has(state)){alert("Memorio state is compromised, check if you override it and please reload the page");for(let e=1;e<99999;e++)clearInterval(e);stop()}},1e3);Object.defineProperty(globalThis,"state",{enumerable:!1,configurable:!0})});var x=c(()=>{"use strict";s();globalThis.observer||(globalThis.observer=null);Object.defineProperty(globalThis,"observer",{enumerable:!1,configurable:!0});observer=(e,r=null,o=!0)=>{try{if(!(t=>t.split(".")[0]!=="state"?(console.error(`Observer Error: You need to declare 'state.' or 'store.'. The '${t}' string is incorrect!`),!1):!0)(e))return}catch(a){console.error(a);return}if(!e&&!r){console.error("Observer Error: You need to setup observer correctly, Some parameters are missed!");return}if(!e&&r){console.error("Observer Error: You need to declare what state need to be monitored as string like 'state.test'.");return}if(e&&!r){let a=(String(e),{detail:{name:String(e)}});globalThis.observer.list[e]&&globalThis.memorio.dispatch.remove(a),globalThis.observer.list[e]||globalThis.memorio.dispatch.listen(a),console.debug("called: ",e);return}if(e&&r){if(typeof e!="string"||typeof r!="function"){console.error("Observer Error: name of state need to be a 'string' like 'state.test' and the callback need to be a 'function'");return}globalThis.observer.list[e]&&globalThis.memorio.dispatch.remove(e,r,o),globalThis.observer.list[e]||globalThis.memorio.dispatch.listen(e,r,o);return}};Object.defineProperties(observer,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(globalThis.memorio.dispatch.remove(e),delete globalThis.events[e])}},removeAll:{get:()=>{Object.entries(observer.list).forEach(e=>{globalThis.events[e[0]]})}}});Object.freeze(observer)});var w=c(()=>{"use strict";s();globalThis.useObserver||(globalThis.useObserver=null);Object.defineProperty(globalThis,"useObserver",{enumerable:!1,configurable:!0});useObserver=(e,r)=>{let o=memorio.propertyName(state,r);try{return observer(o,()=>e()),!0}catch(a){console.error(a);return}};Object.freeze(useObserver)});var P=c(()=>{"use strict";s();Object.defineProperty(globalThis,"store",{value:new Proxy({},{}),enumerable:!1,configurable:!0});Object.defineProperties(store,{get:{value(e){if(e){try{let r=localStorage.getItem(e);return r&&JSON.parse(r)}catch(r){console.error(`Error parsing store item '${e}':`,r)}return null}}},set:{value(e,r){if(e){try{r==null?localStorage.setItem(e,JSON.stringify(null)):typeof r=="object"||typeof r=="number"||typeof r=="boolean"||typeof r=="string"?localStorage.setItem(e,JSON.stringify(r)):typeof r=="function"&&console.error("It's not secure to store functions.")}catch(o){console.error(`Error setting store item '${e}':`,o)}return null}}},remove:{value(e){if(e)return localStorage.getItem(e)?(localStorage.removeItem(e),!0):!1}},delete:{value(e){return store.remove(e),!0}},removeAll:{value(){return localStorage.clear(),!0}},clearAll:{value(){return store.removeAll(),!0}},quota:{value(){"storage"in navigator&&"estimate"in navigator.storage&&navigator.storage.estimate().then(({usage:e,quota:r})=>(e&&r&&console.debug(`Using ${e/1024} out of ${r/1024} Mb.`),[e/1024,r/1024])).catch(e=>{console.error("Error estimating quota:",e)})}},size:{value(){let e=0;for(let r in localStorage)if(localStorage.hasOwnProperty(r)){let o=localStorage.getItem(r);o&&(e+=o.length)}return e}}});Object.freeze(store)});var T=c(()=>{"use strict";s();Object.defineProperty(globalThis,"session",{value:new Proxy({},{}),enumerable:!1,configurable:!0});Object.defineProperties(session,{get:{value(e){if(e)try{let r=sessionStorage.getItem(e);return r&&JSON.parse(r)}catch(r){console.error(`Error parsing session item '${e}':`,r)}}},set:{value(e,r){if(e)try{r==null?sessionStorage.setItem(e,JSON.stringify(null)):typeof r=="object"||typeof r=="number"||typeof r=="boolean"||typeof r=="string"?sessionStorage.setItem(e,JSON.stringify(r)):typeof r=="function"&&console.error("It's not secure to session functions.")}catch(o){console.error(`Error setting session item '${e}':`,o)}}},remove:{value(e){if(e&&sessionStorage.getItem(e))return sessionStorage.removeItem(e),!0}},delete:{value(e){return session.remove(e),!0}},removeAll:{value(){return sessionStorage.clear(),!0}},clearAll:{value(){return session.removeAll(),!0}},quota:{value(){"storage"in navigator&&"estimate"in navigator.storage&&navigator.storage.estimate().then(({usage:e,quota:r})=>{e&&r&&console.debug(`Using ${e/1024} out of ${r/1024} Mb.`)}).catch(e=>{console.error("Error estimating quota:",e)})}},size:{value(){let e=0;for(let r in sessionStorage)if(sessionStorage.hasOwnProperty(r)){let o=sessionStorage.getItem(r);o&&(e+=o.length)}return e}}});Object.freeze(session)});var D=c(()=>{"use strict";s();Object.defineProperty(window,"cache",{value:new Proxy({},{}),enumerable:!1,configurable:!0})});var W={};var E=c(()=>{"use strict";s();idb.db.create=(e,r=1)=>{idb.db.support();let o=indexedDB.open(e,r);o.onerror=()=>{console.error(`IndexedDB error: ${o.errorCode}`)},o.onsuccess=()=>{console.debug("Successful database connection")},o.onupgradeneeded=()=>{console.debug("Database created")},idb.db.list()}});var H={};var I=c(()=>{"use strict";s();idb.db.list=()=>(indexedDB.databases().then(e=>e).then(e=>{e&&(idbases=e)}).catch(e=>{console.error(e)}),idb.db.size(),idbases);setInterval(()=>{idb.db.list()},1e3)});var K={};var $=c(()=>{"use strict";s();idb.db.exist=e=>idbases?.find(r=>r.name===e)!==void 0});var N={};var z=c(()=>{"use strict";s();idb.db.quota=()=>navigator.storage.estimate()});var Q={};var B=c(()=>{"use strict";s();idb.db.delete=e=>{if(console.log(`Remove ${e}...`),!!idb.db.exist(e))if(typeof layerpro=="function"){confirm(`Are you sure to remove "${e}" database?`,()=>{setTimeout(()=>{indexedDB.deleteDatabase(e),console.debug(`${e} removed`),idb.db.list()},1e3)},()=>alert("Operation cancelled."));return}else{confirm(`Are you sure to remove "${e}" database?`)?setTimeout(()=>{indexedDB.deleteDatabase(e),console.debug(`${e} removed`),idb.db.list()},1e3):alert("Operation cancelled.");return}}});var X={};var A=c(()=>{"use strict";s();idb.db.size=()=>{idbases?.map(e=>{if(!idb.db.exist(e))return null;let r=dphelper.array.findindex(idbases,e.name),o=indexedDB?.open(e.name,idb.db.version(e.name));return o.onerror=a=>console.error("Error on IndexedDB"),o.onsuccess=a=>{let t=a.target.result,n=[...t.objectStoreNames];((l,u)=>{let b=l.reduce((d,p)=>(d.push(idb.table.size(u,p)),d),[]);b.map(d=>{let p=d.reduce((U,k)=>U+k,0);return Number.parseInt(dphelper.dev.byteSize(p)),null}),idbases[r].size=b.length>0?b:0})(n,t)},null})}});var Z={};var q=c(()=>{"use strict";s();idb.db.version=e=>{let r=0;for(let o of idbases){o.name===e&&(r=o.version);break}return r}});var _={};var C=c(()=>{"use strict";s();idb.db.support=()=>{if("indexedDB"in window)return!0;console.error("Your browser doesn't support IndexedBD")}});var ee={};var J=c(()=>{"use strict";s();idb.table.create=(e,r)=>{try{let o=Number(idb.db.version(e))+1,a=indexedDB.open(e,o);try{a.onupgradeneeded=t=>{let n=t.target,i=n.result,l=i.createObjectStore(r,{keyPath:"id",unique:!0,autoincrement:!0});l.createIndex("id","id"),l.createIndex("data","data"),i.close(),a?.result?.close(),a=void 0,idb.db.list()}}catch(t){console.error(">>",t);return}}catch(o){console.error(">>>",o);return}return!1}});var re={};var R=c(()=>{"use strict";s();idb.table.size=(e,r)=>(idb.db.list(),new Promise((o,a)=>{if(e==null)return a();let t=event,n=0;e=t.target.result;let i=e.transaction([r]).objectStore(r).openCursor();i.onsuccess=(l=>{let u=l.target.result;if(u){let b=u.value,d=JSON.stringify(b);n+=d.length,u.continue()}else o(n)}),i.onerror=l=>a(`error in ${r}: ${l}`)}))});var te={};var V=c(()=>{"use strict";s();idb.data.delete=(e,r,o)=>{if(!idb.db.exist(e))return;let a=indexedDB.open(e,idb.db.version(e));a.onsuccess=()=>{let t=a.result,n=t.transaction(r,"readwrite");n.objectStore(r).put(o),a.onerror=l=>{console.debug(l,`Database insert error: ${l.target.errorCode}`)},n.onerror=l=>{console.debug(event,`Database insert error: ${l.target.errorCode}`)},t.close(),idb.db.list(),console.debug("Store inserted")}};idb.data.delete.all=(e,r)=>{idb.db.list();let o=indexedDB.open(e);o.onsuccess=a=>{let n=a.target.result.transaction(r).objectStore(r).set({});n.onsuccess=i=>{console.log(i)}}}});var oe={};var Y=c(()=>{"use strict";s();idb.data.set=(e,r,o)=>{if(!idb.exist(e))return;let a=indexedDB.open(e,idb.version(e));a.onsuccess=()=>{let t=a.result,n=t.transaction(r,"readwrite");n.objectStore(r).put(o),a.onerror=l=>{console.debug(l,`Database insert error: ${l.target.errorCode}`)},n.onerror=l=>{console.debug(event,`Database insert error: ${l.target.errorCode}`)},t.close(),idb.databases(),console.debug("IndexDB inserted")}}});var se={};var L,M=c(()=>{"use strict";s();idb.data.get=(e,r,o)=>{idb.db.list();let a=indexedDB.open(e);return a.onsuccess=t=>{let n=t.target.result,i=n.transaction(r).objectStore(r).get(o);i.onsuccess=l=>(L=i.result,i.result)},L}});var F=c(()=>{"use strict";s();Object.defineProperty(window,"idb",{value:{db:{},table:{},data:{}},writable:!0,configurable:!0,enumerable:!1}),Object.defineProperty(window,"idbases",{value:[],writable:!0,configurable:!0,enumerable:!1}),Promise.resolve().then(()=>E()),Promise.resolve().then(()=>I()),Promise.resolve().then(()=>$()),Promise.resolve().then(()=>z()),Promise.resolve().then(()=>B()),Promise.resolve().then(()=>A()),Promise.resolve().then(()=>q()),Promise.resolve().then(()=>C()),Promise.resolve().then(()=>J()),Promise.resolve().then(()=>R()),Promise.resolve().then(()=>V()),Promise.resolve().then(()=>Y()),Promise.resolve().then(()=>M()),Object.preventExtensions(idb),Object.seal(idb),Object.freeze(idb)});import"dphelper.types";import"dphelper.types";var s=c(()=>{f();y();h();O();x();w();P();T();D();F()});s(); | ||
| var l=(e,r)=>()=>(e&&(r=e(e=0)),r);var p,h=l(()=>{p={name:"memorio",version:"2.5.0",type:"module",private:!1,main:"index.js",license:"MIT",typings:"./types/*",description:"Memorio, State + Observer and Store for an easy life",copyright:"Copyright (c) 2025 Dario Passariello",homepage:"https://a51.gitbook.io/memorio",author:{name:"Dario Passariello",url:"https://dario.passariello.ca/",email:"dariopassariello@gmail.com"},support:{name:"Dario Passariello",url:"https://github.com/passariello/",email:"dariopassariello@gmail.com"},contributors:[{name:"Dario Passariello",email:"dariopassarielloa@gmail.com"},{name:"Valeria Cala Scaglitta",email:"valeriacalascaglitta@gmail.com"}],keywords:["biglogic","a51","memorio","state","store","observer","useObserver","dario","passariello"],funding:[{type:"patreon",url:"https://www.patreon.com/passariello"}],typing:["types/*"],exports:{".":{types:"./types/index.d.ts",import:"./index.js",default:"./index.js"},"./types/*":"./types/*"},scripts:{build:"node ./esbuild.config.mjs",watch:'nodemon --watch * --exec "npm run build "',"npm:publish":"npm run build && npm publish ./dist",test:"cd tests && npm run test",lint:"cd tests && npm run lint",tsc:"cd tests && tsc --noEmit"},dependencies:{"dphelper.types":"0.0.20"},devDependencies:{"@types/node":"25.3.1",esbuild:"0.27.3","esbuild-node-externals":"1.20.1","esbuild-plugin-alias":"0.2.1","esbuild-plugin-copy":"2.1.1",typescript:"5.9.3"}}});var y,f=l(()=>{"use strict";a();h();Object.defineProperty(globalThis,"memorio",{value:{},writable:!1,configurable:!0,enumerable:!1});Object.defineProperty(globalThis,"events",{value:{},writable:!0,enumerable:!1});Object.defineProperty(memorio,"version",{writable:!1,enumerable:!1,value:p.version});y=["list","state","store","idb","observer","useObserver","remove","removeAll"]});var v=l(()=>{"use strict";a();Object.defineProperty(memorio,"dispatch",{writable:!1,enumerable:!1,value:{set:(e,r={})=>{globalThis.dispatchEvent(new CustomEvent(String(e),r))},listen:(e,r=null,o=!1)=>{globalThis.observer?.list?.[e]?.length>0&&globalThis.observer.remove(e);let n=t=>r?setTimeout(()=>r(t),1):null;globalThis.addEventListener(e,n),globalThis.events[e]=n},remove:e=>{globalThis.removeEventListener(e,globalThis.events[e]),delete globalThis.events[e]}}})});var T=l(()=>{"use strict";a();memorio.propertyName=(e,r)=>String(r).replace("() => ","")});var S,O,P=l(()=>{"use strict";a();f();Object.defineProperty(memorio,"objPath",{writable:!1,enumerable:!1,value:(e,r,o=".")=>{let n=r.concat(e).join(o);return globalThis.memorio._tracking&&globalThis.memorio._trackedPaths.add("state."+n),n}});globalThis.memorio._tracking=!1;globalThis.memorio._trackedPaths=new Set;globalThis.memorio._locked=!1;S=e=>new Proxy({},{get(r,o){return o===Symbol.toPrimitive||o==="toString"?()=>e:S(`${e}.${String(o)}`)}}),O=(e,r,o=[])=>{let n=t=>{globalThis.memorio.dispatch.set(t,{detail:{name:t}})};return new Proxy(e,{get(t,s){if(s==="__path")return o.length>0?"state."+o.join("."):"state";if(s==="path")return S("state");if(s==="list")return console.debug('Some state could be hidden when you use "state.list". Use "state" to see the complete list '),JSON.parse(JSON.stringify(globalThis.state));if(globalThis.memorio._tracking&&typeof s=="string"){let i=o.length>0?"state."+o.concat(s).join("."):"state."+s;globalThis.memorio._trackedPaths.add(i)}if(s==="remove")return i=>(delete t[i],!0);if(s==="removeAll")return()=>{try{for(let i in t)typeof t[i]!="function"&&!["list","remove","removeAll"].includes(i)&&(Object.isFrozen(t[i])||delete t[i],delete t[i])}catch(i){console.debug(i)}};if(Object.isFrozen(t[s]))return t[s];try{let i=Reflect.get(t,s);return i&&typeof i=="object"&&["Array","Object"].includes(i.constructor.name)?O(i,r,o.concat(s)):i}catch(i){console.error("Error: ",i);return}},set(t,s,i){if(globalThis.memorio._locked)return console.error("Error: state is locked. Use state.unlock() to enable modifications."),!1;if(y.includes(s))return console.error("key "+s+" is protected"),!1;if(t[s]&&typeof t[s]=="object"&&Object.isFrozen(t[s]))return console.error(`Error: state '${s}' is locked`),!1;try{let u=globalThis.memorio.objPath(s,o);return r({action:"set",path:u,target:t,newValue:i,previousValue:Reflect.get(t,s)}),n("state."+u),Reflect.set(t,s,i),t[s]&&typeof t[s]=="object"&&Reflect.defineProperty(t[s],"lock",{value:()=>{Object.defineProperty(t,s,{writable:!1,enumerable:!1}),Object.freeze(t[s])}}),!0}catch(u){console.error("Error in set trap:",u);return}},deleteProperty(t,s){try{let i=globalThis.memorio.objPath(s,o);return r({action:"delete",path:i,target:t}),Reflect.deleteProperty(t,s)}catch(i){console.error("Error in deleteProperty trap:",i);return}}})};globalThis?.state?globalThis.state=state:globalThis.state=O({},()=>{});globalThis.state.lock=()=>{globalThis.memorio._locked=!0,console.info("State is now locked. All modifications are blocked.")};globalThis.state.unlock=()=>{globalThis.memorio._locked=!1,console.info("State is now unlocked. Modifications are allowed.")};Object.defineProperty(globalThis,"state",{enumerable:!1,configurable:!0})});var j=l(()=>{"use strict";a();globalThis.observer||(globalThis.observer=null);Object.defineProperty(globalThis,"observer",{enumerable:!1,configurable:!0});globalThis.observer=(e,r=null,o=!0)=>{console.warn('DEPRECATED: "observer" is deprecated and will be removed in future versions. Please use "useObserver" instead.');try{if(!(t=>t.split(".")[0]!=="state"?(console.error(`Observer Error: You need to declare 'state.' or 'store.'. The '${t}' string is incorrect!`),!1):!0)(e))return}catch(n){console.error(n);return}if(!e&&!r){console.error("Observer Error: You need to setup observer correctly, Some parameters are missed!");return}if(!e&&r){console.error("Observer Error: You need to declare what state need to be monitored as string like 'state.test'.");return}if(e&&!r){let n=(String(e),{detail:{name:String(e)}});globalThis.observer.list[e]&&globalThis.memorio.dispatch.remove(n),globalThis.observer.list[e]||globalThis.memorio.dispatch.listen(n),console.debug("called: ",e);return}if(e&&r){if(typeof e!="string"||typeof r!="function"){console.error("Observer Error: name of state need to be a 'string' like 'state.test' and the callback need to be a 'function'");return}globalThis.observer.list[e]&&globalThis.memorio.dispatch.remove(e,r,o),globalThis.observer.list[e]||globalThis.memorio.dispatch.listen(e,r,o);return}};Object.defineProperties(globalThis.observer,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(globalThis.memorio.dispatch.remove(e),delete globalThis.events[e])}},removeAll:{get:()=>(Object.keys(globalThis.observer.list).forEach(e=>{globalThis.observer.remove(e)}),!0)}});Object.freeze(observer)});var w=l(()=>{"use strict";a();globalThis.useObserver||(globalThis.useObserver=null);Object.defineProperty(globalThis,"useObserver",{value:null,writable:!0,enumerable:!1,configurable:!0});globalThis.useObserver=((e,r)=>{if(!r||typeof e!="function")return()=>{};let o=[],n=Array.isArray(r)&&!r.__path?r:[r];try{return n.forEach(t=>{let s="";if(typeof t=="function"?s=globalThis.memorio.propertyName(globalThis.state,t):typeof t=="object"&&t!==null?s=t.__path||(typeof t.toString=="function"&&t.toString()!=="[object Object]"?t.toString():""):typeof t=="string"&&(t.startsWith("state.")||t.startsWith("store."))&&(s=t),s){s=s.replace(/^(\(\)\s*=>\s*)/,"").replace(/^globalThis\./,"").replace(/^state\./,"");let i=s.startsWith("store.")||s.startsWith("state.")?s:"state."+s;globalThis.memorio.dispatch.listen(i,()=>e()),o.push(i)}else{globalThis.memorio._trackedPaths.clear(),globalThis.memorio._tracking=!0;try{e()}catch{}globalThis.memorio._tracking=!1,globalThis.memorio._trackedPaths.forEach(i=>{o.includes(i)||(console.info(`useObserver: [Auto-Discovery] -> "${i}"`),globalThis.memorio.dispatch.listen(i,()=>e()),o.push(i))})}}),o.length>0?console.info(`useObserver: Monitoring ${o.length} paths.`):console.warn("useObserver: No paths resolved for monitoring. Check your dependencies!"),()=>{o.forEach(t=>{globalThis.memorio.dispatch&&typeof globalThis.memorio.dispatch.remove=="function"&&(globalThis.memorio.dispatch.remove(t),console.debug(`useObserver: Stopped monitoring "${t}"`))})}}catch(t){return console.debug("useObserver Error:",t),()=>{}}});Object.freeze(globalThis.useObserver)});var x=l(()=>{"use strict";a();Object.defineProperty(globalThis,"store",{value:new Proxy({},{}),enumerable:!1,configurable:!0});Object.defineProperties(store,{get:{value:e=>{if(e){try{let r=globalThis.localStorage.getItem(e);return r&&JSON.parse(r)}catch(r){console.debug(`Error parsing store item '${e}':`,r)}return null}}},set:{value:(e,r)=>{if(e){try{r==null?globalThis.localStorage.setItem(e,JSON.stringify(null)):typeof r=="object"||typeof r=="number"||typeof r=="boolean"||typeof r=="string"?globalThis.localStorage.setItem(e,JSON.stringify(r)):typeof r=="function"&&console.debug("It's not secure to store functions.")}catch(o){console.debug(`Error setting store item '${e}':`,o)}return null}}},remove:{value:e=>{if(e)return globalThis.localStorage.getItem(e)?(globalThis.localStorage.removeItem(e),!0):!1}},delete:{value:e=>(store.remove(e),!0)},removeAll:{value:()=>(globalThis.localStorage.clear(),!0)},clearAll:{value:()=>(store.removeAll(),!0)},quota:{value:async()=>globalThis.navigator&&"storage"in globalThis.navigator&&"estimate"in globalThis.navigator.storage?globalThis.navigator.storage.estimate().then(({usage:e,quota:r})=>(e&&r&&console.debug(`Using ${e/1024} out of ${r/1024} Mb.`),[e/1024,r/1024])).catch(e=>(console.debug("Error estimating quota:",e),[0,0])):[0,0]},size:{value:()=>{let e=0;return Object.keys(globalThis.localStorage).forEach(r=>{let o=globalThis.localStorage.getItem(r);o&&(e+=o.length)}),e}}});Object.freeze(store)});var E=l(()=>{"use strict";a();Object.defineProperty(globalThis,"session",{value:new Proxy({},{}),enumerable:!1,configurable:!0});Object.defineProperties(session,{get:{value:e=>{if(e)try{let r=globalThis.sessionStorage.getItem(e);return r&&JSON.parse(r)}catch(r){console.debug(`Error parsing session item '${e}':`,r)}}},set:{value:(e,r)=>{if(e)try{r==null?globalThis.sessionStorage.setItem(e,JSON.stringify(null)):typeof r=="object"||typeof r=="number"||typeof r=="boolean"||typeof r=="string"?globalThis.sessionStorage.setItem(e,JSON.stringify(r)):typeof r=="function"&&console.debug("It's not secure to session functions.")}catch(o){console.debug(`Error setting session item '${e}':`,o)}}},remove:{value:e=>{if(e&&globalThis.sessionStorage.getItem(e))return globalThis.sessionStorage.removeItem(e),!0}},delete:{value:e=>(session.remove(e),!0)},removeAll:{value:()=>(globalThis.sessionStorage.clear(),!0)},clearAll:{value:()=>(session.removeAll(),!0)},quota:{value:async()=>globalThis.navigator&&"storage"in globalThis.navigator&&"estimate"in globalThis.navigator.storage?globalThis.navigator.storage.estimate().then(({usage:e,quota:r})=>(e&&r&&console.debug(`Using ${e/1024} out of ${r/1024} Mb.`),[e/1024,r/1024])).catch(e=>(console.debug("Error estimating quota:",e),[0,0])):[0,0]},size:{value:()=>{let e=0;return Object.keys(globalThis.sessionStorage).forEach(r=>{let o=globalThis.sessionStorage.getItem(r);o&&(e+=o.length)}),e}}});Object.freeze(session)});var d,D=l(()=>{"use strict";a();d={};Object.defineProperty(globalThis,"cache",{value:new Proxy({},{get(e,r){let o=r;return o==="get"?n=>d[n]:o==="set"?(n,t)=>{d[n]=t}:o==="remove"?n=>(delete d[n],!0):o==="removeAll"?()=>(Object.keys(d).forEach(n=>delete d[n]),!0):o==="clear"?()=>(Object.keys(d).forEach(n=>delete d[n]),!0):d[o]},set(e,r,o){return d[r]=o,!0},deleteProperty(e,r){return delete d[r],!0}}),enumerable:!1,configurable:!0});Object.freeze(cache)});var U={};var $=l(()=>{"use strict";a();idb.db.create=(e,r=1)=>new Promise((o,n)=>{if(!idb.db.support())return n(new Error("IndexedDB not supported"));let t=globalThis.indexedDB.open(e,r);t.onerror=()=>{console.debug(`IndexedDB error: ${t.error?.message}`),n(t.error)},t.onsuccess=()=>{console.debug(`Database ${e} connected successfully`),idb.db.list(),o(t.result)},t.onupgradeneeded=()=>{console.debug(`Database ${e} upgrade/creation initiated`)}})});var W={};var k=l(()=>{"use strict";a();idb.db.list=async()=>{if(!("indexedDB"in globalThis)||!indexedDB.databases)return[];try{let e=await indexedDB.databases();return globalThis.idbases=e||[],await idb.db.size(),globalThis.idbases}catch(e){return console.error("Error listing databases:",e),[]}};idb.db.list()});var Y={};var I=l(()=>{"use strict";a();idb.db.exist=e=>idbases?.some(r=>r.name===e)});var L={};var z=l(()=>{"use strict";a();idb.db.quota=()=>navigator.storage.estimate()});var G={};var _=l(()=>{"use strict";a();idb.db.delete=e=>new Promise((r,o)=>{console.debug(`Removing database ${e}...`);let n=()=>{let t=indexedDB.deleteDatabase(e);t.onsuccess=()=>{console.debug(`${e} database removed successfully`),idb.db.list(),r()},t.onerror=()=>{console.error(`Error removing ${e}:`,t.error),o(t.error)},t.onblocked=()=>{console.warn(`Deletion of ${e} is blocked. Please close other tabs.`)}};confirm(`Are you sure you want to remove the "${e}" database?`)?n():(console.debug("Database deletion cancelled by user."),r())})});var H={};var A=l(()=>{"use strict";a();idb.db.size=async()=>{if(!(!idbases||idbases.length===0))for(let e=0;e<idbases.length;e++){let r=idbases[e];try{let o=await idb.db.create(r.name,r.version),n=Array.from(o.objectStoreNames),t=0;for(let s of n){let i=await idb.table.size(o,s);t+=i}r.size=t,o.close()}catch(o){console.debug(`Could not calculate size for ${r.name}:`,o)}}}});var K={};var B=l(()=>{"use strict";a();idb.db.version=e=>{let r=0;for(let o of idbases){o.name===e&&(r=o.version);break}return r}});var Q={};var q=l(()=>{"use strict";a();idb.db.support=()=>{let e="indexedDB"in globalThis;return e||console.debug("Your environment doesn't support IndexedDB"),e}});var X={};var R=l(()=>{"use strict";a();idb.table.create=(e,r)=>new Promise(async(o,n)=>{try{let s=(Number(idb.db.version(e))||0)+1,i=indexedDB.open(e,s);i.onupgradeneeded=u=>{let b=u.target.result;if(!b.objectStoreNames.contains(r)){let c=b.createObjectStore(r,{keyPath:"id",autoIncrement:!0});c.createIndex("id","id",{unique:!0}),c.createIndex("data","data",{unique:!1}),console.debug(`Table ${r} created in ${e}`)}},i.onsuccess=()=>{i.result.close(),idb.db.list(),o()},i.onerror=()=>{console.error(`Error creating table ${r}:`,i.error),n(i.error)}}catch(t){console.error("Critical error in table.create:",t),n(t)}})});var Z={};var N=l(()=>{"use strict";a();idb.table.size=(e,r)=>new Promise((o,n)=>{if(!e)return n(new Error("Database instance is required"));if(!e.objectStoreNames.contains(r))return o(0);let t=0,s=0,b=e.transaction([r],"readonly").objectStore(r).openCursor();b.onsuccess=async c=>{let g=c.target.result;if(g){try{let m=g.value;t+=JSON.stringify(m).length}catch(m){console.debug("Error stringifying IDB value tracking size:",m)}s++,s%200===0&&await new Promise(m=>setTimeout(m,0)),g.continue()}else o(t)},b.onerror=()=>{n(b.error)}})});var ee={};var C=l(()=>{"use strict";a();idb.data.delete=(e,r,o)=>new Promise((n,t)=>{let s=indexedDB.open(e);s.onsuccess=()=>{let i=s.result;if(!i.objectStoreNames.contains(r))return i.close(),t(new Error(`Table ${r} not found`));let c=i.transaction(r,"readwrite").objectStore(r).delete(o);c.onsuccess=()=>{i.close(),console.debug(`Record ${o} deleted from ${r}`),n()},c.onerror=()=>{i.close(),t(c.error)}},s.onerror=()=>t(s.error)});idb.data.delete.all=(e,r)=>new Promise((o,n)=>{let t=indexedDB.open(e);t.onsuccess=s=>{let i=s.target.result;if(!i.objectStoreNames.contains(r))return i.close(),n(new Error(`Table ${r} not found`));let c=i.transaction(r,"readwrite").objectStore(r).clear();c.onsuccess=()=>{i.close(),console.debug(`All data cleared from ${r}`),o()},c.onerror=()=>{i.close(),n(c.error)}},t.onerror=()=>n(t.error)})});var re={};var J=l(()=>{"use strict";a();idb.data.set=(e,r,o)=>new Promise((n,t)=>{let s=indexedDB.open(e);s.onsuccess=()=>{let i=s.result;if(!i.objectStoreNames.contains(r))return i.close(),t(new Error(`Table ${r} does not exist in ${e}`));let c=i.transaction(r,"readwrite").objectStore(r).put(o);c.onsuccess=()=>{i.close(),console.debug(`Data saved in ${e}.${r}`),n(c.result)},c.onerror=g=>{i.close(),console.debug(`Database insert error: ${c.error?.message}`),t(c.error)}},s.onerror=()=>{t(s.error)}})});var te={};var V=l(()=>{"use strict";a();idb.data.get=(e,r,o)=>new Promise((n,t)=>{let s=indexedDB.open(e);s.onsuccess=i=>{let u=i.target.result;if(!u.objectStoreNames.contains(r))return u.close(),t(new Error(`Table ${r} not found in ${e}`));let g=u.transaction(r,"readonly").objectStore(r).get(o);g.onsuccess=()=>{u.close(),n(g.result)},g.onerror=()=>{u.close(),t(g.error)}},s.onerror=()=>{t(s.error)}})});var M=l(()=>{"use strict";a();(async()=>(Object.defineProperty(globalThis,"idb",{value:{db:{},table:{},data:{}},writable:!0,configurable:!0,enumerable:!1}),Object.defineProperty(globalThis,"idbases",{value:[],writable:!0,configurable:!0,enumerable:!1}),await Promise.all([Promise.resolve().then(()=>($(),U)),Promise.resolve().then(()=>(k(),W)),Promise.resolve().then(()=>(I(),Y)),Promise.resolve().then(()=>(z(),L)),Promise.resolve().then(()=>(_(),G)),Promise.resolve().then(()=>(A(),H)),Promise.resolve().then(()=>(B(),K)),Promise.resolve().then(()=>(q(),Q)),Promise.resolve().then(()=>(R(),X)),Promise.resolve().then(()=>(N(),Z)),Promise.resolve().then(()=>(C(),ee)),Promise.resolve().then(()=>(J(),re)),Promise.resolve().then(()=>(V(),te))]),Object.preventExtensions(idb),Object.seal(idb),Object.freeze(idb)))()});import"dphelper.types";var a=l(()=>{f();v();T();P();j();w();x();E();D();M()});a(); |
+14
-8
@@ -1,5 +0,15 @@ | ||
| # GENERAL | ||
| # MIT License | ||
| Copyright (C) 1995-2025 by Dario Passariello | ||
| Copyright (c) 2025 Dario Passariello | ||
| Permission is hereby granted, free of charge, to any person obtaining a copy | ||
| of this software and associated documentation files (the "Software"), to deal | ||
| in the Software without restriction, including without limitation the rights | ||
| to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
| copies of the Software, and to permit persons to whom the Software is | ||
| furnished to do so, subject to the following conditions: | ||
| The above copyright notice and this permission notice shall be included in all | ||
| copies or substantial portions of the Software. | ||
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
@@ -10,7 +20,3 @@ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | ||
| THE SOFTWARE. | ||
| ## CC BY 4.0 | ||
| Attribution 4.0 International <https://creativecommons.org/licenses/by/4.0/> | ||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| SOFTWARE. |
+16
-29
| { | ||
| "name": "memorio", | ||
| "version": "2.2.1", | ||
| "version": "2.5.0", | ||
| "type": "module", | ||
| "private": false, | ||
| "main": "index.js", | ||
| "license": "CC-BY 4.0", | ||
| "types": "index.d.ts", | ||
| "license": "MIT", | ||
| "typings": "./types/*", | ||
| "description": "Memorio, State + Observer and Store for a easy life ", | ||
| "copyright": "Dario Passariello, BigLogic ca - a51.dev is a BigLogic project", | ||
| "description": "Memorio, State + Observer and Store for an easy life", | ||
| "copyright": "Copyright (c) 2025 Dario Passariello", | ||
| "homepage": "https://a51.gitbook.io/memorio", | ||
@@ -54,5 +53,8 @@ "author": { | ||
| "exports": { | ||
| "import": "./index.js", | ||
| "require": "./index.js", | ||
| "default": "./index.js" | ||
| ".": { | ||
| "types": "./types/index.d.ts", | ||
| "import": "./index.js", | ||
| "default": "./index.js" | ||
| }, | ||
| "./types/*": "./types/*" | ||
| }, | ||
@@ -62,5 +64,6 @@ "scripts": { | ||
| "watch": "nodemon --watch * --exec \"npm run build \"", | ||
| "test": "cd tests/jest && npm run test", | ||
| "-----------": "", | ||
| "npm:publish": "npm run build && npm publish ./dist" | ||
| "npm:publish": "npm run build && npm publish ./dist", | ||
| "test": "cd tests && npm run test", | ||
| "lint": "cd tests && npm run lint", | ||
| "tsc": "cd tests && tsc --noEmit" | ||
| }, | ||
@@ -71,25 +74,9 @@ "dependencies": { | ||
| "devDependencies": { | ||
| "@babel/eslint-parser": "^7.28.6", | ||
| "@eslint/js": "9.39.2", | ||
| "@testing-library/jest-dom": "6.9.1", | ||
| "@types/jest": "30.0.0", | ||
| "@types/node": "25.2.0", | ||
| "@typescript-eslint/eslint-plugin": "8.54.0", | ||
| "@typescript-eslint/parser": "8.54.0", | ||
| "esbuild": "0.27.2", | ||
| "@types/node": "25.3.1", | ||
| "esbuild": "0.27.3", | ||
| "esbuild-node-externals": "1.20.1", | ||
| "esbuild-plugin-alias": "0.2.1", | ||
| "esbuild-plugin-clean": "1.0.1", | ||
| "esbuild-plugin-copy": "2.1.1", | ||
| "esbuild-sass-plugin": "3.6.0", | ||
| "esbuild-scss-modules-plugin": "1.1.1", | ||
| "eslint": "9.39.2", | ||
| "jest": "30.2.0", | ||
| "jest-environment-jsdom": "30.2.0", | ||
| "ts-jest": "29.4.6", | ||
| "ts-loader": "^9.5.4", | ||
| "ts-node": "10.9.2", | ||
| "tslib": "^2.8.1", | ||
| "typescript": "5.9.3" | ||
| } | ||
| } |
+63
-60
@@ -14,5 +14,5 @@ # [memorio](https://npmjs.com/package/memorio) | ||
|  | ||
|  | ||
| License is private completely free to use (no modification) | ||
| License is MIT - free to use, modify, and distribute | ||
@@ -30,2 +30,3 @@ ## Table of Contents | ||
| - [Session](#session) | ||
| - [Cache](#cache) | ||
| - [idb](#idb) | ||
@@ -45,2 +46,14 @@ - [Testing](#testing) | ||
| ## ⚠️ Enterprise Use | ||
| For **enterprise-level applications** requiring advanced state management, we recommend using **[@biglogic/rgs](https://npmjs.com/package/@biglogic/rgs)** instead of Memorio. | ||
| RGS provides: | ||
| - Enhanced scalability for large applications | ||
| - Advanced middleware support | ||
| - Enterprise-grade security features | ||
| - Professional support and maintenance | ||
| Memorio is ideal for small to medium projects, prototypes, and learning purposes. | ||
| ## Installation | ||
@@ -93,5 +106,6 @@ | ||
| useObserver( | ||
| () => { | ||
| (newValue, oldValue) => { | ||
| console.log(`Counter changed from ${oldValue} to ${newValue}`); | ||
| }, 'state.counter' | ||
| }, | ||
| [state.counter] | ||
| ); | ||
@@ -125,5 +139,2 @@ | ||
| // Locking state (for Objects or Arrays) | ||
| state.user.lock(); | ||
| // Removing state | ||
@@ -137,59 +148,26 @@ state.remove('user'); | ||
| ### Observer Pattern | ||
| ### Observer | ||
| Observe state changes with React-like syntax: | ||
| > ⚠️ **Deprecated**: For React applications, use [`useObserver`](#useobserver-pattern) instead. The `observer` function is kept for non-React contexts. | ||
| ```js | ||
| ## useObserver | ||
| // Basic observer | ||
| observer( | ||
| 'state.user', | ||
| (newValue, oldValue) => { | ||
| console.log('User updated:', newValue); | ||
| } | ||
| ); | ||
| useObserver is a React hook for observing Memorio state changes with auto-discovery: | ||
| ``` | ||
| 1. You can use in a function outside React | ||
| 2. In a javascript function | ||
| 3. in a setTimeout | ||
| ```js | ||
| // With React useState | ||
| const [user, setUser] = useState(); | ||
| observer( | ||
| 'state.user', | ||
| () => { | ||
| setUser(state.user); | ||
| } | ||
| // Basic useObserver - array syntax with state path | ||
| useObserver( | ||
| (newValue, oldValue) => { | ||
| console.log('User updated:', newValue); | ||
| }, | ||
| [state.user] | ||
| ); | ||
| // With React useEffect to avoid multiple observer after update | ||
| useEffect( | ||
| () => { | ||
| observer( | ||
| 'state.user', | ||
| () => { | ||
| setUser(state.user); | ||
| } | ||
| ); | ||
| }, [] | ||
| ); | ||
| ``` | ||
| ## useObserver Pattern | ||
| useObserve changes with React-like useEffect syntax: | ||
| ```js | ||
| // Basic useObserver | ||
| // Multiple states | ||
| useObserver( | ||
| () => { | ||
| console.log('User updated:', newValue) | ||
| , 'state.user' | ||
| } | ||
| (newValue, oldValue) => { | ||
| console.log('State changed:', newValue); | ||
| }, | ||
| [state.user, state.counter, state.settings] | ||
| ); | ||
@@ -199,5 +177,7 @@ | ||
| 1. You can use in a function outside React | ||
| 2. In a javascript function | ||
| 3. in a setTimeout | ||
| **Key differences from observer:** | ||
| 1. Uses **array syntax** `[state.property]` instead of string path `'state.property'` | ||
| 2. Automatically cleans up on component unmount | ||
| 3. Works only inside React components | ||
| 4. Callback receives `(newValue, oldValue)` parameters | ||
@@ -251,2 +231,25 @@ ## Store | ||
| ## Cache | ||
| In-memory cache for temporary data storage: | ||
| ```js | ||
| // Setting cache data | ||
| cache.set('tempData', { computed: true, value: 42 }); | ||
| // Getting cache data | ||
| const cached = cache.get('tempData'); | ||
| // Checking cache size | ||
| const cacheSize = cache.size(); | ||
| // Removing cache data | ||
| cache.remove('tempData'); | ||
| // Clearing all cache data | ||
| cache.removeAll(); | ||
| ``` | ||
| **Note:** Cache data is stored in memory and will be lost on page refresh. | ||
| ## idb | ||
@@ -308,4 +311,4 @@ | ||
| PRIVATE (c) [Dario Passariello](https://dario.passariello.ca/) | ||
| MIT License | ||
| Created with by [Dario Passariello](https://dario.passariello.ca/) - Copyright (c) 2025 | ||
| Copyrigth (c) [Dario Passariello](https://dario.passariello.ca/) |
@@ -9,4 +9,4 @@ /*! | ||
| /** | ||
| * useObserver run a callback anytime the associated state going to change | ||
| * @return Execution of function after state change. | ||
| * useObserver run a callback anytime the associated state going to change. | ||
| * Returns a destructor function to remove the listener. | ||
| */ | ||
@@ -19,7 +19,12 @@ interface _useObserver { | ||
| * @example | ||
| * useObserver(()=>{ console.log("Change", state.test), "state.test" ) | ||
| * const cleanup = useObserver(() => console.debug("Changed"), "state.test") | ||
| * cleanup() // Stop observing | ||
| * | ||
| * @example | ||
| * useObserver(() => console.debug("Multiple changed"), [() => state.a, "state.b"]) | ||
| * | ||
| * @since memorio 1.0.6 | ||
| * @updated 2.5.0 - Added support for arrays and destructor | ||
| */ | ||
| (func: Function, state: string[] | Function): any | ||
| (func: Function, deps: any): (() => void) | ||
@@ -26,0 +31,0 @@ } |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
Deprecated
MaintenanceThe maintainer of the package marked it as deprecated. This could indicate that a single version should not be used, or that the package is no longer maintained and any new vulnerabilities will not be fixed.
Found 1 instance in 1 package
Mixed license
LicensePackage contains multiple licenses.
Found 1 instance in 1 package
Non-permissive License
LicenseA license not known to be considered permissive was found.
Found 1 instance in 1 package
Unidentified License
LicenseSomething that seems like a license was found, but its contents could not be matched with a known license.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
236219
642.43%6
-72.73%19
46.15%0
-100%100
25%521
28.64%0
-100%306
0.99%2
100%6
200%