Skip to content

Commit f945d8f

Browse files
committed
refactor(editor): improve extraVsCodeSettings naming, type safety, and test coverage
1 parent 3c658fd commit f945d8f

File tree

3 files changed

+52
-7
lines changed

3 files changed

+52
-7
lines changed

packages/cli/src/create/bin.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -796,7 +796,7 @@ Use \`vp create --list\` to list all available templates, or run \`vp create --h
796796
editorId: selectedEditor,
797797
interactive: options.interactive,
798798
silent: compactOutput,
799-
additionalSettings: { 'npm.scriptRunner': 'vp' },
799+
extraVsCodeSettings: { 'npm.scriptRunner': 'vp' },
800800
});
801801
resumeCreateProgress();
802802
workspaceInfo.rootDir = fullPath;

packages/cli/src/utils/__tests__/editor.spec.ts

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ describe('writeEditorConfigs', () => {
4949
editorId: 'vscode',
5050
interactive: false,
5151
silent: true,
52-
additionalSettings: { 'npm.scriptRunner': 'vp' },
52+
extraVsCodeSettings: { 'npm.scriptRunner': 'vp' },
5353
});
5454

5555
const settings = JSON.parse(
@@ -84,7 +84,7 @@ describe('writeEditorConfigs', () => {
8484
editorId: 'vscode',
8585
interactive: false,
8686
silent: true,
87-
additionalSettings: { 'npm.scriptRunner': 'vp' },
87+
extraVsCodeSettings: { 'npm.scriptRunner': 'vp' },
8888
});
8989

9090
const settings = JSON.parse(
@@ -104,6 +104,51 @@ describe('writeEditorConfigs', () => {
104104
expect(codeActions['source.fixAll.oxc']).toBe('explicit');
105105
});
106106

107+
it('does not apply extraVsCodeSettings to zed editor', async () => {
108+
const projectRoot = createTempDir();
109+
110+
await writeEditorConfigs({
111+
projectRoot,
112+
editorId: 'zed',
113+
interactive: false,
114+
silent: true,
115+
extraVsCodeSettings: { 'npm.scriptRunner': 'vp' },
116+
});
117+
118+
const settings = JSON.parse(
119+
fs.readFileSync(path.join(projectRoot, '.zed', 'settings.json'), 'utf8'),
120+
) as Record<string, unknown>;
121+
122+
expect(settings['npm.scriptRunner']).toBeUndefined();
123+
});
124+
125+
it('preserves existing npm.scriptRunner during merge with extraVsCodeSettings', async () => {
126+
const projectRoot = createTempDir();
127+
128+
const vscodeDir = path.join(projectRoot, '.vscode');
129+
fs.mkdirSync(vscodeDir, { recursive: true });
130+
fs.writeFileSync(
131+
path.join(vscodeDir, 'settings.json'),
132+
JSON.stringify({ 'npm.scriptRunner': 'npm' }),
133+
'utf8',
134+
);
135+
136+
await writeEditorConfigs({
137+
projectRoot,
138+
editorId: 'vscode',
139+
interactive: false,
140+
silent: true,
141+
extraVsCodeSettings: { 'npm.scriptRunner': 'vp' },
142+
});
143+
144+
const settings = JSON.parse(
145+
fs.readFileSync(path.join(projectRoot, '.vscode', 'settings.json'), 'utf8'),
146+
) as Record<string, unknown>;
147+
148+
// deepMerge preserves existing keys — 'npm' is not overwritten by 'vp'
149+
expect(settings['npm.scriptRunner']).toBe('npm');
150+
});
151+
107152
it('writes zed settings that align formatter config with vite.config.ts', async () => {
108153
const projectRoot = createTempDir();
109154

packages/cli/src/utils/editor.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,14 +267,14 @@ export async function writeEditorConfigs({
267267
interactive,
268268
conflictDecisions,
269269
silent = false,
270-
additionalSettings,
270+
extraVsCodeSettings,
271271
}: {
272272
projectRoot: string;
273273
editorId: EditorId | undefined;
274274
interactive: boolean;
275275
conflictDecisions?: Map<string, 'merge' | 'skip'>;
276276
silent?: boolean;
277-
additionalSettings?: Record<string, unknown>;
277+
extraVsCodeSettings?: Record<string, string>;
278278
}) {
279279
if (!editorId) {
280280
return;
@@ -290,8 +290,8 @@ export async function writeEditorConfigs({
290290

291291
for (const [fileName, baseIncoming] of Object.entries(editorConfig.files)) {
292292
const incoming =
293-
editorId === 'vscode' && fileName === 'settings.json' && additionalSettings
294-
? { ...baseIncoming, ...additionalSettings }
293+
editorId === 'vscode' && fileName === 'settings.json' && extraVsCodeSettings
294+
? { ...extraVsCodeSettings, ...baseIncoming }
295295
: baseIncoming;
296296
const filePath = path.join(targetDir, fileName);
297297

0 commit comments

Comments
 (0)