Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion scripts/release-check.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ export function assertFreshInstallAudit(version, options = {}) {
["pack", "--json", "--pack-destination", tempDirectory],
{ capture: true }
);
const [{ filename }] = JSON.parse(packOutput);
const filename = parsePackedTarballFilename(packOutput);
const tarballPath = path.join(tempDirectory, filename);

commandRunner("npm", ["init", "-y"], { cwd: tempDirectory });
Expand Down Expand Up @@ -141,6 +141,24 @@ export function assertFreshInstallAudit(version, options = {}) {
}
}

export function parsePackedTarballFilename(packOutput) {
const parsed = JSON.parse(packOutput);
const entries = Array.isArray(parsed)
? parsed
: parsed && typeof parsed === "object"
? Object.values(parsed)
: [];
const metadata = entries.find(
(entry) => entry && typeof entry === "object" && typeof entry.filename === "string"
);

if (!metadata) {
throw new Error("npm pack did not return tarball metadata.");
}

return metadata.filename;
}

export function assertUpdateCheckSmoke(version, options = {}) {
const commandRunner = options.run ?? run;
const output = commandRunner(
Expand Down
15 changes: 14 additions & 1 deletion tests/release-check.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {
assertFreshInstallAudit,
assertSecuritySelfScan,
assertUpdateCheckSmoke,
assertVersionIsPublishable
assertVersionIsPublishable,
parsePackedTarballFilename
} from "../scripts/release-check.mjs";

describe("release check registry version gate", () => {
Expand Down Expand Up @@ -50,6 +51,18 @@ describe("release check registry version gate", () => {
});

describe("release check fresh install audit gate", () => {
it("reads npm pack metadata from npm 10 through npm 12", () => {
const metadata = { filename: "codex-plugin-doctor-1.50.0.tgz" };

expect(parsePackedTarballFilename(JSON.stringify([metadata]))).toBe(metadata.filename);
expect(
parsePackedTarballFilename(JSON.stringify({ "codex-plugin-doctor": metadata }))
).toBe(metadata.filename);
expect(() => parsePackedTarballFilename("null")).toThrow(
"npm pack did not return tarball metadata."
);
});

it("installs the packed tarball in a fresh project and audits it", () => {
const tempDirectory = path.join("tmp", "release-check-temp");
const run = vi.fn((command: string, args: string[]) => {
Expand Down