@nlabs/arkhamjs-storage-browser 3.29.0 → 3.30.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,559 +1,274 @@
1
1
  # @nlabs/arkhamjs-storage-browser
2
2
 
3
- > **Browser Storage Integration for ArkhamJS** - Seamless localStorage and sessionStorage persistence with automatic state synchronization, compression, and encryption support.
4
-
5
- [![npm version](https://img.shields.io/npm/v/@nlabs/arkhamjs-storage-browser.svg?style=flat-square)](https://www.npmjs.com/package/@nlabs/arkhamjs-storage-browser)
6
- [![npm downloads](https://img.shields.io/npm/dm/@nlabs/arkhamjs-storage-browser.svg?style=flat-square)](https://www.npmjs.com/package/@nlabs/arkhamjs-storage-browser)
7
- [![Travis](https://img.shields.io/travis/nitrogenlabs/arkhamjs.svg?style=flat-square)](https://travis-ci.org/nitrogenlabs/arkhamjs)
8
- [![Issues](https://img.shields.io/github/issues/nitrogenlabs/arkhamjs.svg?style=flat-square)](https://github.com/nitrogenlabs/arkhamjs/issues)
9
- [![TypeScript](https://badges.frapsoft.com/typescript/version/typescript-next.svg?v=101)](https://github.com/ellerbrock/typescript-badges/)
10
- [![MIT license](https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](http://opensource.org/licenses/MIT)
11
- [![Chat](https://img.shields.io/discord/446122412715802649.svg)](https://discord.gg/Ttgev58)
12
-
13
- ## 🚀 Features
14
-
15
- - **💾 Automatic Persistence** - State automatically persists across browser sessions
16
- - **🔄 Real-Time Sync** - State changes are immediately saved to storage
17
- - **🎯 Selective Persistence** - Choose which parts of state to persist
18
- - **⚡ Performance Optimized** - Debounced writes and efficient serialization
19
- - **🔒 Encryption Support** - Optional encryption for sensitive data
20
- - **🗜️ Compression** - Automatic compression for large state objects
21
- - **📱 Cross-Tab Sync** - Synchronize state across multiple browser tabs
22
- - **🔧 Configurable** - Extensive options for customization
23
- - **🌲 Tree-shakable** - Only include what you need
24
-
25
- ## 📦 Installation
3
+ Enhanced browser storage for ArkhamJS with modern ESNext features, performance optimizations, and advanced caching capabilities.
4
+
5
+ ## Features
6
+
7
+ - 🚀 **High Performance**: In-memory caching and optimized storage operations
8
+ - 🔒 **Type Safe**: Full TypeScript support with strict type checking
9
+ - 🎯 **Modern ESNext**: Built with latest JavaScript features (ES2022+)
10
+ - 📦 **Tree Shakeable**: Optimized for bundle size reduction
11
+ - ⚡ **Smart Caching**: Automatic cache management with TTL support
12
+ - 🛡️ **Error Resilient**: Graceful handling of storage errors and quota limits
13
+ - 🔧 **Configurable**: Flexible options for prefix, compression, and size limits
14
+ - 📊 **Monitoring**: Built-in storage statistics and usage tracking
15
+
16
+ ## Installation
26
17
 
27
18
  ```bash
28
19
  npm install @nlabs/arkhamjs-storage-browser
29
20
  ```
30
21
 
31
- ## 🎯 Quick Start
22
+ ## Quick Start
32
23
 
33
- ### **Basic Setup**
24
+ ### Basic Usage
34
25
 
35
- ```js
36
- import { Flux } from '@nlabs/arkhamjs';
26
+ ```typescript
37
27
  import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
38
28
 
39
- // Initialize Flux with browser storage
40
- Flux.init({
41
- name: 'my-app',
42
- stores: [UserStore, CartStore],
43
- storage: BrowserStorage, // Enable localStorage persistence
44
- storageWait: 300 // Debounce storage updates by 300ms
45
- });
29
+ // Create storage instance with default settings
30
+ const storage = new BrowserStorage();
31
+
32
+ // Store data
33
+ await storage.setStorageData('user', { id: 1, name: 'John' });
46
34
 
47
- // State will automatically persist across browser sessions
48
- Flux.dispatch({ type: 'ADD_USER', user: { name: 'John' } });
49
- // User data is now saved to localStorage
35
+ // Retrieve data
36
+ const user = await storage.getStorageData('user');
37
+ console.log(user); // { id: 1, name: 'John' }
50
38
  ```
51
39
 
52
- ### **Storage Types**
40
+ ### Advanced Configuration
53
41
 
54
- ```js
42
+ ```typescript
55
43
  import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
56
44
 
57
- // Use localStorage (persists across sessions)
58
- const localStorage = BrowserStorage.local;
59
-
60
- // Use sessionStorage (cleared when tab closes)
61
- const sessionStorage = BrowserStorage.session;
62
-
63
- // Use custom storage implementation
64
- const customStorage = BrowserStorage.create({
65
- getItem: (key) => customGet(key),
66
- setItem: (key, value) => customSet(key, value),
67
- removeItem: (key) => customRemove(key)
68
- });
69
-
70
- Flux.init({
71
- name: 'my-app',
72
- stores: [UserStore],
73
- storage: localStorage, // or sessionStorage, or customStorage
45
+ const storage = new BrowserStorage({
46
+ type: 'local', // 'local' or 'session' storage
47
+ prefix: 'myapp_', // Custom key prefix
48
+ compression: true, // Enable compression for large data
49
+ maxSize: 10 * 1024 * 1024, // 10MB size limit
50
+ ttl: 60 * 60 * 1000 // 1 hour time-to-live
74
51
  });
75
52
  ```
76
53
 
77
- ## 🔧 Configuration Options
54
+ ### Integration with ArkhamJS
78
55
 
79
- ### **Basic Configuration**
80
-
81
- ```js
56
+ ```typescript
57
+ import { Flux } from '@nlabs/arkhamjs';
82
58
  import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
83
59
 
84
- Flux.init({
85
- name: 'my-app',
86
- stores: [UserStore],
87
- storage: BrowserStorage,
88
-
89
- // Storage options
90
- storageWait: 300, // Debounce storage updates (ms)
91
- storageDebounce: true, // Enable debouncing
92
- storageThrottle: false, // Use throttling instead of debouncing
93
-
94
- // Persistence options
95
- storagePersist: true, // Enable persistence
96
- storageRestore: true, // Restore state on initialization
97
- storageClear: false, // Clear storage on initialization
98
-
99
- // Data options
100
- storageSerialize: true, // Serialize data before storage
101
- storageCompress: false, // Compress data before storage
102
- storageEncrypt: false, // Encrypt data before storage
103
-
104
- // Key options
105
- storageKey: 'arkhamjs-state', // Storage key prefix
106
- storageNamespace: 'my-app', // Namespace for storage keys
60
+ const storage = new BrowserStorage({
61
+ type: 'local',
62
+ prefix: 'myapp_',
63
+ ttl: 24 * 60 * 60 * 1000 // 24 hours
107
64
  });
108
- ```
109
-
110
- ### **Advanced Configuration**
111
65
 
112
- ```js
113
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
114
-
115
- Flux.init({
116
- name: 'my-app',
117
- stores: [UserStore],
118
- storage: BrowserStorage,
119
-
120
- // Selective persistence
121
- storagePaths: [
122
- 'user.current', // Only persist current user
123
- 'user.preferences', // Only persist user preferences
124
- 'cart.items' // Only persist cart items
125
- ],
126
-
127
- // Exclude sensitive data
128
- storageExclude: [
129
- 'user.password', // Don't persist passwords
130
- 'auth.token', // Don't persist auth tokens
131
- 'temp.*' // Don't persist temporary data
132
- ],
133
-
134
- // Custom serialization
135
- storageSerialize: (state) => {
136
- // Custom serialization logic
137
- return JSON.stringify(state, (key, value) => {
138
- if (key === 'password') return undefined; // Remove passwords
139
- if (key === 'token') return undefined; // Remove tokens
140
- return value;
141
- });
142
- },
143
-
144
- // Custom deserialization
145
- storageDeserialize: (data) => {
146
- // Custom deserialization logic
147
- const state = JSON.parse(data);
148
- // Add default values or transform data
149
- return state;
150
- },
151
-
152
- // Storage events
153
- storageEvents: {
154
- onSave: (key, value) => {
155
- console.log(`Saved to storage: ${key}`);
156
- },
157
- onLoad: (key, value) => {
158
- console.log(`Loaded from storage: ${key}`);
159
- },
160
- onError: (error) => {
161
- console.error('Storage error:', error);
162
- }
163
- }
66
+ // Initialize ArkhamJS with storage
67
+ await Flux.init({
68
+ name: 'myapp',
69
+ storage,
70
+ stores: [/* your stores */]
164
71
  });
165
72
  ```
166
73
 
167
- ### **Production Configuration**
74
+ ## API Reference
168
75
 
169
- ```js
170
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
76
+ ### Constructor Options
171
77
 
172
- const isDevelopment = process.env.NODE_ENV === 'development';
173
-
174
- Flux.init({
175
- name: 'my-app',
176
- stores: [UserStore],
177
- storage: BrowserStorage,
178
-
179
- // Development: Full persistence with debugging
180
- ...(isDevelopment && {
181
- storageWait: 100,
182
- storageDebounce: true,
183
- storageEvents: {
184
- onSave: (key, value) => console.log(`💾 Saved: ${key}`),
185
- onLoad: (key, value) => console.log(`📂 Loaded: ${key}`)
186
- }
187
- }),
188
-
189
- // Production: Optimized persistence
190
- ...(!isDevelopment && {
191
- storageWait: 500,
192
- storageDebounce: true,
193
- storageCompress: true,
194
- storageEvents: {
195
- onError: (error) => {
196
- // Send to error tracking service
197
- analytics.track('storage_error', { error: error.message });
198
- }
199
- }
200
- })
201
- });
78
+ ```typescript
79
+ interface BrowserStorageOptions {
80
+ type?: 'local' | 'session'; // Storage type (default: 'session')
81
+ prefix?: string; // Key prefix (default: 'arkhamjs_')
82
+ compression?: boolean; // Enable compression (default: false)
83
+ maxSize?: number; // Max size in bytes (default: 5MB)
84
+ ttl?: number; // Time-to-live in ms (default: 24h)
85
+ }
202
86
  ```
203
87
 
204
- ## 🎨 Storage Features
88
+ ### Instance Methods
205
89
 
206
- ### **Automatic State Persistence**
90
+ #### `getStorageData(key: string): Promise<any>`
207
91
 
208
- State automatically persists across browser sessions:
92
+ Retrieves data from storage with caching and TTL validation.
209
93
 
210
- ```js
211
- // User logs in
212
- Flux.dispatch({ type: 'USER_LOGIN', user: { id: 1, name: 'John' } });
213
-
214
- // User closes browser and reopens
215
- // State is automatically restored from localStorage
216
- const user = Flux.getState('user.current'); // { id: 1, name: 'John' }
94
+ ```typescript
95
+ const data = await storage.getStorageData('user');
217
96
  ```
218
97
 
219
- ### **Selective Persistence**
220
-
221
- Choose which parts of state to persist:
222
-
223
- ```js
224
- Flux.init({
225
- name: 'my-app',
226
- stores: [UserStore],
227
- storage: BrowserStorage,
228
-
229
- // Only persist specific paths
230
- storagePaths: [
231
- 'user.current', // Persist current user
232
- 'user.preferences', // Persist user preferences
233
- 'cart.items', // Persist cart items
234
- 'ui.theme' // Persist UI theme
235
- ],
236
-
237
- // Exclude sensitive or temporary data
238
- storageExclude: [
239
- 'user.password', // Don't persist passwords
240
- 'auth.token', // Don't persist auth tokens
241
- 'temp.*', // Don't persist temporary data
242
- 'ui.loading' // Don't persist loading states
243
- ]
244
- });
245
- ```
98
+ #### `setStorageData(key: string, value: any): Promise<boolean>`
246
99
 
247
- ### **Cross-Tab Synchronization**
100
+ Stores data with validation, compression, and automatic cleanup.
248
101
 
249
- Synchronize state across multiple browser tabs:
102
+ ```typescript
103
+ const success = await storage.setStorageData('user', { id: 1, name: 'John' });
104
+ ```
250
105
 
251
- ```js
252
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
106
+ #### `removeStorageData(key: string): Promise<boolean>`
253
107
 
254
- Flux.init({
255
- name: 'my-app',
256
- stores: [UserStore],
257
- storage: BrowserStorage,
258
-
259
- // Enable cross-tab sync
260
- storageSync: true,
261
-
262
- // Custom sync events
263
- storageEvents: {
264
- onSync: (event) => {
265
- if (event.key === 'arkhamjs-state') {
266
- console.log('State synced from another tab');
267
- // Optionally refresh UI or show notification
268
- }
269
- }
270
- }
271
- });
108
+ Removes specific data from storage.
272
109
 
273
- // State changes in one tab will automatically sync to other tabs
110
+ ```typescript
111
+ const success = await storage.removeStorageData('user');
274
112
  ```
275
113
 
276
- ### **Data Compression**
114
+ #### `clearStorageData(): Promise<boolean>`
277
115
 
278
- Compress large state objects to save storage space:
116
+ Clears all data with the configured prefix.
279
117
 
280
- ```js
281
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
118
+ ```typescript
119
+ const success = await storage.clearStorageData();
120
+ ```
282
121
 
283
- Flux.init({
284
- name: 'my-app',
285
- stores: [UserStore],
286
- storage: BrowserStorage,
287
-
288
- // Enable compression for large state objects
289
- storageCompress: true,
290
- storageCompressThreshold: 1024, // Compress if >1KB
291
-
292
- // Custom compression
293
- storageCompress: (data) => {
294
- // Use custom compression library
295
- return customCompress(data);
296
- },
297
-
298
- // Custom decompression
299
- storageDecompress: (data) => {
300
- // Use custom decompression library
301
- return customDecompress(data);
302
- }
303
- });
122
+ #### `getStorageStats(): { used: number; available: number; total: number }`
123
+
124
+ Returns storage usage statistics.
125
+
126
+ ```typescript
127
+ const stats = storage.getStorageStats();
128
+ console.log(`Used: ${stats.used} bytes, Available: ${stats.available} bytes`);
304
129
  ```
305
130
 
306
- ### **Data Encryption**
131
+ ### Static Methods (Backward Compatibility)
307
132
 
308
- Encrypt sensitive data before storage:
133
+ For backward compatibility, static methods are still available:
309
134
 
310
- ```js
311
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
135
+ ```typescript
136
+ // Local storage
137
+ BrowserStorage.setLocalData('key', value);
138
+ const data = BrowserStorage.getLocalData('key');
139
+ BrowserStorage.delLocalData('key');
312
140
 
313
- Flux.init({
314
- name: 'my-app',
315
- stores: [UserStore],
316
- storage: BrowserStorage,
317
-
318
- // Enable encryption
319
- storageEncrypt: true,
320
- storageEncryptKey: 'your-secret-key',
321
-
322
- // Custom encryption
323
- storageEncrypt: (data, key) => {
324
- // Use custom encryption library
325
- return customEncrypt(data, key);
326
- },
327
-
328
- // Custom decryption
329
- storageDecrypt: (data, key) => {
330
- // Use custom decryption library
331
- return customDecrypt(data, key);
332
- }
333
- });
141
+ // Session storage
142
+ BrowserStorage.setSessionData('key', value);
143
+ const data = BrowserStorage.getSessionData('key');
144
+ BrowserStorage.delSessionData('key');
145
+
146
+ // Storage instances
147
+ const localStorage = BrowserStorage.getLocalStorage();
148
+ const sessionStorage = BrowserStorage.getSessionStorage();
334
149
  ```
335
150
 
336
- ## 🔍 Advanced Usage
151
+ ## Performance Optimizations
337
152
 
338
- ### **Custom Storage Implementation**
153
+ ### In-Memory Caching
339
154
 
340
- ```js
341
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
155
+ The storage automatically caches frequently accessed data in memory for faster retrieval:
342
156
 
343
- // Create custom storage adapter
344
- const customStorage = BrowserStorage.create({
345
- // Required methods
346
- getItem: (key) => {
347
- // Custom get implementation
348
- return localStorage.getItem(key);
349
- },
350
-
351
- setItem: (key, value) => {
352
- // Custom set implementation
353
- localStorage.setItem(key, value);
354
- },
355
-
356
- removeItem: (key) => {
357
- // Custom remove implementation
358
- localStorage.removeItem(key);
359
- },
360
-
361
- // Optional methods
362
- clear: () => {
363
- // Custom clear implementation
364
- localStorage.clear();
365
- },
366
-
367
- key: (index) => {
368
- // Custom key implementation
369
- return localStorage.key(index);
370
- },
371
-
372
- get length() {
373
- // Custom length implementation
374
- return localStorage.length;
375
- }
376
- });
157
+ ```typescript
158
+ // First call - reads from storage
159
+ const user1 = await storage.getStorageData('user');
377
160
 
378
- Flux.init({
379
- name: 'my-app',
380
- stores: [UserStore],
381
- storage: customStorage
382
- });
161
+ // Second call - served from cache (much faster)
162
+ const user2 = await storage.getStorageData('user');
383
163
  ```
384
164
 
385
- ### **Storage Migration**
165
+ ### Automatic Cleanup
386
166
 
387
- ```js
388
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
167
+ Expired data is automatically cleaned up to prevent storage bloat:
389
168
 
390
- Flux.init({
391
- name: 'my-app',
392
- stores: [UserStore],
393
- storage: BrowserStorage,
394
-
395
- // Storage migration
396
- storageMigrate: (oldData, newData) => {
397
- // Migrate from old format to new format
398
- if (oldData.version === 1) {
399
- return {
400
- ...newData,
401
- user: {
402
- ...newData.user,
403
- // Migrate old user format
404
- current: oldData.user ? { ...oldData.user, id: oldData.user.id || 1 } : null
405
- }
406
- };
407
- }
408
- return newData;
409
- },
410
-
411
- // Version tracking
412
- storageVersion: 2,
413
-
414
- // Migration events
415
- storageEvents: {
416
- onMigrate: (oldVersion, newVersion) => {
417
- console.log(`Migrated from v${oldVersion} to v${newVersion}`);
418
- }
419
- }
169
+ ```typescript
170
+ const storage = new BrowserStorage({
171
+ ttl: 60 * 60 * 1000 // 1 hour
420
172
  });
173
+
174
+ // Data will be automatically removed after 1 hour
175
+ await storage.setStorageData('temp', 'data');
421
176
  ```
422
177
 
423
- ### **Storage Analytics**
178
+ ### Size Validation
424
179
 
425
- ```js
426
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
180
+ Large data is validated before storage to prevent quota errors:
427
181
 
428
- Flux.init({
429
- name: 'my-app',
430
- stores: [UserStore],
431
- storage: BrowserStorage,
432
-
433
- // Storage analytics
434
- storageEvents: {
435
- onSave: (key, value) => {
436
- // Track storage usage
437
- analytics.track('storage_save', {
438
- key,
439
- size: JSON.stringify(value).length,
440
- timestamp: Date.now()
441
- });
442
- },
443
-
444
- onLoad: (key, value) => {
445
- // Track storage reads
446
- analytics.track('storage_load', {
447
- key,
448
- size: JSON.stringify(value).length,
449
- timestamp: Date.now()
450
- });
451
- },
452
-
453
- onError: (error) => {
454
- // Track storage errors
455
- analytics.track('storage_error', {
456
- error: error.message,
457
- timestamp: Date.now()
458
- });
459
- }
460
- }
182
+ ```typescript
183
+ const storage = new BrowserStorage({
184
+ maxSize: 1024 * 1024 // 1MB limit
461
185
  });
462
- ```
463
186
 
464
- ## 🎯 Use Cases
187
+ // This will fail if data exceeds 1MB
188
+ const success = await storage.setStorageData('large', bigData);
189
+ if (!success) {
190
+ console.log('Data too large for storage');
191
+ }
192
+ ```
465
193
 
466
- ### **User Preferences Persistence**
194
+ ## Error Handling
467
195
 
468
- ```js
469
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
196
+ The storage gracefully handles various error conditions:
470
197
 
471
- Flux.init({
472
- name: 'my-app',
473
- stores: [UserStore, PreferencesStore],
474
- storage: BrowserStorage,
475
-
476
- // Only persist user preferences
477
- storagePaths: [
478
- 'user.preferences.theme',
479
- 'user.preferences.language',
480
- 'user.preferences.notifications',
481
- 'ui.sidebar.collapsed'
482
- ]
483
- });
484
-
485
- // User preferences will persist across sessions
486
- Flux.dispatch({ type: 'SET_THEME', theme: 'dark' });
487
- // Theme preference is automatically saved
198
+ ```typescript
199
+ try {
200
+ const data = await storage.getStorageData('key');
201
+ if (data === null) {
202
+ console.log('Data not found or expired');
203
+ }
204
+ } catch (error) {
205
+ console.error('Storage error:', error);
206
+ }
488
207
  ```
489
208
 
490
- ### **Shopping Cart Persistence**
209
+ Common error scenarios handled automatically:
491
210
 
492
- ```js
493
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
211
+ - Storage not available (private browsing, etc.)
212
+ - Quota exceeded
213
+ - Corrupted data
214
+ - Invalid JSON
494
215
 
495
- Flux.init({
496
- name: 'my-app',
497
- stores: [CartStore],
498
- storage: BrowserStorage,
216
+ ## Migration Guide
499
217
 
500
- // Persist cart items
501
- storagePaths: ['cart.items', 'cart.total'],
218
+ ### From Previous Version
502
219
 
503
- // Don't persist temporary cart state
504
- storageExclude: ['cart.loading', 'cart.error']
505
- });
220
+ The new version is fully backward compatible. Existing code will continue to work:
506
221
 
507
- // Cart items persist if user closes browser
508
- Flux.dispatch({ type: 'CART_ADD', item: { id: 1, name: 'Product' } });
509
- // Cart is automatically saved
222
+ ```typescript
223
+ // Old code - still works
224
+ const storage = new BrowserStorage({ type: 'session' });
225
+ await storage.setStorageData('key', value);
226
+ const data = await storage.getStorageData('key');
227
+
228
+ // New features available
229
+ const stats = storage.getStorageStats();
230
+ await storage.removeStorageData('key');
231
+ await storage.clearStorageData();
510
232
  ```
511
233
 
512
- ### **Form Data Persistence**
234
+ ### Recommended Updates
513
235
 
514
- ```js
515
- import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
236
+ For better performance, consider these updates:
516
237
 
517
- Flux.init({
518
- name: 'my-app',
519
- stores: [FormStore],
520
- storage: BrowserStorage,
521
-
522
- // Persist form data with short debounce
523
- storageWait: 100,
524
- storagePaths: ['form.draft'],
525
-
526
- // Clear form data on successful submission
527
- storageEvents: {
528
- onAction: (action) => {
529
- if (action.type === 'FORM_SUBMIT_SUCCESS') {
530
- // Clear draft data
531
- localStorage.removeItem('arkhamjs-state-form.draft');
532
- }
533
- }
534
- }
535
- });
238
+ ```typescript
239
+ // Before
240
+ const storage = new BrowserStorage({ type: 'session' });
536
241
 
537
- // Form data is automatically saved as user types
538
- // Prevents data loss if user accidentally closes browser
242
+ // After - with optimizations
243
+ const storage = new BrowserStorage({
244
+ type: 'local', // Use localStorage for persistence
245
+ prefix: 'myapp_', // Custom prefix for organization
246
+ ttl: 24 * 60 * 60 * 1000, // 24 hour TTL
247
+ maxSize: 10 * 1024 * 1024 // 10MB limit
248
+ });
539
249
  ```
540
250
 
541
- ## 🔗 Related Packages
251
+ ## Browser Support
542
252
 
543
- - **[@nlabs/arkhamjs](./arkhamjs/README.md)** - Core Flux framework
544
- - **[@nlabs/arkhamjs-storage-native](./arkhamjs-storage-native/README.md)** - React Native storage
545
- - **[@nlabs/arkhamjs-storage-node](./arkhamjs-storage-node/README.md)** - Node.js storage
253
+ - Chrome 60+
254
+ - Firefox 55+
255
+ - Safari 12+
256
+ - Edge 79+
546
257
 
547
- ## 📚 Documentation
258
+ ## Bundle Size
548
259
 
549
- For detailed documentation and examples, visit [arkhamjs.io](https://arkhamjs.io).
260
+ - **Minified**: ~3.2KB
261
+ - **Gzipped**: ~1.1KB
262
+ - **Tree-shakeable**: Only includes what you use
550
263
 
551
- ## 🤝 Community & Support
264
+ ## Contributing
552
265
 
553
- - **💬 [Discord Community](https://discord.gg/Ttgev58)** - Chat with other developers
554
- - **🐛 [GitHub Issues](https://github.com/nitrogenlabs/arkhamjs/issues)** - Report bugs and request features
555
- - **📖 [Documentation](https://arkhamjs.io)** - Complete API reference
266
+ 1. Fork the repository
267
+ 2. Create a feature branch
268
+ 3. Make your changes
269
+ 4. Add tests
270
+ 5. Submit a pull request
556
271
 
557
- ## 📄 License
272
+ ## License
558
273
 
559
- MIT License - see [LICENSE](../LICENSE) file for details.
274
+ MIT License - see [LICENSE](LICENSE) file for details.
package/index.js CHANGED
@@ -2,6 +2,6 @@
2
2
  * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
3
  * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
4
  */
5
- const lib = require("./lib");
6
- module.exports = lib;
7
- Object.assign(exports, lib);
5
+ import * as lib from './lib/index.js';
6
+ export default lib;
7
+ export * from './lib/index.js';
@@ -1,16 +1,34 @@
1
- import { BrowserStorageOptions } from '../types/main';
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
5
+ import type { BrowserStorageOptions } from '../types/main';
2
6
  export declare class BrowserStorage {
3
- static window: any;
4
- private options;
7
+ private static readonly window;
8
+ private readonly options;
9
+ private readonly storageCache;
10
+ private readonly storage;
5
11
  constructor(options?: BrowserStorageOptions);
6
12
  static delLocalData(key: string): boolean;
7
13
  static delSessionData(key: string): boolean;
8
14
  static getLocalData(key: string): any;
9
- static getLocalStorage(): any;
10
15
  static getSessionData(key: string): any;
11
- static getSessionStorage(): any;
12
16
  static setLocalData(key: string, value: any): boolean;
13
17
  static setSessionData(key: string, value: any): boolean;
18
+ static getLocalStorage(): Storage | null;
19
+ static getSessionStorage(): Storage | null;
14
20
  getStorageData(key: string): Promise<any>;
15
21
  setStorageData(key: string, value: any): Promise<boolean>;
22
+ removeStorageData(key: string): Promise<boolean>;
23
+ clearStorageData(): Promise<boolean>;
24
+ getStorageStats(): {
25
+ available: number;
26
+ total: number;
27
+ used: number;
28
+ };
29
+ private getStorage;
30
+ private getPrefixedKey;
31
+ private isStorageAvailable;
32
+ private validateSize;
33
+ private cleanExpiredData;
16
34
  }
@@ -1,2 +1,2 @@
1
- var n=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var c=Object.prototype.hasOwnProperty;var g=(o,t)=>{for(var e in t)n(o,e,{get:t[e],enumerable:!0})},u=(o,t,e,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of l(t))!c.call(o,a)&&a!==e&&n(o,a,{get:()=>t[a],enumerable:!(s=i(t,a))||s.enumerable});return o};var S=o=>u(n({},"__esModule",{value:!0}),o);var f={};g(f,{BrowserStorage:()=>r});module.exports=S(f);class r{constructor(t={}){this.options={type:"session"};this.getStorageData=this.getStorageData.bind(this),this.setStorageData=this.setStorageData.bind(this),this.options={...this.options,...t}}static{this.window=window||{}}static delLocalData(t){const e=r.getLocalStorage();if(e)try{return e.removeItem(t),!0}catch{return!1}else return!1}static delSessionData(t){const e=r.getSessionStorage();if(e)try{return e.removeItem(t),!0}catch{return!1}else return!1}static getLocalData(t){const e=r.getLocalStorage();if(e)try{const s=e.getItem(t);return s?JSON.parse(s):null}catch{return null}else return null}static getLocalStorage(){const{localStorage:t}=r.window;return t}static getSessionData(t){const e=r.getSessionStorage();if(e)try{const s=e.getItem(t);return s&&s?JSON.parse(s):null}catch{return null}else return null}static getSessionStorage(){const{sessionStorage:t}=r.window;return t}static setLocalData(t,e){const s=r.getLocalStorage();if(s)try{return s.setItem(t,JSON.stringify(e)),!0}catch{return!1}else return!1}static setSessionData(t,e){const s=r.getSessionStorage();if(s)try{return s.setItem(t,JSON.stringify(e)),!0}catch{return!1}else return!1}getStorageData(t){const{type:e}=this.options,s=e==="local"?r.getLocalData(t):r.getSessionData(t);return Promise.resolve(s)}setStorageData(t,e){const{type:s}=this.options,a=s==="local"?r.setLocalData(t,e):r.setSessionData(t,e);return Promise.resolve(a)}}0&&(module.exports={BrowserStorage});
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0Jyb3dzZXJTdG9yYWdlL0Jyb3dzZXJTdG9yYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtCcm93c2VyU3RvcmFnZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzL21haW4nO1xuXG5leHBvcnQgY2xhc3MgQnJvd3NlclN0b3JhZ2Uge1xuICBzdGF0aWMgd2luZG93OiBhbnkgPSB3aW5kb3cgfHwge307XG4gIHByaXZhdGUgb3B0aW9uczogQnJvd3NlclN0b3JhZ2VPcHRpb25zID0ge1xuICAgIHR5cGU6ICdzZXNzaW9uJ1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IEJyb3dzZXJTdG9yYWdlT3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gTWV0aG9kc1xuICAgIHRoaXMuZ2V0U3RvcmFnZURhdGEgPSB0aGlzLmdldFN0b3JhZ2VEYXRhLmJpbmQodGhpcyk7XG4gICAgdGhpcy5zZXRTdG9yYWdlRGF0YSA9IHRoaXMuc2V0U3RvcmFnZURhdGEuYmluZCh0aGlzKTtcblxuICAgIC8vIENvbmZpZ3VyYXRpb25cbiAgICB0aGlzLm9wdGlvbnMgPSB7Li4udGhpcy5vcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEga2V5IGZyb20gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdG8gcmVtb3ZlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICovXG4gIHN0YXRpYyBkZWxMb2NhbERhdGEoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRMb2NhbFN0b3JhZ2UoKTtcblxuICAgIGlmKGxvY2FsU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEga2V5IGZyb20gc2Vzc2lvblN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0byByZW1vdmUuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgKi9cbiAgc3RhdGljIGRlbFNlc3Npb25EYXRhKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRTZXNzaW9uU3RvcmFnZSgpO1xuXG4gICAgaWYoc2Vzc2lvblN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBrZXkgdmFsdWUgZnJvbSBsb2NhbFN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBmb3IgZGF0YS5cbiAgICogQHJldHVybnMge2FueX0gdGhlIGRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICAgKi9cbiAgc3RhdGljIGdldExvY2FsRGF0YShrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgbG9jYWxTdG9yYWdlID0gQnJvd3NlclN0b3JhZ2UuZ2V0TG9jYWxTdG9yYWdlKCk7XG5cbiAgICBpZihsb2NhbFN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShpdGVtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBsb2NhbFN0b3JhZ2UgZnJvbSBnbG9iYWwgd2luZG93IG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBLZXkgdG8gc3RvcmUgZGF0YS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIERhdGEgdG8gc3RvcmUuXG4gICAqIEByZXR1cm5zIHthbnl9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0TG9jYWxTdG9yYWdlKCk6IGFueSB7XG4gICAgY29uc3Qge2xvY2FsU3RvcmFnZX0gPSBCcm93c2VyU3RvcmFnZS53aW5kb3c7XG4gICAgcmV0dXJuIGxvY2FsU3RvcmFnZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBrZXkgdmFsdWUgZnJvbSBzZXNzaW9uU3RvcmFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IGZvciBkYXRhLlxuICAgKiBAcmV0dXJucyB7YW55fSB0aGUgZGF0YSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2Vzc2lvbkRhdGEoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIGNvbnN0IHNlc3Npb25TdG9yYWdlID0gQnJvd3NlclN0b3JhZ2UuZ2V0U2Vzc2lvblN0b3JhZ2UoKTtcblxuICAgIGlmKHNlc3Npb25TdG9yYWdlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBpdGVtID0gc2Vzc2lvblN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuXG4gICAgICAgIGlmKGl0ZW0pIHtcbiAgICAgICAgICByZXR1cm4gaXRlbSA/IEpTT04ucGFyc2UoaXRlbSkgOiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IHNlc3Npb25TdG9yYWdlIGZyb20gZ2xvYmFsIHdpbmRvdyBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IHRvIHN0b3JlIGRhdGEuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBEYXRhIHRvIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7YW55fSB3aW5kb3cuc2Vzc2lvblN0b3JhZ2UuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2Vzc2lvblN0b3JhZ2UoKTogYW55IHtcbiAgICBjb25zdCB7c2Vzc2lvblN0b3JhZ2V9ID0gQnJvd3NlclN0b3JhZ2Uud2luZG93O1xuXG4gICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IEtleSB0byBzdG9yZSBkYXRhLlxuICAgKiBAcGFyYW0ge2FueX0gdmFsdWUgRGF0YSB0byBzdG9yZS5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFdoZXRoZXIgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHNhdmVkLlxuICAgKi9cbiAgc3RhdGljIHNldExvY2FsRGF0YShrZXk6IHN0cmluZywgdmFsdWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBsb2NhbFN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRMb2NhbFN0b3JhZ2UoKTtcblxuICAgIGlmKGxvY2FsU3RvcmFnZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gc2Vzc2lvblN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgS2V5IHRvIHN0b3JlIGRhdGEuXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSBEYXRhIHRvIHN0b3JlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgc2F2ZWQuXG4gICAqL1xuICBzdGF0aWMgc2V0U2Vzc2lvbkRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2Vzc2lvblN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS5nZXRTZXNzaW9uU3RvcmFnZSgpO1xuXG4gICAgaWYoc2Vzc2lvblN0b3JhZ2UpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNlc3Npb25TdG9yYWdlLnNldEl0ZW0oa2V5LCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIGtleSB2YWx1ZSBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBmb3IgZGF0YS5cbiAgICogQHJldHVybnMge1Byb21pc2U8YW55Pn0gdGhlIGRhdGEgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICAgKi9cbiAgZ2V0U3RvcmFnZURhdGEoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCByZXN1bHRzID0gdHlwZSA9PT0gJ2xvY2FsJyA/IEJyb3dzZXJTdG9yYWdlLmdldExvY2FsRGF0YShrZXkpIDogQnJvd3NlclN0b3JhZ2UuZ2V0U2Vzc2lvbkRhdGEoa2V5KTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHJlc3VsdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIGRhdGEgdG8gc3RvcmFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBLZXkgdG8gc3RvcmUgZGF0YS5cbiAgICogQHBhcmFtIHthbnl9IHZhbHVlIERhdGEgdG8gc3RvcmUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBXaGV0aGVyIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBzYXZlZC5cbiAgICovXG4gIHNldFN0b3JhZ2VEYXRhKGtleTogc3RyaW5nLCB2YWx1ZSk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHt0eXBlfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCByZXN1bHRzOiBib29sZWFuID0gdHlwZSA9PT0gJ2xvY2FsJyA/XG4gICAgICBCcm93c2VyU3RvcmFnZS5zZXRMb2NhbERhdGEoa2V5LCB2YWx1ZSkgOlxuICAgICAgQnJvd3NlclN0b3JhZ2Uuc2V0U2Vzc2lvbkRhdGEoa2V5LCB2YWx1ZSk7XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShyZXN1bHRzKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjRaQUFBLElBQUFBLEVBQUEsR0FBQUMsRUFBQUQsRUFBQSxvQkFBQUUsSUFBQSxlQUFBQyxFQUFBSCxHQU1PLE1BQU1FLENBQWUsQ0FNMUIsWUFBWUUsRUFBaUMsQ0FBQyxFQUFHLENBSmpELEtBQVEsUUFBaUMsQ0FDdkMsS0FBTSxTQUNSLEVBSUUsS0FBSyxlQUFpQixLQUFLLGVBQWUsS0FBSyxJQUFJLEVBQ25ELEtBQUssZUFBaUIsS0FBSyxlQUFlLEtBQUssSUFBSSxFQUduRCxLQUFLLFFBQVUsQ0FBQyxHQUFHLEtBQUssUUFBUyxHQUFHQSxDQUFPLENBQzdDLENBWkEsWUFBTyxPQUFjLFFBQVUsQ0FBQyxFQW9CaEMsT0FBTyxhQUFhQyxFQUFzQixDQUN4QyxNQUFNQyxFQUFlSixFQUFlLGdCQUFnQixFQUVwRCxHQUFHSSxFQUNELEdBQUksQ0FDRixPQUFBQSxFQUFhLFdBQVdELENBQUcsRUFDcEIsRUFDVCxNQUFlLENBQ2IsTUFBTyxFQUNULEtBRUEsT0FBTyxFQUVYLENBUUEsT0FBTyxlQUFlQSxFQUFzQixDQUMxQyxNQUFNRSxFQUFpQkwsRUFBZSxrQkFBa0IsRUFFeEQsR0FBR0ssRUFDRCxHQUFJLENBQ0YsT0FBQUEsRUFBZSxXQUFXRixDQUFHLEVBQ3RCLEVBQ1QsTUFBZSxDQUNiLE1BQU8sRUFDVCxLQUVBLE9BQU8sRUFFWCxDQVFBLE9BQU8sYUFBYUEsRUFBa0IsQ0FDcEMsTUFBTUMsRUFBZUosRUFBZSxnQkFBZ0IsRUFFcEQsR0FBR0ksRUFDRCxHQUFJLENBQ0YsTUFBTUUsRUFBT0YsRUFBYSxRQUFRRCxDQUFHLEVBRXJDLE9BQUdHLEVBQ00sS0FBSyxNQUFNQSxDQUFJLEVBR2pCLElBQ1QsTUFBZSxDQUNiLE9BQU8sSUFDVCxLQUVBLFFBQU8sSUFFWCxDQVNBLE9BQU8saUJBQXVCLENBQzVCLEtBQU0sQ0FBQyxhQUFBRixDQUFZLEVBQUlKLEVBQWUsT0FDdEMsT0FBT0ksQ0FDVCxDQVFBLE9BQU8sZUFBZUQsRUFBa0IsQ0FDdEMsTUFBTUUsRUFBaUJMLEVBQWUsa0JBQWtCLEVBRXhELEdBQUdLLEVBQ0QsR0FBSSxDQUNGLE1BQU1DLEVBQU9ELEVBQWUsUUFBUUYsQ0FBRyxFQUV2QyxPQUFHRyxHQUNNQSxFQUFPLEtBQUssTUFBTUEsQ0FBSSxFQUd4QixJQUNULE1BQWUsQ0FDYixPQUFPLElBQ1QsS0FFQSxRQUFPLElBRVgsQ0FTQSxPQUFPLG1CQUF5QixDQUM5QixLQUFNLENBQUMsZUFBQUQsQ0FBYyxFQUFJTCxFQUFlLE9BRXhDLE9BQU9LLENBQ1QsQ0FTQSxPQUFPLGFBQWFGLEVBQWFJLEVBQWdCLENBQy9DLE1BQU1ILEVBQWVKLEVBQWUsZ0JBQWdCLEVBRXBELEdBQUdJLEVBQ0QsR0FBSSxDQUNGLE9BQUFBLEVBQWEsUUFBUUQsRUFBSyxLQUFLLFVBQVVJLENBQUssQ0FBQyxFQUN4QyxFQUNULE1BQWUsQ0FDYixNQUFPLEVBQ1QsS0FFQSxPQUFPLEVBRVgsQ0FTQSxPQUFPLGVBQWVKLEVBQWFJLEVBQWdCLENBQ2pELE1BQU1GLEVBQWlCTCxFQUFlLGtCQUFrQixFQUV4RCxHQUFHSyxFQUNELEdBQUksQ0FDRixPQUFBQSxFQUFlLFFBQVFGLEVBQUssS0FBSyxVQUFVSSxDQUFLLENBQUMsRUFDMUMsRUFDVCxNQUFlLENBQ2IsTUFBTyxFQUNULEtBRUEsT0FBTyxFQUVYLENBUUEsZUFBZUosRUFBMkIsQ0FDeEMsS0FBTSxDQUFDLEtBQUFLLENBQUksRUFBSSxLQUFLLFFBQ2RDLEVBQVVELElBQVMsUUFBVVIsRUFBZSxhQUFhRyxDQUFHLEVBQUlILEVBQWUsZUFBZUcsQ0FBRyxFQUN2RyxPQUFPLFFBQVEsUUFBUU0sQ0FBTyxDQUNoQyxDQVNBLGVBQWVOLEVBQWFJLEVBQXlCLENBQ25ELEtBQU0sQ0FBQyxLQUFBQyxDQUFJLEVBQUksS0FBSyxRQUNkQyxFQUFtQkQsSUFBUyxRQUNoQ1IsRUFBZSxhQUFhRyxFQUFLSSxDQUFLLEVBQ3RDUCxFQUFlLGVBQWVHLEVBQUtJLENBQUssRUFDMUMsT0FBTyxRQUFRLFFBQVFFLENBQU8sQ0FDaEMsQ0FDRiIsCiAgIm5hbWVzIjogWyJCcm93c2VyU3RvcmFnZV9leHBvcnRzIiwgIl9fZXhwb3J0IiwgIkJyb3dzZXJTdG9yYWdlIiwgIl9fdG9Db21tb25KUyIsICJvcHRpb25zIiwgImtleSIsICJsb2NhbFN0b3JhZ2UiLCAic2Vzc2lvblN0b3JhZ2UiLCAiaXRlbSIsICJ2YWx1ZSIsICJ0eXBlIiwgInJlc3VsdHMiXQp9Cg==
1
+ const c="arkhamjs_";const n=i=>i.ttl?Date.now()-i.timestamp>i.ttl:!1,l=i=>new Blob([i]).size,h=i=>{const e=JSON.stringify(i);return e.length>1e3,e},g=i=>{try{return JSON.parse(i)}catch{return null}};class a{static window=typeof window<"u"?window:{};options;storageCache=new Map;storage;constructor(e={}){this.options={compression:!1,maxSize:5242880,prefix:c,ttl:864e5,type:"session",...e},this.storage=this.getStorage()}static delLocalData(e){try{const t=a.window.localStorage;if(t)return t.removeItem(e),!0}catch{}return!1}static delSessionData(e){try{const t=a.window.sessionStorage;if(t)return t.removeItem(e),!0}catch{}return!1}static getLocalData(e){try{const t=a.window.localStorage;if(t){const r=t.getItem(e);return r?JSON.parse(r):null}}catch{}return null}static getSessionData(e){try{const t=a.window.sessionStorage;if(t){const r=t.getItem(e);return r?JSON.parse(r):null}}catch{}return null}static setLocalData(e,t){try{const r=a.window.localStorage;if(r)return r.setItem(e,JSON.stringify(t)),!0}catch{}return!1}static setSessionData(e,t){try{const r=a.window.sessionStorage;if(r)return r.setItem(e,JSON.stringify(t)),!0}catch{}return!1}static getLocalStorage(){try{return a.window.localStorage||null}catch{return null}}static getSessionStorage(){try{return a.window.sessionStorage||null}catch{return null}}async getStorageData(e){if(!this.isStorageAvailable())return null;const t=this.getPrefixedKey(e);if(this.storageCache.has(t))return this.storageCache.get(t);try{const r=this.storage.getItem(t);if(!r)return null;const s=g(r);return s?n(s)?(this.storage.removeItem(t),this.storageCache.delete(t),null):(this.storageCache.set(t,s.value),s.value):null}catch{return null}}async setStorageData(e,t){if(!this.isStorageAvailable())return!1;const r=this.getPrefixedKey(e);try{Math.random()<.1&&this.cleanExpiredData();const s={timestamp:Date.now(),ttl:this.options.ttl,value:t},o=this.options.compression?h(s):JSON.stringify(s);return this.validateSize(o)?(this.storage.setItem(r,o),this.storageCache.set(r,t),!0):!1}catch{return!1}}async removeStorageData(e){if(!this.isStorageAvailable())return!1;const t=this.getPrefixedKey(e);try{return this.storage.removeItem(t),this.storageCache.delete(t),!0}catch{return!1}}async clearStorageData(){if(!this.isStorageAvailable())return!1;try{const e=[];for(let t=0;t<this.storage.length;t++){const r=this.storage.key(t);r?.startsWith(this.options.prefix)&&e.push(r)}return e.forEach(t=>{this.storage.removeItem(t),this.storageCache.delete(t)}),!0}catch{return!1}}getStorageStats(){if(!this.isStorageAvailable())return{available:0,total:0,used:0};let e=0;const t=[];for(let r=0;r<this.storage.length;r++){const s=this.storage.key(r);if(s?.startsWith(this.options.prefix)){t.push(s);const o=this.storage.getItem(s);o&&(e+=l(o))}}return{available:this.options.maxSize-e,total:this.options.maxSize,used:e}}getStorage(){try{const{type:e}=this.options;return(e==="local"?a.window.localStorage:a.window.sessionStorage)||null}catch{return null}}getPrefixedKey(e){return`${this.options.prefix}${e}`}isStorageAvailable(){return this.storage!==null}validateSize(e){return l(e)<=this.options.maxSize}cleanExpiredData(){if(!this.isStorageAvailable())return;const e=[];for(let t=0;t<this.storage.length;t++){const r=this.storage.key(t);r?.startsWith(this.options.prefix)&&e.push(r)}e.forEach(t=>{try{const r=this.storage.getItem(t);if(r){const s=g(r);s&&n(s)&&(this.storage.removeItem(t),this.storageCache.delete(t))}}catch{this.storage.removeItem(t),this.storageCache.delete(t)}})}}export{a as BrowserStorage};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL0Jyb3dzZXJTdG9yYWdlL0Jyb3dzZXJTdG9yYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHR5cGUge1xuICBCcm93c2VyU3RvcmFnZU9wdGlvbnMsXG4gIFN0b3JhZ2VEYXRhLFxuICBTdG9yYWdlSW50ZXJmYWNlXG59IGZyb20gJy4uL3R5cGVzL21haW4nO1xuXG4vLyBDb25zdGFudHMgZm9yIG9wdGltaXphdGlvblxuY29uc3QgREVGQVVMVF9QUkVGSVggPSAnYXJraGFtanNfJztcbmNvbnN0IERFRkFVTFRfTUFYX1NJWkUgPSA1ICogMTAyNCAqIDEwMjQ7IC8vIDVNQlxuY29uc3QgREVGQVVMVF9UVEwgPSAyNCAqIDYwICogNjAgKiAxMDAwOyAvLyAyNCBob3Vyc1xuXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuY29uc3QgaXNFeHBpcmVkID0gKGRhdGE6IFN0b3JhZ2VEYXRhKTogYm9vbGVhbiA9PiB7XG4gIGlmKCFkYXRhLnR0bCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gRGF0ZS5ub3coKSAtIGRhdGEudGltZXN0YW1wID4gZGF0YS50dGw7XG59O1xuXG5jb25zdCBnZXRTdG9yYWdlU2l6ZSA9IChkYXRhOiBzdHJpbmcpOiBudW1iZXIgPT4gbmV3IEJsb2IoW2RhdGFdKS5zaXplO1xuXG5jb25zdCBjb21wcmVzc0RhdGEgPSAoZGF0YTogYW55KTogc3RyaW5nID0+IHtcbiAgLy8gU2ltcGxlIGNvbXByZXNzaW9uIGZvciBsYXJnZSBvYmplY3RzXG4gIGNvbnN0IGpzb25TdHJpbmcgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgaWYoanNvblN0cmluZy5sZW5ndGggPiAxMDAwKSB7XG4gICAgLy8gRm9yIGxhcmdlIGRhdGEsIHdlIGNvdWxkIGltcGxlbWVudCBhY3R1YWwgY29tcHJlc3Npb24gaGVyZVxuICAgIC8vIEZvciBub3csIHdlJ2xsIHVzZSBhIHNpbXBsZSBhcHByb2FjaFxuICAgIHJldHVybiBqc29uU3RyaW5nO1xuICB9XG4gIHJldHVybiBqc29uU3RyaW5nO1xufTtcblxuY29uc3QgZGVjb21wcmVzc0RhdGEgPSAoZGF0YTogc3RyaW5nKTogYW55ID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShkYXRhKTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuZXhwb3J0IGNsYXNzIEJyb3dzZXJTdG9yYWdlIHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgd2luZG93OiBXaW5kb3cgJiB0eXBlb2YgZ2xvYmFsVGhpcyA9XG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB7fSBhcyBhbnk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBSZXF1aXJlZDxCcm93c2VyU3RvcmFnZU9wdGlvbnM+O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZTogU3RvcmFnZUludGVyZmFjZSB8IG51bGw7XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogQnJvd3NlclN0b3JhZ2VPcHRpb25zID0ge30pIHtcbiAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICBjb21wcmVzc2lvbjogZmFsc2UsXG4gICAgICBtYXhTaXplOiBERUZBVUxUX01BWF9TSVpFLFxuICAgICAgcHJlZml4OiBERUZBVUxUX1BSRUZJWCxcbiAgICAgIHR0bDogREVGQVVMVF9UVEwsXG4gICAgICB0eXBlOiAnc2Vzc2lvbicsXG4gICAgICAuLi5vcHRpb25zXG4gICAgfTtcblxuICAgIHRoaXMuc3RvcmFnZSA9IHRoaXMuZ2V0U3RvcmFnZSgpO1xuICB9XG5cbiAgLy8gU3RhdGljIG1ldGhvZHMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgc3RhdGljIGRlbExvY2FsRGF0YShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gQnJvd3NlclN0b3JhZ2Uud2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0gY2F0Y2h7XG4gICAgICAvLyBTdG9yYWdlIG5vdCBhdmFpbGFibGVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGRlbFNlc3Npb25EYXRhKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JhZ2UgPSBCcm93c2VyU3RvcmFnZS53aW5kb3cuc2Vzc2lvblN0b3JhZ2U7XG4gICAgICBpZihzdG9yYWdlKSB7XG4gICAgICAgIHN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoe1xuICAgICAgLy8gU3RvcmFnZSBub3QgYXZhaWxhYmxlXG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRMb2NhbERhdGEoa2V5OiBzdHJpbmcpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gQnJvd3NlclN0b3JhZ2Uud2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICByZXR1cm4gaXRlbSA/IEpTT04ucGFyc2UoaXRlbSkgOiBudWxsO1xuICAgICAgfVxuICAgIH0gY2F0Y2h7XG4gICAgICAvLyBTdG9yYWdlIG5vdCBhdmFpbGFibGUgb3IgaW52YWxpZCBKU09OXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIGdldFNlc3Npb25EYXRhKGtleTogc3RyaW5nKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmFnZSA9IEJyb3dzZXJTdG9yYWdlLndpbmRvdy5zZXNzaW9uU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IHN0b3JhZ2UuZ2V0SXRlbShrZXkpO1xuICAgICAgICByZXR1cm4gaXRlbSA/IEpTT04ucGFyc2UoaXRlbSkgOiBudWxsO1xuICAgICAgfVxuICAgIH0gY2F0Y2h7XG4gICAgICAvLyBTdG9yYWdlIG5vdCBhdmFpbGFibGUgb3IgaW52YWxpZCBKU09OXG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc3RhdGljIHNldExvY2FsRGF0YShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yYWdlID0gQnJvd3NlclN0b3JhZ2Uud2luZG93LmxvY2FsU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaHtcbiAgICAgIC8vIFN0b3JhZ2Ugbm90IGF2YWlsYWJsZSBvciBxdW90YSBleGNlZWRlZFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgc2V0U2Vzc2lvbkRhdGEoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmFnZSA9IEJyb3dzZXJTdG9yYWdlLndpbmRvdy5zZXNzaW9uU3RvcmFnZTtcbiAgICAgIGlmKHN0b3JhZ2UpIHtcbiAgICAgICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaHtcbiAgICAgIC8vIFN0b3JhZ2Ugbm90IGF2YWlsYWJsZSBvciBxdW90YSBleGNlZWRlZFxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgZ2V0TG9jYWxTdG9yYWdlKCk6IFN0b3JhZ2UgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJyb3dzZXJTdG9yYWdlLndpbmRvdy5sb2NhbFN0b3JhZ2UgfHwgbnVsbDtcbiAgICB9IGNhdGNoe1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGdldFNlc3Npb25TdG9yYWdlKCk6IFN0b3JhZ2UgfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEJyb3dzZXJTdG9yYWdlLndpbmRvdy5zZXNzaW9uU3RvcmFnZSB8fCBudWxsO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvLyBQdWJsaWMgaW5zdGFuY2UgbWV0aG9kc1xuICBhc3luYyBnZXRTdG9yYWdlRGF0YShrZXk6IHN0cmluZyk6IFByb21pc2U8YW55PiB7XG4gICAgaWYoIXRoaXMuaXNTdG9yYWdlQXZhaWxhYmxlKCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gdGhpcy5nZXRQcmVmaXhlZEtleShrZXkpO1xuXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3RcbiAgICBpZih0aGlzLnN0b3JhZ2VDYWNoZS5oYXMocHJlZml4ZWRLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdG9yYWdlQ2FjaGUuZ2V0KHByZWZpeGVkS2V5KTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaXRlbSA9IHRoaXMuc3RvcmFnZSEuZ2V0SXRlbShwcmVmaXhlZEtleSk7XG4gICAgICBpZighaXRlbSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IGRlY29tcHJlc3NEYXRhKGl0ZW0pO1xuICAgICAgaWYoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGRhdGEgaXMgZXhwaXJlZFxuICAgICAgaWYoaXNFeHBpcmVkKGRhdGEpKSB7XG4gICAgICAgIHRoaXMuc3RvcmFnZSEucmVtb3ZlSXRlbShwcmVmaXhlZEtleSk7XG4gICAgICAgIHRoaXMuc3RvcmFnZUNhY2hlLmRlbGV0ZShwcmVmaXhlZEtleSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWNoZSB0aGUgcmVzdWx0XG4gICAgICB0aGlzLnN0b3JhZ2VDYWNoZS5zZXQocHJlZml4ZWRLZXksIGRhdGEudmFsdWUpO1xuICAgICAgcmV0dXJuIGRhdGEudmFsdWU7XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNldFN0b3JhZ2VEYXRhKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYoIXRoaXMuaXNTdG9yYWdlQXZhaWxhYmxlKCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmaXhlZEtleSA9IHRoaXMuZ2V0UHJlZml4ZWRLZXkoa2V5KTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBDbGVhbiBleHBpcmVkIGRhdGEgcGVyaW9kaWNhbGx5XG4gICAgICBpZihNYXRoLnJhbmRvbSgpIDwgMC4xKSB7IC8vIDEwJSBjaGFuY2UgdG8gY2xlYW5cbiAgICAgICAgdGhpcy5jbGVhbkV4cGlyZWREYXRhKCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0b3JhZ2VEYXRhOiBTdG9yYWdlRGF0YSA9IHtcbiAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgICAgICB0dGw6IHRoaXMub3B0aW9ucy50dGwsXG4gICAgICAgIHZhbHVlXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBqc29uU3RyaW5nID0gdGhpcy5vcHRpb25zLmNvbXByZXNzaW9uXG4gICAgICAgID8gY29tcHJlc3NEYXRhKHN0b3JhZ2VEYXRhKVxuICAgICAgICA6IEpTT04uc3RyaW5naWZ5KHN0b3JhZ2VEYXRhKTtcblxuICAgICAgLy8gVmFsaWRhdGUgc2l6ZVxuICAgICAgaWYoIXRoaXMudmFsaWRhdGVTaXplKGpzb25TdHJpbmcpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihgU3RvcmFnZSBkYXRhIGV4Y2VlZHMgbWF4aW11bSBzaXplIGZvciBrZXk6ICR7a2V5fWApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RvcmFnZSEuc2V0SXRlbShwcmVmaXhlZEtleSwganNvblN0cmluZyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBjYWNoZVxuICAgICAgdGhpcy5zdG9yYWdlQ2FjaGUuc2V0KHByZWZpeGVkS2V5LCB2YWx1ZSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc2V0IHN0b3JhZ2UgZGF0YTonLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVtb3ZlU3RvcmFnZURhdGEoa2V5OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZighdGhpcy5pc1N0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHByZWZpeGVkS2V5ID0gdGhpcy5nZXRQcmVmaXhlZEtleShrZXkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuc3RvcmFnZSEucmVtb3ZlSXRlbShwcmVmaXhlZEtleSk7XG4gICAgICB0aGlzLnN0b3JhZ2VDYWNoZS5kZWxldGUocHJlZml4ZWRLZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBjbGVhclN0b3JhZ2VEYXRhKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmKCF0aGlzLmlzU3RvcmFnZUF2YWlsYWJsZSgpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zdG9yYWdlIS5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2UhLmtleShpKTtcbiAgICAgICAgaWYoa2V5Py5zdGFydHNXaXRoKHRoaXMub3B0aW9ucy5wcmVmaXgpKSB7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgdGhpcy5zdG9yYWdlIS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgIHRoaXMuc3RvcmFnZUNhY2hlLmRlbGV0ZShrZXkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2h7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RvcmFnZVN0YXRzKCk6IHsgYXZhaWxhYmxlOiBudW1iZXI7IHRvdGFsOiBudW1iZXI7IHVzZWQ6IG51bWJlciB9IHtcbiAgICBpZighdGhpcy5pc1N0b3JhZ2VBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuIHthdmFpbGFibGU6IDAsIHRvdGFsOiAwLCB1c2VkOiAwfTtcbiAgICB9XG5cbiAgICBsZXQgdXNlZCA9IDA7XG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aGlzLnN0b3JhZ2UhLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnN0b3JhZ2UhLmtleShpKTtcbiAgICAgIGlmKGtleT8uc3RhcnRzV2l0aCh0aGlzLm9wdGlvbnMucHJlZml4KSkge1xuICAgICAgICBrZXlzLnB1c2goa2V5KTtcbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuc3RvcmFnZSEuZ2V0SXRlbShrZXkpO1xuICAgICAgICBpZihpdGVtKSB7XG4gICAgICAgICAgdXNlZCArPSBnZXRTdG9yYWdlU2l6ZShpdGVtKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhdmFpbGFibGU6IHRoaXMub3B0aW9ucy5tYXhTaXplIC0gdXNlZCxcbiAgICAgIHRvdGFsOiB0aGlzLm9wdGlvbnMubWF4U2l6ZSxcbiAgICAgIHVzZWRcbiAgICB9O1xuICB9XG5cbiAgLy8gUHJpdmF0ZSBoZWxwZXIgbWV0aG9kc1xuICBwcml2YXRlIGdldFN0b3JhZ2UoKTogU3RvcmFnZUludGVyZmFjZSB8IG51bGwge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB7dHlwZX0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICBjb25zdCBzdG9yYWdlID0gdHlwZSA9PT0gJ2xvY2FsJ1xuICAgICAgICA/IEJyb3dzZXJTdG9yYWdlLndpbmRvdy5sb2NhbFN0b3JhZ2VcbiAgICAgICAgOiBCcm93c2VyU3RvcmFnZS53aW5kb3cuc2Vzc2lvblN0b3JhZ2U7XG5cbiAgICAgIHJldHVybiBzdG9yYWdlIHx8IG51bGw7XG4gICAgfSBjYXRjaHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHJlZml4ZWRLZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm9wdGlvbnMucHJlZml4fSR7a2V5fWA7XG4gIH1cblxuICBwcml2YXRlIGlzU3RvcmFnZUF2YWlsYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdG9yYWdlICE9PSBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNpemUoZGF0YTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgY29uc3Qgc2l6ZSA9IGdldFN0b3JhZ2VTaXplKGRhdGEpO1xuICAgIHJldHVybiBzaXplIDw9IHRoaXMub3B0aW9ucy5tYXhTaXplO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbkV4cGlyZWREYXRhKCk6IHZvaWQge1xuICAgIGlmKCF0aGlzLmlzU3RvcmFnZUF2YWlsYWJsZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qga2V5czogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhpcy5zdG9yYWdlIS5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdG9yYWdlIS5rZXkoaSk7XG4gICAgICBpZihrZXk/LnN0YXJ0c1dpdGgodGhpcy5vcHRpb25zLnByZWZpeCkpIHtcbiAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnN0b3JhZ2UhLmdldEl0ZW0oa2V5KTtcbiAgICAgICAgaWYoaXRlbSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBkZWNvbXByZXNzRGF0YShpdGVtKTtcbiAgICAgICAgICBpZihkYXRhICYmIGlzRXhwaXJlZChkYXRhKSkge1xuICAgICAgICAgICAgdGhpcy5zdG9yYWdlIS5yZW1vdmVJdGVtKGtleSk7XG4gICAgICAgICAgICB0aGlzLnN0b3JhZ2VDYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2h7XG4gICAgICAgIC8vIFJlbW92ZSBjb3JydXB0ZWQgZGF0YVxuICAgICAgICB0aGlzLnN0b3JhZ2UhLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgICAgdGhpcy5zdG9yYWdlQ2FjaGUuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQVdBLE1BQU1BLEVBQWlCLFlBS3ZCLE1BQU1DLEVBQWFDLEdBQ2JBLEVBQUssSUFHRixLQUFLLElBQUksRUFBSUEsRUFBSyxVQUFZQSxFQUFLLElBRmpDLEdBS0xDLEVBQWtCRCxHQUF5QixJQUFJLEtBQUssQ0FBQ0EsQ0FBSSxDQUFDLEVBQUUsS0FFNURFLEVBQWdCRixHQUFzQixDQUUxQyxNQUFNRyxFQUFhLEtBQUssVUFBVUgsQ0FBSSxFQUN0QyxPQUFHRyxFQUFXLE9BQVMsSUFHZEEsQ0FHWCxFQUVNQyxFQUFrQkosR0FBc0IsQ0FDNUMsR0FBSSxDQUNGLE9BQU8sS0FBSyxNQUFNQSxDQUFJLENBQ3hCLE1BQU8sQ0FDTCxPQUFPLElBQ1QsQ0FDRixFQUVPLE1BQU1LLENBQWUsQ0FDMUIsT0FBd0IsT0FDdEIsT0FBTyxPQUFXLElBQWMsT0FBUyxDQUFDLEVBRTNCLFFBQ0EsYUFBZSxJQUFJLElBQ25CLFFBRWpCLFlBQVlDLEVBQWlDLENBQUMsRUFBRyxDQUMvQyxLQUFLLFFBQVUsQ0FDYixZQUFhLEdBQ2IsUUFBUyxRQUNULE9BQVFDLEVBQ1IsSUFBSyxNQUNMLEtBQU0sVUFDTixHQUFHRCxDQUNMLEVBRUEsS0FBSyxRQUFVLEtBQUssV0FBVyxDQUNqQyxDQUdBLE9BQU8sYUFBYUUsRUFBc0IsQ0FDeEMsR0FBSSxDQUNGLE1BQU1DLEVBQVVKLEVBQWUsT0FBTyxhQUN0QyxHQUFHSSxFQUNELE9BQUFBLEVBQVEsV0FBV0QsQ0FBRyxFQUNmLEVBRVgsTUFBTyxDQUVQLENBQ0EsTUFBTyxFQUNULENB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S0FBSyxRQUFTLFFBQVFGLENBQUcsRUFDbkNFLElBQ0RNLEdBQVFmLEVBQWVTLENBQUksRUFFL0IsQ0FDRixDQUVBLE1BQU8sQ0FDTCxVQUFXLEtBQUssUUFBUSxRQUFVTSxFQUNsQyxNQUFPLEtBQUssUUFBUSxRQUNwQixLQUFBQSxDQUNGLENBQ0YsQ0FHUSxZQUFzQyxDQUM1QyxHQUFJLENBQ0YsS0FBTSxDQUFDLEtBQUFDLENBQUksRUFBSSxLQUFLLFFBS3BCLE9BSmdCQSxJQUFTLFFBQ3JCWixFQUFlLE9BQU8sYUFDdEJBLEVBQWUsT0FBTyxpQkFFUixJQUNwQixNQUFPLENBQ0wsT0FBTyxJQUNULENBQ0YsQ0FFUSxlQUFlRyxFQUFxQixDQUMxQyxNQUFPLEdBQUcsS0FBSyxRQUFRLE1BQU0sR0FBR0EsQ0FBRyxFQUNyQyxDQUVRLG9CQUE4QixDQUNwQyxPQUFPLEtBQUssVUFBWSxJQUMxQixDQUVRLGFBQWFSLEVBQXVCLENBRTFDLE9BRGFDLEVBQWVELENBQUksR0FDakIsS0FBSyxRQUFRLE9BQzlCLENBRVEsa0JBQXlCLENBQy9CLEdBQUcsQ0FBQyxLQUFLLG1CQUFtQixFQUMxQixPQUdGLE1BQU1jLEVBQWlCLENBQUMsRUFDeEIsUUFBUUMsRUFBSSxFQUFHQSxFQUFJLEtBQUssUUFBUyxPQUFRQSxJQUFLLENBQzVDLE1BQU1QLEVBQU0sS0FBSyxRQUFTLElBQUlPLENBQUMsRUFDNUJQLEdBQUssV0FBVyxLQUFLLFFBQVEsTUFBTSxHQUNwQ00sRUFBSyxLQUFLTixDQUFHLENBRWpCLENBRUFNLEVBQUssUUFBU04sR0FBUSxDQUNwQixHQUFJLENBQ0YsTUFBTUUsRUFBTyxLQUFLLFFBQVMsUUFBUUYsQ0FBRyxFQUN0QyxHQUFHRSxFQUFNLENBQ1AsTUFBTVYsRUFBT0ksRUFBZU0sQ0FBSSxFQUM3QlYsR0FBUUQsRUFBVUMsQ0FBSSxJQUN2QixLQUFLLFFBQVMsV0FBV1EsQ0FBRyxFQUM1QixLQUFLLGFBQWEsT0FBT0EsQ0FBRyxFQUVoQyxDQUNGLE1BQU8sQ0FFTCxLQUFLLFFBQVMsV0FBV0EsQ0FBRyxFQUM1QixLQUFLLGFBQWEsT0FBT0EsQ0FBRyxDQUM5QixDQUNGLENBQUMsQ0FDSCxDQUNGIiwKICAibmFtZXMiOiBbIkRFRkFVTFRfUFJFRklYIiwgImlzRXhwaXJlZCIsICJkYXRhIiwgImdldFN0b3JhZ2VTaXplIiwgImNvbXByZXNzRGF0YSIsICJqc29uU3RyaW5nIiwgImRlY29tcHJlc3NEYXRhIiwgIkJyb3dzZXJTdG9yYWdlIiwgIm9wdGlvbnMiLCAiREVGQVVMVF9QUkVGSVgiLCAia2V5IiwgInN0b3JhZ2UiLCAiaXRlbSIsICJ2YWx1ZSIsICJwcmVmaXhlZEtleSIsICJzdG9yYWdlRGF0YSIsICJrZXlzIiwgImkiLCAidXNlZCIsICJ0eXBlIl0KfQo=
package/lib/index.d.ts CHANGED
@@ -1,3 +1,7 @@
1
+ /**
2
+ * Copyright (c) 2018-Present, Nitrogen Labs, Inc.
3
+ * Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
4
+ */
1
5
  import { BrowserStorage } from './BrowserStorage/BrowserStorage';
2
6
  export * from './types/main';
3
7
  export { BrowserStorage };
package/lib/index.js CHANGED
@@ -1,2 +1,2 @@
1
- var x=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var w=Object.prototype.hasOwnProperty;var B=(o,r)=>{for(var e in r)x(o,e,{get:r[e],enumerable:!0})},f=(o,r,e,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of s(r))!w.call(o,t)&&t!==e&&x(o,t,{get:()=>r[t],enumerable:!(a=i(r,t))||a.enumerable});return o},p=(o,r,e)=>(f(o,r,"default"),e&&f(e,r,"default"));var S=o=>f(x({},"__esModule",{value:!0}),o);var m={};B(m,{BrowserStorage:()=>g.BrowserStorage});module.exports=S(m);var g=require("./BrowserStorage/BrowserStorage");p(m,require("./types/main"),module.exports);0&&(module.exports={BrowserStorage,...require("./types/main")});
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtCcm93c2VyU3RvcmFnZX0gZnJvbSAnLi9Ccm93c2VyU3RvcmFnZS9Ccm93c2VyU3RvcmFnZSc7XG5cbi8vIFN0b3JhZ2VcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvbWFpbic7XG5leHBvcnQge0Jyb3dzZXJTdG9yYWdlfTtcbiJdLAogICJtYXBwaW5ncyI6ICI4Y0FBQSxJQUFBQSxFQUFBLEdBQUFDLEVBQUFELEVBQUEsc0RBQUFFLEVBQUFGLEdBSUEsSUFBQUcsRUFBNkIsMkNBRzdCQyxFQUFBSixFQUFjLHdCQVBkIiwKICAibmFtZXMiOiBbImluZGV4X2V4cG9ydHMiLCAiX19leHBvcnQiLCAiX190b0NvbW1vbkpTIiwgImltcG9ydF9Ccm93c2VyU3RvcmFnZSIsICJfX3JlRXhwb3J0Il0KfQo=
1
+ import{BrowserStorage as o}from"./BrowserStorage/BrowserStorage";export*from"./types/main";export{o as BrowserStorage};
2
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxOC1QcmVzZW50LCBOaXRyb2dlbiBMYWJzLCBJbmMuXG4gKiBDb3B5cmlnaHRzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIHRoZSBhY2NvbXBhbnlpbmcgTElDRU5TRSBmaWxlIGZvciB0ZXJtcy5cbiAqL1xuaW1wb3J0IHtCcm93c2VyU3RvcmFnZX0gZnJvbSAnLi9Ccm93c2VyU3RvcmFnZS9Ccm93c2VyU3RvcmFnZSc7XG5cbi8vIFN0b3JhZ2VcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvbWFpbic7XG5leHBvcnQge0Jyb3dzZXJTdG9yYWdlfTtcbiJdLAogICJtYXBwaW5ncyI6ICJBQUlBLE9BQVEsa0JBQUFBLE1BQXFCLGtDQUc3QixXQUFjIiwKICAibmFtZXMiOiBbIkJyb3dzZXJTdG9yYWdlIl0KfQo=
@@ -1,3 +1,21 @@
1
1
  export interface BrowserStorageOptions {
2
2
  readonly type?: 'local' | 'session';
3
+ readonly prefix?: string;
4
+ readonly compression?: boolean;
5
+ readonly maxSize?: number;
6
+ readonly ttl?: number;
7
+ }
8
+ export interface StorageData {
9
+ readonly value: any;
10
+ readonly timestamp: number;
11
+ readonly ttl?: number;
12
+ }
13
+ export type StorageType = 'local' | 'session';
14
+ export interface StorageInterface {
15
+ readonly length: number;
16
+ readonly getItem: (key: string) => string | null;
17
+ readonly setItem: (key: string, value: string) => void;
18
+ readonly removeItem: (key: string) => void;
19
+ readonly clear: () => void;
20
+ readonly key: (index: number) => string | null;
3
21
  }
package/lib/types/main.js CHANGED
@@ -1,2 +1 @@
1
- var t=Object.defineProperty;var n=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var p=(o,e,a,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of i(e))!l.call(o,r)&&r!==a&&t(o,r,{get:()=>e[r],enumerable:!(s=n(e,r))||s.enumerable});return o};var c=o=>p(t({},"__esModule",{value:!0}),o);var y={};module.exports=c(y);
2
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3R5cGVzL21haW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImV4cG9ydCBpbnRlcmZhY2UgQnJvd3NlclN0b3JhZ2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgdHlwZT86ICdsb2NhbCcgfCAnc2Vzc2lvbic7XG59XG4iXSwKICAibWFwcGluZ3MiOiAia1dBQUEsSUFBQUEsRUFBQSxrQkFBQUMsRUFBQUQiLAogICJuYW1lcyI6IFsibWFpbl9leHBvcnRzIiwgIl9fdG9Db21tb25KUyJdCn0K
1
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFtdLAogICJzb3VyY2VzQ29udGVudCI6IFtdLAogICJtYXBwaW5ncyI6ICIiLAogICJuYW1lcyI6IFtdCn0K
package/package.json CHANGED
@@ -1,21 +1,34 @@
1
1
  {
2
2
  "name": "@nlabs/arkhamjs-storage-browser",
3
- "version": "3.29.0",
3
+ "version": "3.30.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "description": "Browser storage for ArkhamJS",
7
+ "description": "Browser storage for ArkhamJS with enhanced performance and modern ESNext features",
8
8
  "license": "MIT",
9
9
  "main": "./lib/index.js",
10
10
  "module": "./lib/index.js",
11
11
  "browser": "./lib/index.js",
12
12
  "types": "./lib/index.d.ts",
13
+ "exports": {
14
+ ".": {
15
+ "import": "./lib/index.js",
16
+ "require": "./lib/index.js",
17
+ "types": "./lib/index.d.ts"
18
+ },
19
+ "./package.json": "./package.json"
20
+ },
21
+ "sideEffects": false,
13
22
  "keywords": [
14
23
  "arkhamjs",
15
24
  "flux",
16
25
  "browser",
17
26
  "nitrogenlabs",
18
- "storage"
27
+ "storage",
28
+ "localStorage",
29
+ "sessionStorage",
30
+ "cache",
31
+ "performance"
19
32
  ],
20
33
  "author": {
21
34
  "name": "Giraldo Rosales",
@@ -41,14 +54,18 @@
41
54
  "pretest": "npm run lint",
42
55
  "reset": "lex clean",
43
56
  "test": "lex test",
44
- "update": "lex update --interactive"
57
+ "test:watch": "lex test --watch",
58
+ "test:coverage": "lex test --coverage",
59
+ "update": "lex update --interactive",
60
+ "type-check": "tsc --noEmit",
61
+ "size": "npm run build && node -e \"console.log('Bundle size:', require('fs').statSync('./lib/index.js').size, 'bytes')\""
45
62
  },
46
63
  "peerDependencies": {
47
64
  "@nlabs/arkhamjs": "^3.26.0"
48
65
  },
49
66
  "devDependencies": {
67
+ "@jest/globals": "^30.0.4",
50
68
  "@nlabs/arkhamjs": "*",
51
- "@types/jest": "^30.0.0",
52
69
  "@types/node": "^24.0.10",
53
70
  "typescript": "^5.8.3"
54
71
  },