import { createHash } from "node:crypto"; import { mkdir, readFile, writeFile } from "node:fs/promises"; import process from "node:process"; const packageJson = JSON.parse(await readFile("package.json", "utf8")); const packageManagerVersion = packageJson.packageManager.split("@").at(-1); const buildId = process.env.VITE_BUILD_ID ?? "local-build"; const commitSha = process.env.VITE_COMMIT_SHA ?? "local"; const releaseId = process.env.RELEASE_ID ?? "local-release"; const runnerImage = process.env.CI_RUNNER_IMAGE ?? `${process.platform}-${process.arch}`; const builtAt = new Date().toISOString(); const viteManifest = await readFile("dist/.vite/manifest.json"); const assetManifestHash = createHash("sha256") .update(viteManifest) .digest("hex"); const runtimeConfig = JSON.parse(await readFile("dist/config.json", "utf8")); runtimeConfig.BUILD_ID = buildId; runtimeConfig.RELEASE_ID = releaseId; const manifest = { schemaVersion: 1, buildId, commitSha, generatedAt: builtAt, buildContext: { nodeVersion: process.version, packageManagerVersion, runnerImage, }, outputs: { directory: "dist", viteManifest: "dist/.vite/manifest.json", }, }; const releaseManifest = { schemaVersion: 1, appVersion: packageJson.version, buildId, commitSha, configSchemaVersion: runtimeConfig.CONFIG_SCHEMA_VERSION, apiContractVersion: runtimeConfig.API_CONTRACT_VERSION, assetManifestHash, releaseId, builtAt, }; await mkdir("artifacts/release", { recursive: true }); await writeFile("dist/config.json", `${JSON.stringify(runtimeConfig, null, 2)}\n`); await writeFile( "dist/release-manifest.json", `${JSON.stringify(releaseManifest, null, 2)}\n`, ); await writeFile( "artifacts/release/build-manifest.json", `${JSON.stringify(manifest, null, 2)}\n`, );