type Mergeable = | Record | unknown[] | string | number | boolean | null | undefined; function isPlainObject(value: unknown): value is Record { return typeof value === "object" && value !== null && !Array.isArray(value); } export function mergeConfig(base: T, override: unknown): T { if (override === undefined || override === null) { return base; } if (Array.isArray(base)) { return (Array.isArray(override) ? [...override] : [...base]) as T; } if (isPlainObject(base)) { if (!isPlainObject(override)) { return { ...base } as T; } const result: Record = { ...base }; for (const [key, value] of Object.entries(override)) { const baseValue = result[key]; if (Array.isArray(value)) { result[key] = [...value]; continue; } if (isPlainObject(baseValue) && isPlainObject(value)) { result[key] = mergeConfig(baseValue, value); continue; } result[key] = value; } return result as T; } return override as T; }