@furystack/utils 4.0.17 → 6.0.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.
@@ -0,0 +1,16 @@
1
+ import type { Disposable } from './disposable.js';
2
+ type ListenerFunction<T extends string, EventTypeMap extends {
3
+ [K in T]: any;
4
+ }> = (arg: EventTypeMap[T]) => void;
5
+ export declare class EventHub<T extends string, EventTypeMap extends {
6
+ [K in T]: any;
7
+ }> implements Disposable {
8
+ private listeners;
9
+ addListener<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>): void;
10
+ removeListener<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>): void;
11
+ subscribe<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>): Disposable;
12
+ emit<TEvent extends T>(event: TEvent, arg: EventTypeMap[TEvent]): void;
13
+ dispose(): void;
14
+ }
15
+ export {};
16
+ //# sourceMappingURL=event-hub.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-hub.d.ts","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,KAAK,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,YAAY,SAAS;KAAG,CAAC,IAAI,CAAC,GAAG,GAAG;CAAE,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,IAAI,CAAA;AAEhH,qBAAa,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,YAAY,SAAS;KAAG,CAAC,IAAI,CAAC,GAAG,GAAG;CAAE,CAAE,YAAW,UAAU;IACnG,OAAO,CAAC,SAAS,CAAuD;IAEjE,WAAW,CAAC,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC;IAO7F,cAAc,CAAC,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC;IAMhG,SAAS,CAAC,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,UAAU;IAKxG,IAAI,CAAC,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,CAAC,MAAM,CAAC;IAM/D,OAAO;CAGf"}
@@ -0,0 +1,27 @@
1
+ export class EventHub {
2
+ listeners = new Map();
3
+ addListener(event, listener) {
4
+ if (!this.listeners.has(event)) {
5
+ this.listeners.set(event, new Set());
6
+ }
7
+ this.listeners.get(event).add(listener);
8
+ }
9
+ removeListener(event, listener) {
10
+ if (this.listeners.has(event)) {
11
+ this.listeners.get(event).delete(listener);
12
+ }
13
+ }
14
+ subscribe(event, listener) {
15
+ this.addListener(event, listener);
16
+ return { dispose: () => this.removeListener(event, listener) };
17
+ }
18
+ emit(event, arg) {
19
+ if (this.listeners.has(event)) {
20
+ this.listeners.get(event).forEach((listener) => listener(arg));
21
+ }
22
+ }
23
+ dispose() {
24
+ this.listeners.clear();
25
+ }
26
+ }
27
+ //# sourceMappingURL=event-hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-hub.js","sourceRoot":"","sources":["../src/event-hub.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,QAAQ;IACX,SAAS,GAAG,IAAI,GAAG,EAA6C,CAAA;IAEjE,WAAW,CAAmB,KAAa,EAAE,QAAgD;QAClG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAA;QACtC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAA6C,CAAC,CAAA;IAC/E,CAAC;IAEM,cAAc,CAAmB,KAAa,EAAE,QAAgD;QACrG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,QAA6C,CAAC,CAAA;QAClF,CAAC;IACH,CAAC;IAEM,SAAS,CAAmB,KAAa,EAAE,QAAgD;QAChG,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QACjC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAA;IAChE,CAAC;IAEM,IAAI,CAAmB,KAAa,EAAE,GAAyB;QACpE,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;QACjE,CAAC;IACH,CAAC;IAEM,OAAO;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;IACxB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event-hub.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-hub.spec.d.ts","sourceRoot":"","sources":["../src/event-hub.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { EventHub } from './event-hub.js';
2
+ import { describe, expect, it, vi } from 'vitest';
3
+ describe('EventHub', () => {
4
+ it('Should fail on type errors', () => {
5
+ const eventHub = new EventHub();
6
+ const numberListener = vi.fn((_val) => { });
7
+ const stringListener = vi.fn((_val) => { });
8
+ // @ts-expect-error Type 'string' is not assignable to type 'number'
9
+ eventHub.addListener('ExampleNumberEvent', stringListener);
10
+ // @ts-expect-error Type 'string' is not assignable to type 'number'
11
+ eventHub.emit('ExampleNumberEvent', '1');
12
+ // @ts-expect-error Type 'number' is not assignable to type 'string'
13
+ eventHub.addListener('ExampleStringEvent', numberListener);
14
+ // @ts-expect-error Type 'number' is not assignable to type 'string'
15
+ eventHub.emit('ExampleStringEvent', 1);
16
+ });
17
+ it('Should remove a listener', () => {
18
+ // Arrange
19
+ const eventHub = new EventHub();
20
+ const numberListener = vi.fn((_val) => { });
21
+ // Act
22
+ eventHub.addListener('ExampleNumberEvent', numberListener);
23
+ eventHub.removeListener('ExampleNumberEvent', numberListener);
24
+ eventHub.emit('ExampleNumberEvent', 1);
25
+ // Assert
26
+ expect(numberListener).not.toBeCalled();
27
+ });
28
+ it('should distribute events through listeners', () => {
29
+ // Arrange
30
+ const eventHub = new EventHub();
31
+ const numberListener = vi.fn((_val) => { });
32
+ const stringListener = vi.fn((_val) => { });
33
+ const objectListener1 = vi.fn((_val) => { });
34
+ const objectListener2 = vi.fn((_val) => { });
35
+ // Act
36
+ eventHub.addListener('ExampleNumberEvent', numberListener);
37
+ eventHub.emit('ExampleNumberEvent', 1);
38
+ eventHub.addListener('ExampleStringEvent', stringListener);
39
+ eventHub.emit('ExampleStringEvent', '1');
40
+ eventHub.addListener('ExampleObjectEvent1', objectListener1);
41
+ eventHub.emit('ExampleObjectEvent1', { a: 1 });
42
+ eventHub.addListener('ExampleObjectEvent2', objectListener2);
43
+ eventHub.emit('ExampleObjectEvent2', { b: '1' });
44
+ // Assert
45
+ expect(numberListener).toBeCalledWith(1);
46
+ expect(numberListener).toBeCalledTimes(1);
47
+ expect(stringListener).toBeCalledWith('1');
48
+ expect(stringListener).toBeCalledTimes(1);
49
+ expect(objectListener1).toBeCalledWith({ a: 1 });
50
+ expect(objectListener1).toBeCalledTimes(1);
51
+ expect(objectListener2).toBeCalledWith({ b: '1' });
52
+ expect(objectListener2).toBeCalledTimes(1);
53
+ });
54
+ it('Should add and remove a listener with subscription', () => {
55
+ const eventHub = new EventHub();
56
+ const numberListener = vi.fn((_val) => { });
57
+ const subscription = eventHub.subscribe('ExampleNumberEvent', numberListener);
58
+ eventHub.emit('ExampleNumberEvent', 1);
59
+ expect(numberListener).toBeCalledWith(1);
60
+ subscription.dispose();
61
+ eventHub.emit('ExampleNumberEvent', 2);
62
+ expect(numberListener).toBeCalledTimes(1);
63
+ });
64
+ it('should clear all listeners on dispose', () => {
65
+ const hub = new EventHub();
66
+ const listener = vi.fn((_val) => { });
67
+ hub.addListener('test', listener);
68
+ hub.dispose();
69
+ hub.emit('test', 'test');
70
+ expect(listener).not.toBeCalled();
71
+ });
72
+ });
73
+ //# sourceMappingURL=event-hub.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-hub.spec.js","sourceRoot":"","sources":["../src/event-hub.spec.ts"],"names":[],"mappings":"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"}
package/esm/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './disposable.js';
2
2
  export * from './deep-merge.js';
