deno.land / x / solid_signals@solid-signals@1.3.7 / src / utils / signal.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
import { Signal } from "solid-js";
export const wireSignal = <Sig extends Signal<{}>>(signal: Sig) => [ new Proxy(() => signal[0](), { get: (_, key: any) => (signal[0] as any)[key], }), new Proxy((setStateAction) => signal[1](setStateAction), { get: (_, key: any) => (signal[1] as any)[key], }), ] as Sig;
export const signalExtender = <Sig extends Signal<{}>>(signal: Sig) => ({ extend< Extensions extends [{}, {}], ExtendedSignal extends Signal<{}> = Sig & Extensions >( extensions: (signal: ExtendedSignal) => Extensions, createBaseSetter?: (signal: ExtendedSignal) => Sig[1] ) { if (createBaseSetter) signal[1] = (() => { // Pass signal with extensions before reassigning to baseSetter to prevent self call const signalWithoutNewBase = [ signal[0], () => { // To be reassigned throw new Error( "Cannot call setter immediately in .extend callback, must be used in extension" ); }, ] as unknown as ExtendedSignal;
const [extendedGet, extendedSet] = extensions( wireSignal(signalWithoutNewBase) );
Object.assign(signal[0], extendedGet); const setterWithoutNewBase = Object.assign(signal[1], extendedSet);
signalWithoutNewBase[1] = setterWithoutNewBase;
return Object.assign(createBaseSetter(signalWithoutNewBase), signal[1]); })(); else extensions(wireSignal(signal) as any).forEach((value, i) => { Object.assign(signal[i], value); }); return signal as unknown as ExtendedSignal; },});
export type NativeMutators<T, Methods extends keyof T> = { [Method in Methods]: T[Method];};
export const getNativeExtensions = <T, Methods extends keyof T>( makeCopy: () => T, setState: (state: T) => void, mutators: readonly Methods[]) => Object.fromEntries( mutators.map(<Method extends Methods>(method: Method) => [ method, (...args: T extends (...args: infer Args) => any ? Args : never) => { const s = makeCopy();
// @ts-expect-error const res = s[method](...args); setState(s);
return res; }, ]) ) as unknown as NativeMutators<T, Methods>;
solid_signals

Version Info

Tagged at
a year ago