solid-js
Version:
A declarative JavaScript library for building user interfaces.
51 lines (50 loc) • 4.61 kB
TypeScript
export declare const $RAW: unique symbol;
declare type AddSymbolToPrimitive<T> = T extends {
[Symbol.toPrimitive]: infer V;
} ? {
[Symbol.toPrimitive]: V;
} : {};
declare type AddCallable<T> = T extends {
(...x: any[]): infer V;
} ? {
(...x: Parameters<T>): V;
} : {};
declare type NotWrappable = string | number | boolean | Function | null;
export declare type Store<T> = {
[P in keyof T]: T[P] extends object ? Store<T[P]> : T[P];
} & {
[$RAW]?: T;
} & AddSymbolToPrimitive<T> & AddCallable<T>;
export declare function isWrappable(obj: any): boolean;
export declare function unwrap<T>(item: any): T;
export declare function setProperty(state: any, property: string | number, value: any, force?: boolean): void;
export declare function updatePath(current: any, path: any[], traversed?: (number | string)[]): void;
declare type StoreSetter<T> = Partial<T> | ((prevState: T extends NotWrappable ? T : Store<T>, traversed?: (string | number)[]) => Partial<T> | void);
declare type StorePathRange = {
from?: number;
to?: number;
by?: number;
};
declare type ArrayFilterFn<T> = (item: T extends any[] ? T[number] : never, index: number) => boolean;
declare type Part<T> = keyof T | Array<keyof T> | StorePathRange | ArrayFilterFn<T>;
declare type Next<T, K> = K extends keyof T ? T[K] : K extends Array<keyof T> ? T[K[number]] : T extends any[] ? K extends StorePathRange ? T[number] : K extends ArrayFilterFn<T> ? T[number] : never : never;
export interface SetStoreFunction<T> {
<Setter extends StoreSetter<T>>(...args: [Setter]): void;
<K1 extends Part<T>, Setter extends StoreSetter<Next<T, K1>>>(...args: [K1, Setter]): void;
<K1 extends Part<T>, K2 extends Part<Next<T, K1>>, Setter extends StoreSetter<Next<Next<T, K1>, K2>>>(...args: [K1, K2, Setter]): void;
<K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, Setter extends StoreSetter<Next<Next<Next<T, K1>, K2>, K3>>>(...args: [K1, K2, K3, Setter]): void;
<K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, Setter extends StoreSetter<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>>(...args: [K1, K2, K3, K4, Setter]): void;
<K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>>(...args: [K1, K2, K3, K4, K5, Setter]): void;
<K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>>(...args: [K1, K2, K3, K4, K5, K6, Setter]): void;
<K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, Setter extends StoreSetter<Next<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, Setter]): void;
<K1 extends Part<T>, K2 extends Part<Next<T, K1>>, K3 extends Part<Next<Next<T, K1>, K2>>, K4 extends Part<Next<Next<Next<T, K1>, K2>, K3>>, K5 extends Part<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>>, K6 extends Part<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>>, K7 extends Part<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>>, K8 extends Part<Next<Next<Next<Next<Next<Next<Next<T, K1>, K2>, K3>, K4>, K5>, K6>, K7>>>(...args: [K1, K2, K3, K4, K5, K6, K7, K8, ...(Part<any> | StoreSetter<any>)[]]): void;
}
export declare function createStore<T>(state: T | Store<T>): [Store<T>, SetStoreFunction<T>];
export declare function createMutable<T>(state: T | Store<T>): Store<T>;
declare type ReconcileOptions = {
key?: string | null;
merge?: boolean;
};
export declare function reconcile<T>(value: T | Store<T>, options?: ReconcileOptions): (state: T extends NotWrappable ? T : Store<T>) => void;
export declare function produce<T>(fn: (state: T) => void): (state: T extends NotWrappable ? T : Store<T>) => T extends NotWrappable ? T : Store<T>;
export {};