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.
Files changed (111) hide show
  1. package/AI-INTEGRATION-GUIDE.md +208 -0
  2. package/README.md +427 -181
  3. package/android/AGENTS.md +34 -0
  4. package/android/CLAUDE.md +51 -0
  5. package/android/src/main/java/com/strata/storage/SQLiteStorage.java +35 -0
  6. package/android/src/main/java/com/stratastorage/StrataStoragePlugin.java +191 -27
  7. package/dist/README.md +427 -181
  8. package/dist/adapters/capacitor/FilesystemAdapter.d.ts.map +1 -1
  9. package/dist/adapters/capacitor/FilesystemAdapter.js +2 -1
  10. package/dist/adapters/capacitor/PreferencesAdapter.d.ts.map +1 -1
  11. package/dist/adapters/capacitor/PreferencesAdapter.js +2 -1
  12. package/dist/adapters/capacitor/SecureAdapter.d.ts.map +1 -1
  13. package/dist/adapters/capacitor/SecureAdapter.js +2 -1
  14. package/dist/adapters/capacitor/SqliteAdapter.d.ts.map +1 -1
  15. package/dist/adapters/capacitor/SqliteAdapter.js +2 -1
  16. package/dist/adapters/web/CacheAdapter.d.ts.map +1 -1
  17. package/dist/adapters/web/CacheAdapter.js +11 -3
  18. package/dist/adapters/web/CookieAdapter.d.ts +37 -1
  19. package/dist/adapters/web/CookieAdapter.d.ts.map +1 -1
  20. package/dist/adapters/web/CookieAdapter.js +89 -9
  21. package/dist/adapters/web/IndexedDBAdapter.d.ts.map +1 -1
  22. package/dist/adapters/web/IndexedDBAdapter.js +10 -2
  23. package/dist/adapters/web/LocalStorageAdapter.d.ts +31 -0
  24. package/dist/adapters/web/LocalStorageAdapter.d.ts.map +1 -1
  25. package/dist/adapters/web/LocalStorageAdapter.js +92 -19
  26. package/dist/adapters/web/MemoryAdapter.d.ts +24 -0
  27. package/dist/adapters/web/MemoryAdapter.d.ts.map +1 -1
  28. package/dist/adapters/web/MemoryAdapter.js +69 -18
  29. package/dist/adapters/web/SessionStorageAdapter.d.ts +24 -0
  30. package/dist/adapters/web/SessionStorageAdapter.d.ts.map +1 -1
  31. package/dist/adapters/web/SessionStorageAdapter.js +71 -9
  32. package/dist/adapters/web/URLAdapter.d.ts +59 -0
  33. package/dist/adapters/web/URLAdapter.d.ts.map +1 -0
  34. package/dist/adapters/web/URLAdapter.js +234 -0
  35. package/dist/adapters/web/index.d.ts +1 -0
  36. package/dist/adapters/web/index.d.ts.map +1 -1
  37. package/dist/adapters/web/index.js +1 -0
  38. package/dist/android/AGENTS.md +34 -0
  39. package/dist/android/CLAUDE.md +51 -0
  40. package/dist/android/src/main/java/com/strata/storage/SQLiteStorage.java +35 -0
  41. package/dist/android/src/main/java/com/stratastorage/StrataStoragePlugin.java +191 -27
  42. package/dist/capacitor.d.ts.map +1 -1
  43. package/dist/capacitor.js +2 -1
  44. package/dist/config/support.d.ts +10 -0
  45. package/dist/config/support.d.ts.map +1 -0
  46. package/dist/config/support.js +9 -0
  47. package/dist/core/BaseAdapter.d.ts +8 -0
  48. package/dist/core/BaseAdapter.d.ts.map +1 -1
  49. package/dist/core/BaseAdapter.js +34 -14
  50. package/dist/core/Strata.d.ts +56 -2
  51. package/dist/core/Strata.d.ts.map +1 -1
  52. package/dist/core/Strata.js +501 -53
  53. package/dist/features/encryption.d.ts.map +1 -1
  54. package/dist/features/encryption.js +3 -2
  55. package/dist/features/integrity.d.ts +16 -0
  56. package/dist/features/integrity.d.ts.map +1 -0
  57. package/dist/features/integrity.js +28 -0
  58. package/dist/features/observer.d.ts.map +1 -1
  59. package/dist/features/observer.js +2 -1
  60. package/dist/features/query.d.ts +7 -1
  61. package/dist/features/query.d.ts.map +1 -1
  62. package/dist/features/query.js +9 -2
  63. package/dist/features/sync.d.ts.map +1 -1
  64. package/dist/features/sync.js +4 -3
  65. package/dist/index.d.ts +35 -2
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +55 -30
  68. package/dist/integrations/angular/index.d.ts +158 -0
  69. package/dist/integrations/angular/index.d.ts.map +1 -0
  70. package/dist/integrations/angular/index.js +395 -0
  71. package/dist/integrations/index.d.ts +15 -0
  72. package/dist/integrations/index.d.ts.map +1 -0
  73. package/dist/integrations/index.js +18 -0
  74. package/dist/integrations/react/index.d.ts +75 -0
  75. package/dist/integrations/react/index.d.ts.map +1 -0
  76. package/dist/integrations/react/index.js +191 -0
  77. package/dist/integrations/vue/index.d.ts +103 -0
  78. package/dist/integrations/vue/index.d.ts.map +1 -0
  79. package/dist/integrations/vue/index.js +274 -0
  80. package/dist/ios/AGENTS.md +33 -0
  81. package/dist/ios/CLAUDE.md +49 -0
  82. package/dist/ios/Plugin/KeychainStorage.swift +139 -50
  83. package/dist/ios/Plugin/SQLiteStorage.swift +40 -0
  84. package/dist/ios/Plugin/StrataStoragePlugin.m +23 -0
  85. package/dist/ios/Plugin/StrataStoragePlugin.swift +201 -52
  86. package/dist/package.json +21 -5
  87. package/dist/plugin/index.d.ts.map +1 -1
  88. package/dist/plugin/index.js +2 -1
  89. package/dist/types/index.d.ts +58 -9
  90. package/dist/types/index.d.ts.map +1 -1
  91. package/dist/types/index.js +0 -13
  92. package/dist/utils/errors.d.ts +7 -0
  93. package/dist/utils/errors.d.ts.map +1 -1
  94. package/dist/utils/errors.js +15 -3
  95. package/dist/utils/index.d.ts +63 -5
  96. package/dist/utils/index.d.ts.map +1 -1
  97. package/dist/utils/index.js +109 -16
  98. package/dist/utils/logger.d.ts +31 -0
  99. package/dist/utils/logger.d.ts.map +1 -0
  100. package/dist/utils/logger.js +63 -0
  101. package/ios/AGENTS.md +33 -0
  102. package/ios/CLAUDE.md +49 -0
  103. package/ios/Plugin/KeychainStorage.swift +139 -50
  104. package/ios/Plugin/SQLiteStorage.swift +40 -0
  105. package/ios/Plugin/StrataStoragePlugin.m +23 -0
  106. package/ios/Plugin/StrataStoragePlugin.swift +201 -52
  107. package/package.json +35 -23
  108. package/scripts/build.js +16 -5
  109. package/scripts/configure.js +2 -6
  110. package/scripts/postinstall.js +2 -2
  111. 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)