UNPKG

optix

Version:

Optix is a data manipulation library that provides optics-like capabilites with a simpler syntax. It features robust Typescript support with minimal type annotations and is smaller and faster than true optics libraries.

57 lines (56 loc) 3.05 kB
export declare type GetKey = (map: { [key: string]: any; }) => string | undefined; export declare type GetKeys = (map: { [key: string]: any; }) => string[]; export declare type GetIndex = (arr: any[]) => number | undefined; export declare type GetIndexes = (arr: any[]) => number[]; export declare type PathItem = string | number | string[] | number[] | GetKey | GetIndex | GetKeys | GetIndexes; export declare type Id<T> = T extends infer U ? { [K in keyof U]: U[K]; } : never; export declare type ValueOf<T> = T[keyof T]; export declare type Unarray<T> = T extends Array<infer U> ? U : T; export declare type PartialIfObject<T> = T extends { [key: string]: any; } ? Partial<T> : T; export declare type WrapType<T, K extends PathItem> = K extends string ? { [key in K]: T; } : K extends number | number[] | GetIndex | GetIndexes ? T[] : K extends GetKey | string[] | GetKeys ? { [key: string]: T; } : never; export declare type WrapTypeOptional<T, K extends PathItem> = K extends string ? { [key in K]?: T; } : K extends number | number[] | GetIndex | GetIndexes ? T[] : K extends GetKey | string[] | GetKeys ? { [key: string]: T; } : never; export declare type UnwrapType<T, K extends PathItem> = K extends string ? T[K] : K extends number | GetIndex | number[] | GetIndexes ? Unarray<T> : K extends GetKey | string[] | GetKeys ? ValueOf<T> : never; export declare type BuildTypeFromPath<T, Keys extends readonly PathItem[]> = Keys extends [infer K, ...infer Rest] ? WrapType<BuildTypeFromPath<T, Rest>, K> : T; export declare type BuildTypeFromPathOptional<T, Keys extends readonly PathItem[]> = Keys extends [infer K, ...infer Rest] ? WrapTypeOptional<BuildTypeFromPathOptional<T, Rest>, K> : T; export declare type GetTypeAtPath<T, Keys extends readonly PathItem[]> = Keys extends [infer K, ...infer Rest] ? GetTypeAtPath<UnwrapType<T, K>, Rest> : T; export declare type NonNeverKeys<T extends { [key: string]: any; }> = { [K in keyof T]: T[K] extends never ? never : K; }[keyof T]; export declare type FilterNeverKeys<T extends { [key: string]: any; }> = { [K in NonNeverKeys<T>]: T[K]; }; export declare type MergeRightWthDepth<L, R, Depth extends any[]> = R extends any[] ? L extends any[] ? Depth extends [infer _, ...infer Rest] ? MergeRightWthDepth<Unarray<L>, Unarray<R>, Rest>[] : (Unarray<L> | Unarray<R>)[] : R : string extends keyof R ? string extends keyof L ? Depth extends [infer _, ...infer Rest] ? { [key: string]: MergeRightWthDepth<ValueOf<L>, ValueOf<R>, Rest>; } : { [key: string]: (ValueOf<L> | ValueOf<R>); } : L extends { [key: string]: any; } ? { [key: string]: (ValueOf<L> | ValueOf<R>); } : R : R extends { [key: string]: any; } ? L extends { [key: string]: any; } ? Id<Pick<L, Exclude<keyof L, keyof R>> & Pick<R, Exclude<keyof R, keyof L>> & FilterNeverKeys<{ [K in keyof L & keyof R]: Depth extends [infer _, ...infer Rest] ? MergeRightWthDepth<L[K], R[K], Rest> : R[K]; }>> : R : R;