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)) }