Skip to content

Commit acb6cfc

Browse files
committed
fix(cli): use recursive deep merge for editor configs
1 parent 1757033 commit acb6cfc

1 file changed

Lines changed: 25 additions & 20 deletions

File tree

packages/cli/src/utils/editor.ts

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

395400
function resolveEditorId(editor: string): EditorId | undefined {

0 commit comments

Comments
 (0)