import { Apply, Call, Fn } from "../../core/Core"; import { Strings } from "../../strings/Strings"; import { Equal, IsTuple, Prettify, Primitive, UnionToIntersection } from "../../helpers"; export type Keys = src extends readonly unknown[] ? { [key in keyof src]: key; }[number] extends infer res ? res extends string ? Call & keyof src : res & keyof src : never : keyof src; export type Values = Keys extends infer keys extends keyof src ? src[keys] : never; export type FromEntries = { [entry in entries as entry[0]]: entry[1]; } | never; export type Entries = Keys extends infer keys extends keyof T ? { [K in keys]: [K, T[K]]; }[keys] : never; export type Assign = Prettify>; export type GetFromPath = RecursiveGet>; type ParsePath = path extends number ? [`${path}`] : path extends `${infer first}${infer rest}` ? first extends "." | "[" | "]" ? ParsePath : ParsePath : [...output, ...(currentChunk extends "" ? [] : [currentChunk])]; type RecursiveGet = Obj extends any ? pathList extends [infer first, ...infer rest] ? first extends keyof Obj ? RecursiveGet : [first, Obj] extends [`${number}` | "number", readonly any[]] ? RecursiveGet[number], rest> : undefined : Obj : never; export type TransformObjectDeep = type extends Function | Date ? type : type extends Map ? Map, TransformObjectDeep> : type extends ReadonlyMap ? ReadonlyMap, TransformObjectDeep> : type extends WeakMap ? WeakMap, object>, TransformObjectDeep> : type extends Set ? Set> : type extends ReadonlySet ? ReadonlySet> : type extends WeakSet ? WeakSet, object>> : type extends Array ? IsTuple extends true ? Call; }> : Array | undefined> : type extends Promise ? Promise> : type extends object ? Call; }> : Equal extends true ? unknown : Partial; export type Update = RecursiveUpdate, fnOrValue>; type RecursiveUpdate = obj extends any ? pathList extends [infer first, ...infer rest] ? first extends keyof obj ? { [K in keyof obj]: Equal extends true ? RecursiveUpdate : obj[K]; } : [first, obj] extends ["number", readonly any[]] ? RecursiveUpdate[number], rest, fnOrValue>[] : Assign<[ obj, { [K in Extract]: RecursiveUpdate<{}, rest, fnOrValue>; } ]> : fnOrValue extends Fn ? Call, obj> : fnOrValue : never; export type Create = pattern extends infer p extends Fn ? Apply : pattern extends Primitive ? pattern : pattern extends readonly [any, ...any] ? { [key in keyof pattern]: Create; } : pattern extends readonly (infer V)[] ? Create[] : pattern extends object ? { [key in keyof pattern]: Create; } : pattern; type JoinPath = [ A ] extends [never] ? B : [B] extends [never] ? A : `${A}${Sep}${B}`; export type AllPaths = T extends Primitive ? ParentPath : unknown extends T ? JoinPath : T extends readonly any[] ? Keys extends infer key extends string | number ? JoinPath | AllPaths> : never : keyof T extends infer key extends keyof T & string ? key extends any ? JoinPath | AllPaths> : never : ParentPath; export {};