diff --git a/scripts/verify-hosting-headers.mjs b/scripts/verify-hosting-headers.mjs index c539170..d7d23dd 100644 --- a/scripts/verify-hosting-headers.mjs +++ b/scripts/verify-hosting-headers.mjs @@ -7,6 +7,11 @@ const securityPolicy = JSON.parse( await readFile("config/hosting/security-headers.json", "utf8"), ); const baseUrl = process.env.HOSTING_BASE_URL; +const distFiles = (await readdir("dist", { recursive: true })).map(String); +const publicSourceMaps = distFiles.filter((file) => file.endsWith(".map")); +const publicServiceWorkers = distFiles.filter((file) => + /(?:^|\/)(?:service-worker|sw)(?:[.-][^/]*)?\.js$/i.test(file), +); /** @type {Record>} */ let responses; @@ -81,15 +86,19 @@ results.push({ surface: "sourceMap", header: "public", expected: false, - observed: cachePolicy.surfaces.sourceMap.public, - passed: cachePolicy.surfaces.sourceMap.public === false, + observed: publicSourceMaps.length > 0, + passed: + cachePolicy.surfaces.sourceMap.public === false && + publicSourceMaps.length === 0, }); results.push({ surface: "serviceWorker", header: "enabled", expected: false, - observed: cachePolicy.surfaces.serviceWorker.enabled, - passed: cachePolicy.surfaces.serviceWorker.enabled === false, + observed: publicServiceWorkers.length > 0, + passed: + cachePolicy.surfaces.serviceWorker.enabled === false && + publicServiceWorkers.length === 0, }); const passed = results.every((result) => result.passed); diff --git a/scripts/verify-release.mjs b/scripts/verify-release.mjs index 6ee9cf1..6137434 100644 --- a/scripts/verify-release.mjs +++ b/scripts/verify-release.mjs @@ -2,7 +2,10 @@ import { createHash } from "node:crypto"; import { mkdir, readFile, writeFile } from "node:fs/promises"; import { verifyCompatibilityTuple } from "../src/application/policies/compatibility.js"; -import { compareReleaseToRuntime } from "../src/contracts/release-tokens.js"; +import { + compareReleaseToRuntime, + RELEASE_TOKEN_REGISTRY, +} from "../src/contracts/release-tokens.js"; const fixturesDocument = /** @type {{ @@ -38,6 +41,14 @@ const actualAssetManifestHash = createHash("sha256") const artifactComparison = compareReleaseToRuntime(release, runtimeConfig); const artifactMismatches = [...artifactComparison.mismatches]; +for (const token of Object.keys(RELEASE_TOKEN_REGISTRY)) { + if (typeof release[token] !== "string" || release[token].length === 0) { + artifactMismatches.push(`releaseToken:${token}`); + } +} +if (!Number.isFinite(Date.parse(release.builtAt))) { + artifactMismatches.push("releaseToken:builtAtFormat"); +} if (release.assetManifestHash !== actualAssetManifestHash) { artifactMismatches.push("assetManifestContent"); }