import { execSync } from 'node:child_process'; import { mkdir, writeFile } from 'node:fs/promises'; import path from 'node:path'; import process from 'node:process'; const rootDir = path.resolve(process.cwd()); const publicDir = path.join(rootDir, 'public'); const generatedDir = path.join(rootDir, 'src', 'generated'); const publicVersionPath = path.join(publicDir, '__build_version__.json'); const moduleVersionPath = path.join(generatedDir, 'buildVersion.js'); function readGitShortSha() { try { return execSync('git rev-parse --short HEAD', { cwd: rootDir, stdio: ['ignore', 'pipe', 'ignore'], encoding: 'utf8', }).trim(); } catch { return 'unknown'; } } function readGitFullSha() { try { return execSync('git rev-parse HEAD', { cwd: rootDir, stdio: ['ignore', 'pipe', 'ignore'], encoding: 'utf8', }).trim(); } catch { return 'unknown'; } } function readEnvText(name) { const value = String(process.env[name] || '').trim(); return value || ''; } function createBuildVersion() { const now = new Date(); const iso = now.toISOString(); const compact = iso.replace(/[-:TZ.]/g, '').slice(0, 14); const buildHostGitSha = readGitShortSha(); const buildHostGitFullSha = readGitFullSha(); const sourceGitSha = readEnvText('SOURCE_GIT_SHA') || buildHostGitSha; const sourceGitFullSha = readEnvText('SOURCE_GIT_FULL_SHA') || buildHostGitFullSha; const sourceGitRef = readEnvText('SOURCE_GIT_REF'); const sourceMetadataMode = sourceGitSha === buildHostGitSha ? 'git' : 'env'; return { version: `${compact}-${sourceGitSha}`, builtAt: iso, gitSha: sourceGitSha, sourceGitSha, sourceGitFullSha, sourceGitRef, buildHostGitSha, buildHostGitFullSha, sourceMetadataMode, }; } async function main() { const payload = createBuildVersion(); const jsonContent = `${JSON.stringify(payload, null, 2)}\n`; const moduleContent = [ `export const BUILD_VERSION = ${JSON.stringify(payload.version)};`, `export const BUILD_METADATA = ${JSON.stringify(payload, null, 2)};`, '', ].join('\n'); await mkdir(publicDir, { recursive: true }); await mkdir(generatedDir, { recursive: true }); await writeFile(publicVersionPath, jsonContent, 'utf8'); await writeFile(moduleVersionPath, moduleContent, 'utf8'); process.stdout.write(`Wrote build version ${payload.version}\n`); } main().catch((error) => { process.stderr.write(`${error.message}\n`); process.exitCode = 1; });