@furystack/core 15.2.0 → 15.2.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/CHANGELOG.md +16 -0
- package/esm/models/physical-store.d.ts +5 -3
- package/esm/models/physical-store.d.ts.map +1 -1
- package/esm/store-manager.d.ts +6 -0
- package/esm/store-manager.d.ts.map +1 -1
- package/esm/store-manager.js +6 -0
- package/esm/store-manager.js.map +1 -1
- package/package.json +2 -2
- package/src/models/physical-store.ts +5 -3
- package/src/store-manager.ts +74 -68
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [15.2.2] - 2026-02-26
|
|
4
|
+
|
|
5
|
+
### 🔧 Chores
|
|
6
|
+
|
|
7
|
+
- Normalized line endings in `store-manager.ts`
|
|
8
|
+
|
|
9
|
+
### ⬆️ Dependencies
|
|
10
|
+
|
|
11
|
+
- Bumped `@types/node` from ^25.3.0 to ^25.3.1
|
|
12
|
+
|
|
13
|
+
## [15.2.1] - 2026-02-26
|
|
14
|
+
|
|
15
|
+
### 📝 Documentation
|
|
16
|
+
|
|
17
|
+
- Added JSDoc recommendations to `PhysicalStore` and `StoreManager.getStoreFor()` pointing to `DataSet` as the preferred write gateway for application-level code
|
|
18
|
+
|
|
3
19
|
## [15.2.0] - 2026-02-22
|
|
4
20
|
|
|
5
21
|
### ✨ Features
|
|
@@ -64,12 +64,14 @@ export declare const selectFields: <T extends object, TField extends Array<keyof
|
|
|
64
64
|
/**
|
|
65
65
|
* Interface that defines a physical store implementation.
|
|
66
66
|
*
|
|
67
|
-
* **
|
|
67
|
+
* **Recommended:** `DataSet` from `@furystack/repository` is the preferred write gateway for application-level code.
|
|
68
|
+
*
|
|
69
|
+
* **Important:** Writing directly to a physical store bypasses the Repository `DataSet` layer.
|
|
68
70
|
* This means authorization, modification hooks, and DataSet events (used by entity sync) will **not** be triggered.
|
|
69
71
|
* For any write operation that should be observable by other parts of the system (e.g. entity sync, audit logging),
|
|
70
|
-
* use the corresponding
|
|
72
|
+
* use the corresponding `DataSet` method instead via `getDataSetFor()` from `@furystack/repository`.
|
|
71
73
|
*
|
|
72
|
-
* @see
|
|
74
|
+
* @see `DataSet` from `@furystack/repository` for the authorized, event-emitting write gateway
|
|
73
75
|
*/
|
|
74
76
|
export interface PhysicalStore<T, TPrimaryKey extends keyof T, TWriteableData = WithOptionalId<T, TPrimaryKey>> extends EventHub<{
|
|
75
77
|
onEntityAdded: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"physical-store.d.ts","sourceRoot":"","sources":["../../src/models/physical-store.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"physical-store.d.ts","sourceRoot":"","sources":["../../src/models/physical-store.ts"],"names":[],"mappings":"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"}
|
package/esm/store-manager.d.ts
CHANGED
|
@@ -12,6 +12,12 @@ export declare class StoreManager implements AsyncDisposable {
|
|
|
12
12
|
/**
|
|
13
13
|
* Returns a store model for a constructable object.
|
|
14
14
|
* Throws error if no store is registered
|
|
15
|
+
*
|
|
16
|
+
* **Note:** For application-level data access, prefer `getDataSetFor` from `@furystack/repository`.
|
|
17
|
+
* Writing through the DataSet ensures authorization, modification hooks, and change events
|
|
18
|
+
* (required for entity sync) are properly triggered.
|
|
19
|
+
* This method is intended for internal use by `Repository.createDataSet` and for physical store tests.
|
|
20
|
+
*
|
|
15
21
|
* @param model The Constructable object
|
|
16
22
|
* @param primaryKey The Primary Key field
|
|
17
23
|
* @throws if the Store is not registered
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-manager.d.ts","sourceRoot":"","sources":["../src/store-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D;;GAEG;AACH,qBACa,YAAa,YAAW,eAAe;IAClD;;OAEG;IACU,CAAC,MAAM,CAAC,YAAY,CAAC;IAoBlC,OAAO,CAAC,MAAM,CAAkE;IAEhF
|
|
1
|
+
{"version":3,"file":"store-manager.d.ts","sourceRoot":"","sources":["../src/store-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAItD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE/D;;GAEG;AACH,qBACa,YAAa,YAAW,eAAe;IAClD;;OAEG;IACU,CAAC,MAAM,CAAC,YAAY,CAAC;IAoBlC,OAAO,CAAC,MAAM,CAAkE;IAEhF;;;;;;;;;;;;;OAaG;IACI,WAAW,CAAC,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC,EAAE,KAAK,SAAS,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC,EAC5F,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,EACvB,UAAU,EAAE,WAAW,GASJ,KAAK;IAG1B;;;;OAIG;IACI,QAAQ,CAAC,CAAC,EAAE,WAAW,SAAS,MAAM,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,WAAW,CAAC;CAIrF"}
|
package/esm/store-manager.js
CHANGED
|
@@ -33,6 +33,12 @@ let StoreManager = class StoreManager {
|
|
|
33
33
|
/**
|
|
34
34
|
* Returns a store model for a constructable object.
|
|
35
35
|
* Throws error if no store is registered
|
|
36
|
+
*
|
|
37
|
+
* **Note:** For application-level data access, prefer `getDataSetFor` from `@furystack/repository`.
|
|
38
|
+
* Writing through the DataSet ensures authorization, modification hooks, and change events
|
|
39
|
+
* (required for entity sync) are properly triggered.
|
|
40
|
+
* This method is intended for internal use by `Repository.createDataSet` and for physical store tests.
|
|
41
|
+
*
|
|
36
42
|
* @param model The Constructable object
|
|
37
43
|
* @param primaryKey The Primary Key field
|
|
38
44
|
* @throws if the Store is not registered
|
package/esm/store-manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store-manager.js","sourceRoot":"","sources":["../src/store-manager.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D;;GAEG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB;;OAEG;IACI,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CACrC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;YACvD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACzB,CAAC;YACD,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAA;YACpC,CAAC;QACH,CAAC,CAAC,CACH,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAA;QAC3D,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,eAAe,CAC/B,uCAAuC,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChH,KAAK,CACN,CAAA;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IACO,MAAM,GAAyD,IAAI,GAAG,EAAE,CAAA;IAEhF
|
|
1
|
+
{"version":3,"file":"store-manager.js","sourceRoot":"","sources":["../src/store-manager.ts"],"names":[],"mappings":";;;;;;AACA,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAA;AAG9D;;GAEG;AAEI,IAAM,YAAY,GAAlB,MAAM,YAAY;IACvB;;OAEG;IACI,KAAK,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CACrC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;YACvD,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAA;YACzB,CAAC;YACD,IAAI,iBAAiB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAA;YACpC,CAAC;QACH,CAAC,CAAC,CACH,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAA;QAC3D,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,KAAK,GAAG,IAAI,eAAe,CAC/B,uCAAuC,KAAK,CAAC,MAAM,YAAY,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAgB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAChH,KAAK,CACN,CAAA;YACD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;IACO,MAAM,GAAyD,IAAI,GAAG,EAAE,CAAA;IAEhF;;;;;;;;;;;;;OAaG;IACI,WAAW,CAChB,KAAuB,EACvB,UAAuB;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,CAAC,wBAAwB,KAAK,CAAC,IAAI,GAAG,CAAC,CAAA;QACpD,CAAC;QACD,IAAI,UAAU,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC;YACvC,MAAM,KAAK,CAAC,wBAAwB,CAAC,CAAA;QACvC,CAAC;QACD,OAAO,QAAiB,CAAA;IAC1B,CAAC;IAED;;;;OAIG;IACI,QAAQ,CAAiC,KAAoC;QAClF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,KAAgC,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AA/DY,YAAY;IADxB,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,YAAY,CA+DxB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@furystack/core",
|
|
3
|
-
"version": "15.2.
|
|
3
|
+
"version": "15.2.2",
|
|
4
4
|
"description": "Core FuryStack package",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
},
|
|
47
47
|
"homepage": "https://github.com/furystack/furystack",
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@types/node": "^25.3.
|
|
49
|
+
"@types/node": "^25.3.1",
|
|
50
50
|
"typescript": "^5.9.3",
|
|
51
51
|
"vitest": "^4.0.18"
|
|
52
52
|
},
|
|
@@ -90,12 +90,14 @@ export const selectFields = <T extends object, TField extends Array<keyof T>>(en
|
|
|
90
90
|
/**
|
|
91
91
|
* Interface that defines a physical store implementation.
|
|
92
92
|
*
|
|
93
|
-
* **
|
|
93
|
+
* **Recommended:** `DataSet` from `@furystack/repository` is the preferred write gateway for application-level code.
|
|
94
|
+
*
|
|
95
|
+
* **Important:** Writing directly to a physical store bypasses the Repository `DataSet` layer.
|
|
94
96
|
* This means authorization, modification hooks, and DataSet events (used by entity sync) will **not** be triggered.
|
|
95
97
|
* For any write operation that should be observable by other parts of the system (e.g. entity sync, audit logging),
|
|
96
|
-
* use the corresponding
|
|
98
|
+
* use the corresponding `DataSet` method instead via `getDataSetFor()` from `@furystack/repository`.
|
|
97
99
|
*
|
|
98
|
-
* @see
|
|
100
|
+
* @see `DataSet` from `@furystack/repository` for the authorized, event-emitting write gateway
|
|
99
101
|
*/
|
|
100
102
|
export interface PhysicalStore<
|
|
101
103
|
T,
|
package/src/store-manager.ts
CHANGED
|
@@ -1,68 +1,74 @@
|
|
|
1
|
-
import type { Constructable } from '@furystack/inject'
|
|
2
|
-
import { Injectable } from '@furystack/inject'
|
|
3
|
-
import { isAsyncDisposable, isDisposable } from '@furystack/utils'
|
|
4
|
-
import { AggregatedError } from './errors/aggregated-error.js'
|
|
5
|
-
import type { PhysicalStore } from './models/physical-store.js'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Manager class for store instances
|
|
9
|
-
*/
|
|
10
|
-
@Injectable({ lifetime: 'singleton' })
|
|
11
|
-
export class StoreManager implements AsyncDisposable {
|
|
12
|
-
/**
|
|
13
|
-
* Disposes the StoreManager and all store instances
|
|
14
|
-
*/
|
|
15
|
-
public async [Symbol.asyncDispose]() {
|
|
16
|
-
const result = await Promise.allSettled(
|
|
17
|
-
[...this.stores.entries()].map(async ([_model, store]) => {
|
|
18
|
-
if (isDisposable(store)) {
|
|
19
|
-
store[Symbol.dispose]()
|
|
20
|
-
}
|
|
21
|
-
if (isAsyncDisposable(store)) {
|
|
22
|
-
await store[Symbol.asyncDispose]()
|
|
23
|
-
}
|
|
24
|
-
}),
|
|
25
|
-
)
|
|
26
|
-
const fails = result.filter((r) => r.status === 'rejected')
|
|
27
|
-
if (fails && fails.length) {
|
|
28
|
-
const error = new AggregatedError(
|
|
29
|
-
`There was an error during disposing ${fails.length} stores: ${fails.map((f) => f.reason as string).join(', ')}`,
|
|
30
|
-
fails,
|
|
31
|
-
)
|
|
32
|
-
throw error
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
private stores: Map<Constructable<unknown>, PhysicalStore<any, any>> = new Map()
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Returns a store model for a constructable object.
|
|
39
|
-
* Throws error if no store is registered
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
1
|
+
import type { Constructable } from '@furystack/inject'
|
|
2
|
+
import { Injectable } from '@furystack/inject'
|
|
3
|
+
import { isAsyncDisposable, isDisposable } from '@furystack/utils'
|
|
4
|
+
import { AggregatedError } from './errors/aggregated-error.js'
|
|
5
|
+
import type { PhysicalStore } from './models/physical-store.js'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Manager class for store instances
|
|
9
|
+
*/
|
|
10
|
+
@Injectable({ lifetime: 'singleton' })
|
|
11
|
+
export class StoreManager implements AsyncDisposable {
|
|
12
|
+
/**
|
|
13
|
+
* Disposes the StoreManager and all store instances
|
|
14
|
+
*/
|
|
15
|
+
public async [Symbol.asyncDispose]() {
|
|
16
|
+
const result = await Promise.allSettled(
|
|
17
|
+
[...this.stores.entries()].map(async ([_model, store]) => {
|
|
18
|
+
if (isDisposable(store)) {
|
|
19
|
+
store[Symbol.dispose]()
|
|
20
|
+
}
|
|
21
|
+
if (isAsyncDisposable(store)) {
|
|
22
|
+
await store[Symbol.asyncDispose]()
|
|
23
|
+
}
|
|
24
|
+
}),
|
|
25
|
+
)
|
|
26
|
+
const fails = result.filter((r) => r.status === 'rejected')
|
|
27
|
+
if (fails && fails.length) {
|
|
28
|
+
const error = new AggregatedError(
|
|
29
|
+
`There was an error during disposing ${fails.length} stores: ${fails.map((f) => f.reason as string).join(', ')}`,
|
|
30
|
+
fails,
|
|
31
|
+
)
|
|
32
|
+
throw error
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
private stores: Map<Constructable<unknown>, PhysicalStore<any, any>> = new Map()
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Returns a store model for a constructable object.
|
|
39
|
+
* Throws error if no store is registered
|
|
40
|
+
*
|
|
41
|
+
* **Note:** For application-level data access, prefer `getDataSetFor` from `@furystack/repository`.
|
|
42
|
+
* Writing through the DataSet ensures authorization, modification hooks, and change events
|
|
43
|
+
* (required for entity sync) are properly triggered.
|
|
44
|
+
* This method is intended for internal use by `Repository.createDataSet` and for physical store tests.
|
|
45
|
+
*
|
|
46
|
+
* @param model The Constructable object
|
|
47
|
+
* @param primaryKey The Primary Key field
|
|
48
|
+
* @throws if the Store is not registered
|
|
49
|
+
* @returns a Store object
|
|
50
|
+
*/
|
|
51
|
+
public getStoreFor<T, TPrimaryKey extends keyof T, TType extends PhysicalStore<T, TPrimaryKey>>(
|
|
52
|
+
model: Constructable<T>,
|
|
53
|
+
primaryKey: TPrimaryKey,
|
|
54
|
+
) {
|
|
55
|
+
const instance = this.stores.get(model)
|
|
56
|
+
if (!instance) {
|
|
57
|
+
throw Error(`Store not found for '${model.name}'`)
|
|
58
|
+
}
|
|
59
|
+
if (primaryKey !== instance.primaryKey) {
|
|
60
|
+
throw Error('Primary keys not match')
|
|
61
|
+
}
|
|
62
|
+
return instance as TType
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Adds a store instance to the StoreManager class
|
|
67
|
+
* @param store The store to add
|
|
68
|
+
* @returns the StoreManager instance for chaining
|
|
69
|
+
*/
|
|
70
|
+
public addStore<T, TPrimaryKey extends keyof T>(store: PhysicalStore<T, TPrimaryKey>) {
|
|
71
|
+
this.stores.set(store.model, store as PhysicalStore<any, any>)
|
|
72
|
+
return this
|
|
73
|
+
}
|
|
74
|
+
}
|