memorio 4.6.8 → 4.7.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/COPYRIGHT.md +6 -0
- package/FUNDING.yml +12 -0
- package/SECURITY.md +48 -0
- package/SUMMARY.md +28 -0
- package/index.cjs +54 -0
- package/index.d.ts +18 -0
- package/index.js +54 -0
- package/llms.txt +405 -0
- package/markdown/CACHE.md +90 -0
- package/markdown/CHANGELOG.md +161 -0
- package/markdown/DEVTOOLS.md +122 -0
- package/markdown/DISPATCH.md +168 -0
- package/markdown/IDB.md +169 -0
- package/markdown/IMPORT.md +139 -0
- package/markdown/LOGGER.md +147 -0
- package/markdown/OBSERVER.md +200 -0
- package/markdown/PLATFORM.md +265 -0
- package/markdown/SECURITY.md +323 -0
- package/markdown/SESSION.md +154 -0
- package/markdown/STATE.md +153 -0
- package/markdown/STORE.md +164 -0
- package/markdown/USEOBSERVER.md +259 -0
- package/package.json +13 -3
package/COPYRIGHT.md
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
# Copyright
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025, Dario Passariello. All rights reserved.
|
|
4
|
+
<https://dario.passariello.ca>
|
|
5
|
+
|
|
6
|
+
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.
|
package/FUNDING.yml
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# These are supported funding model platforms
|
|
2
|
+
|
|
3
|
+
github: passariello
|
|
4
|
+
patreon: passariello
|
|
5
|
+
ko_fi: passariello
|
|
6
|
+
liberapay: passariello
|
|
7
|
+
issuehunt: passariello
|
|
8
|
+
custom:
|
|
9
|
+
[
|
|
10
|
+
"https://dario.passariello.ca",
|
|
11
|
+
"https://www.indiegogo.com/individuals/28513718",
|
|
12
|
+
]
|
package/SECURITY.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Security
|
|
2
|
+
|
|
3
|
+
Memorio follows NIST and NSA security standards at the enterprise level.
|
|
4
|
+
|
|
5
|
+
## Security Standards
|
|
6
|
+
|
|
7
|
+
- **NIST Guidelines**: Follows NIST SP 800-53 security controls and NIST Cybersecurity Framework
|
|
8
|
+
- **NSA Standards**: Defense-grade security practices; considers nation-state level threats in risk assessment
|
|
9
|
+
|
|
10
|
+
## Supply Chain Security
|
|
11
|
+
|
|
12
|
+
- **Socket.dev**: Minimum target score 90%; all alarms must be resolved before release
|
|
13
|
+
- **Dependency Management**: Zero production dependencies (fully dependency-free); dev dependencies audited regularly
|
|
14
|
+
- **Prohibited**: No `eval()` usage, no encrypted/obfuscated code in builds, no hardcoded secrets
|
|
15
|
+
|
|
16
|
+
## Code Security
|
|
17
|
+
|
|
18
|
+
- No hardcoded credentials or API keys
|
|
19
|
+
- Secure random session ID generation (`crypto.randomUUID` → `crypto.getRandomValues` → fallback)
|
|
20
|
+
- Input validation on all public APIs
|
|
21
|
+
- XSS prevention on DevTools data export
|
|
22
|
+
- Property-based access control on global objects (`Object.defineProperty` with `enumerable: false`)
|
|
23
|
+
|
|
24
|
+
## OWASP Compliance
|
|
25
|
+
|
|
26
|
+
Addresses OWASP Top 10 (2021):
|
|
27
|
+
- A01:2021 — Broken Access Control (global object protection, property locks)
|
|
28
|
+
- A02:2021 — Cryptographic Failures (crypto.randomUUID for session IDs)
|
|
29
|
+
- A03:2021 — Injection (CSS sanitization in devtools)
|
|
30
|
+
- A05:2021 — Security Misconfiguration (minimal surface area, no bundled secrets)
|
|
31
|
+
- A06:2021 — Vulnerable and Outdated Components (regular npm audit, Socket.dev)
|
|
32
|
+
- A07:2021 — Identification and Authentication Failures (N/A — library, no auth)
|
|
33
|
+
- A08:2021 — Software and Data Integrity Failures (strict tsconfig, lock files)
|
|
34
|
+
- A09:2021 — Security Logging and Monitoring Failures (DevTools inspect, Logger module)
|
|
35
|
+
- A10:2021 — Server-Side Request Forgery (N/A — no network requests)
|
|
36
|
+
|
|
37
|
+
## Reporting Security Issues
|
|
38
|
+
|
|
39
|
+
If you find a security vulnerability:
|
|
40
|
+
|
|
41
|
+
1. Email [Dario Passariello](mailto:dariopassarielloa@gmail.com)
|
|
42
|
+
2. Or visit https://dario.passariello.ca/contact/
|
|
43
|
+
|
|
44
|
+
Do not open public issues for security vulnerabilities.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
*Document version: 2.0 — Last updated: 2026-05-19*
|
|
48
|
+
*Owner: BigLogic Security Team*
|
package/SUMMARY.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Table of contents
|
|
2
|
+
|
|
3
|
+
* [README](README.md)
|
|
4
|
+
|
|
5
|
+
## Core Modules
|
|
6
|
+
|
|
7
|
+
* [State](markdown/STATE.md) - Reactive global state management
|
|
8
|
+
* [Observer](markdown/OBSERVER.md) - Object observation pattern
|
|
9
|
+
* [useObserver](markdown/USEOBSERVER.md) - React hook for state observation
|
|
10
|
+
* [Dispatch](markdown/DISPATCH.md) - Event system for vanilla JS applications
|
|
11
|
+
* [Cache](markdown/CACHE.md) - In-memory caching (lost on refresh)
|
|
12
|
+
* [Store](markdown/STORE.md) - Persistent localStorage management
|
|
13
|
+
* [Session](markdown/SESSION.md) - Temporary sessionStorage management
|
|
14
|
+
* [IDB](markdown/IDB.md) - IndexedDB for large data storage
|
|
15
|
+
|
|
16
|
+
## Platform & Compatibility
|
|
17
|
+
|
|
18
|
+
* [Platform & Context Isolation](markdown/PLATFORM.md) - Cross-platform support, session isolation
|
|
19
|
+
* [Security](markdown/SECURITY.md) - Security measures, vulnerability prevention
|
|
20
|
+
* [Changelog](markdown/CHANGELOG.md) - Version history and migration guide
|
|
21
|
+
* [Classic Import](markdown/IMPORT.md) - Named export guide for `import { state } from 'memorio'`
|
|
22
|
+
|
|
23
|
+
## Additional Resources
|
|
24
|
+
|
|
25
|
+
* [License](../LICENSE.md)
|
|
26
|
+
* [Contributing](../CONTRIBUTING.md)
|
|
27
|
+
* [Code of Conduct](../CODE_OF_CONDUCT.md)
|
|
28
|
+
* [Security](../SECURITY.md)
|
package/index.cjs
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use strict';Object.defineProperty(exports,'__esModule',{value:true});var g=(e,t)=>()=>(e&&(t=e(e=0)),t);var a=g(()=>{});var y,Ne,be;exports.propertyName=void 0;exports.internal=void 0;var P=g(()=>{a();y={debug:false,tracking:false,trackedPaths:new Set,locked:false,lastAccessedPath:"",stateVersion:0,currentContext:null},Ne={get debug(){return y.debug},set debug(e){y.debug=e;},get tracking(){return y.tracking},set tracking(e){y.tracking=e;},get trackedPaths(){return y.trackedPaths},clearTrackedPaths(){y.trackedPaths.clear();},get locked(){return y.locked},set locked(e){y.locked=e;},get lastAccessedPath(){return y.lastAccessedPath},set lastAccessedPath(e){y.lastAccessedPath=e;},get stateVersion(){return y.stateVersion},bumpStateVersion(){return y.stateVersion=(y.stateVersion||0)+1,y.stateVersion},get currentContext(){return y.currentContext},set currentContext(e){y.currentContext=e;}},be=["list","state","store","idb","observer","useObserver","remove","removeAll","_platform","_capabilities","_sessionId"],exports.propertyName=(e,t)=>String(t!==void 0?t:e).replace("() => ",""),exports.internal=Ne;});exports.message=void 0;var c,b=g(()=>{a();P();exports.message=(...e)=>{exports.internal.debug===true&&console.debug(...e);},c=exports.message;});function K(){let e=globalThis;if(typeof e.crypto<"u"&&e.crypto.randomUUID)return e.crypto.randomUUID();if(typeof e.crypto<"u"&&e.crypto.getRandomValues){let t=new Uint8Array(16);return e.crypto.getRandomValues(t),Array.from(t,r=>r.toString(16).padStart(2,"0")).join("")}return `session_${Date.now()}_${Math.random().toString(36).substring(2,15)}`}function z(){let e=globalThis;return e.Deno&&e.Deno.version?"deno":typeof process<"u"&&process.versions&&process.versions.node?"node":typeof globalThis<"u"&&typeof globalThis.ServiceWorkerGlobalScope<"u"?"edge":typeof window<"u"&&typeof document<"u"?"browser":"unknown"}function Q(){return z()==="browser"}function X(){return z()==="node"}function Z(){return z()==="deno"}function ee(){return z()==="edge"}function te(){try{if(typeof sessionStorage<"u"){let e="__memorio_test__";return sessionStorage.setItem(e,"1"),sessionStorage.removeItem(e),sessionStorage}}catch{}return null}function re(){try{if(typeof localStorage<"u"){let e="__memorio_test__";return localStorage.setItem(e,"1"),localStorage.removeItem(e),localStorage}}catch{}return null}function oe(){return typeof indexedDB<"u"}function Le(){return typeof globalThis.dispatchEvent=="function"}function q(){let e=z(),t=typeof globalThis.isSecureContext<"u"?globalThis.isSecureContext:e==="browser";return {platform:e,hasSessionStorage:te()!==null,hasLocalStorage:re()!==null,hasIndexedDB:oe(),hasDispatchEvent:Le(),hasNavigator:typeof navigator<"u",hasProcess:typeof process<"u",isSecureContext:t,sessionId:K()}}function ve(){let e=q(),t=globalThis;e.hasDispatchEvent||(t.dispatchEvent=function(r){return true},typeof CustomEvent>"u"&&(t.CustomEvent=class{type;detail;constructor(s,o={}){this.type=s,this.detail=o;}})),typeof t.addEventListener!="function"&&(t.addEventListener=function(r,s){L.has(r)||L.set(r,[]),L.get(r).push(s);},t.removeEventListener=function(r,s){let o=L.get(r);if(o){let n=o.indexOf(s);n>-1&&o.splice(n,1);}},t.dispatchEvent=function(r){let s=L.get(r.type);return s&&s.forEach(o=>{try{o(r);}catch(n){console.error("Event listener error:",n);}}),true});}function J(e){let t=e||`context_${K()}`;ae(t);let r={state:{},store:new Map,session:new Map,cache:new Map};return se.set(t,r),{id:t,state:r.state,store:{get:s=>{let o=r.store.get(s);return o?JSON.parse(o):null},set:(s,o)=>{r.store.set(s,JSON.stringify(o));},remove:s=>r.store.delete(s),removeAll:()=>r.store.clear(),clearAll:()=>r.store.clear(),size:()=>r.store.size,isPersistent:false},session:{get:s=>{let o=r.session.get(s);return o?JSON.parse(o):null},set:(s,o)=>{r.session.set(s,JSON.stringify(o));},remove:s=>r.session.delete(s),removeAll:()=>r.session.clear(),clearAll:()=>r.session.clear(),size:()=>r.session.size,isPersistent:false},cache:{get:s=>r.cache.get(s),set:(s,o)=>r.cache.set(s,o),remove:s=>r.cache.delete(s),removeAll:()=>r.cache.clear(),clear:()=>r.cache.clear()}}}function ne(){return Array.from(se.keys())}function ie(e){return se.delete(e)}function ae(e){exports.internal.currentContext=e;}var L,se,B=g(()=>{a();P();L=new Map;se=new Map;});var Fe={};var xe=g(()=>{a();x();b();exports.idb.db.create=(e,t=1)=>new Promise((r,s)=>{if(!exports.idb.db.support())return s(new Error("IndexedDB not supported"));let o=globalThis.indexedDB.open(e,t);o.onerror=()=>{c(`IndexedDB error: ${o.error?.message}`),s(o.error);},o.onsuccess=()=>{c(`Database ${e} connected successfully`),r(o.result);},o.onupgradeneeded=()=>{c(`Database ${e} upgrade/creation initiated`);};});});var We={};var we=g(()=>{a();x();exports.idb.db.list=async()=>{if(!("indexedDB"in globalThis)||!indexedDB.databases)return [];try{let e=await indexedDB.databases();return globalThis.idbases=e||[],await exports.idb.db.size(),globalThis.idbases}catch(e){return console.error("Error listing databases:",e),[]}};});var He={};var Se=g(()=>{a();x();exports.idb.db.exist=e=>idbases?.some(t=>t.name===e);});var Ye={};var Pe=g(()=>{a();x();exports.idb.db.quota=()=>navigator.storage.estimate();});var Ge={};var Te=g(()=>{a();x();b();exports.idb.db.delete=e=>new Promise((t,r)=>{c(`Removing database ${e}...`),(()=>{let o=indexedDB.deleteDatabase(e);o.onsuccess=()=>{c(`${e} database removed successfully`),exports.idb.db.list(),t();},o.onerror=()=>{console.error(`Error removing ${e}:`,o.error),r(o.error);},o.onblocked=()=>{console.warn(`Deletion of ${e} is blocked. Please close other tabs.`);};})();});});var Qe={};var Oe=g(()=>{a();x();b();exports.idb.db.size=async()=>{if(!(!idbases||idbases.length===0))for(let e=0;e<idbases.length;e++){let t=idbases[e];try{let r=await exports.idb.db.create(t.name,t.version),s=Array.from(r.objectStoreNames),o=0;for(let n of s){let i=await exports.idb.table.size(r,n);o+=i;}t.size=o,r.close();}catch(r){c(`Could not calculate size for ${t.name}:${r}`);}}};});var Xe={};var Ee=g(()=>{a();x();exports.idb.db.version=e=>{let t=0;for(let r of idbases){r.name===e&&(t=r.version);break}return t};});var Ze={};var De=g(()=>{a();x();b();exports.idb.db.support=()=>{let e="indexedDB"in globalThis;return e||c("Your environment doesn't support IndexedDB"),e};});var et={};var Ce=g(()=>{a();x();b();exports.idb.table.create=(e,t)=>new Promise((r,s)=>{try{let n=(Number(exports.idb.db.version(e))||0)+1,i=indexedDB.open(e,n);i.onupgradeneeded=m=>{let p=m.target.result;if(!p.objectStoreNames.contains(t)){let f=p.createObjectStore(t,{keyPath:"id",autoIncrement:!0});f.createIndex("id","id",{unique:!0}),f.createIndex("data","data",{unique:!1}),c(`Table ${t} created in ${e}`);}},i.onsuccess=()=>{i.result.close(),exports.idb.db.list(),r();},i.onerror=()=>{console.error(`Error creating table ${t}:`,i.error),s(i.error);};}catch(o){console.error("Critical error in table.create:",o),s(o);}});});var tt={};var je=g(()=>{a();x();b();exports.idb.table.size=(e,t)=>new Promise((r,s)=>{if(!e)return s(new Error("Database instance is required"));if(!e.objectStoreNames.contains(t))return r(0);let o=0,n=0,p=e.transaction([t],"readonly").objectStore(t).openCursor();p.onsuccess=async f=>{let O=f.target.result;if(O){try{let M=O.value;o+=JSON.stringify(M).length;}catch(M){c(`Error stringifying IDB value tracking size:${M}`);}n++,n%200===0&&await new Promise(M=>setTimeout(M,0)),O.continue();}else r(o);},p.onerror=()=>{s(p.error);};});});var rt={};var ke=g(()=>{a();x();b();exports.idb.data.delete=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=()=>{let i=n.result;if(!i.objectStoreNames.contains(t))return i.close(),o(new Error(`Table ${t} not found`));let f=i.transaction(t,"readwrite").objectStore(t).delete(r);f.onsuccess=()=>{i.close(),c(`Record ${r} deleted from ${t}`),s();},f.onerror=()=>{i.close(),o(f.error);};},n.onerror=()=>o(n.error);});exports.idb.data.delete.all=(e,t)=>new Promise((r,s)=>{let o=indexedDB.open(e);o.onsuccess=n=>{let i=n.target.result;if(!i.objectStoreNames.contains(t))return i.close(),s(new Error(`Table ${t} not found`));let f=i.transaction(t,"readwrite").objectStore(t).clear();f.onsuccess=()=>{i.close(),c(`All data cleared from ${t}`),r();},f.onerror=()=>{i.close(),s(f.error);};},o.onerror=()=>s(o.error);});});var ot={};var _e=g(()=>{a();x();b();exports.idb.data.set=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=()=>{let i=n.result;if(!i.objectStoreNames.contains(t))return i.close(),o(new Error(`Table ${t} does not exist in ${e}`));let f=i.transaction(t,"readwrite").objectStore(t).put(r);f.onsuccess=()=>{i.close(),c(`Data saved in ${e}.${t}`),s(f.result);},f.onerror=O=>{i.close(),c(`Database insert error: ${f.error?.message}`),o(f.error);};},n.onerror=()=>{o(n.error);};});});var st={};var $e=g(()=>{a();x();exports.idb.data.get=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=i=>{let m=i.target.result;if(!m.objectStoreNames.contains(t))return m.close(),o(new Error(`Table ${t} not found in ${e}`));let O=m.transaction(t,"readonly").objectStore(t).get(r);O.onsuccess=()=>{m.close(),s(O.result);},O.onerror=()=>{m.close(),o(O.error);};},n.onerror=()=>{o(n.error);};});});var nt;exports.idb=void 0;var x=g(()=>{a();B();nt=oe(),exports.idb={db:{},table:{},data:{}};nt?(async()=>(Object.defineProperty(exports.idb,"db",{value:{},writable:true,configurable:true}),Object.defineProperty(exports.idb,"table",{value:{},writable:true,configurable:true}),Object.defineProperty(exports.idb,"data",{value:{},writable:true,configurable:true}),Object.defineProperty(globalThis,"idbases",{value:[],writable:true,configurable:true,enumerable:false}),await Promise.all([Promise.resolve().then(()=>(xe(),Fe)),Promise.resolve().then(()=>(we(),We)),Promise.resolve().then(()=>(Se(),He)),Promise.resolve().then(()=>(Pe(),Ye)),Promise.resolve().then(()=>(Te(),Ge)),Promise.resolve().then(()=>(Oe(),Qe)),Promise.resolve().then(()=>(Ee(),Xe)),Promise.resolve().then(()=>(De(),Ze)),Promise.resolve().then(()=>(Ce(),et)),Promise.resolve().then(()=>(je(),tt)),Promise.resolve().then(()=>(ke(),rt)),Promise.resolve().then(()=>(_e(),ot)),Promise.resolve().then(()=>($e(),st))]),Object.preventExtensions(exports.idb),Object.seal(exports.idb),Object.freeze(exports.idb)))():(exports.idb._disabled=true,exports.idb._warning="IndexedDB is not available in this environment (Node.js/Deno). Use store or session for persistence.",console.warn("Memorio IDB: IndexedDB is not available in this environment. Use store or session for data persistence."));});a();a();P();b();a();var v={set:(e,t={})=>{globalThis.dispatchEvent(new CustomEvent(String(e),t));},listen:(e,t=null,r)=>{if(globalThis.events?.[e])return;let s=t?o=>{let n=o;return globalThis.queueMicrotask?globalThis.queueMicrotask(()=>t(n)):Promise.resolve().then(()=>t(n))}:void 0;s&&globalThis.addEventListener(e,s),s&&(globalThis.events[e]=s);},remove:e=>{let t=globalThis.events?.[e];t&&(globalThis.removeEventListener(e,t),delete globalThis.events[e]);}};var V=Symbol("memorio.target"),pe=new WeakMap,G=(e,t=null)=>{if(e===null||typeof e!="object")return e;if(e[V]!==void 0)return G(e[V],t);if(t){if(t.has(e))return e;t.add(e);}let r=e.constructor?.name;if(r!=="Object"&&r!=="Array")return e;let s=Array.isArray(e)?[]:{};for(let o of Reflect.ownKeys(e))s[o]=G(e[o],t);return s},ye=(e,t,r=".")=>t.concat(e).join(r),he=(e,t,r=[])=>{let s=o=>{try{v.set(o,{detail:{name:o}});}catch{}};return new Proxy(e,{get(o,n){if(n==="__path")return r.length>0?"state."+r.join("."):"state";if(n===V||o[V]!==void 0)return o;if(n==="list")return c('Some state could be hidden when you use "state.list". Use "state" to see the complete list '),JSON.parse(JSON.stringify(o));if(typeof n=="string"){let i=r.length>0?"state."+r.concat(n).join("."):"state."+n;exports.internal.lastAccessedPath=i,exports.internal.tracking&&exports.internal.trackedPaths.add(i);}if(n==="_lastPath")return exports.internal.lastAccessedPath;if(n==="remove")return i=>(delete o[i],true);if(n==="removeAll")return ()=>{try{for(let i in o)typeof o[i]!="function"&&!["list","remove","removeAll","lock","unlock"].includes(i)&&delete o[i];}catch(i){console.error(i);}};if(Object.isFrozen(o[n]))return o[n];if(n==="lock"||n==="unlock"){let i=Reflect.get(o,n);if(i)return i}try{let i=Reflect.get(o,n);if(i&&typeof i=="object"&&["Array","Object"].includes(i.constructor.name)){let m=pe.get(i);return m||(m=he(i,t,r.concat(n)),pe.set(i,m)),m}return i}catch(i){console.error("Error: ",i);return}},set(o,n,i){if(exports.internal.locked)return console.error("Error: state is locked. Use state.unlock() to enable modifications."),false;if(be.includes(n))return console.error("key "+n+" is protected"),false;if(o[n]&&typeof o[n]=="object"&&Object.isFrozen(o[n]))return console.error(`Error: state '${n}' is locked`),false;if(o[n]&&typeof o[n]=="object"&&o[n].__locked)return console.error(`Error: state '${n}' is locked. Use state.${n}.unlock() to enable modifications.`),false;try{let m=ye(n,r),p=G(i);if(t({action:"set",path:m,target:o,newValue:p,previousValue:Reflect.get(o,n)}),s("state."+m),Reflect.set(o,n,p),exports.internal.bumpStateVersion(),o[n]&&typeof o[n]=="object"){let f=o[n];if(f&&typeof f=="object")try{Object.defineProperty(f,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!1}),Object.defineProperty(f,"lock",{writable:!1,enumerable:!1,configurable:!1,value:()=>{Object.defineProperty(f,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!0}),c(`State '${n}' is now locked.`);}}),Object.defineProperty(f,"unlock",{writable:!1,enumerable:!1,configurable:!1,value:()=>{Object.defineProperty(f,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!1}),c(`State '${n}' is now unlocked.`);}});}catch{}}return !0}catch(m){return console.error("Error in set trap:",m),false}},deleteProperty(o,n){try{let i=ye(n,r);return t({action:"delete",path:i,target:o}),Reflect.deleteProperty(o,n)}catch(i){return console.error("Error in deleteProperty trap:",i),false}},ownKeys(o){return Reflect.ownKeys(o)},getOwnPropertyDescriptor(o,n){return Reflect.getOwnPropertyDescriptor(o,n)}})},N=he({},()=>{});N.lock=()=>{exports.internal.locked=true,c("State is now locked. All modifications are blocked.");};N.unlock=()=>{exports.internal.locked=false,c("State is now unlocked. Modifications are allowed.");};a();B();P();b();var w=re(),le=new Map;function $(){let t=exports.internal.currentContext||""||"default";return le.has(t)||le.set(t,new Map),le.get(t)}var _=w!==null;function k(){let e=exports.internal.currentContext||"";return e?`${e}-`:"memorio_store_"}function ce(e){return !e||typeof e!="string"?(console.warn("[memorio store] key is empty or not a string \u2014 operation aborted"),""):e.length>512?(console.warn(`[memorio store] key "${e}" exceeds 512 chars \u2014 operation aborted`),""):k()+e}function ze(e){let t=_?w.getItem(e):$().get(e);return t&&JSON.parse(t)}function qe(e,t){let r=JSON.stringify(t);_?w.setItem(e,r):$().set(e,r);}function Je(e){if(_){if(w.getItem(e))return w.removeItem(e),true}else if($().has(e))return $().delete(e),true;return false}var D=new Proxy({},{});Object.defineProperty(globalThis,"store",{value:D,enumerable:false,configurable:true});Object.defineProperties(D,{get:{value:e=>{if(!e)return console.warn("[memorio store] store.get() called with empty or null key \u2014 returning null"),null;try{return ze(ce(e))}catch(t){exports.message(`Error parsing store item '${e}': ${t}`);}return null}},getMultiple:{value:e=>{let t={};for(let r of e)try{let s=D.get(r);s&&(t[r]=s);}catch(s){console.debug(`[memorio store] getMultiple error for key "${r}":`,s);}return t}},set:{value:(e,t)=>{if(!e)return console.warn("[memorio store] store.set() called with empty or null key \u2014 write aborted"),false;let r=ce(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio store] functions are not storable \u2014 write aborted for key: "+e),exports.message("Storing functions is not secure and is blocked for safety."),false;try{qe(r,t);}catch(s){return exports.message(`Error setting store item '${e}': ${s}`),false}return true}},remove:{value:e=>{if(!e)return console.debug("[memorio store] store.remove() called with empty or null key \u2014 returning false"),false;let t=ce(e);if(!t)return false;try{return Je(t)}catch(r){exports.message(`Error removing store item '${e}': ${r}`);}return false}},delete:{value:e=>D.remove(e)},removeAll:{value:()=>{if(_){let e=[];for(let t=0;t<w.length;t++){let r=w.key(t);r?.startsWith(k())&&e.push(r);}e.forEach(t=>w.removeItem(t));}else $().clear();return true}},clearAll:{value:()=>(D.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return _?Object.keys(w).forEach(t=>{if(t.startsWith(k())){let r=w.getItem(t);r&&(e+=r.length);}}):$().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>_},list:{value:()=>{let e={};try{if(_)for(let t=0;t<w.length;t++){let r=w.key(t);if(r?.startsWith(k())){let s=r.replace(k(),""),o=w.getItem(r);if(o!==null)try{e[s]=JSON.parse(o);}catch{e[s]=o;}}}else $().forEach((t,r)=>{if(r.startsWith(k())){let s=r.replace(k(),"");try{e[s]=JSON.parse(t);}catch{e[s]=t;}}});}catch(t){exports.message(`Error listing store items: ${t}`);}return e}}});Object.freeze(D);a();B();P();b();var S=te(),ue=new Map;function R(){let t=exports.internal.currentContext||""||"default";return ue.has(t)||ue.set(t,new Map),ue.get(t)}var A=S!==null;function I(){let e=exports.internal.currentContext||"";return e?`${e}-`:"memorio_session_"}function fe(e){return !e||typeof e!="string"?(console.warn("[memorio session] key is empty or not a string \u2014 operation aborted"),""):e.length>512?(console.warn(`[memorio session] key "${e}" exceeds 512 chars \u2014 operation aborted`),""):I()+e}function Ue(e){let t=A?S.getItem(e):R().get(e);return t&&JSON.parse(t)}function Ve(e,t){let r=JSON.stringify(t);A?S.setItem(e,r):R().set(e,r);}function Ke(e){if(A){if(S.getItem(e))return S.removeItem(e),true}else if(R().has(e))return R().delete(e),true;return false}var C=new Proxy({},{});Object.defineProperty(globalThis,"session",{value:C,enumerable:false,configurable:true});Object.defineProperties(C,{get:{value:e=>{if(!e)return console.warn("[memorio session] session.get() called with empty or null key \u2014 returning null"),null;try{return Ue(fe(e))}catch(t){exports.message(`Error parsing session item '${e}':${t}`);}return null}},set:{value:(e,t)=>{if(!e)return console.warn("[memorio session] session.set() called with empty or null key \u2014 write aborted"),false;let r=fe(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio session] functions are not storable \u2014 write aborted for key: "+e),exports.message("It's not secure to session functions."),false;try{Ve(r,t);}catch(s){return exports.message(`Error setting session item '${e}': ${s}`),false}return true}},remove:{value:e=>{if(!e)return console.warn("[memorio session] session.remove() called with empty or null key \u2014 returning false"),false;let t=fe(e);if(!t)return false;try{return Ke(t)}catch(r){exports.message(`Error removing session item '${e}': ${r}`);}return false}},delete:{value:e=>C.remove(e)},removeAll:{value:()=>{if(A){let e=[];for(let t=0;t<S.length;t++){let r=S.key(t);r?.startsWith(I())&&e.push(r);}e.forEach(t=>S.removeItem(t));}else R().clear();return true}},clearAll:{value:()=>(C.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return A?Object.keys(S).forEach(t=>{if(t.startsWith(I())){let r=S.getItem(t);r&&(e+=r.length);}}):R().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>A},list:{value:()=>{let e={};try{if(A)for(let t=0;t<S.length;t++){let r=S.key(t);if(r?.startsWith(I())){let s=r.replace(I(),""),o=S.getItem(r);if(o!==null)try{e[s]=JSON.parse(o);}catch{e[s]=o;}}}else R().forEach((t,r)=>{if(r.startsWith(I())){let s=r.replace(I(),"");try{e[s]=JSON.parse(t);}catch{e[s]=t;}}});}catch(t){exports.message(`Error listing session items: ${t}`);}return e}}});Object.freeze(C);a();var T={},F=new Proxy({},{get(e,t){let r=t;return r==="get"?s=>T[s]:r==="set"?(s,o)=>{T[s]=o;}:r==="remove"?s=>(delete T[s],true):r==="removeAll"?()=>(Object.keys(T).forEach(s=>delete T[s]),true):r==="clear"?()=>(Object.keys(T).forEach(s=>delete T[s]),true):r==="list"?()=>({...T}):T[r]},set(e,t,r){return T[t]=r,true},deleteProperty(e,t){return delete T[t],true}});Object.freeze(F);x();a();b();var Ie=false,it=(e,t=null,r=true)=>{Ie||(console.warn('DEPRECATED: "observer" is deprecated and will be removed in future versions. Please use "useObserver" instead.'),Ie=true);let s=n=>typeof n=="string"?n:n&&typeof n=="object"&&n.__path?n.__path:null,o=s(e);if(!e&&!t){console.error("Observer Error: You need to setup observer correctly, Some parameters are missed!");return}if(!e&&t){console.error("Observer Error: You need to declare what state need to be monitored as string like 'state.test'.");return}if(o){let n=o.split(".");if(n[0]!=="state"&&n[0]!=="store"){console.error(`Observer Error: You need to declare 'state.' or 'store.'. The '${o}' string is incorrect!`);return}}if(e&&!t){let n=s(e);if(!n)return;globalThis.observer?.list?.[n]&&v.remove(n),c(`called: ${n}`);return}if(e&&t){let n=s(e);if(!n)return;if(typeof e!="string"&&!(e&&typeof e=="object")){console.error("Observer Error: name of state need to be a 'string' like 'state.test' or a direct state value");return}let i=Array.isArray(t)?t:[t];globalThis.observer?.list?.[n]&&v.remove(n),i.forEach(p=>{typeof p=="function"&&v.listen(n,p,r);});return}},W=it;Object.defineProperties(W,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(v.remove(e),delete globalThis.events[e]);}},removeAll:{get:()=>{let e=globalThis.observer,t=e?.list;return t&&Object.keys(t).forEach(r=>{e?.remove?.(r);}),true}},has:{value:e=>!!globalThis.observer?.list?.[e]}});a();b();P();globalThis.useObserver||(globalThis.useObserver=null);Object.defineProperty(globalThis,"useObserver",{value:null,writable:true,enumerable:false,configurable:true});var H=((e,t=[])=>{if(!t||typeof e!="function")return ()=>{};let r=[],s=Array.isArray(t)&&!t.__path?t:[t];try{return s.forEach(o=>{let n="";if(typeof o=="function"){let i=exports.propertyName(o);i&&(n=i);}else typeof o=="object"&&o!==null&&(n=o.__path||(typeof o.toString=="function"&&o.toString()!=="[object Object]"?o.toString():""));if(n){n=n.replace(/^(\(\)\s*=>\s*)/,"").replace(/^globalThis\./,"").replace(/^state\./,"");let i=n.startsWith("store.")||n.startsWith("state.")?n:"state."+n;v.listen(i,()=>e()),r.push(i);}else {exports.internal.clearTrackedPaths(),exports.internal.tracking=!0;try{e();}catch{}exports.internal.tracking=!1,exports.internal.trackedPaths.forEach(i=>{r.includes(i)||(c(`useObserver: [Auto-Discovery] -> "${i}"`),v.listen(i,()=>e()),r.push(i));});}}),r.length>0?c(`useObserver: Monitoring ${r.length} paths.`):console.warn("useObserver: No paths resolved for monitoring. Check your dependencies!"),()=>{r.forEach(o=>{typeof v.remove=="function"&&(v.remove(o),c(`useObserver: Stopped monitoring "${o}"`));});}}catch(o){return c(`useObserver Error: ${o}`),()=>{}}});globalThis.useObserver=H;Object.freeze(globalThis.useObserver);b();a();P();function at(){return exports.internal.debug===true}function Ae(){if(!globalThis.store)return {};let e={},t=globalThis.store;if(typeof t.list=="function")try{return t.list()}catch{}if(typeof t.get=="function"){for(let r of Object.keys(t))if(!["get","set","remove","delete","removeAll","clearAll","size","isPersistent","list"].includes(r))try{let s=t.get(r);s!=null&&(e[r]=s);}catch{}}return e}function Re(){if(!globalThis.session)return {};let e={},t=globalThis.session;if(typeof t.list=="function")try{return t.list()}catch{}if(typeof t.get=="function"){for(let r of Object.keys(t))if(!["get","set","remove","delete","removeAll","clearAll","size","isPersistent","list"].includes(r))try{let s=t.get(r);s!=null&&(e[r]=s);}catch{}}return e}var lt=()=>{if(at()){if(globalThis.state){let e=globalThis.state.list,t;typeof e=="function"?t=e():typeof e=="object"&&e!==null?t=e:t=globalThis.state,console.table(t);}if(globalThis.store&&console.table(Ae()),globalThis.session&&console.table(Re()),globalThis.cache){let e=globalThis.cache.list,t;typeof e=="function"?t=e():typeof e=="object"&&e!==null?t=e:t=globalThis.cache,console.table(t);}}},ct=()=>{let e=t=>{if(!t)return 0;if(typeof t.list=="function")try{let r=t.list();return Object.keys(r).length}catch{}return Object.keys(t).length};return {stateKeys:e(globalThis.state),storeKeys:e(globalThis.store),sessionKeys:e(globalThis.session),cacheKeys:e(globalThis.cache),idbDatabases:0,lastUpdate:new Date().toISOString()}},U=e=>{globalThis[e]&&typeof globalThis[e].clear=="function"?globalThis[e].clear():console.error(`Module ${e} not found or does not support clear()`);},ut=()=>{U("state"),U("store"),U("session"),U("cache");},ft=()=>{let e=()=>{if(globalThis.state)try{return typeof globalThis.state.list=="function"?globalThis.state.list():globalThis.state}catch{return}},t=()=>Ae(),r=()=>Re(),s=()=>{if(globalThis.cache)try{return typeof globalThis.cache.list=="function"?globalThis.cache.list():globalThis.cache}catch{return}},o={state:e(),store:t(),session:r(),cache:s(),exportedAt:new Date().toISOString()};return JSON.stringify(o,null,2)},dt=e=>{try{let t=JSON.parse(e);t.state&&Object.entries(t.state).forEach(([r,s])=>{globalThis.state&&r!=="list"&&r!=="remove"&&r!=="removeAll"&&(globalThis.state[r]=s);}),t.store&&globalThis.store&&typeof globalThis.store.set=="function"&&Object.entries(t.store).forEach(([r,s])=>{globalThis.store.set(r,s);}),t.session&&globalThis.session&&typeof globalThis.session.set=="function"&&Object.entries(t.session).forEach(([r,s])=>{globalThis.session.set(r,s);}),t.cache&&globalThis.cache&&Object.entries(t.cache).forEach(([r,s])=>{globalThis.cache&&r!=="get"&&r!=="set"&&r!=="remove"&&r!=="clear"&&(globalThis.cache[r]=s);});}catch(t){console.error("%c\u2717 Import failed:","color: #F44336",t);}},mt=(e,t)=>{if(!globalThis[e]){console.error(`Module ${e} not found`);return}let r=globalThis[e],s=r[t];if(console.debug(`\u{1F441} Watching ${e}.${t} (initial: ${JSON.stringify(s)})`),e==="state"&&globalThis.memorio?.dispatch){let o=n=>{n.detail?.name?.includes(t)&&console.debug(`\u{1F441} Change: ${e}.${t} =`,n.detail.value);};r.addEventListener?.("memorio-change",o);}},gt=()=>{console.debug(`
|
|
2
|
+
\u{1F9E0} Memorio DevTools Help
|
|
3
|
+
|
|
4
|
+
Available commands:
|
|
5
|
+
memorio.devtools.inspect() - Inspect all state modules
|
|
6
|
+
memorio.devtools.stats() - Show statistics
|
|
7
|
+
memorio.devtools.clear('module') - Clear specific module
|
|
8
|
+
memorio.devtools.clearAll() - Clear all modules
|
|
9
|
+
memorio.devtools.exportData() - Export all data as JSON
|
|
10
|
+
memorio.devtools.importData(json) - Import data from JSON
|
|
11
|
+
memorio.devtools.watch(module, path) - Watch a path for changes
|
|
12
|
+
memorio.devtools.help() - Show this help
|
|
13
|
+
|
|
14
|
+
Shortcuts:
|
|
15
|
+
state - globalThis.state
|
|
16
|
+
store - globalThis.store
|
|
17
|
+
session - globalThis.session
|
|
18
|
+
cache - globalThis.cache
|
|
19
|
+
`);},de={inspect:lt,stats:ct,clear:U,clearAll:ut,exportData:ft,importData:dt,watch:mt,help:gt};a();P();b();var bt={enabled:true,logToConsole:true,modules:["state","store","session","cache","idb"],maxEntries:1e3};function pt(){return exports.internal.debug===true}var E={...bt},j=[],yt=e=>{E={...E,...e};},ht=()=>{E.enabled=true;},vt=()=>{E.enabled=false;},Be=e=>E.enabled&&E.modules.includes(e),xt=(e,t,r,s,o)=>{if(!Be(e))return;let n={timestamp:new Date().toISOString(),module:e,action:t,path:r,value:s,previousValue:o};if(j.push(n),j.length>E.maxEntries&&j.shift(),E.logToConsole&&pt()){let i=`[Memorio:${e.toUpperCase()}]`,m=wt(e);c(`%c${i}%c ${t} ${r},
|
|
20
|
+
color: ${m}; font-weight: bold,
|
|
21
|
+
color: inherit`),s!==void 0&&c(` \u2192 value:${s}`),o!==void 0&&c(` \u2190 previous:${o}`);}E.customHandler&&E.customHandler(n);},wt=e=>({state:"#4CAF50",store:"#2196F3",session:"#FF9800",cache:"#9C27B0",idb:"#F44336"})[e]||"#888888",St=()=>[...j],Pt=()=>{j.length=0;},Tt=()=>{let e={total:j.length,state:0,store:0,session:0,cache:0,idb:0,set:0,get:0,delete:0,clear:0};for(let t of j)if(t){let r=t.module,s=t.action;r&&typeof e[r]=="number"&&e[r]++,s&&typeof e[s]=="number"&&e[s]++;}return e},Ot=()=>JSON.stringify(j,null,2),me={configure:yt,enable:ht,disable:vt,isEnabled:Be,log:xt,getHistory:St,clearHistory:Pt,getStats:Tt,exportLogs:Ot};P();B();a();B();P();var ge={version:"4.7.0"};x();b();Object.defineProperty(globalThis,"memorio",{value:{setProps:()=>{},obj:{},array:[],dispatch:v,message:exports.message,devtools:de,logger:me,setDescription:()=>{}},writable:false,configurable:true,enumerable:false});Object.defineProperty(globalThis,"events",{value:{},writable:true,enumerable:false});Object.defineProperty(memorio,"version",{writable:false,enumerable:false,value:ge.version});Object.defineProperty(memorio,"debug",{get:()=>exports.internal.debug,set:e=>{exports.internal.debug=e;},enumerable:false});var Me=q();Object.defineProperty(memorio,"_platform",{writable:false,enumerable:false,value:Me.platform});Object.defineProperty(memorio,"_capabilities",{writable:false,enumerable:false,value:Me});Object.defineProperty(memorio,"_sessionId",{writable:false,enumerable:false,value:K()});ve();memorio.isBrowser=Q;memorio.isNode=X;memorio.isDeno=Z;memorio.isEdge=ee;memorio.getCapabilities=q;memorio.createContext=J;memorio.listContexts=ne;memorio.deleteContext=ie;memorio.isolate=e=>J(e);Object.defineProperty(globalThis,"state",{value:N,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"store",{value:D,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"session",{value:C,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"cache",{value:F,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"idb",{value:exports.idb,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"observer",{value:W,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"useObserver",{value:H,writable:true,enumerable:false,configurable:true});Object.defineProperty(memorio,"dispatch",{value:v,writable:true,enumerable:false,configurable:true});Object.defineProperty(memorio,"setContext",{writable:false,enumerable:false,value:e=>ae(e)});Object.defineProperty(memorio,"getContext",{writable:false,enumerable:false,value:()=>exports.internal.currentContext});Object.defineProperty(globalThis,"$state",{get:()=>globalThis.state,configurable:true});Object.defineProperty(globalThis,"$store",{get:()=>globalThis.store,configurable:true});Object.defineProperty(globalThis,"$session",{get:()=>globalThis.session,configurable:true});Object.defineProperty(globalThis,"$cache",{get:()=>globalThis.cache,configurable:true});memorio.help=function(){console.debug(`
|
|
22
|
+
\u{1F9E0} Memorio ${ge.version} - Help
|
|
23
|
+
|
|
24
|
+
Core Modules:
|
|
25
|
+
state - Reactive state management
|
|
26
|
+
store - Persistent storage (localStorage/Map)
|
|
27
|
+
session - Session storage (sessionStorage/Map)
|
|
28
|
+
cache - In-memory cache
|
|
29
|
+
idb - IndexedDB (browser only)
|
|
30
|
+
|
|
31
|
+
Context Management:
|
|
32
|
+
memorio.isolate(name) - Create isolated context
|
|
33
|
+
memorio.listContexts() - List all contexts
|
|
34
|
+
memorio.deleteContext(id) - Delete a context
|
|
35
|
+
|
|
36
|
+
Platform Detection:
|
|
37
|
+
memorio.isBrowser() - Browser environment
|
|
38
|
+
memorio.isNode() - Node.js environment
|
|
39
|
+
memorio.isDeno() - Deno environment
|
|
40
|
+
memorio.isEdge() - Edge/Worker environment
|
|
41
|
+
memorio.getCapabilities() - Full capabilities object
|
|
42
|
+
|
|
43
|
+
DevTools:
|
|
44
|
+
memorio.devtools.inspect() - Inspect all modules
|
|
45
|
+
memorio.devtools.stats() - Show statistics
|
|
46
|
+
memorio.devtools.watch() - Watch a path
|
|
47
|
+
memorio.devtools.exportData() - Export as JSON
|
|
48
|
+
memorio.devtools.importData() - Import from JSON
|
|
49
|
+
memorio.devtools.clear() - Clear specific module
|
|
50
|
+
memorio.devtools.clearAll() - Clear all modules
|
|
51
|
+
|
|
52
|
+
Shortcuts:
|
|
53
|
+
state, store, session, cache, idb - direct access to modules
|
|
54
|
+
`);};var Dt=globalThis.memorio,Ao=globalThis.events,Ro=e=>J(e),Bo=globalThis.memorio?.help,Mo=e=>exports.internal.currentContext=e,No=()=>exports.internal.currentContext,Lo=Dt;exports.cache=F;exports.createContext=J;exports.default=Lo;exports.deleteContext=ie;exports.devtools=de;exports.dispatch=v;exports.events=Ao;exports.getCapabilities=q;exports.getContext=No;exports.help=Bo;exports.isBrowser=Q;exports.isDeno=Z;exports.isEdge=ee;exports.isNode=X;exports.isolate=Ro;exports.listContexts=ne;exports.logger=me;exports.memorio=Dt;exports.observer=W;exports.session=C;exports.setContext=Mo;exports.state=N;exports.store=D;exports.useObserver=H;
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
///
|
|
2
|
+
// MEMORIO TYPE ENTRY POINT
|
|
3
|
+
// Re-exports the named module declarations from ./types/exports so that
|
|
4
|
+
// `import { state } from 'memorio'` (and default import) resolve correctly.
|
|
5
|
+
// The ambient global declarations (state, memorio, observer, ...) still live
|
|
6
|
+
// in ./types/*.d.ts and are loaded via the references below.
|
|
7
|
+
|
|
8
|
+
/// <reference path="./types/memorio.d.ts" />
|
|
9
|
+
/// <reference path="./types/observer.d.ts" />
|
|
10
|
+
/// <reference path="./types/useObserver.d.ts" />
|
|
11
|
+
/// <reference path="./types/state.d.ts" />
|
|
12
|
+
/// <reference path="./types/session.d.ts" />
|
|
13
|
+
/// <reference path="./types/store.d.ts" />
|
|
14
|
+
/// <reference path="./types/cache.d.ts" />
|
|
15
|
+
/// <reference path="./types/idb.d.ts" />
|
|
16
|
+
|
|
17
|
+
export * from './types/exports'
|
|
18
|
+
export { default } from './types/exports'
|
package/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import'path';import'url';var b=(e,t)=>()=>(e&&(t=e(e=0)),t);var a=b(()=>{});var h,Le,pe,G,u,T=b(()=>{a();h={debug:false,tracking:false,trackedPaths:new Set,locked:false,lastAccessedPath:"",stateVersion:0,currentContext:null},Le={get debug(){return h.debug},set debug(e){h.debug=e;},get tracking(){return h.tracking},set tracking(e){h.tracking=e;},get trackedPaths(){return h.trackedPaths},clearTrackedPaths(){h.trackedPaths.clear();},get locked(){return h.locked},set locked(e){h.locked=e;},get lastAccessedPath(){return h.lastAccessedPath},set lastAccessedPath(e){h.lastAccessedPath=e;},get stateVersion(){return h.stateVersion},bumpStateVersion(){return h.stateVersion=(h.stateVersion||0)+1,h.stateVersion},get currentContext(){return h.currentContext},set currentContext(e){h.currentContext=e;}},pe=["list","state","store","idb","observer","useObserver","remove","removeAll","_platform","_capabilities","_sessionId"],G=(e,t)=>String(t!==void 0?t:e).replace("() => ",""),u=Le;});var v,c,p=b(()=>{a();T();v=(...e)=>{u.debug===true&&console.debug(...e);},c=v;});function U(){let e=globalThis;if(typeof e.crypto<"u"&&e.crypto.randomUUID)return e.crypto.randomUUID();if(typeof e.crypto<"u"&&e.crypto.getRandomValues){let t=new Uint8Array(16);return e.crypto.getRandomValues(t),Array.from(t,r=>r.toString(16).padStart(2,"0")).join("")}return `session_${Date.now()}_${Math.random().toString(36).substring(2,15)}`}function q(){let e=globalThis;return e.Deno&&e.Deno.version?"deno":typeof process<"u"&&process.versions&&process.versions.node?"node":typeof globalThis<"u"&&typeof globalThis.ServiceWorkerGlobalScope<"u"?"edge":typeof window<"u"&&typeof document<"u"?"browser":"unknown"}function X(){return q()==="browser"}function Z(){return q()==="node"}function ee(){return q()==="deno"}function te(){return q()==="edge"}function re(){try{if(typeof sessionStorage<"u"){let e="__memorio_test__";return sessionStorage.setItem(e,"1"),sessionStorage.removeItem(e),sessionStorage}}catch{}return null}function oe(){try{if(typeof localStorage<"u"){let e="__memorio_test__";return localStorage.setItem(e,"1"),localStorage.removeItem(e),localStorage}}catch{}return null}function se(){return typeof indexedDB<"u"}function ze(){return typeof globalThis.dispatchEvent=="function"}function J(){let e=q(),t=typeof globalThis.isSecureContext<"u"?globalThis.isSecureContext:e==="browser";return {platform:e,hasSessionStorage:re()!==null,hasLocalStorage:oe()!==null,hasIndexedDB:se(),hasDispatchEvent:ze(),hasNavigator:typeof navigator<"u",hasProcess:typeof process<"u",isSecureContext:t,sessionId:U()}}function xe(){let e=J(),t=globalThis;e.hasDispatchEvent||(t.dispatchEvent=function(r){return true},typeof CustomEvent>"u"&&(t.CustomEvent=class{type;detail;constructor(s,o={}){this.type=s,this.detail=o;}})),typeof t.addEventListener!="function"&&(t.addEventListener=function(r,s){z.has(r)||z.set(r,[]),z.get(r).push(s);},t.removeEventListener=function(r,s){let o=z.get(r);if(o){let n=o.indexOf(s);n>-1&&o.splice(n,1);}},t.dispatchEvent=function(r){let s=z.get(r.type);return s&&s.forEach(o=>{try{o(r);}catch(n){console.error("Event listener error:",n);}}),true});}function V(e){let t=e||`context_${U()}`;le(t);let r={state:{},store:new Map,session:new Map,cache:new Map};return ne.set(t,r),{id:t,state:r.state,store:{get:s=>{let o=r.store.get(s);return o?JSON.parse(o):null},set:(s,o)=>{r.store.set(s,JSON.stringify(o));},remove:s=>r.store.delete(s),removeAll:()=>r.store.clear(),clearAll:()=>r.store.clear(),size:()=>r.store.size,isPersistent:false},session:{get:s=>{let o=r.session.get(s);return o?JSON.parse(o):null},set:(s,o)=>{r.session.set(s,JSON.stringify(o));},remove:s=>r.session.delete(s),removeAll:()=>r.session.clear(),clearAll:()=>r.session.clear(),size:()=>r.session.size,isPersistent:false},cache:{get:s=>r.cache.get(s),set:(s,o)=>r.cache.set(s,o),remove:s=>r.cache.delete(s),removeAll:()=>r.cache.clear(),clear:()=>r.cache.clear()}}}function ie(){return Array.from(ne.keys())}function ae(e){return ne.delete(e)}function le(e){u.currentContext=e;}var z,ne,M=b(()=>{a();T();z=new Map;ne=new Map;});var We={};var we=b(()=>{a();w();p();l.db.create=(e,t=1)=>new Promise((r,s)=>{if(!l.db.support())return s(new Error("IndexedDB not supported"));let o=globalThis.indexedDB.open(e,t);o.onerror=()=>{c(`IndexedDB error: ${o.error?.message}`),s(o.error);},o.onsuccess=()=>{c(`Database ${e} connected successfully`),r(o.result);},o.onupgradeneeded=()=>{c(`Database ${e} upgrade/creation initiated`);};});});var He={};var Se=b(()=>{a();w();l.db.list=async()=>{if(!("indexedDB"in globalThis)||!indexedDB.databases)return [];try{let e=await indexedDB.databases();return globalThis.idbases=e||[],await l.db.size(),globalThis.idbases}catch(e){return console.error("Error listing databases:",e),[]}};});var Ye={};var Pe=b(()=>{a();w();l.db.exist=e=>idbases?.some(t=>t.name===e);});var Ge={};var Te=b(()=>{a();w();l.db.quota=()=>navigator.storage.estimate();});var Qe={};var Oe=b(()=>{a();w();p();l.db.delete=e=>new Promise((t,r)=>{c(`Removing database ${e}...`),(()=>{let o=indexedDB.deleteDatabase(e);o.onsuccess=()=>{c(`${e} database removed successfully`),l.db.list(),t();},o.onerror=()=>{console.error(`Error removing ${e}:`,o.error),r(o.error);},o.onblocked=()=>{console.warn(`Deletion of ${e} is blocked. Please close other tabs.`);};})();});});var Xe={};var Ee=b(()=>{a();w();p();l.db.size=async()=>{if(!(!idbases||idbases.length===0))for(let e=0;e<idbases.length;e++){let t=idbases[e];try{let r=await l.db.create(t.name,t.version),s=Array.from(r.objectStoreNames),o=0;for(let n of s){let i=await l.table.size(r,n);o+=i;}t.size=o,r.close();}catch(r){c(`Could not calculate size for ${t.name}:${r}`);}}};});var Ze={};var De=b(()=>{a();w();l.db.version=e=>{let t=0;for(let r of idbases){r.name===e&&(t=r.version);break}return t};});var et={};var je=b(()=>{a();w();p();l.db.support=()=>{let e="indexedDB"in globalThis;return e||c("Your environment doesn't support IndexedDB"),e};});var tt={};var Ce=b(()=>{a();w();p();l.table.create=(e,t)=>new Promise((r,s)=>{try{let n=(Number(l.db.version(e))||0)+1,i=indexedDB.open(e,n);i.onupgradeneeded=g=>{let y=g.target.result;if(!y.objectStoreNames.contains(t)){let f=y.createObjectStore(t,{keyPath:"id",autoIncrement:!0});f.createIndex("id","id",{unique:!0}),f.createIndex("data","data",{unique:!1}),c(`Table ${t} created in ${e}`);}},i.onsuccess=()=>{i.result.close(),l.db.list(),r();},i.onerror=()=>{console.error(`Error creating table ${t}:`,i.error),s(i.error);};}catch(o){console.error("Critical error in table.create:",o),s(o);}});});var rt={};var ke=b(()=>{a();w();p();l.table.size=(e,t)=>new Promise((r,s)=>{if(!e)return s(new Error("Database instance is required"));if(!e.objectStoreNames.contains(t))return r(0);let o=0,n=0,y=e.transaction([t],"readonly").objectStore(t).openCursor();y.onsuccess=async f=>{let E=f.target.result;if(E){try{let N=E.value;o+=JSON.stringify(N).length;}catch(N){c(`Error stringifying IDB value tracking size:${N}`);}n++,n%200===0&&await new Promise(N=>setTimeout(N,0)),E.continue();}else r(o);},y.onerror=()=>{s(y.error);};});});var ot={};var _e=b(()=>{a();w();p();l.data.delete=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=()=>{let i=n.result;if(!i.objectStoreNames.contains(t))return i.close(),o(new Error(`Table ${t} not found`));let f=i.transaction(t,"readwrite").objectStore(t).delete(r);f.onsuccess=()=>{i.close(),c(`Record ${r} deleted from ${t}`),s();},f.onerror=()=>{i.close(),o(f.error);};},n.onerror=()=>o(n.error);});l.data.delete.all=(e,t)=>new Promise((r,s)=>{let o=indexedDB.open(e);o.onsuccess=n=>{let i=n.target.result;if(!i.objectStoreNames.contains(t))return i.close(),s(new Error(`Table ${t} not found`));let f=i.transaction(t,"readwrite").objectStore(t).clear();f.onsuccess=()=>{i.close(),c(`All data cleared from ${t}`),r();},f.onerror=()=>{i.close(),s(f.error);};},o.onerror=()=>s(o.error);});});var st={};var $e=b(()=>{a();w();p();l.data.set=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=()=>{let i=n.result;if(!i.objectStoreNames.contains(t))return i.close(),o(new Error(`Table ${t} does not exist in ${e}`));let f=i.transaction(t,"readwrite").objectStore(t).put(r);f.onsuccess=()=>{i.close(),c(`Data saved in ${e}.${t}`),s(f.result);},f.onerror=E=>{i.close(),c(`Database insert error: ${f.error?.message}`),o(f.error);};},n.onerror=()=>{o(n.error);};});});var nt={};var Ie=b(()=>{a();w();l.data.get=(e,t,r)=>new Promise((s,o)=>{let n=indexedDB.open(e);n.onsuccess=i=>{let g=i.target.result;if(!g.objectStoreNames.contains(t))return g.close(),o(new Error(`Table ${t} not found in ${e}`));let E=g.transaction(t,"readonly").objectStore(t).get(r);E.onsuccess=()=>{g.close(),s(E.result);},E.onerror=()=>{g.close(),o(E.error);};},n.onerror=()=>{o(n.error);};});});var it,l,w=b(()=>{a();M();it=se(),l={db:{},table:{},data:{}};it?(async()=>(Object.defineProperty(l,"db",{value:{},writable:true,configurable:true}),Object.defineProperty(l,"table",{value:{},writable:true,configurable:true}),Object.defineProperty(l,"data",{value:{},writable:true,configurable:true}),Object.defineProperty(globalThis,"idbases",{value:[],writable:true,configurable:true,enumerable:false}),await Promise.all([Promise.resolve().then(()=>(we(),We)),Promise.resolve().then(()=>(Se(),He)),Promise.resolve().then(()=>(Pe(),Ye)),Promise.resolve().then(()=>(Te(),Ge)),Promise.resolve().then(()=>(Oe(),Qe)),Promise.resolve().then(()=>(Ee(),Xe)),Promise.resolve().then(()=>(De(),Ze)),Promise.resolve().then(()=>(je(),et)),Promise.resolve().then(()=>(Ce(),tt)),Promise.resolve().then(()=>(ke(),rt)),Promise.resolve().then(()=>(_e(),ot)),Promise.resolve().then(()=>($e(),st)),Promise.resolve().then(()=>(Ie(),nt))]),Object.preventExtensions(l),Object.seal(l),Object.freeze(l)))():(l._disabled=true,l._warning="IndexedDB is not available in this environment (Node.js/Deno). Use store or session for persistence.",console.warn("Memorio IDB: IndexedDB is not available in this environment. Use store or session for data persistence."));});a();a();T();p();a();var x={set:(e,t={})=>{globalThis.dispatchEvent(new CustomEvent(String(e),t));},listen:(e,t=null,r)=>{if(globalThis.events?.[e])return;let s=t?o=>{let n=o;return globalThis.queueMicrotask?globalThis.queueMicrotask(()=>t(n)):Promise.resolve().then(()=>t(n))}:void 0;s&&globalThis.addEventListener(e,s),s&&(globalThis.events[e]=s);},remove:e=>{let t=globalThis.events?.[e];t&&(globalThis.removeEventListener(e,t),delete globalThis.events[e]);}};var F=Symbol("memorio.target"),ye=new WeakMap,Q=(e,t=null)=>{if(e===null||typeof e!="object")return e;if(e[F]!==void 0)return Q(e[F],t);if(t){if(t.has(e))return e;t.add(e);}let r=e.constructor?.name;if(r!=="Object"&&r!=="Array")return e;let s=Array.isArray(e)?[]:{};for(let o of Reflect.ownKeys(e))s[o]=Q(e[o],t);return s},he=(e,t,r=".")=>t.concat(e).join(r),ve=(e,t,r=[])=>{let s=o=>{try{x.set(o,{detail:{name:o}});}catch{}};return new Proxy(e,{get(o,n){if(n==="__path")return r.length>0?"state."+r.join("."):"state";if(n===F||o[F]!==void 0)return o;if(n==="list")return c('Some state could be hidden when you use "state.list". Use "state" to see the complete list '),JSON.parse(JSON.stringify(o));if(typeof n=="string"){let i=r.length>0?"state."+r.concat(n).join("."):"state."+n;u.lastAccessedPath=i,u.tracking&&u.trackedPaths.add(i);}if(n==="_lastPath")return u.lastAccessedPath;if(n==="remove")return i=>(delete o[i],true);if(n==="removeAll")return ()=>{try{for(let i in o)typeof o[i]!="function"&&!["list","remove","removeAll","lock","unlock"].includes(i)&&delete o[i];}catch(i){console.error(i);}};if(Object.isFrozen(o[n]))return o[n];if(n==="lock"||n==="unlock"){let i=Reflect.get(o,n);if(i)return i}try{let i=Reflect.get(o,n);if(i&&typeof i=="object"&&["Array","Object"].includes(i.constructor.name)){let g=ye.get(i);return g||(g=ve(i,t,r.concat(n)),ye.set(i,g)),g}return i}catch(i){console.error("Error: ",i);return}},set(o,n,i){if(u.locked)return console.error("Error: state is locked. Use state.unlock() to enable modifications."),false;if(pe.includes(n))return console.error("key "+n+" is protected"),false;if(o[n]&&typeof o[n]=="object"&&Object.isFrozen(o[n]))return console.error(`Error: state '${n}' is locked`),false;if(o[n]&&typeof o[n]=="object"&&o[n].__locked)return console.error(`Error: state '${n}' is locked. Use state.${n}.unlock() to enable modifications.`),false;try{let g=he(n,r),y=Q(i);if(t({action:"set",path:g,target:o,newValue:y,previousValue:Reflect.get(o,n)}),s("state."+g),Reflect.set(o,n,y),u.bumpStateVersion(),o[n]&&typeof o[n]=="object"){let f=o[n];if(f&&typeof f=="object")try{Object.defineProperty(f,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!1}),Object.defineProperty(f,"lock",{writable:!1,enumerable:!1,configurable:!1,value:()=>{Object.defineProperty(f,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!0}),c(`State '${n}' is now locked.`);}}),Object.defineProperty(f,"unlock",{writable:!1,enumerable:!1,configurable:!1,value:()=>{Object.defineProperty(f,"__locked",{writable:!0,enumerable:!1,configurable:!1,value:!1}),c(`State '${n}' is now unlocked.`);}});}catch{}}return !0}catch(g){return console.error("Error in set trap:",g),false}},deleteProperty(o,n){try{let i=he(n,r);return t({action:"delete",path:i,target:o}),Reflect.deleteProperty(o,n)}catch(i){return console.error("Error in deleteProperty trap:",i),false}},ownKeys(o){return Reflect.ownKeys(o)},getOwnPropertyDescriptor(o,n){return Reflect.getOwnPropertyDescriptor(o,n)}})},L=ve({},()=>{});L.lock=()=>{u.locked=true,c("State is now locked. All modifications are blocked.");};L.unlock=()=>{u.locked=false,c("State is now unlocked. Modifications are allowed.");};a();M();T();p();var S=oe(),ce=new Map;function I(){let t=u.currentContext||""||"default";return ce.has(t)||ce.set(t,new Map),ce.get(t)}var $=S!==null;function _(){let e=u.currentContext||"";return e?`${e}-`:"memorio_store_"}function ue(e){return !e||typeof e!="string"?(console.warn("[memorio store] key is empty or not a string \u2014 operation aborted"),""):e.length>512?(console.warn(`[memorio store] key "${e}" exceeds 512 chars \u2014 operation aborted`),""):_()+e}function qe(e){let t=$?S.getItem(e):I().get(e);return t&&JSON.parse(t)}function Je(e,t){let r=JSON.stringify(t);$?S.setItem(e,r):I().set(e,r);}function Ve(e){if($){if(S.getItem(e))return S.removeItem(e),true}else if(I().has(e))return I().delete(e),true;return false}var j=new Proxy({},{});Object.defineProperty(globalThis,"store",{value:j,enumerable:false,configurable:true});Object.defineProperties(j,{get:{value:e=>{if(!e)return console.warn("[memorio store] store.get() called with empty or null key \u2014 returning null"),null;try{return qe(ue(e))}catch(t){v(`Error parsing store item '${e}': ${t}`);}return null}},getMultiple:{value:e=>{let t={};for(let r of e)try{let s=j.get(r);s&&(t[r]=s);}catch(s){console.debug(`[memorio store] getMultiple error for key "${r}":`,s);}return t}},set:{value:(e,t)=>{if(!e)return console.warn("[memorio store] store.set() called with empty or null key \u2014 write aborted"),false;let r=ue(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio store] functions are not storable \u2014 write aborted for key: "+e),v("Storing functions is not secure and is blocked for safety."),false;try{Je(r,t);}catch(s){return v(`Error setting store item '${e}': ${s}`),false}return true}},remove:{value:e=>{if(!e)return console.debug("[memorio store] store.remove() called with empty or null key \u2014 returning false"),false;let t=ue(e);if(!t)return false;try{return Ve(t)}catch(r){v(`Error removing store item '${e}': ${r}`);}return false}},delete:{value:e=>j.remove(e)},removeAll:{value:()=>{if($){let e=[];for(let t=0;t<S.length;t++){let r=S.key(t);r?.startsWith(_())&&e.push(r);}e.forEach(t=>S.removeItem(t));}else I().clear();return true}},clearAll:{value:()=>(j.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return $?Object.keys(S).forEach(t=>{if(t.startsWith(_())){let r=S.getItem(t);r&&(e+=r.length);}}):I().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>$},list:{value:()=>{let e={};try{if($)for(let t=0;t<S.length;t++){let r=S.key(t);if(r?.startsWith(_())){let s=r.replace(_(),""),o=S.getItem(r);if(o!==null)try{e[s]=JSON.parse(o);}catch{e[s]=o;}}}else I().forEach((t,r)=>{if(r.startsWith(_())){let s=r.replace(_(),"");try{e[s]=JSON.parse(t);}catch{e[s]=t;}}});}catch(t){v(`Error listing store items: ${t}`);}return e}}});Object.freeze(j);a();M();T();p();var P=re(),fe=new Map;function R(){let t=u.currentContext||""||"default";return fe.has(t)||fe.set(t,new Map),fe.get(t)}var B=P!==null;function A(){let e=u.currentContext||"";return e?`${e}-`:"memorio_session_"}function me(e){return !e||typeof e!="string"?(console.warn("[memorio session] key is empty or not a string \u2014 operation aborted"),""):e.length>512?(console.warn(`[memorio session] key "${e}" exceeds 512 chars \u2014 operation aborted`),""):A()+e}function Ke(e){let t=B?P.getItem(e):R().get(e);return t&&JSON.parse(t)}function Fe(e,t){let r=JSON.stringify(t);B?P.setItem(e,r):R().set(e,r);}function Ue(e){if(B){if(P.getItem(e))return P.removeItem(e),true}else if(R().has(e))return R().delete(e),true;return false}var C=new Proxy({},{});Object.defineProperty(globalThis,"session",{value:C,enumerable:false,configurable:true});Object.defineProperties(C,{get:{value:e=>{if(!e)return console.warn("[memorio session] session.get() called with empty or null key \u2014 returning null"),null;try{return Ke(me(e))}catch(t){v(`Error parsing session item '${e}':${t}`);}return null}},set:{value:(e,t)=>{if(!e)return console.warn("[memorio session] session.set() called with empty or null key \u2014 write aborted"),false;let r=me(e);if(!r)return false;if(typeof t=="function")return console.warn("[memorio session] functions are not storable \u2014 write aborted for key: "+e),v("It's not secure to session functions."),false;try{Fe(r,t);}catch(s){return v(`Error setting session item '${e}': ${s}`),false}return true}},remove:{value:e=>{if(!e)return console.warn("[memorio session] session.remove() called with empty or null key \u2014 returning false"),false;let t=me(e);if(!t)return false;try{return Ue(t)}catch(r){v(`Error removing session item '${e}': ${r}`);}return false}},delete:{value:e=>C.remove(e)},removeAll:{value:()=>{if(B){let e=[];for(let t=0;t<P.length;t++){let r=P.key(t);r?.startsWith(A())&&e.push(r);}e.forEach(t=>P.removeItem(t));}else R().clear();return true}},clearAll:{value:()=>(C.removeAll(),true)},quota:{value:async()=>[0,0]},size:{value:()=>{let e=0;return B?Object.keys(P).forEach(t=>{if(t.startsWith(A())){let r=P.getItem(t);r&&(e+=r.length);}}):R().forEach(t=>{e+=t.length;}),e}},isPersistent:{get:()=>B},list:{value:()=>{let e={};try{if(B)for(let t=0;t<P.length;t++){let r=P.key(t);if(r?.startsWith(A())){let s=r.replace(A(),""),o=P.getItem(r);if(o!==null)try{e[s]=JSON.parse(o);}catch{e[s]=o;}}}else R().forEach((t,r)=>{if(r.startsWith(A())){let s=r.replace(A(),"");try{e[s]=JSON.parse(t);}catch{e[s]=t;}}});}catch(t){v(`Error listing session items: ${t}`);}return e}}});Object.freeze(C);a();var O={},W=new Proxy({},{get(e,t){let r=t;return r==="get"?s=>O[s]:r==="set"?(s,o)=>{O[s]=o;}:r==="remove"?s=>(delete O[s],true):r==="removeAll"?()=>(Object.keys(O).forEach(s=>delete O[s]),true):r==="clear"?()=>(Object.keys(O).forEach(s=>delete O[s]),true):r==="list"?()=>({...O}):O[r]},set(e,t,r){return O[t]=r,true},deleteProperty(e,t){return delete O[t],true}});Object.freeze(W);w();a();p();var Ae=false,at=(e,t=null,r=true)=>{Ae||(console.warn('DEPRECATED: "observer" is deprecated and will be removed in future versions. Please use "useObserver" instead.'),Ae=true);let s=n=>typeof n=="string"?n:n&&typeof n=="object"&&n.__path?n.__path:null,o=s(e);if(!e&&!t){console.error("Observer Error: You need to setup observer correctly, Some parameters are missed!");return}if(!e&&t){console.error("Observer Error: You need to declare what state need to be monitored as string like 'state.test'.");return}if(o){let n=o.split(".");if(n[0]!=="state"&&n[0]!=="store"){console.error(`Observer Error: You need to declare 'state.' or 'store.'. The '${o}' string is incorrect!`);return}}if(e&&!t){let n=s(e);if(!n)return;globalThis.observer?.list?.[n]&&x.remove(n),c(`called: ${n}`);return}if(e&&t){let n=s(e);if(!n)return;if(typeof e!="string"&&!(e&&typeof e=="object")){console.error("Observer Error: name of state need to be a 'string' like 'state.test' or a direct state value");return}let i=Array.isArray(t)?t:[t];globalThis.observer?.list?.[n]&&x.remove(n),i.forEach(y=>{typeof y=="function"&&x.listen(n,y,r);});return}},H=at;Object.defineProperties(H,{list:{get:()=>globalThis.events},remove:{value:e=>{e&&(x.remove(e),delete globalThis.events[e]);}},removeAll:{get:()=>{let e=globalThis.observer,t=e?.list;return t&&Object.keys(t).forEach(r=>{e?.remove?.(r);}),true}},has:{value:e=>!!globalThis.observer?.list?.[e]}});a();p();T();globalThis.useObserver||(globalThis.useObserver=null);Object.defineProperty(globalThis,"useObserver",{value:null,writable:true,enumerable:false,configurable:true});var Y=((e,t=[])=>{if(!t||typeof e!="function")return ()=>{};let r=[],s=Array.isArray(t)&&!t.__path?t:[t];try{return s.forEach(o=>{let n="";if(typeof o=="function"){let i=G(o);i&&(n=i);}else typeof o=="object"&&o!==null&&(n=o.__path||(typeof o.toString=="function"&&o.toString()!=="[object Object]"?o.toString():""));if(n){n=n.replace(/^(\(\)\s*=>\s*)/,"").replace(/^globalThis\./,"").replace(/^state\./,"");let i=n.startsWith("store.")||n.startsWith("state.")?n:"state."+n;x.listen(i,()=>e()),r.push(i);}else {u.clearTrackedPaths(),u.tracking=!0;try{e();}catch{}u.tracking=!1,u.trackedPaths.forEach(i=>{r.includes(i)||(c(`useObserver: [Auto-Discovery] -> "${i}"`),x.listen(i,()=>e()),r.push(i));});}}),r.length>0?c(`useObserver: Monitoring ${r.length} paths.`):console.warn("useObserver: No paths resolved for monitoring. Check your dependencies!"),()=>{r.forEach(o=>{typeof x.remove=="function"&&(x.remove(o),c(`useObserver: Stopped monitoring "${o}"`));});}}catch(o){return c(`useObserver Error: ${o}`),()=>{}}});globalThis.useObserver=Y;Object.freeze(globalThis.useObserver);p();a();T();function lt(){return u.debug===true}function Be(){if(!globalThis.store)return {};let e={},t=globalThis.store;if(typeof t.list=="function")try{return t.list()}catch{}if(typeof t.get=="function"){for(let r of Object.keys(t))if(!["get","set","remove","delete","removeAll","clearAll","size","isPersistent","list"].includes(r))try{let s=t.get(r);s!=null&&(e[r]=s);}catch{}}return e}function Re(){if(!globalThis.session)return {};let e={},t=globalThis.session;if(typeof t.list=="function")try{return t.list()}catch{}if(typeof t.get=="function"){for(let r of Object.keys(t))if(!["get","set","remove","delete","removeAll","clearAll","size","isPersistent","list"].includes(r))try{let s=t.get(r);s!=null&&(e[r]=s);}catch{}}return e}var ct=()=>{if(lt()){if(globalThis.state){let e=globalThis.state.list,t;typeof e=="function"?t=e():typeof e=="object"&&e!==null?t=e:t=globalThis.state,console.table(t);}if(globalThis.store&&console.table(Be()),globalThis.session&&console.table(Re()),globalThis.cache){let e=globalThis.cache.list,t;typeof e=="function"?t=e():typeof e=="object"&&e!==null?t=e:t=globalThis.cache,console.table(t);}}},ut=()=>{let e=t=>{if(!t)return 0;if(typeof t.list=="function")try{let r=t.list();return Object.keys(r).length}catch{}return Object.keys(t).length};return {stateKeys:e(globalThis.state),storeKeys:e(globalThis.store),sessionKeys:e(globalThis.session),cacheKeys:e(globalThis.cache),idbDatabases:0,lastUpdate:new Date().toISOString()}},K=e=>{globalThis[e]&&typeof globalThis[e].clear=="function"?globalThis[e].clear():console.error(`Module ${e} not found or does not support clear()`);},ft=()=>{K("state"),K("store"),K("session"),K("cache");},mt=()=>{let e=()=>{if(globalThis.state)try{return typeof globalThis.state.list=="function"?globalThis.state.list():globalThis.state}catch{return}},t=()=>Be(),r=()=>Re(),s=()=>{if(globalThis.cache)try{return typeof globalThis.cache.list=="function"?globalThis.cache.list():globalThis.cache}catch{return}},o={state:e(),store:t(),session:r(),cache:s(),exportedAt:new Date().toISOString()};return JSON.stringify(o,null,2)},dt=e=>{try{let t=JSON.parse(e);t.state&&Object.entries(t.state).forEach(([r,s])=>{globalThis.state&&r!=="list"&&r!=="remove"&&r!=="removeAll"&&(globalThis.state[r]=s);}),t.store&&globalThis.store&&typeof globalThis.store.set=="function"&&Object.entries(t.store).forEach(([r,s])=>{globalThis.store.set(r,s);}),t.session&&globalThis.session&&typeof globalThis.session.set=="function"&&Object.entries(t.session).forEach(([r,s])=>{globalThis.session.set(r,s);}),t.cache&&globalThis.cache&&Object.entries(t.cache).forEach(([r,s])=>{globalThis.cache&&r!=="get"&&r!=="set"&&r!=="remove"&&r!=="clear"&&(globalThis.cache[r]=s);});}catch(t){console.error("%c\u2717 Import failed:","color: #F44336",t);}},gt=(e,t)=>{if(!globalThis[e]){console.error(`Module ${e} not found`);return}let r=globalThis[e],s=r[t];if(console.debug(`\u{1F441} Watching ${e}.${t} (initial: ${JSON.stringify(s)})`),e==="state"&&globalThis.memorio?.dispatch){let o=n=>{n.detail?.name?.includes(t)&&console.debug(`\u{1F441} Change: ${e}.${t} =`,n.detail.value);};r.addEventListener?.("memorio-change",o);}},bt=()=>{console.debug(`
|
|
2
|
+
\u{1F9E0} Memorio DevTools Help
|
|
3
|
+
|
|
4
|
+
Available commands:
|
|
5
|
+
memorio.devtools.inspect() - Inspect all state modules
|
|
6
|
+
memorio.devtools.stats() - Show statistics
|
|
7
|
+
memorio.devtools.clear('module') - Clear specific module
|
|
8
|
+
memorio.devtools.clearAll() - Clear all modules
|
|
9
|
+
memorio.devtools.exportData() - Export all data as JSON
|
|
10
|
+
memorio.devtools.importData(json) - Import data from JSON
|
|
11
|
+
memorio.devtools.watch(module, path) - Watch a path for changes
|
|
12
|
+
memorio.devtools.help() - Show this help
|
|
13
|
+
|
|
14
|
+
Shortcuts:
|
|
15
|
+
state - globalThis.state
|
|
16
|
+
store - globalThis.store
|
|
17
|
+
session - globalThis.session
|
|
18
|
+
cache - globalThis.cache
|
|
19
|
+
`);},de={inspect:ct,stats:ut,clear:K,clearAll:ft,exportData:mt,importData:dt,watch:gt,help:bt};a();T();p();var pt={enabled:true,logToConsole:true,modules:["state","store","session","cache","idb"],maxEntries:1e3};function yt(){return u.debug===true}var D={...pt},k=[],ht=e=>{D={...D,...e};},vt=()=>{D.enabled=true;},xt=()=>{D.enabled=false;},Me=e=>D.enabled&&D.modules.includes(e),wt=(e,t,r,s,o)=>{if(!Me(e))return;let n={timestamp:new Date().toISOString(),module:e,action:t,path:r,value:s,previousValue:o};if(k.push(n),k.length>D.maxEntries&&k.shift(),D.logToConsole&&yt()){let i=`[Memorio:${e.toUpperCase()}]`,g=St(e);c(`%c${i}%c ${t} ${r},
|
|
20
|
+
color: ${g}; font-weight: bold,
|
|
21
|
+
color: inherit`),s!==void 0&&c(` \u2192 value:${s}`),o!==void 0&&c(` \u2190 previous:${o}`);}D.customHandler&&D.customHandler(n);},St=e=>({state:"#4CAF50",store:"#2196F3",session:"#FF9800",cache:"#9C27B0",idb:"#F44336"})[e]||"#888888",Pt=()=>[...k],Tt=()=>{k.length=0;},Ot=()=>{let e={total:k.length,state:0,store:0,session:0,cache:0,idb:0,set:0,get:0,delete:0,clear:0};for(let t of k)if(t){let r=t.module,s=t.action;r&&typeof e[r]=="number"&&e[r]++,s&&typeof e[s]=="number"&&e[s]++;}return e},Et=()=>JSON.stringify(k,null,2),ge={configure:ht,enable:vt,disable:xt,isEnabled:Me,log:wt,getHistory:Pt,clearHistory:Tt,getStats:Ot,exportLogs:Et};T();M();a();M();T();var be={version:"4.7.0"};w();p();Object.defineProperty(globalThis,"memorio",{value:{setProps:()=>{},obj:{},array:[],dispatch:x,message:v,devtools:de,logger:ge,setDescription:()=>{}},writable:false,configurable:true,enumerable:false});Object.defineProperty(globalThis,"events",{value:{},writable:true,enumerable:false});Object.defineProperty(memorio,"version",{writable:false,enumerable:false,value:be.version});Object.defineProperty(memorio,"debug",{get:()=>u.debug,set:e=>{u.debug=e;},enumerable:false});var Ne=J();Object.defineProperty(memorio,"_platform",{writable:false,enumerable:false,value:Ne.platform});Object.defineProperty(memorio,"_capabilities",{writable:false,enumerable:false,value:Ne});Object.defineProperty(memorio,"_sessionId",{writable:false,enumerable:false,value:U()});xe();memorio.isBrowser=X;memorio.isNode=Z;memorio.isDeno=ee;memorio.isEdge=te;memorio.getCapabilities=J;memorio.createContext=V;memorio.listContexts=ie;memorio.deleteContext=ae;memorio.isolate=e=>V(e);Object.defineProperty(globalThis,"state",{value:L,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"store",{value:j,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"session",{value:C,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"cache",{value:W,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"idb",{value:l,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"observer",{value:H,writable:true,enumerable:false,configurable:true});Object.defineProperty(globalThis,"useObserver",{value:Y,writable:true,enumerable:false,configurable:true});Object.defineProperty(memorio,"dispatch",{value:x,writable:true,enumerable:false,configurable:true});Object.defineProperty(memorio,"setContext",{writable:false,enumerable:false,value:e=>le(e)});Object.defineProperty(memorio,"getContext",{writable:false,enumerable:false,value:()=>u.currentContext});Object.defineProperty(globalThis,"$state",{get:()=>globalThis.state,configurable:true});Object.defineProperty(globalThis,"$store",{get:()=>globalThis.store,configurable:true});Object.defineProperty(globalThis,"$session",{get:()=>globalThis.session,configurable:true});Object.defineProperty(globalThis,"$cache",{get:()=>globalThis.cache,configurable:true});memorio.help=function(){console.debug(`
|
|
22
|
+
\u{1F9E0} Memorio ${be.version} - Help
|
|
23
|
+
|
|
24
|
+
Core Modules:
|
|
25
|
+
state - Reactive state management
|
|
26
|
+
store - Persistent storage (localStorage/Map)
|
|
27
|
+
session - Session storage (sessionStorage/Map)
|
|
28
|
+
cache - In-memory cache
|
|
29
|
+
idb - IndexedDB (browser only)
|
|
30
|
+
|
|
31
|
+
Context Management:
|
|
32
|
+
memorio.isolate(name) - Create isolated context
|
|
33
|
+
memorio.listContexts() - List all contexts
|
|
34
|
+
memorio.deleteContext(id) - Delete a context
|
|
35
|
+
|
|
36
|
+
Platform Detection:
|
|
37
|
+
memorio.isBrowser() - Browser environment
|
|
38
|
+
memorio.isNode() - Node.js environment
|
|
39
|
+
memorio.isDeno() - Deno environment
|
|
40
|
+
memorio.isEdge() - Edge/Worker environment
|
|
41
|
+
memorio.getCapabilities() - Full capabilities object
|
|
42
|
+
|
|
43
|
+
DevTools:
|
|
44
|
+
memorio.devtools.inspect() - Inspect all modules
|
|
45
|
+
memorio.devtools.stats() - Show statistics
|
|
46
|
+
memorio.devtools.watch() - Watch a path
|
|
47
|
+
memorio.devtools.exportData() - Export as JSON
|
|
48
|
+
memorio.devtools.importData() - Import from JSON
|
|
49
|
+
memorio.devtools.clear() - Clear specific module
|
|
50
|
+
memorio.devtools.clearAll() - Clear all modules
|
|
51
|
+
|
|
52
|
+
Shortcuts:
|
|
53
|
+
state, store, session, cache, idb - direct access to modules
|
|
54
|
+
`);};var jt=globalThis.memorio,Lo=globalThis.events,zo=e=>V(e),qo=globalThis.memorio?.help,Jo=e=>u.currentContext=e,Vo=()=>u.currentContext,Ko=jt;export{W as cache,V as createContext,Ko as default,ae as deleteContext,de as devtools,x as dispatch,Lo as events,J as getCapabilities,Vo as getContext,qo as help,l as idb,u as internal,X as isBrowser,ee as isDeno,te as isEdge,Z as isNode,zo as isolate,ie as listContexts,ge as logger,jt as memorio,v as message,H as observer,G as propertyName,C as session,Jo as setContext,L as state,j as store,Y as useObserver};
|