Compare commits

..
Author SHA1 Message Date
github-actions[bot] 6b83f36ae5 v2.0.0-next.0 2026-06-23 07:33:38 +00:00
36 changed files with 449 additions and 541 deletions
-5
View File
@@ -1,5 +0,0 @@
---
"@changesets/action": patch
---
Fix the computed publish plan path passed internally to `changeset pack` by the `/pack` subaction.
-5
View File
@@ -1,5 +0,0 @@
---
"@changesets/action": patch
---
Authenticate git CLI pushes with the configured GitHub token using Git extra headers instead of writing to a global `.netrc` file.
-5
View File
@@ -1,5 +0,0 @@
---
"@changesets/action": patch
---
Derive the Git server URL from the GitHub Actions context when configuring git CLI authentication to support GitHub Enterprise Server setups.
+1 -10
View File
@@ -4,14 +4,5 @@
"initialVersions": { "initialVersions": {
"@changesets/action": "1.9.0" "@changesets/action": "1.9.0"
}, },
"changesets": [ "changesets": ["eight-clocks-pull", "eighty-doors-swim", "lemon-turtles-itch"]
"all-cars-grin",
"eight-clocks-pull",
"eighty-doors-swim",
"git-cli-auth-header",
"git-cli-server-url",
"lemon-turtles-itch",
"ready-mangos-boil",
"silent-tips-dance"
]
} }
-5
View File
@@ -1,5 +0,0 @@
---
"@changesets/action": patch
---
Fixed usage of `--from-publish-plan` flag used by the `/pack` subaction
-5
View File
@@ -1,5 +0,0 @@
---
"@changesets/action": patch
---
Fix the `/version` subaction to not crash on missing `pr-base-branch` input. This input is meant to be optional.
-18
View File
@@ -1,23 +1,5 @@
# @changesets/action # @changesets/action
## 2.0.0-next.2
### Patch Changes
- [#670](https://github.com/changesets/action/pull/670) [`5a8b9b7`](https://github.com/changesets/action/commit/5a8b9b721bf683e3bf9bd72ea92a685dc024147b) Thanks [@Andarist](https://github.com/Andarist)! - Authenticate git CLI pushes with the configured GitHub token using Git extra headers instead of writing to a global `.netrc` file.
- [#670](https://github.com/changesets/action/pull/670) [`5a8b9b7`](https://github.com/changesets/action/commit/5a8b9b721bf683e3bf9bd72ea92a685dc024147b) Thanks [@Andarist](https://github.com/Andarist)! - Derive the Git server URL from the GitHub Actions context when configuring git CLI authentication to support GitHub Enterprise Server setups.
## 2.0.0-next.1
### Patch Changes
- [#663](https://github.com/changesets/action/pull/663) [`ccb3811`](https://github.com/changesets/action/commit/ccb38113eaaa4a13eb6aabe09520e49cc8519b84) Thanks [@Andarist](https://github.com/Andarist)! - Fix the computed publish plan path passed internally to `changeset pack` by the `/pack` subaction.
- [#662](https://github.com/changesets/action/pull/662) [`5c88881`](https://github.com/changesets/action/commit/5c88881fff1f0d8b055d4a2d3a74a8ce843db6f3) Thanks [@Andarist](https://github.com/Andarist)! - Fixed usage of `--from-publish-plan` flag used by the `/pack` subaction
- [#666](https://github.com/changesets/action/pull/666) [`dc29b73`](https://github.com/changesets/action/commit/dc29b738b532d9e95f46b9bf493e2e3fdf48a7ed) Thanks [@Andarist](https://github.com/Andarist)! - Fix the `/version` subaction to not crash on missing `pr-base-branch` input. This input is meant to be optional.
## 2.0.0-next.0 ## 2.0.0-next.0
### Major Changes ### Major Changes
+5 -5
View File
@@ -65,7 +65,7 @@ jobs:
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
- name: Create Release Pull Request - name: Create Release Pull Request
uses: changesets/action@v2 uses: changesets/action@v1
``` ```
#### With Publishing #### With Publishing
@@ -103,7 +103,7 @@ jobs:
- name: Create Release Pull Request or Publish to npm - name: Create Release Pull Request or Publish to npm
id: changesets id: changesets
uses: changesets/action@v2 uses: changesets/action@v1
with: with:
# This expects you to have a script called release which does a build for your packages and calls changeset publish # This expects you to have a script called release which does a build for your packages and calls changeset publish
publish: pnpm release publish: pnpm release
@@ -170,7 +170,7 @@ jobs:
- name: Create Release Pull Request or Publish to npm - name: Create Release Pull Request or Publish to npm
id: changesets id: changesets
uses: changesets/action@v2 uses: changesets/action@v1
- name: Publish - name: Publish
if: steps.changesets.outputs.hasChangesets == 'false' if: steps.changesets.outputs.hasChangesets == 'false'
@@ -214,7 +214,7 @@ jobs:
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
- name: Create Release Pull Request - name: Create Release Pull Request
uses: changesets/action@v2 uses: changesets/action@v1
with: with:
# this expects you to have a npm script called version that runs some logic and then calls `changeset version`. # this expects you to have a npm script called version that runs some logic and then calls `changeset version`.
version: pnpm version version: pnpm version
@@ -225,7 +225,7 @@ jobs:
If you are using [Yarn Plug'n'Play](https://yarnpkg.com/features/pnp), you should use a custom `version` command so that the action can resolve the `changeset` CLI: If you are using [Yarn Plug'n'Play](https://yarnpkg.com/features/pnp), you should use a custom `version` command so that the action can resolve the `changeset` CLI:
```yaml ```yaml
- uses: changesets/action@v2 - uses: changesets/action@v1
with: with:
version: yarn changeset version version: yarn changeset version
# ... # ...
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+18
View File
File diff suppressed because one or more lines are too long
+2 -2
View File
@@ -1,2 +1,2 @@
import{_ as e,g as t,h as n,m as r,p as i,v as a}from"./get-packages.cjs-Dvdg-NAr.js";import{n as o,r as s,t as c}from"./run-Cekyj2rz.js";import{r as l,s as u}from"./utils-DQTbg3yF.js";import{t as d}from"./readChangesetState-D8jsqLyj.js";import f from"node:fs/promises";(async()=>{let p=process.env.GITHUB_TOKEN||n(`github-token`);if(!p){e(`Please add the GITHUB_TOKEN to the changesets action`);return}let m=process.cwd(),h=u(`commitMode`)??`git-cli`,g=u(`prDraft`);if(h!==`git-cli`&&h!==`github-api`){e(`Invalid commit mode: ${h}`);return}if(g!==void 0&&g!==`always`&&g!==`create`){e(`Invalid prDraft: ${g}`);return}let _=new s({cwd:m,githubToken:p,commitMode:h});r(`setupGitUser`)&&(t(`setting git user`),await _.setupUser());let{changesets:v}=await d(m),y=n(`publish`),b=v.length!==0,x=v.some(e=>e.releases.length>0),S=!!y;switch(a(`published`,`false`),a(`publishedPackages`,`[]`),a(`hasChangesets`,String(b)),!0){case!b&&!S:t(`No changesets present or were removed by merging release PR. Not publishing because no publish script found.`);return;case!b&&S:{if(t(`No changesets found. Attempting to publish any unpublished packages to npm`),process.env.NPM_TOKEN){let e=`${process.env.HOME}/.npmrc`;await l(e)?(t(`Found existing user .npmrc file`),(await f.readFile(e,`utf8`)).split(` import{c as e,d as t,l as n,o as r,s as i,u as a}from"./github-B-FmP-qI.js";import{i as o,n as s,r as c,t as l}from"./run-CVDXZtwd.js";import{r as u}from"./utils-CZUacPOo.js";import{t as d}from"./readChangesetState-Otq6gfkp.js";import f from"node:fs/promises";import"node:path";const p=t=>e(t)||void 0;(async()=>{let m=process.env.GITHUB_TOKEN||e(`github-token`);if(!m){a(`Please add the GITHUB_TOKEN to the changesets action`);return}let h=process.cwd(),g=c(m),_=p(`commitMode`)??`git-cli`,v=p(`prDraft`);if(_!==`git-cli`&&_!==`github-api`){a(`Invalid commit mode: ${_}`);return}if(v!==void 0&&v!==`always`&&v!==`create`){a(`Invalid prDraft: ${v}`);return}let y=new o({octokit:_===`github-api`?g:void 0,cwd:h});i(`setupGitUser`)&&(n(`setting git user`),await y.setupUser()),n(`setting GitHub credentials`),await f.writeFile(`${process.env.HOME}/.netrc`,`machine github.com\nlogin github-actions[bot]\npassword ${m}`);let{changesets:b}=await d(h),x=e(`publish`),S=b.length!==0,C=b.some(e=>e.releases.length>0),w=!!x;switch(t(`published`,`false`),t(`publishedPackages`,`[]`),t(`hasChangesets`,String(S)),!0){case!S&&!w:n(`No changesets present or were removed by merging release PR. Not publishing because no publish script found.`);return;case!S&&w:{if(n(`No changesets found. Attempting to publish any unpublished packages to npm`),process.env.NPM_TOKEN){let e=`${process.env.HOME}/.npmrc`;await u(e)?(n(`Found existing user .npmrc file`),(await f.readFile(e,`utf8`)).split(`
`).find(e=>/^\s*\/\/registry\.npmjs\.org\/:[_-]authToken=/i.test(e))?t(`Found existing auth token for the npm registry in the user .npmrc file`):(t(`Didn't find existing auth token for the npm registry in the user .npmrc file, creating one`),await f.appendFile(e,`\n//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`))):(t(`No user .npmrc file found, creating one with NPM_TOKEN used as auth token`),await f.writeFile(e,`//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`))}else process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN&&process.env.ACTIONS_ID_TOKEN_REQUEST_URL?t(`No NPM_TOKEN found, but OIDC is available - using npm trusted publishing`):t(`No NPM_TOKEN or OIDC available - assuming npm is already authenticated`);let e=await c({script:y,github:_,createGithubReleases:r(`createGithubReleases`),cwd:m});e.published&&(a(`published`,`true`),a(`publishedPackages`,JSON.stringify(e.publishedPackages))),e.exitCode!==0&&(i(`Publish command exited with code ${e.exitCode}${e.published?`, but some packages were published: ${e.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`),process.exit(e.exitCode));return}case b&&!x:t(`All changesets are empty; not creating PR`);return;case b:{let{pullRequestNumber:e}=await o({script:u(`version`),github:_,cwd:m,prTitle:u(`title`),commitMessage:u(`commit`),hasPublishScript:S,prDraft:g,branch:u(`branch`)});a(`pullRequestNumber`,String(e));return}}})().catch(t=>{i(t),e(t.message)});export{}; `).find(e=>/^\s*\/\/registry\.npmjs\.org\/:[_-]authToken=/i.test(e))?n(`Found existing auth token for the npm registry in the user .npmrc file`):(n(`Didn't find existing auth token for the npm registry in the user .npmrc file, creating one`),await f.appendFile(e,`\n//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`))):(n(`No user .npmrc file found, creating one with NPM_TOKEN used as auth token`),await f.writeFile(e,`//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\n`))}else process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN&&process.env.ACTIONS_ID_TOKEN_REQUEST_URL?n(`No NPM_TOKEN found, but OIDC is available - using npm trusted publishing`):n(`No NPM_TOKEN or OIDC available - assuming npm is already authenticated`);let e=await l({script:x,githubToken:m,git:y,octokit:g,createGithubReleases:i(`createGithubReleases`),cwd:h});e.published&&(t(`published`,`true`),t(`publishedPackages`,JSON.stringify(e.publishedPackages))),e.exitCode!==0&&(r(`Publish command exited with code ${e.exitCode}${e.published?`, but some packages were published: ${e.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`),process.exit(e.exitCode));return}case S&&!C:n(`All changesets are empty; not creating PR`);return;case S:{let e=c(m),{pullRequestNumber:n}=await s({script:p(`version`),githubToken:m,git:y,octokit:e,cwd:h,prTitle:p(`title`),commitMessage:p(`commit`),hasPublishScript:w,prDraft:v,branch:p(`branch`)});t(`pullRequestNumber`,String(n));return}}})().catch(e=>{r(e),a(e.message)});export{};
+1 -1
View File
@@ -1 +1 @@
import{_ as e,v as t}from"./get-packages.cjs-Dvdg-NAr.js";import{f as n,n as r,s as i,t as a}from"./utils-DQTbg3yF.js";import o from"node:fs/promises";import s from"node:path";import c from"node:os";try{await l()}catch(t){e(t.message)}async function l(){let e=i(`publish-plan-artifact-id`),r=process.cwd(),a=process.env.RUNNER_TEMP??await o.realpath(c.tmpdir()),l=s.join(a,`changeset-pack-${Date.now()}`);await u(r,{outDir:l,publishPlanPath:e?await d(a,Number(e)):void 0});let p=await n.uploadArtifact(`changeset-pack-${Date.now()}`,await f(l),l,{retentionDays:30});if(p.id===void 0)throw Error(`Packed artifact upload did not return an artifact id`);t(`pack-dir-artifact-id`,String(p.id))}async function u(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 d(e,t){let n=await a(e,t,`changeset-publish-plan`);return s.join(n,`publish-plan.json`)}async function f(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=s.join(e,t.name);return t.isDirectory()?f(n):[n]}))).flat()}export{}; import{c as e,d as t,u as n}from"./github-B-FmP-qI.js";import{n as r,t as i,u as a}from"./utils-CZUacPOo.js";import o from"node:fs/promises";import s from"node:path";import c from"node:os";try{await l()}catch(e){n(e.message)}async function l(){let n=e(`publish-plan-artifact-id`),r=process.cwd(),i=process.env.RUNNER_TEMP??await o.realpath(c.tmpdir()),l=s.join(i,`changeset-pack-${Date.now()}`);await u(r,{outDir:l,publishPlanPath:n?await d(i,Number(n)):void 0});let p=await a.uploadArtifact(`changeset-pack-${Date.now()}`,await f(l),l,{retentionDays:30});if(p.id===void 0)throw Error(`Packed artifact upload did not return an artifact id`);t(`pack-dir-artifact-id`,String(p.id))}async function u(e,t){let n=[`pack`,`--out-dir`,t.outDir];t.publishPlanPath&&n.push(`--from-plan`,t.publishPlanPath),await r(n,{cwd:e,env:process.env})}async function d(e,t){let n=await i(e,t,`changeset-publish-plan`);return s.join(n,`publish-plan.json`)}async function f(e){let t=await o.readdir(e,{withFileTypes:!0});return(await Promise.all(t.map(async t=>{let n=s.join(e,t.name);return t.isDirectory()?f(n):[n]}))).flat()}export{};
+1 -1
View File
@@ -1 +1 @@
import{_ as e,c as t,g as n,l as r,v as i}from"./get-packages.cjs-Dvdg-NAr.js";import{c as a,s as o}from"./utils-DQTbg3yF.js";try{await s()}catch(t){e(t.message)}async function s(){let e=t.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=o(`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=r(s),h;d&&(n(`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?(n(`Updating existing comment (id: ${h})...`),await m.rest.issues.updateComment({...p,comment_id:h}),i(`comment-id`,h)):(n(`Creating new comment...`),i(`comment-id`,(await m.rest.issues.createComment(p)).data.id)),n(`Done!`)}function c(e){let t=`changesets-action-pr-comment`;return t===e?`<!-- ${t} -->`:`<!-- ${t}:${e} -->`}export{}; import{c as e,d as t,l as n,n as r,t as i,u as a}from"./github-B-FmP-qI.js";try{await o()}catch(e){a(e.message)}async function o(){let a=i.payload.pull_request;if(!a)throw Error("This action should only be run on `pull_request_target` or `pull_request` events");let o=e(`github-token`,{required:!0}),c=e(`body`,{required:!0}),l=e(`update-id`),u=l?s(l):null,d=u?`${u}\n\n${c}`:c,f={repo:a.base.repo.name,owner:a.base.repo.owner.login,issue_number:a.number,body:d},p=r(o),m;u&&(n(`Checking for existing comment...`),m=await p.rest.issues.listComments({repo:a.base.repo.name,owner:a.base.repo.owner.login,issue_number:a.number}).then(e=>e.data.find(e=>e.body?.includes(u))?.id)),m?(n(`Updating existing comment (id: ${m})...`),await p.rest.issues.updateComment({...f,comment_id:m}),t(`comment-id`,m)):(n(`Creating new comment...`),t(`comment-id`,(await p.rest.issues.createComment(f)).data.id)),n(`Done!`)}function s(e){let t=`changesets-action-pr-comment`;return t===e?`<!-- ${t} -->`:`<!-- ${t}:${e} -->`}export{};
+4 -4
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
import{_ as e,m as t,v as n}from"./get-packages.cjs-Dvdg-NAr.js";import{r,t as i}from"./run-Cekyj2rz.js";import{c as a,s as o,t as s}from"./utils-DQTbg3yF.js";import c from"node:fs/promises";import l from"node:os";try{await u()}catch(t){e(t.message)}async function u(){let e=a(`github-token`),u=o(`script`),d=o(`pack-dir-artifact-id`),f=t(`create-github-releases`),p=process.cwd(),m=await i({script:u,github:new r({cwd:p,githubToken:e,commitMode:`github-api`}),createGithubReleases:f,cwd:p,fromPackDir:d?await s(process.env.RUNNER_TEMP??await c.realpath(l.tmpdir()),Number(d),`changeset-pack`):void 0});if(m.published?(n(`published`,`true`),n(`published-packages`,JSON.stringify(m.publishedPackages))):n(`published`,`false`),m.exitCode!==0)throw Error(`Publish command exited with code ${m.exitCode}${m.published?`, but some packages were published: ${m.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`)}export{}; import{c as e,d as t,s as n,u as r}from"./github-B-FmP-qI.js";import{i,r as a,t as o}from"./run-CVDXZtwd.js";import{t as s}from"./utils-CZUacPOo.js";import c from"node:fs/promises";import l from"node:os";try{await u()}catch(e){r(e.message)}async function u(){let r=e(`github-token`,{required:!0}),u=e(`script`),d=e(`pack-dir-artifact-id`),f=n(`create-github-releases`),p=process.cwd(),m=a(r),h=await o({script:u,githubToken:r,git:new i({octokit:m,cwd:p}),octokit:m,createGithubReleases:f,cwd:p,fromPackDir:d?await s(process.env.RUNNER_TEMP??await c.realpath(l.tmpdir()),Number(d),`changeset-pack`):void 0});if(h.published?(t(`published`,`true`),t(`published-packages`,JSON.stringify(h.publishedPackages))):t(`published`,`false`),h.exitCode!==0)throw Error(`Publish command exited with code ${h.exitCode}${h.published?`, but some packages were published: ${h.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`)}export{};
@@ -1 +1 @@
import{o as e,t}from"./changesets-read.esm-D6fW_L6x.js";async function n(n=process.cwd()){let r=await e(n),i=await t(n);if(r!==void 0&&r.mode===`pre`){let e=new Set(r.changesets);return{preState:r,changesets:i.filter(t=>!e.has(t.id))}}return{preState:void 0,changesets:i}}export{n as t}; import{o as e,t}from"./changesets-read.esm-Cr0YoPBA.js";async function n(n=process.cwd()){let r=await e(n),i=await t(n);if(r!==void 0&&r.mode===`pre`){let e=new Set(r.changesets);return{preState:r,changesets:i.filter(t=>!e.has(t.id))}}return{preState:void 0,changesets:i}}export{n as t};
+149
View File
File diff suppressed because one or more lines are too long
-149
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
import{_ as e,v as t}from"./get-packages.cjs-Dvdg-NAr.js";import{f as n,n as r}from"./utils-DQTbg3yF.js";import{t as i}from"./readChangesetState-D8jsqLyj.js";import a from"node:fs/promises";import o from"node:path";import s from"node:os";try{await c()}catch(t){e(t.message)}async function c(){let e=await l();if(t(`mode`,e.mode),e.mode===`publish`){let r=await n.uploadArtifact(o.basename(e.publishPlanPath,`.json`),[e.publishPlanPath],o.dirname(e.publishPlanPath),{skipArchive:!0,retentionDays:30});if(r.id===void 0)throw Error(`Publish plan artifact upload did not return an artifact id`);t(`publish-plan-artifact-id`,String(r.id))}}async function l(){let{changesets:e}=await i();if(e.length>0)return e.some(e=>e.releases.length>0)?{mode:`version`}:{mode:`none`};let t=process.cwd(),n=o.join(process.env.RUNNER_TEMP??await a.realpath(s.tmpdir()),`changeset-publish-plan-${Date.now()}`,`publish-plan.json`);return await r([`publish-plan`,`--output`,n],{cwd:t,env:process.env}),(await u(n)).length===0?{mode:`none`}:{mode:`publish`,publishPlanPath:n}}async function u(e){let t;try{t=await a.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{}; import{d as e,u as t}from"./github-B-FmP-qI.js";import{n,u as r}from"./utils-CZUacPOo.js";import{t as i}from"./readChangesetState-Otq6gfkp.js";import a from"node:fs/promises";import o from"node:path";import s from"node:os";try{await c()}catch(e){t(e.message)}async function c(){let t=await l();if(e(`mode`,t.mode),t.mode===`publish`){let n=await r.uploadArtifact(o.basename(t.publishPlanPath,`.json`),[t.publishPlanPath],o.dirname(t.publishPlanPath),{skipArchive:!0,retentionDays:30});if(n.id===void 0)throw Error(`Publish plan artifact upload did not return an artifact id`);e(`publish-plan-artifact-id`,String(n.id))}}async function l(){let{changesets:e}=await i();if(e.length>0)return e.some(e=>e.releases.length>0)?{mode:`version`}:{mode:`none`};let t=process.cwd(),r=o.join(process.env.RUNNER_TEMP??await a.realpath(s.tmpdir()),`changeset-publish-plan-${Date.now()}.json`);return await n([`publish-plan`,`--output`,r],{cwd:t,env:process.env}),(await u(r)).length===0?{mode:`none`}:{mode:`publish`,publishPlanPath:r}}async function u(e){let t;try{t=await a.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{};
+80
View File
File diff suppressed because one or more lines are too long
-80
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
import{_ as e,g as t,m as n,v as r}from"./get-packages.cjs-Dvdg-NAr.js";import{n as i,r as a}from"./run-Cekyj2rz.js";import{c as o,s}from"./utils-DQTbg3yF.js";try{await c()}catch(t){e(t.message)}async function c(){let e=o(`github-token`),c=s(`script`),l=o(`commit-message`),u=o(`pr-title`),d=s(`pr-draft`),f=s(`pr-base-branch`),p=s(`commit-mode`)??`git-cli`,m=n(`setup-git-user`);if(d!==void 0&&d!==`always`&&d!==`create`)throw Error(`Invalid pr-draft input: ${d}`);if(p!==`git-cli`&&p!==`github-api`)throw Error(`Invalid commit-mode input: ${p}`);let h=process.cwd(),g=new a({cwd:h,githubToken:e,commitMode:p});m&&(t(`setting git user`),await g.setupUser());let{pullRequestNumber:_}=await i({script:c,github:g,cwd:h,prTitle:u,commitMessage:l,hasPublishScript:!0,prDraft:d,branch:f});r(`pr-number`,String(_))}export{}; import{c as e,d as t,l as n,s as r,u as i}from"./github-B-FmP-qI.js";import{i as a,n as o,r as s}from"./run-CVDXZtwd.js";try{await c()}catch(e){i(e.message)}async function c(){let i=e(`github-token`,{required:!0}),c=e(`script`),l=e(`commit-message`,{required:!0}),u=e(`pr-title`,{required:!0}),d=e(`pr-draft`)||void 0,f=e(`pr-base-branch`),p=e(`commit-mode`)||`git-cli`,m=r(`setup-git-user`);if(d!==void 0&&d!==`always`&&d!==`create`)throw Error(`Invalid pr-draft input: ${d}`);let h=process.cwd(),g=s(i),_=new a({octokit:p===`github-api`?g:void 0,cwd:h});m&&(n(`setting git user`),await _.setupUser());let{pullRequestNumber:v}=await o({script:c,githubToken:i,git:_,octokit:g,cwd:h,prTitle:u,commitMessage:l,hasPublishScript:!0,prDraft:d,branch:f});t(`pr-number`,String(v))}export{};
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "@changesets/action", "name": "@changesets/action",
"version": "2.0.0-next.2", "version": "2.0.0-next.0",
"license": "MIT", "license": "MIT",
"type": "module", "type": "module",
"main": "dist/index.js", "main": "dist/index.js",
+18 -68
View File
@@ -1,15 +1,11 @@
import { Buffer } from "node:buffer";
import * as core from "@actions/core"; import * as core from "@actions/core";
import { exec, getExecOutput } from "@actions/exec"; import { exec, getExecOutput } from "@actions/exec";
import { context } from "@actions/github"; import * as github from "@actions/github";
import { commitChangesFromRepo } from "@changesets/ghcommit/git"; import { commitChangesFromRepo } from "@changesets/ghcommit/git";
import { setupOctokit, type Octokit } from "./octokit.ts"; import type { Octokit } from "./octokit.ts";
export type CommitMode = "git-cli" | "github-api";
type GitOptions = { type GitOptions = {
cwd: string; cwd: string;
env?: Record<string, string>;
}; };
const push = async (branch: string, options: GitOptions) => { const push = async (branch: string, options: GitOptions) => {
@@ -50,51 +46,17 @@ const checkIfClean = async (options: GitOptions): Promise<boolean> => {
return !stdout.length; return !stdout.length;
}; };
export class GitHub { export class Git {
readonly #githubToken: string; readonly octokit: Octokit | null;
readonly octokit: Octokit;
readonly cwd: string; readonly cwd: string;
readonly commitMode: CommitMode;
constructor(options: { constructor(args: { octokit?: Octokit; cwd: string }) {
githubToken: string; this.octokit = args.octokit ?? null;
cwd: string; this.cwd = args.cwd;
commitMode?: CommitMode;
}) {
this.#githubToken = options.githubToken;
this.cwd = options.cwd;
this.commitMode = options.commitMode ?? "git-cli";
this.octokit = setupOctokit(options.githubToken);
}
getToken() {
return this.#githubToken;
}
#getCliAuthEnv(): Record<string, string> {
const basic = Buffer.from(`x-access-token:${this.#githubToken}`).toString(
"base64",
);
const serverUrl = (
context.serverUrl ??
process.env.GITHUB_SERVER_URL ??
"https://github.com"
).replace(/\/+$/, "");
const gitConfigCount = Number(process.env.GIT_CONFIG_COUNT ?? 0);
if (!Number.isInteger(gitConfigCount) || gitConfigCount < 0) {
throw new Error(
`Invalid GIT_CONFIG_COUNT value: ${process.env.GIT_CONFIG_COUNT}`,
);
}
return {
GIT_CONFIG_COUNT: String(gitConfigCount + 1),
[`GIT_CONFIG_KEY_${gitConfigCount}`]: `http.${serverUrl}/.extraheader`,
[`GIT_CONFIG_VALUE_${gitConfigCount}`]: `AUTHORIZATION: basic ${basic}`,
};
} }
async setupUser() { async setupUser() {
if (this.commitMode === "github-api") { if (this.octokit) {
return; return;
} }
await exec("git", ["config", "user.name", `"github-actions[bot]"`], { await exec("git", ["config", "user.name", `"github-actions[bot]"`], {
@@ -114,38 +76,32 @@ export class GitHub {
} }
async pushTag(tag: string) { async pushTag(tag: string) {
if (this.commitMode === "github-api") { if (this.octokit) {
return this.octokit.rest.git return this.octokit.rest.git
.createRef({ .createRef({
...context.repo, ...github.context.repo,
ref: `refs/tags/${tag}`, ref: `refs/tags/${tag}`,
sha: context.sha, sha: github.context.sha,
}) })
.catch((err) => { .catch((err) => {
// Assuming tag was manually pushed in custom publish script // Assuming tag was manually pushed in custom publish script
core.warning(`Failed to create tag ${tag}: ${err.message}`); core.warning(`Failed to create tag ${tag}: ${err.message}`);
}); });
} }
await exec("git", ["push", "origin", tag], { await exec("git", ["push", "origin", tag], { cwd: this.cwd });
cwd: this.cwd,
env: {
...process.env,
...this.#getCliAuthEnv(),
} as Record<string, string>,
});
} }
async prepareBranch(branch: string) { async prepareBranch(branch: string) {
if (this.commitMode === "github-api") { if (this.octokit) {
// Preparing a new local branch is not necessary when using the API // Preparing a new local branch is not necessary when using the API
return; return;
} }
await switchToMaybeExistingBranch(branch, { cwd: this.cwd }); await switchToMaybeExistingBranch(branch, { cwd: this.cwd });
await reset(context.sha, { cwd: this.cwd }); await reset(github.context.sha, { cwd: this.cwd });
} }
async pushChanges({ branch, message }: { branch: string; message: string }) { async pushChanges({ branch, message }: { branch: string; message: string }) {
if (this.commitMode === "github-api") { if (this.octokit) {
/** /**
* Only add files form the current working directory * Only add files form the current working directory
* *
@@ -155,11 +111,11 @@ export class GitHub {
const addFromDirectory = this.cwd; const addFromDirectory = this.cwd;
return commitChangesFromRepo({ return commitChangesFromRepo({
octokit: this.octokit, octokit: this.octokit,
...context.repo, ...github.context.repo,
branch, branch,
message, message,
base: { base: {
commit: context.sha, commit: github.context.sha,
}, },
cwd: this.cwd, cwd: this.cwd,
force: true, force: true,
@@ -168,12 +124,6 @@ export class GitHub {
if (!(await checkIfClean({ cwd: this.cwd }))) { if (!(await checkIfClean({ cwd: this.cwd }))) {
await commitAll(message, { cwd: this.cwd }); await commitAll(message, { cwd: this.cwd });
} }
await push(branch, { await push(branch, { cwd: this.cwd });
cwd: this.cwd,
env: {
...process.env,
...this.#getCliAuthEnv(),
} as Record<string, string>,
});
} }
} }
+23 -8
View File
@@ -1,9 +1,13 @@
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import path from "node:path";
import * as core from "@actions/core"; import * as core from "@actions/core";
import { GitHub } from "./github.ts"; import { Git } from "./git.ts";
import { setupOctokit } from "./octokit.ts";
import readChangesetState from "./readChangesetState.ts"; import readChangesetState from "./readChangesetState.ts";
import { runPublish, runVersion } from "./run.ts"; import { runPublish, runVersion } from "./run.ts";
import { fileExists, getOptionalInput } from "./utils.ts"; import { fileExists } from "./utils.ts";
const getOptionalInput = (name: string) => core.getInput(name) || undefined;
(async () => { (async () => {
// to maintain compatibility with workflows created before github-token input was introduced // to maintain compatibility with workflows created before github-token input was introduced
@@ -18,6 +22,7 @@ import { fileExists, getOptionalInput } from "./utils.ts";
// If the user needs to change the cwd, set `working-directory` in the step instead // If the user needs to change the cwd, set `working-directory` in the step instead
const cwd = process.cwd(); const cwd = process.cwd();
const octokit = setupOctokit(githubToken);
const commitMode = getOptionalInput("commitMode") ?? "git-cli"; const commitMode = getOptionalInput("commitMode") ?? "git-cli";
const prDraft = getOptionalInput("prDraft"); const prDraft = getOptionalInput("prDraft");
if (commitMode !== "git-cli" && commitMode !== "github-api") { if (commitMode !== "git-cli" && commitMode !== "github-api") {
@@ -28,19 +33,24 @@ import { fileExists, getOptionalInput } from "./utils.ts";
core.setFailed(`Invalid prDraft: ${prDraft}`); core.setFailed(`Invalid prDraft: ${prDraft}`);
return; return;
} }
const github = new GitHub({ const git = new Git({
octokit: commitMode === "github-api" ? octokit : undefined,
cwd, cwd,
githubToken,
commitMode,
}); });
let setupGitUser = core.getBooleanInput("setupGitUser"); let setupGitUser = core.getBooleanInput("setupGitUser");
if (setupGitUser) { if (setupGitUser) {
core.info("setting git user"); core.info("setting git user");
await github.setupUser(); await git.setupUser();
} }
core.info("setting GitHub credentials");
await fs.writeFile(
`${process.env.HOME}/.netrc`,
`machine github.com\nlogin github-actions[bot]\npassword ${githubToken}`,
);
let { changesets } = await readChangesetState(cwd); let { changesets } = await readChangesetState(cwd);
let publishScript = core.getInput("publish"); let publishScript = core.getInput("publish");
@@ -112,7 +122,9 @@ import { fileExists, getOptionalInput } from "./utils.ts";
const result = await runPublish({ const result = await runPublish({
script: publishScript, script: publishScript,
github, githubToken,
git,
octokit,
createGithubReleases: core.getBooleanInput("createGithubReleases"), createGithubReleases: core.getBooleanInput("createGithubReleases"),
cwd, cwd,
}); });
@@ -143,9 +155,12 @@ import { fileExists, getOptionalInput } from "./utils.ts";
core.info("All changesets are empty; not creating PR"); core.info("All changesets are empty; not creating PR");
return; return;
case hasChangesets: { case hasChangesets: {
const octokit = setupOctokit(githubToken);
const { pullRequestNumber } = await runVersion({ const { pullRequestNumber } = await runVersion({
script: getOptionalInput("version"), script: getOptionalInput("version"),
github, githubToken,
git,
octokit,
cwd, cwd,
prTitle: getOptionalInput("title"), prTitle: getOptionalInput("title"),
commitMessage: getOptionalInput("commit"), commitMessage: getOptionalInput("commit"),
+3 -7
View File
@@ -3,11 +3,7 @@ import os from "node:os";
import path from "node:path"; import path from "node:path";
import artifact from "@actions/artifact"; import artifact from "@actions/artifact";
import * as core from "@actions/core"; import * as core from "@actions/core";
import { import { downloadArtifact, execChangesetsCli } from "../utils.ts";
downloadArtifact,
execChangesetsCli,
getOptionalInput,
} from "../utils.ts";
try { try {
await main(); await main();
@@ -16,7 +12,7 @@ try {
} }
async function main() { async function main() {
const publishPlanArtifactId = getOptionalInput("publish-plan-artifact-id"); const publishPlanArtifactId = core.getInput("publish-plan-artifact-id");
// If the user needs to change the cwd, set `working-directory` in the step instead // If the user needs to change the cwd, set `working-directory` in the step instead
const cwd = process.cwd(); const cwd = process.cwd();
@@ -53,7 +49,7 @@ async function pack(
) { ) {
const cliArgs = ["pack", "--out-dir", args.outDir]; const cliArgs = ["pack", "--out-dir", args.outDir];
if (args.publishPlanPath) { if (args.publishPlanPath) {
cliArgs.push("--from-publish-plan", args.publishPlanPath); cliArgs.push("--from-plan", args.publishPlanPath);
} }
await execChangesetsCli(cliArgs, { await execChangesetsCli(cliArgs, {
+3 -4
View File
@@ -1,6 +1,5 @@
import * as core from "@actions/core"; import * as core from "@actions/core";
import * as github from "@actions/github"; import * as github from "@actions/github";
import { getOptionalInput, getRequiredInput } from "../utils.ts";
type Octokit = ReturnType<typeof github.getOctokit>; type Octokit = ReturnType<typeof github.getOctokit>;
type CreateCommentParams = NonNullable< type CreateCommentParams = NonNullable<
@@ -24,9 +23,9 @@ async function main() {
); );
} }
const githubToken = getRequiredInput("github-token"); const githubToken = core.getInput("github-token", { required: true });
const body = getRequiredInput("body"); const body = core.getInput("body", { required: true });
const updateId = getOptionalInput("update-id"); const updateId = core.getInput("update-id");
const commentMarker = updateId ? getCommentMarker(updateId) : null; const commentMarker = updateId ? getCommentMarker(updateId) : null;
const commentBody = commentMarker ? `${commentMarker}\n\n${body}` : body; const commentBody = commentMarker ? `${commentMarker}\n\n${body}` : body;
+12 -12
View File
@@ -1,13 +1,10 @@
import fs from "node:fs/promises"; import fs from "node:fs/promises";
import os from "node:os"; import os from "node:os";
import * as core from "@actions/core"; import * as core from "@actions/core";
import { GitHub } from "../github.ts"; import { Git } from "../git.ts";
import { setupOctokit } from "../octokit.ts";
import { runPublish } from "../run.ts"; import { runPublish } from "../run.ts";
import { import { downloadArtifact } from "../utils.ts";
downloadArtifact,
getOptionalInput,
getRequiredInput,
} from "../utils.ts";
try { try {
await main(); await main();
@@ -16,16 +13,17 @@ try {
} }
async function main() { async function main() {
const githubToken = getRequiredInput("github-token"); const githubToken = core.getInput("github-token", { required: true });
const script = getOptionalInput("script"); const script = core.getInput("script");
const packDirArtifactId = getOptionalInput("pack-dir-artifact-id"); const packDirArtifactId = core.getInput("pack-dir-artifact-id");
const createGithubReleases = core.getBooleanInput("create-github-releases"); const createGithubReleases = core.getBooleanInput("create-github-releases");
// If the user needs to change the cwd, set `working-directory` in the step instead // If the user needs to change the cwd, set `working-directory` in the step instead
const cwd = process.cwd(); const cwd = process.cwd();
// NOTE: Always use API mode here as publish does not need a commit-mode. const octokit = setupOctokit(githubToken);
const github = new GitHub({ cwd, githubToken, commitMode: "github-api" }); // NOTE: Always pass octokit here as publish does not need a commit-mode
const git = new Git({ octokit, cwd });
const fromPackDir = packDirArtifactId const fromPackDir = packDirArtifactId
? await downloadArtifact( ? await downloadArtifact(
@@ -37,7 +35,9 @@ async function main() {
const result = await runPublish({ const result = await runPublish({
script, script,
github, githubToken,
git,
octokit,
createGithubReleases, createGithubReleases,
cwd, cwd,
fromPackDir, fromPackDir,
+27 -16
View File
@@ -3,7 +3,8 @@ import type { Changeset } from "@changesets/types";
import writeChangeset from "@changesets/write"; import writeChangeset from "@changesets/write";
import { createFixture } from "fs-fixture"; import { createFixture } from "fs-fixture";
import { beforeEach, describe, expect, it, vi } from "vitest"; import { beforeEach, describe, expect, it, vi } from "vitest";
import { GitHub } from "./github.ts"; import { Git } from "./git.ts";
import { setupOctokit } from "./octokit.ts";
import { runVersion } from "./run.ts"; import { runVersion } from "./run.ts";
vi.mock("@actions/github", () => ({ vi.mock("@actions/github", () => ({
@@ -20,6 +21,7 @@ vi.mock("@actions/github", () => ({
graphql: mockedGraphql, graphql: mockedGraphql,
}), }),
})); }));
vi.mock("./git.ts");
vi.mock("@changesets/ghcommit/git"); vi.mock("@changesets/ghcommit/git");
let mockedGithubMethods = { let mockedGithubMethods = {
@@ -89,13 +91,6 @@ const writeChangesets = (changesets: Changeset[], cwd: string) => {
return Promise.all(changesets.map((commit) => writeChangeset(commit, cwd))); return Promise.all(changesets.map((commit) => writeChangeset(commit, cwd)));
}; };
const createGithub = (cwd: string) =>
new GitHub({
cwd,
githubToken: "@@GITHUB_TOKEN",
commitMode: "github-api",
});
beforeEach(() => { beforeEach(() => {
vi.clearAllMocks(); vi.clearAllMocks();
}); });
@@ -131,7 +126,9 @@ describe("version", () => {
); );
await runVersion({ await runVersion({
github: createGithub(cwd), octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
cwd, cwd,
}); });
@@ -164,7 +161,9 @@ describe("version", () => {
); );
await runVersion({ await runVersion({
github: createGithub(cwd), octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
cwd, cwd,
prDraft: "create", prDraft: "create",
}); });
@@ -198,7 +197,9 @@ describe("version", () => {
); );
await runVersion({ await runVersion({
github: createGithub(cwd), octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
cwd, cwd,
}); });
@@ -231,7 +232,9 @@ describe("version", () => {
); );
await runVersion({ await runVersion({
github: createGithub(cwd), octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
cwd, cwd,
}); });
@@ -284,7 +287,9 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
); );
await runVersion({ await runVersion({
github: createGithub(cwd), octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
cwd, cwd,
prBodyMaxCharacters: 1000, prBodyMaxCharacters: 1000,
}); });
@@ -341,7 +346,9 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
); );
await runVersion({ await runVersion({
github: createGithub(cwd), octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
cwd, cwd,
prBodyMaxCharacters: 500, prBodyMaxCharacters: 500,
}); });
@@ -376,7 +383,9 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
); );
await runVersion({ await runVersion({
github: createGithub(cwd), octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
cwd, cwd,
prDraft: "create", prDraft: "create",
}); });
@@ -408,7 +417,9 @@ fluminis divesque vulnere aquis parce lapsis rabie si visa fulmineis.
); );
await runVersion({ await runVersion({
github: createGithub(cwd), octokit: setupOctokit("@@GITHUB_TOKEN"),
githubToken: "@@GITHUB_TOKEN",
git: new Git({ cwd }),
cwd, cwd,
prDraft: "always", prDraft: "always",
}); });
+25 -22
View File
@@ -7,10 +7,10 @@ import {
type ExecOptions, type ExecOptions,
type ExecOutput, type ExecOutput,
} from "@actions/exec"; } from "@actions/exec";
import { context } from "@actions/github"; import * as github from "@actions/github";
import type { PreState } from "@changesets/types"; import type { PreState } from "@changesets/types";
import { type Package, getPackages } from "@manypkg/get-packages"; import { type Package, getPackages } from "@manypkg/get-packages";
import type { GitHub } from "./github.ts"; import { Git } from "./git.ts";
import type { Octokit } from "./octokit.ts"; import type { Octokit } from "./octokit.ts";
import readChangesetState from "./readChangesetState.ts"; import readChangesetState from "./readChangesetState.ts";
import { import {
@@ -57,15 +57,17 @@ const createRelease = async (
tag_name: tagName, tag_name: tagName,
body: changelogEntry.content, body: changelogEntry.content,
prerelease: pkg.packageJson.version.includes("-"), prerelease: pkg.packageJson.version.includes("-"),
...context.repo, ...github.context.repo,
}); });
}; };
type PublishOptions = { type PublishOptions = {
script?: string; script?: string;
fromPackDir?: string; fromPackDir?: string;
githubToken: string;
octokit: Octokit;
createGithubReleases: boolean; createGithubReleases: boolean;
github: GitHub; git: Git;
cwd: string; cwd: string;
}; };
@@ -85,16 +87,17 @@ type PublishResult =
export async function runPublish({ export async function runPublish({
script, script,
fromPackDir, fromPackDir,
github, githubToken,
git,
octokit,
createGithubReleases, createGithubReleases,
cwd, cwd,
}: PublishOptions): Promise<PublishResult> { }: PublishOptions): Promise<PublishResult> {
const { octokit } = github;
let changesetPublishOutput: ExecOutput; let changesetPublishOutput: ExecOutput;
const execOptions: ExecOptions = { const execOptions: ExecOptions = {
cwd, cwd,
ignoreReturnCode: true, ignoreReturnCode: true,
env: { ...process.env, GITHUB_TOKEN: github.getToken() }, env: { ...process.env, GITHUB_TOKEN: githubToken },
}; };
if (script) { if (script) {
@@ -141,7 +144,7 @@ export async function runPublish({
await Promise.all( await Promise.all(
releasedPackages.map(async (pkg) => { releasedPackages.map(async (pkg) => {
const tagName = `${pkg.packageJson.name}@${pkg.packageJson.version}`; const tagName = `${pkg.packageJson.name}@${pkg.packageJson.version}`;
await github.pushTag(tagName); await git.pushTag(tagName);
await createRelease(octokit, { pkg, tagName }); await createRelease(octokit, { pkg, tagName });
}), }),
); );
@@ -163,7 +166,7 @@ export async function runPublish({
releasedPackages.push(pkg); releasedPackages.push(pkg);
if (createGithubReleases) { if (createGithubReleases) {
const tagName = `v${pkg.packageJson.version}`; const tagName = `v${pkg.packageJson.version}`;
await github.pushTag(tagName); await git.pushTag(tagName);
await createRelease(octokit, { pkg, tagName }); await createRelease(octokit, { pkg, tagName });
} }
break; break;
@@ -256,7 +259,9 @@ export async function getVersionPrBody({
type VersionOptions = { type VersionOptions = {
script?: string; script?: string;
github: GitHub; githubToken: string;
git: Git;
octokit: Octokit;
cwd?: string; cwd?: string;
prTitle?: string; prTitle?: string;
commitMessage?: string; commitMessage?: string;
@@ -272,25 +277,26 @@ type RunVersionResult = {
export async function runVersion({ export async function runVersion({
script, script,
github, githubToken,
git,
octokit,
cwd = process.cwd(), cwd = process.cwd(),
prTitle = "Version Packages", prTitle = "Version Packages",
commitMessage = "Version Packages", commitMessage = "Version Packages",
hasPublishScript = false, hasPublishScript = false,
prBodyMaxCharacters = MAX_CHARACTERS_PER_MESSAGE, prBodyMaxCharacters = MAX_CHARACTERS_PER_MESSAGE,
branch = context.ref.replace("refs/heads/", ""), branch = github.context.ref.replace("refs/heads/", ""),
prDraft, prDraft,
}: VersionOptions): Promise<RunVersionResult> { }: VersionOptions): Promise<RunVersionResult> {
const { octokit } = github;
let versionBranch = `changeset-release/${branch}`; let versionBranch = `changeset-release/${branch}`;
let { preState } = await readChangesetState(cwd); let { preState } = await readChangesetState(cwd);
await github.prepareBranch(versionBranch); await git.prepareBranch(versionBranch);
let versionsByDirectory = await getVersionsByDirectory(cwd); let versionsByDirectory = await getVersionsByDirectory(cwd);
const env = { ...process.env, GITHUB_TOKEN: github.getToken() }; const env = { ...process.env, GITHUB_TOKEN: githubToken };
if (script) { if (script) {
await exec(script, undefined, { cwd, env }); await exec(script, undefined, { cwd, env });
@@ -329,9 +335,9 @@ export async function runVersion({
* which GitHub will then react to by closing the PRs) * which GitHub will then react to by closing the PRs)
*/ */
const existingPullRequests = await octokit.rest.pulls.list({ const existingPullRequests = await octokit.rest.pulls.list({
...context.repo, ...github.context.repo,
state: "open", state: "open",
head: `${context.repo.owner}:${versionBranch}`, head: `${github.context.repo.owner}:${versionBranch}`,
base: branch, base: branch,
}); });
core.info( core.info(
@@ -342,10 +348,7 @@ export async function runVersion({
)}`, )}`,
); );
await github.pushChanges({ await git.pushChanges({ branch: versionBranch, message: finalCommitMessage });
branch: versionBranch,
message: finalCommitMessage,
});
const changedPackagesInfo = (await changedPackagesInfoPromises) const changedPackagesInfo = (await changedPackagesInfoPromises)
.filter((x) => x) .filter((x) => x)
@@ -367,7 +370,7 @@ export async function runVersion({
title: finalPrTitle, title: finalPrTitle,
body: prBody, body: prBody,
draft: prDraft !== undefined, draft: prDraft !== undefined,
...context.repo, ...github.context.repo,
}); });
return { return {
+1 -3
View File
@@ -64,9 +64,7 @@ async function getMode(): Promise<ModeResult> {
const cwd = process.cwd(); const cwd = process.cwd();
const publishPlanPath = path.join( const publishPlanPath = path.join(
process.env.RUNNER_TEMP ?? (await fs.realpath(os.tmpdir())), process.env.RUNNER_TEMP ?? (await fs.realpath(os.tmpdir())),
`changeset-publish-plan-${Date.now()}`, `changeset-publish-plan-${Date.now()}.json`,
// we need a stable filename here (in a unique dirname) so the artifact download can find this cleanly
"publish-plan.json",
); );
await execChangesetsCli(["publish-plan", "--output", publishPlanPath], { await execChangesetsCli(["publish-plan", "--output", publishPlanPath], {
cwd, cwd,
-12
View File
@@ -2,7 +2,6 @@ import fs from "node:fs/promises";
import { createRequire } from "node:module"; import { createRequire } from "node:module";
import path from "node:path"; import path from "node:path";
import artifact from "@actions/artifact"; import artifact from "@actions/artifact";
import * as core from "@actions/core";
import { import {
exec, exec,
getExecOutput, getExecOutput,
@@ -124,17 +123,6 @@ export function fileExists(filePath: string) {
); );
} }
export function getOptionalInput(name: string) {
// normalize empty string default return value of `core.getInput` to undefined
return core.getInput(name) || undefined;
}
export function getRequiredInput(name: string) {
// it's just a small utility wrapper, mainly introduced for usage parity with our custom `getOptionalInput`
// note: `core.getBooleanInput` gets used directly as it already normalizes the return value nicely
return core.getInput(name, { required: true });
}
function resolveChangesetsCli(cwd: string) { function resolveChangesetsCli(cwd: string) {
return require.resolve("@changesets/cli/bin.js", { return require.resolve("@changesets/cli/bin.js", {
paths: [cwd], paths: [cwd],
+16 -17
View File
@@ -1,7 +1,7 @@
import * as core from "@actions/core"; import * as core from "@actions/core";
import { GitHub } from "../github.ts"; import { Git } from "../git.ts";
import { setupOctokit } from "../octokit.ts";
import { runVersion } from "../run.ts"; import { runVersion } from "../run.ts";
import { getOptionalInput, getRequiredInput } from "../utils.ts";
try { try {
await main(); await main();
@@ -10,40 +10,39 @@ try {
} }
async function main() { async function main() {
const githubToken = getRequiredInput("github-token"); const githubToken = core.getInput("github-token", { required: true });
const script = getOptionalInput("script"); const script = core.getInput("script");
const commitMessage = getRequiredInput("commit-message"); const commitMessage = core.getInput("commit-message", { required: true });
const prTitle = getRequiredInput("pr-title"); const prTitle = core.getInput("pr-title", { required: true });
const prDraft = getOptionalInput("pr-draft"); const prDraft = core.getInput("pr-draft") || undefined;
const prBaseBranch = getOptionalInput("pr-base-branch"); const prBaseBranch = core.getInput("pr-base-branch");
const commitMode = getOptionalInput("commit-mode") ?? "git-cli"; const commitMode = core.getInput("commit-mode") || "git-cli";
const setupGitUser = core.getBooleanInput("setup-git-user"); const setupGitUser = core.getBooleanInput("setup-git-user");
// Validations // Validations
if (prDraft !== undefined && prDraft !== "always" && prDraft !== "create") { if (prDraft !== undefined && prDraft !== "always" && prDraft !== "create") {
throw new Error(`Invalid pr-draft input: ${prDraft}`); throw new Error(`Invalid pr-draft input: ${prDraft}`);
} }
if (commitMode !== "git-cli" && commitMode !== "github-api") {
throw new Error(`Invalid commit-mode input: ${commitMode}`);
}
// If the user needs to change the cwd, set `working-directory` in the step instead // If the user needs to change the cwd, set `working-directory` in the step instead
const cwd = process.cwd(); const cwd = process.cwd();
const github = new GitHub({ const octokit = setupOctokit(githubToken);
const git = new Git({
octokit: commitMode === "github-api" ? octokit : undefined,
cwd, cwd,
githubToken,
commitMode,
}); });
if (setupGitUser) { if (setupGitUser) {
core.info("setting git user"); core.info("setting git user");
await github.setupUser(); await git.setupUser();
} }
const { pullRequestNumber } = await runVersion({ const { pullRequestNumber } = await runVersion({
script, script,
github, githubToken,
git,
octokit,
cwd, cwd,
prTitle, prTitle,
commitMessage, commitMessage,
+1 -1
View File
@@ -9,7 +9,7 @@ inputs:
required: false required: false
default: ${{ github.token }} default: ${{ github.token }}
script: script:
description: "The command to use to version packages" description: "The command to use to publish packages"
required: false required: false
commit-message: commit-message:
description: "The commit message. Default to `Version Packages`" description: "The commit message. Default to `Version Packages`"