diff --git a/packages/core/src/core/contentGenerator.test.ts b/packages/core/src/core/contentGenerator.test.ts index 74e20e73d4..9b7c3ac802 100644 --- a/packages/core/src/core/contentGenerator.test.ts +++ b/packages/core/src/core/contentGenerator.test.ts @@ -18,6 +18,7 @@ import { LoggingContentGenerator } from './loggingContentGenerator.js'; import { loadApiKey } from './apiKeyCredentialStorage.js'; import { FakeContentGenerator } from './fakeContentGenerator.js'; import { RecordingContentGenerator } from './recordingContentGenerator.js'; +import { resetVersionCache } from '../utils/version.js'; vi.mock('../code_assist/codeAssist.js'); vi.mock('@google/genai'); @@ -35,6 +36,7 @@ const mockConfig = { describe('createContentGenerator', () => { beforeEach(() => { + resetVersionCache(); vi.clearAllMocks(); }); diff --git a/packages/core/src/utils/version.test.ts b/packages/core/src/utils/version.test.ts index 775860b629..94a6f5c7c9 100644 --- a/packages/core/src/utils/version.test.ts +++ b/packages/core/src/utils/version.test.ts @@ -5,7 +5,7 @@ */ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; -import { getVersion } from './version.js'; +import { getVersion, resetVersionCache } from './version.js'; import { getPackageJson } from './package.js'; vi.mock('./package.js', () => ({ @@ -17,6 +17,8 @@ describe('version', () => { beforeEach(() => { vi.resetModules(); + vi.clearAllMocks(); + resetVersionCache(); process.env = { ...originalEnv }; vi.mocked(getPackageJson).mockResolvedValue({ version: '1.0.0' }); }); @@ -43,4 +45,20 @@ describe('version', () => { const version = await getVersion(); expect(version).toBe('unknown'); }); + + it('should cache the version and only call getPackageJson once', async () => { + delete process.env['CLI_VERSION']; + vi.mocked(getPackageJson).mockResolvedValue({ version: '1.2.3' }); + + const version1 = await getVersion(); + expect(version1).toBe('1.2.3'); + expect(getPackageJson).toHaveBeenCalledTimes(1); + + // Change the mock value to simulate an update on disk + vi.mocked(getPackageJson).mockResolvedValue({ version: '2.0.0' }); + + const version2 = await getVersion(); + expect(version2).toBe('1.2.3'); // Should still be the cached version + expect(getPackageJson).toHaveBeenCalledTimes(1); // Should not have been called again + }); }); diff --git a/packages/core/src/utils/version.ts b/packages/core/src/utils/version.ts index ecd7a8b503..53e8b7d569 100644 --- a/packages/core/src/utils/version.ts +++ b/packages/core/src/utils/version.ts @@ -11,7 +11,20 @@ import path from 'node:path'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); -export async function getVersion(): Promise { - const pkgJson = await getPackageJson(__dirname); - return process.env['CLI_VERSION'] || pkgJson?.version || 'unknown'; +let versionPromise: Promise | undefined; + +export function getVersion(): Promise { + if (versionPromise) { + return versionPromise; + } + versionPromise = (async () => { + const pkgJson = await getPackageJson(__dirname); + return process.env['CLI_VERSION'] || pkgJson?.version || 'unknown'; + })(); + return versionPromise; +} + +/** For testing purposes only */ +export function resetVersionCache(): void { + versionPromise = undefined; }