From 1f0130de53ef3511ca49d7a91b099617dfd780ce Mon Sep 17 00:00:00 2001 From: wuzilong <704541015@qq.com> Date: Fri, 16 Oct 2026 13:27:57 +0800 Subject: [PATCH] test: add web-admin build id and version.json helpers. Co-authored-by: Cursor --- web-admin/scripts/app-build-meta.test.ts | 61 ++++++++++++++++++++++++ web-admin/scripts/app-build-meta.ts | 31 ++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 web-admin/scripts/app-build-meta.test.ts create mode 100644 web-admin/scripts/app-build-meta.ts diff --git a/web-admin/scripts/app-build-meta.test.ts b/web-admin/scripts/app-build-meta.test.ts new file mode 100644 index 000000000..c80018aee --- /dev/null +++ b/web-admin/scripts/app-build-meta.test.ts @@ -0,0 +1,61 @@ +// web-admin/scripts/app-build-meta.test.ts +import assert from 'node:assert/strict' +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +import { describe, it } from 'node:test' +import { + createAppBuildMeta, + readGitShort, + versionJsonText, + writeVersionJson +} from './app-build-meta.ts' + +describe('createAppBuildMeta', () => { + it('joins git short hash and timestamp', () => { + assert.deepEqual(createAppBuildMeta('3.0.2', 1730000000000, 'a1b2c3d'), { + version: '3.0.2', + buildId: 'a1b2c3d-1730000000000' + }) + }) + + it('uses nogit when the hash is empty', () => { + assert.equal(createAppBuildMeta('3.0.2', 5, ' ').buildId, 'nogit-5') + }) + + it('changes buildId when the timestamp changes', () => { + const a = createAppBuildMeta('3.0.2', 1, 'abc') + const b = createAppBuildMeta('3.0.2', 2, 'abc') + assert.notEqual(a.buildId, b.buildId) + }) +}) + +describe('readGitShort', () => { + it('trims command output', () => { + assert.equal(readGitShort(() => 'abc123\n'), 'abc123') + }) + + it('returns nogit when the command throws or is blank', () => { + assert.equal( + readGitShort(() => { + throw new Error('no git') + }), + 'nogit' + ) + assert.equal(readGitShort(() => ' '), 'nogit') + }) +}) + +describe('version.json', () => { + it('writes pretty json with a trailing newline', () => { + const text = versionJsonText({ version: '3.0.2', buildId: 'abc-1' }) + assert.equal(text, '{\n "version": "3.0.2",\n "buildId": "abc-1"\n}\n') + }) + + it('writes dist/version.json', () => { + const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'app-ver-')) + writeVersionJson(dir, { version: '3.0.3', buildId: 'def-9' }) + const raw = fs.readFileSync(path.join(dir, 'version.json'), 'utf8') + assert.deepEqual(JSON.parse(raw), { version: '3.0.3', buildId: 'def-9' }) + }) +}) diff --git a/web-admin/scripts/app-build-meta.ts b/web-admin/scripts/app-build-meta.ts new file mode 100644 index 000000000..4466df654 --- /dev/null +++ b/web-admin/scripts/app-build-meta.ts @@ -0,0 +1,31 @@ +// web-admin/scripts/app-build-meta.ts +import fs from 'node:fs' +import path from 'node:path' + +export type AppBuildMeta = { + version: string + buildId: string +} + +export function readGitShort(run: () => string): string { + try { + const text = run().trim() + return text || 'nogit' + } catch { + return 'nogit' + } +} + +export function createAppBuildMeta(version: string, nowMs: number, gitShort: string): AppBuildMeta { + const hash = gitShort.trim() || 'nogit' + return { version, buildId: `${hash}-${nowMs}` } +} + +export function versionJsonText(meta: AppBuildMeta): string { + return `${JSON.stringify({ version: meta.version, buildId: meta.buildId }, null, 2)}\n` +} + +export function writeVersionJson(outDir: string, meta: AppBuildMeta): void { + fs.mkdirSync(outDir, { recursive: true }) + fs.writeFileSync(path.join(outDir, 'version.json'), versionJsonText(meta), 'utf8') +}