@juulsgaard/signal-tools 22.0.2 → 22.0.3

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/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { Signal, Injector, WritableSignal } from '@angular/core';
2
+ import { Signal, Injector, WritableSignal, ValueEqualityFn } from '@angular/core';
3
3
  import * as rxjs from 'rxjs';
4
4
  import { Subscribable, Observable, Observer, Unsubscribable, BehaviorSubject, Subject } from 'rxjs';
5
5
  import { IValueLoadingState } from '@juulsgaard/rxjs-tools';
@@ -823,16 +823,21 @@ declare function toLoadingSignal<T>(promise: Promise<T>, options?: LoadingSignal
823
823
  * @param firstValue - The value to seed as the initial value in the new signal state
824
824
  */
825
825
  declare function pairwiseSignal<T>(inputSignal: Signal<T>, firstValue: T): Signal<[prev: T, next: T]>;
826
+
827
+ interface ProxySignalOptions<TOut> {
828
+ equal?: ValueEqualityFn<TOut>;
829
+ }
830
+ type ProxySignal<T> = WritableSignal<T> & {
831
+ readonly error: Signal<Error | undefined>;
832
+ };
826
833
  /**
827
834
  * Create a writable signal that proxies another signal via a custom setter
828
835
  * @param signal - The signal to proxy
829
836
  * @param getter - The getter for the proxy
830
837
  * @param setter - The setter for the proxy
838
+ * @param options - Options to change behaviour of the proxy
831
839
  */
832
- declare function proxySignal<T, TOut>(signal: WritableSignal<T>, getter: (value: T) => TOut, setter: (value: TOut) => T): ProxySignal<TOut>;
833
- type ProxySignal<T> = WritableSignal<T> & {
834
- readonly error: Signal<Error | undefined>;
835
- };
840
+ declare function proxySignal<T, TOut>(signal: WritableSignal<T>, getter: (value: T) => TOut, setter: (value: TOut, setError?: (e: Error | string | undefined) => void) => T, options?: NoInfer<ProxySignalOptions<TOut>>): ProxySignal<TOut>;
836
841
 
837
842
  export { AsyncRequestState, EmptyRequestState, ErrorRequestState, IRequestState, IValueRequestState, LoadingRequestState, RequestTracker, SignalMap, SignalQueue, SignalSet, SignalStack, StaticRequestState, ValueRequestTracker, WritableRequestState, debouncedSignal, debouncedThrottledSignal, loadingSignal, pairwiseSignal, proxySignal, requestState, requestTracker, searchSignal, signalMap, signalQueue, signalSet, signalStack, subjectToSignal, throttledSignal, toLoadingSignal };
838
843
  export type { CreateLoadingSignalOptions, LoadingSignal, LoadingSignalOptions, ProxySignal, ReadonlySignalMap, ReadonlySignalSet, SignalQueueDelta, SignalQueueOptions, SignalStackDelta };
package/dist/index.mjs CHANGED
@@ -14,4 +14,5 @@ export { RequestTracker, ValueRequestTracker, requestTracker } from './request-s
14
14
  export { debouncedSignal, debouncedThrottledSignal, searchSignal, throttledSignal } from './async.mjs';
15
15
  export { subjectToSignal } from './interop.mjs';
16
16
  export { loadingSignal, toLoadingSignal } from './loading-signal.mjs';
17
- export { pairwiseSignal, proxySignal } from './operators.mjs';
17
+ export { pairwiseSignal } from './operators.mjs';
18
+ export { proxySignal } from './proxy-signal.mjs';
@@ -1,5 +1,4 @@
1
- import { computed, linkedSignal } from '@angular/core';
2
- import { parseError } from '@juulsgaard/ts-tools';
1
+ import { computed } from '@angular/core';
3
2
 
4
3
  function pairwiseSignal(inputSignal, firstValue) {
5
4
  let prevValue = firstValue;
@@ -10,21 +9,5 @@ function pairwiseSignal(inputSignal, firstValue) {
10
9
  return tuple;
11
10
  });
12
11
  }
13
- function proxySignal(signal, getter, setter) {
14
- const output = linkedSignal(() => getter(signal()));
15
- const error = linkedSignal({
16
- source: signal,
17
- computation: () => void 0
18
- });
19
- output.set = (value) => {
20
- try {
21
- signal.set(setter(value));
22
- } catch (e) {
23
- error.set(parseError(e));
24
- }
25
- };
26
- output.error = error.asReadonly();
27
- return output;
28
- }
29
12
 
30
- export { pairwiseSignal, proxySignal };
13
+ export { pairwiseSignal };
@@ -0,0 +1,26 @@
1
+ import { linkedSignal } from '@angular/core';
2
+ import { parseError } from '@juulsgaard/ts-tools';
3
+
4
+ function proxySignal(signal, getter, setter, options) {
5
+ const error = linkedSignal({
6
+ source: signal,
7
+ computation: () => void 0
8
+ });
9
+ const output = linkedSignal(() => getter(signal()), {
10
+ equal: options?.equal,
11
+ set: (value, rawSet) => {
12
+ let parserError;
13
+ const setError = (e) => {
14
+ parserError = e == null ? void 0 : parseError(e);
15
+ };
16
+ const mapped = setter(value, setError);
17
+ signal.set(mapped);
18
+ error.set(parserError);
19
+ rawSet(value);
20
+ }
21
+ });
22
+ output.error = error.asReadonly();
23
+ return output;
24
+ }
25
+
26
+ export { proxySignal };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juulsgaard/signal-tools",
3
- "version": "22.0.2",
3
+ "version": "22.0.3",
4
4
  "description": "Tools for working with Angular signals",
5
5
  "repository": "git@github.com:Juulsgaard/signal-tools.git",
6
6
  "homepage": "https://juulsgaard.github.io/signal-tools/",