* Deep merge: arrays are replaced (not concatenated), objects are merged.
(base: Record<string, unknown>, override: Record<string, unknown>)
| 245 | * Deep merge: arrays are replaced (not concatenated), objects are merged. |
| 246 | */ |
| 247 | private deepMerge(base: Record<string, unknown>, override: Record<string, unknown>): Record<string, unknown> { |
| 248 | const result = { ...base } |
| 249 | for (const [key, value] of Object.entries(override)) { |
| 250 | if (value === undefined) continue |
| 251 | if ( |
| 252 | value !== null && |
| 253 | typeof value === 'object' && |
| 254 | !Array.isArray(value) && |
| 255 | typeof base[key] === 'object' && |
| 256 | base[key] !== null && |
| 257 | !Array.isArray(base[key]) |
| 258 | ) { |
| 259 | result[key] = this.deepMerge(base[key] as Record<string, unknown>, value as Record<string, unknown>) |
| 260 | } else { |
| 261 | result[key] = value |
| 262 | } |
| 263 | } |
| 264 | return result |
| 265 | } |
| 266 | } |