Compare commits

..
1 Commits
Author SHA1 Message Date
changeset-internal-publish-bot[bot] 8488615a62 v2.1.1 2026-08-19 06:36:34 +00:00
20 changed files with 870 additions and 726 deletions
+2 -2
View File
@@ -27,12 +27,12 @@ jobs:
security-events: write # allow writing security events
steps:
- name: Checkout repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
persist-credentials: false
- name: Run zizmor
uses: zizmorcore/zizmor-action@cc914d7f3750a2d13d75c7f184a1060aa0e9d482 # v0.6.4
uses: zizmorcore/zizmor-action@3dc1ecc9bcb9e94e9b2c709687979e1298497054 # v0.6.2
with:
persona: pedantic
annotations: true
+3 -3
View File
@@ -33,7 +33,7 @@ jobs:
- name: Select mode
id: select-mode
uses: $/select-mode
uses: ./select-mode
version:
name: Version
@@ -62,7 +62,7 @@ jobs:
- name: Create or update release pull request
id: changesets
uses: $/version
uses: ./version
with:
github-token: ${{ steps.bot-auth.outputs.token }}
script: pnpm bump
@@ -92,7 +92,7 @@ jobs:
permission-contents: write # to bypass branch and tag protection rules (release.ts)
- name: Publish to marketplace
uses: $/publish
uses: ./publish
with:
github-token: ${{ steps.bot-auth.outputs.token }}
script: pnpm release
-12
View File
@@ -1,17 +1,5 @@
# @changesets/action
## 2.1.2
### Patch Changes
- [#735](https://github.com/changesets/action/pull/735) [`8833883`](https://github.com/changesets/action/commit/88338839e35c3e0fa61f3c9c3f27e7572cd5f2cf) Thanks [@bluwy](https://github.com/bluwy)! - Handle error when pushing git tags with the git CLI
- [#724](https://github.com/changesets/action/pull/724) [`36f529f`](https://github.com/changesets/action/commit/36f529f13ab58bbcf6331035cb950385586e8a89) Thanks [@bluwy](https://github.com/bluwy)! - Improve log messages
- [#724](https://github.com/changesets/action/pull/724) [`36f529f`](https://github.com/changesets/action/commit/36f529f13ab58bbcf6331035cb950385586e8a89) Thanks [@bluwy](https://github.com/bluwy)! - Fix root action double error logs
- [#729](https://github.com/changesets/action/pull/729) [`ca85897`](https://github.com/changesets/action/commit/ca8589735af2ff6977a0f6474537d550040530d8) Thanks [@bluwy](https://github.com/bluwy)! - Always switch and reset branch when generating version commits, similar to if `push-with-git-cli` is enabled
## 2.1.1
### Patch Changes
+12
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,D as t,E as n,O as r,f as i,j as a,k as o,m as s,o as c,p as l,s as u}from"./utils-CAuP846_.js";import{n as d,r as f,t as p}from"./run-NkR1hNWV.js";import{t as m}from"./readChangesetState-D-vw_tSH.js";(async()=>{let h=c(`cwd`)||process.cwd();await s(h),l({publish:`publish-script`,version:`version-script`,commit:`commit-message`,title:`pr-title`,branch:`pr-base-branch`,prDraft:`pr-draft`,createGithubReleases:`create-github-releases`}),i();let g=u(`github-token`);if(process.env.GITHUB_TOKEN&&process.env.GITHUB_TOKEN!==g)throw Error(`The GITHUB_TOKEN environment variable is set and does not match the "github-token" input. Please pass the custom GitHub token to the "github-token" input and remove the GITHUB_TOKEN environment variable to avoid conflicts.`);let _=t(`push-with-git-cli`),v=c(`pr-draft`);if(v!==void 0&&v!==`always`&&v!==`create`){e(`Invalid pr-draft: ${v}`);return}let y=new f({cwd:h,githubToken:g,pushWithGitCli:_}),{changesets:b}=await m(h),x=r(`publish-script`),S=b.length!==0,C=b.some(e=>e.releases.length>0),w=!!x;switch(a(`published`,`false`),a(`published-packages`,`[]`),a(`has-changesets`,String(S)),!0){case!S&&!w:o(`No changesets present or were removed by merging release PR. Not publishing because no publish script found.`);return;case!S&&w:{o(`No changesets found. Attempting to publish any unpublished packages to npm`);let e=t(`create-github-releases`),r=t(`push-git-tags`);if(e&&!r)throw Error(`The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true or set 'create-github-releases' to false.`);let i=await p({script:x,github:y,createGithubReleases:e,pushGitTags:r,cwd:h});i.published&&(a(`published`,`true`),a(`published-packages`,JSON.stringify(i.publishedPackages))),i.exitCode!==0&&(n(`Publish command exited with code ${i.exitCode}${i.published?`, but some packages were published: ${i.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`),process.exit(i.exitCode));return}case S&&!C:o(`All changesets are empty; not creating PR`);return;case S:{let{pullRequestNumber:e}=await d({script:c(`version-script`),github:y,cwd:h,prTitle:c(`pr-title`),commitMessage:c(`commit-message`),hasPublishScript:w,prDraft:v,branch:c(`pr-base-branch`)});a(`pr-number`,String(e));return}}})().catch(t=>{n(t),e(t.message)});export{};
+1
View File
@@ -0,0 +1 @@
import{A as e,j as t,m as n,n as r,o as i,t as a,y as o}from"./utils-CAuP846_.js";import s from"node:fs/promises";import c from"node:path";import l from"node:os";try{await u()}catch(t){e(t.message)}async function u(){let e=i(`cwd`)||process.cwd();await n(e);let r=i(`publish-plan-artifact-id`),a=process.env.RUNNER_TEMP??await s.realpath(l.tmpdir()),u=c.join(a,`changeset-pack-${Date.now()}`);await d(e,{outDir:u,publishPlanPath:r?await f(a,Number(r)):void 0});let m=await o.uploadArtifact(`changeset-pack-${Date.now()}`,await p(u),u,{retentionDays:30});if(m.id===void 0)throw Error(`Packed artifact upload did not return an artifact id`);t(`pack-dir-artifact-id`,String(m.id))}async function d(e,t){let n=[`pack`,`--out-dir`,t.outDir];t.publishPlanPath&&n.push(`--from-publish-plan`,t.publishPlanPath),await r(n,{cwd:e,env:process.env})}async function f(e,t){let n=await a(e,t,`changeset-publish-plan`);return c.join(n,`publish-plan.json`)}async function p(e){let t=await s.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=c.join(e,t.name);return t.isDirectory()?p(n):[n]}))).flat()}export{};
+1
View File
@@ -0,0 +1 @@
import{A as e,T as t,j as n,k as r,o as i,s as a,w as o}from"./utils-CAuP846_.js";try{await s()}catch(t){e(t.message)}async function s(){let e=o.payload.pull_request;if(!e)throw Error("This action should only be run on `pull_request_target` or `pull_request` events");let s=a(`github-token`),l=a(`body`),u=i(`update-id`),d=u?c(u):null,f=d?`${d}\n\n${l}`:l,p={repo:e.base.repo.name,owner:e.base.repo.owner.login,issue_number:e.number,body:f},m=t(s),h;if(d&&(r(`Checking for existing comment...`),h=await m.rest.issues.listComments({repo:e.base.repo.name,owner:e.base.repo.owner.login,issue_number:e.number}).then(e=>e.data.find(e=>e.body?.includes(d))?.id)),h)r(`Updating existing comment (id: ${h})...`),await m.rest.issues.updateComment({...p,comment_id:h}),n(`comment-id`,h);else{r(`Creating new comment...`);let e=await m.rest.issues.createComment(p);n(`comment-id`,e.data.id)}r(`Done!`)}function c(e){let t=`changesets-action-pr-comment`;return t===e?`<!-- ${t} -->`:`<!-- ${t}:${e} -->`}export{};
+38
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,D as t,j as n,m as r,o as i,s as a,t as o}from"./utils-CAuP846_.js";import{r as s,t as c}from"./run-NkR1hNWV.js";import l from"node:fs/promises";import u from"node:os";try{await d()}catch(t){e(t.message)}async function d(){let e=i(`cwd`)||process.cwd();await r(e);let d=a(`github-token`),f=i(`script`),p=i(`pack-dir-artifact-id`),m=t(`create-github-releases`),h=t(`push-git-tags`);if(m&&!h)throw Error(`The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true or set 'create-github-releases' to false.`);let g=new s({cwd:e,githubToken:d}),_=p?await o(process.env.RUNNER_TEMP??await l.realpath(u.tmpdir()),Number(p),`changeset-pack`):void 0,v=await c({script:f,github:g,createGithubReleases:m,pushGitTags:h,cwd:e,fromPackDir:_});if(v.published?(n(`published`,`true`),n(`published-packages`,JSON.stringify(v.publishedPackages))):n(`published`,`false`),v.exitCode!==0)throw Error(`Publish command exited with code ${v.exitCode}${v.published?`, but some packages were published: ${v.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`)}export{};
+1
View File
@@ -0,0 +1 @@
import{i as e,t}from"./dist-Bc2tm86q.js";async function n(n=process.cwd()){let r=await e(n),i=await t(n);return r!==void 0&&r.mode===`pre`?{preState:r,changesets:i.filter(e=>!e.id.startsWith(`pre/`))}:{preState:void 0,changesets:i}}export{n as t};
+98
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,j as t,m as n,n as r,o as i,y as a}from"./utils-CAuP846_.js";import{t as o}from"./readChangesetState-D-vw_tSH.js";import s from"node:fs/promises";import c from"node:path";import l from"node:os";try{await u()}catch(t){e(t.message)}async function u(){let e=i(`cwd`)||process.cwd();await n(e);let r=await d(e);if(t(`mode`,r.mode),r.mode===`publish`){let e=await a.uploadArtifact(c.basename(r.publishPlanPath,`.json`),[r.publishPlanPath],c.dirname(r.publishPlanPath),{skipArchive:!0,retentionDays:30});if(e.id===void 0)throw Error(`Publish plan artifact upload did not return an artifact id`);t(`publish-plan-artifact-id`,String(e.id))}}async function d(e){let{changesets:t}=await o(e);if(t.length>0)return t.some(e=>e.releases.length>0)?{mode:`version`}:{mode:`none`};let n=c.join(process.env.RUNNER_TEMP??await s.realpath(l.tmpdir()),`changeset-publish-plan-${Date.now()}`,`publish-plan.json`);return await r([`publish-plan`,`--output`,n],{cwd:e,env:process.env}),(await f(n)).length===0?{mode:`none`}:{mode:`publish`,publishPlanPath:n}}async function f(e){let t;try{t=await s.readFile(e,`utf8`)}catch(t){throw Error(`Failed to read publish plan at ${e}`,{cause:t})}let n;try{n=JSON.parse(t)}catch(t){throw Error(`Failed to parse publish plan at ${e}`,{cause:t})}if(typeof n!=`object`||!n||!(`version`in n)||typeof n.version!=`number`||!(`plan`in n)||!Array.isArray(n.plan))throw Error(`Invalid publish plan at ${e}: expected { version: number; plan: unknown[] }`);return n.plan}export{};
+228
View File
File diff suppressed because one or more lines are too long
+1
View File
@@ -0,0 +1 @@
import{A as e,D as t,f as n,j as r,m as i,o as a,s as o}from"./utils-CAuP846_.js";import{n as s,r as c}from"./run-NkR1hNWV.js";try{await l()}catch(t){e(t.message)}async function l(){let e=a(`cwd`)||process.cwd();await i(e),n();let l=o(`github-token`),u=a(`script`),d=o(`commit-message`),f=o(`pr-title`),p=a(`pr-draft`),m=a(`pr-base-branch`),h=t(`push-with-git-cli`);if(p!==void 0&&p!==`always`&&p!==`create`)throw Error(`Invalid pr-draft input: ${p}`);let g=new c({cwd:e,githubToken:l,pushWithGitCli:h}),{pullRequestNumber:_}=await s({script:u,github:g,cwd:e,prTitle:f,commitMessage:d,hasPublishScript:!0,prDraft:p,branch:m});r(`pr-number`,String(_))}export{};
+18 -18
View File
@@ -1,6 +1,6 @@
{
"name": "@changesets/action",
"version": "2.1.2",
"version": "2.1.1",
"private": true,
"license": "MIT",
"type": "module",
@@ -23,33 +23,33 @@
"@actions/core": "^3.0.1",
"@actions/exec": "^3.0.0",
"@actions/github": "^9.1.1",
"@changesets/get-release-plan": "^5.0.2",
"@changesets/get-release-plan": "^5.0.0",
"@changesets/ghcommit": "^3.0.0",
"@changesets/git": "^4.0.1",
"@changesets/git": "^4.0.0",
"@changesets/pre": "^3.0.0",
"@changesets/read": "^1.0.1",
"@changesets/read": "^1.0.0",
"@manypkg/get-packages": "^3.1.0",
"@octokit/core": "^7.0.8",
"@octokit/core": "^7.0.7",
"@octokit/plugin-throttling": "^11.0.5",
"human-id": "^4.2.1",
"human-id": "^4.2.0",
"markdown-table": "^3.0.4",
"semver": "^7.8.5",
"tinyexec": "^1.3.1"
"tinyexec": "^1.3.0"
},
"devDependencies": {
"@changesets/changelog-github": "^1.0.1",
"@changesets/cli": "^3.0.3",
"@changesets/changelog-github": "^1.0.0",
"@changesets/cli": "^3.0.0",
"@changesets/types": "^7.0.0",
"@changesets/write": "^1.0.1",
"@tsconfig/node24": "^24.0.5",
"@types/node": "^26.6.2",
"@changesets/write": "^1.0.0",
"@tsconfig/node24": "^24.0.4",
"@types/node": "^26.1.2",
"@types/semver": "^7.8.0",
"fs-fixture": "^2.16.0",
"oxfmt": "^0.70.0",
"rolldown": "^1.2.10",
"typescript": "^7.0.2",
"vitest": "^5.0.1",
"yaml": "^2.9.1"
"fs-fixture": "^2.14.0",
"oxfmt": "^0.61.0",
"rolldown": "^1.2.2",
"typescript": "^6.0.3",
"vitest": "^4.1.10",
"yaml": "^2.9.0"
},
"engines": {
"node": ">=24"
+424 -637
View File
File diff suppressed because it is too large Load Diff
+19 -17
View File
@@ -195,7 +195,7 @@ export class GitHub {
if (authorIdentity.exitCode === 0 && committerIdentity.exitCode === 0) {
return;
}
core.info("Setting git user to github-actions[bot]");
core.info("Setting Git user to github-actions[bot]");
await exec("git", ["config", "user.name", `"github-actions[bot]"`], {
cwd: this.cwd,
});
@@ -213,30 +213,32 @@ export class GitHub {
}
async pushTag(tag: string) {
try {
if (!this.pushWithGitCli) {
await this.octokit.rest.git.createRef({
if (!this.pushWithGitCli) {
return this.octokit.rest.git
.createRef({
...context.repo,
ref: `refs/tags/${tag}`,
sha: context.sha,
})
.catch((err) => {
// Assuming tag was manually pushed in custom publish script
core.warning(`Failed to create tag ${tag}: ${err.message}`);
});
} else {
await exec("git", ["push", "origin", tag], {
cwd: this.cwd,
env: {
...process.env,
...(await this.#getCliAuthEnv()),
} as Record<string, string>,
});
}
} catch (err) {
core.warning(
`Failed to create git tag "${tag}". Assuming it was manually pushed by the publish script: ${(err as Error).message}`,
);
}
await exec("git", ["push", "origin", tag], {
cwd: this.cwd,
env: {
...process.env,
...(await this.#getCliAuthEnv()),
} as Record<string, string>,
});
}
async prepareBranch(branch: string) {
if (!this.pushWithGitCli) {
// Preparing a new local branch is not necessary when using the API
return;
}
await switchToMaybeExistingBranch(branch, { cwd: this.cwd });
await reset(context.sha, { cwd: this.cwd });
}
+9 -11
View File
@@ -10,13 +10,7 @@ import {
validateChangesetsCliVersion,
} from "./utils.ts";
try {
await main();
} catch (err) {
core.setFailed((err as Error).message);
}
async function main() {
(async () => {
const cwd = getOptionalInput("cwd") || process.cwd();
await validateChangesetsCliVersion(cwd);
@@ -68,7 +62,7 @@ async function main() {
switch (true) {
case !hasChangesets && !hasPublishScript:
core.info(
"No changesets present or were removed by merging version PR. Not publishing because publish-script is not set.",
"No changesets present or were removed by merging release PR. Not publishing because no publish script found.",
);
return;
case !hasChangesets && hasPublishScript: {
@@ -104,7 +98,7 @@ async function main() {
}
if (result.exitCode !== 0) {
throw new Error(
core.error(
`Publish command exited with code ${result.exitCode}${
result.published
? `, but some packages were published: ${result.publishedPackages
@@ -113,11 +107,12 @@ async function main() {
: ""
}`,
);
process.exit(result.exitCode);
}
return;
}
case hasChangesets && !hasNonEmptyChangesets:
core.info("All changesets are empty. Not creating PR");
core.info("All changesets are empty; not creating PR");
return;
case hasChangesets: {
const { pullRequestNumber } = await runVersion({
@@ -136,4 +131,7 @@ async function main() {
return;
}
}
}
})().catch((err) => {
core.error(err);
core.setFailed(err.message);
});
+9 -23
View File
@@ -1,13 +1,12 @@
import path from "node:path";
import * as core from "@actions/core";
import * as github from "@actions/github";
import type { Changeset } from "@changesets/types";
import { writeChangeset } from "@changesets/write";
import { createFixture } from "fs-fixture";
import { exec } from "tinyexec";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { GitHub } from "./github.ts";
import { runPublish, runVersion } from "./run.ts";
import { gitdir } from "./test-utils.ts";
vi.mock("@actions/github", () => ({
context: {
@@ -45,7 +44,7 @@ let mockedGraphql = vi.fn();
const nodeModulesDir = path.join(import.meta.dirname, "..", "node_modules");
function createSimpleProjectFixture() {
return gitdir({
return createFixture({
node_modules: (api) => api.symlink(nodeModulesDir),
".changeset/config.json": JSON.stringify({}),
"packages/pkg-a/package.json": JSON.stringify({
@@ -70,7 +69,7 @@ function createSimpleProjectFixture() {
}
function createIgnoredPackageFixture() {
return gitdir({
return createFixture({
node_modules: (api) => api.symlink(nodeModulesDir),
".changeset/config.json": JSON.stringify({
ignore: ["changesets-dev-ignored-package-pkg-a"],
@@ -107,20 +106,15 @@ const createGithub = (cwd: string) =>
pushWithGitCli: false,
});
async function updateGithubContext(cwd: string) {
const head = await exec("git", ["rev-parse", "HEAD"], {
async function initializeGitRepository(cwd: string) {
await exec("git", ["init"], {
nodeOptions: { cwd },
throwOnError: true,
});
github.context.sha = head.stdout.trim();
}
function resetGithubContext() {
github.context.sha = "xeac7";
}
beforeEach(() => {
vi.clearAllMocks();
resetGithubContext();
});
afterEach(() => {
@@ -131,7 +125,7 @@ describe("publish", () => {
it("warns when a custom publish script does not create the output file", async () => {
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
await initializeGitRepository(cwd);
vi.stubEnv("RUNNER_TEMP", cwd);
const result = await runPublish({
@@ -151,7 +145,7 @@ describe("publish", () => {
});
it("throws when the built-in publish command does not create the output file", async () => {
await using fixture = await gitdir({
await using fixture = await createFixture({
"node_modules/@changesets/cli/package.json": JSON.stringify({
name: "@changesets/cli",
type: "module",
@@ -164,7 +158,7 @@ describe("publish", () => {
"package-lock.json": "",
});
const cwd = fixture.path;
await updateGithubContext(cwd);
await initializeGitRepository(cwd);
vi.stubEnv("RUNNER_TEMP", cwd);
await expect(
@@ -182,7 +176,6 @@ describe("version", () => {
it("creates simple PR", async () => {
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -220,7 +213,6 @@ describe("version", () => {
it('creates a draft PR when prDraft is "create"', async () => {
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -255,7 +247,6 @@ describe("version", () => {
it("only includes bumped packages in the PR body", async () => {
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -289,7 +280,6 @@ describe("version", () => {
it("doesn't include ignored package that got a dependency update in the PR body", async () => {
await using fixture = await createIgnoredPackageFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -323,7 +313,6 @@ describe("version", () => {
it("does not include changelog entries if full message exceeds size limit", async () => {
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -381,7 +370,6 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
it("does not include any release information if a message with simplified release info exceeds size limit", async () => {
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({ data: [] }));
@@ -439,7 +427,6 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
it('updates an existing PR via GraphQL without converting it to draft when prDraft is "create"', async () => {
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({
data: [{ number: 123, node_id: "PR_kwDOA" }],
@@ -472,7 +459,6 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
it('updates an existing PR via GraphQL and converts it to draft when prDraft is "always"', async () => {
await using fixture = await createSimpleProjectFixture();
const cwd = fixture.path;
await updateGithubContext(cwd);
mockedGithubMethods.pulls.list.mockImplementationOnce(() => ({
data: [{ number: 123, node_id: "PR_kwDOA" }],
+3 -3
View File
@@ -401,7 +401,7 @@ export async function runVersion({
head: `${context.repo.owner}:${versionBranch}`,
base: branch,
});
core.debug(
core.info(
`Existing pull requests: ${JSON.stringify(
existingPullRequests.data,
null,
@@ -427,7 +427,7 @@ export async function runVersion({
});
if (existingPullRequests.data.length === 0) {
core.info("Creating pull request");
core.info("creating pull request");
const { data: newPullRequest } = await octokit.rest.pulls.create({
base: branch,
head: versionBranch,
@@ -443,7 +443,7 @@ export async function runVersion({
} else {
const [pullRequest] = existingPullRequests.data;
core.info(`Updating found pull request #${pullRequest.number}`);
core.info(`updating found pull request #${pullRequest.number}`);
const convertPullRequestToDraftMutation =
prDraft === "always"
? `