type AnySource = object | null | undefined; /** Flattens a computed object type so the language server shows the merged literal, not `DeepMergeTwo`. */ type Prettify = { [K in keyof T]: T[K]; } & {}; /** True only for plain objects: excludes arrays/tuples and functions (which `deepMerge` treats as leaves). */ type IsPlainObject = T extends object ? T extends readonly unknown[] ? false : T extends (...args: never[]) => unknown ? false : true : false; /** * Merges two sources into one flat object whose keys are the union of both. Overlapping keys take the * right-hand value, except when both sides are plain objects (recurse) and except `ref` (always last-wins). */ type DeepMergeTwo = Prettify<{ [K in keyof A | keyof B]: K extends keyof B ? K extends keyof A ? K extends 'ref' ? B[K] : IsPlainObject extends true ? IsPlainObject extends true ? DeepMergeTwo : B[K] : B[K] : B[K] : K extends keyof A ? A[K] : never; }>; /** * Result of `deepMerge(...sources)`: the sources folded left-to-right, last-wins for scalars/arrays/`ref`, * recursive for plain objects. `null` / `undefined` sources are skipped. */ export type DeepMerged = Sources extends readonly [infer Head, ...infer Tail] ? Tail extends readonly AnySource[] ? [Head] extends [null | undefined] ? DeepMerged : Tail extends readonly [] ? Head : DeepMergeTwo, DeepMerged> : Record : Record; export {};