Latest Threat Research:SANDWORM_MODE: Shai-Hulud-Style npm Worm Hijacks CI Workflows and Poisons AI Toolchains.Details
Socket
Book a DemoInstallSign in
Socket

memorio

Package Overview
Dependencies
Maintainers
1
Versions
85
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

memorio - npm Package Compare versions

Comparing version
2.2.1
to
2.5.0
+6
COPYRIGHT.md
# 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.
# 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

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();

@@ -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.
{
"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](https://img.shields.io/badge/license-PRIVATE-blue.svg)
![License](https://img.shields.io/badge/license-MIT-blue.svg)
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 @@ }