strata-storage 2.8.3 → 2.8.5

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.
@@ -1,6 +1,6 @@
1
1
  # AI Integration Guide - strata-storage
2
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.8.3**.
3
+ Quick reference for AI development agents (Claude Code, Cursor, Copilot, etc.) to integrate `strata-storage` into web and mobile projects. Current version: **2.8.5**.
4
4
 
5
5
  ## Installation
6
6
 
package/CHANGELOG.md ADDED
@@ -0,0 +1,465 @@
1
+ # Changelog
2
+
3
+ All notable changes to Strata Storage will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [2.8.5] - 2026-07-25
9
+
10
+ ### Fixed
11
+
12
+ - **The README stated the previous version.** The at-a-glance `Version` row is a static duplicate of
13
+ `package.json.version`, so it drifted the moment the version was bumped — it shipped stale in eight of the
14
+ fleet's packages at once. The row, and any native version string, now move with the release.
15
+
16
+ ## [2.8.4] - 2026-07-25
17
+
18
+ Documentation, metadata and packaging pass — **no runtime code changes**, no API changes. Brings the
19
+ package to the house documentation standard and closes three packaging defects.
20
+
21
+ ### Fixed
22
+
23
+ - **`dist/package.json` no longer declares `name: "strata-storage"`.** The build wrote a complete second
24
+ manifest into `dist/`, carrying the package name and version. Two manifests sharing one name means
25
+ `cd dist && npm publish` succeeds and ships the wrong tree under the real package name — the structural
26
+ cause of the 2.8.2 incident. `dist/package.json` is now a two-field module marker
27
+ (`{ "type": "module", "sideEffects": false }`), so that publish fails immediately for want of a name.
28
+ Resolution is unaffected: it is governed entirely by the root manifest's `exports` map.
29
+ - **`funding` added** to `package.json`, so npm and `npm fund` surface the support link.
30
+ - **`CHANGELOG.md` now ships in the tarball.** It was absent from the `files` allowlist and npm does not
31
+ add it automatically, so installed copies had no version history. `README.md` and `LICENSE` are now
32
+ listed explicitly too.
33
+ - **`homepage` points at the documentation site** (`stratastorage-docs.aoneahsan.com`) rather than the
34
+ marketing site, so npmjs.com's primary link lands on the docs. The marketing site remains linked from
35
+ the README.
36
+ - **`repository.url` uses the `git+https://` form** npm expects for a git remote.
37
+
38
+ ### Changed
39
+
40
+ - **README rewritten to the canonical package pattern** — anchored, linkable sections; a table of
41
+ contents; absolute links throughout (npm renders the README outside the repo, where relative links are
42
+ dead); and new **Limitations** and **Troubleshooting** sections that state plainly what the package does
43
+ not do: ESM-only, no automated test suite, non-cryptographic integrity checksums, minimal Node support,
44
+ and the open `ISSUE-01` empty-prefix defect with its `prefix` mitigation.
45
+ - **`description` shortened** to `One storage API across web, iOS and Android — zero runtime
46
+ dependencies.`, matching the README's one-line promise.
47
+ - **`keywords` trimmed from 16 to 12** and normalised to lower case.
48
+ - **`.npmignore` deleted.** `files` is an allowlist and already governed the tarball completely — verified
49
+ by comparing `npm pack --dry-run` file lists with and without the file, which were identical. Keeping a
50
+ denylist alongside it only risks disagreement.
51
+ - **`dist/README.md` is no longer generated**, removing a duplicate copy of the largest text file in the
52
+ tarball.
53
+ - Added `assets/logo.svg` as the brand master, and `docs/PACKAGES.md` as the dependency inventory.
54
+
55
+ ## [2.8.3] - 2026-07-25
56
+
57
+ Documentation and metadata release — **no runtime code changes**, no API changes. Restores the
58
+ documentation that 2.8.2 reverted, and repoints the docs links at the standalone documentation site.
59
+
60
+ ### Fixed
61
+
62
+ - **Restored the native-setup documentation that 2.8.2 dropped.** The README and the AI Integration
63
+ Guide again document the required `npx cap sync` step and the `registerCapacitorAdapters(storage)`
64
+ helper. Without `cap sync` the native adapters (`secure`, `sqlite`, `preferences`, `filesystem`) do
65
+ not work on-device, so 2.8.2 shipped a materially misleading omission for Capacitor apps.
66
+ - **`bugs.url` routes to GitHub Issues again** (`https://github.com/aoneahsan/strata-storage/issues`),
67
+ as in 2.8.1. The marketing-site contact form remains a secondary channel.
68
+ - Corrected stale version strings — the README still advertised `2.8.0`.
69
+
70
+ ### Changed
71
+
72
+ - **The documentation site now lives in its own repository:**
73
+ [aoneahsan/strata-storage-docs](https://github.com/aoneahsan/strata-storage-docs) →
74
+ <https://stratastorage-docs.aoneahsan.com>. README links now point at the hosted site instead of
75
+ in-repo `./docs` paths, and this repository's `docs/` holds internal records only.
76
+
77
+ ## [2.8.2] - 2026-06-30
78
+
79
+ ⚠️ **Published in error — superseded by 2.8.3. Prefer 2.8.1 or 2.8.3.**
80
+ **Deprecated on npm 2026-07-25**, so installing it now prints a warning pointing at 2.8.3.
81
+
82
+ Released ~55 minutes after 2.8.1 from a stale working tree. The compiled output is byte-identical to
83
+ 2.8.1 (no runtime code changed, no API changed), but the **bundled documentation reverted to a
84
+ pre-2.8.1 state**: the `npx cap sync` native-setup step and the `registerCapacitorAdapters()` helper
85
+ were removed from both the README and the AI Integration Guide, and `bugs.url` was pointed at the
86
+ marketing-site contact form. The version bump was never committed or tagged here, which is why this
87
+ file carried no entry for it until 2.8.3 reconstructed one by diffing the published tarballs.
88
+
89
+ ## [2.8.1] - 2026-06-30
90
+
91
+ Documentation and metadata release — **no runtime code changes**, no API changes. Safe drop-in
92
+ upgrade from 2.8.0.
93
+
94
+ ### Changed
95
+
96
+ - **Bug reports now route to GitHub Issues.** `package.json` `bugs.url` →
97
+ `https://github.com/aoneahsan/strata-storage/issues`, and the README "Support" section leads with
98
+ opening a GitHub issue (the marketing-site contact form remains a secondary channel).
99
+ - **AI Integration Guide refreshed to 2.8.1** and made more complete for AI coding agents:
100
+ the Capacitor section now documents the required `npx cap sync` native-setup step and the
101
+ `registerCapacitorAdapters(storage)` helper, and a troubleshooting entry covers the TypeScript
102
+ `moduleResolution: "bundler" | "nodenext"` requirement for the typed subpath exports
103
+ (`strata-storage/react` · `/vue` · `/angular` · `/capacitor` · `/firebase`).
104
+ - **README** gained a `npx cap sync` note in the iOS/Android section, an explicit GitHub repo link,
105
+ and a cleaned-up Links/Support section (removed a stray internal auto-generated links block).
106
+
107
+ ## [2.8.0] - 2026-06-27
108
+
109
+ Licensing change — **Strata Storage is now released under the MIT License** (relicensed from
110
+ Apache-2.0). MIT is the most widely adopted permissive open-source license, with no patent or
111
+ attribution-in-docs clauses; the only condition is retaining the copyright and license notice. This
112
+ is a *loosening* of terms and requires no code changes on your part.
113
+
114
+ ### Changed
115
+
116
+ - **License: Apache-2.0 → MIT.** The `LICENSE` file now contains the standard MIT text, and the
117
+ `license` field in `package.json` is `"MIT"`. The previous non-standard "Additional Terms" appended
118
+ to the Apache license have been removed; the "Strata Storage" name remains a trademark of the
119
+ maintainer (covered by trademark law, not the code license). Versions published at or before 2.7.1
120
+ remain available under Apache-2.0 — only 2.8.0 and later are MIT.
121
+ - **Repository secret posture for public release.** `.gitignore` now ignores real `.env` files and
122
+ tracks only `*.env.example` templates (the repo previously tracked real env files as a private
123
+ repo). A pre-publication audit of the working tree and full git history confirmed no real secrets
124
+ are present.
125
+
126
+ ## [2.7.1] - 2026-06-25
127
+
128
+ Correctness release: an internal audit found several defects in 2.7.0 —
129
+ including a broken TypeScript types entry, a silent compression data-loss bug,
130
+ and a TTL-expiry crash — all fixed here. No manual migration is required
131
+ (legacy compressed values still decode).
132
+
133
+ ### Fixed
134
+
135
+ - **Published types were unusable** — `dist/index.d.ts` re-exported from a
136
+ non-existent `./types.js`, so `import type { … } from 'strata-storage'` failed
137
+ to compile for every TypeScript consumer under `nodenext`/`bundler`. The build
138
+ now resolves directory-barrel imports to `/index.js`.
139
+ - **Compression silently corrupted non-Latin1 data** — the bundled LZ codec
140
+ misread any character ≥ U+0100 (CJK, emoji, many symbols) above the
141
+ compression threshold, returning garbage or throwing on read. The codec now
142
+ operates over UTF-8 bytes with fixed-width tokens. Values compressed by ≤ 2.7.0
143
+ still decode via a legacy read path, so **no data migration is needed**.
144
+ - **TTL expiry could crash** — reading an expired entry on
145
+ localStorage/sessionStorage/cookie recursed `getSync → removeSync` into a stack
146
+ overflow (Cache hung asynchronously). This fired on its own via the periodic
147
+ TTL cleanup. Removal now reads the raw stored value without re-triggering the
148
+ expiry path, and only when a change listener needs the old value.
149
+ - **Firebase** — Firestore/Realtime writes threw on `undefined` wrapper fields
150
+ (`expires`/`tags`/`metadata` on a plain write); those are now stripped before
151
+ writing. `enableFirebaseSync()` now attaches the adapters to the active set, so
152
+ a top-level `subscribe()`/`keys()`/`clear()`/`size()` includes them
153
+ immediately.
154
+ - **Namespace isolation** — keys containing `:` could collide across namespaces
155
+ (`ns 'a' + key 'b:c'` vs `ns 'a:b' + key 'c'`); namespace prefixes are now
156
+ encoded so they can never alias.
157
+ - **Default storage** — a bare `new Strata({})` / `defineStorage()` with no
158
+ config defaulted to memory-only; it now prefers persistent backends first
159
+ (`localStorage → indexedDB → sessionStorage → memory`), matching the default
160
+ `storage` singleton and the documented behavior.
161
+ - **Conflict resolution** — the default `'latest'` cross-tab strategy now keeps
162
+ the most-recent write by timestamp (tabs converge) instead of last-received.
163
+ - **Cross-tab `clear()`** now propagates to non-localStorage backends
164
+ (memory/indexedDB/cache), matching `set`/`remove`.
165
+ - **Failed `initialize()`** no longer caches the rejection permanently — a later
166
+ call can retry.
167
+ - **Query** — `$nin` now handles array-valued fields correctly; exclusion-mode
168
+ projection (`{ field: 0 }`) now actually excludes; projection paths are
169
+ prototype-pollution-safe. `clear({ expiredOnly })` now reclaims rows on SQLite.
170
+ - **Migration** — rolling back across a migration with no `down()` now throws
171
+ instead of silently lowering the stored version without reverting data.
172
+ - **TTL `expireAfter`** is now past-guarded like `expireAt`, and the pre-init
173
+ expiration fallback matches `TTLManager` precedence.
174
+ - **Cookie & Cache adapters** now use the shared serialize/deserialize, so
175
+ `Date`/`Map`/`Set` values round-trip with the same fidelity as localStorage.
176
+ - **Memory adapter** clones via `structuredClone`, so `Map`/`Set`/typed arrays
177
+ round-trip (its advertised `binary: true` now holds).
178
+ - **Cookie** rejects key names containing cookie-separator or control characters
179
+ (cookie-attribute / extra-cookie injection hardening).
180
+
181
+ ### Documentation
182
+
183
+ - Rewrote the Docusaurus API reference and AI-agent docs to match the real API:
184
+ corrected the error-class hierarchy (all extend `StrataError`), the `query()`
185
+ data model (matches the decoded value's bare fields — wrapper fields aren't
186
+ queryable), TTL/sync/compression config field names, the `StorageChange` shape
187
+ (no `type` field), the real React/Vue hooks, and the valid import subpaths.
188
+ Removed inaccurate API references throughout the guides and examples.
189
+ - `llms-full.txt` is now regenerated by the docs `build` script (the `prebuild`
190
+ hook did not run under Yarn 4), so it cannot go stale.
191
+
192
+ ## [2.7.0] - 2026-06-24
193
+
194
+ Audit-driven correctness and truthfulness release: documented behavior now
195
+ matches the code across the core engine, web/native adapters, and integrations.
196
+
197
+ ### Fixed
198
+ - Combined `compress` + `encrypt` write/read pipeline now round-trips correctly.
199
+ - `clear({ olderThan })` is honored instead of being ignored.
200
+ - Key/value validation is enforced (invalid keys/values are rejected clearly).
201
+ - `close()` now resets internal state so the instance can be re-initialized.
202
+ - `import()` and `snapshot()`/`restore()` round-trip metadata (TTL, tags, etc.).
203
+ - Auto-backup no longer self-nests (backups of backups).
204
+ - `QueryOptions` (`limit`/`skip`/`sort`/`select`) are honored by `query()`.
205
+ - `query()` now decodes (deserialize/decompress/decrypt) returned results.
206
+ - Multi-adapter TTL cleanup runs across every registered adapter.
207
+ - Namespace key isolation is implemented (namespaced keys no longer collide).
208
+ - Encryption works in Node/SSR (no reliance on browser-only globals).
209
+ - Plugin web option forwarding: web plugin now forwards per-call options.
210
+ - `SessionStorageAdapter` uses the shared serialize helper (consistent encoding).
211
+ - iOS preferences are scoped to the plugin (no full `UserDefaults` domain wipe).
212
+ - Android secure storage rejects API < 23 with a clear error (secure storage
213
+ requires API 23+).
214
+ - Android filesystem adapter uses atomic writes (staging + rename).
215
+ - Android preferences/secure adapters round-trip the full `StorageValue` wrapper.
216
+ - `scripts/configure.js` ESM fix.
217
+
218
+ ### Changed
219
+ - Default storage preference order is now persistent-first.
220
+ - **Compression is restricted to the `lz` algorithm** — `gzip` was never
221
+ implemented; the option type is now `algorithm?: 'lz'`.
222
+ - SQLite `transactional` flag is set to `false` (batch writes are best-effort,
223
+ not wrapped in a single transaction).
224
+ - Lint configuration split for clearer rule scoping.
225
+ - `firebase` is declared as an optional peer dependency.
226
+ - Added a `./package.json` entry to the package `exports` map.
227
+
228
+ ### Removed
229
+ - Dead `strategy` config option and the unused `StorageStrategy` type
230
+ (type cleanup; this never affected runtime behavior).
231
+
232
+ ### Security
233
+ - **Authenticated AES-CBC (Encrypt-then-MAC).** CBC-encrypted payloads now carry
234
+ an HMAC-SHA256 tag over `iv ‖ ciphertext` (computed with a separate,
235
+ domain-separated derived key) that is verified *before* decryption, closing a
236
+ ciphertext-malleability gap. **Breaking for pre-existing CBC ciphertexts
237
+ only**: data written before this release has no tag and now fails closed with
238
+ a clear "re-encrypt" error on read. **AES-GCM data — the default — is
239
+ unaffected.** Migration: re-encrypt affected values (read with the old build,
240
+ write with the new one) or switch them to GCM.
241
+ - **PBKDF2 default raised to 600,000 iterations** (was 100,000). Backward
242
+ compatible — the iteration count stored with each ciphertext is used on
243
+ decrypt, so existing data still opens.
244
+ - **Password no longer retained as a key-cache key** — derived-key cache entries
245
+ are keyed by a hash, not the raw passphrase.
246
+ - **`generatePassword` is now unbiased** (rejection sampling instead of modulo).
247
+ - **Cross-tab sync hardening** — origin IDs use `crypto.randomUUID()` and inbound
248
+ `BroadcastChannel` messages are validated before use.
249
+ - **Query `getNestedValue` matches own properties only** (no prototype-chain
250
+ traversal).
251
+ - **SQLite identifiers are validated and rejected, not sanitized.** `database`
252
+ and `table` (the only values that cannot be SQL-bound) must match
253
+ `^[A-Za-z_][A-Za-z0-9_]*$`; a non-conforming name is rejected with a clear
254
+ error at the public boundary instead of being silently stripped. The native
255
+ iOS/Android layers apply the same allow-list as defense-in-depth. All other
256
+ values remain bound parameters.
257
+
258
+ ### Performance
259
+ - **SQLite `keys()`/`query()` no longer do an N+1 of native round-trips.** The
260
+ native layer filters expired rows in SQL and `query()` returns the full value
261
+ wrapper for every non-expired row in a single round-trip; the adapter dropped
262
+ its per-key `get()` loops. A new native `cleanupExpired` reclaims expired rows
263
+ in one `DELETE` on the TTL tick.
264
+ - **Native adapters skip the read-before-write when nobody is observing.**
265
+ `set()`/`remove()` only fetch the previous value (an extra bridge round-trip)
266
+ when a change subscriber is attached.
267
+
268
+ ## [2.6.1] - 2026-05-29
269
+
270
+ ### Documentation
271
+ - README and `AI-INTEGRATION-GUIDE.md` refreshed to surface the 2.6.0 features
272
+ that landed but were not yet covered in the bundled docs: SQLite multi-store
273
+ (`(database, table)` isolation), the native filesystem backend, and the
274
+ `size(true)` byte breakdown. Both now link the new
275
+ `docs/guides/platforms/device-verification.md`.
276
+ - The `package-polish-v2.5` tracker's `phase09.5` items are marked shipped
277
+ (delivered in 2.6.0); kept for resumable history.
278
+
279
+ ### Maintenance
280
+ - Bumped 5 devDependencies to their latest patches: `@angular/common`,
281
+ `@angular/core`, `@angular/forms` 21.2.14 → 21.2.15;
282
+ `eslint-plugin-prettier` 5.5.5 → 5.5.6; `vue` 3.5.34 → 3.5.35. devDeps only,
283
+ no runtime change.
284
+
285
+ ### Notes
286
+ - **No runtime or API change vs 2.6.0.** This release republishes the package
287
+ with up-to-date bundled documentation so consumers browsing npm see the
288
+ current feature set. The native iOS/Android code paths still require
289
+ on-device verification (see device-verification guide).
290
+
291
+ ## [2.6.0] - 2026-05-27
292
+
293
+ ### Added
294
+ - **SQLite multi-store** — the `database` and `table` options are now honored on
295
+ iOS and Android, so multiple independent SQLite stores (distinct database files
296
+ and/or tables) no longer collapse into a single physical table. Use separate
297
+ `defineStorage` instances (or distinct `database`/`table` config) to keep
298
+ stores isolated.
299
+ - **Native filesystem backend** — `FilesystemAdapter` now works on iOS and
300
+ Android (it was previously unavailable on every platform). One file per key
301
+ under the app's documents/files directory (`strata_storage/`), storing the full
302
+ value wrapper as JSON, with atomic writes; `isAvailable()` now returns `true`.
303
+ - **`size(true)`** — native SQLite and filesystem backends now
304
+ return the `{ keys, values, metadata }` byte breakdown (the flag was previously
305
+ ignored, returning only `{ total, count }`).
306
+
307
+ ### Fixed
308
+ - **SQLite value round-trip** — native `get` now returns the full `StorageValue`
309
+ wrapper (`{ value, created, updated, expires, tags, metadata }`) instead of a
310
+ raw blob, so TTL, tags, and metadata survive a write→read cycle on iOS and
311
+ Android. Corrupt/legacy rows are treated as a miss instead of throwing.
312
+ - **Filesystem key/temp-file collision** — in-flight temp files now live in a
313
+ reserved staging subdirectory, so a key whose name resembles a temp file (e.g.
314
+ `"backup.tmp"`) is never skipped by `keys()`/`size()` or wrongly deleted by
315
+ `clear()`.
316
+ - **`size().total` consistency** — native backends now include key bytes in
317
+ `total`, matching the web adapters' convention.
318
+ - **iOS SQLite bind safety** — text/blob binds use `SQLITE_TRANSIENT`, removing a
319
+ latent use-after-free for transient Swift buffers.
320
+
321
+ ### Changed
322
+ - **`androidx.security:security-crypto`** upgraded `1.1.0-alpha06` → `1.1.0`
323
+ (stable). The `EncryptedSharedPreferences` / `MasterKey` API is unchanged.
324
+ - The native SQLite database file now resolves from the `database` option
325
+ (default `strata_storage` → `strata_storage.db`); table identifiers are
326
+ sanitized to `[A-Za-z0-9_]`. Stored values remain bound parameters.
327
+ - Marketing website tooling migrated to Yarn 4 (Corepack).
328
+
329
+ ### Notes
330
+ - The native iOS/Android changes in this release are code-complete and reviewed
331
+ but require on-device verification — follow
332
+ `docs/guides/platforms/device-verification.md`. Web/browser functionality is
333
+ validated by the quality gates (typecheck + build + lint); the project ships no
334
+ automated test runner.
335
+
336
+ ## [2.5.0] - 2026-05-26
337
+
338
+ ### Added
339
+ - **Framework-agnostic, provider-free usage** — `defineStorage()` returns a
340
+ ready-to-use instance you can create once and use anywhere, with no
341
+ Provider/DI required (Zustand-style). `createStrataHooks(instance)` (React),
342
+ `createStrataComposables(instance)` (Vue), and `provideStrata(instance)`
343
+ (Angular) bind to a created instance; the Provider/Plugin/Service APIs remain
344
+ optional.
345
+ - **Synchronous API** — `getSync`/`setSync`/`removeSync`/`hasSync`/`keysSync`/
346
+ `clearSync` for sync-capable adapters (memory, localStorage, sessionStorage,
347
+ cookies, url). Async-only backends (indexedDB, cache, native) throw a clear
348
+ error; sync set with encrypt/compress also throws (those are async).
349
+ - **URL-state adapter** (`URLAdapter`) — persist state in the query string
350
+ (default) or hash fragment, with `popstate`/`hashchange` change events.
351
+ - **Disaster recovery** (all opt-in) — FNV-1a integrity checksums with
352
+ corruption detection, durable write-verify-readback, mirroring to backup
353
+ adapters with read-repair, and `snapshot()`/`restore()` plus scheduled
354
+ `autoBackup`.
355
+ - Exported integrity helpers (`computeChecksum`/`verifyChecksum`) and error
356
+ classes (e.g. `IntegrityError`) for `instanceof` use.
357
+
358
+ ### Fixed
359
+ - **The React/Vue/Angular entry points are now actually built and shipped** —
360
+ `strata-storage/react|vue|angular` previously resolved to files that were
361
+ never compiled into `dist/`, so every framework import failed.
362
+ - Multi-adapter operations (`keys`/`clear`/`size`/`subscribe` with no explicit
363
+ `storage`) now span all registered adapters instead of only the default.
364
+ - Cross-tab sync now applies received changes to local memory/IndexedDB/cache
365
+ adapters (previously broadcasts were sent but never applied).
366
+ - AES-CBC now uses a correct 16-byte IV.
367
+ - Security: prototype-pollution guards in deep-merge/import/restore, ReDoS-capped
368
+ regex, and `SameSite=Lax` + automatic `Secure` cookie defaults.
369
+ - iOS native plugin now registers with Capacitor (it had no registration and was
370
+ non-functional); added missing native methods on iOS and Android; Keychain
371
+ accessibility hardened.
372
+
373
+ ### Changed
374
+ - All diagnostic output now routes through a level-gated internal logger
375
+ (default `warn`); the library no longer writes to the consumer console by
376
+ default. Toggle with `new Strata({ debug: { enabled: true } })`.
377
+ - Dependencies updated to latest stable (including TypeScript 6 and ESLint 10).
378
+ The default instance initializes lazily, so importing the package performs no
379
+ I/O. Current quality gates are typecheck, build, lint, and CI; the project no
380
+ longer ships an automated test runner.
381
+
382
+ ## [2.1.0] - 2024-01-30
383
+
384
+ ### Added
385
+ - Complete native iOS implementation (Swift)
386
+ - Complete native Android implementation (Java)
387
+ - Enhanced error messages for platform-specific functions
388
+ - Comprehensive JSDoc documentation for all public APIs
389
+ - Pattern matching support for `keys()` and `clear()` methods
390
+ - Prefix support for clearing storage
391
+ - Apache 2.0 license with patent protection
392
+ - Security policy (SECURITY.md)
393
+ - Contributing guidelines (CONTRIBUTING.md)
394
+ - Support documentation (SUPPORT.md)
395
+ - Code of Conduct
396
+ - Issue templates
397
+
398
+ ### Fixed
399
+ - iOS and Android method signature consistency
400
+ - Android constructor issues for SharedPreferences and EncryptedStorage
401
+ - TypeScript type warnings throughout codebase
402
+ - Platform detection for Capacitor environment
403
+ - Web plugin error messages now suggest alternatives
404
+
405
+ ### Changed
406
+ - License from MIT to Apache 2.0
407
+ - Documentation moved to organized folders (.github/, docs/)
408
+ - Improved README with comprehensive feature links
409
+ - Project status updated to "Production Ready"
410
+
411
+ ### Documentation
412
+ - Added caching patterns guide
413
+ - Added session management patterns
414
+ - Added TTL feature documentation
415
+ - Enhanced all adapter documentation
416
+ - Improved API reference with examples
417
+
418
+ ## [2.0.4] - 2024-01-29
419
+
420
+ ### Added
421
+ - Provider-less architecture (like Zustand)
422
+ - Zero-dependency implementation
423
+ - Dynamic adapter loading
424
+ - Comprehensive documentation structure
425
+
426
+ ### Fixed
427
+ - Bundle size optimizations
428
+ - Tree-shaking improvements
429
+
430
+ ## [2.0.2] - 2024-01-28
431
+
432
+ ### Fixed
433
+ - Added missing LICENSE file
434
+ - Added .npmignore file to exclude unnecessary files from npm package
435
+
436
+ ## [2.0.1] - 2025-08-06
437
+
438
+ ### Fixed
439
+ - Fixed BaseAdapter and StorageAdapter interface mismatch where `subscribe` and `close` methods were incorrectly marked as optional
440
+ - Fixed adapter initialization flow to prevent double initialization
441
+ - Fixed "No available storage adapters found" error by improving adapter detection and initialization
442
+ - Memory adapter now correctly works as fallback
443
+ - Improved error messages to show which adapters were tried and which are registered
444
+
445
+ ### Added
446
+ - Complete React + Capacitor example app with comprehensive testing interface
447
+ - Test coverage for all web storage adapters (Memory, LocalStorage, SessionStorage, IndexedDB, Cache, Cookies)
448
+ - Visual test interface showing real-time operation status
449
+ - Support for Android and iOS platforms in example app
450
+
451
+ ### Changed
452
+ - Default storage preference order now includes multiple fallbacks: memory, localStorage, sessionStorage, indexedDB
453
+ - Singleton storage instance now properly initializes on first use
454
+ - Better TypeScript types for storage operations
455
+
456
+ ### Documentation
457
+ - Added comprehensive example app documentation
458
+ - Updated README with link to working example
459
+ - Added test results showing all adapters working correctly
460
+
461
+ ## [2.0.0] - Initial 2.x release
462
+ - Initial implementation of Strata Storage
463
+ - Zero-dependency architecture
464
+ - Universal storage API
465
+ - Multiple adapter support