3
3
  export * from './debounce.js';
4
+ export * from './event-hub.js';
4
5
  export * from './observable-value.js';
5
6
  export * from './value-observer.js';
6
7
  export * from './path-helper.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
package/esm/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './disposable.js';
2
2
  export * from './deep-merge.js';
3
3
  export * from './debounce.js';
4
+ export * from './event-hub.js';
4
5
  export * from './observable-value.js';
5
6
  export * from './value-observer.js';
6
7
  export * from './path-helper.js';
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,uBAAuB,CAAA;AACrC,cAAc,qBAAqB,CAAA;AACnC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,YAAY,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import type { Disposable } from './disposable.js';
2
+ import type { ValueObserverOptions } from './value-observer.js';
2
3
  import { ValueObserver } from './value-observer.js';
3
4
  /**
4
5
  * Error thrown when you try to retrieve or set an observable value that is already disposed.
@@ -10,6 +11,15 @@ export declare class ObservableAlreadyDisposedError extends Error {
10
11
  * Callback type for observable value changes
11
12
  */
12
13
  export type ValueChangeCallback<T> = (next: T) => void;
14
+ export type ObservableValueOptions<T> = {
15
+ /**
16
+ * Defines a custom compare function to determine if the value should be updated and the observers should be notified
17
+ * @param lastValue the last value
18
+ * @param nextValue the next value
19
+ * @returns if the value should be updated and the observers should be notified
20
+ */
21
+ compare: (lastValue: T, nextValue: T) => boolean;
22
+ };
13
23
  /**
14
24
  * Defines an ObservableValue value object.
15
25
  *
@@ -42,10 +52,10 @@ export declare class ObservableValue<T> implements Disposable {
42
52
  /**
43
53
  * Subscribes to a value changes
44
54
  * @param callback The callback method that will be called on each change
45
- * @param getLast Will call the callback with the last known value right after subscription
55
+ * @param options Additional ObservableValue options
46
56
  * @returns The ValueObserver instance
47
57
  */
48
- subscribe(callback: ValueChangeCallback<T>, getLast?: boolean): ValueObserver<T>;
58
+ subscribe(callback: ValueChangeCallback<T>, options?: ValueObserverOptions<T>): ValueObserver<T>;
49
59
  /**
50
60
  * The observer will unsubscribe from the Observable
51
61
  * @param observer The ValueObserver instance
@@ -67,9 +77,11 @@ export declare class ObservableValue<T> implements Disposable {
67
77
  * @returns The subscribed observers
68
78
  */
69
79
  getObservers(): readonly ValueObserver<T>[];
80
+ private readonly options;
70
81
  /**
71
82
  * @param initialValue Optional initial value
83
+ * @param options Additional options
72
84
  */
73
- constructor(initialValue?: T);
85
+ constructor(initialValue: T, options?: Partial<ObservableValueOptions<T>>);
74
86
  }
75
87
  //# sourceMappingURL=observable-value.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.d.ts","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;;CAIxD;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,UAAU;IACnD,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,OAAO,CAAC,WAAW,CAAQ;IAE3B;;OAEG;IACI,OAAO;IAId,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,YAAY,CAAI;IAExB;;;;;OAKG;IACI,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,OAAO,UAAQ;IAYlE;;;;OAIG;IACI,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAI7C;;;OAGG;IACI,QAAQ,IAAI,CAAC;IAOpB;;;OAGG;IACI,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAY3B;;;OAGG;IACI,YAAY;IAInB;;OAEG;gBACS,YAAY,CAAC,EAAE,CAAC;CAK7B"}
1
+ {"version":3,"file":"observable-value.d.ts","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,qBAAa,8BAA+B,SAAQ,KAAK;;CAIxD;AAED;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAA;AAEtD,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI;IACtC;;;;;OAKG;IACH,OAAO,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,OAAO,CAAA;CACjD,CAAA;AAID;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,UAAU;IACnD,IAAW,UAAU,IAAI,OAAO,CAE/B;IAED,OAAO,CAAC,WAAW,CAAQ;IAE3B;;OAEG;IACI,OAAO;IAMd,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,YAAY,CAAG;IAEvB;;;;;OAKG;IACI,SAAS,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAC;IASpF;;;;OAIG;IACI,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;IAI7C;;;OAGG;IACI,QAAQ,IAAI,CAAC;IAOpB;;;OAGG;IACI,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAc3B;;;OAGG;IACI,YAAY;IAInB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IAEnD;;;OAGG;gBACS,YAAY,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;CAO1E"}
@@ -7,6 +7,7 @@ export class ObservableAlreadyDisposedError extends Error {
7
7
  super('Observable already disposed');
8
8
  }
9
9
  }
10
+ const defaultComparer = (a, b) => a !== b;
10
11
  /**
11
12
  * Defines an ObservableValue value object.
12
13
  *
@@ -38,24 +39,23 @@ export class ObservableValue {
38
39
  dispose() {
39
40
  this.observers.clear();
40
41
  this._isDisposed = true;
42
+ // @ts-expect-error getting currentValue after disposing is not allowed
43
+ this.currentValue = null;
41
44
  }
42
45
  observers = new Set();
43
46
  currentValue;
44
47
  /**
45
48
  * Subscribes to a value changes
46
49
  * @param callback The callback method that will be called on each change
47
- * @param getLast Will call the callback with the last known value right after subscription
50
+ * @param options Additional ObservableValue options
48
51
  * @returns The ValueObserver instance
49
52
  */
