@furystack/filesystem-store
Version:
Simple File System store implementation for FuryStack
195 lines (108 loc) • 6.02 kB
Markdown
# Changelog
## [8.1.1] - 2026-06-05
### 👷 CI
- Raised the minimum supported Node.js to `>=24.0.0` (Node 24 LTS) in `engines`, dropping Node 22.
### ⬆️ Dependencies
- Bumped dev `vitest` to `^4.1.8`. No source changes — dev-tooling bump only.
## [8.1.0] - 2026-05-21
### ✨ Features
### New `onLoadError` event
`FileSystemStore` now exposes an `onLoadError` event on its `EventHub`. The constructor schedules the initial reload in the background, and the FS watcher triggers a reload on every external change — failures from either path used to surface only as unhandled promise rejections. They are now emitted via `onLoadError` so consumers can log, retry, or fall back without monkey-patching.
```ts
const store = new FileSystemStore({ model: Item, fileName: '/srv/data.json', primaryKey: 'id' })
store.addListener('onLoadError', ({ error }) => log.error('store reload failed', { error }))
```
### ♻️ Refactoring
### `hasChanges` is now read-only; `tick` is private
`FileSystemStore.hasChanges` is now a getter backed by the private `_hasChanges` field — external mutation was always a footgun (the dirty flag is owned by `add` / `update` / `remove` / `saveChanges`) and is now a type error. The internal `tick` interval handle was demoted from `public` to `private` for the same reason. No supported call site mutated either, so this is a safety tightening rather than a behavior change.
### ⬆️ Dependencies
- Bump dev `vitest` to `^4.1.5`.
- Bumped `@types/node` to `^25.9.1` and `vitest` to `^4.1.7`. No source changes — dev-tooling bump only.
### 📚 Documentation
- Rewrote JSDoc on `FileSystemStore` and `defineFileSystemStore` to follow the new value-test guidance: dropped restate-the-type narration, called out the init-race contract (calls before the background reload resolves see an empty cache), the `ENOENT` swallow on first run, and the requirement to `await` the async dispose to avoid lost writes.
## [8.0.0] - 2026-04-25
### 💥 Breaking Changes
Stores are now first-class DI tokens. See the [v7 migration guide](../../docs/migrations/v7-functional-di.md) for rationale, recipes, and pitfalls.
- Removed `useFileSystemStore(...)`. Declare the store at module scope with `defineFileSystemStore<T, PK>({ name, model, primaryKey, fileName, tickMs? })` — the returned `StoreToken<T, PK>` is self-disposing.
- Disposal (tick interval, file-system watcher, final flush) now runs through the token's `onDispose` hook on injector teardown.
## [7.1.7] - 2026-04-17
### ⬆️ Dependencies
- Raised `@types/node` to ^25.6.0, `typescript` to ^6.0.3, and `vitest` to ^4.1.4 so package development matches the workspace toolchain.
## [7.1.6] - 2026-03-27
### ⬆️ Dependencies
- Updated `vitest` to ^4.1.2
## [7.1.5] - 2026-03-25
### 📦 Build
- Removed deprecated `baseUrl` from tsconfig.json for TypeScript 6 compatibility
### ⬆️ Dependencies
- Upgraded `typescript` from ^5.9.3 to ^6.0.2
- Upgraded `vitest` from ^4.1.0 to ^4.1.1
## [7.1.4] - 2026-03-19
### ✨ Features
- Updated `@furystack/core` dependency to the latest major version.
- Added `onWatcherError` event for file system watcher failures.
### ⬆️ Dependencies
- Upgraded `vite` from ^7.3.1 to ^8.0.0 for improved build performance and new features
- Upgraded `vitest` from ^4.0.18 to ^4.1.0
- Upgraded `@vitest/coverage-istanbul` from ^4.0.18 to ^4.1.0
## [7.1.3] - 2026-03-10
### ⬆️ Dependencies
- Updated `@furystack/core` dependency to the new major version
## [7.1.2] - 2026-03-07
### ⬆️ Dependencies
- Updated `@types/node` from `^25.3.1` to `^25.3.5`
## [7.1.1] - 2026-03-06
### 🧪 Tests
- Refactored `FileSystemStore` watcher error test to use `using()` wrapper for proper disposal, ensuring cleanup even if assertions fail
## [7.1.0] - 2026-03-03
### ✨ Features
### `onWatcherError` event for file system watcher failures
`FileSystemStore` now emits an `onWatcherError` event when registering the file system watcher fails, replacing silent error swallowing.
```typescript
const store = new FileSystemStore({
fileName: '/data/entities.json',
primaryKey: 'id',
model: MyEntity,
})
store.addListener('onWatcherError', ({ error }) => {
console.error('File watcher registration failed:', error)
})
```
- Added `onListenerError` to the event map for consistent EventHub error handling
## [7.0.40] - 2026-02-26
### ⬆️ Dependencies
- Updated internal `@furystack/*` dependencies
- Bumped `@types/node` from ^25.3.0 to ^25.3.1
## [7.0.39] - 2026-02-26
### 📝 Documentation
- Added tip about wrapping the physical store with a Repository DataSet for application-level data access
## [7.0.38] - 2026-02-22
### ⬆️ Dependencies
- Updated `@furystack/core` dependency
## [7.0.37] - 2026-02-19
### ⬆️ Dependencies
- Updated `@furystack/core`
## [7.0.36] - 2026-02-11
### ♻️ Refactoring
- Removed semaphore-based file locking from all store operations (`get`, `add`, `find`, `count`, `remove`, `update`, `saveChanges`, `reloadData`). Operations now delegate directly to the in-memory store without lock wrapping.
### 🧪 Tests
- Wrapped `FileSystemStore` instances in `usingAsync()` to ensure cleanup runs even when assertions fail
### ⬆️ Dependencies
- Bump `vitest` from `^4.0.17` to `^4.0.18`
- Bump `@types/node` from `^25.0.10` to `^25.2.3`
- Removed `semaphore-async-await` dependency
## [7.0.35] - 2026-02-09
### ⬆️ Dependencies
- Updated `@furystack/core` dependency
- Updated `@furystack/*` dependencies
## [7.0.34] - 2026-01-26
### 🔧 Chores
- Standardized author format, improved keywords, removed obsolete `gitHead`, added `engines` (Node 22+) and `sideEffects: false`
## [7.0.33] - 2026-01-26
### ⬆️ Dependencies
- Updated `@furystack/inject` with fix for singleton injector reference being overwritten by child injectors
## [7.0.32] - 2026-01-22
### ⬆️ Dependencies
- Dependency updates
### 🔧 Chores
- Migrated to centralized changelog management system