@veams/status-quo 1.4.0 → 1.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.
- package/README.md +4 -3
- package/dist/store/__tests__/observable-state-handler.spec.js +4 -4
- package/dist/store/__tests__/observable-state-handler.spec.js.map +1 -1
- package/dist/store/__tests__/signal-state-handler.spec.js +4 -4
- package/dist/store/base-state-handler.d.ts +2 -1
- package/dist/store/base-state-handler.js +5 -2
- package/dist/store/base-state-handler.js.map +1 -1
- package/dist/store/observable-state-handler.js +0 -5
- package/dist/store/observable-state-handler.js.map +1 -1
- package/dist/store/signal-state-handler.js +1 -0
- package/dist/store/signal-state-handler.js.map +1 -1
- package/package.json +1 -1
- package/playground/src/App.tsx +1 -2
- package/src/store/__tests__/observable-state-handler.spec.ts +4 -4
- package/src/store/__tests__/signal-state-handler.spec.ts +4 -4
- package/src/store/base-state-handler.ts +13 -4
- package/src/store/observable-state-handler.ts +0 -6
- package/src/store/signal-state-handler.ts +1 -0
package/README.md
CHANGED
|
@@ -195,8 +195,7 @@ class AppSignalStore extends SignalStateHandler<AppState, AppActions> {
|
|
|
195
195
|
|
|
196
196
|
this.bindSubscribable(
|
|
197
197
|
{ subscribe: this.combined.subscribe.bind(this.combined), getSnapshot: () => this.combined.value },
|
|
198
|
-
(nextState) => this.setState(nextState, 'sync-combined')
|
|
199
|
-
(value) => value
|
|
198
|
+
(nextState) => this.setState(nextState, 'sync-combined')
|
|
200
199
|
);
|
|
201
200
|
}
|
|
202
201
|
}
|
|
@@ -421,8 +420,10 @@ Protected helpers:
|
|
|
421
420
|
- `getStateValue(): S` (abstract)
|
|
422
421
|
- `setStateValue(next: S): void` (abstract)
|
|
423
422
|
- `initDevTools(options?: { enabled?: boolean; namespace: string }): void`
|
|
423
|
+
- `bindSubscribable<T>(service: { subscribe: (listener: (value: T) => void) => () => void; getSnapshot?: () => T }, onChange: (value: T) => void, selector?: (value: T) => T, isEqual?: (current: T, next: T) => boolean): void`
|
|
424
424
|
- `bindSubscribable<T, Sel>(service: { subscribe: (listener: (value: T) => void) => () => void; getSnapshot?: () => T }, onChange: (value: Sel) => void, selector: (value: T) => Sel, isEqual?: (current: Sel, next: Sel) => boolean): void`
|
|
425
425
|
- Registers the subscription on `this.subscriptions` and invokes `onChange` with the current snapshot when available.
|
|
426
|
+
- If `selector` is omitted, identity selection is used.
|
|
426
427
|
- `onChange` is only called when selected value changes according to `isEqual` (default `Object.is`).
|
|
427
428
|
|
|
428
429
|
### `ObservableStateHandler<S, A>`
|
|
@@ -459,7 +460,7 @@ Public methods:
|
|
|
459
460
|
Notes:
|
|
460
461
|
- The observable stream uses `distinctUntilChanged` by default.
|
|
461
462
|
- Distinct behavior can be configured globally via `setupStatusQuo` or per handler via `options.distinct`.
|
|
462
|
-
- `subscribe`
|
|
463
|
+
- `subscribe` fires immediately with the current snapshot and then on subsequent changes.
|
|
463
464
|
- Subscribers receive the next state snapshot as a callback argument.
|
|
464
465
|
|
|
465
466
|
### `SignalStateHandler<S, A>`
|
|
@@ -94,7 +94,7 @@ describe('Observable State Handler', () => {
|
|
|
94
94
|
test: 'test2',
|
|
95
95
|
});
|
|
96
96
|
unsubscribe();
|
|
97
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
97
|
+
expect(spy).toHaveBeenCalledTimes(3); // 1. initial, 2. test (first setter), 3. test2 (second setter)
|
|
98
98
|
});
|
|
99
99
|
it('should respect global distinct setup when disabled', () => {
|
|
100
100
|
setupStatusQuo({
|
|
@@ -108,7 +108,7 @@ describe('Observable State Handler', () => {
|
|
|
108
108
|
handler.setState({ test: 'same' });
|
|
109
109
|
handler.setState({ test: 'same' });
|
|
110
110
|
unsubscribe();
|
|
111
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
111
|
+
expect(spy).toHaveBeenCalledTimes(3);
|
|
112
112
|
});
|
|
113
113
|
it('should respect global custom distinct comparator from setupStatusQuo', () => {
|
|
114
114
|
setupStatusQuo({
|
|
@@ -124,7 +124,7 @@ describe('Observable State Handler', () => {
|
|
|
124
124
|
handler.setState({ test2: 'newValue2' });
|
|
125
125
|
handler.setState({ test: 'newValue' });
|
|
126
126
|
unsubscribe();
|
|
127
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
127
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
128
128
|
});
|
|
129
129
|
it('should prefer per-handler distinct options over global setup', () => {
|
|
130
130
|
setupStatusQuo({
|
|
@@ -142,7 +142,7 @@ describe('Observable State Handler', () => {
|
|
|
142
142
|
handler.setState({ test: 'same' });
|
|
143
143
|
handler.setState({ test: 'same' });
|
|
144
144
|
unsubscribe();
|
|
145
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
145
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
146
146
|
});
|
|
147
147
|
});
|
|
148
148
|
//# sourceMappingURL=observable-state-handler.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-state-handler.spec.js","sourceRoot":"","sources":["../../../src/store/__tests__/observable-state-handler.spec.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"observable-state-handler.spec.js","sourceRoot":"","sources":["../../../src/store/__tests__/observable-state-handler.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -140,7 +140,7 @@ describe('Signal State Handler', () => {
|
|
|
140
140
|
test: 'test2',
|
|
141
141
|
});
|
|
142
142
|
unsubscribe();
|
|
143
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
143
|
+
expect(spy).toHaveBeenCalledTimes(3);
|
|
144
144
|
});
|
|
145
145
|
it('should respect global distinct setup when disabled', () => {
|
|
146
146
|
setupStatusQuo({
|
|
@@ -154,7 +154,7 @@ describe('Signal State Handler', () => {
|
|
|
154
154
|
handler.setState({ test: 'same' });
|
|
155
155
|
handler.setState({ test: 'same' });
|
|
156
156
|
unsubscribe();
|
|
157
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
157
|
+
expect(spy).toHaveBeenCalledTimes(3);
|
|
158
158
|
});
|
|
159
159
|
it('should respect global custom distinct comparator from setupStatusQuo', () => {
|
|
160
160
|
setupStatusQuo({
|
|
@@ -170,7 +170,7 @@ describe('Signal State Handler', () => {
|
|
|
170
170
|
handler.setState({ test2: 'newValue2' });
|
|
171
171
|
handler.setState({ test: 'newValue' });
|
|
172
172
|
unsubscribe();
|
|
173
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
173
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
174
174
|
});
|
|
175
175
|
it('should prefer per-handler distinct options over global setup', () => {
|
|
176
176
|
setupStatusQuo({
|
|
@@ -188,7 +188,7 @@ describe('Signal State Handler', () => {
|
|
|
188
188
|
handler.setState({ test: 'same' });
|
|
189
189
|
handler.setState({ test: 'same' });
|
|
190
190
|
unsubscribe();
|
|
191
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
191
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
192
192
|
});
|
|
193
193
|
it('should notify another signal state handler for each singleton counter update', () => {
|
|
194
194
|
const counterSingleton = makeStateSingleton(() => new CounterSignalStateHandler(0), {
|
|
@@ -24,7 +24,8 @@ export declare abstract class BaseStateHandler<S, A> implements StateSubscriptio
|
|
|
24
24
|
destroy(): void;
|
|
25
25
|
protected abstract getStateValue(): S;
|
|
26
26
|
protected abstract setStateValue(nextState: S): void;
|
|
27
|
-
protected bindSubscribable<T
|
|
27
|
+
protected bindSubscribable<T>(service: Subscribable<T>, onChange: (value: T) => void, selector?: Selector<T, T>, isEqual?: EqualityFn<T>): void;
|
|
28
|
+
protected bindSubscribable<T, Sel>(service: Subscribable<T>, onChange: (value: Sel) => void, selector: Selector<T, Sel>, isEqual?: EqualityFn<Sel>): void;
|
|
28
29
|
abstract subscribe(listener: () => void): () => void;
|
|
29
30
|
abstract subscribe(listener: (value: S) => void): () => void;
|
|
30
31
|
abstract getActions(): A;
|
|
@@ -55,9 +55,12 @@ export class BaseStateHandler {
|
|
|
55
55
|
this.subscriptions.forEach((subscription) => subscription.unsubscribe());
|
|
56
56
|
}
|
|
57
57
|
bindSubscribable(service, onChange, selector, isEqual = Object.is) {
|
|
58
|
+
const selectorFn = (selector ?? ((value) => value));
|
|
58
59
|
const selectorCache = createSelectorCache();
|
|
60
|
+
let receivedSyncValue = false;
|
|
59
61
|
const notifySelectedValue = (value) => {
|
|
60
|
-
|
|
62
|
+
receivedSyncValue = true;
|
|
63
|
+
const { value: nextSelection, hasChanged } = selectWithCache(selectorCache, value, selectorFn, isEqual);
|
|
61
64
|
if (!hasChanged) {
|
|
62
65
|
return;
|
|
63
66
|
}
|
|
@@ -65,7 +68,7 @@ export class BaseStateHandler {
|
|
|
65
68
|
};
|
|
66
69
|
const unsubscribe = service.subscribe(notifySelectedValue);
|
|
67
70
|
this.subscriptions = [...(this.subscriptions ?? []), { unsubscribe }];
|
|
68
|
-
if (service.getSnapshot)
|
|
71
|
+
if (service.getSnapshot && !receivedSyncValue)
|
|
69
72
|
notifySelectedValue(service.getSnapshot());
|
|
70
73
|
}
|
|
71
74
|
handleDevToolsEvents = (message) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-state-handler.js","sourceRoot":"","sources":["../../src/store/base-state-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAgBlF,MAAM,sBAAsB,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAEtE,MAAM,gBAAgB,GAAG;IACvB,KAAK,EAAE,IAAI;IACX,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,KAAK;CACZ,CAAC;AAEF,MAAM,OAAgB,gBAAgB;IACjB,YAAY,CAAI;IACzB,QAAQ,GAAoB,IAAI,CAAC;IAE3C,aAAa,GAAuC,EAAE,CAAC;IAEvD,YAAsB,YAAe;QACnC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAES,YAAY,CAAC,eAAiC;QACtD,MAAM,aAAa,GAAG;YACpB,GAAG,sBAAsB;YACzB,GAAG,eAAe;SACnB,CAAC;QAEF,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE;YAC9C,IAAI,EAAE,aAAa,CAAC,SAAS;YAC7B,UAAU,EAAE,aAAa,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;YACtE,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE;YACjC,QAAQ,EAAE,gBAAgB;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACtD,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;IAC9B,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,QAAoB,EAAE,UAAU,GAAG,QAAQ;QAClD,MAAM,SAAS,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,CAAC;QACtD,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;QAC9B,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,OAAO;QACL,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3E,CAAC;
|
|
1
|
+
{"version":3,"file":"base-state-handler.js","sourceRoot":"","sources":["../../src/store/base-state-handler.ts"],"names":[],"mappings":"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"}
|
|
@@ -36,12 +36,7 @@ export class ObservableStateHandler extends BaseStateHandler {
|
|
|
36
36
|
return this.getObservable(key);
|
|
37
37
|
}
|
|
38
38
|
subscribe(listener) {
|
|
39
|
-
let initialized = false;
|
|
40
39
|
const subscription = this.getStateAsObservable().subscribe((nextState) => {
|
|
41
|
-
if (!initialized) {
|
|
42
|
-
initialized = true;
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
40
|
listener(nextState);
|
|
46
41
|
});
|
|
47
42
|
return () => subscription.unsubscribe();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"observable-state-handler.js","sourceRoot":"","sources":["../../src/store/observable-state-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAmBxE,MAAM,OAAgB,sBAA6B,SAAQ,gBAAsB;IAC9D,MAAM,CAAqB;IAC3B,eAAe,CAA+C;IAE/E,YAAsB,EAAE,YAAY,EAAE,OAAO,EAAkC;QAC7E,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAI,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QACnG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAES,aAAa;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAES,aAAa,CAAC,SAAY;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED,wBAAwB,CAAC,GAAY;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,uBAAuB,CAAC,GAAG,CAAC,EAC5B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAC3B,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,UAAkC,EAAE;QACvD,MAAM,uBAAuB,GAC3B,OAAO,CAAC,uBAAuB,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAElE,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,oBAAoB,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;YACtC,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC,CACc,CAAC;IACrB,CAAC;IAED,aAAa,CAAC,GAAY;QACxB,OAAO,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,6CAA6C;IAC7C,iBAAiB,CAAC,GAAY;QAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAID,SAAS,CAAC,QAA4B;QACpC,
|
|
1
|
+
{"version":3,"file":"observable-state-handler.js","sourceRoot":"","sources":["../../src/store/observable-state-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAE3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAmBxE,MAAM,OAAgB,sBAA6B,SAAQ,gBAAsB;IAC9D,MAAM,CAAqB;IAC3B,eAAe,CAA+C;IAE/E,YAAsB,EAAE,YAAY,EAAE,OAAO,EAAkC;QAC7E,KAAK,CAAC,YAAY,CAAC,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,eAAe,CAAI,YAAY,CAAC,CAAC;QACnD,IAAI,CAAC,eAAe,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QACnG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAES,aAAa;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAChC,CAAC;IAES,aAAa,CAAC,SAAY;QAClC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC9B,CAAC;IAED,wBAAwB,CAAC,GAAY;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,uBAAuB,CAAC,GAAG,CAAC,EAC5B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAC3B,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,UAAkC,EAAE;QACvD,MAAM,uBAAuB,GAC3B,OAAO,CAAC,uBAAuB,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;QAElE,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC;QACrB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACrB,oBAAoB,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE;YACtC,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC,CACc,CAAC;IACrB,CAAC;IAED,aAAa,CAAC,GAAY;QACxB,OAAO,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,6CAA6C;IAC7C,iBAAiB,CAAC,GAAY;QAC5B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAID,SAAS,CAAC,QAA4B;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACvE,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -20,6 +20,7 @@ export class SignalStateHandler extends BaseStateHandler {
|
|
|
20
20
|
if (!initialized) {
|
|
21
21
|
initialized = true;
|
|
22
22
|
previousSnapshot = nextState;
|
|
23
|
+
listener(nextState);
|
|
23
24
|
return;
|
|
24
25
|
}
|
|
25
26
|
if (this.distinctOptions.enabled && this.distinctOptions.comparator(previousSnapshot, nextState)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-state-handler.js","sourceRoot":"","sources":["../../src/store/signal-state-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAiBxE,MAAM,OAAgB,kBAAyB,SAAQ,gBAAsB;IAC1D,KAAK,CAAY;IACjB,eAAe,CAA+C;IAE/E,YAAsB,EAAE,YAAY,EAAE,OAAO,EAA8B;QACzE,KAAK,CAAC,YAAY,CAAC,CAAC;QAEpB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAI,YAAY,CAAC,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QACnG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAID,SAAS,CAAC,QAA4B;QACpC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAExC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACxC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,WAAW,GAAG,IAAI,CAAC;gBACnB,gBAAgB,GAAG,SAAS,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAAE,CAAC;gBACjG,gBAAgB,GAAG,SAAS,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,gBAAgB,GAAG,SAAS,CAAC;YAC7B,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAES,aAAa;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAES,aAAa,CAAC,SAAY;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;IAC/B,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"signal-state-handler.js","sourceRoot":"","sources":["../../src/store/signal-state-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAiBxE,MAAM,OAAgB,kBAAyB,SAAQ,gBAAsB;IAC1D,KAAK,CAAY;IACjB,eAAe,CAA+C;IAE/E,YAAsB,EAAE,YAAY,EAAE,OAAO,EAA8B;QACzE,KAAK,CAAC,YAAY,CAAC,CAAC;QAEpB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAI,YAAY,CAAC,CAAC;QACrC,IAAI,CAAC,eAAe,GAAG,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,CAAC,CAAC;QACnG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAID,SAAS,CAAC,QAA4B;QACpC,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAExC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,EAAE;YACxC,IAAI,CAAC,WAAW,EAAE,CAAC;gBACjB,WAAW,GAAG,IAAI,CAAC;gBACnB,gBAAgB,GAAG,SAAS,CAAC;gBAC7B,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,IAAI,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,gBAAgB,EAAE,SAAS,CAAC,EAAE,CAAC;gBACjG,gBAAgB,GAAG,SAAS,CAAC;gBAC7B,OAAO;YACT,CAAC;YAED,gBAAgB,GAAG,SAAS,CAAC;YAC7B,QAAQ,CAAC,SAAS,CAAC,CAAC;QACtB,CAAC,CAAC,CAAC;IACL,CAAC;IAES,aAAa;QACrB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;IAC1B,CAAC;IAES,aAAa,CAAC,SAAY;QAClC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC;IAC/B,CAAC;CACF"}
|
package/package.json
CHANGED
package/playground/src/App.tsx
CHANGED
|
@@ -328,8 +328,7 @@ class AppSignalStore extends SignalStateHandler<AppState, AppActions> {
|
|
|
328
328
|
|
|
329
329
|
this.bindSubscribable(
|
|
330
330
|
{ subscribe: this.combined.subscribe.bind(this.combined), getSnapshot: () => this.combined.value },
|
|
331
|
-
(nextState) => this.setState(nextState, "sync-combined")
|
|
332
|
-
(value) => value
|
|
331
|
+
(nextState) => this.setState(nextState, "sync-combined")
|
|
333
332
|
);
|
|
334
333
|
}
|
|
335
334
|
}`;
|
|
@@ -127,7 +127,7 @@ describe('Observable State Handler', () => {
|
|
|
127
127
|
|
|
128
128
|
unsubscribe();
|
|
129
129
|
|
|
130
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
130
|
+
expect(spy).toHaveBeenCalledTimes(3); // 1. initial, 2. test (first setter), 3. test2 (second setter)
|
|
131
131
|
});
|
|
132
132
|
|
|
133
133
|
it('should respect global distinct setup when disabled', () => {
|
|
@@ -146,7 +146,7 @@ describe('Observable State Handler', () => {
|
|
|
146
146
|
|
|
147
147
|
unsubscribe();
|
|
148
148
|
|
|
149
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
149
|
+
expect(spy).toHaveBeenCalledTimes(3);
|
|
150
150
|
});
|
|
151
151
|
|
|
152
152
|
it('should respect global custom distinct comparator from setupStatusQuo', () => {
|
|
@@ -167,7 +167,7 @@ describe('Observable State Handler', () => {
|
|
|
167
167
|
|
|
168
168
|
unsubscribe();
|
|
169
169
|
|
|
170
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
170
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
171
171
|
});
|
|
172
172
|
|
|
173
173
|
it('should prefer per-handler distinct options over global setup', () => {
|
|
@@ -190,6 +190,6 @@ describe('Observable State Handler', () => {
|
|
|
190
190
|
|
|
191
191
|
unsubscribe();
|
|
192
192
|
|
|
193
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
193
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
194
194
|
});
|
|
195
195
|
});
|
|
@@ -200,7 +200,7 @@ describe('Signal State Handler', () => {
|
|
|
200
200
|
|
|
201
201
|
unsubscribe();
|
|
202
202
|
|
|
203
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
203
|
+
expect(spy).toHaveBeenCalledTimes(3);
|
|
204
204
|
});
|
|
205
205
|
|
|
206
206
|
it('should respect global distinct setup when disabled', () => {
|
|
@@ -219,7 +219,7 @@ describe('Signal State Handler', () => {
|
|
|
219
219
|
|
|
220
220
|
unsubscribe();
|
|
221
221
|
|
|
222
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
222
|
+
expect(spy).toHaveBeenCalledTimes(3);
|
|
223
223
|
});
|
|
224
224
|
|
|
225
225
|
it('should respect global custom distinct comparator from setupStatusQuo', () => {
|
|
@@ -240,7 +240,7 @@ describe('Signal State Handler', () => {
|
|
|
240
240
|
|
|
241
241
|
unsubscribe();
|
|
242
242
|
|
|
243
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
243
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
244
244
|
});
|
|
245
245
|
|
|
246
246
|
it('should prefer per-handler distinct options over global setup', () => {
|
|
@@ -263,7 +263,7 @@ describe('Signal State Handler', () => {
|
|
|
263
263
|
|
|
264
264
|
unsubscribe();
|
|
265
265
|
|
|
266
|
-
expect(spy).toHaveBeenCalledTimes(
|
|
266
|
+
expect(spy).toHaveBeenCalledTimes(2);
|
|
267
267
|
});
|
|
268
268
|
|
|
269
269
|
it('should notify another signal state handler for each singleton counter update', () => {
|
|
@@ -86,7 +86,13 @@ export abstract class BaseStateHandler<S, A> implements StateSubscriptionHandler
|
|
|
86
86
|
protected abstract getStateValue(): S;
|
|
87
87
|
protected abstract setStateValue(nextState: S): void;
|
|
88
88
|
|
|
89
|
-
protected bindSubscribable<T
|
|
89
|
+
protected bindSubscribable<T>(
|
|
90
|
+
service: Subscribable<T>,
|
|
91
|
+
onChange: (value: T) => void,
|
|
92
|
+
selector?: Selector<T, T>,
|
|
93
|
+
isEqual?: EqualityFn<T>
|
|
94
|
+
): void;
|
|
95
|
+
protected bindSubscribable<T, Sel>(
|
|
90
96
|
service: Subscribable<T>,
|
|
91
97
|
onChange: (value: Sel) => void,
|
|
92
98
|
selector: Selector<T, Sel>,
|
|
@@ -95,16 +101,19 @@ export abstract class BaseStateHandler<S, A> implements StateSubscriptionHandler
|
|
|
95
101
|
protected bindSubscribable<T, Sel = T>(
|
|
96
102
|
service: Subscribable<T>,
|
|
97
103
|
onChange: (value: Sel) => void,
|
|
98
|
-
selector
|
|
104
|
+
selector?: Selector<T, Sel>,
|
|
99
105
|
isEqual: EqualityFn<Sel> = Object.is
|
|
100
106
|
) {
|
|
107
|
+
const selectorFn = (selector ?? ((value: T) => value as unknown as Sel)) as Selector<T, Sel>;
|
|
101
108
|
const selectorCache = createSelectorCache<Sel>();
|
|
109
|
+
let receivedSyncValue = false;
|
|
102
110
|
|
|
103
111
|
const notifySelectedValue = (value: T) => {
|
|
112
|
+
receivedSyncValue = true;
|
|
104
113
|
const { value: nextSelection, hasChanged } = selectWithCache(
|
|
105
114
|
selectorCache,
|
|
106
115
|
value,
|
|
107
|
-
|
|
116
|
+
selectorFn,
|
|
108
117
|
isEqual
|
|
109
118
|
);
|
|
110
119
|
|
|
@@ -118,7 +127,7 @@ export abstract class BaseStateHandler<S, A> implements StateSubscriptionHandler
|
|
|
118
127
|
const unsubscribe = service.subscribe(notifySelectedValue);
|
|
119
128
|
this.subscriptions = [...(this.subscriptions ?? []), { unsubscribe }];
|
|
120
129
|
|
|
121
|
-
if (service.getSnapshot) notifySelectedValue(service.getSnapshot());
|
|
130
|
+
if (service.getSnapshot && !receivedSyncValue) notifySelectedValue(service.getSnapshot());
|
|
122
131
|
}
|
|
123
132
|
|
|
124
133
|
abstract subscribe(listener: () => void): () => void;
|
|
@@ -73,13 +73,7 @@ export abstract class ObservableStateHandler<S, A> extends BaseStateHandler<S, A
|
|
|
73
73
|
subscribe(listener: () => void): () => void;
|
|
74
74
|
subscribe(listener: (value: S) => void): () => void;
|
|
75
75
|
subscribe(listener: (value: S) => void) {
|
|
76
|
-
let initialized = false;
|
|
77
76
|
const subscription = this.getStateAsObservable().subscribe((nextState) => {
|
|
78
|
-
if (!initialized) {
|
|
79
|
-
initialized = true;
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
77
|
listener(nextState);
|
|
84
78
|
});
|
|
85
79
|
return () => subscription.unsubscribe();
|