50
- subscribe(callback, getLast = false) {
53
+ subscribe(callback, options) {
51
54
  if (this._isDisposed) {
52
55
  throw new ObservableAlreadyDisposedError();
53
56
  }
54
- const observer = new ValueObserver(this, callback);
57
+ const observer = new ValueObserver(this, callback, options);
55
58
  this.observers.add(observer);
56
- if (getLast) {
57
- callback(this.currentValue);
58
- }
59
59
  return observer;
60
60
  }
61
61
  /**
@@ -84,11 +84,13 @@ export class ObservableValue {
84
84
  if (this._isDisposed) {
85
85
  throw new ObservableAlreadyDisposedError();
86
86
  }
87
- if (this.currentValue !== newValue) {
87
+ if (this.options.compare(this.currentValue, newValue)) {
88
88
  this.currentValue = newValue;
89
- for (const subscription of this.observers) {
90
- subscription.callback(newValue);
91
- }
89
+ this.observers.forEach((observer) => {
90
+ if (observer.options?.filter?.(this.currentValue, newValue) !== false) {
91
+ observer.callback(newValue);
92
+ }
93
+ });
92
94
  }
93
95
  }
94
96
  /**
@@ -98,13 +100,17 @@ export class ObservableValue {
98
100
  getObservers() {
99
101
  return [...this.observers];
100
102
  }
103
+ options;
101
104
  /**
102
105
  * @param initialValue Optional initial value
106
+ * @param options Additional options
103
107
  */
104
- constructor(initialValue) {
105
- if (initialValue !== undefined) {
106
- this.currentValue = initialValue;
107
- }
108
+ constructor(initialValue, options) {
109
+ this.options = {
110
+ compare: defaultComparer,
111
+ ...options,
112
+ };
113
+ this.currentValue = initialValue;
108
114
  }
109
115
  }
110
116
  //# sourceMappingURL=observable-value.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.js","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD;QACE,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACtC,CAAC;CACF;AAOD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,eAAe;IAC1B,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAEO,WAAW,GAAG,KAAK,CAAA;IAE3B;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;IACzB,CAAC;IACO,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAA;IAC5C,YAAY,CAAI;IAExB;;;;;OAKG;IACI,SAAS,CAAC,QAAgC,EAAE,OAAO,GAAG,KAAK;QAChE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAI,IAAI,EAAE,QAAQ,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,IAAI,OAAO,EAAE,CAAC;YACZ,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC7B,CAAC;QACD,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAA0B;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,QAAW;QACzB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,YAAY,KAAK,QAAQ,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAA;YAC5B,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBAC1C,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;YACjC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAoC,CAAA;IAC/D,CAAC;IAED;;OAEG;IACH,YAAY,YAAgB;QAC1B,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAClC,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"observable-value.js","sourceRoot":"","sources":["../src/observable-value.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAEnD;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD;QACE,KAAK,CAAC,6BAA6B,CAAC,CAAA;IACtC,CAAC;CACF;AAiBD,MAAM,eAAe,GAAG,CAAI,CAAI,EAAE,CAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;AAElD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,OAAO,eAAe;IAC1B,IAAW,UAAU;QACnB,OAAO,IAAI,CAAC,WAAW,CAAA;IACzB,CAAC;IAEO,WAAW,GAAG,KAAK,CAAA;IAE3B;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAA;QACtB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAA;QACvB,uEAAuE;QACvE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAA;IAC1B,CAAC;IACO,SAAS,GAA0B,IAAI,GAAG,EAAE,CAAA;IAC5C,YAAY,CAAG;IAEvB;;;;;OAKG;IACI,SAAS,CAAC,QAAgC,EAAE,OAAiC;QAClF,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAI,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC9D,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAA0B;QAC3C,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACxC,CAAC;IAED;;;OAGG;IACI,QAAQ;QACb,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAA;IAC1B,CAAC;IAED;;;OAGG;IACI,QAAQ,CAAC,QAAW;QACzB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,8BAA8B,EAAE,CAAA;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAA;YAC5B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBAClC,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,KAAK,KAAK,EAAE,CAAC;oBACtE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED;;;OAGG;IACI,YAAY;QACjB,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAoC,CAAA;IAC/D,CAAC;IAEgB,OAAO,CAA2B;IAEnD;;;OAGG;IACH,YAAY,YAAe,EAAE,OAA4C;QACvE,IAAI,CAAC,OAAO,GAAG;YACb,OAAO,EAAE,eAAe;YACxB,GAAG,OAAO;SACX,CAAA;QACD,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IAClC,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.spec.d.ts","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,eAAe,qCAyI1B,CAAA"}
1
+ {"version":3,"file":"observable-value.spec.d.ts","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,eAAe,qCA6K1B,CAAA"}
@@ -4,24 +4,14 @@ import { ObservableValue } from './observable-value.js';
4
4
  * Observable Value tests
5
5
  */
6
6
  export const observableTests = describe('Observable', () => {
7
- it('should be constructed without initial value', () => {
8
- const v = new ObservableValue();
9
- const doneCallback = vi.fn();
10
- v.subscribe(() => {
11
- expect(v.getValue()).toBe(undefined);
12
- doneCallback();
13
- }, true);
7
+ it('should be constructed with an undefined initial value', () => {
8
+ const v = new ObservableValue(undefined);
14
9
  expect(v).toBeInstanceOf(ObservableValue);
15
- expect(doneCallback).toBeCalled();
10
+ expect(v.getValue()).toBe(undefined);
16
11
  });
17
12
  it('should be constructed with initial value', () => {
18
13
  const v = new ObservableValue(1);
19
- const doneCallback = vi.fn();
20
- v.subscribe(() => {
21
- expect(v.getValue()).toBe(1);
22
- doneCallback();
23
- }, true);
24
- expect(doneCallback).toBeCalled();
14
+ expect(v.getValue()).toBe(1);
25
15
  });
26
16
  describe('Subscription callback', () => {
27
17
  it('should be triggered only when a value is changed', () => {
@@ -30,19 +20,19 @@ export const observableTests = describe('Observable', () => {
30
20
  v.subscribe(() => {
31
21
  expect(v.getValue()).toBe(2);
32
22
  doneCallback();
33
- }, false);
23
+ });
34
24
  v.setValue(1);
35
25
  v.setValue(1);
36
26
  v.setValue(2);
37
27
  expect(doneCallback).toBeCalledTimes(1);
38
28
  });
39
- it('should be triggered only on change when getLast is false', () => {
29
+ it('should be triggered only on change', () => {
40
30
  const v = new ObservableValue(1);
41
31
  const doneCallback = vi.fn();
42
32
  v.subscribe((value) => {
43
33
  expect(value).toBe(2);
44
34
  doneCallback();
45
- }, false);
35
+ });
46
36
  v.setValue(2);
47
37
  expect(doneCallback).toBeCalledTimes(1);
48
38
  });
@@ -119,5 +109,41 @@ export const observableTests = describe('Observable', () => {
119
109
  expect(doneCallback).toBeCalledTimes(1);
120
110
  });
121
111
  });
112
+ describe('Custom Compare function', () => {
113
+ it('Should compare the values with the custom compare function', () => {
114
+ const v = new ObservableValue({ value: 2 }, {
115
+ compare: (a, b) => a.value !== b.value,
116
+ });
117
+ const onChange = vi.fn();
118
+ v.subscribe(onChange);
119
+ v.setValue({ value: 2 });
120
+ expect(v.getValue()).toEqual({ value: 2 });
121
+ expect(onChange).not.toBeCalled();
122
+ v.setValue({ value: 3 });
123
+ expect(v.getValue()).toEqual({ value: 3 });
124
+ expect(onChange).toBeCalledTimes(1);
125
+ expect(onChange).toBeCalledWith({ value: 3 });
126
+ v.setValue({ value: 3 });
127
+ expect(v.getValue()).toEqual({ value: 3 });
128
+ expect(onChange).toBeCalledTimes(1);
129
+ });
130
+ });
131
+ describe('Filtered subscriptions', () => {
132
+ it('should not trigger the callback if the filter returns false', () => {
133
+ const v = new ObservableValue({ shouldNotify: true, value: 1 });
134
+ const onChange = vi.fn();
135
+ v.subscribe(onChange, {
136
+ filter: (nextValue) => nextValue.shouldNotify,
137
+ });
138
+ v.setValue({ shouldNotify: false, value: 1 });
139
+ expect(onChange).not.toBeCalled();
140
+ v.setValue({ shouldNotify: false, value: 2 });
141
+ expect(onChange).not.toBeCalled();
142
+ expect(v.getValue()).toEqual({ shouldNotify: false, value: 2 });
143
+ v.setValue({ shouldNotify: true, value: 3 });
144
+ expect(onChange).toBeCalledTimes(1);
145
+ expect(onChange).toBeCalledWith({ shouldNotify: true, value: 3 });
146
+ });
147
+ });
122
148
  });
123
149
  //# sourceMappingURL=observable-value.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"observable-value.spec.js","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IACzD,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,GAAG,IAAI,eAAe,EAAE,CAAA;QAC/B,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAC5B,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;YACf,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YACpC,YAAY,EAAE,CAAA;QAChB,CAAC,EAAE,IAAI,CAAC,CAAA;QACR,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,eAAe,CAAC,CAAA;QACzC,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;QAChC,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QAE5B,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;YACf,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC5B,YAAY,EAAE,CAAA;QAChB,CAAC,EAAE,IAAI,CAAC,CAAA;QACR,MAAM,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;YAC1D,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBACf,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBAC5B,YAAY,EAAE,CAAA;YAChB,CAAC,EAAE,KAAK,CAAC,CAAA;YACT,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,CAAC,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;gBACpB,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;gBACrB,YAAY,EAAE,CAAA;YAChB,CAAC,EAAE,KAAK,CAAC,CAAA;YACT,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YACb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;YACzD,MAAM,aAAa,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE7B,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KAAa,EAAE,EAAE;gBAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvB,CAAC,CAAC,CAAA;YAEF,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;YAC5C,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAA;YAEzB,CAAC,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;YACxB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CAAA;QACxC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,MAAM;YACR,CAAC,CAAA;YACD,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,MAAM;YACR,CAAC,CAAA;YACD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YACtB,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YACtB,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC,CAAC,OAAO,EAAE,CAAA;YACX,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;YAC5D,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,MAAM;YACR,CAAC,CAAA;YACD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;YACvC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,QAAQ,CAAC,OAAO,EAAE,CAAA;YAClB,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC,CAAC,OAAO,EAAE,CAAA;YACX,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAA;QACzE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;YAClF,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC,CAAC,OAAO,EAAE,CAAA;YACX,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAA;QACxE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;YACnF,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,CAAC,CAAC,OAAO,EAAE,CAAA;YACX,MAAM,CAAC,GAAG,EAAE,CACV,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE;gBACf,MAAM;YACR,CAAC,CAAC,CACH,CAAC,YAAY,CAAC,6BAA6B,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;YACxE,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;YAE5B,MAAM,IAAI;gBACD,QAAQ;oBACb,YAAY,EAAE,CAAA;gBAChB,CAAC;aACF;YACD,MAAM,CAAC,GAAG,IAAI,eAAe,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAA;YACjD,CAAC,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAA;YAChC,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,QAAQ,CAAC,OAAO,EAAE,CAAA;YAClB,MAAM,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEb,MAAM,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"observable-value.spec.js","sourceRoot":"","sources":["../src/observable-value.spec.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE,KAAK,SAAS,OAAO,EAAE;IACzG;;OAEG;IACH,MAAM,EAAE,CAAC,CAAA;IACT;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IACrD;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAA;IAChF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IAErD;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,SAAS,GAAG,EAAE;IAClD;;OAEG;IACH,aAAa,EAAE,IAAI,CAAA;IAEnB;;OAEG;IACH,eAAe,EAAE,KAAK,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IAChG,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB,EAAE,IAAI,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IACnF,KAAK,EAAE,GAAG,CAAA;IACV,aAAa,EAAE,IAAI,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE;IAC1D;;OAEG;IACH,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAA;IAC5C;;OAEG;IACH,cAAc,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvD,kBAAkB,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACpE,eAAe,EAAE,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;CACvD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAsC;IAEjE,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAgBzB,OAAO,CAAC,MAAM,CAAC,UAAU;mBAiBJ,eAAe;IAiBpC;;;;OAIG;WACW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,EACjG,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAC7C,UAAU;CA0Cd"}
1
+ {"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,EAAE,KAAK,SAAS,OAAO,EAAE;IACzG;;OAEG;IACH,MAAM,EAAE,CAAC,CAAA;IACT;;OAEG;IACH,MAAM,EAAE,OAAO,CAAA;IACf;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,eAAe,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IACrD;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,KAAK,IAAI,CAAA;IAChF;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,IAAI,CAAA;IAErD;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK,SAAS,GAAG,EAAE;IAClD;;OAEG;IACH,aAAa,EAAE,IAAI,CAAA;IAEnB;;OAEG;IACH,eAAe,EAAE,KAAK,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IAChG,QAAQ,EAAE,QAAQ,CAAA;IAClB,gBAAgB,EAAE,IAAI,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,KAAK,SAAS,GAAG,EAAE,CAAE,SAAQ,eAAe,CAAC,KAAK,CAAC;IACnF,KAAK,EAAE,GAAG,CAAA;IACV,aAAa,EAAE,IAAI,CAAA;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,QAAQ,EAAE,KAAK,SAAS,GAAG,EAAE;IAC1D;;OAEG;IACH,cAAc,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAA;IAC5C;;OAEG;IACH,cAAc,EAAE,eAAe,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvD,kBAAkB,EAAE,eAAe,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;IACpE,eAAe,EAAE,eAAe,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;CAC1D;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;CACvD;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,YAAY,CAAsC;IAEjE,OAAO,CAAC,MAAM,CAAC,cAAc;IAQ7B,OAAO,CAAC,MAAM,CAAC,UAAU;IAazB,OAAO,CAAC,MAAM,CAAC,aAAa;IAe5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAgBzB,OAAO,CAAC,MAAM,CAAC,UAAU;mBAiBJ,eAAe;IAiBpC;;;;OAIG;WACW,MAAM,CAAC,CAAC,SAAS,MAAM,EAAE,OAAO,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,EACjG,OAAO,EAAE,kBAAkB,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,GAC7C,UAAU;CAuDd"}
package/esm/trace.js CHANGED
@@ -106,9 +106,22 @@ export class Trace {
106
106
  if (!objectTrace.methodMappings.has(options.method.name)) {
107
107
  objectTrace.methodMappings.set(options.method.name, {
108
108
  originalMethod: options.method,
109
- callObservable: new ObservableValue(),
110
- finishedObservable: new ObservableValue(),
111
- errorObservable: new ObservableValue(),
109
+ callObservable: new ObservableValue({
110
+ methodArguments: [],
111
+ startDateTime: new Date(''),
112
+ }),
113
+ finishedObservable: new ObservableValue({
114
+ methodArguments: [],
115
+ startDateTime: new Date(''),
116
+ finishedDateTime: new Date(''),
117
+ returned: undefined,
118
+ }),
119
+ errorObservable: new ObservableValue({
120
+ methodArguments: [],
121
+ startDateTime: new Date(''),
122
+ errorDateTime: new Date(''),
123
+ error: undefined,
124
+ }),
112
125
  });
113
126
  }
114
127
  const methodTrace = objectTrace.methodMappings.get(options.method.name);
package/esm/trace.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,8 @@
1
1
  import type { Disposable } from './disposable.js';
2
2
  import type { ObservableValue, ValueChangeCallback } from './observable-value.js';
3
+ export type ValueObserverOptions<T> = {
4
+ filter?: (nextValue: T, lastValue: T) => boolean;
5
+ };
3
6
  /**
4
7
  * Defines a generic ValueObserver instance
5
8
  *
@@ -25,6 +28,7 @@ import type { ObservableValue, ValueChangeCallback } from './observable-value.js
25
28
  export declare class ValueObserver<T> implements Disposable {
26
29
  readonly observable: ObservableValue<T>;
27
30
  callback: ValueChangeCallback<T>;
31
+ readonly options?: ValueObserverOptions<T> | undefined;
28
32
  /**
29
33
  * Disposes the ValueObserver instance. Unsubscribes from the observable
30
34
  */
@@ -33,7 +37,8 @@ export declare class ValueObserver<T> implements Disposable {
33
37
  * @constructs ValueObserver<T> the ValueObserver instance
34
38
  * @param observable The related Observable object
35
39
  * @param callback The callback that will be fired on change
40
+ * @param options Additional options
36
41
  */
37
- constructor(observable: ObservableValue<T>, callback: ValueChangeCallback<T>);
42
+ constructor(observable: ObservableValue<T>, callback: ValueChangeCallback<T>, options?: ValueObserverOptions<T> | undefined);
38
43
  }
39
44
  //# sourceMappingURL=value-observer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"value-observer.d.ts","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAEjF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,UAAU;aAc/B,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;IACvC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAdzC;;OAEG;IACI,OAAO;IAId;;;;OAIG;gBAEe,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EACvC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;CAE1C"}
1
+ {"version":3,"file":"value-observer.d.ts","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAEjF,MAAM,MAAM,oBAAoB,CAAC,CAAC,IAAI;IACpC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,KAAK,OAAO,CAAA;CACjD,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,aAAa,CAAC,CAAC,CAAE,YAAW,UAAU;aAe/B,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC;IACvC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC;aACvB,OAAO,CAAC;IAhB1B;;OAEG;IACI,OAAO;IAId;;;;;OAKG;gBAEe,UAAU,EAAE,eAAe,CAAC,CAAC,CAAC,EACvC,QAAQ,EAAE,mBAAmB,CAAC,CAAC,CAAC,EACvB,OAAO,CAAC,qCAAyB;CAEpD"}
@@ -23,6 +23,7 @@
23
23
  export class ValueObserver {
24
24
  observable;
25
25
  callback;
26
+ options;
26
27
  /**
27
28
  * Disposes the ValueObserver instance. Unsubscribes from the observable
28
29
  */
@@ -33,10 +34,12 @@ export class ValueObserver {
33
34
  * @constructs ValueObserver<T> the ValueObserver instance
34
35
  * @param observable The related Observable object
35
36
  * @param callback The callback that will be fired on change
37
+ * @param options Additional options
36
38
  */
37
- constructor(observable, callback) {
39
+ constructor(observable, callback, options) {
38
40
  this.observable = observable;
39
41
  this.callback = callback;
42
+ this.options = options;
40
43
  }
41
44
  }
42
45
  //# sourceMappingURL=value-observer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"value-observer.js","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,aAAa;IAcN;IACT;IAdT;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAED;;;;OAIG;IACH,YACkB,UAA8B,EACvC,QAAgC;QADvB,eAAU,GAAV,UAAU,CAAoB;QACvC,aAAQ,GAAR,QAAQ,CAAwB;IACtC,CAAC;CACL"}
1
+ {"version":3,"file":"value-observer.js","sourceRoot":"","sources":["../src/value-observer.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,aAAa;IAeN;IACT;IACS;IAhBlB;;OAEG;IACI,OAAO;QACZ,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IACnC,CAAC;IAED;;;;;OAKG;IACH,YACkB,UAA8B,EACvC,QAAgC,EACvB,OAAiC;QAFjC,eAAU,GAAV,UAAU,CAAoB;QACvC,aAAQ,GAAR,QAAQ,CAAwB;QACvB,YAAO,GAAP,OAAO,CAA0B;IAChD,CAAC;CACL"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@furystack/utils",
3
- "version": "4.0.17",
3
+ "version": "6.0.0",
4
4
  "description": "General utilities",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -35,6 +35,6 @@
35
35
  "homepage": "https://github.com/furystack/furystack",
36
36
  "devDependencies": {
37
37
  "typescript": "^5.4.2",
38
- "vitest": "^1.3.1"
38
+ "vitest": "^1.4.0"
39
39
  }
40
40
  }
@@ -0,0 +1,106 @@
1
+ import { EventHub } from './event-hub.js'
2
+ import { describe, expect, it, vi } from 'vitest'
3
+
4
+ describe('EventHub', () => {
5
+ it('Should fail on type errors', () => {
6
+ const eventHub = new EventHub<
7
+ 'ExampleNumberEvent' | 'ExampleStringEvent',
8
+ { ExampleNumberEvent: number; ExampleStringEvent: string }
9
+ >()
10
+ const numberListener = vi.fn((_val: number) => {})
11
+ const stringListener = vi.fn((_val: string) => {})
12
+ // @ts-expect-error Type 'string' is not assignable to type 'number'
13
+ eventHub.addListener('ExampleNumberEvent', stringListener)
14
+ // @ts-expect-error Type 'string' is not assignable to type 'number'
15
+ eventHub.emit('ExampleNumberEvent', '1')
16
+
17
+ // @ts-expect-error Type 'number' is not assignable to type 'string'
18
+ eventHub.addListener('ExampleStringEvent', numberListener)
19
+ // @ts-expect-error Type 'number' is not assignable to type 'string'
20
+ eventHub.emit('ExampleStringEvent', 1)
21
+ })
22
+
23
+ it('Should remove a listener', () => {
24
+ // Arrange
25
+ const eventHub = new EventHub<'ExampleNumberEvent', { ExampleNumberEvent: number }>()
26
+ const numberListener = vi.fn((_val: number) => {})
27
+
28
+ // Act
29
+ eventHub.addListener('ExampleNumberEvent', numberListener)
30
+ eventHub.removeListener('ExampleNumberEvent', numberListener)
31
+ eventHub.emit('ExampleNumberEvent', 1)
32
+
33
+ // Assert
34
+ expect(numberListener).not.toBeCalled()
35
+ })
36
+
37
+ it('should distribute events through listeners', () => {
38
+ // Arrange
39
+ const eventHub = new EventHub<
40
+ 'ExampleNumberEvent' | 'ExampleStringEvent' | 'ExampleObjectEvent1' | 'ExampleObjectEvent2',
41
+ {
42
+ ExampleNumberEvent: number
43
+ ExampleStringEvent: string
44
+ ExampleObjectEvent1: { a: number }
45
+ ExampleObjectEvent2: { b: string }
46
+ }
47
+ >()
48
+ const numberListener = vi.fn((_val: number) => {})
49
+
50
+ const stringListener = vi.fn((_val: string) => {})
51
+
52
+ const objectListener1 = vi.fn((_val: { a: number }) => {})
53
+
54
+ const objectListener2 = vi.fn((_val: { b: string }) => {})
55
+
56
+ // Act
57
+ eventHub.addListener('ExampleNumberEvent', numberListener)
58
+ eventHub.emit('ExampleNumberEvent', 1)
59
+
60
+ eventHub.addListener('ExampleStringEvent', stringListener)
61
+ eventHub.emit('ExampleStringEvent', '1')
62
+
63
+ eventHub.addListener('ExampleObjectEvent1', objectListener1)
64
+ eventHub.emit('ExampleObjectEvent1', { a: 1 })
65
+
66
+ eventHub.addListener('ExampleObjectEvent2', objectListener2)
67
+ eventHub.emit('ExampleObjectEvent2', { b: '1' })
68
+
69
+ // Assert
70
+ expect(numberListener).toBeCalledWith(1)
71
+ expect(numberListener).toBeCalledTimes(1)
72
+
73
+ expect(stringListener).toBeCalledWith('1')
74
+ expect(stringListener).toBeCalledTimes(1)
75
+
76
+ expect(objectListener1).toBeCalledWith({ a: 1 })
77
+ expect(objectListener1).toBeCalledTimes(1)
78
+
79
+ expect(objectListener2).toBeCalledWith({ b: '1' })
80
+ expect(objectListener2).toBeCalledTimes(1)
81
+ })
82
+
83
+ it('Should add and remove a listener with subscription', () => {
84
+ const eventHub = new EventHub<'ExampleNumberEvent', { ExampleNumberEvent: number }>()
85
+ const numberListener = vi.fn((_val: number) => {})
86
+
87
+ const subscription = eventHub.subscribe('ExampleNumberEvent', numberListener)
88
+ eventHub.emit('ExampleNumberEvent', 1)
89
+
90
+ expect(numberListener).toBeCalledWith(1)
91
+ subscription.dispose()
92
+ eventHub.emit('ExampleNumberEvent', 2)
93
+ expect(numberListener).toBeCalledTimes(1)
94
+ })
95
+
96
+ it('should clear all listeners on dispose', () => {
97
+ const hub = new EventHub<'test', { test: string }>()
98
+
99
+ const listener = vi.fn((_val: string) => {})
100
+
101
+ hub.addListener('test', listener)
102
+ hub.dispose()
103
+ hub.emit('test', 'test')
104
+ expect(listener).not.toBeCalled()
105
+ })
106
+ })
@@ -0,0 +1,35 @@
1
+ import type { Disposable } from './disposable.js'
2
+
3
+ type ListenerFunction<T extends string, EventTypeMap extends { [K in T]: any }> = (arg: EventTypeMap[T]) => void
4
+
5
+ export class EventHub<T extends string, EventTypeMap extends { [K in T]: any }> implements Disposable {
6
+ private listeners = new Map<T, Set<ListenerFunction<T, EventTypeMap>>>()
7
+
8
+ public addListener<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>) {
9
+ if (!this.listeners.has(event)) {
10
+ this.listeners.set(event, new Set())
11
+ }
12
+ this.listeners.get(event)!.add(listener as ListenerFunction<T, EventTypeMap>)
13
+ }
14
+
15
+ public removeListener<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>) {
16
+ if (this.listeners.has(event)) {
17
+ this.listeners.get(event)!.delete(listener as ListenerFunction<T, EventTypeMap>)
18
+ }
19
+ }
20
+
21
+ public subscribe<TEvent extends T>(event: TEvent, listener: ListenerFunction<TEvent, EventTypeMap>): Disposable {
22
+ this.addListener(event, listener)
23
+ return { dispose: () => this.removeListener(event, listener) }
24
+ }
25
+
26
+ public emit<TEvent extends T>(event: TEvent, arg: EventTypeMap[TEvent]) {
27
+ if (this.listeners.has(event)) {
28
+ this.listeners.get(event)!.forEach((listener) => listener(arg))
29
+ }
30
+ }
31
+
32
+ public dispose() {
33
+ this.listeners.clear()
34
+ }
35
+ }
package/src/index.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  export * from './disposable.js'
2
2
  export * from './deep-merge.js'
3
3
  export * from './debounce.js'
4
+ export * from './event-hub.js'
4
5
  export * from './observable-value.js'
5
6
  export * from './value-observer.js'
6
7
  export * from './path-helper.js'
@@ -5,26 +5,15 @@ import { ObservableValue } from './observable-value.js'
5
5
  * Observable Value tests
6
6
  */
7
7
  export const observableTests = describe('Observable', () => {
8
- it('should be constructed without initial value', () => {
9
- const v = new ObservableValue()
10
- const doneCallback = vi.fn()
11
- v.subscribe(() => {
12
- expect(v.getValue()).toBe(undefined)
13
- doneCallback()
14
- }, true)
8
+ it('should be constructed with an undefined initial value', () => {
9
+ const v = new ObservableValue(undefined)
15
10
  expect(v).toBeInstanceOf(ObservableValue)
16
- expect(doneCallback).toBeCalled()
11
+ expect(v.getValue()).toBe(undefined)
17
12
  })
18
13
 
19
14
  it('should be constructed with initial value', () => {
20
15
  const v = new ObservableValue(1)
21
- const doneCallback = vi.fn()
22
-
23
- v.subscribe(() => {
24
- expect(v.getValue()).toBe(1)
25
- doneCallback()
26
- }, true)
27
- expect(doneCallback).toBeCalled()
16
+ expect(v.getValue()).toBe(1)
28
17
  })
29
18
 
30
19
  describe('Subscription callback', () => {
@@ -35,21 +24,21 @@ export const observableTests = describe('Observable', () => {
35
24
  v.subscribe(() => {
36
25
  expect(v.getValue()).toBe(2)
37
26
  doneCallback()
38
- }, false)
27
+ })
39
28
  v.setValue(1)
40
29
  v.setValue(1)
41
30
  v.setValue(2)
42
31
  expect(doneCallback).toBeCalledTimes(1)
43
32
  })
44
33
 
45
- it('should be triggered only on change when getLast is false', () => {
34
+ it('should be triggered only on change', () => {
46
35
  const v = new ObservableValue(1)
47
36
  const doneCallback = vi.fn()
48
37
 
49
38
  v.subscribe((value) => {
50
39
  expect(value).toBe(2)
51
40
  doneCallback()
52
- }, false)
41
+ })
53
42
  v.setValue(2)
54
43
  expect(doneCallback).toBeCalledTimes(1)
55
44
  })
@@ -141,4 +130,51 @@ export const observableTests = describe('Observable', () => {
141
130
  expect(doneCallback).toBeCalledTimes(1)
142
131
  })
143
132
  })
133
+
134
+ describe('Custom Compare function', () => {
135
+ it('Should compare the values with the custom compare function', () => {
136
+ const v = new ObservableValue(
137
+ { value: 2 },
138
+ {
139
+ compare: (a, b) => a.value !== b.value,
140
+ },
141
+ )
142
+ const onChange = vi.fn()
143
+ v.subscribe(onChange)
144
+
145
+ v.setValue({ value: 2 })
146
+ expect(v.getValue()).toEqual({ value: 2 })
147
+ expect(onChange).not.toBeCalled()
148
+
149
+ v.setValue({ value: 3 })
150
+ expect(v.getValue()).toEqual({ value: 3 })
151
+ expect(onChange).toBeCalledTimes(1)
152
+ expect(onChange).toBeCalledWith({ value: 3 })
153
+
154
+ v.setValue({ value: 3 })
155
+ expect(v.getValue()).toEqual({ value: 3 })
156
+ expect(onChange).toBeCalledTimes(1)
157
+ })
158
+ })
159
+
160
+ describe('Filtered subscriptions', () => {
161
+ it('should not trigger the callback if the filter returns false', () => {
162
+ const v = new ObservableValue({ shouldNotify: true, value: 1 })
163
+ const onChange = vi.fn()
164
+ v.subscribe(onChange, {
165
+ filter: (nextValue) => nextValue.shouldNotify,
166
+ })
167
+
168
+ v.setValue({ shouldNotify: false, value: 1 })
169
+ expect(onChange).not.toBeCalled()
170
+
171
+ v.setValue({ shouldNotify: false, value: 2 })
172
+ expect(onChange).not.toBeCalled()
173
+ expect(v.getValue()).toEqual({ shouldNotify: false, value: 2 })
174
+
175
+ v.setValue({ shouldNotify: true, value: 3 })
176
+ expect(onChange).toBeCalledTimes(1)
177
+ expect(onChange).toBeCalledWith({ shouldNotify: true, value: 3 })
178
+ })
179
+ })
144
180
  })
@@ -1,4 +1,5 @@
1
1
  import type { Disposable } from './disposable.js'
2
+ import type { ValueObserverOptions } from './value-observer.js'
2
3
  import { ValueObserver } from './value-observer.js'
3
4
 
4
5
  /**
@@ -15,6 +16,18 @@ export class ObservableAlreadyDisposedError extends Error {
15
16
  */
16
17
  export type ValueChangeCallback<T> = (next: T) => void
17
18
 
19
+ export type ObservableValueOptions<T> = {
20
+ /**
21
+ * Defines a custom compare function to determine if the value should be updated and the observers should be notified
22
+ * @param lastValue the last value
23
+ * @param nextValue the next value
24
+ * @returns if the value should be updated and the observers should be notified
25
+ */
26
+ compare: (lastValue: T, nextValue: T) => boolean
27
+ }
28
+
29
+ const defaultComparer = <T>(a: T, b: T) => a !== b
30
+
18
31
  /**
19
32
  * Defines an ObservableValue value object.
20
33
  *
@@ -48,25 +61,24 @@ export class ObservableValue<T> implements Disposable {
48
61
  public dispose() {
49
62
  this.observers.clear()
50
63
  this._isDisposed = true
64
+ // @ts-expect-error getting currentValue after disposing is not allowed
65
+ this.currentValue = null
51
66
  }
52
67
  private observers: Set<ValueObserver<T>> = new Set()
53
- private currentValue!: T
68
+ private currentValue: T
54
69
 
55
70
  /**
56
71
  * Subscribes to a value changes
57
72
  * @param callback The callback method that will be called on each change
58
- * @param getLast Will call the callback with the last known value right after subscription
73
+ * @param options Additional ObservableValue options
59
74
  * @returns The ValueObserver instance
60
75
  */
61
- public subscribe(callback: ValueChangeCallback<T>, getLast = false) {
76
+ public subscribe(callback: ValueChangeCallback<T>, options?: ValueObserverOptions<T>) {
62
77
  if (this._isDisposed) {
63
78
  throw new ObservableAlreadyDisposedError()
64
79
  }
65
- const observer = new ValueObserver<T>(this, callback)
80
+ const observer = new ValueObserver<T>(this, callback, options)
66
81
  this.observers.add(observer)
67
- if (getLast) {
68
- callback(this.currentValue)
69
- }
70
82
  return observer
71
83
  }
72
84
 
@@ -98,11 +110,13 @@ export class ObservableValue<T> implements Disposable {
98
110
  if (this._isDisposed) {
99
111
  throw new ObservableAlreadyDisposedError()
100
112
  }
101
- if (this.currentValue !== newValue) {
113
+ if (this.options.compare(this.currentValue, newValue)) {
102
114
  this.currentValue = newValue
103
- for (const subscription of this.observers) {
104
- subscription.callback(newValue)
105
- }
115
+ this.observers.forEach((observer) => {
116
+ if (observer.options?.filter?.(this.currentValue, newValue) !== false) {
117
+ observer.callback(newValue)
118
+ }
119
+ })
106
120
  }
107
121
  }
108
122
 
@@ -114,12 +128,17 @@ export class ObservableValue<T> implements Disposable {
114
128
  return [...this.observers] as ReadonlyArray<ValueObserver<T>>
115
129
  }
116
130
 
131
+ private readonly options: ObservableValueOptions<T>
132
+
117
133
  /**
118
134
  * @param initialValue Optional initial value
135
+ * @param options Additional options
119
136
  */
120
- constructor(initialValue?: T) {
121
- if (initialValue !== undefined) {
122
- this.currentValue = initialValue
137
+ constructor(initialValue: T, options?: Partial<ObservableValueOptions<T>>) {
138
+ this.options = {
139
+ compare: defaultComparer,
140
+ ...options,
123
141
  }
142
+ this.currentValue = initialValue
124
143
  }
125
144
  }
package/src/trace.ts CHANGED
@@ -229,10 +229,23 @@ export class Trace {
229
229
  if (!objectTrace.methodMappings.has(options.method.name)) {
230
230
  objectTrace.methodMappings.set(options.method.name, {
231
231
  originalMethod: options.method,
232
- callObservable: new ObservableValue<TraceMethodCall<TArgs>>(),
233
- finishedObservable: new ObservableValue<TraceMethodFinished<ReturnType<TMethod>, TArgs>>(),
234
- errorObservable: new ObservableValue<TraceMethodError<TArgs>>(),
235
- } as any)
232
+ callObservable: new ObservableValue<TraceMethodCall<any>>({
233
+ methodArguments: [],
234
+ startDateTime: new Date(''),
235
+ }),
236
+ finishedObservable: new ObservableValue<TraceMethodFinished<ReturnType<TMethod>, any>>({
237
+ methodArguments: [],
238
+ startDateTime: new Date(''),
239
+ finishedDateTime: new Date(''),
240
+ returned: undefined as ReturnType<TMethod>,
241
+ }),
242
+ errorObservable: new ObservableValue<TraceMethodError<any>>({
243
+ methodArguments: [],
244
+ startDateTime: new Date(''),
245
+ errorDateTime: new Date(''),
246
+ error: undefined,
247
+ }),
248
+ })
236
249
  }
237
250
  const methodTrace = objectTrace.methodMappings.get(options.method.name) as any as MethodMapping<
238
251
  ReturnType<TMethod>,
@@ -1,6 +1,10 @@
1
1
  import type { Disposable } from './disposable.js'
2
2
  import type { ObservableValue, ValueChangeCallback } from './observable-value.js'
3
3
 
4
+ export type ValueObserverOptions<T> = {
5
+ filter?: (nextValue: T, lastValue: T) => boolean
6
+ }
7
+
4
8
  /**
5
9
  * Defines a generic ValueObserver instance
6
10
  *
@@ -35,9 +39,11 @@ export class ValueObserver<T> implements Disposable {
35
39
  * @constructs ValueObserver<T> the ValueObserver instance
36
40
  * @param observable The related Observable object
37
41
  * @param callback The callback that will be fired on change
42
+ * @param options Additional options
38
43
  */
39
44
  constructor(
40
45
  public readonly observable: ObservableValue<T>,
41
46
  public callback: ValueChangeCallback<T>,
47
+ public readonly options?: ValueObserverOptions<T>,
42
48
  ) {}
43
49
  }