strata-storage 2.4.2 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI-INTEGRATION-GUIDE.md +208 -0
- package/README.md +427 -181
- package/android/AGENTS.md +34 -0
- package/android/CLAUDE.md +51 -0
- package/android/src/main/java/com/strata/storage/SQLiteStorage.java +35 -0
- package/android/src/main/java/com/stratastorage/StrataStoragePlugin.java +191 -27
- package/dist/README.md +427 -181
- package/dist/adapters/capacitor/FilesystemAdapter.d.ts.map +1 -1
- package/dist/adapters/capacitor/FilesystemAdapter.js +2 -1
- package/dist/adapters/capacitor/PreferencesAdapter.d.ts.map +1 -1
- package/dist/adapters/capacitor/PreferencesAdapter.js +2 -1
- package/dist/adapters/capacitor/SecureAdapter.d.ts.map +1 -1
- package/dist/adapters/capacitor/SecureAdapter.js +2 -1
- package/dist/adapters/capacitor/SqliteAdapter.d.ts.map +1 -1
- package/dist/adapters/capacitor/SqliteAdapter.js +2 -1
- package/dist/adapters/web/CacheAdapter.d.ts.map +1 -1
- package/dist/adapters/web/CacheAdapter.js +11 -3
- package/dist/adapters/web/CookieAdapter.d.ts +37 -1
- package/dist/adapters/web/CookieAdapter.d.ts.map +1 -1
- package/dist/adapters/web/CookieAdapter.js +89 -9
- package/dist/adapters/web/IndexedDBAdapter.d.ts.map +1 -1
- package/dist/adapters/web/IndexedDBAdapter.js +10 -2
- package/dist/adapters/web/LocalStorageAdapter.d.ts +31 -0
- package/dist/adapters/web/LocalStorageAdapter.d.ts.map +1 -1
- package/dist/adapters/web/LocalStorageAdapter.js +92 -19
- package/dist/adapters/web/MemoryAdapter.d.ts +24 -0
- package/dist/adapters/web/MemoryAdapter.d.ts.map +1 -1
- package/dist/adapters/web/MemoryAdapter.js +69 -18
- package/dist/adapters/web/SessionStorageAdapter.d.ts +24 -0
- package/dist/adapters/web/SessionStorageAdapter.d.ts.map +1 -1
- package/dist/adapters/web/SessionStorageAdapter.js +71 -9
- package/dist/adapters/web/URLAdapter.d.ts +59 -0
- package/dist/adapters/web/URLAdapter.d.ts.map +1 -0
- package/dist/adapters/web/URLAdapter.js +234 -0
- package/dist/adapters/web/index.d.ts +1 -0
- package/dist/adapters/web/index.d.ts.map +1 -1
- package/dist/adapters/web/index.js +1 -0
- package/dist/android/AGENTS.md +34 -0
- package/dist/android/CLAUDE.md +51 -0
- package/dist/android/src/main/java/com/strata/storage/SQLiteStorage.java +35 -0
- package/dist/android/src/main/java/com/stratastorage/StrataStoragePlugin.java +191 -27
- package/dist/capacitor.d.ts.map +1 -1
- package/dist/capacitor.js +2 -1
- package/dist/config/support.d.ts +10 -0
- package/dist/config/support.d.ts.map +1 -0
- package/dist/config/support.js +9 -0
- package/dist/core/BaseAdapter.d.ts +8 -0
- package/dist/core/BaseAdapter.d.ts.map +1 -1
- package/dist/core/BaseAdapter.js +34 -14
- package/dist/core/Strata.d.ts +56 -2
- package/dist/core/Strata.d.ts.map +1 -1
- package/dist/core/Strata.js +501 -53
- package/dist/features/encryption.d.ts.map +1 -1
- package/dist/features/encryption.js +3 -2
- package/dist/features/integrity.d.ts +16 -0
- package/dist/features/integrity.d.ts.map +1 -0
- package/dist/features/integrity.js +28 -0
- package/dist/features/observer.d.ts.map +1 -1
- package/dist/features/observer.js +2 -1
- package/dist/features/query.d.ts +7 -1
- package/dist/features/query.d.ts.map +1 -1
- package/dist/features/query.js +9 -2
- package/dist/features/sync.d.ts.map +1 -1
- package/dist/features/sync.js +4 -3
- package/dist/index.d.ts +35 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +55 -30
- package/dist/integrations/angular/index.d.ts +158 -0
- package/dist/integrations/angular/index.d.ts.map +1 -0
- package/dist/integrations/angular/index.js +395 -0
- package/dist/integrations/index.d.ts +15 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +18 -0
- package/dist/integrations/react/index.d.ts +75 -0
- package/dist/integrations/react/index.d.ts.map +1 -0
- package/dist/integrations/react/index.js +191 -0
- package/dist/integrations/vue/index.d.ts +103 -0
- package/dist/integrations/vue/index.d.ts.map +1 -0
- package/dist/integrations/vue/index.js +274 -0
- package/dist/ios/AGENTS.md +33 -0
- package/dist/ios/CLAUDE.md +49 -0
- package/dist/ios/Plugin/KeychainStorage.swift +139 -50
- package/dist/ios/Plugin/SQLiteStorage.swift +40 -0
- package/dist/ios/Plugin/StrataStoragePlugin.m +23 -0
- package/dist/ios/Plugin/StrataStoragePlugin.swift +201 -52
- package/dist/package.json +21 -5
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +2 -1
- package/dist/types/index.d.ts +58 -9
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +0 -13
- package/dist/utils/errors.d.ts +7 -0
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +15 -3
- package/dist/utils/index.d.ts +63 -5
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +109 -16
- package/dist/utils/logger.d.ts +31 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +63 -0
- package/ios/AGENTS.md +33 -0
- package/ios/CLAUDE.md +49 -0
- package/ios/Plugin/KeychainStorage.swift +139 -50
- package/ios/Plugin/SQLiteStorage.swift +40 -0
- package/ios/Plugin/StrataStoragePlugin.m +23 -0
- package/ios/Plugin/StrataStoragePlugin.swift +201 -52
- package/package.json +35 -23
- package/scripts/build.js +16 -5
- package/scripts/configure.js +2 -6
- package/scripts/postinstall.js +2 -2
- package/Readme.md +0 -271
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
# AI Integration Guide - strata-storage
|
|
2
|
+
|
|
3
|
+
Quick reference for AI development agents (Claude Code, Cursor, Copilot, etc.) to integrate `strata-storage` into web and mobile projects. Current version: **2.5.0**.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
yarn add strata-storage
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Zero runtime dependencies. React, Vue, Angular, and `@capacitor/core` are optional peer dependencies — install only what the project uses.
|
|
12
|
+
|
|
13
|
+
## Core Concepts
|
|
14
|
+
|
|
15
|
+
- **Zero dependencies** — pure TypeScript core.
|
|
16
|
+
- **Provider-free** — `defineStorage()` returns a ready-to-use instance; no React context / Vue plugin / Angular module required.
|
|
17
|
+
- **Lazy init** — importing the package does no I/O; instances initialize on first operation. You rarely call `initialize()`.
|
|
18
|
+
- **One API, many backends** — `storage` types: `memory`, `localStorage`, `sessionStorage`, `indexedDB`, `cookies`, `cache`, `url`, plus native `preferences`, `secure`, `sqlite`, `filesystem` (Capacitor).
|
|
19
|
+
- **Opt-in features** — encryption, compression, TTL, queries, cross-tab sync, integrity, durable writes, mirroring, snapshots. All off by default.
|
|
20
|
+
|
|
21
|
+
## Quick Start
|
|
22
|
+
|
|
23
|
+
### Default instance (simplest)
|
|
24
|
+
|
|
25
|
+
```typescript
|
|
26
|
+
import { storage } from 'strata-storage';
|
|
27
|
+
|
|
28
|
+
await storage.set('user', { id: 1, name: 'John' });
|
|
29
|
+
const user = await storage.get<{ id: number; name: string }>('user');
|
|
30
|
+
await storage.remove('user');
|
|
31
|
+
await storage.clear();
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Your own configured instance
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { defineStorage } from 'strata-storage';
|
|
38
|
+
|
|
39
|
+
export const storage = defineStorage({
|
|
40
|
+
defaultStorages: ['indexedDB', 'localStorage'],
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
`defineStorage()` pre-registers memory, localStorage, sessionStorage, IndexedDB, cookies, and the Cache API. Use `new Strata(config)` + `registerWebAdapters(instance)` only when you need full control.
|
|
45
|
+
|
|
46
|
+
## Storage Options (per operation)
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
await storage.set('key', value, {
|
|
50
|
+
storage: 'indexedDB', // pick a specific backend (NOTE: option name is `storage`, not `adapter`)
|
|
51
|
+
ttl: 3_600_000, // expire in 1 hour (ms)
|
|
52
|
+
encrypt: true, // async only — requires encryption config + password
|
|
53
|
+
compress: true, // async only
|
|
54
|
+
tags: ['user-data'], // for queries
|
|
55
|
+
metadata: { version: 1 },
|
|
56
|
+
verify: true, // store + check an integrity checksum (2.5.0)
|
|
57
|
+
durable: true, // read back and verify the write (2.5.0)
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
const value = await storage.get('key', { storage: 'indexedDB' });
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
## Synchronous API (2.5.0)
|
|
64
|
+
|
|
65
|
+
No `await`. Works only on sync-capable adapters: `memory`, `localStorage`, `sessionStorage`, `cookies`, `url`.
|
|
66
|
+
|
|
67
|
+
```typescript
|
|
68
|
+
storage.setSync('lastTab', 'inbox');
|
|
69
|
+
const tab = storage.getSync<string>('lastTab');
|
|
70
|
+
storage.hasSync('lastTab');
|
|
71
|
+
storage.keysSync(); // aggregates across sync-capable adapters
|
|
72
|
+
storage.removeSync('lastTab');
|
|
73
|
+
storage.clearSync();
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Constraints: targeting an async-only adapter (indexedDB, cache, sqlite, filesystem, secure, preferences) throws; `setSync` with `encrypt`/`compress` throws; `getSync` on an encrypted/compressed value throws. Use the async API in those cases.
|
|
77
|
+
|
|
78
|
+
## URL Adapter (2.5.0)
|
|
79
|
+
|
|
80
|
+
Persist small UI state (tab, filters, pagination) in the URL — survives reload, shareable.
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { defineStorage, URLAdapter } from 'strata-storage';
|
|
84
|
+
|
|
85
|
+
const storage = defineStorage();
|
|
86
|
+
storage.registerAdapter(new URLAdapter()); // config: { mode: 'query'|'hash', prefix, history, maxLength }
|
|
87
|
+
|
|
88
|
+
storage.setSync('tab', 'pending', { storage: 'url' });
|
|
89
|
+
const tab = storage.getSync<string>('tab', { storage: 'url' });
|
|
90
|
+
|
|
91
|
+
storage.subscribe((c) => { if (c.key === 'tab') applyTab(c.newValue); }, { storage: 'url' });
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Limits: ~2 KB practical URL length; query mode is sent to the server (use `hash` for client-only); browser-only; not durable. Never put secrets in the URL.
|
|
95
|
+
|
|
96
|
+
## Disaster Recovery (2.5.0, opt-in)
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
const storage = defineStorage({
|
|
100
|
+
integrity: true, // FNV-1a checksum per value, verified on read
|
|
101
|
+
durableWrites: true, // read back + retry each write
|
|
102
|
+
mirror: ['indexedDB'], // copy writes to backups; read-repair on corruption
|
|
103
|
+
autoBackup: { interval: 300_000, storage: 'indexedDB' }, // scheduled snapshots
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
const backup = await storage.snapshot(); // checksum-verified backup string
|
|
107
|
+
await storage.restore(backup); // throws IntegrityError if corrupted
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
import { computeChecksum, verifyChecksum, IntegrityError } from 'strata-storage';
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Honest note: checksums are **non-cryptographic (FNV-1a)** — they detect accidental corruption, not tampering. Use encryption for tamper resistance.
|
|
115
|
+
|
|
116
|
+
## Framework Integrations (provider-free, 2.5.0)
|
|
117
|
+
|
|
118
|
+
### React
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
import { defineStorage } from 'strata-storage';
|
|
122
|
+
import { createStrataHooks } from 'strata-storage/react';
|
|
123
|
+
|
|
124
|
+
export const storage = defineStorage();
|
|
125
|
+
export const { useStorage, useStorageQuery, useStorageTTL } = createStrataHooks(storage);
|
|
126
|
+
|
|
127
|
+
// in a component: const [value, setValue, loading] = useStorage<string>('key', 'default');
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
`<StrataProvider instance={storage}>` (or `config={...}`) + the same hooks via context is still supported.
|
|
131
|
+
|
|
132
|
+
### Vue
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
import { defineStorage } from 'strata-storage';
|
|
136
|
+
import { createStrataComposables } from 'strata-storage/vue';
|
|
137
|
+
|
|
138
|
+
export const storage = defineStorage();
|
|
139
|
+
export const { useStorage } = createStrataComposables(storage);
|
|
140
|
+
|
|
141
|
+
// in setup(): const { value, update, loading } = useStorage<string>('key', 'default');
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
`StrataPlugin` (via `app.use`) is still supported; composables accept an optional instance argument.
|
|
145
|
+
|
|
146
|
+
### Angular
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
import { defineStorage } from 'strata-storage';
|
|
150
|
+
import { provideStrata } from 'strata-storage/angular';
|
|
151
|
+
|
|
152
|
+
const storage = defineStorage();
|
|
153
|
+
// bootstrapApplication(App, { providers: [provideStrata(storage)] });
|
|
154
|
+
// inject StrataService — methods return RxJS Observables: this.storage.get('key').subscribe(...)
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
`StrataModule.forRoot(config)` + `StrataService` is still supported. `STRATA_INSTANCE` token holds the instance.
|
|
158
|
+
|
|
159
|
+
### Capacitor (native)
|
|
160
|
+
|
|
161
|
+
```typescript
|
|
162
|
+
import { defineStorage } from 'strata-storage';
|
|
163
|
+
import { PreferencesAdapter, SecureStorageAdapter } from 'strata-storage/capacitor';
|
|
164
|
+
|
|
165
|
+
const storage = defineStorage();
|
|
166
|
+
storage.registerAdapter(new PreferencesAdapter());
|
|
167
|
+
storage.registerAdapter(new SecureStorageAdapter());
|
|
168
|
+
await storage.set('secret', token, { storage: 'secure' });
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Native adapters depend on the downstream Capacitor project setup; verify behavior on-device.
|
|
172
|
+
|
|
173
|
+
## Strata API (most-used methods)
|
|
174
|
+
|
|
175
|
+
| Method | Returns |
|
|
176
|
+
|--------|---------|
|
|
177
|
+
| `get<T>(key, options?)` | `Promise<T \| null>` |
|
|
178
|
+
| `set<T>(key, value, options?)` | `Promise<void>` |
|
|
179
|
+
| `remove(key, options?)` | `Promise<void>` |
|
|
180
|
+
| `has(key, options?)` | `Promise<boolean>` |
|
|
181
|
+
| `keys(pattern?, options?)` | `Promise<string[]>` |
|
|
182
|
+
| `clear(options?)` | `Promise<void>` |
|
|
183
|
+
| `query<T>(condition, options?)` | `Promise<Array<{ key, value }>>` |
|
|
184
|
+
| `subscribe(cb, options?)` | `UnsubscribeFunction` |
|
|
185
|
+
| `getSync`/`setSync`/`removeSync`/`hasSync`/`keysSync`/`clearSync` | sync equivalents (2.5.0) |
|
|
186
|
+
| `snapshot(options?)` / `restore(snapshot, options?)` | `Promise<string>` / `Promise<void>` (2.5.0) |
|
|
187
|
+
| `getTTL`/`extendTTL`/`persist` | TTL management |
|
|
188
|
+
| `registerAdapter(adapter)` | `void` |
|
|
189
|
+
|
|
190
|
+
## Troubleshooting
|
|
191
|
+
|
|
192
|
+
| Issue | Solution |
|
|
193
|
+
|-------|----------|
|
|
194
|
+
| Framework import fails | Ensure `strata-storage >= 2.5.0` (earlier versions never shipped the built entry points). |
|
|
195
|
+
| "does not support synchronous operations" | The targeted adapter is async-only; use the async API or a sync-capable adapter. |
|
|
196
|
+
| Sync set throws on encrypt/compress | Encryption/compression are async — use `await storage.set(...)`. |
|
|
197
|
+
| `useStrata must be used within <StrataProvider>` | Use `createStrataHooks(instance)` for provider-free code. |
|
|
198
|
+
| Native storage not working | Register Capacitor adapters explicitly; verify on a real device. |
|
|
199
|
+
| URL too long warning | URL adapter is for small state; move bulk data to indexedDB/localStorage. |
|
|
200
|
+
|
|
201
|
+
## Links
|
|
202
|
+
|
|
203
|
+
- [README](./README.md)
|
|
204
|
+
- [Changelog](./CHANGELOG.md)
|
|
205
|
+
- [Core API](./docs/api/core/strata.md)
|
|
206
|
+
- [URL Adapter](./docs/api/adapters/web/url.md)
|
|
207
|
+
- [Recovery & Integrity](./docs/api/features/recovery.md)
|
|
208
|
+
- [GitHub](https://github.com/aoneahsan/strata-storage)
|