memorio 2.7.4 → 2.9.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/README.md CHANGED
@@ -1,370 +1,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
- ![Snyk](https://img.shields.io/badge/Snyk-gray?logo=Snyk)
10
- [![Known Vulnerabilities](https://snyk.io/test/npm/memorio/badge.svg)](https://snyk.io/test/npm/memorio)
11
- [![Socket Badge](https://socket.dev/api/badge/npm/package/memorio)](https://socket.dev/npm/package/memorio)
12
-
13
- ![Node.js](https://img.shields.io/badge/Node.js-gray?logo=node.js)
14
- ![React](https://img.shields.io/badge/React-gray?logo=React)
15
- ![Javascript](https://img.shields.io/badge/Javascript-gray?logo=Javascript)
16
- ![TypeScript](https://img.shields.io/badge/TypeScript-gray?logo=typescript)
17
- ![esbuild](https://img.shields.io/badge/esbuild-gray?logo=esbuild)
18
-
19
- ![Jest](https://img.shields.io/badge/Jest-gray?logo=jest)
20
- ![ESLint](https://img.shields.io/badge/Eslint-gray?logo=eslint)
21
- ![Playwright](https://img.shields.io/badge/Playwright-gray?logo=playwright)
22
-
23
- [![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)
24
-
25
- ---
26
-
27
- ## Table of Contents
28
-
29
- - [Features](#features)
30
- - [Installation](#installation)
31
- - [Quick Start](#quick-start)
32
- - [API Reference](#api-reference)
33
- - [State Management](#state-management)
34
- - [useObserver](#useobserver)
35
- - [Store](#store)
36
- - [Session](#session)
37
- - [Cache](#cache)
38
- - [idb](#idb)
39
- - [Testing](#testing)
40
- - [Security](#security)
41
- - [License](#license)
42
- - [Cross-Platform Support](#cross-platform-support)
43
- - [Platform & Context Isolation](docs/markdown/PLATFORM.md)
44
-
45
- ## Features
46
-
47
- - Reactive state management with observer pattern
48
- - Persistent storage with Store API
49
- - Session management for temporary data
50
- - Type-safe with full TypeScript support
51
- - Comprehensive test coverage
52
- - Easy debugging with proxy-based state
53
- - **Cross-platform**: Works in Browser, Node.js, Deno, and Edge Workers
54
- - **Session Isolation**: Each session/request gets isolated state namespace
55
- - **Context System**: Multi-tenant server-side isolation with `memorio.createContext()`
56
-
57
- ## ⚠️ Enterprise Use
58
-
59
- For **enterprise-level applications** requiring advanced state management, we recommend using **[@biglogic/rgs](https://npmjs.com/package/@biglogic/rgs)** instead of Memorio.
60
-
61
- RGS provides:
62
- - Enhanced scalability for large applications
63
- - Advanced middleware support
64
- - Enterprise-grade security features
65
- - Professional support and maintenance
66
-
67
- Memorio is ideal for small to medium projects, prototypes, and learning purposes.
68
-
69
- ## Installation
70
-
71
- ```bash
72
- npm i -D memorio
73
- ```
74
-
75
- ### All test suites are passing
76
-
77
- - Basic functionality tests
78
- - State management tests
79
- - Store operations tests
80
- - Cache operations tests
81
- - Observer pattern tests
82
- - useObserver pattern tests
83
-
84
- Total: 28 tests passed across 5 test suites
85
-
86
- ## Quick Start
87
-
88
- ```javascript
89
- /*
90
- IMPORTANT!
91
- Add import only at first start of your SPA. Became global!.
92
- You don't need to import any time you need to use memorio
93
- */
94
-
95
- import 'memorio';
96
-
97
- // State Management
98
- state.counter = 0;
99
- state.active = false;
100
- state.name = "john";
101
- state.user = { name: 'John', age: 30 };
102
- state.hours = [2,3,10,23]
103
-
104
- // Observer Pattern
105
- // Example: if you change the state.counter you get a console.log
106
- observer(
107
- 'state.counter',
108
- (newValue, oldValue) => {
109
- console.log(`Counter changed from ${oldValue} to ${newValue}`);
110
- }
111
- );
112
-
113
- // useObserver Pattern
114
- // Example: if you change the state.counter you get a console.log
115
- useObserver(
116
- (newValue, oldValue) => {
117
- console.log(`Counter changed from ${oldValue} to ${newValue}`);
118
- },
119
- [state.counter]
120
- );
121
-
122
-
123
- // Store (Persistent Storage)
124
- store.set('preferences', { theme: 'dark' });
125
- const preferences = store.get('preferences');
126
-
127
- // Session Storage
128
- session.set('token', 'user-jwt-token');
129
- const token = session.get('token');
130
- ```
131
-
132
- ## API Reference
133
-
134
- ### State Management
135
-
136
- State in Memorio is globally accessible and reactive:
137
-
138
- ```javascript
139
- // Setting state
140
- state.user = { name: 'John' };
141
-
142
- // Getting state
143
- const userName = state.user.name;
144
-
145
- // Listing all states
146
- console.log(state.list);
147
-
148
- // Removing state
149
- state.remove('user');
150
-
151
- // Clearing all states
152
- state.removeAll();
153
-
154
- ```
155
-
156
- ### Observer
157
-
158
- > ⚠️ **Deprecated**: For React applications, use [`useObserver`](#useobserver-pattern) instead. The `observer` function is kept for non-React contexts.
159
-
160
- ## useObserver
161
-
162
- useObserver is a React hook for observing Memorio state changes with auto-discovery:
163
-
164
- ```js
165
-
166
- // Basic useObserver - array syntax with state path
167
- useObserver(
168
- (newValue, oldValue) => {
169
- console.log('User updated:', newValue);
170
- },
171
- [state.user]
172
- );
173
-
174
- // Multiple states
175
- useObserver(
176
- (newValue, oldValue) => {
177
- console.log('State changed:', newValue);
178
- },
179
- [state.user, state.counter, state.settings]
180
- );
181
-
182
- ```
183
-
184
- **Key differences from observer:**
185
- 1. Uses **array syntax** `[state.property]` instead of string path `'state.property'`
186
- 2. Automatically cleans up on component unmount
187
- 3. Works only inside React components
188
- 4. Callback receives `(newValue, oldValue)` parameters
189
-
190
- ## Store
191
-
192
- Persistent storage for your application:
193
-
194
- ```javascript
195
- // Setting values
196
- store.set('config', { theme: 'dark', language: 'en' });
197
-
198
- // Getting values
199
- const config = store.get('config');
200
-
201
- // Removing specific value
202
- store.remove('config');
203
-
204
- // Getting store size
205
- const size = store.size();
206
-
207
- // Clearing store
208
- store.removeAll();
209
- ```
210
-
211
- ## Session
212
-
213
- Temporary storage that persists during page sessions:
214
-
215
- ```js
216
- // Setting session data
217
- session.set(
218
- 'userSession', {
219
- id: 'user123',
220
- lastActive: Date.now()
221
- }
222
- );
223
-
224
- // Getting session data
225
- const userData = session.get('userSession');
226
-
227
- // Checking session size
228
- const activeItems = session.size();
229
-
230
- // Removing session data
231
- session.remove('userSession');
232
-
233
- // Clearing all session data
234
- session.removeAll();
235
- ```
236
-
237
- ## Cache
238
-
239
- In-memory cache for temporary data storage:
240
-
241
- ```js
242
- // Setting cache data
243
- cache.set('tempData', { computed: true, value: 42 });
244
-
245
- // Getting cache data
246
- const cached = cache.get('tempData');
247
-
248
- // Checking cache size
249
- const cacheSize = cache.size();
250
-
251
- // Removing cache data
252
- cache.remove('tempData');
253
-
254
- // Clearing all cache data
255
- cache.removeAll();
256
- ```
257
-
258
- **Note:** Cache data is stored in memory and will be lost on page refresh.
259
-
260
- ## idb
261
-
262
- Permanent storage using browser database:
263
-
264
- ### Create database
265
-
266
- ```js
267
- idb.db.create("Database")
268
- ```
269
-
270
- ### Set data into table
271
-
272
- ```js
273
- idb.data.set("Database","table", { id: 1, data:{...} } )
274
- ```
275
-
276
- ### Get data from table
277
-
278
- > [in development]
279
-
280
- ```js
281
- idb.data.get("Database","table", 1 )
282
- ```
283
-
284
- ### Delete database / table
285
-
286
- > [in development]
287
-
288
- ```js
289
- idb.db.delete("Database") // Remove DB
290
- idb.table.delete("Database","table") // Remove only "table"
291
- ```
292
-
293
- ---
294
-
295
- ## Testing
296
-
297
- ## Test suites are passing
298
-
299
- - Basic functionality tests
300
- - State management tests
301
- - Store operations tests
302
- - Cache operations tests
303
- - Observer pattern tests
304
-
305
- Total: 25 tests passed across 5 test suites
306
-
307
- ## Security
308
-
309
- Security scans and reports are available at:
310
-
311
- - [Socket.dev](https://socket.dev/npm/package/memorio)
312
- - [Snyk.io](https://security.snyk.io/package/npm/memorio)
313
-
314
- ## License
315
-
316
- MIT License
317
-
318
- Copyrigth (c) [Dario Passariello](https://dario.passariello.ca/)
319
-
320
- ---
321
-
322
- ## Cross-Platform Support
323
-
324
- Memorio is designed to work across multiple JavaScript environments:
325
-
326
- ### Platform Compatibility
327
-
328
- | Feature | Browser | Node.js | Deno | Edge Workers |
329
- |---------|---------|---------|------|---------------|
330
- | `state` | ✅ | ✅ | ✅ | ✅ |
331
- | `observer` | | | | ✅ |
332
- | `useObserver` | ✅ | ⚠️ | ⚠️ | ✅ |
333
- | `cache` | ✅ | ✅ | ✅ | ✅ |
334
- | `store` | (localStorage) | ⚠️ (memory) | ⚠️ (memory) | ✅ (localStorage) |
335
- | `session` | ✅ (sessionStorage) | ⚠️ (memory) | ⚠️ (memory) | ✅ (sessionStorage) |
336
- | `idb` | ✅ | ❌ | ❌ | ⚠️ |
337
-
338
- - ✅ Full support
339
- - ⚠️ Partial support (fallback to in-memory)
340
- - Not available
341
-
342
- ### Session Isolation
343
-
344
- Memorio provides automatic session isolation to prevent state leakage between different requests or contexts:
345
-
346
- - **Unique Session IDs**: Each import gets a unique session identifier
347
- - **Namespaced Storage**: `store` and `session` keys are prefixed with session ID
348
- - **State Isolation**: `state` is isolated per-instance
349
-
350
- This ensures that in server-side environments (Node.js/Deno), different requests don't share state data.
351
-
352
- ### Best Practices
353
-
354
- 1. **For Client-Side**: Use all features freely - store, session, idb work with real browser storage
355
- 2. **For Server-Side**: Use `state` and `cache` for in-memory data; store/session fall back to memory
356
- 3. **For Edge Workers**: Same as browser; localStorage/sessionStorage available
357
-
358
- ### Checking Platform
359
-
360
- ```javascript
361
- import { isBrowser, isNode, isDeno, getCapabilities } from 'memorio';
362
-
363
- console.log('Browser:', isBrowser()); // true in browser
364
- console.log('Node.js:', isNode()); // true in Node.js
365
- console.log('Deno:', isDeno()); // true in Deno
366
-
367
- const caps = getCapabilities();
368
- console.log('Platform:', caps.platform); // 'browser' | 'node' | 'deno' | 'edge'
369
- console.log('Persistent:', store.isPersistent); // true if using real storage
370
- ```
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
+ ```