Forráskód Böngészése

test: add web-admin build id and version.json helpers.

Co-authored-by: Cursor <cursoragent@cursor.com>
wuzilong 2 hete
szülő
commit
1f0130de53

+ 61 - 0
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' })
+  })
+})

+ 31 - 0
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')
+}