@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 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
- * **Important:** Writing directly to a physical store bypasses the Repository {@link DataSet} layer.
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 {@link DataSet} method instead via `getDataSetFor()`.
72
+ * use the corresponding `DataSet` method instead via `getDataSetFor()` from `@furystack/repository`.
71
73
  *
72
- * @see {@link DataSet} for the authorized, event-emitting write gateway
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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"}
@@ -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;;;;;;;OAOG;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"}
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"}
@@ -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
@@ -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;;;;;;;OAOG;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;AAzDY,YAAY;IADxB,UAAU,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC;GACzB,YAAY,CAyDxB"}
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.0",
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.0",
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
- * **Important:** Writing directly to a physical store bypasses the Repository {@link DataSet} layer.
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 {@link DataSet} method instead via `getDataSetFor()`.
98
+ * use the corresponding `DataSet` method instead via `getDataSetFor()` from `@furystack/repository`.
97
99
  *
98
- * @see {@link DataSet} for the authorized, event-emitting write gateway
100
+ * @see `DataSet` from `@furystack/repository` for the authorized, event-emitting write gateway
99
101
  */
100
102
  export interface PhysicalStore<
101
103
  T,
@@ -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
- * @param model The Constructable object
41
- * @param primaryKey The Primary Key field
42
- * @throws if the Store is not registered
43
- * @returns a Store object
44
- */
45
- public getStoreFor<T, TPrimaryKey extends keyof T, TType extends PhysicalStore<T, TPrimaryKey>>(
46
- model: Constructable<T>,
47
- primaryKey: TPrimaryKey,
48
- ) {
49
- const instance = this.stores.get(model)
50
- if (!instance) {
51
- throw Error(`Store not found for '${model.name}'`)
52
- }
53
- if (primaryKey !== instance.primaryKey) {
54
- throw Error('Primary keys not match')
55
- }
56
- return instance as TType
57
- }
58
-
59
- /**
60
- * Adds a store instance to the StoreManager class
61
- * @param store The store to add
62
- * @returns the StoreManager instance for chaining
63
- */
64
- public addStore<T, TPrimaryKey extends keyof T>(store: PhysicalStore<T, TPrimaryKey>) {
65
- this.stores.set(store.model, store as PhysicalStore<any, any>)
66
- return this
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
+ }