diff --git a/lib/__tests__/utils.test.ts b/lib/__tests__/utils.test.ts index 800ebc9..218985d 100644 --- a/lib/__tests__/utils.test.ts +++ b/lib/__tests__/utils.test.ts @@ -1,4 +1,11 @@ -import { formatVersion, formatFileSize, formatDateTime } from '../utils'; +import { formatVersion, formatFileSize, formatDateTime, getProjectDisplayName } from '../utils'; + +// Mock fs module +const fs = require('fs'); +jest.mock('fs', () => ({ + ...jest.requireActual('fs'), + readFileSync: jest.fn(), +})); describe('formatVersion', () => { test('应该将下划线替换为点号', () => { @@ -63,3 +70,39 @@ describe('formatDateTime', () => { expect(formatDateTime(date)).toBe('2024-01-05 09:05'); }); }); + +describe('getProjectDisplayName', () => { + const originalAliases = { + 'FT': '外放构建', + 'FT_DEV': '开发构建', + }; + + beforeEach(() => { + // Mock the aliases file + fs.readFileSync.mockReturnValue(JSON.stringify(originalAliases)); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should return display name for aliased project', () => { + expect(getProjectDisplayName('FT')).toBe('外放构建'); + }); + + it('should return directory name when no alias exists', () => { + expect(getProjectDisplayName('UNKNOWN')).toBe('UNKNOWN'); + }); + + it('should return directory name when aliases file is empty', () => { + fs.readFileSync.mockReturnValue('{}'); + expect(getProjectDisplayName('FT')).toBe('FT'); + }); + + it('should return directory name when aliases file cannot be read', () => { + fs.readFileSync.mockImplementation(() => { + throw new Error('File not found'); + }); + expect(getProjectDisplayName('FT')).toBe('FT'); + }); +}); diff --git a/lib/utils.ts b/lib/utils.ts index 88b3e4f..295e82d 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -1,5 +1,7 @@ // lib/utils.ts // Client-safe utility functions +import * as fs from 'fs'; +import * as path from 'path'; /** * 格式化版本号显示 (0_42 -> 0.42) @@ -29,3 +31,18 @@ export function formatDateTime(date: Date): string { const minutes = String(date.getMinutes()).padStart(2, '0'); return `${year}-${month}-${day} ${hours}:${minutes}`; } + +/** + * 获取项目显示名称(从别名配置) + */ +export function getProjectDisplayName(projectName: string): string { + try { + const aliasesPath = path.join(process.cwd(), 'lib', 'project-aliases.json'); + const aliasesContent = fs.readFileSync(aliasesPath, 'utf-8'); + const aliases = JSON.parse(aliasesContent); + return aliases[projectName] || projectName; + } catch { + // If file doesn't exist or is invalid, return original name + return projectName; + } +}