mirror of
https://github.com/changesets/action
synced 2026-10-26 16:39:56 +08:00
Add select-mode, version, pack and publish sub-actions (#656)
* Add select-mode, version, and publish sub-actions * Rename * No github-token needed for select-mode for now * extend select-mode with publish-plan check and upload * Rename base-branch to pr-base-branch * add `pack` subaction * `--from-pack` support in the publish subaction * rename CLI arg * update rolldown config * rename pack dir input/output * tweak retendion days --------- Co-authored-by: Mateusz Burzyński <mateuszburzynski@gmail.com>
This commit is contained in:
co-authored by
Mateusz Burzyński
parent
5649ff41b8
commit
a12d90de83
@@ -0,0 +1,117 @@
|
||||
import fs from "node:fs/promises";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import artifact from "@actions/artifact";
|
||||
import * as core from "@actions/core";
|
||||
import readChangesetState from "../readChangesetState.ts";
|
||||
import { execChangesetsCli } from "../utils.ts";
|
||||
|
||||
type ModeResult =
|
||||
| {
|
||||
mode: "none";
|
||||
}
|
||||
| {
|
||||
mode: "version";
|
||||
}
|
||||
| {
|
||||
mode: "publish";
|
||||
publishPlanPath: string;
|
||||
};
|
||||
|
||||
type PublishPlan = unknown[];
|
||||
|
||||
try {
|
||||
await main();
|
||||
} catch (err) {
|
||||
core.setFailed((err as Error).message);
|
||||
}
|
||||
|
||||
async function main() {
|
||||
const result = await getMode();
|
||||
core.setOutput("mode", result.mode);
|
||||
if (result.mode === "publish") {
|
||||
const publishPlanArtifact = await artifact.uploadArtifact(
|
||||
path.basename(result.publishPlanPath, ".json"),
|
||||
[result.publishPlanPath],
|
||||
path.dirname(result.publishPlanPath),
|
||||
{
|
||||
skipArchive: true,
|
||||
retentionDays: 30,
|
||||
},
|
||||
);
|
||||
if (publishPlanArtifact.id === undefined) {
|
||||
throw new Error(
|
||||
"Publish plan artifact upload did not return an artifact id",
|
||||
);
|
||||
}
|
||||
core.setOutput("publish-plan-artifact-id", String(publishPlanArtifact.id));
|
||||
}
|
||||
}
|
||||
|
||||
async function getMode(): Promise<ModeResult> {
|
||||
const { changesets } = await readChangesetState();
|
||||
|
||||
if (changesets.length > 0) {
|
||||
const hasNonEmptyChangesets = changesets.some(
|
||||
(changeset) => changeset.releases.length > 0,
|
||||
);
|
||||
if (hasNonEmptyChangesets) {
|
||||
return { mode: "version" };
|
||||
}
|
||||
return { mode: "none" };
|
||||
}
|
||||
|
||||
const cwd = process.cwd();
|
||||
const publishPlanPath = path.join(
|
||||
process.env.RUNNER_TEMP ?? (await fs.realpath(os.tmpdir())),
|
||||
`changeset-publish-plan-${Date.now()}.json`,
|
||||
);
|
||||
await execChangesetsCli(["publish-plan", "--output", publishPlanPath], {
|
||||
cwd,
|
||||
env: process.env,
|
||||
});
|
||||
|
||||
const publishPlan = await readPublishPlan(publishPlanPath);
|
||||
if (publishPlan.length === 0) {
|
||||
return { mode: "none" };
|
||||
}
|
||||
|
||||
return {
|
||||
mode: "publish",
|
||||
publishPlanPath,
|
||||
};
|
||||
}
|
||||
|
||||
async function readPublishPlan(publishPlanPath: string): Promise<PublishPlan> {
|
||||
let rawPlan: string;
|
||||
try {
|
||||
rawPlan = await fs.readFile(publishPlanPath, "utf8");
|
||||
} catch (err) {
|
||||
throw new Error(`Failed to read publish plan at ${publishPlanPath}`, {
|
||||
cause: err,
|
||||
});
|
||||
}
|
||||
|
||||
let plan: unknown;
|
||||
try {
|
||||
plan = JSON.parse(rawPlan);
|
||||
} catch (err) {
|
||||
throw new Error(`Failed to parse publish plan at ${publishPlanPath}`, {
|
||||
cause: err,
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
typeof plan !== "object" ||
|
||||
plan === null ||
|
||||
!("version" in plan) ||
|
||||
typeof plan.version !== "number" ||
|
||||
!("plan" in plan) ||
|
||||
!Array.isArray(plan.plan)
|
||||
) {
|
||||
throw new Error(
|
||||
`Invalid publish plan at ${publishPlanPath}: expected { version: number; plan: unknown[] }`,
|
||||
);
|
||||
}
|
||||
return plan.plan;
|
||||
}
|
||||
Reference in New Issue
Block a user