export type Entries = { [K in keyof T]: [K, T[K]]; }[keyof T][]; export type ObjectPaths = T extends object ? { [K in keyof T & (string | number)]: T[K] extends object ? `${K}` | `${K}.${ObjectPaths}` : `${K}`; }[keyof T & (string | number)] : never; export type Split = S extends `${infer T}${D}${infer U}` ? [T, ...Split] : [S]; export type ValueAtPath = Parts extends [ infer Head, ...infer Tail ] ? Head extends keyof T ? ValueAtPath : Head extends string ? T extends Record ? ValueAtPath : T extends Array ? Head extends `${number}` ? ValueAtPath : never : never : never : T; export type ObjectChangeCommand> = { type: "update"; path: P; value: ValueAtPath>; } | { type: "removeObjectKey"; path: P; key: string; } | { type: "removeArrayElement"; path: P & (ValueAtPath> extends any[] ? unknown : never); index: number; }; export type DeepPartial = { [P in keyof T]?: T[P] extends Array ? Array> : T[P] extends object ? DeepPartial : T[P]; };