diff --git a/packages/cli/src/config/extensions/extensionEnablement.test.ts b/packages/cli/src/config/extensions/extensionEnablement.test.ts index 8923f6e023..63a38ca5e8 100644 --- a/packages/cli/src/config/extensions/extensionEnablement.test.ts +++ b/packages/cli/src/config/extensions/extensionEnablement.test.ts @@ -9,6 +9,7 @@ import fs from 'node:fs'; import os from 'node:os'; import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { ExtensionEnablementManager, Override } from './extensionEnablement.js'; +import type { Extension } from '../extension.js'; // Helper to create a temporary directory for testing function createTestDir() { @@ -225,6 +226,63 @@ describe('ExtensionEnablementManager', () => { true, ); }); + + describe('validateExtensionOverrides', () => { + let consoleErrorSpy: ReturnType; + + beforeEach(() => { + consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => {}); + }); + + afterEach(() => { + consoleErrorSpy.mockRestore(); + }); + + it('should not log an error if enabledExtensionNamesOverride is empty', () => { + const manager = new ExtensionEnablementManager(configDir, []); + manager.validateExtensionOverrides([]); + expect(consoleErrorSpy).not.toHaveBeenCalled(); + }); + + it('should not log an error if all enabledExtensionNamesOverride are valid', () => { + const manager = new ExtensionEnablementManager(configDir, [ + 'ext-one', + 'ext-two', + ]); + const extensions = [ + { config: { name: 'ext-one' } }, + { config: { name: 'ext-two' } }, + ] as Extension[]; + manager.validateExtensionOverrides(extensions); + expect(consoleErrorSpy).not.toHaveBeenCalled(); + }); + + it('should log an error for each invalid extension name in enabledExtensionNamesOverride', () => { + const manager = new ExtensionEnablementManager(configDir, [ + 'ext-one', + 'ext-invalid', + 'ext-another-invalid', + ]); + const extensions = [ + { config: { name: 'ext-one' } }, + { config: { name: 'ext-two' } }, + ] as Extension[]; + manager.validateExtensionOverrides(extensions); + expect(consoleErrorSpy).toHaveBeenCalledTimes(2); + expect(consoleErrorSpy).toHaveBeenCalledWith( + 'Extension not found: ext-invalid', + ); + expect(consoleErrorSpy).toHaveBeenCalledWith( + 'Extension not found: ext-another-invalid', + ); + }); + + it('should not log an error if "none" is in enabledExtensionNamesOverride', () => { + const manager = new ExtensionEnablementManager(configDir, ['none']); + manager.validateExtensionOverrides([]); + expect(consoleErrorSpy).not.toHaveBeenCalled(); + }); + }); }); describe('Override', () => { diff --git a/packages/cli/src/config/extensions/extensionEnablement.ts b/packages/cli/src/config/extensions/extensionEnablement.ts index 79ce5ac2d6..c1e45101c2 100644 --- a/packages/cli/src/config/extensions/extensionEnablement.ts +++ b/packages/cli/src/config/extensions/extensionEnablement.ts @@ -121,6 +121,7 @@ export class ExtensionEnablementManager { validateExtensionOverrides(extensions: Extension[]) { for (const name of this.enabledExtensionNamesOverride) { + if (name === 'none') continue; if ( !extensions.some( (ext) => ext.config.name.toLowerCase() === name.toLowerCase(),