mirror of
https://github.com/changesets/action
synced 2026-10-26 16:39:56 +08:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b83f36ae5 |
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"@changesets/action": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
Fix the computed publish plan path passed internally to `changeset pack` by the `/pack` subaction.
|
|
||||||
@@ -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.
|
|
||||||
@@ -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
@@ -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"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
---
|
|
||||||
"@changesets/action": patch
|
|
||||||
---
|
|
||||||
|
|
||||||
Fixed usage of `--from-publish-plan` flag used by the `/pack` subaction
|
|
||||||
@@ -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.
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
# ...
|
# ...
|
||||||
|
|||||||
+6
-6
File diff suppressed because one or more lines are too long
Vendored
-65
File diff suppressed because one or more lines are too long
Vendored
+48
File diff suppressed because one or more lines are too long
Vendored
+18
File diff suppressed because one or more lines are too long
Vendored
+2
-2
@@ -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{};
|
||||||
Vendored
+1
-1
@@ -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{};
|
||||||
Vendored
+1
-1
@@ -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{};
|
||||||
Vendored
+4
-4
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -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};
|
||||||
Vendored
+149
File diff suppressed because one or more lines are too long
Vendored
-149
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -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{};
|
||||||
Vendored
+80
File diff suppressed because one or more lines are too long
Vendored
-80
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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, {
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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 {
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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`"
|
||||||
|
|||||||
Reference in New Issue
Block a user