fix: preserve cache error class names in save-cache bundle (#1093)

## Summary

- Preserve class names in the save-cache bundle so `@actions/cache`
error-name comparisons distinguish validation errors, benign
cache-reservation races, and finalization errors correctly.
- Add regression coverage that exercises the bundled `ValidationError`,
`ReserveCacheError`, and `FinalizeCacheError` constructors.

Fixes #1028

## Verification

- `npm run all` passed on Ubuntu 24.04 with Node 24.19.0: build, Biome,
packaging, and all 159 tests across 15 suites.
- `git diff --check` passed.

The save-cache bundle increases by about 77 KB raw (14 KB gzip) to
preserve the required names.
This commit is contained in:
Danny Ward
2026-10-15 14:57:07 +02:00
committed by GitHub
parent 8ca4be000b
commit c97f06e356
3 changed files with 2567 additions and 720 deletions
+33
View File
@@ -0,0 +1,33 @@
import { readFileSync } from "node:fs";
import { runInNewContext } from "node:vm";
import { expect, it } from "@jest/globals";
const saveCacheBundle = readFileSync(
new URL("../../dist/save-cache/index.cjs", import.meta.url),
"utf8",
);
function bundledErrorClass(name: string): new (message: string) => Error {
const start = saveCacheBundle.indexOf(`var ${name} = class`);
expect(start).toBeGreaterThanOrEqual(0);
const end = saveCacheBundle.indexOf("\n};", start);
expect(end).toBeGreaterThan(start);
const declaration = saveCacheBundle.slice(start, end + 3);
return runInNewContext(`${declaration}; ${name}`, {
__name: (target: object, value: string) =>
Object.defineProperty(target, "name", { configurable: true, value }),
}) as new (
message: string,
) => Error;
}
it.each(["ValidationError", "ReserveCacheError", "FinalizeCacheError"])(
"preserves the %s name in the save-cache bundle",
(name) => {
const ErrorClass = bundledErrorClass(name);
expect(new ErrorClass("test").name).toBe(ErrorClass.name);
},
);
Generated Vendored
+2532 -720
View File
File diff suppressed because it is too large Load Diff
+2
View File
@@ -9,6 +9,8 @@ const builds = [
},
{
entryPoints: ["src/save-cache.ts"],
// @actions/cache compares error.name to the error constructor's name.
keepNames: true,
outfile: "dist/save-cache/index.cjs",
staleOutfiles: ["dist/save-cache/index.mjs"],
},