mirror of
https://github.com/saltbo/zpan.git
synced 2026-08-28 15:51:29 +08:00
e700fd4977
Maintain a CHANGELOG.md (Keep a Changelog format) at the repo root and surface it on the admin About page: - The page now shows the running build's short commit hash next to the version, linked to the GitHub commit. Commit is injected at build time via a new resolveAppCommit() (ZPAN_APP_COMMIT -> WORKERS_CI_COMMIT_SHA -> git rev-parse), wired through vite/tsup defines, the node entry, Docker, and CI. - A new admin-only GET /api/system/changelog endpoint fetches CHANGELOG.md from master on GitHub, caches it, parses the latest released version, and reports whether an update is available (semver compare against the running version). - The About page renders a "latest version" row with an update-available badge and a side drawer that displays the changelog markdown. Tests cover the semver compare, changelog parse/fetch caching, the API wrapper, and the route (admin-gated, parsed payload). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
30 lines
1.2 KiB
JavaScript
30 lines
1.2 KiB
JavaScript
import { execFileSync } from 'node:child_process'
|
|
import { readFileSync } from 'node:fs'
|
|
|
|
export function resolveAppVersion() {
|
|
// Release/Docker builds pass the exact tag via ZPAN_APP_VERSION. Everything
|
|
// else (Cloudflare Workers Builds, local dev) reads package.json — a source
|
|
// that is present in every build environment, unlike git tags, which are
|
|
// absent from the Workers Builds checkout and from the Docker context.
|
|
if (process.env.ZPAN_APP_VERSION) {
|
|
return process.env.ZPAN_APP_VERSION
|
|
}
|
|
const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8'))
|
|
return pkg.version
|
|
}
|
|
|
|
export function resolveAppCommit() {
|
|
// Release/Docker builds pass the exact SHA via ZPAN_APP_COMMIT; Cloudflare
|
|
// Workers Builds injects WORKERS_CI_COMMIT_SHA. Local dev has neither, so fall
|
|
// back to git. Returns the short SHA, or '' when no source is available.
|
|
const explicit = process.env.ZPAN_APP_COMMIT ?? process.env.WORKERS_CI_COMMIT_SHA
|
|
if (explicit) {
|
|
return explicit.slice(0, 7)
|
|
}
|
|
try {
|
|
return execFileSync('git', ['rev-parse', '--short', 'HEAD'], { encoding: 'utf8' }).trim()
|
|
} catch {
|
|
return ''
|
|
}
|
|
}
|