UNPKG

firestore-auto-sync

Version:

<a href="https://www.npmjs.com/package/firestore-auto-sync"><img src="https://img.shields.io/npm/v/firestore-auto-sync.svg" alt="Total Downloads"></a> <a href="https://www.npmjs.com/package/firestore-auto-sync"><img src="https://img.shields.io/npm/dw/fire

62 lines (61 loc) 2.13 kB
import { O, U } from "ts-toolbelt"; export declare type DeepPartial<T extends Record<string, any>> = O.Optional<T, keyof T, "deep">; /** * Returns the type for string literals. * * When the type is an empty string literal `''` or a generic `string` it returns `never` */ declare type IsFullStringLiteral<T> = T extends string ? ("" extends T ? false : true) : false; /** * Joins two keys into a dot notation path * * Stops at arrays. Otherwise it would include `${number}` */ declare type Join<K, P> = K extends string ? P extends string ? IsFullStringLiteral<P> extends true ? `${K}.${P}` : K : P extends number ? K : never : never; declare type Prev = [never, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ...0[]]; /** * All possible Object Paths, branches AND leaves * @example OPaths<{ a: { b: number } }> * // returns 'a' | 'a.b' */ export declare type OPaths<T, D extends number = 10> = [D] extends [never] ? never : U.Intersect<T, null | undefined> extends never ? T extends Record<string, any> ? { [K in keyof T]-?: K extends string ? `${K}` | Join<K, OPaths<T[K], Prev[D]>> : never; }[keyof T] : "" : ""; /** * All possible Object Paths, but only the leaves * @example OPaths<{ a: { b: number } }> * // returns 'a.b' */ export declare type OLeaves<T, D extends number = 10> = [D] extends [never] ? "" : U.Intersect<T, null | undefined> extends never ? T extends Record<string, any> ? { [K in keyof T]-?: IsFullStringLiteral<K> extends true ? Join<K, OLeaves<T[K], Prev[D]>> : ""; }[keyof T] : "" : ""; declare type Test = { a: { b: { c: { d: number; e: number; }; }; inA: string; }; x: string[]; y: { name: string; } | undefined; z: { [key in string]: { zzz: number[]; }; }; z123: { a123: { [key in string]: { zzz: number[]; }; }; }; }; export declare type FlatTestPaths = OPaths<Test, 4>; export declare type FlatTestLeaves = OLeaves<Test, 4>; export {};