@biglogic/rgs 3.9.1 → 3.9.2
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 +479 -0
- package/core/advanced.cjs +1 -1
- package/core/minimal.cjs +1 -1
- package/index.cjs +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,479 @@
|
|
|
1
|
+
# 🚀 ARGIS (RGS) - Reactive Global State
|
|
2
|
+
|
|
3
|
+
> **"Atomic Precision. Immutable Safety. Zen Simplicity."**
|
|
4
|
+
> The state management engine that **won't let you fail**.
|
|
5
|
+
|
|
6
|
+
[](https://npmjs.org/package/@biglogic/rgs)
|
|
7
|
+
[](https://npmjs.org/package/@biglogic/rgs)
|
|
8
|
+
[](https://opensource.org/licenses/MIT)
|
|
9
|
+
[](https://www.typescriptlang.org/)
|
|
10
|
+
[](https://react.dev/)
|
|
11
|
+
|
|
12
|
+
> **🔐 Security Compliance**: This project is fully compliant with **NIST SP 800-132** standards for password-based key derivation, featuring AES-256-GCM encryption, PBKDF2 with 600k iterations, and 32-byte salts.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## ⚡ TL;DR
|
|
17
|
+
|
|
18
|
+
>Why ARGIS (RGS) Will Change How You Code Forever
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
// One line. Zero boilerplate. Enterprise-grade power.
|
|
22
|
+
const useUser = gstate({
|
|
23
|
+
name: 'Alice',
|
|
24
|
+
cart: [],
|
|
25
|
+
preferences: { theme: 'dark' }
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
// That's it. Use it anywhere:
|
|
29
|
+
const name = useUser(s => s.name)
|
|
30
|
+
const theme = useUser(s => s.preferences.theme)
|
|
31
|
+
|
|
32
|
+
// Mutations? Just write it. Immer handles immutability automatically.
|
|
33
|
+
useUser(s => {
|
|
34
|
+
s.cart.push({ id: 1, item: 'Coffee Machine', price: 99 })
|
|
35
|
+
})
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Stop fighting your state management. Start building.**
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 🎯 Why Developers Are **Obsessed** With ARGIS (RGS)
|
|
43
|
+
|
|
44
|
+
| Feature | Other Libraries | ARGIS (RGS) |
|
|
45
|
+
|---------|----------------|--------------|
|
|
46
|
+
| **API Complexity** | 10+ functions, providers, reducers | **1 function** - `gstate()` |
|
|
47
|
+
| **Immutability** | Manual spreads, Redux boilerplate | **Automatic** - Powered by Immer |
|
|
48
|
+
| **Security** | None | **AES-256 + RBAC + GDPR** built-in |
|
|
49
|
+
| **Persistence** | Manual localStorage/sessionStorage | **First-class** - Auto-save anywhere |
|
|
50
|
+
| **Offline/Cloud Sync** | Non-existent | **Local-First + Cloud Sync** included |
|
|
51
|
+
| **Bundle Size** | 10-50KB+ | **~2KB** minimal / **~32KB** full |
|
|
52
|
+
| **Type Safety** | Partial | **100% TypeScript** out of the box |
|
|
53
|
+
|
|
54
|
+
### 🔥 The Truth About State Management
|
|
55
|
+
|
|
56
|
+
Most libraries make you **choose** between:
|
|
57
|
+
- ✗ Simplicity vs Power
|
|
58
|
+
- ✗ Security vs Speed
|
|
59
|
+
- ✗ Offline vs Cloud
|
|
60
|
+
|
|
61
|
+
**ARGIS (RGS) gives you ALL of it.**
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 🏆 RGS vs The Competition
|
|
66
|
+
|
|
67
|
+
| Feature | **RGS (Argis)** | Zustand | Redux Toolkit | Recoil | Jotai |
|
|
68
|
+
|---------|:---:|:---:|:---:|:---:|:---:|
|
|
69
|
+
| **Philosophy** | Zen State | Minimalist | Enterprise Flux | Atomic | Atomic |
|
|
70
|
+
| **API Surface** | **1 Function** | Simple | Complex | Complex | Simple |
|
|
71
|
+
| **Mutations** | **Magic (Immer)** | Manual | Magic | Manual | Manual |
|
|
72
|
+
| **Security** | 🛡️ **AES-256 + RBAC** | ❌ | ❌ | ❌ | ❌ |
|
|
73
|
+
| **Persistence** | 💾 **First-class** | 🔌 | 🔌 | 🔌 | 🔌 |
|
|
74
|
+
| **Local-First Sync** | ✅ **Built-in** | ❌ | ❌ | ❌ | ❌ |
|
|
75
|
+
| **Bundle Size** | **~2KB/32KB** | ~1KB | >10KB | >20KB | ~3KB |
|
|
76
|
+
|
|
77
|
+
> **RGS is the ONLY library treating Security and Persistence as first-class citizens.**
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 🚀 Installation
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
# The fastest way to upgrade your React app
|
|
85
|
+
npm install @biglogic/rgs
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Or with pnpm
|
|
90
|
+
pnpm add @biglogic/rgs
|
|
91
|
+
|
|
92
|
+
# Or with yarn
|
|
93
|
+
yarn add @biglogic/rgs
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## 🎮 Quick Start - 30 Seconds to Glory
|
|
99
|
+
|
|
100
|
+
### The Zen Way (Recommended)
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
import { gstate } from '@biglogic/rgs'
|
|
104
|
+
|
|
105
|
+
// ONE line creates a typed store hook
|
|
106
|
+
const useStore = gstate({
|
|
107
|
+
count: 0,
|
|
108
|
+
user: { name: 'Alice', email: 'alice@example.com' }
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
function Counter() {
|
|
112
|
+
// Type-safe selectors - the React way
|
|
113
|
+
const count = useStore(s => s.count)
|
|
114
|
+
const userName = useStore(s => s.user.name)
|
|
115
|
+
|
|
116
|
+
// Direct mutations - just write JavaScript
|
|
117
|
+
const increment = () => useStore(s => { s.count++ })
|
|
118
|
+
|
|
119
|
+
return (
|
|
120
|
+
<div>
|
|
121
|
+
<h1>Hello, {userName}!</h1>
|
|
122
|
+
<p>Count: {count}</p>
|
|
123
|
+
<button onClick={increment}>+1</button>
|
|
124
|
+
</div>
|
|
125
|
+
)
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### The Classic Way (Global Store)
|
|
130
|
+
|
|
131
|
+
```tsx
|
|
132
|
+
import { initState, useStore } from '@biglogic/rgs'
|
|
133
|
+
|
|
134
|
+
// Initialize once at app root
|
|
135
|
+
initState({ namespace: 'myapp' })
|
|
136
|
+
|
|
137
|
+
// Use anywhere in your app
|
|
138
|
+
const [user, setUser] = useStore('user')
|
|
139
|
+
const [theme, setTheme] = useStore('theme')
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## 🛡️ Enterprise-Grade Security (No Extra Code)
|
|
145
|
+
|
|
146
|
+
### AES-256-GCM Encryption
|
|
147
|
+
|
|
148
|
+
```tsx
|
|
149
|
+
// Your sensitive data is encrypted automatically
|
|
150
|
+
const useAuth = gstate({
|
|
151
|
+
token: 'jwt-token-here',
|
|
152
|
+
refreshToken: 'refresh-token'
|
|
153
|
+
}, { encoded: true }) // 🔐 AES-256-GCM encryption enabled
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### RBAC (Role-Based Access Control)
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
const store = gstate({
|
|
160
|
+
adminPanel: { users: [], settings: {} },
|
|
161
|
+
userProfile: {}
|
|
162
|
+
}, {
|
|
163
|
+
rbac: {
|
|
164
|
+
admin: ['adminPanel', 'userProfile'],
|
|
165
|
+
user: ['userProfile'],
|
|
166
|
+
guest: []
|
|
167
|
+
}
|
|
168
|
+
})
|
|
169
|
+
|
|
170
|
+
// Only admins can touch adminPanel
|
|
171
|
+
store.set('adminPanel', { users: ['new'] }) // ✅ Works for admins
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### GDPR Compliance
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
// Export all user data (GDPR requirement)
|
|
178
|
+
store.exportData() // Returns JSON of all stored data
|
|
179
|
+
|
|
180
|
+
// Delete all user data (GDPR "right to be forgotten")
|
|
181
|
+
store.deleteData()
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 💾 Persistence That Just Works
|
|
187
|
+
|
|
188
|
+
### Built-in Storage Adapters
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
// localStorage (default) - survives browser restart
|
|
192
|
+
const useSettings = gstate({ theme: 'dark' }, { persist: true })
|
|
193
|
+
|
|
194
|
+
// sessionStorage - survives page refresh but not tab close
|
|
195
|
+
const useSession = gstate({ temporary: 'data' }, { storage: 'session' })
|
|
196
|
+
|
|
197
|
+
// Memory only - for ephemeral data
|
|
198
|
+
const useMemory = gstate({ cache: [] }, { storage: 'memory' })
|
|
199
|
+
|
|
200
|
+
// IndexedDB - for GB-scale data
|
|
201
|
+
const useBigData = gstate({ dataset: [] })
|
|
202
|
+
store._addPlugin(indexedDBPlugin({ dbName: 'my-app-db' }))
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 🔌 Plugins Ecosystem - Extend Without Limits
|
|
208
|
+
|
|
209
|
+
RGS comes with **11+ official plugins** ready to supercharge your app:
|
|
210
|
+
|
|
211
|
+
| Plugin | Purpose | One-Liner |
|
|
212
|
+
|--------|---------|-----------|
|
|
213
|
+
| `undoRedoPlugin` | Time travel through state | `store.undo()` / `store.redo()` |
|
|
214
|
+
| `syncPlugin` | Cross-tab sync (no server) | `store._addPlugin(syncPlugin(...))` |
|
|
215
|
+
| `indexedDBPlugin` | GB-scale storage | `store._addPlugin(indexedDBPlugin(...))` |
|
|
216
|
+
| `cloudSyncPlugin` | Cloud backup & sync | `store.plugins.cloudSync.sync()` |
|
|
217
|
+
| `devToolsPlugin` | Redux DevTools | `store._addPlugin(devToolsPlugin(...))` |
|
|
218
|
+
| `immerPlugin` | Mutable-style updates | `store.setWithProduce('key', fn)` |
|
|
219
|
+
| `snapshotPlugin` | Save/restore checkpoints | `store.takeSnapshot('backup')` |
|
|
220
|
+
| `schemaPlugin` | Runtime validation | `store._addPlugin(schemaPlugin(...))` |
|
|
221
|
+
| `guardPlugin` | Transform on set | `store._addPlugin(guardPlugin(...))` |
|
|
222
|
+
| `analyticsPlugin` | Track changes | `store._addPlugin(analyticsPlugin(...))` |
|
|
223
|
+
| `debugPlugin` | Console access (DEV) | `window.gstate.list()` |
|
|
224
|
+
|
|
225
|
+
### Undo/Redo - Never Lose Work
|
|
226
|
+
|
|
227
|
+
```tsx
|
|
228
|
+
import { undoRedoPlugin } from '@biglogic/rgs'
|
|
229
|
+
|
|
230
|
+
const store = gstate({ text: '' })
|
|
231
|
+
store._addPlugin(undoRedoPlugin({ limit: 50 }))
|
|
232
|
+
|
|
233
|
+
// User makes changes...
|
|
234
|
+
store.set('text', 'Hello World')
|
|
235
|
+
store.set('text', 'Hello Universe')
|
|
236
|
+
|
|
237
|
+
// Oops! Let's go back
|
|
238
|
+
store.undo() // Returns to 'Hello World'
|
|
239
|
+
store.redo() // Returns to 'Hello Universe'
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### Cross-Tab Sync - Real-Time Everywhere
|
|
243
|
+
|
|
244
|
+
```tsx
|
|
245
|
+
import { syncPlugin } from '@biglogic/rgs/advanced'
|
|
246
|
+
|
|
247
|
+
const store = gstate({ theme: 'light' })
|
|
248
|
+
store._addPlugin(syncPlugin({ channelName: 'my-app' }))
|
|
249
|
+
|
|
250
|
+
// Change in Tab 1 → Instantly updates Tab 2, Tab 3, etc.
|
|
251
|
+
// ZERO server calls. Pure browser magic.
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Cloud Sync - Your Data, Everywhere
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
import { cloudSyncPlugin, createMongoAdapter } from '@biglogic/rgs/advanced'
|
|
258
|
+
|
|
259
|
+
const adapter = createMongoAdapter(
|
|
260
|
+
'https://data.mongodb-api.com/...',
|
|
261
|
+
'your-api-key'
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
const store = gstate({ todos: [] })
|
|
265
|
+
store._addPlugin(cloudSyncPlugin({
|
|
266
|
+
adapter,
|
|
267
|
+
autoSyncInterval: 30000 // Every 30 seconds
|
|
268
|
+
}))
|
|
269
|
+
|
|
270
|
+
// Manual sync when needed
|
|
271
|
+
await store.plugins.cloudSync.sync()
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
## ☁️ Local-First Sync - Offline by Default
|
|
277
|
+
|
|
278
|
+
The **killer feature** that makes RGS unique:
|
|
279
|
+
|
|
280
|
+
```tsx
|
|
281
|
+
import { gstate, useSyncedState } from '@biglogic/rgs'
|
|
282
|
+
|
|
283
|
+
// Create store with automatic offline-first sync
|
|
284
|
+
const store = gstate({
|
|
285
|
+
todos: [],
|
|
286
|
+
user: null
|
|
287
|
+
}, {
|
|
288
|
+
namespace: 'myapp',
|
|
289
|
+
sync: {
|
|
290
|
+
endpoint: 'https://api.example.com/sync',
|
|
291
|
+
authToken: () => localStorage.getItem('auth_token'),
|
|
292
|
+
autoSyncInterval: 30000,
|
|
293
|
+
syncOnReconnect: true,
|
|
294
|
+
strategy: 'last-write-wins'
|
|
295
|
+
}
|
|
296
|
+
})
|
|
297
|
+
|
|
298
|
+
// Works offline. Automatically syncs when online.
|
|
299
|
+
function TodoList() {
|
|
300
|
+
const [todos, setTodos] = useSyncedState('todos')
|
|
301
|
+
|
|
302
|
+
const addTodo = (text) => {
|
|
303
|
+
setTodos([...todos, { id: Date.now(), text }])
|
|
304
|
+
// Synced automatically! ✨
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return <ul>{todos.map(t => <li>{t.text}</li>)}</ul>
|
|
308
|
+
}
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## ⚡ Advanced Superpowers
|
|
314
|
+
|
|
315
|
+
### Computed Values (Derived State)
|
|
316
|
+
|
|
317
|
+
```tsx
|
|
318
|
+
const store = gstate({
|
|
319
|
+
firstName: 'John',
|
|
320
|
+
lastName: 'Doe'
|
|
321
|
+
})
|
|
322
|
+
|
|
323
|
+
// Auto-calculated derived state
|
|
324
|
+
store.compute('fullName', (get) => `${get('firstName')} ${get('lastName')}`)
|
|
325
|
+
|
|
326
|
+
const fullName = store.get('fullName') // "John Doe"
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
### Error Handling
|
|
330
|
+
|
|
331
|
+
```tsx
|
|
332
|
+
const store = gstate({ data: null }, {
|
|
333
|
+
onError: (error, context) => {
|
|
334
|
+
console.error(`Error in ${context.operation}:`, error.message)
|
|
335
|
+
// Send to Sentry, Datadog, etc.
|
|
336
|
+
}
|
|
337
|
+
})
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### Size Limits (Memory Protection)
|
|
341
|
+
|
|
342
|
+
```tsx
|
|
343
|
+
const store = gstate({ data: {} }, {
|
|
344
|
+
maxObjectSize: 5 * 1024 * 1024, // Warn if single value > 5MB
|
|
345
|
+
maxTotalSize: 50 * 1024 * 1024 // Warn if total > 50MB
|
|
346
|
+
})
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
---
|
|
350
|
+
|
|
351
|
+
## 📦 Build Sizes - Choose Your Weapon
|
|
352
|
+
|
|
353
|
+
### Minimal Version (~0.16 KB)
|
|
354
|
+
For embedded systems, widgets, IoT:
|
|
355
|
+
|
|
356
|
+
```javascript
|
|
357
|
+
import { createStore } from '@biglogic/rgs/core/minimal'
|
|
358
|
+
|
|
359
|
+
const store = createStore({ count: 0 })
|
|
360
|
+
store.get('count') // → 0
|
|
361
|
+
store.set('count', 5) // → true
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Full Version (~32 KB)
|
|
365
|
+
For production React apps with all features:
|
|
366
|
+
|
|
367
|
+
```javascript
|
|
368
|
+
import { gstate, createStore } from '@biglogic/rgs'
|
|
369
|
+
|
|
370
|
+
const useCounter = gstate({ count: 0 })
|
|
371
|
+
const count = useCounter(s => s.count)
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
| Version | Size | Use Case |
|
|
375
|
+
|---------|------|----------|
|
|
376
|
+
| **Minimal** | 0.16 KB | Embedded, IoT, Widgets |
|
|
377
|
+
| **Full** | ~32 KB | React Apps, Enterprise |
|
|
378
|
+
|
|
379
|
+
---
|
|
380
|
+
|
|
381
|
+
## 🧪 Testing - Rock-Solid Reliability
|
|
382
|
+
|
|
383
|
+
```bash
|
|
384
|
+
# Run unit tests
|
|
385
|
+
npm run test
|
|
386
|
+
|
|
387
|
+
# Run E2E tests (Playwright)
|
|
388
|
+
npm run test:e2e
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
- ✅ **100+ Unit Tests** (Jest) - Core logic, stores, hooks
|
|
392
|
+
- ✅ **E2E Tests** (Playwright) - Real browser, cross-tab sync
|
|
393
|
+
- ✅ **Concurrency Testing** - Race condition verification
|
|
394
|
+
- ✅ **Security Tests** - AES-256, RBAC, GDPR
|
|
395
|
+
|
|
396
|
+
---
|
|
397
|
+
|
|
398
|
+
## 🏗️ Architecture
|
|
399
|
+
|
|
400
|
+
```mermaid
|
|
401
|
+
graph TB
|
|
402
|
+
subgraph API
|
|
403
|
+
A[gstate] --> D[IStore]
|
|
404
|
+
B[useStore] --> D
|
|
405
|
+
C[createStore] --> D
|
|
406
|
+
end
|
|
407
|
+
|
|
408
|
+
D --> E[Storage Adapter]
|
|
409
|
+
D --> F[Immer Proxy]
|
|
410
|
+
D --> G[Plugins]
|
|
411
|
+
D --> H[Security]
|
|
412
|
+
D --> I[Async Store]
|
|
413
|
+
|
|
414
|
+
E --> J[local]
|
|
415
|
+
E --> K[session]
|
|
416
|
+
E --> L[memory]
|
|
417
|
+
|
|
418
|
+
G --> M[UndoRedo]
|
|
419
|
+
G --> N[Sync]
|
|
420
|
+
G --> O[Schema]
|
|
421
|
+
G --> P[Analytics]
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
### Core Components
|
|
425
|
+
|
|
426
|
+
| Component | Description |
|
|
427
|
+
|-----------|-------------|
|
|
428
|
+
| **gstate()** | Creates store + hook in one line |
|
|
429
|
+
| **useStore()** | React hook for subscribing to state |
|
|
430
|
+
| **createStore()** | Classic store factory |
|
|
431
|
+
| **IStore** | Core interface with get/set/subscribe |
|
|
432
|
+
| **StorageAdapters** | local, session, memory persistence |
|
|
433
|
+
| **Plugins** | Immer, Undo/Redo, Sync, Schema, etc. |
|
|
434
|
+
| **Security** | Encryption, RBAC, GDPR consent |
|
|
435
|
+
|
|
436
|
+
---
|
|
437
|
+
|
|
438
|
+
## 📚 Documentation
|
|
439
|
+
|
|
440
|
+
- [Getting Started](docs/markdown/getting-started.md)
|
|
441
|
+
- [Plugin SDK](docs/markdown/plugin-sdk.md)
|
|
442
|
+
- [Security Architecture](docs/markdown/security-architecture.md)
|
|
443
|
+
- [Migration Guide](docs/markdown/migration-guide.md)
|
|
444
|
+
- [API Reference](docs/markdown/api.md)
|
|
445
|
+
|
|
446
|
+
---
|
|
447
|
+
|
|
448
|
+
## 🤝 Contributing
|
|
449
|
+
|
|
450
|
+
Contributions are welcome! Please read our [contributing guidelines](CONTRIBUTING.md) first.
|
|
451
|
+
|
|
452
|
+
```bash
|
|
453
|
+
# Clone and setup
|
|
454
|
+
git clone https://github.com/BigLogic-ca/rgs.git
|
|
455
|
+
cd rgs
|
|
456
|
+
npm install
|
|
457
|
+
|
|
458
|
+
# Run tests
|
|
459
|
+
npm run test
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
---
|
|
463
|
+
|
|
464
|
+
## 📄 License
|
|
465
|
+
|
|
466
|
+
**MIT** © [Dario Passariello](https://github.com/passariello)
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## 🔥 Built for Those Who Demand **Excellence**
|
|
471
|
+
|
|
472
|
+
[](https://github.com/immerjs/immer)
|
|
473
|
+
[](https://www.typescriptlang.org/)
|
|
474
|
+
[](https://jestjs.io/)
|
|
475
|
+
[](https://playwright.dev/)
|
|
476
|
+
|
|
477
|
+
**Made with ❤️ and a lot of caffè espresso!**
|
|
478
|
+
|
|
479
|
+
[⬆ Back to top](#-argis-rgs---reactive-global-state)
|
package/core/advanced.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=Symbol.for("immer-nothing"),t=Symbol.for("immer-draftable"),n=Symbol.for("immer-state"),r=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}];function s(e,...t){{const n=r[e],s=D(n)?n.apply(null,t):n;throw new Error(`[Immer] ${s}`)}}var o=Object,i=o.getPrototypeOf,a="constructor",c="prototype",l="configurable",u="enumerable",f="writable",p="value",d=e=>!!e&&!!e[n];function y(e){return!!e&&(_(e)||E(e)||!!e[t]||!!e[a]?.[t]||k(e)||O(e))}var h=o[c][a].toString(),g=new WeakMap;function _(e){if(!e||!C(e))return!1;const t=i(e);if(null===t||t===o[c])return!0;const n=o.hasOwnProperty.call(t,a)&&t[a];if(n===Object)return!0;if(!D(n))return!1;let r=g.get(n);return void 0===r&&(r=Function.toString.call(n),g.set(n,r)),r===h}function m(e,t,n=!0){if(0===S(e)){(n?Reflect.ownKeys(e):o.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function S(e){const t=e[n];return t?t.type_:E(e)?1:k(e)?2:O(e)?3:0}var w=(e,t,n=S(e))=>2===n?e.has(t):o[c].hasOwnProperty.call(e,t),v=(e,t,n=S(e))=>2===n?e.get(t):e[t],b=(e,t,n,r=S(e))=>{2===r?e.set(t,n):3===r?e.add(n):e[t]=n};var E=Array.isArray,k=e=>e instanceof Map,O=e=>e instanceof Set,C=e=>"object"==typeof e,D=e=>"function"==typeof e,M=e=>"boolean"==typeof e;var A=e=>e.copy_||e.base_,P=e=>e.modified_?e.copy_:e.base_;function z(e,t){if(k(e))return new Map(e);if(O(e))return new Set(e);if(E(e))return Array[c].slice.call(e);const r=_(e);if(!0===t||"class_only"===t&&!r){const t=o.getOwnPropertyDescriptors(e);delete t[n];let r=Reflect.ownKeys(t);for(let n=0;n<r.length;n++){const s=r[n],o=t[s];!1===o[f]&&(o[f]=!0,o[l]=!0),(o.get||o.set)&&(t[s]={[l]:!0,[f]:!0,[u]:o[u],[p]:e[s]})}return o.create(i(e),t)}{const t=i(e);if(null!==t&&r)return{...e};const n=o.create(t);return o.assign(n,e)}}function T(e,t=!1){return I(e)||d(e)||!y(e)||(S(e)>1&&o.defineProperties(e,{set:j,add:j,clear:j,delete:j}),o.freeze(e),t&&m(e,(e,t)=>{T(t,!0)},!1)),e}var j={[p]:function(){s(2)}};function I(e){return null===e||!C(e)||o.isFrozen(e)}var R="MapSet",x="Patches",V="ArrayMethods",L={};function $(e){const t=L[e];return t||s(0,e),t}var N,U=e=>!!L[e],F=()=>N;function J(e,t){t&&(e.patchPlugin_=$(x),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function K(e){Q(e),e.drafts_.forEach(B),e.drafts_=null}function Q(e){e===N&&(N=e.parent_)}var W=e=>N={drafts_:[],parent_:N,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:U(R)?$(R):void 0,arrayMethodsPlugin_:U(V)?$(V):void 0};function B(e){const t=e[n];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function G(t,r){r.unfinalizedDrafts_=r.drafts_.length;const o=r.drafts_[0];if(void 0!==t&&t!==o){o[n].modified_&&(K(r),s(4)),y(t)&&(t=Z(r,t));const{patchPlugin_:e}=r;e&&e.generateReplacementPatches_(o[n].base_,t,r)}else t=Z(r,o);return function(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&T(t,n)}(r,t,!0),K(r),r.patches_&&r.patchListener_(r.patches_,r.inversePatches_),t!==e?t:void 0}function Z(e,t){if(I(t))return t;const r=t[n];if(!r){return te(t,e.handledSet_,e)}if(!X(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){const{callbacks_:t}=r;if(t)for(;t.length>0;){t.pop()(e)}ee(r,e)}return r.copy_}function q(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var X=(e,t)=>e.scope_===t,H=[];function Y(e,t,n,r){const s=A(e),o=e.type_;if(void 0!==r){if(v(s,r,o)===t)return void b(s,r,n,o)}if(!e.draftLocations_){const t=e.draftLocations_=new Map;m(s,(e,n)=>{if(d(n)){const r=t.get(n)||[];r.push(e),t.set(n,r)}})}const i=e.draftLocations_.get(t)??H;for(const e of i)b(s,e,n,o)}function ee(e,t){if(e.modified_&&!e.finalized_&&(3===e.type_||1===e.type_&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){const{patchPlugin_:n}=t;if(n){const r=n.getPath(e);r&&n.generatePatches_(e,r,t)}q(e)}}function te(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||d(e)||t.has(e)||!y(e)||I(e)||(t.add(e),m(e,(s,o)=>{if(d(o)){const t=o[n];if(X(t,r)){const n=P(t);b(e,s,n,e.type_),q(t)}}else y(o)&&te(o,t,r)})),e}var ne={get(e,t){if(t===n)return e;let r=e.scope_.arrayMethodsPlugin_;const s=1===e.type_&&"string"==typeof t;if(s&&r?.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);const o=A(e);if(!w(o,t,e.type_))return function(e,t,n){const r=oe(t,n);return r?p in r?r[p]:r.get?.call(e.draft_):void 0}(e,o,t);const i=o[t];if(e.finalized_||!y(i))return i;if(s&&e.operationMethod&&r?.isMutatingArrayMethod(e.operationMethod)&&function(e){const t=+e;return Number.isInteger(t)&&String(t)===e}(t))return i;if(i===se(e.base_,t)){ae(e);const n=1===e.type_?+t:t,r=ce(e.scope_,i,e,n);return e.copy_[n]=r}return i},has:(e,t)=>t in A(e),ownKeys:e=>Reflect.ownKeys(A(e)),set(e,t,r){const s=oe(A(e),t);if(s?.set)return s.set.call(e.draft_,r),!0;if(!e.modified_){const s=se(A(e),t),a=s?.[n];if(a&&a.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(((o=r)===(i=s)?0!==o||1/o==1/i:o!=o&&i!=i)&&(void 0!==r||w(e.base_,t,e.type_)))return!0;ae(e),ie(e)}var o,i;return e.copy_[t]===r&&(void 0!==r||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),function(e,t,r){const{scope_:s}=e;if(d(r)){const o=r[n];X(o,s)&&o.callbacks_.push(function(){ae(e);const n=P(o);Y(e,r,n,t)})}else y(r)&&e.callbacks_.push(function(){const n=A(e);3===e.type_?n.has(r)&&te(r,s.handledSet_,s):v(n,t,e.type_)===r&&s.drafts_.length>1&&!0===(e.assigned_.get(t)??!1)&&e.copy_&&te(v(e.copy_,t,e.type_),s.handledSet_,s)})}(e,t,r)),!0},deleteProperty:(e,t)=>(ae(e),void 0!==se(e.base_,t)||t in e.base_?(e.assigned_.set(t,!1),ie(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=A(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{[f]:!0,[l]:1!==e.type_||"length"!==t,[u]:r[u],[p]:n[t]}:r},defineProperty(){s(11)},getPrototypeOf:e=>i(e.base_),setPrototypeOf(){s(12)}},re={};for(let e in ne){let t=ne[e];re[e]=function(){const e=arguments;return e[0]=e[0][0],t.apply(this,e)}}function se(e,t){const r=e[n];return(r?A(r):e)[t]}function oe(e,t){if(!(t in e))return;let n=i(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=i(n)}}function ie(e){e.modified_||(e.modified_=!0,e.parent_&&ie(e.parent_))}function ae(e){e.copy_||(e.assigned_=new Map,e.copy_=z(e.base_,e.scope_.immer_.useStrictShallowCopy_))}re.deleteProperty=function(e,t){return isNaN(parseInt(t))&&s(13),re.set.call(this,e,t,void 0)},re.set=function(e,t,n){return"length"!==t&&isNaN(parseInt(t))&&s(14),ne.set.call(this,e[0],t,n,e[0])};function ce(e,t,n,r){const[s,o]=k(t)?$(R).proxyMap_(t,n):O(t)?$(R).proxySet_(t,n):function(e,t){const n=E(e),r={type_:n?1:0,scope_:t?t.scope_:F(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let s=r,o=ne;n&&(s=[r],o=re);const{revoke:i,proxy:a}=Proxy.revocable(s,o);return r.draft_=a,r.revoke_=i,[a,r]}(t,n);return(n?.scope_??F()).drafts_.push(s),o.callbacks_=n?.callbacks_??[],o.key_=r,n&&void 0!==r?function(e,t,n){e.callbacks_.push(function(r){const s=t;if(!s||!X(s,r))return;r.mapSetPlugin_?.fixSetContents(s);const o=P(s);Y(e,s.draft_??s,o,n),ee(s,r)})}(n,o,r):o.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(o);const{patchPlugin_:t}=e;o.modified_&&t&&t.generatePatches_(o,[],e)}),s}function le(e){if(!y(e)||I(e))return e;const t=e[n];let r,s=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=z(e,t.scope_.immer_.useStrictShallowCopy_),s=t.scope_.immer_.shouldUseStrictIteration()}else r=z(e,!0);return m(r,(e,t)=>{b(r,e,le(t))},s),t&&(t.finalized_=!1),r}var ue=(new class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(t,n,r)=>{if(D(t)&&!D(n)){const e=n;n=t;const r=this;return function(t=e,...s){return r.produce(t,e=>n.call(this,e,...s))}}let o;if(D(n)||s(6),void 0===r||D(r)||s(7),y(t)){const e=W(this),s=ce(e,t,void 0);let i=!0;try{o=n(s),i=!1}finally{i?K(e):Q(e)}return J(e,r),G(o,e)}if(!t||!C(t)){if(o=n(t),void 0===o&&(o=t),o===e&&(o=void 0),this.autoFreeze_&&T(o,!0),r){const e=[],n=[];$(x).generateReplacementPatches_(t,o,{patches_:e,inversePatches_:n}),r(e,n)}return o}s(1,t)},this.produceWithPatches=(e,t)=>{if(D(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},M(t?.autoFreeze)&&this.setAutoFreeze(t.autoFreeze),M(t?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),M(t?.useStrictIteration)&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(e){y(e)||s(8),d(e)&&(e=function(e){d(e)||s(10,e);return le(e)}(e));const t=W(this),r=ce(t,e,void 0);return r[n].isManual_=!0,Q(t),r}finishDraft(e,t){const r=e&&e[n];r&&r.isManual_||s(9);const{scope_:o}=r;return J(o,t),G(void 0,o)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=$(x).applyPatches_;return d(e)?r(e,t):this.produce(e,e=>r(e,t))}}).produce,fe=(e,t)=>{const n=Date.now();if(/\(\.*\+\?\)\+/.test(e)||/\(\.*\?\)\*/.test(e))return!1;if(e.length>500)return!1;try{const n=new RegExp(e).test(t);Date.now();return n}catch{return!1}},pe=()=>{if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)try{return crypto.randomUUID()}catch{}throw new Error("Cryptographically secure random UUID generation is required but crypto.randomUUID is unavailable. Please use a browser or environment with Web Crypto API support.")};"undefined"!=typeof crypto&&void 0!==crypto.subtle&&crypto.subtle.generateKey;var de=async(e,t)=>{const n=(new TextEncoder).encode(JSON.stringify(e)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,n),s=new Uint8Array(t.iv.length+r.byteLength);return s.set(t.iv),s.set(new Uint8Array(r),t.iv.length),btoa(String.fromCharCode(...s))},ye=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=n.slice(0,12),s=n.slice(12),o=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,s);return JSON.parse((new TextDecoder).decode(o))},he=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},ge=(e,t,n,r)=>{if(0===e.size)return!0;for(const[s,o]of e){let e;if(e="function"==typeof s?s(t,r):fe(s,t),e)return o.includes(n)||o.includes("admin")}return!1},_e=e=>{if("string"==typeof e){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,e=>{const t=e.match(/&#x([0-9a-fA-F]+);?/i);if(t&&t[1])return String.fromCharCode(parseInt(t[1],16));const n=e.match(/&#([0-9]+);?/);return n&&n[1]?String.fromCharCode(parseInt(n[1],10)):e});try{t=decodeURIComponent(t)}catch{}return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi,"[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi,"[SEC-REMOVED]").replace(/on\w+\s*=/gi,"[SEC-REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"[SEC-REMOVED]").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"[SEC-REMOVED]").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"[SEC-REMOVED]").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi,"[SEC-REMOVED]").replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi,"[SEC-REMOVED]").replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi,"[SEC-REMOVED]").replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi,"[SEC-REMOVED]").replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi,"[SEC-REMOVED]").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"[SEC-REMOVED]")}if(e&&"object"==typeof e&&!Array.isArray(e)){if(Object.getPrototypeOf(e)===Object.prototype){const t={};for(const[n,r]of Object.entries(e))t[n]=_e(r);return t}return e}return Array.isArray(e)?e.map(e=>_e(e)):e},me=(e,t,n,r)=>{const s={id:pe(),purpose:n,granted:r,timestamp:Date.now()},o=e.get(t)||[];return o.push(s),e.set(t,o),s},Se=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof structuredClone)try{return structuredClone(e)}catch(e){}const t=new WeakMap,n=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){const r=new Map;return t.set(e,r),e.forEach((e,t)=>r.set(n(t),n(e))),r}if(e instanceof Set){const r=new Set;return t.set(e,r),e.forEach(e=>r.add(n(e))),r}const r=Array.isArray(e)?[]:Object.create(Object.getPrototypeOf(e));t.set(e,r);const s=[...Object.keys(e),...Object.getOwnPropertySymbols(e)];for(const t of s)r[t]=n(e[t]);return r};return n(e)},we=(e,t)=>{if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!we(e[n],t[n]))return!1;return!0}const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r=0;r<n.length;r++){const s=n[r];if(!(s in t)||!we(e[s],t[s]))return!1}return!0},ve=e=>`${e}_`,be=class{store;config;pendingQueue=new Map;remoteVersions=new Map;syncTimer=null;onlineStatusListeners=new Set;syncStateListeners=new Set;_isOnline=!0;_isSyncing=!1;constructor(e,t){this.store=e,this.config={endpoint:t.endpoint,authToken:t.authToken||"",strategy:t.strategy||"last-write-wins",autoSyncInterval:t.autoSyncInterval??3e4,syncOnReconnect:t.syncOnReconnect??!0,debounceTime:t.debounceTime??1e3,fetch:t.fetch||fetch,onSync:t.onSync||(()=>{}),onConflict:t.onConflict||(()=>({action:"accept-local"})),maxRetries:t.maxRetries??3},this._isOnline="undefined"==typeof navigator||navigator.onLine,this._setupOnlineListener(),this._setupStoreListener(),this.config.autoSyncInterval>0&&this._startAutoSync()}_getAuthToken(){const e=this.config.authToken;return"function"==typeof e?e()||"":e||""}_setupOnlineListener(){"undefined"!=typeof window&&(window.addEventListener("online",()=>{this._isOnline=!0,this._notifyOnlineChange(!0),this.config.syncOnReconnect&&this.sync()}),window.addEventListener("offline",()=>{this._isOnline=!1,this._notifyOnlineChange(!1)}))}_setupStoreListener(){this.store._subscribe(()=>{})}_startAutoSync(){setInterval(()=>{this._isOnline&&!this._isSyncing&&this.pendingQueue.size>0&&this.sync()},this.config.autoSyncInterval)}_notifyOnlineChange(e){this.onlineStatusListeners.forEach(t=>t(e)),this._notifyStateChange()}_notifyStateChange(){const e=this.getState();this.syncStateListeners.forEach(t=>t(e))}queueChange(e,t){const n=this.store._getVersion(e)||1;this.pendingQueue.set(e,{key:e,value:Se(t),timestamp:Date.now(),version:n}),this._notifyStateChange(),this.syncTimer&&clearTimeout(this.syncTimer),this.syncTimer=setTimeout(()=>{this._isOnline&&this.sync()},this.config.debounceTime)}async sync(){if(this._isSyncing)return{success:!1,syncedKeys:[],conflicts:[],errors:["Sync already in progress"],timestamp:Date.now(),duration:0};this._isSyncing=!0,this._notifyStateChange();const e=Date.now(),t=[],n=[],r=[];try{const s=Array.from(this.pendingQueue.values());if(0===s.length)return this._isSyncing=!1,this._notifyStateChange(),{success:!0,syncedKeys:[],conflicts:[],errors:[],timestamp:Date.now(),duration:Date.now()-e};await this._fetchRemoteVersions(s.map(e=>e.key));for(const e of s)try{const r=this.remoteVersions.get(e.key);if(r)if(r.version>=e.version){const s={key:e.key,localValue:e.value,remoteValue:r.value,localVersion:e.version,remoteVersion:r.version,timestamp:e.timestamp};n.push(s);const o=this.config.onConflict(s);await this._resolveConflict(e,r,o),t.push(e.key),this.pendingQueue.delete(e.key)}else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key);else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key)}catch(t){r.push(`Failed to sync "${e.key}": ${t}`)}const o={success:0===r.length,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e};return this.config.onSync(o),o}catch(s){const o=`Sync failed: ${s}`;return r.push(o),{success:!1,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e}}finally{this._isSyncing=!1,this._notifyStateChange()}}async _fetchRemoteVersions(e){try{const t=this._getAuthToken(),n=await this.config.fetch(`${this.config.endpoint}/versions`,{method:"POST",headers:{"Content-Type":"application/json",...t&&{Authorization:`Bearer ${t}`}},body:JSON.stringify({keys:e})});if(n.ok){const e=await n.json();if(e.versions)for(const[t,n]of Object.entries(e.versions))this.remoteVersions.set(t,n)}}catch(e){}}async _pushChange(e){let t=0;for(;t<this.config.maxRetries;)try{const n=this._getAuthToken(),r=await this.config.fetch(`${this.config.endpoint}/sync`,{method:"POST",headers:{"Content-Type":"application/json",...n&&{Authorization:`Bearer ${n}`}},body:JSON.stringify({key:e.key,value:e.value,version:e.version,timestamp:e.timestamp})});if(r.ok){const t=await r.json();return void(t.version&&this.remoteVersions.set(e.key,{version:t.version,timestamp:t.timestamp||Date.now(),value:e.value}))}t++}catch(e){if(t++,t>=this.config.maxRetries)throw e}}async _resolveConflict(e,t,n){switch(n.action){case"accept-local":await this._pushChange({...e,version:t.version+1,timestamp:Date.now()});break;case"accept-remote":this.store.set(e.key,t.value);break;case"merge":this.store.set(e.key,n.value),await this._pushChange({key:e.key,value:n.value,version:Math.max(e.version,t.version)+1,timestamp:Date.now()})}}getState(){return{isOnline:this._isOnline,isSyncing:this._isSyncing,lastSyncTimestamp:null,pendingChanges:this.pendingQueue.size,conflicts:0}}onOnlineChange(e){return this.onlineStatusListeners.add(e),()=>this.onlineStatusListeners.delete(e)}onStateChange(e){return this.syncStateListeners.add(e),()=>this.syncStateListeners.delete(e)}async flush(){return this.sync()}destroy(){this.syncTimer&&clearTimeout(this.syncTimer),this.pendingQueue.clear(),this.onlineStatusListeners.clear(),this.syncStateListeners.clear()}},Ee=()=>{try{0;const e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};return void 0!==e.__DEV__&&!1===e.__DEV__}catch{return!1}},ke={local:()=>"undefined"!=typeof window?window.localStorage:null,session:()=>"undefined"!=typeof window?window.sessionStorage:null,memory:()=>{const e=new Map;return{getItem:t=>e.get(t)||null,setItem:(t,n)=>e.set(t,n),removeItem:t=>e.delete(t),key:t=>Array.from(e.keys())[t]||null,get length(){return e.size}}}},Oe=e=>{const t=new Map,n=new Map,r=new Map,s=new Set,o=new Map,i=new Set,a=new Map,c=new Map,l=new Map,u=new Map,f=new Map,p=new Map,d=new Map,y=new Map,h=e?.namespace||"gstate",g=e?.silent??!1,_=e?.debounceTime??150,m=e?.version??0,S=e?.storage||ke.local(),w=e?.onError,v=e?.maxObjectSize??0,b=e?.maxTotalSize??0,E=e?.encryptionKey??null,k=e?.validateInput??!0,O=e?.userId,C=e?.immer??!0,D=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(e=>he(d,e.pattern,e.permissions));let M,A=!1,P=!1,z=!1,j=0,I=null,R=null;const x=new Promise(e=>{M=e}),V=()=>({store:t,versions:n,sizes:r,totalSize:j,storage:S,config:e||{},diskQueue:f,encryptionKey:E,audit:U,onError:w,silent:g,debounceTime:_,currentVersion:m}),L=()=>({plugins:u,onError:w,silent:g}),$=e=>{if(null==e)return 0;const t=typeof e;if("boolean"===t)return 4;if("number"===t)return 8;if("string"===t)return 2*e.length;if("object"!==t)return 0;let n=0;const r=[e],s=new WeakSet;for(;r.length>0;){const e=r.pop();if("boolean"==typeof e)n+=4;else if("number"==typeof e)n+=8;else if("string"==typeof e)n+=2*e.length;else if("object"==typeof e&&null!==e){const t=e;if(s.has(t))continue;if(s.add(t),Array.isArray(t))for(let e=0;e<t.length;e++)r.push(t[e]);else for(const e of Object.keys(t))n+=2*e.length,r.push(t[e])}}return n},N=(e,t)=>{((e,t,n)=>{if(0!==e.plugins.size)for(const r of e.plugins.values()){const s=r.hooks?.[t];if(s)try{s(n)}catch(s){const o=s instanceof Error?s:new Error(String(s));e.onError?e.onError(o,{operation:`plugin:${r.name}:${t}`,key:n.key}):e.silent}}})(L(),e,t)},U=(e,t,n,r)=>{},F=e=>{const t=c.get(e);if(!t)return;const r=new Set,s=t.selector(e=>(r.add(e),c.has(e)?c.get(e).lastValue:W.get(e)));t.deps.forEach(t=>{if(!r.has(t)){const n=l.get(t);n&&(n.delete(e),0===n.size&&l.delete(t))}}),r.forEach(n=>{t.deps.has(n)||(l.has(n)||l.set(n,new Set),l.get(n).add(e))}),t.deps=r,we(t.lastValue,s)||(t.lastValue=C&&null!==s&&"object"==typeof s?T(Se(s),!0):s,n.set(e,(n.get(e)||0)+1),J(e))},J=e=>{if(e){if(l.has(e)){const t=l.get(e);for(const e of t)F(e)}const t=a.get(e);if(t){const n=W.get(e);for(const r of t)try{r(n)}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"watcher",key:e})}}const n=o.get(e);if(n)for(const t of n)try{t()}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"keyListener",key:e})}}if(A)P=!0;else for(const e of s)try{e()}catch(e){const t=e instanceof Error?e:new Error(String(e));w&&w(t,{operation:"listener"})}},K=async()=>{(async e=>{if(!e.storage)return;const{store:t,config:n,diskQueue:r,storage:s,encryptionKey:o,audit:i,onError:a,silent:c,currentVersion:l}=e,u=ve(n.namespace||"gstate");try{const e={};let r;t.forEach((t,n)=>{e[n]=t});const o=n?.encoded;r=o?btoa(JSON.stringify(e)):JSON.stringify(e),s.setItem(u.replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:r,_sys_v:l,_b64:!!o||void 0})),i("set","FULL_STATE",!0)}catch(e){const t=e instanceof Error?e:new Error(String(e));a&&a(t,{operation:"persist",key:"FULL_STATE"})}const f=Array.from(r.entries());r.clear();for(const[t,n]of f)try{if(!t||!/^[a-zA-Z0-9_.-]+$/.test(t)||t.length>256)continue;let r=n.value;const a=n.options.encoded||n.options.encrypted||n.options.secure;if(n.options.encrypted){if(!o)throw new Error(`Encryption key missing for "${t}"`);r=await de(n.value,o)}else a?r=btoa(JSON.stringify(n.value)):"object"==typeof n.value&&null!==n.value&&(r=JSON.stringify(n.value));s.setItem(`${u}${t}`,JSON.stringify({v:e.versions.get(t)||1,t:Date.now(),e:n.options.ttl?Date.now()+n.options.ttl:null,d:r,_sys_v:l,_enc:!!n.options.encrypted||void 0,_b64:!(!n.options.encoded&&!n.options.secure)||void 0})),i("set",t,!0)}catch(e){const n=e instanceof Error?e:new Error(String(e));a&&a(n,{operation:"persist",key:t})}})(V())},Q={},W={_setSilently:(e,s)=>{const o=r.get(e)||0,i=C&&null!==s&&"object"==typeof s?T(Se(s),!0):s,a=(v>0||b>0)&&!Ee()?$(i):0;j=j-o+a,r.set(e,a),t.set(e,i),n.set(e,(n.get(e)||0)+1),R=null},_registerMethod:(e,t,n)=>{const r=e=>"__proto__"===e||"constructor"===e||"prototype"===e;r(e)||r(t)||(Q[e]||(Q[e]={}),Q[e][t]=n)},set:(s,o,i={})=>{const a=t.get(s),c=C&&"function"==typeof o?ue(a,o):o;if(k&&!(e=>/^([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*)$/.test(e)&&e.length<=256&&e.length>0)(s))return!1;if(!ge(d,s,"write",O))return!1;const l=k?_e(c):c,u=r.get(s)||0;N("onBeforeSet",{key:s,value:l,store:W,version:n.get(s)||0});const p=C&&null!==l&&"object"==typeof l?T(Se(l),!0):l;if(!we(a,p)){const o=(v>0||b>0)&&!Ee()?$(p):0;if(v>0&&o>v){const e=new Error(`Object size (${o} bytes) exceeds maxObjectSize (${v} bytes)`);w&&w(e,{operation:"set",key:s})}if(b>0){const e=j-u+o;if(e>b){const t=new Error(`Total store size (${e} bytes) exceeds limit (${b} bytes)`);w&&w(t,{operation:"set"})}}j=j-u+o,r.set(s,o),t.set(s,p),n.set(s,(n.get(s)||0)+1),R=null;const a=i.persist??D;return a&&(f.set(s,{value:p,options:{...i,persist:a,encoded:i.encoded||e?.encoded}}),I&&clearTimeout(I),I=setTimeout(K,_)),N("onSet",{key:s,value:p,store:W,version:n.get(s)}),J(s),!0}return!1},get:e=>{if(!ge(d,e,"read",O))return null;const n=t.get(e);return N("onGet",{store:W,key:e,value:n}),n},compute:(e,t)=>{try{return c.has(e)||(c.set(e,{selector:t,lastValue:null,deps:new Set}),F(e)),c.get(e).lastValue}catch(t){const n=t instanceof Error?t:new Error(String(t));return w&&w(n,{operation:"compute",key:e}),null}},watch:(e,t)=>{a.has(e)||a.set(e,new Set);const n=a.get(e);return n.add(t),()=>{n.delete(t),0===n.size&&a.delete(e)}},remove:e=>{if(!ge(d,e,"delete",O))return!1;const s=t.get(e),o=t.delete(e);return o&&(j-=r.get(e)||0,r.delete(e),N("onRemove",{store:W,key:e,value:s}),R=null),n.set(e,(n.get(e)||0)+1),S&&S.removeItem(`${h}_${e}`),J(e),o},delete:e=>W.remove(e),deleteAll:()=>{if(Array.from(t.keys()).forEach(e=>W.remove(e)),S){const e=h+"_";for(let t=0;t<(S.length||0);t++){const n=S.key(t);n?.startsWith(e)&&(S.removeItem(n),t--)}}return j=0,r.clear(),R=null,!0},list:()=>Object.fromEntries(t.entries()),use:e=>{i.add(e)},transaction:e=>{A=!0,N("onTransaction",{store:W,key:"START"});try{e()}finally{A=!1,N("onTransaction",{store:W,key:"END"}),P&&(P=!1,J())}},destroy:()=>{I&&(clearTimeout(I),I=null),f.clear(),"undefined"!=typeof window&&window.removeEventListener("beforeunload",B),N("onDestroy",{store:W}),s.clear(),o.clear(),a.clear(),c.clear(),l.clear(),u.clear(),t.clear(),r.clear(),j=0,d.clear(),y.clear(),n.clear(),p.clear(),i.clear()},_addPlugin:e=>{((e,t,n)=>{try{e.plugins.set(t.name,t),t.hooks?.onInstall?.({store:n})}catch(n){const r=n instanceof Error?n:new Error(String(n));e.onError?e.onError(r,{operation:"plugin:install",key:t.name}):e.silent}})(L(),e,W)},_removePlugin:e=>{u.delete(e)},_subscribe:(e,t)=>{if(t){o.has(t)||o.set(t,new Set);const n=o.get(t);return n.add(e),()=>{n.delete(e),0===n.size&&o.delete(t)}}return s.add(e),()=>s.delete(e)},_getVersion:e=>n.get(e)??0,addAccessRule:(e,t)=>he(d,e,t),hasPermission:(e,t,n)=>ge(d,e,t,n),recordConsent:(e,t,n)=>me(y,e,t,n),hasConsent:(e,t)=>((e,t,n)=>{const r=e.get(t);if(!r)return!1;for(let e=r.length-1;e>=0;e--){const t=r[e];if(t&&t.purpose===n)return t.granted}return!1})(y,e,t),getConsents:e=>((e,t)=>e.get(t)||[])(y,e),revokeConsent:(e,t)=>((e,t,n)=>me(e,t,n,!1))(y,e,t),exportUserData:e=>((e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}))(y,e),deleteUserData:e=>((e,t)=>{const n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}})(y,e),getSnapshot:()=>(R||(R=Object.fromEntries(t.entries())),R),get plugins(){return Q},get isReady(){return z},get namespace(){return h},get userId(){return O},whenReady:()=>x};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(e=>{const t=W[e];t&&W._registerMethod("security",e,t)});const B=()=>{f.size>0&&K()};"undefined"!=typeof window&&window.addEventListener("beforeunload",B),S?(async(e,t,n)=>{const{storage:r,config:s,encryptionKey:o,audit:i,onError:a,silent:c,currentVersion:l,store:u,sizes:f,versions:p}=e,d=ve(s.namespace||"gstate"),y=s.immer??!0;if(r)try{const c={};let h=0;for(let e=0;e<(r.length||0);e++){const t=r.key(e);if(!t||!t.startsWith(d))continue;const n=r.getItem(t);if(n)try{const s=JSON.parse(n),a=t.substring(d.length);if(h=Math.max(h,void 0!==s._sys_v?s._sys_v:s.v||0),s.e&&Date.now()>s.e){r.removeItem(t),e--;continue}let l=s.d;if(s._enc&&o)l=await ye(l,o);else if("string"==typeof l)if(s._b64)try{l=JSON.parse(atob(l))}catch(e){}else if(l.startsWith("{")||l.startsWith("["))try{l=JSON.parse(l)}catch(e){}c[a]=l,i("hydrate",a,!0)}catch(e){i("hydrate",t,!1,String(e));const n=e instanceof Error?e:new Error(String(e));a&&a(n,{operation:"hydration",key:t})}}const g=h<l&&s.migrate?s.migrate(c,h):c;Object.entries(g).forEach(([n,r])=>{const s=y&&null!==r&&"object"==typeof r?T(Se(r),!0):r,o=t(s),i=f.get(n)||0;e.totalSize=e.totalSize-i+o,f.set(n,o),u.set(n,s),p.set(n,1)}),n()}catch(e){const t=e instanceof Error?e:new Error(String(e));a&&a(t,{operation:"hydration"})}})(V(),e=>(v>0||b>0)&&!Ee()?$(e):0,()=>{z=!0,R=null,M(),J()}).then(()=>{}):(z=!0,M());let G=null;return e?.sync&&(G=new be(W,e.sync),W._registerMethod("sync","flush",()=>G?.flush()),W._registerMethod("sync","getState",()=>G?.getState()),W._registerMethod("sync","onStateChange",e=>G?.onStateChange(e))),W};exports.AnalyticsPlugin=e=>({name:"gstate-analytics",hooks:{onSet:({key:t,value:n})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:n,action:"SET"}))},onRemove:({key:t})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:null,action:"REMOVE"}))}}}),exports.StorageAdapters=ke,exports.SyncPlugin=e=>{const t=new BroadcastChannel(e?.channelName||"gstate_sync");let n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:e})=>{t.onmessage=t=>{const{key:r,value:s,action:o}=t.data;r&&(n=!0,"REMOVE"===o?e.remove(r):e.set(r,s),n=!1)}},onSet:({key:e,value:r})=>{e&&!n&&t.postMessage({key:e,value:r,action:"SET"})},onRemove:({key:e})=>{e&&!n&&t.postMessage({key:e,action:"REMOVE"})},onDestroy:()=>{t.close()}}}},exports.createAsyncStore=(e,t)=>{const n=t?.key||"async_data",r=t?.store||Oe({namespace:`async_${n}`,silent:!0});null==r.get(n)&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null});return Object.assign(r,{execute:async()=>{const s=r.get(n);r.set(n,{...s||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{const s=await e(),o=r.get(n);r.set(n,{...o||{data:null,loading:!1,error:null,updatedAt:null},data:s,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(e){const t=r.get(n);r.set(n,{...t||{data:null,loading:!1,error:null,updatedAt:null},error:e instanceof Error?e:new Error(String(e)),loading:!1})}}})};
|
|
1
|
+
var e=Symbol.for("immer-nothing"),t=Symbol.for("immer-draftable"),n=Symbol.for("immer-state"),r=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}];function s(e,...t){{const n=r[e],s=D(n)?n.apply(null,t):n;throw new Error(`[Immer] ${s}`)}}var o=Object,i=o.getPrototypeOf,a="constructor",c="prototype",l="configurable",u="enumerable",f="writable",p="value",d=e=>!!e&&!!e[n];function y(e){return!!e&&(_(e)||E(e)||!!e[t]||!!e[a]?.[t]||k(e)||O(e))}var h=o[c][a].toString(),g=new WeakMap;function _(e){if(!e||!C(e))return!1;const t=i(e);if(null===t||t===o[c])return!0;const n=o.hasOwnProperty.call(t,a)&&t[a];if(n===Object)return!0;if(!D(n))return!1;let r=g.get(n);return void 0===r&&(r=Function.toString.call(n),g.set(n,r)),r===h}function m(e,t,n=!0){if(0===S(e)){(n?Reflect.ownKeys(e):o.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function S(e){const t=e[n];return t?t.type_:E(e)?1:k(e)?2:O(e)?3:0}var w=(e,t,n=S(e))=>2===n?e.has(t):o[c].hasOwnProperty.call(e,t),v=(e,t,n=S(e))=>2===n?e.get(t):e[t],b=(e,t,n,r=S(e))=>{2===r?e.set(t,n):3===r?e.add(n):e[t]=n};var E=Array.isArray,k=e=>e instanceof Map,O=e=>e instanceof Set,C=e=>"object"==typeof e,D=e=>"function"==typeof e,M=e=>"boolean"==typeof e;var A=e=>e.copy_||e.base_,P=e=>e.modified_?e.copy_:e.base_;function z(e,t){if(k(e))return new Map(e);if(O(e))return new Set(e);if(E(e))return Array[c].slice.call(e);const r=_(e);if(!0===t||"class_only"===t&&!r){const t=o.getOwnPropertyDescriptors(e);delete t[n];let r=Reflect.ownKeys(t);for(let n=0;n<r.length;n++){const s=r[n],o=t[s];!1===o[f]&&(o[f]=!0,o[l]=!0),(o.get||o.set)&&(t[s]={[l]:!0,[f]:!0,[u]:o[u],[p]:e[s]})}return o.create(i(e),t)}{const t=i(e);if(null!==t&&r)return{...e};const n=o.create(t);return o.assign(n,e)}}function T(e,t=!1){return I(e)||d(e)||!y(e)||(S(e)>1&&o.defineProperties(e,{set:j,add:j,clear:j,delete:j}),o.freeze(e),t&&m(e,(e,t)=>{T(t,!0)},!1)),e}var j={[p]:function(){s(2)}};function I(e){return null===e||!C(e)||o.isFrozen(e)}var R="MapSet",x="Patches",V="ArrayMethods",L={};function $(e){const t=L[e];return t||s(0,e),t}var N,U=e=>!!L[e],F=()=>N;function J(e,t){t&&(e.patchPlugin_=$(x),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function K(e){Q(e),e.drafts_.forEach(B),e.drafts_=null}function Q(e){e===N&&(N=e.parent_)}var W=e=>N={drafts_:[],parent_:N,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:U(R)?$(R):void 0,arrayMethodsPlugin_:U(V)?$(V):void 0};function B(e){const t=e[n];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function G(t,r){r.unfinalizedDrafts_=r.drafts_.length;const o=r.drafts_[0];if(void 0!==t&&t!==o){o[n].modified_&&(K(r),s(4)),y(t)&&(t=Z(r,t));const{patchPlugin_:e}=r;e&&e.generateReplacementPatches_(o[n].base_,t,r)}else t=Z(r,o);return function(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&T(t,n)}(r,t,!0),K(r),r.patches_&&r.patchListener_(r.patches_,r.inversePatches_),t!==e?t:void 0}function Z(e,t){if(I(t))return t;const r=t[n];if(!r){return te(t,e.handledSet_,e)}if(!X(r,e))return t;if(!r.modified_)return r.base_;if(!r.finalized_){const{callbacks_:t}=r;if(t)for(;t.length>0;){t.pop()(e)}ee(r,e)}return r.copy_}function q(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var X=(e,t)=>e.scope_===t,H=[];function Y(e,t,n,r){const s=A(e),o=e.type_;if(void 0!==r){if(v(s,r,o)===t)return void b(s,r,n,o)}if(!e.draftLocations_){const t=e.draftLocations_=new Map;m(s,(e,n)=>{if(d(n)){const r=t.get(n)||[];r.push(e),t.set(n,r)}})}const i=e.draftLocations_.get(t)??H;for(const e of i)b(s,e,n,o)}function ee(e,t){if(e.modified_&&!e.finalized_&&(3===e.type_||1===e.type_&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){const{patchPlugin_:n}=t;if(n){const r=n.getPath(e);r&&n.generatePatches_(e,r,t)}q(e)}}function te(e,t,r){return!r.immer_.autoFreeze_&&r.unfinalizedDrafts_<1||d(e)||t.has(e)||!y(e)||I(e)||(t.add(e),m(e,(s,o)=>{if(d(o)){const t=o[n];if(X(t,r)){const n=P(t);b(e,s,n,e.type_),q(t)}}else y(o)&&te(o,t,r)})),e}var ne={get(e,t){if(t===n)return e;let r=e.scope_.arrayMethodsPlugin_;const s=1===e.type_&&"string"==typeof t;if(s&&r?.isArrayOperationMethod(t))return r.createMethodInterceptor(e,t);const o=A(e);if(!w(o,t,e.type_))return function(e,t,n){const r=oe(t,n);return r?p in r?r[p]:r.get?.call(e.draft_):void 0}(e,o,t);const i=o[t];if(e.finalized_||!y(i))return i;if(s&&e.operationMethod&&r?.isMutatingArrayMethod(e.operationMethod)&&function(e){const t=+e;return Number.isInteger(t)&&String(t)===e}(t))return i;if(i===se(e.base_,t)){ae(e);const n=1===e.type_?+t:t,r=ce(e.scope_,i,e,n);return e.copy_[n]=r}return i},has:(e,t)=>t in A(e),ownKeys:e=>Reflect.ownKeys(A(e)),set(e,t,r){const s=oe(A(e),t);if(s?.set)return s.set.call(e.draft_,r),!0;if(!e.modified_){const s=se(A(e),t),a=s?.[n];if(a&&a.base_===r)return e.copy_[t]=r,e.assigned_.set(t,!1),!0;if(((o=r)===(i=s)?0!==o||1/o==1/i:o!=o&&i!=i)&&(void 0!==r||w(e.base_,t,e.type_)))return!0;ae(e),ie(e)}var o,i;return e.copy_[t]===r&&(void 0!==r||t in e.copy_)||Number.isNaN(r)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=r,e.assigned_.set(t,!0),function(e,t,r){const{scope_:s}=e;if(d(r)){const o=r[n];X(o,s)&&o.callbacks_.push(function(){ae(e);const n=P(o);Y(e,r,n,t)})}else y(r)&&e.callbacks_.push(function(){const n=A(e);3===e.type_?n.has(r)&&te(r,s.handledSet_,s):v(n,t,e.type_)===r&&s.drafts_.length>1&&!0===(e.assigned_.get(t)??!1)&&e.copy_&&te(v(e.copy_,t,e.type_),s.handledSet_,s)})}(e,t,r)),!0},deleteProperty:(e,t)=>(ae(e),void 0!==se(e.base_,t)||t in e.base_?(e.assigned_.set(t,!1),ie(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=A(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{[f]:!0,[l]:1!==e.type_||"length"!==t,[u]:r[u],[p]:n[t]}:r},defineProperty(){s(11)},getPrototypeOf:e=>i(e.base_),setPrototypeOf(){s(12)}},re={};for(let e in ne){let t=ne[e];re[e]=function(){const e=arguments;return e[0]=e[0][0],t.apply(this,e)}}function se(e,t){const r=e[n];return(r?A(r):e)[t]}function oe(e,t){if(!(t in e))return;let n=i(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=i(n)}}function ie(e){e.modified_||(e.modified_=!0,e.parent_&&ie(e.parent_))}function ae(e){e.copy_||(e.assigned_=new Map,e.copy_=z(e.base_,e.scope_.immer_.useStrictShallowCopy_))}re.deleteProperty=function(e,t){return isNaN(parseInt(t))&&s(13),re.set.call(this,e,t,void 0)},re.set=function(e,t,n){return"length"!==t&&isNaN(parseInt(t))&&s(14),ne.set.call(this,e[0],t,n,e[0])};function ce(e,t,n,r){const[s,o]=k(t)?$(R).proxyMap_(t,n):O(t)?$(R).proxySet_(t,n):function(e,t){const n=E(e),r={type_:n?1:0,scope_:t?t.scope_:F(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let s=r,o=ne;n&&(s=[r],o=re);const{revoke:i,proxy:a}=Proxy.revocable(s,o);return r.draft_=a,r.revoke_=i,[a,r]}(t,n);return(n?.scope_??F()).drafts_.push(s),o.callbacks_=n?.callbacks_??[],o.key_=r,n&&void 0!==r?function(e,t,n){e.callbacks_.push(function(r){const s=t;if(!s||!X(s,r))return;r.mapSetPlugin_?.fixSetContents(s);const o=P(s);Y(e,s.draft_??s,o,n),ee(s,r)})}(n,o,r):o.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(o);const{patchPlugin_:t}=e;o.modified_&&t&&t.generatePatches_(o,[],e)}),s}function le(e){if(!y(e)||I(e))return e;const t=e[n];let r,s=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,r=z(e,t.scope_.immer_.useStrictShallowCopy_),s=t.scope_.immer_.shouldUseStrictIteration()}else r=z(e,!0);return m(r,(e,t)=>{b(r,e,le(t))},s),t&&(t.finalized_=!1),r}var ue=(new class{constructor(t){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(t,n,r)=>{if(D(t)&&!D(n)){const e=n;n=t;const r=this;return function(t=e,...s){return r.produce(t,e=>n.call(this,e,...s))}}let o;if(D(n)||s(6),void 0===r||D(r)||s(7),y(t)){const e=W(this),s=ce(e,t,void 0);let i=!0;try{o=n(s),i=!1}finally{i?K(e):Q(e)}return J(e,r),G(o,e)}if(!t||!C(t)){if(o=n(t),void 0===o&&(o=t),o===e&&(o=void 0),this.autoFreeze_&&T(o,!0),r){const e=[],n=[];$(x).generateReplacementPatches_(t,o,{patches_:e,inversePatches_:n}),r(e,n)}return o}s(1,t)},this.produceWithPatches=(e,t)=>{if(D(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},M(t?.autoFreeze)&&this.setAutoFreeze(t.autoFreeze),M(t?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(t.useStrictShallowCopy),M(t?.useStrictIteration)&&this.setUseStrictIteration(t.useStrictIteration)}createDraft(e){y(e)||s(8),d(e)&&(e=function(e){d(e)||s(10,e);return le(e)}(e));const t=W(this),r=ce(t,e,void 0);return r[n].isManual_=!0,Q(t),r}finishDraft(e,t){const r=e&&e[n];r&&r.isManual_||s(9);const{scope_:o}=r;return J(o,t),G(void 0,o)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=$(x).applyPatches_;return d(e)?r(e,t):this.produce(e,e=>r(e,t))}}).produce,fe=(e,t)=>{const n=Date.now();if(/\(\.*\+\?\)\+/.test(e)||/\(\.*\?\)\*/.test(e))return!1;if(e.length>500)return!1;try{const n=new RegExp(e).test(t);Date.now();return n}catch{return!1}},pe=()=>{if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)try{return crypto.randomUUID()}catch{}throw new Error("Cryptographically secure random UUID generation is required but crypto.randomUUID is unavailable. Please use a browser or environment with Web Crypto API support.")};"undefined"!=typeof crypto&&void 0!==crypto.subtle&&crypto.subtle.generateKey;var de=async(e,t)=>{const n=(new TextEncoder).encode(JSON.stringify(e)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,n),s=new Uint8Array(t.iv.length+r.byteLength);return s.set(t.iv),s.set(new Uint8Array(r),t.iv.length),btoa(String.fromCharCode(...s))},ye=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=n.slice(0,12),s=n.slice(12),o=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,s);return JSON.parse((new TextDecoder).decode(o))},he=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},ge=(e,t,n,r)=>{if(0===e.size)return!0;for(const[s,o]of e){let e;if(e="function"==typeof s?s(t,r):fe(s,t),e)return o.includes(n)||o.includes("admin")}return!1},_e=e=>{if("string"==typeof e){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,e=>{const t=e.match(/&#x([0-9a-fA-F]+);?/i);if(t&&t[1])return String.fromCharCode(parseInt(t[1],16));const n=e.match(/&#([0-9]+);?/);return n&&n[1]?String.fromCharCode(parseInt(n[1],10)):e});try{t=decodeURIComponent(t)}catch{}return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi,"[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi,"[SEC-REMOVED]").replace(/on\w+\s*=/gi,"[SEC-REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"[SEC-REMOVED]").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"[SEC-REMOVED]").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"[SEC-REMOVED]").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi,"[SEC-REMOVED]").replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi,"[SEC-REMOVED]").replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi,"[SEC-REMOVED]").replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi,"[SEC-REMOVED]").replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi,"[SEC-REMOVED]").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"[SEC-REMOVED]")}if(e&&"object"==typeof e&&!Array.isArray(e)){if(Object.getPrototypeOf(e)===Object.prototype){const t={};for(const[n,r]of Object.entries(e))t[n]=_e(r);return t}return e}return Array.isArray(e)?e.map(e=>_e(e)):e},me=(e,t,n,r)=>{const s={id:pe(),purpose:n,granted:r,timestamp:Date.now()},o=e.get(t)||[];return o.push(s),e.set(t,o),s},Se=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof structuredClone)try{return structuredClone(e)}catch(e){}const t=new WeakMap,n=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){const r=new Map;return t.set(e,r),e.forEach((e,t)=>r.set(n(t),n(e))),r}if(e instanceof Set){const r=new Set;return t.set(e,r),e.forEach(e=>r.add(n(e))),r}const r=Array.isArray(e)?[]:Object.create(Object.getPrototypeOf(e));t.set(e,r);const s=[...Object.keys(e),...Object.getOwnPropertySymbols(e)];for(const t of s)r[t]=n(e[t]);return r};return n(e)},we=(e,t)=>{if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!we(e[n],t[n]))return!1;return!0}const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r=0;r<n.length;r++){const s=n[r];if(!(s in t)||!we(e[s],t[s]))return!1}return!0},ve=e=>`${e}_`,be=class{store;config;pendingQueue=new Map;remoteVersions=new Map;syncTimer=null;onlineStatusListeners=new Set;syncStateListeners=new Set;_isOnline=!0;_isSyncing=!1;constructor(e,t){this.store=e,this.config={endpoint:t.endpoint,authToken:t.authToken||"",strategy:t.strategy||"last-write-wins",autoSyncInterval:t.autoSyncInterval??3e4,syncOnReconnect:t.syncOnReconnect??!0,debounceTime:t.debounceTime??1e3,fetch:t.fetch||fetch,onSync:t.onSync||(()=>{}),onConflict:t.onConflict||(()=>({action:"accept-local"})),maxRetries:t.maxRetries??3},this._isOnline="undefined"==typeof navigator||navigator.onLine,this._setupOnlineListener(),this._setupStoreListener(),this.config.autoSyncInterval>0&&this._startAutoSync()}_getAuthToken(){const e=this.config.authToken;return"function"==typeof e?e()||"":e||""}_setupOnlineListener(){"undefined"!=typeof window&&(window.addEventListener("online",()=>{this._isOnline=!0,this._notifyOnlineChange(!0),this.config.syncOnReconnect&&this.sync()}),window.addEventListener("offline",()=>{this._isOnline=!1,this._notifyOnlineChange(!1)}))}_setupStoreListener(){this.store._subscribe(()=>{})}_startAutoSync(){setInterval(()=>{this._isOnline&&!this._isSyncing&&this.pendingQueue.size>0&&this.sync()},this.config.autoSyncInterval)}_notifyOnlineChange(e){this.onlineStatusListeners.forEach(t=>t(e)),this._notifyStateChange()}_notifyStateChange(){const e=this.getState();this.syncStateListeners.forEach(t=>t(e))}queueChange(e,t){const n=this.store._getVersion(e)||1;this.pendingQueue.set(e,{key:e,value:Se(t),timestamp:Date.now(),version:n}),this._notifyStateChange(),this.syncTimer&&clearTimeout(this.syncTimer),this.syncTimer=setTimeout(()=>{this._isOnline&&this.sync()},this.config.debounceTime)}async sync(){if(this._isSyncing)return{success:!1,syncedKeys:[],conflicts:[],errors:["Sync already in progress"],timestamp:Date.now(),duration:0};this._isSyncing=!0,this._notifyStateChange();const e=Date.now(),t=[],n=[],r=[];try{const s=Array.from(this.pendingQueue.values());if(0===s.length)return this._isSyncing=!1,this._notifyStateChange(),{success:!0,syncedKeys:[],conflicts:[],errors:[],timestamp:Date.now(),duration:Date.now()-e};await this._fetchRemoteVersions(s.map(e=>e.key));for(const e of s)try{const r=this.remoteVersions.get(e.key);if(r)if(r.version>=e.version){const s={key:e.key,localValue:e.value,remoteValue:r.value,localVersion:e.version,remoteVersion:r.version,timestamp:e.timestamp};n.push(s);const o=this.config.onConflict(s);await this._resolveConflict(e,r,o),t.push(e.key),this.pendingQueue.delete(e.key)}else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key);else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key)}catch(t){r.push(`Failed to sync "${e.key}": ${t}`)}const o={success:0===r.length,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e};return this.config.onSync(o),o}catch(s){const o=`Sync failed: ${s}`;return r.push(o),{success:!1,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e}}finally{this._isSyncing=!1,this._notifyStateChange()}}async _fetchRemoteVersions(e){try{const t=this._getAuthToken(),n=await this.config.fetch(`${this.config.endpoint}/versions`,{method:"POST",headers:{"Content-Type":"application/json",...t&&{Authorization:`Bearer ${t}`}},body:JSON.stringify({keys:e})});if(n.ok){const e=await n.json();if(e.versions)for(const[t,n]of Object.entries(e.versions))this.remoteVersions.set(t,n)}}catch(e){}}async _pushChange(e){let t=0;for(;t<this.config.maxRetries;)try{const n=this._getAuthToken(),r=await this.config.fetch(`${this.config.endpoint}/sync`,{method:"POST",headers:{"Content-Type":"application/json",...n&&{Authorization:`Bearer ${n}`}},body:JSON.stringify({key:e.key,value:e.value,version:e.version,timestamp:e.timestamp})});if(r.ok){const t=await r.json();return void(t.version&&this.remoteVersions.set(e.key,{version:t.version,timestamp:t.timestamp||Date.now(),value:e.value}))}t++}catch(e){if(t++,t>=this.config.maxRetries)throw e}}async _resolveConflict(e,t,n){switch(n.action){case"accept-local":await this._pushChange({...e,version:t.version+1,timestamp:Date.now()});break;case"accept-remote":this.store.set(e.key,t.value);break;case"merge":this.store.set(e.key,n.value),await this._pushChange({key:e.key,value:n.value,version:Math.max(e.version,t.version)+1,timestamp:Date.now()})}}getState(){return{isOnline:this._isOnline,isSyncing:this._isSyncing,lastSyncTimestamp:null,pendingChanges:this.pendingQueue.size,conflicts:0}}onOnlineChange(e){return this.onlineStatusListeners.add(e),()=>this.onlineStatusListeners.delete(e)}onStateChange(e){return this.syncStateListeners.add(e),()=>this.syncStateListeners.delete(e)}async flush(){return this.sync()}destroy(){this.syncTimer&&clearTimeout(this.syncTimer),this.pendingQueue.clear(),this.onlineStatusListeners.clear(),this.syncStateListeners.clear()}},Ee=()=>{try{0;const e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};return void 0!==e.__DEV__&&!1===e.__DEV__}catch{return!1}},ke={local:()=>"undefined"!=typeof window?window.localStorage:null,session:()=>"undefined"!=typeof window?window.sessionStorage:null,memory:()=>{const e=new Map;return{getItem:t=>e.get(t)||null,setItem:(t,n)=>e.set(t,n),removeItem:t=>e.delete(t),key:t=>Array.from(e.keys())[t]||null,get length(){return e.size}}}},Oe=e=>{const t=new Map,n=new Map,r=new Map,s=new Set,o=new Map,i=new Set,a=new Map,c=new Map,l=new Map,u=new Map,f=new Map,p=new Map,d=new Map,y=new Map,h=e?.namespace||"gstate",g=e?.silent??!1,_=e?.debounceTime??150,m=e?.version??0,S=e?.storage||ke.local(),w=e?.onError,v=e?.maxObjectSize??0,b=e?.maxTotalSize??0,E=e?.encryptionKey??null,k=e?.validateInput??!0,O=e?.userId,C=e?.immer??!0,D=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(e=>he(d,e.pattern,e.permissions));let M,A=!1,P=!1,z=!1,j=0,I=null,R=null;const x=new Promise(e=>{M=e}),V=()=>({store:t,versions:n,sizes:r,totalSize:j,storage:S,config:e||{},diskQueue:f,encryptionKey:E,audit:U,onError:w,silent:g,debounceTime:_,currentVersion:m}),L=()=>({plugins:u,onError:w,silent:g}),$=e=>{if(null==e)return 0;const t=typeof e;if("boolean"===t)return 4;if("number"===t)return 8;if("string"===t)return 2*e.length;if("object"!==t)return 0;let n=0;const r=[e],s=new WeakSet;for(;r.length>0;){const e=r.pop();if("boolean"==typeof e)n+=4;else if("number"==typeof e)n+=8;else if("string"==typeof e)n+=2*e.length;else if("object"==typeof e&&null!==e){const t=e;if(s.has(t))continue;if(s.add(t),Array.isArray(t))for(let e=0;e<t.length;e++)r.push(t[e]);else for(const e of Object.keys(t))n+=2*e.length,r.push(t[e])}}return n},N=(e,t)=>{((e,t,n)=>{if(0!==e.plugins.size)for(const r of e.plugins.values()){const s=r.hooks?.[t];if(s)try{s(n)}catch(s){const o=s instanceof Error?s:new Error(String(s));e.onError?e.onError(o,{operation:`plugin:${r.name}:${t}`,key:n.key}):e.silent}}})(L(),e,t)},U=(e,t,n,r)=>{},F=e=>{const t=c.get(e);if(!t)return;const r=new Set,s=t.selector(e=>(r.add(e),c.has(e)?c.get(e).lastValue:W.get(e)));t.deps.forEach(t=>{if(!r.has(t)){const n=l.get(t);n&&(n.delete(e),0===n.size&&l.delete(t))}}),r.forEach(n=>{t.deps.has(n)||(l.has(n)||l.set(n,new Set),l.get(n).add(e))}),t.deps=r,we(t.lastValue,s)||(t.lastValue=C&&null!==s&&"object"==typeof s?T(Se(s),!0):s,n.set(e,(n.get(e)||0)+1),J(e))},J=e=>{if(e){if(l.has(e)){const t=l.get(e);for(const e of t)F(e)}const t=a.get(e);if(t){const n=W.get(e);for(const r of t)try{r(n)}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"watcher",key:e})}}const n=o.get(e);if(n)for(const t of n)try{t()}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"keyListener",key:e})}}if(A)P=!0;else for(const e of s)try{e()}catch(e){const t=e instanceof Error?e:new Error(String(e));w&&w(t,{operation:"listener"})}},K=async()=>{(async e=>{if(!e.storage)return;const{store:t,config:n,diskQueue:r,storage:s,encryptionKey:o,audit:i,onError:a,silent:c,currentVersion:l}=e,u=ve(n.namespace||"gstate");try{const e={};let r;t.forEach((t,n)=>{e[n]=t});const o=n?.encoded;r=o?btoa(JSON.stringify(e)):JSON.stringify(e),s.setItem(u.replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:r,_sys_v:l,_b64:!!o||void 0})),i("set","FULL_STATE",!0)}catch(e){const t=e instanceof Error?e:new Error(String(e));a&&a(t,{operation:"persist",key:"FULL_STATE"})}const f=Array.from(r.entries());r.clear();for(const[t,n]of f)try{if(!t||!/^[a-zA-Z0-9_.-]+$/.test(t)||t.length>256)continue;let r=n.value;const a=n.options.encoded||n.options.encrypted||n.options.secure;if(n.options.encrypted){if(!o)throw new Error(`Encryption key missing for "${t}"`);r=await de(n.value,o)}else a?r=btoa(JSON.stringify(n.value)):"object"==typeof n.value&&null!==n.value&&(r=JSON.stringify(n.value));s.setItem(`${u}${t}`,JSON.stringify({v:e.versions.get(t)||1,t:Date.now(),e:n.options.ttl?Date.now()+n.options.ttl:null,d:r,_sys_v:l,_enc:!!n.options.encrypted||void 0,_b64:!(!n.options.encoded&&!n.options.secure)||void 0})),i("set",t,!0)}catch(e){const n=e instanceof Error?e:new Error(String(e));a&&a(n,{operation:"persist",key:t})}})(V())},Q={},W={_setSilently:(e,s)=>{const o=r.get(e)||0,i=C&&null!==s&&"object"==typeof s?T(Se(s),!0):s,a=(v>0||b>0)&&!Ee()?$(i):0;j=j-o+a,r.set(e,a),t.set(e,i),n.set(e,(n.get(e)||0)+1),R=null},_registerMethod:(e,t,n)=>{const r=e=>"__proto__"===e||"constructor"===e||"prototype"===e;r(e)||r(t)||(Q[e]||(Q[e]={}),Q[e][t]=n)},set:(s,o,i={})=>{const a=t.get(s),c=C&&"function"==typeof o?ue(a,o):o;if(k&&!(e=>/^([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*)$/.test(e)&&e.length<=256&&e.length>0)(s))return!1;if(!ge(d,s,"write",O))return!1;const l=k?_e(c):c,u=r.get(s)||0;N("onBeforeSet",{key:s,value:l,store:W,version:n.get(s)||0});const p=C&&null!==l&&"object"==typeof l?T(Se(l),!0):l;if(!we(a,p)){const o=(v>0||b>0)&&!Ee()?$(p):0;if(v>0&&o>v){const e=new Error(`Object size (${o} bytes) exceeds maxObjectSize (${v} bytes)`);w&&w(e,{operation:"set",key:s})}if(b>0){const e=j-u+o;if(e>b){const t=new Error(`Total store size (${e} bytes) exceeds limit (${b} bytes)`);w&&w(t,{operation:"set"})}}j=j-u+o,r.set(s,o),t.set(s,p),n.set(s,(n.get(s)||0)+1),R=null;const a=i.persist??D;return a&&(f.set(s,{value:p,options:{...i,persist:a,encoded:i.encoded||e?.encoded}}),I&&clearTimeout(I),I=setTimeout(K,_)),N("onSet",{key:s,value:p,store:W,version:n.get(s)}),J(s),!0}return!1},get:e=>{if(!ge(d,e,"read",O))return null;const n=t.get(e);return N("onGet",{store:W,key:e,value:n}),n},compute:(e,t)=>{try{return c.has(e)||(c.set(e,{selector:t,lastValue:null,deps:new Set}),F(e)),c.get(e).lastValue}catch(t){const n=t instanceof Error?t:new Error(String(t));return w&&w(n,{operation:"compute",key:e}),null}},watch:(e,t)=>{a.has(e)||a.set(e,new Set);const n=a.get(e);return n.add(t),()=>{n.delete(t),0===n.size&&a.delete(e)}},remove:e=>{if(!ge(d,e,"delete",O))return!1;const s=t.get(e),o=t.delete(e);return o&&(j-=r.get(e)||0,r.delete(e),N("onRemove",{store:W,key:e,value:s}),R=null),n.set(e,(n.get(e)||0)+1),S&&S.removeItem(`${h}_${e}`),J(e),o},delete:e=>W.remove(e),deleteAll:()=>{if(Array.from(t.keys()).forEach(e=>W.remove(e)),S){const e=h+"_";for(let t=0;t<(S.length||0);t++){const n=S.key(t);n?.startsWith(e)&&(S.removeItem(n),t--)}}return j=0,r.clear(),R=null,!0},list:()=>Object.fromEntries(t.entries()),use:e=>{i.add(e)},transaction:e=>{A=!0,N("onTransaction",{store:W,key:"START"});try{e()}finally{A=!1,N("onTransaction",{store:W,key:"END"}),P&&(P=!1,J())}},destroy:()=>{I&&(clearTimeout(I),I=null),f.clear(),"undefined"!=typeof window&&window.removeEventListener("beforeunload",B),N("onDestroy",{store:W}),s.clear(),o.clear(),a.clear(),c.clear(),l.clear(),u.clear(),t.clear(),r.clear(),j=0,d.clear(),y.clear(),n.clear(),p.clear(),i.clear()},_addPlugin:e=>{((e,t,n)=>{try{e.plugins.set(t.name,t),t.hooks?.onInstall?.({store:n})}catch(n){const r=n instanceof Error?n:new Error(String(n));e.onError?e.onError(r,{operation:"plugin:install",key:t.name}):e.silent}})(L(),e,W)},_removePlugin:e=>{u.delete(e)},_subscribe:(e,t)=>{if(t){o.has(t)||o.set(t,new Set);const n=o.get(t);return n.add(e),()=>{n.delete(e),0===n.size&&o.delete(t)}}return s.add(e),()=>s.delete(e)},_getVersion:e=>n.get(e)??0,addAccessRule:(e,t)=>he(d,e,t),hasPermission:(e,t,n)=>ge(d,e,t,n),recordConsent:(e,t,n)=>me(y,e,t,n),hasConsent:(e,t)=>((e,t,n)=>{const r=e.get(t);if(!r)return!1;for(let e=r.length-1;e>=0;e--){const t=r[e];if(t&&t.purpose===n)return t.granted}return!1})(y,e,t),getConsents:e=>((e,t)=>e.get(t)||[])(y,e),revokeConsent:(e,t)=>((e,t,n)=>me(e,t,n,!1))(y,e,t),exportUserData:e=>((e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}))(y,e),deleteUserData:e=>((e,t)=>{const n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}})(y,e),getSnapshot:()=>(R||(R=Object.fromEntries(t.entries())),R),get plugins(){return Q},get isReady(){return z},get namespace(){return h},get userId(){return O},whenReady:()=>x};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(e=>{const t=W[e];t&&W._registerMethod("security",e,t)});const B=()=>{f.size>0&&K()};"undefined"!=typeof window&&window.addEventListener("beforeunload",B),S?(async(e,t,n)=>{const{storage:r,config:s,encryptionKey:o,audit:i,onError:a,silent:c,currentVersion:l,store:u,sizes:f,versions:p}=e,d=ve(s.namespace||"gstate"),y=s.immer??!0;if(r)try{const c={};let h=0;for(let e=0;e<(r.length||0);e++){const t=r.key(e);if(!t||!t.startsWith(d))continue;const n=r.getItem(t);if(n)try{const s=JSON.parse(n),a=t.substring(d.length);if(h=Math.max(h,void 0!==s._sys_v?s._sys_v:s.v||0),s.e&&Date.now()>s.e){r.removeItem(t),e--;continue}let l=s.d;if(s._enc&&o)l=await ye(l,o);else if("string"==typeof l)if(s._b64)try{l=JSON.parse(atob(l))}catch(e){}else if(l.startsWith("{")||l.startsWith("["))try{l=JSON.parse(l)}catch(e){}c[a]=l,i("hydrate",a,!0)}catch(e){i("hydrate",t,!1,String(e));const n=e instanceof Error?e:new Error(String(e));a&&a(n,{operation:"hydration",key:t})}}const g=h<l&&s.migrate?s.migrate(c,h):c;Object.entries(g).forEach(([n,r])=>{const s=y&&null!==r&&"object"==typeof r?T(Se(r),!0):r,o=t(s),i=f.get(n)||0;e.totalSize=e.totalSize-i+o,f.set(n,o),u.set(n,s),p.set(n,1)}),n()}catch(e){const t=e instanceof Error?e:new Error(String(e));a&&a(t,{operation:"hydration"})}})(V(),e=>(v>0||b>0)&&!Ee()?$(e):0,()=>{z=!0,R=null,M(),J()}).then(()=>{}):(z=!0,M());let G=null;return e?.sync&&(G=new be(W,e.sync),W._registerMethod("sync","flush",()=>G?.flush()),W._registerMethod("sync","getState",()=>G?.getState()),W._registerMethod("sync","onStateChange",e=>G?.onStateChange(e))),W};exports.AnalyticsPlugin=e=>({name:"gstate-analytics",hooks:{onSet:({key:t,value:n})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:n,action:"SET"}))},onRemove:({key:t})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:null,action:"REMOVE"}))}}}),exports.StorageAdapters=ke,exports.SyncPlugin=e=>{const t=new BroadcastChannel(e?.channelName||"gstate_sync");let n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:e})=>{t.onmessage=t=>{const{key:r,value:s,action:o}=t.data;r&&(n=!0,"REMOVE"===o?e.remove(r):e.set(r,s),n=!1)}},onSet:({key:e,value:r})=>{e&&!n&&t.postMessage({key:e,value:r,action:"SET"})},onRemove:({key:e})=>{e&&!n&&t.postMessage({key:e,action:"REMOVE"})},onDestroy:()=>{t.close()}}}},exports.createAsyncStore=(e,t)=>{const n=t?.key||"async_data",r=t?.store||Oe({namespace:`async_${n}`,silent:!0});null==r.get(n)&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null});return Object.assign(r,{execute:async()=>{const s=r.get(n);r.set(n,{...s||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{const s=await e(),o=r.get(n);r.set(n,{...o||{data:null,loading:!1,error:null,updatedAt:null},data:s,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(e){const t=r.get(n);r.set(n,{...t||{data:null,loading:!1,error:null,updatedAt:null},error:e instanceof Error?e:new Error(String(e)),loading:!1})}}})};
|
package/core/minimal.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
exports.createStore=e=>{let t={...e};const r=new Set;return{get:e=>t[e],set:(e,s)=>{t={...t,[e]:s},r.forEach(e=>e())},subscribe:e=>(r.add(e),()=>r.delete(e))}};
|
package/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var e=require("react"),t=Symbol.for("immer-nothing"),n=Symbol.for("immer-draftable"),r=Symbol.for("immer-state"),s=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}];function o(e,...t){{const n=s[e],r=A(n)?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}}var a=Object,i=a.getPrototypeOf,c="constructor",l="prototype",u="configurable",d="enumerable",p="writable",f="value",y=e=>!!e&&!!e[r];function h(e){return!!e&&(_(e)||E(e)||!!e[n]||!!e[c]?.[n]||C(e)||O(e))}var g=a[l][c].toString(),m=new WeakMap;function _(e){if(!e||!x(e))return!1;const t=i(e);if(null===t||t===a[l])return!0;const n=a.hasOwnProperty.call(t,c)&&t[c];if(n===Object)return!0;if(!A(n))return!1;let r=m.get(n);return void 0===r&&(r=Function.toString.call(n),m.set(n,r)),r===g}function S(e,t,n=!0){if(0===w(e)){(n?Reflect.ownKeys(e):a.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function w(e){const t=e[r];return t?t.type_:E(e)?1:C(e)?2:O(e)?3:0}var b=(e,t,n=w(e))=>2===n?e.has(t):a[l].hasOwnProperty.call(e,t),v=(e,t,n=w(e))=>2===n?e.get(t):e[t],k=(e,t,n,r=w(e))=>{2===r?e.set(t,n):3===r?e.add(n):e[t]=n};var E=Array.isArray,C=e=>e instanceof Map,O=e=>e instanceof Set,x=e=>"object"==typeof e,A=e=>"function"==typeof e,D=e=>"boolean"==typeof e;var M=e=>e.copy_||e.base_,P=e=>e.modified_?e.copy_:e.base_;function R(e,t){if(C(e))return new Map(e);if(O(e))return new Set(e);if(E(e))return Array[l].slice.call(e);const n=_(e);if(!0===t||"class_only"===t&&!n){const t=a.getOwnPropertyDescriptors(e);delete t[r];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){const s=n[r],o=t[s];!1===o[p]&&(o[p]=!0,o[u]=!0),(o.get||o.set)&&(t[s]={[u]:!0,[p]:!0,[d]:o[d],[f]:e[s]})}return a.create(i(e),t)}{const t=i(e);if(null!==t&&n)return{...e};const r=a.create(t);return a.assign(r,e)}}function j(e,t=!1){return I(e)||y(e)||!h(e)||(w(e)>1&&a.defineProperties(e,{set:T,add:T,clear:T,delete:T}),a.freeze(e),t&&S(e,(e,t)=>{j(t,!0)},!1)),e}var T={[f]:function(){o(2)}};function I(e){return null===e||!x(e)||a.isFrozen(e)}var z="MapSet",V="Patches",$="ArrayMethods",U={};function N(e){const t=U[e];return t||o(0,e),t}var L,K=e=>!!U[e],F=()=>L;function B(e,t){t&&(e.patchPlugin_=N(V),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function J(e){W(e),e.drafts_.forEach(G),e.drafts_=null}function W(e){e===L&&(L=e.parent_)}var Q=e=>L={drafts_:[],parent_:L,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:K(z)?N(z):void 0,arrayMethodsPlugin_:K($)?N($):void 0};function G(e){const t=e[r];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function q(e,n){n.unfinalizedDrafts_=n.drafts_.length;const s=n.drafts_[0];if(void 0!==e&&e!==s){s[r].modified_&&(J(n),o(4)),h(e)&&(e=X(n,e));const{patchPlugin_:t}=n;t&&t.generateReplacementPatches_(s[r].base_,e,n)}else e=X(n,s);return function(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&j(t,n)}(n,e,!0),J(n),n.patches_&&n.patchListener_(n.patches_,n.inversePatches_),e!==t?e:void 0}function X(e,t){if(I(t))return t;const n=t[r];if(!n){return ne(t,e.handledSet_,e)}if(!H(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){const{callbacks_:t}=n;if(t)for(;t.length>0;){t.pop()(e)}te(n,e)}return n.copy_}function Z(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var H=(e,t)=>e.scope_===t,Y=[];function ee(e,t,n,r){const s=M(e),o=e.type_;if(void 0!==r){if(v(s,r,o)===t)return void k(s,r,n,o)}if(!e.draftLocations_){const t=e.draftLocations_=new Map;S(s,(e,n)=>{if(y(n)){const r=t.get(n)||[];r.push(e),t.set(n,r)}})}const a=e.draftLocations_.get(t)??Y;for(const e of a)k(s,e,n,o)}function te(e,t){if(e.modified_&&!e.finalized_&&(3===e.type_||1===e.type_&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){const{patchPlugin_:n}=t;if(n){const r=n.getPath(e);r&&n.generatePatches_(e,r,t)}Z(e)}}function ne(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||y(e)||t.has(e)||!h(e)||I(e)||(t.add(e),S(e,(s,o)=>{if(y(o)){const t=o[r];if(H(t,n)){const n=P(t);k(e,s,n,e.type_),Z(t)}}else h(o)&&ne(o,t,n)})),e}var re={get(e,t){if(t===r)return e;let n=e.scope_.arrayMethodsPlugin_;const s=1===e.type_&&"string"==typeof t;if(s&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);const o=M(e);if(!b(o,t,e.type_))return function(e,t,n){const r=ae(t,n);return r?f in r?r[f]:r.get?.call(e.draft_):void 0}(e,o,t);const a=o[t];if(e.finalized_||!h(a))return a;if(s&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&function(e){const t=+e;return Number.isInteger(t)&&String(t)===e}(t))return a;if(a===oe(e.base_,t)){ce(e);const n=1===e.type_?+t:t,r=le(e.scope_,a,e,n);return e.copy_[n]=r}return a},has:(e,t)=>t in M(e),ownKeys:e=>Reflect.ownKeys(M(e)),set(e,t,n){const s=ae(M(e),t);if(s?.set)return s.set.call(e.draft_,n),!0;if(!e.modified_){const s=oe(M(e),t),i=s?.[r];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(((o=n)===(a=s)?0!==o||1/o==1/a:o!=o&&a!=a)&&(void 0!==n||b(e.base_,t,e.type_)))return!0;ce(e),ie(e)}var o,a;return e.copy_[t]===n&&(void 0!==n||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_.set(t,!0),function(e,t,n){const{scope_:s}=e;if(y(n)){const o=n[r];H(o,s)&&o.callbacks_.push(function(){ce(e);const r=P(o);ee(e,n,r,t)})}else h(n)&&e.callbacks_.push(function(){const r=M(e);3===e.type_?r.has(n)&&ne(n,s.handledSet_,s):v(r,t,e.type_)===n&&s.drafts_.length>1&&!0===(e.assigned_.get(t)??!1)&&e.copy_&&ne(v(e.copy_,t,e.type_),s.handledSet_,s)})}(e,t,n)),!0},deleteProperty:(e,t)=>(ce(e),void 0!==oe(e.base_,t)||t in e.base_?(e.assigned_.set(t,!1),ie(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=M(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{[p]:!0,[u]:1!==e.type_||"length"!==t,[d]:r[d],[f]:n[t]}:r},defineProperty(){o(11)},getPrototypeOf:e=>i(e.base_),setPrototypeOf(){o(12)}},se={};for(let e in re){let t=re[e];se[e]=function(){const e=arguments;return e[0]=e[0][0],t.apply(this,e)}}function oe(e,t){const n=e[r];return(n?M(n):e)[t]}function ae(e,t){if(!(t in e))return;let n=i(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=i(n)}}function ie(e){e.modified_||(e.modified_=!0,e.parent_&&ie(e.parent_))}function ce(e){e.copy_||(e.assigned_=new Map,e.copy_=R(e.base_,e.scope_.immer_.useStrictShallowCopy_))}se.deleteProperty=function(e,t){return isNaN(parseInt(t))&&o(13),se.set.call(this,e,t,void 0)},se.set=function(e,t,n){return"length"!==t&&isNaN(parseInt(t))&&o(14),re.set.call(this,e[0],t,n,e[0])};function le(e,t,n,r){const[s,o]=C(t)?N(z).proxyMap_(t,n):O(t)?N(z).proxySet_(t,n):function(e,t){const n=E(e),r={type_:n?1:0,scope_:t?t.scope_:F(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let s=r,o=re;n&&(s=[r],o=se);const{revoke:a,proxy:i}=Proxy.revocable(s,o);return r.draft_=i,r.revoke_=a,[i,r]}(t,n);return(n?.scope_??F()).drafts_.push(s),o.callbacks_=n?.callbacks_??[],o.key_=r,n&&void 0!==r?function(e,t,n){e.callbacks_.push(function(r){const s=t;if(!s||!H(s,r))return;r.mapSetPlugin_?.fixSetContents(s);const o=P(s);ee(e,s.draft_??s,o,n),te(s,r)})}(n,o,r):o.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(o);const{patchPlugin_:t}=e;o.modified_&&t&&t.generatePatches_(o,[],e)}),s}function ue(e){if(!h(e)||I(e))return e;const t=e[r];let n,s=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=R(e,t.scope_.immer_.useStrictShallowCopy_),s=t.scope_.immer_.shouldUseStrictIteration()}else n=R(e,!0);return S(n,(e,t)=>{k(n,e,ue(t))},s),t&&(t.finalized_=!1),n}var de=(new class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,n,r)=>{if(A(e)&&!A(n)){const t=n;n=e;const r=this;return function(e=t,...s){return r.produce(e,e=>n.call(this,e,...s))}}let s;if(A(n)||o(6),void 0===r||A(r)||o(7),h(e)){const t=Q(this),o=le(t,e,void 0);let a=!0;try{s=n(o),a=!1}finally{a?J(t):W(t)}return B(t,r),q(s,t)}if(!e||!x(e)){if(s=n(e),void 0===s&&(s=e),s===t&&(s=void 0),this.autoFreeze_&&j(s,!0),r){const t=[],n=[];N(V).generateReplacementPatches_(e,s,{patches_:t,inversePatches_:n}),r(t,n)}return s}o(1,e)},this.produceWithPatches=(e,t)=>{if(A(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},D(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),D(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),D(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){h(e)||o(8),y(e)&&(e=function(e){y(e)||o(10,e);return ue(e)}(e));const t=Q(this),n=le(t,e,void 0);return n[r].isManual_=!0,W(t),n}finishDraft(e,t){const n=e&&e[r];n&&n.isManual_||o(9);const{scope_:s}=n;return B(s,t),q(void 0,s)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=N(V).applyPatches_;return y(e)?r(e,t):this.produce(e,e=>r(e,t))}}).produce,pe=(e,t)=>{const n=Date.now();if(/\(\.*\+\?\)\+/.test(e)||/\(\.*\?\)\*/.test(e))return!1;if(e.length>500)return!1;try{const n=new RegExp(e).test(t);Date.now();return n}catch{return!1}},fe=()=>{if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)try{return crypto.randomUUID()}catch{}throw new Error("Cryptographically secure random UUID generation is required but crypto.randomUUID is unavailable. Please use a browser or environment with Web Crypto API support.")},ye="undefined"!=typeof crypto&&void 0!==crypto.subtle&&"function"==typeof crypto.subtle.generateKey,he=async(e,t)=>{const n=(new TextEncoder).encode(JSON.stringify(e)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,n),s=new Uint8Array(t.iv.length+r.byteLength);return s.set(t.iv),s.set(new Uint8Array(r),t.iv.length),btoa(String.fromCharCode(...s))},ge=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=n.slice(0,12),s=n.slice(12),o=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,s);return JSON.parse((new TextDecoder).decode(o))},me=null,_e=e=>{me&&me(e)},Se=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},we=(e,t,n,r)=>{if(0===e.size)return!0;for(const[s,o]of e){let e;if(e="function"==typeof s?s(t,r):pe(s,t),e)return o.includes(n)||o.includes("admin")}return!1},be=e=>{if("string"==typeof e){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,e=>{const t=e.match(/&#x([0-9a-fA-F]+);?/i);if(t&&t[1])return String.fromCharCode(parseInt(t[1],16));const n=e.match(/&#([0-9]+);?/);return n&&n[1]?String.fromCharCode(parseInt(n[1],10)):e});try{t=decodeURIComponent(t)}catch{}return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi,"[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi,"[SEC-REMOVED]").replace(/on\w+\s*=/gi,"[SEC-REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"[SEC-REMOVED]").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"[SEC-REMOVED]").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"[SEC-REMOVED]").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi,"[SEC-REMOVED]").replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi,"[SEC-REMOVED]").replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi,"[SEC-REMOVED]").replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi,"[SEC-REMOVED]").replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi,"[SEC-REMOVED]").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"[SEC-REMOVED]")}if(e&&"object"==typeof e&&!Array.isArray(e)){if(Object.getPrototypeOf(e)===Object.prototype){const t={};for(const[n,r]of Object.entries(e))t[n]=be(r);return t}return e}return Array.isArray(e)?e.map(e=>be(e)):e},ve=e=>/^([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*)$/.test(e)&&e.length<=256&&e.length>0,ke=(e,t,n,r)=>{const s={id:fe(),purpose:n,granted:r,timestamp:Date.now()},o=e.get(t)||[];return o.push(s),e.set(t,o),_e({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),s},Ee=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof structuredClone)try{return structuredClone(e)}catch(e){}const t=new WeakMap,n=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){const r=new Map;return t.set(e,r),e.forEach((e,t)=>r.set(n(t),n(e))),r}if(e instanceof Set){const r=new Set;return t.set(e,r),e.forEach(e=>r.add(n(e))),r}const r=Array.isArray(e)?[]:Object.create(Object.getPrototypeOf(e));t.set(e,r);const s=[...Object.keys(e),...Object.getOwnPropertySymbols(e)];for(const t of s)r[t]=n(e[t]);return r};return n(e)},Ce=(e,t)=>{if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!Ce(e[n],t[n]))return!1;return!0}const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r=0;r<n.length;r++){const s=n[r];if(!(s in t)||!Ce(e[s],t[s]))return!1}return!0},Oe=e=>`${e}_`,xe=class{store;config;pendingQueue=new Map;remoteVersions=new Map;syncTimer=null;onlineStatusListeners=new Set;syncStateListeners=new Set;_isOnline=!0;_isSyncing=!1;constructor(e,t){this.store=e,this.config={endpoint:t.endpoint,authToken:t.authToken||"",strategy:t.strategy||"last-write-wins",autoSyncInterval:t.autoSyncInterval??3e4,syncOnReconnect:t.syncOnReconnect??!0,debounceTime:t.debounceTime??1e3,fetch:t.fetch||fetch,onSync:t.onSync||(()=>{}),onConflict:t.onConflict||(()=>({action:"accept-local"})),maxRetries:t.maxRetries??3},this._isOnline="undefined"==typeof navigator||navigator.onLine,this._setupOnlineListener(),this._setupStoreListener(),this.config.autoSyncInterval>0&&this._startAutoSync()}_getAuthToken(){const e=this.config.authToken;return"function"==typeof e?e()||"":e||""}_setupOnlineListener(){"undefined"!=typeof window&&(window.addEventListener("online",()=>{this._isOnline=!0,this._notifyOnlineChange(!0),this.config.syncOnReconnect&&this.sync()}),window.addEventListener("offline",()=>{this._isOnline=!1,this._notifyOnlineChange(!1)}))}_setupStoreListener(){this.store._subscribe(()=>{})}_startAutoSync(){setInterval(()=>{this._isOnline&&!this._isSyncing&&this.pendingQueue.size>0&&this.sync()},this.config.autoSyncInterval)}_notifyOnlineChange(e){this.onlineStatusListeners.forEach(t=>t(e)),this._notifyStateChange()}_notifyStateChange(){const e=this.getState();this.syncStateListeners.forEach(t=>t(e))}queueChange(e,t){const n=this.store._getVersion(e)||1;this.pendingQueue.set(e,{key:e,value:Ee(t),timestamp:Date.now(),version:n}),this._notifyStateChange(),this.syncTimer&&clearTimeout(this.syncTimer),this.syncTimer=setTimeout(()=>{this._isOnline&&this.sync()},this.config.debounceTime)}async sync(){if(this._isSyncing)return{success:!1,syncedKeys:[],conflicts:[],errors:["Sync already in progress"],timestamp:Date.now(),duration:0};this._isSyncing=!0,this._notifyStateChange();const e=Date.now(),t=[],n=[],r=[];try{const s=Array.from(this.pendingQueue.values());if(0===s.length)return this._isSyncing=!1,this._notifyStateChange(),{success:!0,syncedKeys:[],conflicts:[],errors:[],timestamp:Date.now(),duration:Date.now()-e};await this._fetchRemoteVersions(s.map(e=>e.key));for(const e of s)try{const r=this.remoteVersions.get(e.key);if(r)if(r.version>=e.version){const s={key:e.key,localValue:e.value,remoteValue:r.value,localVersion:e.version,remoteVersion:r.version,timestamp:e.timestamp};n.push(s);const o=this.config.onConflict(s);await this._resolveConflict(e,r,o),t.push(e.key),this.pendingQueue.delete(e.key)}else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key);else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key)}catch(t){r.push(`Failed to sync "${e.key}": ${t}`)}const o={success:0===r.length,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e};return this.config.onSync(o),o}catch(s){const o=`Sync failed: ${s}`;return r.push(o),{success:!1,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e}}finally{this._isSyncing=!1,this._notifyStateChange()}}async _fetchRemoteVersions(e){try{const t=this._getAuthToken(),n=await this.config.fetch(`${this.config.endpoint}/versions`,{method:"POST",headers:{"Content-Type":"application/json",...t&&{Authorization:`Bearer ${t}`}},body:JSON.stringify({keys:e})});if(n.ok){const e=await n.json();if(e.versions)for(const[t,n]of Object.entries(e.versions))this.remoteVersions.set(t,n)}}catch(e){}}async _pushChange(e){let t=0;for(;t<this.config.maxRetries;)try{const n=this._getAuthToken(),r=await this.config.fetch(`${this.config.endpoint}/sync`,{method:"POST",headers:{"Content-Type":"application/json",...n&&{Authorization:`Bearer ${n}`}},body:JSON.stringify({key:e.key,value:e.value,version:e.version,timestamp:e.timestamp})});if(r.ok){const t=await r.json();return void(t.version&&this.remoteVersions.set(e.key,{version:t.version,timestamp:t.timestamp||Date.now(),value:e.value}))}t++}catch(e){if(t++,t>=this.config.maxRetries)throw e}}async _resolveConflict(e,t,n){switch(n.action){case"accept-local":await this._pushChange({...e,version:t.version+1,timestamp:Date.now()});break;case"accept-remote":this.store.set(e.key,t.value);break;case"merge":this.store.set(e.key,n.value),await this._pushChange({key:e.key,value:n.value,version:Math.max(e.version,t.version)+1,timestamp:Date.now()})}}getState(){return{isOnline:this._isOnline,isSyncing:this._isSyncing,lastSyncTimestamp:null,pendingChanges:this.pendingQueue.size,conflicts:0}}onOnlineChange(e){return this.onlineStatusListeners.add(e),()=>this.onlineStatusListeners.delete(e)}onStateChange(e){return this.syncStateListeners.add(e),()=>this.syncStateListeners.delete(e)}async flush(){return this.sync()}destroy(){this.syncTimer&&clearTimeout(this.syncTimer),this.pendingQueue.clear(),this.onlineStatusListeners.clear(),this.syncStateListeners.clear()}},Ae=()=>{try{0;const e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};return void 0!==e.__DEV__&&!1===e.__DEV__}catch{return!1}},De=()=>"undefined"!=typeof window?window.localStorage:null,Me=e=>{const t=new Map,n=new Map,r=new Map,s=new Set,o=new Map,a=new Set,i=new Map,c=new Map,l=new Map,u=new Map,d=new Map,p=new Map,f=new Map,y=new Map,h=e?.namespace||"gstate",g=e?.silent??!1,m=e?.debounceTime??150,_=e?.version??0,S=e?.storage||De(),w=e?.onError,b=e?.maxObjectSize??0,v=e?.maxTotalSize??0,k=e?.encryptionKey??null,E=e?.validateInput??!0,C=e?.auditEnabled??!0,O=e?.userId,x=e?.immer??!0,A=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(e=>Se(f,e.pattern,e.permissions));let D,M=!1,P=!1,R=!1,T=0,I=null,z=null;const V=new Promise(e=>{D=e}),$=()=>({store:t,versions:n,sizes:r,totalSize:T,storage:S,config:e||{},diskQueue:d,encryptionKey:k,audit:K,onError:w,silent:g,debounceTime:m,currentVersion:_}),U=()=>({plugins:u,onError:w,silent:g}),N=e=>{if(null==e)return 0;const t=typeof e;if("boolean"===t)return 4;if("number"===t)return 8;if("string"===t)return 2*e.length;if("object"!==t)return 0;let n=0;const r=[e],s=new WeakSet;for(;r.length>0;){const e=r.pop();if("boolean"==typeof e)n+=4;else if("number"==typeof e)n+=8;else if("string"==typeof e)n+=2*e.length;else if("object"==typeof e&&null!==e){const t=e;if(s.has(t))continue;if(s.add(t),Array.isArray(t))for(let e=0;e<t.length;e++)r.push(t[e]);else for(const e of Object.keys(t))n+=2*e.length,r.push(t[e])}}return n},L=(e,t)=>{((e,t,n)=>{if(0!==e.plugins.size)for(const r of e.plugins.values()){const s=r.hooks?.[t];if(s)try{s(n)}catch(s){const o=s instanceof Error?s:new Error(String(s));e.onError?e.onError(o,{operation:`plugin:${r.name}:${t}`,key:n.key}):e.silent}}})(U(),e,t)},K=(e,t,n,r)=>{C&&null!==me&&_e&&_e({timestamp:Date.now(),action:e,key:t,userId:O,success:n,error:r})},F=e=>{const t=c.get(e);if(!t)return;const r=new Set,s=t.selector(e=>(r.add(e),c.has(e)?c.get(e).lastValue:Q.get(e)));t.deps.forEach(t=>{if(!r.has(t)){const n=l.get(t);n&&(n.delete(e),0===n.size&&l.delete(t))}}),r.forEach(n=>{t.deps.has(n)||(l.has(n)||l.set(n,new Set),l.get(n).add(e))}),t.deps=r,Ce(t.lastValue,s)||(t.lastValue=x&&null!==s&&"object"==typeof s?j(Ee(s),!0):s,n.set(e,(n.get(e)||0)+1),B(e))},B=e=>{if(e){if(l.has(e)){const t=l.get(e);for(const e of t)F(e)}const t=i.get(e);if(t){const n=Q.get(e);for(const r of t)try{r(n)}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"watcher",key:e})}}const n=o.get(e);if(n)for(const t of n)try{t()}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"keyListener",key:e})}}if(M)P=!0;else for(const e of s)try{e()}catch(e){const t=e instanceof Error?e:new Error(String(e));w&&w(t,{operation:"listener"})}},J=async()=>{(async e=>{if(!e.storage)return;const{store:t,config:n,diskQueue:r,storage:s,encryptionKey:o,audit:a,onError:i,silent:c,currentVersion:l}=e,u=Oe(n.namespace||"gstate");try{const e={};let r;t.forEach((t,n)=>{e[n]=t});const o=n?.encoded;r=o?btoa(JSON.stringify(e)):JSON.stringify(e),s.setItem(u.replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:r,_sys_v:l,_b64:!!o||void 0})),a("set","FULL_STATE",!0)}catch(e){const t=e instanceof Error?e:new Error(String(e));i&&i(t,{operation:"persist",key:"FULL_STATE"})}const d=Array.from(r.entries());r.clear();for(const[t,n]of d)try{if(!t||!/^[a-zA-Z0-9_.-]+$/.test(t)||t.length>256)continue;let r=n.value;const i=n.options.encoded||n.options.encrypted||n.options.secure;if(n.options.encrypted){if(!o)throw new Error(`Encryption key missing for "${t}"`);r=await he(n.value,o)}else i?r=btoa(JSON.stringify(n.value)):"object"==typeof n.value&&null!==n.value&&(r=JSON.stringify(n.value));s.setItem(`${u}${t}`,JSON.stringify({v:e.versions.get(t)||1,t:Date.now(),e:n.options.ttl?Date.now()+n.options.ttl:null,d:r,_sys_v:l,_enc:!!n.options.encrypted||void 0,_b64:!(!n.options.encoded&&!n.options.secure)||void 0})),a("set",t,!0)}catch(e){const n=e instanceof Error?e:new Error(String(e));i&&i(n,{operation:"persist",key:t})}})($())},W={},Q={_setSilently:(e,s)=>{const o=r.get(e)||0,a=x&&null!==s&&"object"==typeof s?j(Ee(s),!0):s,i=(b>0||v>0)&&!Ae()?N(a):0;T=T-o+i,r.set(e,i),t.set(e,a),n.set(e,(n.get(e)||0)+1),z=null},_registerMethod:(e,t,n)=>{const r=e=>"__proto__"===e||"constructor"===e||"prototype"===e;r(e)||r(t)||(W[e]||(W[e]={}),W[e][t]=n)},set:(s,o,a={})=>{const i=t.get(s),c=x&&"function"==typeof o?de(i,o):o;if(E&&!ve(s))return!1;if(!we(f,s,"write",O))return K("set",s,!1,"RBAC Denied"),!1;const l=E?be(c):c,u=r.get(s)||0;L("onBeforeSet",{key:s,value:l,store:Q,version:n.get(s)||0});const p=x&&null!==l&&"object"==typeof l?j(Ee(l),!0):l;if(!Ce(i,p)){const o=(b>0||v>0)&&!Ae()?N(p):0;if(b>0&&o>b){const e=new Error(`Object size (${o} bytes) exceeds maxObjectSize (${b} bytes)`);w&&w(e,{operation:"set",key:s})}if(v>0){const e=T-u+o;if(e>v){const t=new Error(`Total store size (${e} bytes) exceeds limit (${v} bytes)`);w&&w(t,{operation:"set"})}}T=T-u+o,r.set(s,o),t.set(s,p),n.set(s,(n.get(s)||0)+1),z=null;const i=a.persist??A;return i&&(d.set(s,{value:p,options:{...a,persist:i,encoded:a.encoded||e?.encoded}}),I&&clearTimeout(I),I=setTimeout(J,m)),L("onSet",{key:s,value:p,store:Q,version:n.get(s)}),K("set",s,!0),B(s),!0}return!1},get:e=>{if(!we(f,e,"read",O))return K("get",e,!1,"RBAC Denied"),null;const n=t.get(e);return L("onGet",{store:Q,key:e,value:n}),K("get",e,!0),n},compute:(e,t)=>{try{return c.has(e)||(c.set(e,{selector:t,lastValue:null,deps:new Set}),F(e)),c.get(e).lastValue}catch(t){const n=t instanceof Error?t:new Error(String(t));return w&&w(n,{operation:"compute",key:e}),null}},watch:(e,t)=>{i.has(e)||i.set(e,new Set);const n=i.get(e);return n.add(t),()=>{n.delete(t),0===n.size&&i.delete(e)}},remove:e=>{if(!we(f,e,"delete",O))return K("delete",e,!1,"RBAC Denied"),!1;const s=t.get(e),o=t.delete(e);return o&&(T-=r.get(e)||0,r.delete(e),L("onRemove",{store:Q,key:e,value:s}),z=null),n.set(e,(n.get(e)||0)+1),S&&S.removeItem(`${h}_${e}`),K("delete",e,!0),B(e),o},delete:e=>Q.remove(e),deleteAll:()=>{if(Array.from(t.keys()).forEach(e=>Q.remove(e)),S){const e=h+"_";for(let t=0;t<(S.length||0);t++){const n=S.key(t);n?.startsWith(e)&&(S.removeItem(n),t--)}}return T=0,r.clear(),z=null,!0},list:()=>Object.fromEntries(t.entries()),use:e=>{a.add(e)},transaction:e=>{M=!0,L("onTransaction",{store:Q,key:"START"});try{e()}finally{M=!1,L("onTransaction",{store:Q,key:"END"}),P&&(P=!1,B())}},destroy:()=>{I&&(clearTimeout(I),I=null),d.clear(),"undefined"!=typeof window&&window.removeEventListener("beforeunload",G),L("onDestroy",{store:Q}),s.clear(),o.clear(),i.clear(),c.clear(),l.clear(),u.clear(),t.clear(),r.clear(),T=0,f.clear(),y.clear(),n.clear(),p.clear(),a.clear()},_addPlugin:e=>{((e,t,n)=>{try{e.plugins.set(t.name,t),t.hooks?.onInstall?.({store:n})}catch(n){const r=n instanceof Error?n:new Error(String(n));e.onError?e.onError(r,{operation:"plugin:install",key:t.name}):e.silent}})(U(),e,Q)},_removePlugin:e=>{u.delete(e)},_subscribe:(e,t)=>{if(t){o.has(t)||o.set(t,new Set);const n=o.get(t);return n.add(e),()=>{n.delete(e),0===n.size&&o.delete(t)}}return s.add(e),()=>s.delete(e)},_getVersion:e=>n.get(e)??0,addAccessRule:(e,t)=>Se(f,e,t),hasPermission:(e,t,n)=>we(f,e,t,n),recordConsent:(e,t,n)=>ke(y,e,t,n),hasConsent:(e,t)=>((e,t,n)=>{const r=e.get(t);if(!r)return!1;for(let e=r.length-1;e>=0;e--){const t=r[e];if(t&&t.purpose===n)return t.granted}return!1})(y,e,t),getConsents:e=>((e,t)=>e.get(t)||[])(y,e),revokeConsent:(e,t)=>((e,t,n)=>ke(e,t,n,!1))(y,e,t),exportUserData:e=>((e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}))(y,e),deleteUserData:e=>((e,t)=>{const n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}})(y,e),getSnapshot:()=>(z||(z=Object.fromEntries(t.entries())),z),get plugins(){return W},get isReady(){return R},get namespace(){return h},get userId(){return O},whenReady:()=>V};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(e=>{const t=Q[e];t&&Q._registerMethod("security",e,t)});const G=()=>{d.size>0&&J()};"undefined"!=typeof window&&window.addEventListener("beforeunload",G),S?(async(e,t,n)=>{const{storage:r,config:s,encryptionKey:o,audit:a,onError:i,silent:c,currentVersion:l,store:u,sizes:d,versions:p}=e,f=Oe(s.namespace||"gstate"),y=s.immer??!0;if(r)try{const c={};let h=0;for(let e=0;e<(r.length||0);e++){const t=r.key(e);if(!t||!t.startsWith(f))continue;const n=r.getItem(t);if(n)try{const s=JSON.parse(n),i=t.substring(f.length);if(h=Math.max(h,void 0!==s._sys_v?s._sys_v:s.v||0),s.e&&Date.now()>s.e){r.removeItem(t),e--;continue}let l=s.d;if(s._enc&&o)l=await ge(l,o);else if("string"==typeof l)if(s._b64)try{l=JSON.parse(atob(l))}catch(e){}else if(l.startsWith("{")||l.startsWith("["))try{l=JSON.parse(l)}catch(e){}c[i]=l,a("hydrate",i,!0)}catch(e){a("hydrate",t,!1,String(e));const n=e instanceof Error?e:new Error(String(e));i&&i(n,{operation:"hydration",key:t})}}const g=h<l&&s.migrate?s.migrate(c,h):c;Object.entries(g).forEach(([n,r])=>{const s=y&&null!==r&&"object"==typeof r?j(Ee(r),!0):r,o=t(s),a=d.get(n)||0;e.totalSize=e.totalSize-a+o,d.set(n,o),u.set(n,s),p.set(n,1)}),n()}catch(e){const t=e instanceof Error?e:new Error(String(e));i&&i(t,{operation:"hydration"})}})($(),e=>(b>0||v>0)&&!Ae()?N(e):0,()=>{R=!0,z=null,D(),B()}).then(()=>{}):(R=!0,D());let q=null;return e?.sync&&(q=new xe(Q,e.sync),Q._registerMethod("sync","flush",()=>q?.flush()),Q._registerMethod("sync","getState",()=>q?.getState()),Q._registerMethod("sync","onStateChange",e=>q?.onStateChange(e))),Q},Pe=null,Re=()=>Pe;function je(t,n){const r=e.useMemo(()=>n||Pe,[n]),s=e.useMemo(()=>{const e=()=>{},t=()=>!1,n=()=>null;return{set:t,get:n,remove:t,delete:t,deleteAll:t,list:()=>({}),compute:n,watch:()=>()=>{},use:e,transaction:e,destroy:e,_subscribe:()=>()=>{},_setSilently:e,_registerMethod:e,_addPlugin:e,_removePlugin:e,_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return{}},getSnapshot:()=>({}),get namespace(){return"ghost"},get userId(){}}},[]),o=r||s,a="function"==typeof t,i=a?null:t,c=a?t:null,l=e.useCallback(e=>a?o._subscribe(e):o._subscribe(e,i),[o,a,i]),u=e.useCallback(()=>a?c(o.getSnapshot()):o.get(i)??void 0,[o,a,i,c]),d=e.useCallback(()=>{if(a)try{return c({})}catch{return}},[c,a]),p=e.useSyncExternalStore(l,u,d),f=e.useCallback((e,t)=>a?(Ae(),!1):o.set(i,e,t),[o,a,i]);return e.useDebugValue(p,e=>a?`Selector: ${JSON.stringify(e)}`:`${i}: ${JSON.stringify(e)}`),a?p:[p,f]}var Te=new Map;exports.SyncEngine=xe,exports.addAccessRule=(e,t)=>Re()?.addAccessRule(e,t),exports.analyticsPlugin=e=>({name:"gstate-analytics",hooks:{onSet:({key:t,value:n})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:n,action:"SET"}))},onRemove:({key:t})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:null,action:"REMOVE"}))}}}),exports.clearAccessRules=()=>{},exports.clearAllConsents=()=>{},exports.cloudSyncPlugin=e=>{const{adapter:t,autoSyncInterval:n}=e,r=new Map,s={lastSyncTimestamp:null,totalKeysSynced:0,totalBytesSynced:0,syncCount:0,lastDuration:0,errors:0};let o=null;return{name:"cloudSync",hooks:{onInstall:({store:a})=>{a._registerMethod("cloudSync","sync",async()=>{const n=performance.now(),o={};let i=0;try{const c=a.list(),l=Object.keys(c);for(const e of l){const t=a._getVersion?.(e)||0;if(t>(r.get(e)||0)){const n=c[e];o[e]=n,i+=JSON.stringify(n).length,r.set(e,t)}}if(0===Object.keys(o).length)return{status:"no-change",stats:s};if(await t.save(o))return s.lastSyncTimestamp=Date.now(),s.totalKeysSynced+=Object.keys(o).length,s.totalBytesSynced+=i,s.syncCount++,s.lastDuration=performance.now()-n,e.onSync&&e.onSync(s),{status:"success",stats:s};throw new Error(`Adapter ${t.name} failed to save.`)}catch(e){return s.errors++,{status:"error",error:String(e),stats:s}}}),a._registerMethod("cloudSync","getStats",()=>s),n&&n>0&&(o=setInterval(()=>{const e=a.plugins.cloudSync;e&&e.sync()},n))},onDestroy:()=>{o&&clearInterval(o)}}}},exports.createAsyncStore=(e,t)=>{const n=t?.key||"async_data",r=t?.store||Me({namespace:`async_${n}`,silent:!0});null==r.get(n)&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null});return Object.assign(r,{execute:async()=>{const s=r.get(n);r.set(n,{...s||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{const s=await e(),o=r.get(n);r.set(n,{...o||{data:null,loading:!1,error:null,updatedAt:null},data:s,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(e){const t=r.get(n);r.set(n,{...t||{data:null,loading:!1,error:null,updatedAt:null},error:e instanceof Error?e:new Error(String(e)),loading:!1})}}})},exports.createFirestoreAdapter=(e,t)=>({name:"Firebase-Firestore",save:async e=>{try{Ae();return(()=>{})("[Mock] Firestore Syncing:",e),!0}catch(e){return!1}}}),exports.createMongoAdapter=(e,t)=>({name:"MongoDB-Atlas",save:async n=>(await fetch(`${e}/action/updateOne`,{method:"POST",headers:{"Content-Type":"application/json","api-key":t},body:JSON.stringify({dataSource:"Cluster0",database:"rgs_cloud",collection:"user_states",filter:{id:"global_state"},update:{$set:{data:n,updatedAt:Date.now()}},upsert:!0})})).ok}),exports.createSqlRestAdapter=(e,t)=>({name:"SQL-REST-API",save:async n=>{const r=t();if(!r)return!1;return(await fetch(e,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(n),credentials:"same-origin"})).ok}}),exports.createStore=Me,exports.createSyncEngine=(e,t)=>new xe(e,t),exports.debugPlugin=()=>{if(Ae())return{name:"gstate-debug-noop",hooks:{}};Ae();return{name:"gstate-debug",hooks:{onInstall:({store:e})=>{"undefined"!=typeof window&&(window.gstate={list:()=>e.list(),get:t=>{const n=e.get(t);return n},set:(t,n)=>{const r=e.set(t,n);return JSON.stringify(n),r},watch:(t,n)=>e.watch(t,n),info:()=>{const t={namespace:e.namespace,isReady:e.isReady,keys:Object.keys(e.list()),size:Object.keys(e.list()).length};return t},banner:()=>{}})},onDestroy:()=>{"undefined"!=typeof window&&delete window.gstate}}}},exports.deleteUserData=e=>{const t=Re();if(!t)throw new Error("[gstate] deleteUserData failed: No store found.");return t.deleteUserData(e)},exports.deriveKeyFromPassword=async(e,t,n=6e5)=>{if(!ye)throw new Error("Web Crypto API not available");const r=await crypto.subtle.importKey("raw",(new TextEncoder).encode(e),"PBKDF2",!1,["deriveKey"]);return{key:await crypto.subtle.deriveKey({name:"PBKDF2",salt:new Uint8Array(t),iterations:n,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:crypto.getRandomValues(new Uint8Array(12))}},exports.destroyState=()=>{Pe&&(Pe.destroy(),Pe=null)},exports.destroySync=e=>{const t=Te.get(e);t&&(t.destroy(),Te.delete(e))},exports.devToolsPlugin=e=>{const t=globalThis.__REDUX_DEVTOOLS_EXTENSION__;if(!t?.connect)return{name:"gstate-devtools-noop",hooks:{}};let n=null;return{name:"gstate-devtools",hooks:{onInstall:({store:r})=>{n=t.connect({name:e?.name||"Magnetar Store"}),n.init(r.list())},onSet:({key:e,store:t})=>{e&&n&&n.send(`SET_${e.toUpperCase()}`,t.list())},onRemove:({key:e,store:t})=>{e&&n&&n.send(`REMOVE_${e.toUpperCase()}`,t.list())}}}},exports.exportKey=async e=>{const t=await crypto.subtle.exportKey("raw",e.key);return{key:btoa(String.fromCharCode(...new Uint8Array(t))),iv:btoa(String.fromCharCode(...e.iv))}},exports.exportUserData=e=>{const t=Re();if(!t)throw new Error("[gstate] exportUserData failed: No store found.");return t.exportUserData(e)},exports.generateEncryptionKey=async()=>{if(!ye)throw new Error("Web Crypto API not available");return{key:await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:crypto.getRandomValues(new Uint8Array(12))}},exports.generateSalt=(e=32)=>crypto.getRandomValues(new Uint8Array(e)),exports.getConsents=e=>Re()?.getConsents(e)??[],exports.getStore=Re,exports.gstate=(e,t)=>{const n=Me("string"==typeof t?{namespace:t}:t);e&&Object.entries(e).forEach(([e,t])=>{null===n.get(e)&&n._setSilently(e,t)});return"undefined"==typeof window||Ae()||(window.gstate=n,window.gState=n,window.rgs=n),Object.assign(e=>je(e,n),n)},exports.guardPlugin=e=>({name:"gstate-guard",hooks:{onBeforeSet:({key:t,value:n,store:r})=>{if(!t)return;const s=e[t];s&&s(n)}}}),exports.hasConsent=(e,t)=>Re()?.hasConsent(e,t)??!1,exports.hasPermission=(e,t,n)=>Re()?.hasPermission(e,t,n)??!0,exports.immerPlugin=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",(t,n)=>e.set(t,n))}}}),exports.importKey=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=Uint8Array.from(atob(t),e=>e.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},exports.indexedDBPlugin=(e={})=>{const t=e.dbName||"rgs-db",n=e.storeName||"states",r=e.version||1;let s=null;const o=()=>new Promise((e,o)=>{if(s)return e(s);const a=indexedDB.open(t,r);a.onerror=()=>o(a.error),a.onsuccess=()=>{s=a.result,e(s)},a.onupgradeneeded=e=>{const t=e.target.result;t.objectStoreNames.contains(n)||t.createObjectStore(n)}}),a=async e=>{const t=await o();return new Promise((r,s)=>{const o=t.transaction(n,"readonly").objectStore(n).get(e);o.onsuccess=()=>r(o.result),o.onerror=()=>s(o.error)})};return{name:"indexedDB",hooks:{onInstall:({store:e})=>{e._registerMethod("indexedDB","clear",async()=>{(await o()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:e})=>{const t=(await o()).transaction(n,"readonly").objectStore(n).getAllKeys();t.onsuccess=async()=>{const n=t.result,r=e.namespace+"_";for(const t of n)if(t.startsWith(r)){const n=await a(t);if(n){const s=t.substring(r.length);e._setSilently(s,n.d)}}}},onSet:async({key:e,value:t,store:r})=>{if(!e)return;const s=r.namespace+"_",a={d:t,t:Date.now(),v:r._getVersion?.(e)||1};await(async(e,t)=>{const r=await o();return new Promise((s,o)=>{const a=r.transaction(n,"readwrite").objectStore(n).put(t,e);a.onsuccess=()=>s(),a.onerror=()=>o(a.error)})})(`${s}${e}`,a)},onRemove:async({key:e,store:t})=>{if(!e)return;const r=t.namespace+"_";await(async e=>{const t=await o();return new Promise((r,s)=>{const o=t.transaction(n,"readwrite").objectStore(n).delete(e);o.onsuccess=()=>r(),o.onerror=()=>s(o.error)})})(`${r}${e}`)}}}},exports.initState=e=>{const t=Me(e);return Pe=t,t},exports.initSync=(e,t)=>{const n=e.namespace;if(Te.has(n))return Te.get(n);const r=new xe(e,t);return Te.set(n,r),r},exports.isCryptoAvailable=ye,exports.logAudit=_e,exports.loggerPlugin=e=>({name:"gstate-logger",hooks:{onSet:({key:e,value:t,version:n})=>{(new Date).toLocaleTimeString()},onRemove:({key:e})=>{},onTransaction:({key:e})=>{}}}),exports.recordConsent=(e,t,n)=>{const r=Re();if(!r)throw new Error("[gstate] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},exports.revokeConsent=(e,t)=>Re()?.revokeConsent(e,t),exports.sanitizeValue=be,exports.schemaPlugin=e=>({name:"gstate-schema",hooks:{onSet:({key:t,value:n})=>{if(!t)return;const r=e[t];if(r){const e=r(n);if(!0!==e)throw new Error(`[Schema Error] Validation failed for key "${t}": ${!1===e?"Invalid type":e}`)}}}}),exports.setAuditLogger=e=>{me=e},exports.snapshotPlugin=()=>{const e=new Map;return{name:"gstate-snapshot",hooks:{onInstall:({store:t})=>{t._registerMethod("snapshot","takeSnapshot",n=>{e.set(n,t.list())}),t._registerMethod("snapshot","restoreSnapshot",n=>{const r=e.get(n);return!!r&&(t.transaction(()=>{Object.entries(r).forEach(([e,n])=>{t.set(e,n)})}),!0)}),t._registerMethod("snapshot","listSnapshots",()=>Array.from(e.keys())),t._registerMethod("snapshot","deleteSnapshot",t=>e.delete(t)),t._registerMethod("snapshot","clearSnapshots",()=>e.clear())}}}},exports.syncPlugin=e=>{const t=new BroadcastChannel(e?.channelName||"gstate_sync");let n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:e})=>{t.onmessage=t=>{const{key:r,value:s,action:o}=t.data;r&&(n=!0,"REMOVE"===o?e.remove(r):e.set(r,s),n=!1)}},onSet:({key:e,value:r})=>{e&&!n&&t.postMessage({key:e,value:r,action:"SET"})},onRemove:({key:e})=>{e&&!n&&t.postMessage({key:e,action:"REMOVE"})},onDestroy:()=>{t.close()}}}},exports.triggerSync=async e=>{const t=e||Pe?.namespace;if(!t)return;const n=Te.get(t);n&&await n.flush()},exports.undoRedoPlugin=e=>{let t=[],n=-1,r=!1;const s=e?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:e})=>{t.push(e.list()),n=0,e._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;const s=t[n];return!!s&&(Object.entries(s).forEach(([t,n])=>{e._setSilently(t,n)}),r=!1,!0)}return!1}),e._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;const s=t[n];return!!s&&(Object.entries(s).forEach(([t,n])=>{e._setSilently(t,n)}),r=!1,!0)}return!1}),e._registerMethod("undoRedo","canUndo",()=>n>0),e._registerMethod("undoRedo","canRedo",()=>n<t.length-1)},onSet:({store:e})=>{r||(n<t.length-1&&(t=t.slice(0,n+1)),t.push(e.list()),t.length>s?t.shift():n++)}}}},exports.useGState=je,exports.useIsStoreReady=t=>{const n=t||Pe,r=e.useMemo(()=>e=>n?n._subscribe(e):()=>{},[n]);return e.useSyncExternalStore(r,()=>!!n&&n.isReady,()=>!0)},exports.useSimpleState=je,exports.useStore=je,exports.useSyncStatus=()=>{const[t,n]=e.useState({isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});return e.useEffect(()=>{const e=()=>{let e=!0,t=!1,r=0,s=0;Te.forEach(n=>{const o=n.getState();e=e&&o.isOnline,t=t||o.isSyncing,r+=o.pendingChanges,s+=o.conflicts}),n({isOnline:e,isSyncing:t,lastSyncTimestamp:null,pendingChanges:r,conflicts:s})};e();const t=Array.from(Te.values()).map(t=>t.onStateChange(e));return()=>t.forEach(e=>e())},[]),t},exports.useSyncedState=function(t,n){const r=n||Pe,s=r?.namespace||"default",o=Te.get(s),a=je(t,r),i=a[0],c=a[1],[l,u]=e.useState(()=>o?.getState()||{isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});return e.useEffect(()=>{if(!o)return;return o.onStateChange(u)},[o]),[i,e.useCallback((e,n)=>{const s=c(e,n);if(s&&o){const e=r?.get(t);o.queueChange(t,e)}return s},[c,o,t,r]),l]},exports.validateKey=ve;
|
|
1
|
+
var e=require("react"),t=Symbol.for("immer-nothing"),n=Symbol.for("immer-draftable"),r=Symbol.for("immer-state"),s=[function(e){return`The plugin for '${e}' has not been loaded into Immer. To enable the plugin, import and call \`enable${e}()\` when initializing your application.`},function(e){return`produce can only be called on things that are draftable: plain objects, arrays, Map, Set or classes that are marked with '[immerable]: true'. Got '${e}'`},"This object has been frozen and should not be mutated",function(e){return"Cannot use a proxy that has been revoked. Did you pass an object from inside an immer function to an async process? "+e},"An immer producer returned a new value *and* modified its draft. Either return a new value *or* modify the draft.","Immer forbids circular references","The first or second argument to `produce` must be a function","The third argument to `produce` must be a function or undefined","First argument to `createDraft` must be a plain object, an array, or an immerable object","First argument to `finishDraft` must be a draft returned by `createDraft`",function(e){return`'current' expects a draft, got: ${e}`},"Object.defineProperty() cannot be used on an Immer draft","Object.setPrototypeOf() cannot be used on an Immer draft","Immer only supports deleting array indices","Immer only supports setting array indices and the 'length' property",function(e){return`'original' expects a draft, got: ${e}`}];function o(e,...t){{const n=s[e],r=A(n)?n.apply(null,t):n;throw new Error(`[Immer] ${r}`)}}var a=Object,i=a.getPrototypeOf,c="constructor",l="prototype",u="configurable",d="enumerable",p="writable",f="value",y=e=>!!e&&!!e[r];function h(e){return!!e&&(_(e)||E(e)||!!e[n]||!!e[c]?.[n]||C(e)||O(e))}var g=a[l][c].toString(),m=new WeakMap;function _(e){if(!e||!x(e))return!1;const t=i(e);if(null===t||t===a[l])return!0;const n=a.hasOwnProperty.call(t,c)&&t[c];if(n===Object)return!0;if(!A(n))return!1;let r=m.get(n);return void 0===r&&(r=Function.toString.call(n),m.set(n,r)),r===g}function S(e,t,n=!0){if(0===w(e)){(n?Reflect.ownKeys(e):a.keys(e)).forEach(n=>{t(n,e[n],e)})}else e.forEach((n,r)=>t(r,n,e))}function w(e){const t=e[r];return t?t.type_:E(e)?1:C(e)?2:O(e)?3:0}var b=(e,t,n=w(e))=>2===n?e.has(t):a[l].hasOwnProperty.call(e,t),v=(e,t,n=w(e))=>2===n?e.get(t):e[t],k=(e,t,n,r=w(e))=>{2===r?e.set(t,n):3===r?e.add(n):e[t]=n};var E=Array.isArray,C=e=>e instanceof Map,O=e=>e instanceof Set,x=e=>"object"==typeof e,A=e=>"function"==typeof e,D=e=>"boolean"==typeof e;var M=e=>e.copy_||e.base_,P=e=>e.modified_?e.copy_:e.base_;function R(e,t){if(C(e))return new Map(e);if(O(e))return new Set(e);if(E(e))return Array[l].slice.call(e);const n=_(e);if(!0===t||"class_only"===t&&!n){const t=a.getOwnPropertyDescriptors(e);delete t[r];let n=Reflect.ownKeys(t);for(let r=0;r<n.length;r++){const s=n[r],o=t[s];!1===o[p]&&(o[p]=!0,o[u]=!0),(o.get||o.set)&&(t[s]={[u]:!0,[p]:!0,[d]:o[d],[f]:e[s]})}return a.create(i(e),t)}{const t=i(e);if(null!==t&&n)return{...e};const r=a.create(t);return a.assign(r,e)}}function j(e,t=!1){return I(e)||y(e)||!h(e)||(w(e)>1&&a.defineProperties(e,{set:T,add:T,clear:T,delete:T}),a.freeze(e),t&&S(e,(e,t)=>{j(t,!0)},!1)),e}var T={[f]:function(){o(2)}};function I(e){return null===e||!x(e)||a.isFrozen(e)}var z="MapSet",V="Patches",$="ArrayMethods",U={};function N(e){const t=U[e];return t||o(0,e),t}var L,K=e=>!!U[e],F=()=>L;function B(e,t){t&&(e.patchPlugin_=N(V),e.patches_=[],e.inversePatches_=[],e.patchListener_=t)}function J(e){W(e),e.drafts_.forEach(G),e.drafts_=null}function W(e){e===L&&(L=e.parent_)}var Q=e=>L={drafts_:[],parent_:L,immer_:e,canAutoFreeze_:!0,unfinalizedDrafts_:0,handledSet_:new Set,processedForPatches_:new Set,mapSetPlugin_:K(z)?N(z):void 0,arrayMethodsPlugin_:K($)?N($):void 0};function G(e){const t=e[r];0===t.type_||1===t.type_?t.revoke_():t.revoked_=!0}function q(e,n){n.unfinalizedDrafts_=n.drafts_.length;const s=n.drafts_[0];if(void 0!==e&&e!==s){s[r].modified_&&(J(n),o(4)),h(e)&&(e=X(n,e));const{patchPlugin_:t}=n;t&&t.generateReplacementPatches_(s[r].base_,e,n)}else e=X(n,s);return function(e,t,n=!1){!e.parent_&&e.immer_.autoFreeze_&&e.canAutoFreeze_&&j(t,n)}(n,e,!0),J(n),n.patches_&&n.patchListener_(n.patches_,n.inversePatches_),e!==t?e:void 0}function X(e,t){if(I(t))return t;const n=t[r];if(!n){return ne(t,e.handledSet_,e)}if(!H(n,e))return t;if(!n.modified_)return n.base_;if(!n.finalized_){const{callbacks_:t}=n;if(t)for(;t.length>0;){t.pop()(e)}te(n,e)}return n.copy_}function Z(e){e.finalized_=!0,e.scope_.unfinalizedDrafts_--}var H=(e,t)=>e.scope_===t,Y=[];function ee(e,t,n,r){const s=M(e),o=e.type_;if(void 0!==r){if(v(s,r,o)===t)return void k(s,r,n,o)}if(!e.draftLocations_){const t=e.draftLocations_=new Map;S(s,(e,n)=>{if(y(n)){const r=t.get(n)||[];r.push(e),t.set(n,r)}})}const a=e.draftLocations_.get(t)??Y;for(const e of a)k(s,e,n,o)}function te(e,t){if(e.modified_&&!e.finalized_&&(3===e.type_||1===e.type_&&e.allIndicesReassigned_||(e.assigned_?.size??0)>0)){const{patchPlugin_:n}=t;if(n){const r=n.getPath(e);r&&n.generatePatches_(e,r,t)}Z(e)}}function ne(e,t,n){return!n.immer_.autoFreeze_&&n.unfinalizedDrafts_<1||y(e)||t.has(e)||!h(e)||I(e)||(t.add(e),S(e,(s,o)=>{if(y(o)){const t=o[r];if(H(t,n)){const n=P(t);k(e,s,n,e.type_),Z(t)}}else h(o)&&ne(o,t,n)})),e}var re={get(e,t){if(t===r)return e;let n=e.scope_.arrayMethodsPlugin_;const s=1===e.type_&&"string"==typeof t;if(s&&n?.isArrayOperationMethod(t))return n.createMethodInterceptor(e,t);const o=M(e);if(!b(o,t,e.type_))return function(e,t,n){const r=ae(t,n);return r?f in r?r[f]:r.get?.call(e.draft_):void 0}(e,o,t);const a=o[t];if(e.finalized_||!h(a))return a;if(s&&e.operationMethod&&n?.isMutatingArrayMethod(e.operationMethod)&&function(e){const t=+e;return Number.isInteger(t)&&String(t)===e}(t))return a;if(a===oe(e.base_,t)){ce(e);const n=1===e.type_?+t:t,r=le(e.scope_,a,e,n);return e.copy_[n]=r}return a},has:(e,t)=>t in M(e),ownKeys:e=>Reflect.ownKeys(M(e)),set(e,t,n){const s=ae(M(e),t);if(s?.set)return s.set.call(e.draft_,n),!0;if(!e.modified_){const s=oe(M(e),t),i=s?.[r];if(i&&i.base_===n)return e.copy_[t]=n,e.assigned_.set(t,!1),!0;if(((o=n)===(a=s)?0!==o||1/o==1/a:o!=o&&a!=a)&&(void 0!==n||b(e.base_,t,e.type_)))return!0;ce(e),ie(e)}var o,a;return e.copy_[t]===n&&(void 0!==n||t in e.copy_)||Number.isNaN(n)&&Number.isNaN(e.copy_[t])||(e.copy_[t]=n,e.assigned_.set(t,!0),function(e,t,n){const{scope_:s}=e;if(y(n)){const o=n[r];H(o,s)&&o.callbacks_.push(function(){ce(e);const r=P(o);ee(e,n,r,t)})}else h(n)&&e.callbacks_.push(function(){const r=M(e);3===e.type_?r.has(n)&&ne(n,s.handledSet_,s):v(r,t,e.type_)===n&&s.drafts_.length>1&&!0===(e.assigned_.get(t)??!1)&&e.copy_&&ne(v(e.copy_,t,e.type_),s.handledSet_,s)})}(e,t,n)),!0},deleteProperty:(e,t)=>(ce(e),void 0!==oe(e.base_,t)||t in e.base_?(e.assigned_.set(t,!1),ie(e)):e.assigned_.delete(t),e.copy_&&delete e.copy_[t],!0),getOwnPropertyDescriptor(e,t){const n=M(e),r=Reflect.getOwnPropertyDescriptor(n,t);return r?{[p]:!0,[u]:1!==e.type_||"length"!==t,[d]:r[d],[f]:n[t]}:r},defineProperty(){o(11)},getPrototypeOf:e=>i(e.base_),setPrototypeOf(){o(12)}},se={};for(let e in re){let t=re[e];se[e]=function(){const e=arguments;return e[0]=e[0][0],t.apply(this,e)}}function oe(e,t){const n=e[r];return(n?M(n):e)[t]}function ae(e,t){if(!(t in e))return;let n=i(e);for(;n;){const e=Object.getOwnPropertyDescriptor(n,t);if(e)return e;n=i(n)}}function ie(e){e.modified_||(e.modified_=!0,e.parent_&&ie(e.parent_))}function ce(e){e.copy_||(e.assigned_=new Map,e.copy_=R(e.base_,e.scope_.immer_.useStrictShallowCopy_))}se.deleteProperty=function(e,t){return isNaN(parseInt(t))&&o(13),se.set.call(this,e,t,void 0)},se.set=function(e,t,n){return"length"!==t&&isNaN(parseInt(t))&&o(14),re.set.call(this,e[0],t,n,e[0])};function le(e,t,n,r){const[s,o]=C(t)?N(z).proxyMap_(t,n):O(t)?N(z).proxySet_(t,n):function(e,t){const n=E(e),r={type_:n?1:0,scope_:t?t.scope_:F(),modified_:!1,finalized_:!1,assigned_:void 0,parent_:t,base_:e,draft_:null,copy_:null,revoke_:null,isManual_:!1,callbacks_:void 0};let s=r,o=re;n&&(s=[r],o=se);const{revoke:a,proxy:i}=Proxy.revocable(s,o);return r.draft_=i,r.revoke_=a,[i,r]}(t,n);return(n?.scope_??F()).drafts_.push(s),o.callbacks_=n?.callbacks_??[],o.key_=r,n&&void 0!==r?function(e,t,n){e.callbacks_.push(function(r){const s=t;if(!s||!H(s,r))return;r.mapSetPlugin_?.fixSetContents(s);const o=P(s);ee(e,s.draft_??s,o,n),te(s,r)})}(n,o,r):o.callbacks_.push(function(e){e.mapSetPlugin_?.fixSetContents(o);const{patchPlugin_:t}=e;o.modified_&&t&&t.generatePatches_(o,[],e)}),s}function ue(e){if(!h(e)||I(e))return e;const t=e[r];let n,s=!0;if(t){if(!t.modified_)return t.base_;t.finalized_=!0,n=R(e,t.scope_.immer_.useStrictShallowCopy_),s=t.scope_.immer_.shouldUseStrictIteration()}else n=R(e,!0);return S(n,(e,t)=>{k(n,e,ue(t))},s),t&&(t.finalized_=!1),n}var de=(new class{constructor(e){this.autoFreeze_=!0,this.useStrictShallowCopy_=!1,this.useStrictIteration_=!1,this.produce=(e,n,r)=>{if(A(e)&&!A(n)){const t=n;n=e;const r=this;return function(e=t,...s){return r.produce(e,e=>n.call(this,e,...s))}}let s;if(A(n)||o(6),void 0===r||A(r)||o(7),h(e)){const t=Q(this),o=le(t,e,void 0);let a=!0;try{s=n(o),a=!1}finally{a?J(t):W(t)}return B(t,r),q(s,t)}if(!e||!x(e)){if(s=n(e),void 0===s&&(s=e),s===t&&(s=void 0),this.autoFreeze_&&j(s,!0),r){const t=[],n=[];N(V).generateReplacementPatches_(e,s,{patches_:t,inversePatches_:n}),r(t,n)}return s}o(1,e)},this.produceWithPatches=(e,t)=>{if(A(e))return(t,...n)=>this.produceWithPatches(t,t=>e(t,...n));let n,r;return[this.produce(e,t,(e,t)=>{n=e,r=t}),n,r]},D(e?.autoFreeze)&&this.setAutoFreeze(e.autoFreeze),D(e?.useStrictShallowCopy)&&this.setUseStrictShallowCopy(e.useStrictShallowCopy),D(e?.useStrictIteration)&&this.setUseStrictIteration(e.useStrictIteration)}createDraft(e){h(e)||o(8),y(e)&&(e=function(e){y(e)||o(10,e);return ue(e)}(e));const t=Q(this),n=le(t,e,void 0);return n[r].isManual_=!0,W(t),n}finishDraft(e,t){const n=e&&e[r];n&&n.isManual_||o(9);const{scope_:s}=n;return B(s,t),q(void 0,s)}setAutoFreeze(e){this.autoFreeze_=e}setUseStrictShallowCopy(e){this.useStrictShallowCopy_=e}setUseStrictIteration(e){this.useStrictIteration_=e}shouldUseStrictIteration(){return this.useStrictIteration_}applyPatches(e,t){let n;for(n=t.length-1;n>=0;n--){const r=t[n];if(0===r.path.length&&"replace"===r.op){e=r.value;break}}n>-1&&(t=t.slice(n+1));const r=N(V).applyPatches_;return y(e)?r(e,t):this.produce(e,e=>r(e,t))}}).produce,pe=(e,t)=>{const n=Date.now();if(/\(\.*\+\?\)\+/.test(e)||/\(\.*\?\)\*/.test(e))return!1;if(e.length>500)return!1;try{const n=new RegExp(e).test(t);Date.now();return n}catch{return!1}},fe=()=>{if("undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID)try{return crypto.randomUUID()}catch{}throw new Error("Cryptographically secure random UUID generation is required but crypto.randomUUID is unavailable. Please use a browser or environment with Web Crypto API support.")},ye="undefined"!=typeof crypto&&void 0!==crypto.subtle&&"function"==typeof crypto.subtle.generateKey,he=async(e,t)=>{const n=(new TextEncoder).encode(JSON.stringify(e)),r=await crypto.subtle.encrypt({name:"AES-GCM",iv:t.iv},t.key,n),s=new Uint8Array(t.iv.length+r.byteLength);return s.set(t.iv),s.set(new Uint8Array(r),t.iv.length),btoa(String.fromCharCode(...s))},ge=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=n.slice(0,12),s=n.slice(12),o=await crypto.subtle.decrypt({name:"AES-GCM",iv:r},t.key,s);return JSON.parse((new TextDecoder).decode(o))},me=null,_e=e=>{me&&me(e)},Se=(e,t,n)=>{e.set(t instanceof RegExp?t.source:t,n)},we=(e,t,n,r)=>{if(0===e.size)return!0;for(const[s,o]of e){let e;if(e="function"==typeof s?s(t,r):pe(s,t),e)return o.includes(n)||o.includes("admin")}return!1},be=e=>{if("string"==typeof e){let t=e.replace(/&#[xX]?[0-9a-fA-F]+;?/g,e=>{const t=e.match(/&#x([0-9a-fA-F]+);?/i);if(t&&t[1])return String.fromCharCode(parseInt(t[1],16));const n=e.match(/&#([0-9]+);?/);return n&&n[1]?String.fromCharCode(parseInt(n[1],10)):e});try{t=decodeURIComponent(t)}catch{}return t.replace(/\b(javascript|vbscript|data:text\/html|about:blank|chrome:)/gi,"[SEC-REMOVED]").replace(/<script\b[^>]*>[\s\S]*?<\s*\/\s*script\b[^>]*>/gi,"[SEC-REMOVED]").replace(/on\w+\s*=/gi,"[SEC-REMOVED]=").replace(/<iframe\b[^<]*(?:(?!<\/iframe>)<[^<]*)*<\/iframe>/gi,"[SEC-REMOVED]").replace(/<object\b[^<]*(?:(?!<\/object>)<[^<]*)*<\/object>/gi,"[SEC-REMOVED]").replace(/<embed\b[^<]*(?:(?!<\/embed>)<[^<]*)*<\/embed>/gi,"[SEC-REMOVED]").replace(/<svg\b[^<]*(?:(?!<\/svg>)<[^<]*)*<\/svg>/gi,"[SEC-REMOVED]").replace(/<form\b[^<]*(?:(?!<\/form>)<[^<]*)*<\/form>/gi,"[SEC-REMOVED]").replace(/<base\b[^<]*(?:(?!<\/base>)<[^<]*)*<\/base>/gi,"[SEC-REMOVED]").replace(/<link\b[^<]*(?:(?!<\/link>)<[^<]*)*<\/link>/gi,"[SEC-REMOVED]").replace(/<meta\b[^<]*(?:(?!<\/meta>)<[^<]*)*<\/meta>/gi,"[SEC-REMOVED]").replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi,"[SEC-REMOVED]")}if(e&&"object"==typeof e&&!Array.isArray(e)){if(Object.getPrototypeOf(e)===Object.prototype){const t={};for(const[n,r]of Object.entries(e))t[n]=be(r);return t}return e}return Array.isArray(e)?e.map(e=>be(e)):e},ve=e=>/^([a-zA-Z0-9_.-][a-zA-Z0-9_.-]*)$/.test(e)&&e.length<=256&&e.length>0,ke=(e,t,n,r)=>{const s={id:fe(),purpose:n,granted:r,timestamp:Date.now()},o=e.get(t)||[];return o.push(s),e.set(t,o),_e({timestamp:Date.now(),action:"set",key:`consent:${n}`,userId:t,success:!0}),s},Ee=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof structuredClone)try{return structuredClone(e)}catch(e){}const t=new WeakMap,n=e=>{if(null===e||"object"!=typeof e)return e;if("function"==typeof e)return e;if(t.has(e))return t.get(e);if(e instanceof Date)return new Date(e.getTime());if(e instanceof RegExp)return new RegExp(e.source,e.flags);if(e instanceof Map){const r=new Map;return t.set(e,r),e.forEach((e,t)=>r.set(n(t),n(e))),r}if(e instanceof Set){const r=new Set;return t.set(e,r),e.forEach(e=>r.add(n(e))),r}const r=Array.isArray(e)?[]:Object.create(Object.getPrototypeOf(e));t.set(e,r);const s=[...Object.keys(e),...Object.getOwnPropertySymbols(e)];for(const t of s)r[t]=n(e[t]);return r};return n(e)},Ce=(e,t)=>{if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++)if(!Ce(e[n],t[n]))return!1;return!0}const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r=0;r<n.length;r++){const s=n[r];if(!(s in t)||!Ce(e[s],t[s]))return!1}return!0},Oe=e=>`${e}_`,xe=class{store;config;pendingQueue=new Map;remoteVersions=new Map;syncTimer=null;onlineStatusListeners=new Set;syncStateListeners=new Set;_isOnline=!0;_isSyncing=!1;constructor(e,t){this.store=e,this.config={endpoint:t.endpoint,authToken:t.authToken||"",strategy:t.strategy||"last-write-wins",autoSyncInterval:t.autoSyncInterval??3e4,syncOnReconnect:t.syncOnReconnect??!0,debounceTime:t.debounceTime??1e3,fetch:t.fetch||fetch,onSync:t.onSync||(()=>{}),onConflict:t.onConflict||(()=>({action:"accept-local"})),maxRetries:t.maxRetries??3},this._isOnline="undefined"==typeof navigator||navigator.onLine,this._setupOnlineListener(),this._setupStoreListener(),this.config.autoSyncInterval>0&&this._startAutoSync()}_getAuthToken(){const e=this.config.authToken;return"function"==typeof e?e()||"":e||""}_setupOnlineListener(){"undefined"!=typeof window&&(window.addEventListener("online",()=>{this._isOnline=!0,this._notifyOnlineChange(!0),this.config.syncOnReconnect&&this.sync()}),window.addEventListener("offline",()=>{this._isOnline=!1,this._notifyOnlineChange(!1)}))}_setupStoreListener(){this.store._subscribe(()=>{})}_startAutoSync(){setInterval(()=>{this._isOnline&&!this._isSyncing&&this.pendingQueue.size>0&&this.sync()},this.config.autoSyncInterval)}_notifyOnlineChange(e){this.onlineStatusListeners.forEach(t=>t(e)),this._notifyStateChange()}_notifyStateChange(){const e=this.getState();this.syncStateListeners.forEach(t=>t(e))}queueChange(e,t){const n=this.store._getVersion(e)||1;this.pendingQueue.set(e,{key:e,value:Ee(t),timestamp:Date.now(),version:n}),this._notifyStateChange(),this.syncTimer&&clearTimeout(this.syncTimer),this.syncTimer=setTimeout(()=>{this._isOnline&&this.sync()},this.config.debounceTime)}async sync(){if(this._isSyncing)return{success:!1,syncedKeys:[],conflicts:[],errors:["Sync already in progress"],timestamp:Date.now(),duration:0};this._isSyncing=!0,this._notifyStateChange();const e=Date.now(),t=[],n=[],r=[];try{const s=Array.from(this.pendingQueue.values());if(0===s.length)return this._isSyncing=!1,this._notifyStateChange(),{success:!0,syncedKeys:[],conflicts:[],errors:[],timestamp:Date.now(),duration:Date.now()-e};await this._fetchRemoteVersions(s.map(e=>e.key));for(const e of s)try{const r=this.remoteVersions.get(e.key);if(r)if(r.version>=e.version){const s={key:e.key,localValue:e.value,remoteValue:r.value,localVersion:e.version,remoteVersion:r.version,timestamp:e.timestamp};n.push(s);const o=this.config.onConflict(s);await this._resolveConflict(e,r,o),t.push(e.key),this.pendingQueue.delete(e.key)}else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key);else await this._pushChange(e),t.push(e.key),this.pendingQueue.delete(e.key)}catch(t){r.push(`Failed to sync "${e.key}": ${t}`)}const o={success:0===r.length,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e};return this.config.onSync(o),o}catch(s){const o=`Sync failed: ${s}`;return r.push(o),{success:!1,syncedKeys:t,conflicts:n,errors:r,timestamp:Date.now(),duration:Date.now()-e}}finally{this._isSyncing=!1,this._notifyStateChange()}}async _fetchRemoteVersions(e){try{const t=this._getAuthToken(),n=await this.config.fetch(`${this.config.endpoint}/versions`,{method:"POST",headers:{"Content-Type":"application/json",...t&&{Authorization:`Bearer ${t}`}},body:JSON.stringify({keys:e})});if(n.ok){const e=await n.json();if(e.versions)for(const[t,n]of Object.entries(e.versions))this.remoteVersions.set(t,n)}}catch(e){}}async _pushChange(e){let t=0;for(;t<this.config.maxRetries;)try{const n=this._getAuthToken(),r=await this.config.fetch(`${this.config.endpoint}/sync`,{method:"POST",headers:{"Content-Type":"application/json",...n&&{Authorization:`Bearer ${n}`}},body:JSON.stringify({key:e.key,value:e.value,version:e.version,timestamp:e.timestamp})});if(r.ok){const t=await r.json();return void(t.version&&this.remoteVersions.set(e.key,{version:t.version,timestamp:t.timestamp||Date.now(),value:e.value}))}t++}catch(e){if(t++,t>=this.config.maxRetries)throw e}}async _resolveConflict(e,t,n){switch(n.action){case"accept-local":await this._pushChange({...e,version:t.version+1,timestamp:Date.now()});break;case"accept-remote":this.store.set(e.key,t.value);break;case"merge":this.store.set(e.key,n.value),await this._pushChange({key:e.key,value:n.value,version:Math.max(e.version,t.version)+1,timestamp:Date.now()})}}getState(){return{isOnline:this._isOnline,isSyncing:this._isSyncing,lastSyncTimestamp:null,pendingChanges:this.pendingQueue.size,conflicts:0}}onOnlineChange(e){return this.onlineStatusListeners.add(e),()=>this.onlineStatusListeners.delete(e)}onStateChange(e){return this.syncStateListeners.add(e),()=>this.syncStateListeners.delete(e)}async flush(){return this.sync()}destroy(){this.syncTimer&&clearTimeout(this.syncTimer),this.pendingQueue.clear(),this.onlineStatusListeners.clear(),this.syncStateListeners.clear()}},Ae=()=>{try{0;const e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:{};return void 0!==e.__DEV__&&!1===e.__DEV__}catch{return!1}},De=()=>"undefined"!=typeof window?window.localStorage:null,Me=e=>{const t=new Map,n=new Map,r=new Map,s=new Set,o=new Map,a=new Set,i=new Map,c=new Map,l=new Map,u=new Map,d=new Map,p=new Map,f=new Map,y=new Map,h=e?.namespace||"gstate",g=e?.silent??!1,m=e?.debounceTime??150,_=e?.version??0,S=e?.storage||De(),w=e?.onError,b=e?.maxObjectSize??0,v=e?.maxTotalSize??0,k=e?.encryptionKey??null,E=e?.validateInput??!0,C=e?.auditEnabled??!0,O=e?.userId,x=e?.immer??!0,A=e?.persistByDefault??e?.persistence??e?.persist??!1;e?.accessRules&&e.accessRules.forEach(e=>Se(f,e.pattern,e.permissions));let D,M=!1,P=!1,R=!1,T=0,I=null,z=null;const V=new Promise(e=>{D=e}),$=()=>({store:t,versions:n,sizes:r,totalSize:T,storage:S,config:e||{},diskQueue:d,encryptionKey:k,audit:K,onError:w,silent:g,debounceTime:m,currentVersion:_}),U=()=>({plugins:u,onError:w,silent:g}),N=e=>{if(null==e)return 0;const t=typeof e;if("boolean"===t)return 4;if("number"===t)return 8;if("string"===t)return 2*e.length;if("object"!==t)return 0;let n=0;const r=[e],s=new WeakSet;for(;r.length>0;){const e=r.pop();if("boolean"==typeof e)n+=4;else if("number"==typeof e)n+=8;else if("string"==typeof e)n+=2*e.length;else if("object"==typeof e&&null!==e){const t=e;if(s.has(t))continue;if(s.add(t),Array.isArray(t))for(let e=0;e<t.length;e++)r.push(t[e]);else for(const e of Object.keys(t))n+=2*e.length,r.push(t[e])}}return n},L=(e,t)=>{((e,t,n)=>{if(0!==e.plugins.size)for(const r of e.plugins.values()){const s=r.hooks?.[t];if(s)try{s(n)}catch(s){const o=s instanceof Error?s:new Error(String(s));e.onError?e.onError(o,{operation:`plugin:${r.name}:${t}`,key:n.key}):e.silent}}})(U(),e,t)},K=(e,t,n,r)=>{C&&null!==me&&_e&&_e({timestamp:Date.now(),action:e,key:t,userId:O,success:n,error:r})},F=e=>{const t=c.get(e);if(!t)return;const r=new Set,s=t.selector(e=>(r.add(e),c.has(e)?c.get(e).lastValue:Q.get(e)));t.deps.forEach(t=>{if(!r.has(t)){const n=l.get(t);n&&(n.delete(e),0===n.size&&l.delete(t))}}),r.forEach(n=>{t.deps.has(n)||(l.has(n)||l.set(n,new Set),l.get(n).add(e))}),t.deps=r,Ce(t.lastValue,s)||(t.lastValue=x&&null!==s&&"object"==typeof s?j(Ee(s),!0):s,n.set(e,(n.get(e)||0)+1),B(e))},B=e=>{if(e){if(l.has(e)){const t=l.get(e);for(const e of t)F(e)}const t=i.get(e);if(t){const n=Q.get(e);for(const r of t)try{r(n)}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"watcher",key:e})}}const n=o.get(e);if(n)for(const t of n)try{t()}catch(t){const n=t instanceof Error?t:new Error(String(t));w&&w(n,{operation:"keyListener",key:e})}}if(M)P=!0;else for(const e of s)try{e()}catch(e){const t=e instanceof Error?e:new Error(String(e));w&&w(t,{operation:"listener"})}},J=async()=>{(async e=>{if(!e.storage)return;const{store:t,config:n,diskQueue:r,storage:s,encryptionKey:o,audit:a,onError:i,silent:c,currentVersion:l}=e,u=Oe(n.namespace||"gstate");try{const e={};let r;t.forEach((t,n)=>{e[n]=t});const o=n?.encoded;r=o?btoa(JSON.stringify(e)):JSON.stringify(e),s.setItem(u.replace("_",""),JSON.stringify({v:1,t:Date.now(),e:null,d:r,_sys_v:l,_b64:!!o||void 0})),a("set","FULL_STATE",!0)}catch(e){const t=e instanceof Error?e:new Error(String(e));i&&i(t,{operation:"persist",key:"FULL_STATE"})}const d=Array.from(r.entries());r.clear();for(const[t,n]of d)try{if(!t||!/^[a-zA-Z0-9_.-]+$/.test(t)||t.length>256)continue;let r=n.value;const i=n.options.encoded||n.options.encrypted||n.options.secure;if(n.options.encrypted){if(!o)throw new Error(`Encryption key missing for "${t}"`);r=await he(n.value,o)}else i?r=btoa(JSON.stringify(n.value)):"object"==typeof n.value&&null!==n.value&&(r=JSON.stringify(n.value));s.setItem(`${u}${t}`,JSON.stringify({v:e.versions.get(t)||1,t:Date.now(),e:n.options.ttl?Date.now()+n.options.ttl:null,d:r,_sys_v:l,_enc:!!n.options.encrypted||void 0,_b64:!(!n.options.encoded&&!n.options.secure)||void 0})),a("set",t,!0)}catch(e){const n=e instanceof Error?e:new Error(String(e));i&&i(n,{operation:"persist",key:t})}})($())},W={},Q={_setSilently:(e,s)=>{const o=r.get(e)||0,a=x&&null!==s&&"object"==typeof s?j(Ee(s),!0):s,i=(b>0||v>0)&&!Ae()?N(a):0;T=T-o+i,r.set(e,i),t.set(e,a),n.set(e,(n.get(e)||0)+1),z=null},_registerMethod:(e,t,n)=>{const r=e=>"__proto__"===e||"constructor"===e||"prototype"===e;r(e)||r(t)||(W[e]||(W[e]={}),W[e][t]=n)},set:(s,o,a={})=>{const i=t.get(s),c=x&&"function"==typeof o?de(i,o):o;if(E&&!ve(s))return!1;if(!we(f,s,"write",O))return K("set",s,!1,"RBAC Denied"),!1;const l=E?be(c):c,u=r.get(s)||0;L("onBeforeSet",{key:s,value:l,store:Q,version:n.get(s)||0});const p=x&&null!==l&&"object"==typeof l?j(Ee(l),!0):l;if(!Ce(i,p)){const o=(b>0||v>0)&&!Ae()?N(p):0;if(b>0&&o>b){const e=new Error(`Object size (${o} bytes) exceeds maxObjectSize (${b} bytes)`);w&&w(e,{operation:"set",key:s})}if(v>0){const e=T-u+o;if(e>v){const t=new Error(`Total store size (${e} bytes) exceeds limit (${v} bytes)`);w&&w(t,{operation:"set"})}}T=T-u+o,r.set(s,o),t.set(s,p),n.set(s,(n.get(s)||0)+1),z=null;const i=a.persist??A;return i&&(d.set(s,{value:p,options:{...a,persist:i,encoded:a.encoded||e?.encoded}}),I&&clearTimeout(I),I=setTimeout(J,m)),L("onSet",{key:s,value:p,store:Q,version:n.get(s)}),K("set",s,!0),B(s),!0}return!1},get:e=>{if(!we(f,e,"read",O))return K("get",e,!1,"RBAC Denied"),null;const n=t.get(e);return L("onGet",{store:Q,key:e,value:n}),K("get",e,!0),n},compute:(e,t)=>{try{return c.has(e)||(c.set(e,{selector:t,lastValue:null,deps:new Set}),F(e)),c.get(e).lastValue}catch(t){const n=t instanceof Error?t:new Error(String(t));return w&&w(n,{operation:"compute",key:e}),null}},watch:(e,t)=>{i.has(e)||i.set(e,new Set);const n=i.get(e);return n.add(t),()=>{n.delete(t),0===n.size&&i.delete(e)}},remove:e=>{if(!we(f,e,"delete",O))return K("delete",e,!1,"RBAC Denied"),!1;const s=t.get(e),o=t.delete(e);return o&&(T-=r.get(e)||0,r.delete(e),L("onRemove",{store:Q,key:e,value:s}),z=null),n.set(e,(n.get(e)||0)+1),S&&S.removeItem(`${h}_${e}`),K("delete",e,!0),B(e),o},delete:e=>Q.remove(e),deleteAll:()=>{if(Array.from(t.keys()).forEach(e=>Q.remove(e)),S){const e=h+"_";for(let t=0;t<(S.length||0);t++){const n=S.key(t);n?.startsWith(e)&&(S.removeItem(n),t--)}}return T=0,r.clear(),z=null,!0},list:()=>Object.fromEntries(t.entries()),use:e=>{a.add(e)},transaction:e=>{M=!0,L("onTransaction",{store:Q,key:"START"});try{e()}finally{M=!1,L("onTransaction",{store:Q,key:"END"}),P&&(P=!1,B())}},destroy:()=>{I&&(clearTimeout(I),I=null),d.clear(),"undefined"!=typeof window&&window.removeEventListener("beforeunload",G),L("onDestroy",{store:Q}),s.clear(),o.clear(),i.clear(),c.clear(),l.clear(),u.clear(),t.clear(),r.clear(),T=0,f.clear(),y.clear(),n.clear(),p.clear(),a.clear()},_addPlugin:e=>{((e,t,n)=>{try{e.plugins.set(t.name,t),t.hooks?.onInstall?.({store:n})}catch(n){const r=n instanceof Error?n:new Error(String(n));e.onError?e.onError(r,{operation:"plugin:install",key:t.name}):e.silent}})(U(),e,Q)},_removePlugin:e=>{u.delete(e)},_subscribe:(e,t)=>{if(t){o.has(t)||o.set(t,new Set);const n=o.get(t);return n.add(e),()=>{n.delete(e),0===n.size&&o.delete(t)}}return s.add(e),()=>s.delete(e)},_getVersion:e=>n.get(e)??0,addAccessRule:(e,t)=>Se(f,e,t),hasPermission:(e,t,n)=>we(f,e,t,n),recordConsent:(e,t,n)=>ke(y,e,t,n),hasConsent:(e,t)=>((e,t,n)=>{const r=e.get(t);if(!r)return!1;for(let e=r.length-1;e>=0;e--){const t=r[e];if(t&&t.purpose===n)return t.granted}return!1})(y,e,t),getConsents:e=>((e,t)=>e.get(t)||[])(y,e),revokeConsent:(e,t)=>((e,t,n)=>ke(e,t,n,!1))(y,e,t),exportUserData:e=>((e,t)=>({userId:t,exportedAt:Date.now(),consents:e.get(t)||[]}))(y,e),deleteUserData:e=>((e,t)=>{const n=e.get(t)?.length||0;return e.delete(t),{success:!0,deletedConsents:n}})(y,e),getSnapshot:()=>(z||(z=Object.fromEntries(t.entries())),z),get plugins(){return W},get isReady(){return R},get namespace(){return h},get userId(){return O},whenReady:()=>V};["addAccessRule","recordConsent","hasConsent","getConsents","revokeConsent","exportUserData","deleteUserData"].forEach(e=>{const t=Q[e];t&&Q._registerMethod("security",e,t)});const G=()=>{d.size>0&&J()};"undefined"!=typeof window&&window.addEventListener("beforeunload",G),S?(async(e,t,n)=>{const{storage:r,config:s,encryptionKey:o,audit:a,onError:i,silent:c,currentVersion:l,store:u,sizes:d,versions:p}=e,f=Oe(s.namespace||"gstate"),y=s.immer??!0;if(r)try{const c={};let h=0;for(let e=0;e<(r.length||0);e++){const t=r.key(e);if(!t||!t.startsWith(f))continue;const n=r.getItem(t);if(n)try{const s=JSON.parse(n),i=t.substring(f.length);if(h=Math.max(h,void 0!==s._sys_v?s._sys_v:s.v||0),s.e&&Date.now()>s.e){r.removeItem(t),e--;continue}let l=s.d;if(s._enc&&o)l=await ge(l,o);else if("string"==typeof l)if(s._b64)try{l=JSON.parse(atob(l))}catch(e){}else if(l.startsWith("{")||l.startsWith("["))try{l=JSON.parse(l)}catch(e){}c[i]=l,a("hydrate",i,!0)}catch(e){a("hydrate",t,!1,String(e));const n=e instanceof Error?e:new Error(String(e));i&&i(n,{operation:"hydration",key:t})}}const g=h<l&&s.migrate?s.migrate(c,h):c;Object.entries(g).forEach(([n,r])=>{const s=y&&null!==r&&"object"==typeof r?j(Ee(r),!0):r,o=t(s),a=d.get(n)||0;e.totalSize=e.totalSize-a+o,d.set(n,o),u.set(n,s),p.set(n,1)}),n()}catch(e){const t=e instanceof Error?e:new Error(String(e));i&&i(t,{operation:"hydration"})}})($(),e=>(b>0||v>0)&&!Ae()?N(e):0,()=>{R=!0,z=null,D(),B()}).then(()=>{}):(R=!0,D());let q=null;return e?.sync&&(q=new xe(Q,e.sync),Q._registerMethod("sync","flush",()=>q?.flush()),Q._registerMethod("sync","getState",()=>q?.getState()),Q._registerMethod("sync","onStateChange",e=>q?.onStateChange(e))),Q},Pe=null,Re=()=>Pe;function je(t,n){const r=e.useMemo(()=>n||Pe,[n]),s=e.useMemo(()=>{const e=()=>{},t=()=>!1,n=()=>null;return{set:t,get:n,remove:t,delete:t,deleteAll:t,list:()=>({}),compute:n,watch:()=>()=>{},use:e,transaction:e,destroy:e,_subscribe:()=>()=>{},_setSilently:e,_registerMethod:e,_addPlugin:e,_removePlugin:e,_getVersion:()=>0,get isReady(){return!1},whenReady:()=>Promise.resolve(),get plugins(){return{}},getSnapshot:()=>({}),get namespace(){return"ghost"},get userId(){}}},[]),o=r||s,a="function"==typeof t,i=a?null:t,c=a?t:null,l=e.useCallback(e=>a?o._subscribe(e):o._subscribe(e,i),[o,a,i]),u=e.useCallback(()=>a?c(o.getSnapshot()):o.get(i)??void 0,[o,a,i,c]),d=e.useCallback(()=>{if(a)try{return c({})}catch{return}},[c,a]),p=e.useSyncExternalStore(l,u,d),f=e.useCallback((e,t)=>a?(Ae(),!1):o.set(i,e,t),[o,a,i]);return e.useDebugValue(p,e=>a?`Selector: ${JSON.stringify(e)}`:`${i}: ${JSON.stringify(e)}`),a?p:[p,f]}var Te=new Map;exports.SyncEngine=xe,exports.addAccessRule=(e,t)=>Re()?.addAccessRule(e,t),exports.analyticsPlugin=e=>({name:"gstate-analytics",hooks:{onSet:({key:t,value:n})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:n,action:"SET"}))},onRemove:({key:t})=>{t&&(e.keys&&!e.keys.includes(t)||e.provider({key:t,value:null,action:"REMOVE"}))}}}),exports.clearAccessRules=()=>{},exports.clearAllConsents=()=>{},exports.cloudSyncPlugin=e=>{const{adapter:t,autoSyncInterval:n}=e,r=new Map,s={lastSyncTimestamp:null,totalKeysSynced:0,totalBytesSynced:0,syncCount:0,lastDuration:0,errors:0};let o=null;return{name:"cloudSync",hooks:{onInstall:({store:a})=>{a._registerMethod("cloudSync","sync",async()=>{const n=performance.now(),o={};let i=0;try{const c=a.list(),l=Object.keys(c);for(const e of l){const t=a._getVersion?.(e)||0;if(t>(r.get(e)||0)){const n=c[e];o[e]=n,i+=JSON.stringify(n).length,r.set(e,t)}}if(0===Object.keys(o).length)return{status:"no-change",stats:s};if(await t.save(o))return s.lastSyncTimestamp=Date.now(),s.totalKeysSynced+=Object.keys(o).length,s.totalBytesSynced+=i,s.syncCount++,s.lastDuration=performance.now()-n,e.onSync&&e.onSync(s),{status:"success",stats:s};throw new Error(`Adapter ${t.name} failed to save.`)}catch(e){return s.errors++,{status:"error",error:String(e),stats:s}}}),a._registerMethod("cloudSync","getStats",()=>s),n&&n>0&&(o=setInterval(()=>{const e=a.plugins.cloudSync;e&&e.sync()},n))},onDestroy:()=>{o&&clearInterval(o)}}}},exports.createAsyncStore=(e,t)=>{const n=t?.key||"async_data",r=t?.store||Me({namespace:`async_${n}`,silent:!0});null==r.get(n)&&r.set(n,{data:null,loading:!1,error:null,updatedAt:null});return Object.assign(r,{execute:async()=>{const s=r.get(n);r.set(n,{...s||{data:null,loading:!1,error:null,updatedAt:null},loading:!0,error:null}),"whenReady"in r&&!r.isReady&&await r.whenReady();try{const s=await e(),o=r.get(n);r.set(n,{...o||{data:null,loading:!1,error:null,updatedAt:null},data:s,loading:!1,updatedAt:Date.now()},{persist:t?.persist})}catch(e){const t=r.get(n);r.set(n,{...t||{data:null,loading:!1,error:null,updatedAt:null},error:e instanceof Error?e:new Error(String(e)),loading:!1})}}})},exports.createFirestoreAdapter=(e,t)=>({name:"Firebase-Firestore",save:async e=>{try{Ae();return(()=>{})("[Mock] Firestore Syncing:",e),!0}catch(e){return!1}}}),exports.createMongoAdapter=(e,t)=>({name:"MongoDB-Atlas",save:async n=>(await fetch(`${e}/action/updateOne`,{method:"POST",headers:{"Content-Type":"application/json","api-key":t},body:JSON.stringify({dataSource:"Cluster0",database:"rgs_cloud",collection:"user_states",filter:{id:"global_state"},update:{$set:{data:n,updatedAt:Date.now()}},upsert:!0})})).ok}),exports.createSqlRestAdapter=(e,t)=>({name:"SQL-REST-API",save:async n=>{const r=t();if(!r)return!1;return(await fetch(e,{method:"PATCH",headers:{"Content-Type":"application/json",Authorization:`Bearer ${r}`},body:JSON.stringify(n),credentials:"same-origin"})).ok}}),exports.createStore=Me,exports.createSyncEngine=(e,t)=>new xe(e,t),exports.debugPlugin=()=>{if(Ae())return{name:"gstate-debug-noop",hooks:{}};Ae();return{name:"gstate-debug",hooks:{onInstall:({store:e})=>{"undefined"!=typeof window&&(window.gstate={list:()=>e.list(),get:t=>{const n=e.get(t);return n},set:(t,n)=>{const r=e.set(t,n);return JSON.stringify(n),r},watch:(t,n)=>e.watch(t,n),info:()=>{const t={namespace:e.namespace,isReady:e.isReady,keys:Object.keys(e.list()),size:Object.keys(e.list()).length};return t},banner:()=>{}})},onDestroy:()=>{"undefined"!=typeof window&&delete window.gstate}}}},exports.deleteUserData=e=>{const t=Re();if(!t)throw new Error("[gstate] deleteUserData failed: No store found.");return t.deleteUserData(e)},exports.deriveKeyFromPassword=async(e,t,n=6e5)=>{if(!ye)throw new Error("Web Crypto API not available");const r=await crypto.subtle.importKey("raw",(new TextEncoder).encode(e),"PBKDF2",!1,["deriveKey"]);return{key:await crypto.subtle.deriveKey({name:"PBKDF2",salt:new Uint8Array(t),iterations:n,hash:"SHA-256"},r,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:crypto.getRandomValues(new Uint8Array(12))}},exports.destroyState=()=>{Pe&&(Pe.destroy(),Pe=null)},exports.destroySync=e=>{const t=Te.get(e);t&&(t.destroy(),Te.delete(e))},exports.devToolsPlugin=e=>{const t=globalThis.__REDUX_DEVTOOLS_EXTENSION__;if(!t?.connect)return{name:"gstate-devtools-noop",hooks:{}};let n=null;return{name:"gstate-devtools",hooks:{onInstall:({store:r})=>{n=t.connect({name:e?.name||"Magnetar Store"}),n.init(r.list())},onSet:({key:e,store:t})=>{e&&n&&n.send(`SET_${e.toUpperCase()}`,t.list())},onRemove:({key:e,store:t})=>{e&&n&&n.send(`REMOVE_${e.toUpperCase()}`,t.list())}}}},exports.exportKey=async e=>{const t=await crypto.subtle.exportKey("raw",e.key);return{key:btoa(String.fromCharCode(...new Uint8Array(t))),iv:btoa(String.fromCharCode(...e.iv))}},exports.exportUserData=e=>{const t=Re();if(!t)throw new Error("[gstate] exportUserData failed: No store found.");return t.exportUserData(e)},exports.generateEncryptionKey=async()=>{if(!ye)throw new Error("Web Crypto API not available");return{key:await crypto.subtle.generateKey({name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:crypto.getRandomValues(new Uint8Array(12))}},exports.generateSalt=(e=32)=>crypto.getRandomValues(new Uint8Array(e)),exports.getConsents=e=>Re()?.getConsents(e)??[],exports.getStore=Re,exports.gstate=(e,t)=>{const n=Me("string"==typeof t?{namespace:t}:t);e&&Object.entries(e).forEach(([e,t])=>{null===n.get(e)&&n._setSilently(e,t)});return"undefined"==typeof window||Ae()||(window.gstate=n,window.gState=n,window.rgs=n),Object.assign(e=>je(e,n),n)},exports.guardPlugin=e=>({name:"gstate-guard",hooks:{onBeforeSet:({key:t,value:n,store:r})=>{if(!t)return;const s=e[t];s&&s(n)}}}),exports.hasConsent=(e,t)=>Re()?.hasConsent(e,t)??!1,exports.hasPermission=(e,t,n)=>Re()?.hasPermission(e,t,n)??!0,exports.immerPlugin=()=>({name:"gstate-immer",hooks:{onInstall:({store:e})=>{e._registerMethod("immer","setWithProduce",(t,n)=>e.set(t,n))}}}),exports.importKey=async(e,t)=>{const n=Uint8Array.from(atob(e),e=>e.charCodeAt(0)),r=Uint8Array.from(atob(t),e=>e.charCodeAt(0));return{key:await crypto.subtle.importKey("raw",n,{name:"AES-GCM",length:256},!0,["encrypt","decrypt"]),iv:r}},exports.indexedDBPlugin=(e={})=>{const t=e.dbName||"rgs-db",n=e.storeName||"states",r=e.version||1;let s=null;const o=()=>new Promise((e,o)=>{if(s)return e(s);const a=indexedDB.open(t,r);a.onerror=()=>o(a.error),a.onsuccess=()=>{s=a.result,e(s)},a.onupgradeneeded=e=>{const t=e.target.result;t.objectStoreNames.contains(n)||t.createObjectStore(n)}}),a=async e=>{const t=await o();return new Promise((r,s)=>{const o=t.transaction(n,"readonly").objectStore(n).get(e);o.onsuccess=()=>r(o.result),o.onerror=()=>s(o.error)})};return{name:"indexedDB",hooks:{onInstall:({store:e})=>{e._registerMethod("indexedDB","clear",async()=>{(await o()).transaction(n,"readwrite").objectStore(n).clear()})},onInit:async({store:e})=>{const t=(await o()).transaction(n,"readonly").objectStore(n).getAllKeys();t.onsuccess=async()=>{const n=t.result,r=e.namespace+"_";for(const t of n)if(t.startsWith(r)){const n=await a(t);if(n){const s=t.substring(r.length);e._setSilently(s,n.d)}}}},onSet:async({key:e,value:t,store:r})=>{if(!e)return;const s=r.namespace+"_",a={d:t,t:Date.now(),v:r._getVersion?.(e)||1};await(async(e,t)=>{const r=await o();return new Promise((s,o)=>{const a=r.transaction(n,"readwrite").objectStore(n).put(t,e);a.onsuccess=()=>s(),a.onerror=()=>o(a.error)})})(`${s}${e}`,a)},onRemove:async({key:e,store:t})=>{if(!e)return;const r=t.namespace+"_";await(async e=>{const t=await o();return new Promise((r,s)=>{const o=t.transaction(n,"readwrite").objectStore(n).delete(e);o.onsuccess=()=>r(),o.onerror=()=>s(o.error)})})(`${r}${e}`)}}}},exports.initState=e=>{const t=Me(e);return Pe=t,t},exports.initSync=(e,t)=>{const n=e.namespace;if(Te.has(n))return Te.get(n);const r=new xe(e,t);return Te.set(n,r),r},exports.isCryptoAvailable=ye,exports.logAudit=_e,exports.loggerPlugin=e=>({name:"gstate-logger",hooks:{onSet:({key:e,value:t,version:n})=>{(new Date).toLocaleTimeString()},onRemove:({key:e})=>{},onTransaction:({key:e})=>{}}}),exports.recordConsent=(e,t,n)=>{const r=Re();if(!r)throw new Error("[gstate] recordConsent failed: No store found. call initState() first.");return r.recordConsent(e,t,n)},exports.revokeConsent=(e,t)=>Re()?.revokeConsent(e,t),exports.sanitizeValue=be,exports.schemaPlugin=e=>({name:"gstate-schema",hooks:{onSet:({key:t,value:n})=>{if(!t)return;const r=e[t];if(r){const e=r(n);if(!0!==e)throw new Error(`[Schema Error] Validation failed for key "${t}": ${!1===e?"Invalid type":e}`)}}}}),exports.setAuditLogger=e=>{me=e},exports.snapshotPlugin=()=>{const e=new Map;return{name:"gstate-snapshot",hooks:{onInstall:({store:t})=>{t._registerMethod("snapshot","takeSnapshot",n=>{e.set(n,t.list())}),t._registerMethod("snapshot","restoreSnapshot",n=>{const r=e.get(n);return!!r&&(t.transaction(()=>{Object.entries(r).forEach(([e,n])=>{t.set(e,n)})}),!0)}),t._registerMethod("snapshot","listSnapshots",()=>Array.from(e.keys())),t._registerMethod("snapshot","deleteSnapshot",t=>e.delete(t)),t._registerMethod("snapshot","clearSnapshots",()=>e.clear())}}}},exports.syncPlugin=e=>{const t=new BroadcastChannel(e?.channelName||"gstate_sync");let n=!1;return{name:"gstate-sync",hooks:{onInstall:({store:e})=>{t.onmessage=t=>{const{key:r,value:s,action:o}=t.data;r&&(n=!0,"REMOVE"===o?e.remove(r):e.set(r,s),n=!1)}},onSet:({key:e,value:r})=>{e&&!n&&t.postMessage({key:e,value:r,action:"SET"})},onRemove:({key:e})=>{e&&!n&&t.postMessage({key:e,action:"REMOVE"})},onDestroy:()=>{t.close()}}}},exports.triggerSync=async e=>{const t=e||Pe?.namespace;if(!t)return;const n=Te.get(t);n&&await n.flush()},exports.undoRedoPlugin=e=>{let t=[],n=-1,r=!1;const s=e?.limit||50;return{name:"gstate-undo-redo",hooks:{onInstall:({store:e})=>{t.push(e.list()),n=0,e._registerMethod("undoRedo","undo",()=>{if(n>0){r=!0,n--;const s=t[n];return!!s&&(Object.entries(s).forEach(([t,n])=>{e._setSilently(t,n)}),r=!1,!0)}return!1}),e._registerMethod("undoRedo","redo",()=>{if(n<t.length-1){r=!0,n++;const s=t[n];return!!s&&(Object.entries(s).forEach(([t,n])=>{e._setSilently(t,n)}),r=!1,!0)}return!1}),e._registerMethod("undoRedo","canUndo",()=>n>0),e._registerMethod("undoRedo","canRedo",()=>n<t.length-1)},onSet:({store:e})=>{r||(n<t.length-1&&(t=t.slice(0,n+1)),t.push(e.list()),t.length>s?t.shift():n++)}}}},exports.useGState=je,exports.useIsStoreReady=t=>{const n=t||Pe,r=e.useMemo(()=>e=>n?n._subscribe(e):()=>{},[n]);return e.useSyncExternalStore(r,()=>!!n&&n.isReady,()=>!0)},exports.useSimpleState=je,exports.useStore=je,exports.useSyncStatus=()=>{const[t,n]=e.useState({isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});return e.useEffect(()=>{const e=()=>{let e=!0,t=!1,r=0,s=0;Te.forEach(n=>{const o=n.getState();e=e&&o.isOnline,t=t||o.isSyncing,r+=o.pendingChanges,s+=o.conflicts}),n({isOnline:e,isSyncing:t,lastSyncTimestamp:null,pendingChanges:r,conflicts:s})};e();const t=Array.from(Te.values()).map(t=>t.onStateChange(e));return()=>t.forEach(e=>e())},[]),t},exports.useSyncedState=function(t,n){const r=n||Pe,s=r?.namespace||"default",o=Te.get(s),a=je(t,r),i=a[0],c=a[1],[l,u]=e.useState(()=>o?.getState()||{isOnline:!0,isSyncing:!1,lastSyncTimestamp:null,pendingChanges:0,conflicts:0});return e.useEffect(()=>{if(!o)return;return o.onStateChange(u)},[o]),[i,e.useCallback((e,n)=>{const s=c(e,n);if(s&&o){const e=r?.get(t);o.queueChange(t,e)}return s},[c,o,t,r]),l]},exports.validateKey=ve;
|