memorio 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- # MIT License
1
+ # PRIVATE License
2
2
 
3
3
  Copyright (C) 1995-2025 by Dario Passariello
4
4
 
package/README.md CHANGED
@@ -11,7 +11,9 @@
11
11
  ![ESLint](https://img.shields.io/badge/ESLint-gray?logo=eslint)
12
12
  ![esbuild](https://img.shields.io/badge/esbuild-gray?logo=esbuild)
13
13
 
14
- ![License](https://img.shields.io/badge/license-MIT-blue.svg)
14
+ ![License](https://img.shields.io/badge/license-PRIVATE-blue.svg)
15
+
16
+ License is private completely free to use (no modification)
15
17
 
16
18
  ## Table of Contents
17
19
 
@@ -239,20 +241,20 @@ session.remove('userSession');
239
241
  session.removeAll();
240
242
  ```
241
243
 
242
- ## idb [indexedDB engine]
244
+ ## idb
243
245
 
244
246
  Permanent storage using browser database:
245
247
 
246
248
  ### Create database
247
249
 
248
250
  ```js
249
- idb.addTable("Database","table")
251
+ idb.db.create("Database")
250
252
  ```
251
253
 
252
254
  ### Set data into table
253
255
 
254
256
  ```js
255
- idb.set("Database","table",{ id:1, data:{} })
257
+ idb.set("Database","table", { id: 1, data:{...} } )
256
258
  ```
257
259
 
258
260
  ### Get data from table
@@ -268,13 +270,10 @@ idb.get("Database","table", 1 )
268
270
  > [in development]
269
271
 
270
272
  ```js
271
- idb.delete("Database") // Remove DB
272
- idb.delete("Database","table") // Remove only "table"
273
+ idb.db.delete("Database") // Remove DB
274
+ idb.table.delete("Database","table") // Remove only "table"
273
275
  ```
274
276
 
275
- - Put data:
276
- - Delete:
277
-
278
277
  ---
279
278
 
280
279
  ## Testing
@@ -298,6 +297,6 @@ Security scans and reports are available at:
298
297
 
299
298
  ## License
300
299
 
301
- MIT (c) [Dario Passariello](https://dario.passariello.ca/)
300
+ PRIVATE (c) [Dario Passariello](https://dario.passariello.ca/)
302
301
 
303
302
  Created with by [Dario Passariello](https://dario.passariello.ca/) - Copyright (c) 2025
package/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";(()=>{var l=(e,r)=>()=>(e&&(r=e(e=0)),r);var J={};var v=l(()=>{"use strict";idb.delete=e=>{}});var q={};var y=l(()=>{"use strict";idb.set=(e,r,o)=>{if(!idb.exist(e))return;let i=indexedDB.open(e,idb.version(e));i.onsuccess=()=>{let t=i.result,s=t.transaction(r,"readwrite");s.objectStore(r).put(o),i.onerror=a=>{console.debug(a,`Database insert error: ${a.target.errorCode}`)},s.onerror=a=>{console.debug(event,`Database insert error: ${a.target.errorCode}`)},t.close(),idb.databases(),console.debug("IndexDB inserted")}}});var N={};var h,O=l(()=>{"use strict";idb.get=(e,r,o)=>{idb.databases();let i=indexedDB.open(e);return i.onsuccess=t=>{let n=t.target.result.transaction(r).objectStore(r).get(o);n.onsuccess=a=>{h=n.result}},h}});var R={};var j=l(()=>{"use strict";idb.getTableSize=(e,r)=>new Promise((o,i)=>{if(e==null)return i();let t=event,s=0;e=t.target.result;let n=e.transaction([r]).objectStore(r).openCursor();n.onsuccess=(a=>{let c=a.target.result;if(c){let d=c.value,u=JSON.stringify(d);s+=u.length,c.continue()}else o(s)}).bind(void 0),n.onerror=a=>i(`error in ${r}: ${a}`)})});var C={};var S=l(()=>{"use strict";idb.support=()=>{if("indexedDB"in window)return!0;console.error("Your browser doesn't support IndexedBD")}});var M={};var x=l(()=>{"use strict";idb.addTable=(e,r)=>{try{let o=Number(idb.version(e))+1,i=indexedDB.open(e,o);try{i.onupgradeneeded=t=>{let n=t.target.result,a=n.createObjectStore(r,{keyPath:"id",unique:!0,autoincrement:!0});a.createIndex("id","id"),a.createIndex("data","data"),n.close(),i?.result?.close(),i=void 0,idb.databases()}}catch(t){console.error(">>",t);return}}catch(o){console.error(">>>",o);return}return!1}});var L={};var P=l(()=>{"use strict";idb.create=(e,r=1)=>{idb.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.databases()}});var V={};var w=l(()=>{"use strict";idb.databases=()=>(indexedDB.databases().then(e=>e).then(e=>{e&&(idbases=e)}).catch(e=>{console.error(e)}),idb.size(),idbases);setInterval(()=>{idb.databases()},1e3)});var Y={};var T=l(()=>{"use strict";idb.exist=e=>idbases?.find(r=>r.name===e)!==void 0});var _={};var I=l(()=>{"use strict";idb.quota=()=>navigator.storage.estimate()});var F={};var D=l(()=>{"use strict";idb.remove=e=>{if(console.log(`Remove ${e}...`),!!idb.exist(e))if(typeof layerpro=="function")confirm(`Are you sure to remove "${e}" database?`,()=>{setTimeout(()=>{indexedDB.deleteDatabase(e),console.debug(`${e} removed`),idb.databases()},1e3)},()=>alert("Operation cancelled."));else{confirm(`Are you sure to remove "${e}" database?`)?setTimeout(()=>{indexedDB.deleteDatabase(e),console.debug(`${e} removed`),idb.databases()},1e3):alert("Operation cancelled.");return}}});var U={};var E=l(()=>{"use strict";idb.size=()=>{idbases?.map(e=>{if(!idb.exist(e))return null;let r=dphelper.array.findindex(idbases,e.name),o=indexedDB?.open(e.name,idb.version(e.name));return o.onerror=i=>console.error("Error on IndexedDB"),o.onsuccess=i=>{let t=i.target.result,s=[...t.objectStoreNames];((a,c)=>{let d=a.reduce((u,b)=>(u.push(idb.getTableSize(c,b)),u),[]);d.map(u=>{let b=u.reduce(($,A)=>$+A,0);return Number.parseInt(dphelper.dev.byteSize(b)),null}),idbases[r].size=d.length>0?d:0})(s,t)},null})}});var k={};var z=l(()=>{"use strict";idb.version=e=>{let r=0;for(let o of idbases){o.name===e&&(r=o.version);break}return r}});var f={name:"memorio",version:"1.3.1",type:"module",main:"index.js",types:"index.d.ts",typings:"./types/*",description:"Memorio, State + Observer and Store for a easy life ",license:"MIT",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/*"],scripts:{build:"node ./esbuild.config.mjs",watch:"esbuild init.ts --bundle --outdir=dist --serve","-----------":"","npm:publish":"npm run build && npm publish ./dist","------------":"",test:"set NODE_OPTIONS=--experimental-vm-modules && jest","test:watch":"set NODE_OPTIONS=--experimental-vm-modules && jest --watch","test:coverage":"set NODE_OPTIONS=--experimental-vm-modules && jest --coverage","test:watchAll":"set NODE_OPTIONS=--experimental-vm-modules && jest --watchAll"},dependencies:{"dphelper.types":"0.0.20"},devDependencies:{"@eslint/js":"9.39.1","@types/jest":"30.0.0","@types/node":"^24.10.1","@typescript-eslint/eslint-plugin":"8.48.0","@typescript-eslint/parser":"8.48.0",esbuild:"^0.27.0","esbuild-plugin-clean":"^1.0.1","esbuild-plugin-copy":"^2.1.1",eslint:"9.39.1",jest:"30.2.0","jest-environment-jsdom":"30.2.0","ts-jest":"29.4.5","ts-loader":"^9.5.4","ts-node":"10.9.2",tslib:"^2.8.1",typescript:"5.9.3"}};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});var p=["list","state","store","idb","observer","useObserver","remove","removeAll"];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 i=t=>r?setTimeout(()=>r(t),1):null;globalThis.addEventListener(e,i),globalThis.events[e]=i},remove:e=>{globalThis.removeEventListener(e,globalThis.events[e]),delete globalThis.events[e]}}});Object.defineProperty(memorio,"objPath",{writable:!1,enumerable:!1,value:(e,r,o=".")=>r.concat(e).join(o)});var g=(e,r,o=[])=>{let i=t=>{let s=t.split(".");s.forEach((n,a)=>{let c=s.slice(0,a+1).join(".");globalThis.memorio.dispatch.set(c,{detail:{name:c}})})};return new Proxy(e,{get(t,s){if(s==="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(s==="remove")return function(n){return delete t[n],!0};if(s==="removeAll")return function(){try{for(let n in t)typeof t[n]!="function"&&!["list","remove","removeAll"].includes(n)&&(Object.isFrozen(t[n])||delete t[n],delete t[n])}catch(n){console.error(n)}};if(Object.isFrozen(t[s]))return t[s];try{let n=Reflect.get(t,s);return n&&typeof n=="object"&&["Array","Object"].includes(n.constructor.name)?g(n,r,o.concat(s)):n}catch(n){console.error("Error: ",n);return}},set(t,s,n){if(p.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 a=globalThis.memorio.objPath(s,o);return r({action:"set",path:a,target:t,newValue:n,previousValue:Reflect.get(t,s)}),i("state."+a),Reflect.set(t,s,n),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(a){console.error("Error in set trap:",a);return}},deleteProperty(t,s){try{let n=globalThis.memorio.objPath(s,o);return r({action:"delete",path:n,target:t}),Reflect.deleteProperty(t,s)}catch(n){console.error("Error in deleteProperty trap:",n);return}}})};globalThis?.state?globalThis.state=state:globalThis.state=g({},()=>{});var m=new WeakSet;m.add(state);setInterval(()=>{if(!m.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});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(i){console.error(i);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){globalThis.memorio.dispatch.listen(String(e),{detail:{name:String(e)}}),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.memorio.dispatch.listen(e,r,o);return}};Object.defineProperties(observer,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(globalThis.events[e]="")}},removeAll:{get:()=>{Object.entries(observer.list).forEach(e=>{globalThis.events[e[0]]})}}});Object.freeze(observer);globalThis.useObserver||(globalThis.useObserver=null);Object.defineProperty(globalThis,"useObserver",{enumerable:!1,configurable:!0});useObserver=(e,r)=>{try{return observer(r,()=>e()),!0}catch(o){console.error(o);return}};Object.freeze(useObserver);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);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);Object.defineProperty(window,"cache",{value:new Proxy({},{}),enumerable:!1,configurable:!0});Object.defineProperty(window,"idb",{value:{},writable:!0,configurable:!0,enumerable:!1});Object.defineProperty(window,"idbases",{value:[],writable:!0,configurable:!0,enumerable:!1});setTimeout(()=>{Promise.resolve().then(()=>v()),Promise.resolve().then(()=>y()),Promise.resolve().then(()=>O()),Promise.resolve().then(()=>j()),Promise.resolve().then(()=>S()),Promise.resolve().then(()=>x()),Promise.resolve().then(()=>P()),Promise.resolve().then(()=>w()),Promise.resolve().then(()=>T()),Promise.resolve().then(()=>I()),Promise.resolve().then(()=>D()),Promise.resolve().then(()=>E()),Promise.resolve().then(()=>z())},0);})();
1
+ "use strict";(()=>{var l=(e,r)=>()=>(e&&(r=e(e=0)),r);var J={};var v=l(()=>{"use strict";idb.delete=e=>{}});var q={};var y=l(()=>{"use strict";idb.set=(e,r,o)=>{if(!idb.exist(e))return;let i=indexedDB.open(e,idb.version(e));i.onsuccess=()=>{let t=i.result,s=t.transaction(r,"readwrite");s.objectStore(r).put(o),i.onerror=a=>{console.debug(a,`Database insert error: ${a.target.errorCode}`)},s.onerror=a=>{console.debug(event,`Database insert error: ${a.target.errorCode}`)},t.close(),idb.databases(),console.debug("IndexDB inserted")}}});var R={};var h,O=l(()=>{"use strict";idb.get=(e,r,o)=>{idb.databases();let i=indexedDB.open(e);return i.onsuccess=t=>{let n=t.target.result.transaction(r).objectStore(r).get(o);n.onsuccess=a=>{h=n.result}},h}});var C={};var S=l(()=>{"use strict";idb.getTableSize=(e,r)=>new Promise((o,i)=>{if(e==null)return i();let t=event,s=0;e=t.target.result;let n=e.transaction([r]).objectStore(r).openCursor();n.onsuccess=(a=>{let u=a.target.result;if(u){let d=u.value,c=JSON.stringify(d);s+=c.length,u.continue()}else o(s)}).bind(void 0),n.onerror=a=>i(`error in ${r}: ${a}`)})});var L={};var j=l(()=>{"use strict";idb.support=()=>{if("indexedDB"in window)return!0;console.error("Your browser doesn't support IndexedBD")}});var M={};var x=l(()=>{"use strict";idb.addTable=(e,r)=>{try{let o=Number(idb.version(e))+1,i=indexedDB.open(e,o);try{i.onupgradeneeded=t=>{let n=t.target.result,a=n.createObjectStore(r,{keyPath:"id",unique:!0,autoincrement:!0});a.createIndex("id","id"),a.createIndex("data","data"),n.close(),i?.result?.close(),i=void 0,idb.databases()}}catch(t){console.error(">>",t);return}}catch(o){console.error(">>>",o);return}return!1}});var V={};var P=l(()=>{"use strict";idb.create=(e,r=1)=>{idb.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.databases()}});var Y={};var w=l(()=>{"use strict";idb.databases=()=>(indexedDB.databases().then(e=>e).then(e=>{e&&(idbases=e)}).catch(e=>{console.error(e)}),idb.size(),idbases);setInterval(()=>{idb.databases()},1e3)});var F={};var T=l(()=>{"use strict";idb.exist=e=>idbases?.find(r=>r.name===e)!==void 0});var U={};var I=l(()=>{"use strict";idb.quota=()=>navigator.storage.estimate()});var k={};var D=l(()=>{"use strict";idb.remove=e=>{if(console.log(`Remove ${e}...`),!!idb.exist(e))if(typeof layerpro=="function")confirm(`Are you sure to remove "${e}" database?`,()=>{setTimeout(()=>{indexedDB.deleteDatabase(e),console.debug(`${e} removed`),idb.databases()},1e3)},()=>alert("Operation cancelled."));else{confirm(`Are you sure to remove "${e}" database?`)?setTimeout(()=>{indexedDB.deleteDatabase(e),console.debug(`${e} removed`),idb.databases()},1e3):alert("Operation cancelled.");return}}});var G={};var E=l(()=>{"use strict";idb.size=()=>{idbases?.map(e=>{if(!idb.exist(e))return null;let r=dphelper.array.findindex(idbases,e.name),o=indexedDB?.open(e.name,idb.version(e.name));return o.onerror=i=>console.error("Error on IndexedDB"),o.onsuccess=i=>{let t=i.target.result,s=[...t.objectStoreNames];((a,u)=>{let d=a.reduce((c,b)=>(c.push(idb.getTableSize(u,b)),c),[]);d.map(c=>{let b=c.reduce(($,B)=>$+B,0);return Number.parseInt(dphelper.dev.byteSize(b)),null}),idbases[r].size=d.length>0?d:0})(s,t)},null})}});var W={};var z=l(()=>{"use strict";idb.version=e=>{let r=0;for(let o of idbases){o.name===e&&(r=o.version);break}return r}});var f={name:"memorio",version:"1.4.0",type:"module",main:"index.js",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/*"],scripts:{build:"npm run test && node ./esbuild.config.mjs",watch:"esbuild init.ts --bundle --outdir=dist --serve",test:"cd tests/jest && npm run test","-----------":"","npm:publish":"npm run build && npm publish ./dist"},dependencies:{"dphelper.types":"0.0.20"},devDependencies:{"@types/node":"^24.10.1",esbuild:"^0.27.1","esbuild-plugin-clean":"^1.0.1","esbuild-plugin-copy":"^2.1.1","ts-loader":"^9.5.4","ts-node":"10.9.2",tslib:"^2.8.1",typescript:"5.9.3"}};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});var p=["list","state","store","idb","observer","useObserver","remove","removeAll"];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 i=t=>r?setTimeout(()=>r(t),1):null;globalThis.addEventListener(e,i),globalThis.events[e]=i},remove:e=>{globalThis.removeEventListener(e,globalThis.events[e]),delete globalThis.events[e]}}});Object.defineProperty(memorio,"objPath",{writable:!1,enumerable:!1,value:(e,r,o=".")=>r.concat(e).join(o)});var g=(e,r,o=[])=>{let i=t=>{let s=t.split(".");s.forEach((n,a)=>{let u=s.slice(0,a+1).join(".");globalThis.memorio.dispatch.set(u,{detail:{name:u}})})};return new Proxy(e,{get(t,s){if(s==="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(s==="remove")return function(n){return delete t[n],!0};if(s==="removeAll")return function(){try{for(let n in t)typeof t[n]!="function"&&!["list","remove","removeAll"].includes(n)&&(Object.isFrozen(t[n])||delete t[n],delete t[n])}catch(n){console.error(n)}};if(Object.isFrozen(t[s]))return t[s];try{let n=Reflect.get(t,s);return n&&typeof n=="object"&&["Array","Object"].includes(n.constructor.name)?g(n,r,o.concat(s)):n}catch(n){console.error("Error: ",n);return}},set(t,s,n){if(p.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 a=globalThis.memorio.objPath(s,o);return r({action:"set",path:a,target:t,newValue:n,previousValue:Reflect.get(t,s)}),i("state."+a),Reflect.set(t,s,n),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(a){console.error("Error in set trap:",a);return}},deleteProperty(t,s){try{let n=globalThis.memorio.objPath(s,o);return r({action:"delete",path:n,target:t}),Reflect.deleteProperty(t,s)}catch(n){console.error("Error in deleteProperty trap:",n);return}}})};globalThis?.state?globalThis.state=state:globalThis.state=g({},()=>{});var m=new WeakSet;m.add(state);setInterval(()=>{if(!m.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});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(i){console.error(i);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){globalThis.memorio.dispatch.listen(String(e),{detail:{name:String(e)}}),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.memorio.dispatch.listen(e,r,o);return}};Object.defineProperties(observer,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(globalThis.events[e]="")}},removeAll:{get:()=>{Object.entries(observer.list).forEach(e=>{globalThis.events[e[0]]})}}});Object.freeze(observer);globalThis.useObserver||(globalThis.useObserver=null);Object.defineProperty(globalThis,"useObserver",{enumerable:!1,configurable:!0});useObserver=(e,r)=>{try{return observer(r,()=>e()),!0}catch(o){console.error(o);return}};Object.freeze(useObserver);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);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);Object.defineProperty(window,"cache",{value:new Proxy({},{}),enumerable:!1,configurable:!0});Object.defineProperty(window,"idb",{value:{},writable:!0,configurable:!0,enumerable:!1});Object.defineProperty(window,"idbases",{value:[],writable:!0,configurable:!0,enumerable:!1});setTimeout(()=>{Promise.resolve().then(()=>v()),Promise.resolve().then(()=>y()),Promise.resolve().then(()=>O()),Promise.resolve().then(()=>S()),Promise.resolve().then(()=>j()),Promise.resolve().then(()=>x()),Promise.resolve().then(()=>P()),Promise.resolve().then(()=>w()),Promise.resolve().then(()=>T()),Promise.resolve().then(()=>I()),Promise.resolve().then(()=>D()),Promise.resolve().then(()=>E()),Promise.resolve().then(()=>z())},0);})();
package/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "memorio",
3
- "version": "1.3.1",
3
+ "version": "1.4.0",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
7
7
  "typings": "./types/*",
8
8
  "description": "Memorio, State + Observer and Store for a easy life ",
9
- "license": "MIT",
10
9
  "copyright": "Dario Passariello, BigLogic ca - a51.dev is a BigLogic project",
11
10
  "homepage": "https://a51.gitbook.io/memorio",
12
11
  "author": {
@@ -50,32 +49,20 @@
50
49
  "types/*"
51
50
  ],
52
51
  "scripts": {
53
- "build": "node ./esbuild.config.mjs",
52
+ "build": "npm run test && node ./esbuild.config.mjs",
54
53
  "watch": "esbuild init.ts --bundle --outdir=dist --serve",
54
+ "test": "cd tests/jest && npm run test",
55
55
  "-----------": "",
56
- "npm:publish": "npm run build && npm publish ./dist",
57
- "------------": "",
58
- "test": "set NODE_OPTIONS=--experimental-vm-modules && jest",
59
- "test:watch": "set NODE_OPTIONS=--experimental-vm-modules && jest --watch",
60
- "test:coverage": "set NODE_OPTIONS=--experimental-vm-modules && jest --coverage",
61
- "test:watchAll": "set NODE_OPTIONS=--experimental-vm-modules && jest --watchAll"
56
+ "npm:publish": "npm run build && npm publish ./dist"
62
57
  },
63
58
  "dependencies": {
64
59
  "dphelper.types": "0.0.20"
65
60
  },
66
61
  "devDependencies": {
67
- "@eslint/js": "9.39.1",
68
- "@types/jest": "30.0.0",
69
62
  "@types/node": "^24.10.1",
70
- "@typescript-eslint/eslint-plugin": "8.48.0",
71
- "@typescript-eslint/parser": "8.48.0",
72
- "esbuild": "^0.27.0",
63
+ "esbuild": "^0.27.1",
73
64
  "esbuild-plugin-clean": "^1.0.1",
74
65
  "esbuild-plugin-copy": "^2.1.1",
75
- "eslint": "9.39.1",
76
- "jest": "30.2.0",
77
- "jest-environment-jsdom": "30.2.0",
78
- "ts-jest": "29.4.5",
79
66
  "ts-loader": "^9.5.4",
80
67
  "ts-node": "10.9.2",
81
68
  "tslib": "^2.8.1",