| 1 | #!/usr/bin/env node |
| 2 | |
| 3 | import { readFileSync } from "node:fs"; |
| 4 | import { isDeepStrictEqual } from "node:util"; |
| 5 | import { releaseForVersion, validateCatalog } from "./release-notes.mjs"; |
| 6 | |
| 7 | const [catalogPath, version, previousCatalogPath] = process.argv.slice(2); |
| 8 | if (!catalogPath || !/^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$/.test(version || "")) { |
| 9 | throw new Error("usage: validate-stable-release-record.mjs CATALOG MAJOR.MINOR.PATCH [PREVIOUS_CATALOG]"); |
| 10 | } |
| 11 | |
| 12 | const catalog = validateCatalog(JSON.parse(readFileSync(catalogPath, "utf8"))); |
| 13 | const release = releaseForVersion(catalog, version); |
| 14 | if (release.version !== version || release.channel !== "stable" || release.status !== "reviewed") { |
| 15 | throw new Error(`v${version} must have one reviewed Stable release record`); |
| 16 | } |
| 17 | |
| 18 | if (previousCatalogPath) { |
| 19 | const previousCatalog = validateCatalog(JSON.parse(readFileSync(previousCatalogPath, "utf8"))); |
| 20 | const previousRelease = previousCatalog.releases.find((entry) => entry.version === version); |
| 21 | if (previousRelease && isDeepStrictEqual(previousRelease, release)) { |
| 22 | throw new Error(`v${version} reviewed Stable record was not introduced or changed by the candidate commit`); |
| 23 | } |
| 24 | } |
| 25 | |
| 26 | console.log(`reviewed Stable release record verified: v${version}`); |
| 27 |