From 872cba607fda947e6c5fd17ff7fef8d666fd11aa Mon Sep 17 00:00:00 2001 From: gonzaloriestra <14979109+gonzaloriestra@users.noreply.github.com> Date: Sat, 25 Jul 2026 00:27:36 +0000 Subject: [PATCH] [Refactor] Use early returns in addRecommendedExtensions Refactor `addRecommendedExtensions` to return early if the project is not a VSCode project. This reduces nested blocks and simplifies control flow. Unit tests have been added to verify functionality. --- .../cli-kit/src/public/node/vscode.test.ts | 60 ++++++++++++++++++- packages/cli-kit/src/public/node/vscode.ts | 26 ++++---- 2 files changed, 72 insertions(+), 14 deletions(-) diff --git a/packages/cli-kit/src/public/node/vscode.test.ts b/packages/cli-kit/src/public/node/vscode.test.ts index 58bc65fd552..d76ab374ed4 100644 --- a/packages/cli-kit/src/public/node/vscode.test.ts +++ b/packages/cli-kit/src/public/node/vscode.test.ts @@ -1,5 +1,5 @@ -import {isVSCode} from './vscode.js' -import {inTemporaryDirectory, mkdir} from './fs.js' +import {isVSCode, addRecommendedExtensions} from './vscode.js' +import {inTemporaryDirectory, mkdir, writeFile, readFile, fileExists} from './fs.js' import {joinPath} from './path.js' import {describe, expect, test} from 'vitest' @@ -19,3 +19,59 @@ describe('isVSCode', () => { }) }) }) + +describe('addRecommendedExtensions', () => { + test('does nothing if the project is not a VSCode project', async () => { + await inTemporaryDirectory(async (tmpDir) => { + // Given + const extensionsPath = joinPath(tmpDir, '.vscode/extensions.json') + + // When + await addRecommendedExtensions(tmpDir, ['shopify.theme-check-vscode']) + + // Then + await expect(fileExists(extensionsPath)).resolves.toEqual(false) + }) + }) + + test('creates extensions.json if missing inside a VSCode project', async () => { + await inTemporaryDirectory(async (tmpDir) => { + // Given + await mkdir(joinPath(tmpDir, '.vscode')) + const extensionsPath = joinPath(tmpDir, '.vscode/extensions.json') + + // When + await addRecommendedExtensions(tmpDir, ['shopify.theme-check-vscode']) + + // Then + await expect(fileExists(extensionsPath)).resolves.toEqual(true) + const content = JSON.parse(await readFile(extensionsPath)) + expect(content).toEqual({ + recommendations: ['shopify.theme-check-vscode'], + }) + }) + }) + + test('appends recommendations to an existing extensions.json', async () => { + await inTemporaryDirectory(async (tmpDir) => { + // Given + await mkdir(joinPath(tmpDir, '.vscode')) + const extensionsPath = joinPath(tmpDir, '.vscode/extensions.json') + const initialJson = { + recommendations: ['octref.vetur'], + otherSetting: true, + } + await writeFile(extensionsPath, JSON.stringify(initialJson, null, 2)) + + // When + await addRecommendedExtensions(tmpDir, ['shopify.theme-check-vscode']) + + // Then + const content = JSON.parse(await readFile(extensionsPath)) + expect(content).toEqual({ + recommendations: ['octref.vetur', 'shopify.theme-check-vscode'], + otherSetting: true, + }) + }) + }) +}) diff --git a/packages/cli-kit/src/public/node/vscode.ts b/packages/cli-kit/src/public/node/vscode.ts index 0962bf9c10f..7cc1b3101f7 100644 --- a/packages/cli-kit/src/public/node/vscode.ts +++ b/packages/cli-kit/src/public/node/vscode.ts @@ -33,18 +33,20 @@ export async function addRecommendedExtensions(directory: string, recommendation outputDebug(outputContent`Adding VSCode recommended extensions at ${outputToken.path(directory)}: ${outputToken.json(recommendations)} `) - const extensionsPath = joinPath(directory, '.vscode/extensions.json') - if (await isVSCode(directory)) { - let originalExtensionsJson = {recommendations: []} - if (await fileExists(extensionsPath)) { - const originalExtensionsFile = await readFile(extensionsPath) - originalExtensionsJson = JSON.parse(originalExtensionsFile) - } - const newExtensionsJson = { - ...originalExtensionsJson, - recommendations: [...originalExtensionsJson.recommendations, ...recommendations], - } - await writeFile(extensionsPath, JSON.stringify(newExtensionsJson, null, 2)) + if (!(await isVSCode(directory))) { + return + } + + const extensionsPath = joinPath(directory, '.vscode/extensions.json') + let originalExtensionsJson = {recommendations: [] as string[]} + if (await fileExists(extensionsPath)) { + const originalExtensionsFile = await readFile(extensionsPath) + originalExtensionsJson = JSON.parse(originalExtensionsFile) + } + const newExtensionsJson = { + ...originalExtensionsJson, + recommendations: [...originalExtensionsJson.recommendations, ...recommendations], } + await writeFile(extensionsPath, JSON.stringify(newExtensionsJson, null, 2)) }