@@ -368,28 +368,33 @@ function mergeEditorConfigs(
368368 } ;
369369 }
370370
371- // settings.json: 2-level deep merge, preserving existing keys
372- const result = { ...existing } ;
373- for ( const [ key , value ] of Object . entries ( incoming ) ) {
374- if ( ! ( key in result ) ) {
375- result [ key ] = value ;
376- } else if (
377- typeof result [ key ] === 'object' &&
378- result [ key ] !== null &&
379- ! Array . isArray ( result [ key ] ) &&
380- typeof value === 'object' &&
381- value !== null &&
382- ! Array . isArray ( value )
383- ) {
384- // Nested object: merge preserving existing keys
385- result [ key ] = {
386- ...( value as Record < string , unknown > ) ,
387- ...( result [ key ] as Record < string , unknown > ) ,
388- } ;
371+ // settings.json: recursive deep merge, preserving existing keys
372+ function deepMerge (
373+ target : Record < string , unknown > ,
374+ source : Record < string , unknown > ,
375+ ) : Record < string , unknown > {
376+ const result = { ...target } ;
377+ for ( const [ key , value ] of Object . entries ( source ) ) {
378+ if ( ! ( key in result ) ) {
379+ result [ key ] = value ;
380+ } else if (
381+ typeof result [ key ] === 'object' &&
382+ result [ key ] !== null &&
383+ ! Array . isArray ( result [ key ] ) &&
384+ typeof value === 'object' &&
385+ value !== null &&
386+ ! Array . isArray ( value )
387+ ) {
388+ result [ key ] = deepMerge (
389+ result [ key ] as Record < string , unknown > ,
390+ value as Record < string , unknown > ,
391+ ) ;
392+ }
389393 }
390- // else: existing key is preserved as-is
394+ return result ;
391395 }
392- return result ;
396+
397+ return deepMerge ( existing , incoming ) ;
393398}
394399
395400function resolveEditorId ( editor : string ) : EditorId | undefined {
0 commit comments