memorio 2.9.0 → 2.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,470 +1,432 @@
1
- # [memorio](https://npmjs.com/package/memorio)
2
-
3
- > A lightweight, type-safe state management library for JavaScript applications
4
-
5
- [![version](https://img.shields.io/npm/v/memorio.svg)](https://npmjs.org/package/memorio)
6
- [![install size](https://img.shields.io/badge/dynamic/json?url=https://packagephobia.com/v2/api.json?p=memorio&query=$.install.pretty&label=install%20size&style=flat-square)](https://packagephobia.now.sh/result?p=memorio)
7
- [![downloads](https://img.shields.io/npm/dm/memorio.svg)](https://npmjs.org/package/memorio)
8
-
9
- ![Node.js](https://img.shields.io/badge/Node.js-gray?logo=node.js)
10
- ![React](https://img.shields.io/badge/React-gray?logo=React)
11
- ![Javascript](https://img.shields.io/badge/Javascript-gray?logo=Javascript)
12
- ![TypeScript](https://img.shields.io/badge/TypeScript-gray?logo=typescript)
13
- ![esbuild](https://img.shields.io/badge/esbuild-gray?logo=esbuild)
14
-
15
- ![Jest](https://img.shields.io/badge/Jest-gray?logo=jest)
16
- ![ESLint](https://img.shields.io/badge/Eslint-gray?logo=eslint)
17
- ![Playwright](https://img.shields.io/badge/Playwright-gray?logo=playwright)
18
-
19
- [![GitBook](https://img.shields.io/static/v1?message=Documented%20on%20GitBook&logo=gitbook&logoColor=ffffff&label=%20&labelColor=5c5c5c&color=3F89A1)](https://a51.gitbook.io/memorio)
20
-
21
- ---
22
-
23
- ## Table of Contents
24
-
25
- - [Features](#features)
26
- - [Installation](#installation)
27
- - [Quick Start](#quick-start)
28
- - [API Reference](#api-reference)
29
- - [State Management](#state-management)
30
- - [Observer](#observer)
31
- - [useObserver](#useobserver)
32
- - [Store](#store)
33
- - [Session](#session)
34
- - [Cache](#cache)
35
- - [idb](#idb)
36
- - [DevTools](#devtools)
37
- - [Logger](#logger)
38
- - [Testing](#testing)
39
- - [Security](#security)
40
- - [License](#license)
41
- - [Cross-Platform Support](#cross-platform-support)
42
- - [Platform & Context Isolation](docs/markdown/PLATFORM.md)
43
-
44
- ## Features
45
-
46
- - Reactive state management with observer pattern
47
- - Persistent storage with Store API
48
- - Session management for temporary data
49
- - Type-safe with full TypeScript support
50
- - Comprehensive test coverage
51
- - Easy debugging with proxy-based state
52
- - **Cross-platform**: Works in Browser, Node.js, Deno, and Edge Workers
53
- - **Session Isolation**: Each session/request gets isolated state namespace
54
- - **Context System**: Multi-tenant server-side isolation with `memorio.createContext()`
55
- - **DevTools**: Browser console debugging tools
56
- - **Logger**: Automatic logging of state changes
57
-
58
- ## Installation
59
-
60
- ```bash
61
- npm i -D memorio
62
- ```
63
-
64
- ### All test suites are passing
65
-
66
- - Basic functionality tests
67
- - State management tests
68
- - Store operations tests
69
- - Cache operations tests
70
- - Observer pattern tests
71
- - useObserver pattern tests
72
- - DevTools tests
73
- - Logger tests
74
-
75
- Total: 71 tests passed across 8 test suites
76
-
77
- ## Quick Start
78
-
79
- ```javascript
80
- /*
81
- IMPORTANT!
82
- Add import only at first start of your SPA. Became global!.
83
- You don't need to import any time you need to use memorio
84
- */
85
-
86
- import 'memorio';
87
-
88
- // State Management
89
- state.counter = 0;
90
- state.active = false;
91
- state.name = "john";
92
- state.user = { name: 'John', age: 30 };
93
- state.hours = [2,3,10,23]
94
-
95
- // Observer Pattern for not react app
96
- // Example: if you change the state.counter you get a console.log
97
- observer(
98
- 'state.counter',
99
- (newValue, oldValue) => {
100
- console.log(`Counter changed from ${oldValue} to ${newValue}`);
101
- }
102
- );
103
-
104
- // useObserver Pattern for react app
105
- // Example: if you change the state.counter you get a console.log
106
- useObserver(
107
- (newValue, oldValue) => {
108
- console.log(`Counter changed from ${oldValue} to ${newValue}`);
109
- },
110
- [state.counter]
111
- );
112
-
113
-
114
- // Store (Persistent Storage)
115
- store.set('preferences', { theme: 'dark' });
116
- const preferences = store.get('preferences');
117
-
118
- // Session Storage
119
- session.set('token', 'user-jwt-token');
120
- const token = session.get('token');
121
-
122
- // DevTools
123
- memorio.devtools.inspect();
124
-
125
- // Logger
126
- memorio.logger.configure({ enabled: true, logToConsole: true })
127
- ```
128
-
129
- ## API Reference
130
-
131
- ### State Management
132
-
133
- State in Memorio is globally accessible and reactive:
134
-
135
- ```javascript
136
- // Setting state
137
- state.user = { name: 'John' };
138
-
139
- // Getting state
140
- const userName = state.user.name;
141
-
142
- // Listing all states
143
- console.log(state.list);
144
-
145
- // Removing state
146
- state.remove('user');
147
-
148
- // Clearing all states
149
- state.removeAll();
150
- ```
151
-
152
- ### Observer
153
-
154
- > ⚠️ **Deprecated**: For React applications, use [`useObserver`](#useobserver-pattern) instead. The `observer` function is kept for non-React contexts.
155
-
156
- ```javascript
157
- // Observing a state path
158
- observer(
159
- 'state.user.name',
160
- (newValue, oldValue) => {
161
- console.log(`Name changed from ${oldValue} to ${newValue}`);
162
- }
163
- );
164
-
165
- // Observing with options
166
- observer(
167
- 'state.counter',
168
- (newValue, oldValue) => {
169
- console.log(`Counter: ${oldValue} → ${newValue}`);
170
- },
171
- { immediate: true } // Call immediately with current value
172
- );
173
- ```
174
-
175
- ### useObserver
176
-
177
- useObserver is a React hook for observing Memorio state changes with auto-discovery:
178
-
179
- ```js
180
- // Basic useObserver - array syntax with state path
181
- useObserver(
182
- () => {
183
- console.log('User updated:', state.user);
184
- },
185
- [state.user]
186
- );
187
-
188
- // Multiple states
189
- useObserver(
190
- () => {
191
- console.log('States changed:', state.user, state.counter, state.settings);
192
- },
193
- [state.user, state.counter, state.settings]
194
- );
195
-
196
- // With options
197
- useObserver(
198
- () => {
199
- console.log('Value changed');
200
- },
201
- [state.value],
202
- { immediate: true }
203
- );
204
- ```
205
-
206
- **Key differences from observer:**
207
- 1. Uses **array syntax** `[state.property]` instead of string path `'state.property'`
208
- 2. Automatically cleans up on component unmount
209
- 3. Works only inside React components
210
- 4. Callback receives `(newValue, oldValue)` parameters
211
-
212
- ### Store
213
-
214
- Persistent storage for your application:
215
-
216
- ```javascript
217
- // Setting values
218
- store.set('config', { theme: 'dark', language: 'en' });
219
-
220
- // Getting values
221
- const config = store.get('config');
222
-
223
- // Removing specific value
224
- store.remove('config');
225
-
226
- // Getting store size
227
- const size = store.size();
228
-
229
- // Clearing store
230
- store.removeAll();
231
-
232
- // Check if using persistent storage
233
- if (store.isPersistent) {
234
- console.log('Using real localStorage');
235
- } else {
236
- console.log('Using memory fallback (server environment)');
237
- }
238
- ```
239
-
240
- ### Session
241
-
242
- Temporary storage that persists during page sessions:
243
-
244
- ```js
245
- // Setting session data
246
- session.set(
247
- 'userSession', {
248
- id: 'user123',
249
- lastActive: Date.now()
250
- }
251
- );
252
-
253
- // Getting session data
254
- const userData = session.get('userSession');
255
-
256
- // Checking session size
257
- const activeItems = session.size();
258
-
259
- // Removing session data
260
- session.remove('userSession');
261
-
262
- // Clearing all session data
263
- session.removeAll();
264
-
265
- // Check if using persistent storage
266
- if (session.isPersistent) {
267
- console.log('Using real sessionStorage');
268
- } else {
269
- console.log('Using memory fallback (server environment)');
270
- }
271
- ```
272
-
273
- ### Cache
274
-
275
- In-memory cache for temporary data storage:
276
-
277
- ```js
278
- // Setting cache data
279
- cache.set('tempData', { computed: true, value: 42 });
280
-
281
- // Getting cache data
282
- const cached = cache.get('tempData');
283
-
284
- // Checking cache size
285
- const cacheSize = cache.size();
286
-
287
- // Removing cache data
288
- cache.remove('tempData');
289
-
290
- // Clearing all cache data
291
- cache.removeAll();
292
- ```
293
-
294
- **Note:** Cache data is stored in memory and will be lost on page refresh.
295
-
296
- ### idb
297
-
298
- Permanent storage using browser database:
299
-
300
- #### Create database
301
-
302
- ```js
303
- idb.db.create("Database");
304
- ```
305
-
306
- #### Set data into table
307
-
308
- ```js
309
- idb.data.set("Database","table", { id: 1, data:{...} } );
310
- ```
311
-
312
- #### Get data from table
313
-
314
- > [in development]
315
-
316
- ```js
317
- idb.data.get("Database","table", 1 );
318
- ```
319
-
320
- #### Delete database / table
321
-
322
- > [in development]
323
-
324
- ```js
325
- idb.db.delete("Database") // Remove DB
326
- idb.table.delete("Database","table") // Remove only "table"
327
- ```
328
-
329
- ### DevTools
330
-
331
- Browser console debugging tools for inspecting state, store, session, cache:
332
-
333
- ```javascript
334
- // Inspect all state modules
335
- memorio.devtools.inspect();
336
-
337
- // Get statistics
338
- memorio.devtools.stats();
339
-
340
- // Clear specific module
341
- memorio.devtools.clear('state');
342
-
343
- // Clear all modules
344
- memorio.devtools.clearAll();
345
-
346
- // Watch a path for changes
347
- memorio.devtools.watch('state', 'user.name');
348
-
349
- // Export all data as JSON
350
- memorio.devtools.exportData();
351
-
352
- // Import data from JSON
353
- memorio.devtools.importData(jsonString);
354
-
355
- // Get help
356
- memorio.devtools.help();
357
-
358
- // Console shortcuts (available in browser console)
359
- $state // globalThis.state
360
- $store // globalThis.store
361
- $session // globalThis.session
362
- $cache // globalThis.cache
363
- ```
364
-
365
- ### Logger
366
-
367
- Logging middleware for tracking all state changes:
368
-
369
- ```javascript
370
- // Configure logger
371
- memorio.logger.configure({ enabled: true, logToConsole: true });
372
-
373
- // Enable/disable logging
374
- memorio.logger.enable();
375
- memorio.logger.disable();
376
-
377
- // Get log history
378
- memorio.logger.getHistory();
379
-
380
- // Get statistics
381
- memorio.logger.getStats();
382
-
383
- // Clear history
384
- memorio.logger.clearHistory();
385
-
386
- // Export logs as JSON
387
- memorio.logger.exportLogs();
388
- ```
389
-
390
- ## Testing
391
-
392
- All test suites are passing:
393
-
394
- - Basic functionality tests
395
- - State management tests
396
- - Store operations tests
397
- - Cache operations tests
398
- - Observer pattern tests
399
- - useObserver pattern tests
400
- - DevTools tests
401
- - Logger tests
402
-
403
- Total: 71 tests passed across 8 test suites
404
-
405
- ## Security
406
-
407
- Security scans and reports are available at:
408
-
409
- - [Socket.dev](https://socket.dev/npm/package/memorio)
410
- - [Snyk.io](https://security.snyk.io/package/npm/memorio)
411
-
412
- ## License
413
-
414
- MIT License
415
-
416
- Copyright (c) [Dario Passariello](https://dario.passariello.ca/)
417
-
418
- ---
419
-
420
- ## Cross-Platform Support
421
-
422
- Memorio is designed to work across multiple JavaScript environments:
423
-
424
- ### Platform Compatibility
425
-
426
- | Feature | Browser | Node.js | Deno | Edge Workers |
427
- |---------|---------|---------|------|---------------|
428
- | `state` | ✅ | ✅ | ✅ | ✅ |
429
- | `observer` | ✅ | ✅ | ✅ | ✅ |
430
- | `useObserver` | | ⚠️ | ⚠️ | ✅ |
431
- | `cache` | | | ✅ | ✅ |
432
- | `store` | ✅ (localStorage) | ⚠️ (memory) | ⚠️ (memory) | ✅ (localStorage) |
433
- | `session` | ✅ (sessionStorage) | ⚠️ (memory) | ⚠️ (memory) | ✅ (sessionStorage) |
434
- | `idb` | ✅ | ❌ | ❌ | ⚠️ |
435
- | `devtools` | ✅ | ❌ | ❌ | ⚠️ |
436
- | `logger` | ✅ | ✅ | ✅ | ✅ |
437
-
438
- - ✅ Full support
439
- - ⚠️ Partial support (fallback to in-memory)
440
- - ❌ Not available
441
-
442
- ### Session Isolation
443
-
444
- Memorio provides automatic session isolation to prevent state leakage between different requests or contexts:
445
-
446
- - **Unique Session IDs**: Each import gets a unique session identifier
447
- - **Namespaced Storage**: `store` and `session` keys are prefixed with session ID
448
- - **State Isolation**: `state` is isolated per-instance
449
-
450
- This ensures that in server-side environments (Node.js/Deno), different requests don't share state data.
451
-
452
- ### Best Practices
453
-
454
- 1. **For Client-Side**: Use all features freely - store, session, idb work with real browser storage
455
- 2. **For Server-Side**: Use `state` and `cache` for in-memory data; store/session fall back to memory
456
- 3. **For Edge Workers**: Same as browser; localStorage/sessionStorage available
457
-
458
- ### Checking Platform
459
-
460
- ```javascript
461
- import { isBrowser, isNode, isDeno, getCapabilities } from 'memorio';
462
-
463
- console.log('Browser:', isBrowser()); // true in browser
464
- console.log('Node.js:', isNode()); // true in Node.js
465
- console.log('Deno:', isDeno()); // true in Deno
466
-
467
- const caps = getCapabilities();
468
- console.log('Platform:', caps.platform); // 'browser' | 'node' | 'deno' | 'edge'
469
- console.log('Persistent:', store.isPersistent); // true if using real storage
470
- ```
1
+ # [memorio](https://npmjs.com/package/memorio)
2
+
3
+ > A lightweight, type-safe state management library for JavaScript applications
4
+
5
+ [![version](https://img.shields.io/npm/v/memorio.svg)](https://npmjs.org/package/memorio)
6
+ [![install size](https://img.shields.io/badge/dynamic/json?url=https://packagephobia.com/v2/api.json?p=memorio&query=$.install.pretty&label=install%20size&style=flat-square)](https://packagephobia.now.sh/result?p=memorio)
7
+ [![downloads](https://img.shields.io/npm/dm/memorio.svg)](https://npmjs.org/package/memorio)
8
+
9
+ ![Node.js](https://img.shields.io/badge/Node.js-gray?logo=node.js)
10
+ ![React](https://img.shields.io/badge/React-gray?logo=React)
11
+ ![Javascript](https://img.shields.io/badge/Javascript-gray?logo=Javascript)
12
+ ![TypeScript](https://img.shields.io/badge/TypeScript-gray?logo=typescript)
13
+ ![esbuild](https://img.shields.io/badge/esbuild-gray?logo=esbuild)
14
+
15
+ ![Jest](https://img.shields.io/badge/Jest-gray?logo=jest)
16
+ ![ESLint](https://img.shields.io/badge/Eslint-gray?logo=eslint)
17
+ ![Playwright](https://img.shields.io/badge/Playwright-gray?logo=playwright)
18
+
19
+ [![GitBook](https://img.shields.io/static/v1?message=Documented%20on%20GitBook&logo=gitbook&logoColor=ffffff&label=%20&labelColor=5c5c5c&color=3F89A1)](https://a51.gitbook.io/memorio)
20
+
21
+ ---
22
+
23
+ ## Table of Contents
24
+
25
+ - [Features](#features)
26
+ - [Installation](#installation)
27
+ - [Quick Start](#quick-start)
28
+ - [API Reference](#api-reference)
29
+ - [State Management](#state-management)
30
+ - [Observer](#observer)
31
+ - [useObserver](#useobserver)
32
+ - [Store](#store)
33
+ - [Session](#session)
34
+ - [Cache](#cache)
35
+ - [idb](#idb)
36
+ - [DevTools](#devtools)
37
+ - [Logger](#logger)
38
+ - [Testing](#testing)
39
+ - [Security](#security)
40
+ - [License](#license)
41
+ - [Cross-Platform Support](#cross-platform-support)
42
+ - [Platform & Context Isolation](docs/markdown/PLATFORM.md)
43
+
44
+ ## Features
45
+
46
+ - Reactive state management with observer pattern
47
+ - Persistent storage with Store API
48
+ - Session management for temporary data
49
+ - Type-safe with full TypeScript support
50
+ - Comprehensive test coverage
51
+ - Easy debugging with proxy-based state
52
+ - **Cross-platform**: Works in Browser, Node.js, Deno, and Edge Workers
53
+ - **Session Isolation**: Each session/request gets isolated state namespace
54
+ - **Context System**: Multi-tenant server-side isolation with `memorio.createContext()`
55
+ - **DevTools**: Browser console debugging tools
56
+ - **Logger**: Automatic logging of state changes
57
+
58
+ ## Installation
59
+
60
+ ```bash
61
+ npm i -D memorio
62
+ ```
63
+
64
+ ### All test suites are passing
65
+
66
+ - Basic functionality tests
67
+ - State management tests
68
+ - Store operations tests
69
+ - Cache operations tests
70
+ - Observer pattern tests
71
+ - useObserver pattern tests
72
+ - DevTools tests
73
+ - Logger tests
74
+
75
+ Total: 71 tests passed across 8 test suites
76
+
77
+ ## Quick Start
78
+
79
+ ```javascript
80
+ /*
81
+ IMPORTANT!
82
+ Add import only at first start of your SPA. Became global!.
83
+ You don't need to import any time you need to use memorio
84
+ */
85
+
86
+ import 'memorio';
87
+
88
+ // State Management
89
+ state.counter = 0;
90
+ state.active = false;
91
+ state.name = "john";
92
+ state.user = { name: 'John', age: 30 };
93
+ state.hours = [2,3,10,23]
94
+
95
+ // useObserver Pattern for react app
96
+ // Example: if you change the state.counter you get a console.log
97
+ useObserver(
98
+ () => {
99
+ console.log(`Counter changed to ${state.counter}`);
100
+ },
101
+ [state.counter]
102
+ );
103
+
104
+
105
+ // Store (Persistent Storage)
106
+ store.set('preferences', { theme: 'dark' });
107
+ const preferences = store.get('preferences');
108
+
109
+ // Session Storage
110
+ session.set('token', 'user-jwt-token');
111
+ const token = session.get('token');
112
+
113
+ // DevTools
114
+ memorio.devtools.inspect();
115
+
116
+ // Logger
117
+ memorio.logger.configure({ enabled: true, logToConsole: true })
118
+ ```
119
+
120
+ ## API Reference
121
+
122
+ ### State Management
123
+
124
+ State in Memorio is globally accessible and reactive:
125
+
126
+ ```javascript
127
+ // Setting state
128
+ state.user = { name: 'John' };
129
+
130
+ // Getting state
131
+ const userName = state.user.name;
132
+
133
+ // Listing all states
134
+ console.log(state.list);
135
+
136
+ // Removing state
137
+ state.remove('user');
138
+
139
+ // Clearing all states
140
+ state.removeAll();
141
+ ```
142
+
143
+ ### useObserver
144
+
145
+ useObserver is a React hook for observing Memorio state changes with auto-discovery:
146
+
147
+ ```js
148
+ // Basic useObserver - array syntax with state path
149
+ useObserver(
150
+ () => {
151
+ console.log('User updated:', state.user);
152
+ },
153
+ [state.user]
154
+ );
155
+
156
+ // Multiple states
157
+ useObserver(
158
+ () => {
159
+ console.log('States changed:', state.user, state.counter, state.settings);
160
+ },
161
+ [state.user, state.counter, state.settings]
162
+ );
163
+
164
+ // With options
165
+ useObserver(
166
+ () => {
167
+ console.log('Value changed');
168
+ },
169
+ [state.value],
170
+ { immediate: true }
171
+ );
172
+ ```
173
+
174
+ ### Store
175
+
176
+ Persistent storage for your application:
177
+
178
+ ```javascript
179
+ // Setting values
180
+ store.set('config', { theme: 'dark', language: 'en' });
181
+
182
+ // Getting values
183
+ const config = store.get('config');
184
+
185
+ // Removing specific value
186
+ store.remove('config');
187
+
188
+ // Getting store size
189
+ const size = store.size();
190
+
191
+ // Clearing store
192
+ store.removeAll();
193
+
194
+ // Check if using persistent storage
195
+ if (store.isPersistent) {
196
+ console.log('Using real localStorage');
197
+ } else {
198
+ console.log('Using memory fallback (server environment)');
199
+ }
200
+ ```
201
+
202
+ ### Session
203
+
204
+ Temporary storage that persists during page sessions:
205
+
206
+ ```js
207
+ // Setting session data
208
+ session.set(
209
+ 'userSession', {
210
+ id: 'user123',
211
+ lastActive: Date.now()
212
+ }
213
+ );
214
+
215
+ // Getting session data
216
+ const userData = session.get('userSession');
217
+
218
+ // Checking session size
219
+ const activeItems = session.size();
220
+
221
+ // Removing session data
222
+ session.remove('userSession');
223
+
224
+ // Clearing all session data
225
+ session.removeAll();
226
+
227
+ // Check if using persistent storage
228
+ if (session.isPersistent) {
229
+ console.log('Using real sessionStorage');
230
+ } else {
231
+ console.log('Using memory fallback (server environment)');
232
+ }
233
+ ```
234
+
235
+ ### Cache
236
+
237
+ In-memory cache for temporary data storage:
238
+
239
+ ```js
240
+ // Setting cache data
241
+ cache.set('tempData', { computed: true, value: 42 });
242
+
243
+ // Getting cache data
244
+ const cached = cache.get('tempData');
245
+
246
+ // Checking cache size
247
+ const cacheSize = cache.size();
248
+
249
+ // Removing cache data
250
+ cache.remove('tempData');
251
+
252
+ // Clearing all cache data
253
+ cache.removeAll();
254
+ ```
255
+
256
+ **Note:** Cache data is stored in memory and will be lost on page refresh.
257
+
258
+ ### idb
259
+
260
+ Permanent storage using browser database:
261
+
262
+ #### Create database
263
+
264
+ ```js
265
+ idb.db.create("Database");
266
+ ```
267
+
268
+ #### Set data into table
269
+
270
+ ```js
271
+ idb.data.set("Database","table", { id: 1, data:{...} } );
272
+ ```
273
+
274
+ #### Get data from table
275
+
276
+ > [in development]
277
+
278
+ ```js
279
+ idb.data.get("Database","table", 1 );
280
+ ```
281
+
282
+ #### Delete database / table
283
+
284
+ > [in development]
285
+
286
+ ```js
287
+ idb.db.delete("Database") // Remove DB
288
+ idb.table.delete("Database","table") // Remove only "table"
289
+ ```
290
+
291
+ ### DevTools
292
+
293
+ Browser console debugging tools for inspecting state, store, session, cache:
294
+
295
+ ```javascript
296
+ // Inspect all state modules
297
+ memorio.devtools.inspect();
298
+
299
+ // Get statistics
300
+ memorio.devtools.stats();
301
+
302
+ // Clear specific module
303
+ memorio.devtools.clear('state');
304
+
305
+ // Clear all modules
306
+ memorio.devtools.clearAll();
307
+
308
+ // Watch a path for changes
309
+ memorio.devtools.watch('state', 'user.name');
310
+
311
+ // Export all data as JSON
312
+ memorio.devtools.exportData();
313
+
314
+ // Import data from JSON
315
+ memorio.devtools.importData(jsonString);
316
+
317
+ // Get help
318
+ memorio.devtools.help();
319
+
320
+ // Console shortcuts (available in browser console)
321
+ $state // globalThis.state
322
+ $store // globalThis.store
323
+ $session // globalThis.session
324
+ $cache // globalThis.cache
325
+ ```
326
+
327
+ ### Logger
328
+
329
+ Logging middleware for tracking all state changes:
330
+
331
+ ```javascript
332
+ // Configure logger
333
+ memorio.logger.configure({ enabled: true, logToConsole: true });
334
+
335
+ // Enable/disable logging
336
+ memorio.logger.enable();
337
+ memorio.logger.disable();
338
+
339
+ // Get log history
340
+ memorio.logger.getHistory();
341
+
342
+ // Get statistics
343
+ memorio.logger.getStats();
344
+
345
+ // Clear history
346
+ memorio.logger.clearHistory();
347
+
348
+ // Export logs as JSON
349
+ memorio.logger.exportLogs();
350
+ ```
351
+
352
+ ## Testing
353
+
354
+ All test suites are passing:
355
+
356
+ - Basic functionality tests
357
+ - State management tests
358
+ - Store operations tests
359
+ - Cache operations tests
360
+ - Observer pattern tests
361
+ - useObserver pattern tests
362
+ - DevTools tests
363
+ - Logger tests
364
+
365
+ Total: 71 tests passed across 8 test suites
366
+
367
+ ## Security
368
+
369
+ Security scans and reports are available at:
370
+
371
+ - [Socket.dev](https://socket.dev/npm/package/memorio)
372
+ - [Snyk.io](https://security.snyk.io/package/npm/memorio)
373
+
374
+ ## License
375
+
376
+ MIT License
377
+
378
+ Copyright (c) [Dario Passariello](https://dario.passariello.ca/)
379
+
380
+ ---
381
+
382
+ ## Cross-Platform Support
383
+
384
+ Memorio is designed to work across multiple JavaScript environments:
385
+
386
+ ### Platform Compatibility
387
+
388
+ | Feature | Browser | Node.js | Deno | Edge Workers |
389
+ |---------|---------|---------|------|---------------|
390
+ | `state` | ✅ | ✅ | ✅ | ✅ |
391
+ | `observer` | ✅ | ✅ | ✅ | ✅ |
392
+ | `useObserver` | | ⚠️ | ⚠️ | ✅ |
393
+ | `cache` | ✅ | ✅ | ✅ | ✅ |
394
+ | `store` | ✅ (localStorage) | ⚠️ (memory) | ⚠️ (memory) | ✅ (localStorage) |
395
+ | `session` | ✅ (sessionStorage) | ⚠️ (memory) | ⚠️ (memory) | ✅ (sessionStorage) |
396
+ | `idb` | ✅ | ❌ | ❌ | ⚠️ |
397
+ | `devtools` | ✅ | ❌ | ❌ | ⚠️ |
398
+ | `logger` | ✅ | ✅ | ✅ | ✅ |
399
+
400
+ - Full support
401
+ - ⚠️ Partial support (fallback to in-memory)
402
+ - ❌ Not available
403
+
404
+ ### Session Isolation
405
+
406
+ Memorio provides automatic session isolation to prevent state leakage between different requests or contexts:
407
+
408
+ - **Unique Session IDs**: Each import gets a unique session identifier
409
+ - **Namespaced Storage**: `store` and `session` keys are prefixed with session ID
410
+ - **State Isolation**: `state` is isolated per-instance
411
+
412
+ This ensures that in server-side environments (Node.js/Deno), different requests don't share state data.
413
+
414
+ ### Best Practices
415
+
416
+ 1. **For Client-Side**: Use all features freely - store, session, idb work with real browser storage
417
+ 2. **For Server-Side**: Use `state` and `cache` for in-memory data; store/session fall back to memory
418
+ 3. **For Edge Workers**: Same as browser; localStorage/sessionStorage available
419
+
420
+ ### Checking Platform
421
+
422
+ ```javascript
423
+ import { isBrowser, isNode, isDeno, getCapabilities } from 'memorio';
424
+
425
+ console.log('Browser:', isBrowser()); // true in browser
426
+ console.log('Node.js:', isNode()); // true in Node.js
427
+ console.log('Deno:', isDeno()); // true in Deno
428
+
429
+ const caps = getCapabilities();
430
+ console.log('Platform:', caps.platform); // 'browser' | 'node' | 'deno' | 'edge'
431
+ console.log('Persistent:', store.isPersistent); // true if using real storage
432
+ ```