mirror of
https://github.com/changesets/action
synced 2026-10-26 16:39:56 +08:00
Compare commits
12
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c47fa68bd4 | ||
|
|
e3e2663c0e | ||
|
|
e43c867727 | ||
|
|
4b6e1f1099 | ||
|
|
cf45e93c21 | ||
|
|
73591071e6 | ||
|
|
f71ae043ed | ||
|
|
ca57073900 | ||
|
|
0eae789230 | ||
|
|
164652bdd6 | ||
|
|
a35a66bd1e | ||
|
|
823cf741ca |
@@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
"@changesets/action": major
|
||||||
|
---
|
||||||
|
|
||||||
|
Add a new `push-git-tags` option that complements `create-github-releases` to control specifically if git tags should be created but not GitHub releases.
|
||||||
|
|
||||||
|
If `create-github-releases` was previously set to `false`, which also indirectly disabled git tag creation, git tags will now be created instead by default. If this is not desired, set `push-git-tags` to `false` explicitly.
|
||||||
@@ -1,13 +1,14 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://unpkg.com/@changesets/config@1.6.2/schema.json",
|
"$schema": "https://unpkg.com/@changesets/config@4.0.0-next.6/schema.json",
|
||||||
"changelog": [
|
"changelog": "@changesets/changelog-github",
|
||||||
"@changesets/changelog-github",
|
|
||||||
{ "repo": "changesets/action" }
|
|
||||||
],
|
|
||||||
"commit": false,
|
"commit": false,
|
||||||
"linked": [],
|
"linked": [],
|
||||||
"access": "restricted",
|
"access": "restricted",
|
||||||
"baseBranch": "main",
|
"baseBranch": "main",
|
||||||
"updateInternalDependencies": "patch",
|
"updateInternalDependencies": "patch",
|
||||||
"ignore": []
|
"ignore": [],
|
||||||
|
"privatePackages": {
|
||||||
|
"version": true,
|
||||||
|
"tag": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
---
|
||||||
|
"@changesets/action": major
|
||||||
|
---
|
||||||
|
|
||||||
|
Rename the root action inputs and outputs to better match the sub-actions' conventions.
|
||||||
|
|
||||||
|
Inputs:
|
||||||
|
|
||||||
|
- `version` -> `version-script`
|
||||||
|
- `publish` -> `publish-script`
|
||||||
|
- `commit` -> `commit-message`
|
||||||
|
- `title` -> `pr-title`
|
||||||
|
- `branch` -> `pr-base-branch`
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
|
||||||
|
- `pull-request-number` -> `pr-number`
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@changesets/action": major
|
||||||
|
---
|
||||||
|
|
||||||
|
Remove support for passing custom GitHub token through the GITHUB_TOKEN environment variable. It should be passed to the `github-token` input instead.
|
||||||
+7
-4
@@ -1,17 +1,20 @@
|
|||||||
{
|
{
|
||||||
"mode": "pre",
|
"mode": "pre",
|
||||||
"tag": "next",
|
"tag": "next",
|
||||||
"initialVersions": {
|
|
||||||
"@changesets/action": "1.9.0"
|
|
||||||
},
|
|
||||||
"changesets": [
|
"changesets": [
|
||||||
"all-cars-grin",
|
"all-cars-grin",
|
||||||
|
"chubby-geese-sink",
|
||||||
"eight-clocks-pull",
|
"eight-clocks-pull",
|
||||||
"eighty-doors-swim",
|
"eighty-doors-swim",
|
||||||
|
"eighty-parks-tickle",
|
||||||
|
"fiery-toes-vanish",
|
||||||
"git-cli-auth-header",
|
"git-cli-auth-header",
|
||||||
"git-cli-server-url",
|
"git-cli-server-url",
|
||||||
"lemon-turtles-itch",
|
"lemon-turtles-itch",
|
||||||
"ready-mangos-boil",
|
"ready-mangos-boil",
|
||||||
"silent-tips-dance"
|
"shaky-rings-type",
|
||||||
|
"shy-months-crash",
|
||||||
|
"silent-tips-dance",
|
||||||
|
"yellow-roses-fix"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@changesets/action": major
|
||||||
|
---
|
||||||
|
|
||||||
|
Update to Changesets v3 packages
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@changesets/action": minor
|
||||||
|
---
|
||||||
|
|
||||||
|
Published packages detection done through stdout parsing was replaced with one based on the shared output file using `CHANGESETS_OUTPUT` environment variable. When using custom scripts this environment variable should always be passed down to the Changesets CLI invocations.
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
---
|
||||||
|
"@changesets/action": major
|
||||||
|
---
|
||||||
|
|
||||||
|
Rename the input and output names to kebab-case instead of camelCase to match the official GitHub actions pattern
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
/.github/workflows/** @Andarist @bluwy @emmatown
|
/.github/** @Andarist @bluwy @emmatown
|
||||||
/action.yml @Andarist @bluwy @emmatown
|
/action.yml @Andarist @bluwy @emmatown
|
||||||
/scripts/bump.ts @Andarist @bluwy @emmatown
|
/scripts/bump.ts @Andarist @bluwy @emmatown
|
||||||
/scripts/release.ts @Andarist @bluwy @emmatown
|
/scripts/release.ts @Andarist @bluwy @emmatown
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
name: Setup bot auth
|
||||||
|
description: Create a GitHub App token and configure matching git identity
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
client-id:
|
||||||
|
description: GitHub App client ID
|
||||||
|
required: true
|
||||||
|
private-key:
|
||||||
|
description: GitHub App private key
|
||||||
|
required: true
|
||||||
|
permission-contents:
|
||||||
|
description: Contents permission for the GitHub App token
|
||||||
|
required: false
|
||||||
|
default: write
|
||||||
|
permission-pull-requests:
|
||||||
|
description: Pull requests permission for the GitHub App token
|
||||||
|
required: false
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
token:
|
||||||
|
description: GitHub App installation access token
|
||||||
|
value: ${{ steps.app-token.outputs.token }}
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
steps:
|
||||||
|
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
|
||||||
|
id: app-token
|
||||||
|
with:
|
||||||
|
client-id: ${{ inputs.client-id }}
|
||||||
|
private-key: ${{ inputs.private-key }}
|
||||||
|
permission-contents: ${{ inputs.permission-contents }}
|
||||||
|
permission-pull-requests: ${{ inputs.permission-pull-requests }}
|
||||||
|
|
||||||
|
- name: Setup Git user
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
app_user="$APP_SLUG[bot]"
|
||||||
|
app_id="$(gh api "/users/$app_user" --jq .id)"
|
||||||
|
git config user.name "$app_user"
|
||||||
|
git config user.email "$app_id+$app_user@users.noreply.github.com"
|
||||||
|
env:
|
||||||
|
APP_SLUG: ${{ steps.app-token.outputs.app-slug }}
|
||||||
|
GH_TOKEN: ${{ steps.app-token.outputs.token }}
|
||||||
@@ -15,13 +15,12 @@ concurrency:
|
|||||||
permissions: {} # each job should define its own permission explicitly
|
permissions: {} # each job should define its own permission explicitly
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
version:
|
select-mode:
|
||||||
name: Version
|
name: Select mode
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: version
|
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
outputs:
|
outputs:
|
||||||
hasChangesets: ${{ steps.changesets.outputs.hasChangesets }}
|
mode: ${{ steps.select-mode.outputs.mode }}
|
||||||
permissions:
|
permissions:
|
||||||
contents: read # to check out repo (actions/checkout)
|
contents: read # to check out repo (actions/checkout)
|
||||||
steps:
|
steps:
|
||||||
@@ -37,38 +36,20 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm build
|
run: pnpm build
|
||||||
|
|
||||||
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
|
- name: Select mode
|
||||||
id: app-token
|
id: select-mode
|
||||||
with:
|
uses: ./select-mode
|
||||||
client-id: ${{ vars.APP_CLIENT_ID }}
|
|
||||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
|
||||||
permission-contents: write # to create version commits (changesets/action)
|
|
||||||
permission-pull-requests: write # to create pull request (changesets/action)
|
|
||||||
|
|
||||||
- name: Create or update release pull request
|
version:
|
||||||
id: changesets
|
name: Version
|
||||||
uses: ./
|
if: needs.select-mode.outputs.mode == 'version'
|
||||||
with:
|
needs: select-mode
|
||||||
github-token: ${{ steps.app-token.outputs.token }}
|
|
||||||
version: pnpm bump
|
|
||||||
|
|
||||||
publish:
|
|
||||||
name: Publish
|
|
||||||
if: needs.version.outputs.hasChangesets == 'false'
|
|
||||||
needs: version
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
environment: marketplace
|
environment: version
|
||||||
timeout-minutes: 20
|
timeout-minutes: 20
|
||||||
permissions:
|
permissions:
|
||||||
contents: write # to create release and have it authored by github-actions (changesets/action)
|
contents: read # to check out repo (actions/checkout)
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
|
|
||||||
id: app-token
|
|
||||||
with:
|
|
||||||
client-id: ${{ vars.APP_CLIENT_ID }}
|
|
||||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
|
||||||
permission-contents: write # to bypass branch and tag protection rules (release.ts)
|
|
||||||
|
|
||||||
- name: Check out repo
|
- name: Check out repo
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||||
with:
|
with:
|
||||||
@@ -81,8 +62,53 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm build
|
run: pnpm build
|
||||||
|
|
||||||
- name: Publish to marketplace
|
- uses: ./.github/actions/setup-bot-auth
|
||||||
uses: ./
|
id: bot-auth
|
||||||
with:
|
with:
|
||||||
github-token: ${{ steps.app-token.outputs.token }}
|
client-id: ${{ vars.APP_CLIENT_ID }}
|
||||||
publish: pnpm release
|
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||||
|
permission-contents: write # to create version commits (changesets/action)
|
||||||
|
permission-pull-requests: write # to create pull request (changesets/action)
|
||||||
|
|
||||||
|
- name: Create or update release pull request
|
||||||
|
id: changesets
|
||||||
|
uses: ./version
|
||||||
|
with:
|
||||||
|
github-token: ${{ steps.bot-auth.outputs.token }}
|
||||||
|
setup-git-user: false
|
||||||
|
script: pnpm bump
|
||||||
|
|
||||||
|
publish:
|
||||||
|
name: Publish
|
||||||
|
if: needs.select-mode.outputs.mode == 'publish'
|
||||||
|
needs: select-mode
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
environment: marketplace
|
||||||
|
timeout-minutes: 20
|
||||||
|
permissions:
|
||||||
|
contents: write # to create release and have it authored by github-actions (changesets/action)
|
||||||
|
steps:
|
||||||
|
- name: Check out repo
|
||||||
|
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||||
|
with:
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- uses: ./.github/actions/ci-setup
|
||||||
|
with:
|
||||||
|
skip-cache: true # avoid cache poisoning attacks
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm build
|
||||||
|
|
||||||
|
- uses: ./.github/actions/setup-bot-auth
|
||||||
|
id: bot-auth
|
||||||
|
with:
|
||||||
|
client-id: ${{ vars.APP_CLIENT_ID }}
|
||||||
|
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||||
|
permission-contents: write # to bypass branch and tag protection rules (release.ts)
|
||||||
|
|
||||||
|
- name: Publish to marketplace
|
||||||
|
uses: ./publish
|
||||||
|
with:
|
||||||
|
github-token: ${{ steps.bot-auth.outputs.token }}
|
||||||
|
script: pnpm release
|
||||||
|
|||||||
@@ -122,13 +122,6 @@ jobs:
|
|||||||
pull-requests: write # to comment on the pull request with the release result (changesets/action)
|
pull-requests: write # to comment on the pull request with the release result (changesets/action)
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0
|
|
||||||
id: app-token
|
|
||||||
with:
|
|
||||||
client-id: ${{ vars.APP_CLIENT_ID }}
|
|
||||||
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
|
||||||
permission-contents: write # to push the release snapshot branch (release-pr.ts)
|
|
||||||
|
|
||||||
- name: Check out repo
|
- name: Check out repo
|
||||||
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
|
||||||
with:
|
with:
|
||||||
@@ -173,15 +166,17 @@ jobs:
|
|||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm build
|
run: pnpm build
|
||||||
|
|
||||||
- name: Setup Git user
|
- uses: ./.github/actions/setup-bot-auth
|
||||||
run: |
|
id: bot-auth
|
||||||
git config --global user.name "github-actions[bot]"
|
with:
|
||||||
git config --global user.email "41898282+github-actions[bot]@users.noreply.github.com"
|
client-id: ${{ vars.APP_CLIENT_ID }}
|
||||||
|
private-key: ${{ secrets.APP_PRIVATE_KEY }}
|
||||||
|
permission-contents: write # to push the release snapshot branch (release-pr.ts)
|
||||||
|
|
||||||
- name: Release snapshot version
|
- name: Release snapshot version
|
||||||
run: pnpm release:pr
|
run: pnpm release:pr
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ steps.app-token.outputs.token }}
|
GITHUB_TOKEN: ${{ steps.bot-auth.outputs.token }}
|
||||||
|
|
||||||
- name: Add success reaction
|
- name: Add success reaction
|
||||||
run: gh api "/repos/$GH_REPO/issues/comments/$COMMENT_ID/reactions" -f content='rocket'
|
run: gh api "/repos/$GH_REPO/issues/comments/$COMMENT_ID/reactions" -f content='rocket'
|
||||||
|
|||||||
@@ -1,5 +1,35 @@
|
|||||||
# @changesets/action
|
# @changesets/action
|
||||||
|
|
||||||
|
## 2.0.0-next.3
|
||||||
|
|
||||||
|
### Major Changes
|
||||||
|
|
||||||
|
- [#680](https://github.com/changesets/action/pull/680) [`ca57073`](https://github.com/changesets/action/commit/ca57073900dc678254406a052a03c0c8824e319d) Thanks [@bluwy](https://github.com/bluwy)! - Add a new `push-git-tags` option that complements `create-github-releases` to control specifically if git tags should be created but not GitHub releases.
|
||||||
|
|
||||||
|
If `create-github-releases` was previously set to `false`, which also indirectly disabled git tag creation, git tags will now be created instead by default. If this is not desired, set `push-git-tags` to `false` explicitly.
|
||||||
|
|
||||||
|
- [#681](https://github.com/changesets/action/pull/681) [`7359107`](https://github.com/changesets/action/commit/73591071e61c7f61cf322dd7a6341dc29a8e1d4e) Thanks [@bluwy](https://github.com/bluwy)! - Rename the root action inputs and outputs to better match the sub-actions' conventions.
|
||||||
|
|
||||||
|
Inputs:
|
||||||
|
- `version` -> `version-script`
|
||||||
|
- `publish` -> `publish-script`
|
||||||
|
- `commit` -> `commit-message`
|
||||||
|
- `title` -> `pr-title`
|
||||||
|
- `branch` -> `pr-base-branch`
|
||||||
|
|
||||||
|
Outputs:
|
||||||
|
- `pull-request-number` -> `pr-number`
|
||||||
|
|
||||||
|
- [#674](https://github.com/changesets/action/pull/674) [`164652b`](https://github.com/changesets/action/commit/164652bdd60525670d95291addb8c6f92833ac60) Thanks [@bluwy](https://github.com/bluwy)! - Remove support for passing custom GitHub token through the GITHUB_TOKEN environment variable. It should be passed to the `github-token` input instead.
|
||||||
|
|
||||||
|
- [#673](https://github.com/changesets/action/pull/673) [`823cf74`](https://github.com/changesets/action/commit/823cf741ca57c5e22652123d3a847dfafcd77ca0) Thanks [@bluwy](https://github.com/bluwy)! - Update to Changesets v3 packages
|
||||||
|
|
||||||
|
- [#668](https://github.com/changesets/action/pull/668) [`0eae789`](https://github.com/changesets/action/commit/0eae789230defbc4ad287e9b476aba7e842e34e0) Thanks [@bluwy](https://github.com/bluwy)! - Rename the input and output names to kebab-case instead of camelCase to match the official GitHub actions pattern
|
||||||
|
|
||||||
|
### Minor Changes
|
||||||
|
|
||||||
|
- [#678](https://github.com/changesets/action/pull/678) [`f71ae04`](https://github.com/changesets/action/commit/f71ae043ed5deb17952900091e009a60edef9507) Thanks [@Andarist](https://github.com/Andarist)! - Published packages detection done through stdout parsing was replaced with one based on the shared output file using `CHANGESETS_OUTPUT` environment variable. When using custom scripts this environment variable should always be passed down to the Changesets CLI invocations.
|
||||||
|
|
||||||
## 2.0.0-next.2
|
## 2.0.0-next.2
|
||||||
|
|
||||||
### Patch Changes
|
### Patch Changes
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ jobs:
|
|||||||
uses: changesets/action@v2
|
uses: changesets/action@v2
|
||||||
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-script: pnpm release
|
||||||
env:
|
env:
|
||||||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||||
|
|
||||||
@@ -217,7 +217,7 @@ jobs:
|
|||||||
uses: changesets/action@v2
|
uses: changesets/action@v2
|
||||||
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-script: pnpm version
|
||||||
```
|
```
|
||||||
|
|
||||||
#### With Yarn 2 / Plug'n'Play
|
#### With Yarn 2 / Plug'n'Play
|
||||||
@@ -227,6 +227,6 @@ If you are using [Yarn Plug'n'Play](https://yarnpkg.com/features/pnp), you shoul
|
|||||||
```yaml
|
```yaml
|
||||||
- uses: changesets/action@v2
|
- uses: changesets/action@v2
|
||||||
with:
|
with:
|
||||||
version: yarn changeset version
|
version-script: yarn changeset version
|
||||||
# ...
|
# ...
|
||||||
```
|
```
|
||||||
|
|||||||
+27
-20
@@ -8,28 +8,37 @@ inputs:
|
|||||||
description: "The GitHub token to use for authentication. Defaults to the GitHub-provided token."
|
description: "The GitHub token to use for authentication. Defaults to the GitHub-provided token."
|
||||||
required: false
|
required: false
|
||||||
default: ${{ github.token }}
|
default: ${{ github.token }}
|
||||||
publish:
|
publish-script:
|
||||||
description: "The command to use to build and publish packages"
|
description: "The command to use to build and publish packages"
|
||||||
required: false
|
required: false
|
||||||
version:
|
version-script:
|
||||||
description: "The command to update version, edit CHANGELOG, read and delete changesets. Default to `changeset version` if not provided"
|
description: "The command to update version, edit CHANGELOG, read and delete changesets. Default to `changeset version` if not provided"
|
||||||
required: false
|
required: false
|
||||||
commit:
|
commit-message:
|
||||||
description: |
|
description: "The commit message. Default to `Version Packages`"
|
||||||
The commit message. Default to `Version Packages`
|
|
||||||
required: false
|
required: false
|
||||||
title:
|
default: "Version Packages"
|
||||||
description: The pull request title. Default to `Version Packages`
|
pr-title:
|
||||||
|
description: "The pull request title. Default to `Version Packages`"
|
||||||
required: false
|
required: false
|
||||||
setupGitUser:
|
default: "Version Packages"
|
||||||
description: Sets up the git user for commits as `"github-actions[bot]"`. Default to `true`
|
pr-draft:
|
||||||
|
description: "Controls draft PR behavior. Use 'create' to create new version PRs as draft, or 'always' to also convert existing version PRs back to draft when updating them."
|
||||||
|
required: false
|
||||||
|
pr-base-branch:
|
||||||
|
description: "Sets the base branch of the PR. Defaults to `github.ref_name`."
|
||||||
|
required: false
|
||||||
|
create-github-releases:
|
||||||
|
description: "Whether to create Github releases after publish"
|
||||||
required: false
|
required: false
|
||||||
default: true
|
default: true
|
||||||
createGithubReleases:
|
push-git-tags:
|
||||||
description: "A boolean value to indicate whether to create Github releases after `publish` or not"
|
description: >
|
||||||
|
Whether to create git tags after publish. If `create-github-releases` is set to `true`,
|
||||||
|
this option will also always be `true`.
|
||||||
required: false
|
required: false
|
||||||
default: true
|
default: true
|
||||||
commitMode:
|
commit-mode:
|
||||||
description: >
|
description: >
|
||||||
An enum to specify the commit mode. Use "git-cli" to push changes using the Git CLI,
|
An enum to specify the commit mode. Use "git-cli" to push changes using the Git CLI,
|
||||||
or "github-api" to push changes via the GitHub API. When using "github-api",
|
or "github-api" to push changes via the GitHub API. When using "github-api",
|
||||||
@@ -37,21 +46,19 @@ inputs:
|
|||||||
or app who owns the GITHUB_TOKEN.
|
or app who owns the GITHUB_TOKEN.
|
||||||
required: false
|
required: false
|
||||||
default: "git-cli"
|
default: "git-cli"
|
||||||
branch:
|
setup-git-user:
|
||||||
description: Sets the branch in which the action will run. Default to `github.ref_name` if not provided
|
description: Sets up the git user for commits as `"github-actions[bot]"`. Default to `true`
|
||||||
required: false
|
|
||||||
prDraft:
|
|
||||||
description: 'Controls draft PR behavior. Use "create" to create new version PRs as draft, or "always" to also convert existing version PRs back to draft when updating them.'
|
|
||||||
required: false
|
required: false
|
||||||
|
default: true
|
||||||
outputs:
|
outputs:
|
||||||
published:
|
published:
|
||||||
description: A boolean value to indicate whether a publishing is happened or not
|
description: A boolean value to indicate whether a publishing is happened or not
|
||||||
publishedPackages:
|
published-packages:
|
||||||
description: >
|
description: >
|
||||||
A JSON array to present the published packages. The format is `[{"name": "@xx/xx", "version": "1.2.0"}, {"name": "@xx/xy", "version": "0.8.9"}]`
|
A JSON array to present the published packages. The format is `[{"name": "@xx/xx", "version": "1.2.0"}, {"name": "@xx/xy", "version": "0.8.9"}]`
|
||||||
hasChangesets:
|
has-changesets:
|
||||||
description: A boolean about whether there were changesets. Useful if you want to create your own publishing functionality.
|
description: A boolean about whether there were changesets. Useful if you want to create your own publishing functionality.
|
||||||
pullRequestNumber:
|
pr-number:
|
||||||
description: The pull request number that was created or updated
|
description: The pull request number that was created or updated
|
||||||
branding:
|
branding:
|
||||||
icon: "package"
|
icon: "package"
|
||||||
|
|||||||
Vendored
-49
File diff suppressed because one or more lines are too long
Vendored
+12
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
+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{d as e,f as t,l as n,m as r,p as i,u as a}from"./manypkg-get-packages-BoFCbqAx.js";import{n as o,r as s,t as c}from"./run-Bw2IS-rI.js";import{c as l,f as u,r as d,s as f}from"./utils-DxGVktYo.js";import{t as p}from"./readChangesetState-wtnwjhXS.js";import m from"node:fs/promises";(async()=>{u({publish:`publish-script`,version:`version-script`,commit:`commit-mesage`,title:`pr-title`,branch:`pr-base-branch`,prDraft:`pr-draft`,createGithubReleases:`create-github-releases`,commitMode:`commit-mode`,setupGitUser:`setup-git-user`});let h=l(`github-token`);if(process.env.GITHUB_TOKEN&&process.env.GITHUB_TOKEN!==h)throw Error(`The GITHUB_TOKEN environment variable is set and does not match the "github-token" input. Please pass the custom GitHub token to the "github-token" input and remove the GITHUB_TOKEN environment variable to avoid conflicts.`);let g=process.cwd(),_=f(`commit-mode`)??`git-cli`,v=f(`pr-draft`);if(_!==`git-cli`&&_!==`github-api`){i(`Invalid commit mode: ${_}`);return}if(v!==void 0&&v!==`always`&&v!==`create`){i(`Invalid pr-draft: ${v}`);return}let y=new s({cwd:g,githubToken:h,commitMode:_});a(`setup-git-user`)&&(t(`setting git user`),await y.setupUser());let{changesets:b}=await p(g),x=e(`publish-script`),S=b.length!==0,C=b.some(e=>e.releases.length>0),w=!!x;switch(r(`published`,`false`),r(`published-packages`,`[]`),r(`has-changesets`,String(S)),!0){case!S&&!w:t(`No changesets present or were removed by merging release PR. Not publishing because no publish script found.`);return;case!S&&w:{if(t(`No changesets found. Attempting to publish any unpublished packages to npm`),process.env.NPM_TOKEN){let e=`${process.env.HOME}/.npmrc`;await d(e)?(t(`Found existing user .npmrc file`),(await m.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))?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 m.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 m.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=a(`create-github-releases`),i=a(`push-git-tags`);if(e&&!i)throw Error(`The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true or set 'create-github-releases' to false.`);let o=await c({script:x,github:y,createGithubReleases:e,pushGitTags:i,cwd:g});o.published&&(r(`published`,`true`),r(`published-packages`,JSON.stringify(o.publishedPackages))),o.exitCode!==0&&(n(`Publish command exited with code ${o.exitCode}${o.published?`, but some packages were published: ${o.publishedPackages.map(e=>`${e.name}@${e.version}`).join(`, `)}`:``}`),process.exit(o.exitCode));return}case S&&!C:t(`All changesets are empty; not creating PR`);return;case S:{let{pullRequestNumber:e}=await o({script:f(`version-script`),github:y,cwd:g,prTitle:f(`pr-title`),commitMessage:f(`commit-message`),hasPublishScript:w,prDraft:v,branch:f(`pr-base-branch`)});r(`pr-number`,String(e));return}}})().catch(e=>{n(e),i(e.message)});export{};
|
||||||
+143
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,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{m as e,p as t}from"./manypkg-get-packages-BoFCbqAx.js";import{n,p as r,s as i,t as a}from"./utils-DxGVktYo.js";import o from"node:fs/promises";import s from"node:path";import c from"node:os";try{await l()}catch(e){t(e.message)}async function l(){let t=i(`publish-plan-artifact-id`),n=process.cwd(),a=process.env.RUNNER_TEMP??await o.realpath(c.tmpdir()),l=s.join(a,`changeset-pack-${Date.now()}`);await u(n,{outDir:l,publishPlanPath:t?await d(a,Number(t)):void 0});let p=await r.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`);e(`pack-dir-artifact-id`,String(p.id))}async function u(e,t){let r=[`pack`,`--out-dir`,t.outDir];t.publishPlanPath&&r.push(`--from-publish-plan`,t.publishPlanPath),await n(r,{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{};
|
||||||
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{a as e,f as t,i as n,m as r,p as i}from"./manypkg-get-packages-BoFCbqAx.js";import{c as a,s as o}from"./utils-DxGVktYo.js";try{await s()}catch(e){i(e.message)}async function s(){let i=n.payload.pull_request;if(!i)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:i.base.repo.name,owner:i.base.repo.owner.login,issue_number:i.number,body:f},m=e(s),h;d&&(t(`Checking for existing comment...`),h=await m.rest.issues.listComments({repo:i.base.repo.name,owner:i.base.repo.owner.login,issue_number:i.number}).then(e=>e.data.find(e=>e.body?.includes(d))?.id)),h?(t(`Updating existing comment (id: ${h})...`),await m.rest.issues.updateComment({...p,comment_id:h}),r(`comment-id`,h)):(t(`Creating new comment...`),r(`comment-id`,(await m.rest.issues.createComment(p)).data.id)),t(`Done!`)}function c(e){let t=`changesets-action-pr-comment`;return t===e?`<!-- ${t} -->`:`<!-- ${t}:${e} -->`}export{};
|
||||||
Vendored
+9
-10
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{m as e,p as t,u as n}from"./manypkg-get-packages-BoFCbqAx.js";import{r,t as i}from"./run-Bw2IS-rI.js";import{c as a,s as o,t as s}from"./utils-DxGVktYo.js";import c from"node:fs/promises";import l from"node:os";try{await u()}catch(e){t(e.message)}async function u(){let t=a(`github-token`),u=o(`script`),d=o(`pack-dir-artifact-id`),f=n(`create-github-releases`),p=n(`push-git-tags`);if(f&&!p)throw Error(`The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true or set 'create-github-releases' to false.`);let m=process.cwd(),h=await i({script:u,github:new r({cwd:m,githubToken:t,commitMode:`github-api`}),createGithubReleases:f,pushGitTags:p,cwd:m,fromPackDir:d?await s(process.env.RUNNER_TEMP??await c.realpath(l.tmpdir()),Number(d),`changeset-pack`):void 0});if(h.published?(e(`published`,`true`),e(`published-packages`,JSON.stringify(h.publishedPackages))):e(`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{};
|
||||||
Vendored
-1
@@ -1 +0,0 @@
|
|||||||
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};
|
|
||||||
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
import{i as e,t}from"./dist-IQHIouET.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
+98
@@ -0,0 +1,98 @@
|
|||||||
|
import{T as e,_ as t,a as n,f as r,g as i,i as a,t as o,v as s}from"./manypkg-get-packages-BoFCbqAx.js";import{o as c}from"./dist-IQHIouET.js";import{a as l,d as u,i as d,l as f,m as p,n as m,o as h,u as g}from"./utils-DxGVktYo.js";import{t as ee}from"./readChangesetState-wtnwjhXS.js";import _ from"node:fs/promises";import v from"path";import{Buffer as y}from"node:buffer";import{randomUUID as b}from"node:crypto";import x from"node:path";import S from"node:os";const C=async(e,t)=>(await e.graphql(`
|
||||||
|
query getRepositoryMetadata(
|
||||||
|
$owner: String!
|
||||||
|
$repo: String!
|
||||||
|
$baseRef: String!
|
||||||
|
$targetRef: String!
|
||||||
|
) {
|
||||||
|
repository(owner: $owner, name: $repo) {
|
||||||
|
id
|
||||||
|
baseRef: ref(qualifiedName: $baseRef) {
|
||||||
|
id
|
||||||
|
target {
|
||||||
|
oid
|
||||||
|
... on Tag {
|
||||||
|
target {
|
||||||
|
oid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
targetBranch: ref(qualifiedName: $targetRef) {
|
||||||
|
id
|
||||||
|
target {
|
||||||
|
oid
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,t)).repository,w=async(e,t)=>e.graphql(`
|
||||||
|
mutation createCommitOnBranch($input: CreateCommitOnBranchInput!) {
|
||||||
|
createCommitOnBranch(input: $input) {
|
||||||
|
commit {
|
||||||
|
oid
|
||||||
|
}
|
||||||
|
ref {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`,t);function T(e){if(typeof e==`object`)return{headline:e.headline.trim(),body:e.body?.trim()};if(!e.includes(`
|
||||||
|
`))return{headline:e.trim()};let[t,...n]=e.split(`
|
||||||
|
`);return{headline:t.trim(),body:n.join(`
|
||||||
|
`).trim()}}function E(e){return`branch`in e?`refs/heads/${e.branch}`:`tag`in e?`refs/tags/${e.tag}`:e.commit}async function D({octokit:e,owner:t,repo:n,branch:r,base:i,force:a=!1,message:o,fileChanges:s}){let c=E(i),l=await C(e,{owner:t,repo:n,baseRef:c,targetRef:`refs/heads/${r}`});if(!l)throw Error(`Repository "${t}/${n}" not found`);let u=`commit`in i?i.commit:O(l.baseRef);if(!u)throw Error(`Could not determine sha for base ref "${c}"`);let d=l.targetBranch?.target?.oid??null,f=async(t,n)=>{let r=await w(e,{input:{branch:{id:t},expectedHeadOid:u,message:T(o),fileChanges:s}});if(r.createCommitOnBranch?.ref?.id==null)throw Error(`Failed to create commit on branch "${n}"`);if(r.createCommitOnBranch?.commit?.oid==null)throw Error(`Failed to determine commit sha for commit on branch "${n}"`);return{commitSha:r.createCommitOnBranch.commit.oid}};if(d==null){let i=(await e.rest.git.createRef({owner:t,repo:n,ref:`refs/heads/${r}`,sha:u})).data.node_id;if(!i)throw Error(`Failed to create branch "${r}"`);return await f(i,r),{refId:i}}else if(d===u){let e=l.targetBranch.id;return await f(e,r),{refId:e}}else if(a){let i=`changesets-ghcommit-temp/${r}`;try{let{tempRefId:a}=await k({octokit:e,owner:t,repo:n,tempBranch:i,baseSha:u}),{commitSha:o}=await f(a,i),s=(await e.rest.git.updateRef({owner:t,repo:n,ref:`heads/${r}`,sha:o,force:!0})).data.node_id;if(!s)throw Error(`Failed to force update branch "${r}"`);return{refId:s}}finally{await e.rest.git.deleteRef({owner:t,repo:n,ref:`heads/${i}`})}}else throw Error(`Branch "${r}" exists but its HEAD does not match the base ${u} and \`force\` is set to false`)}function O(e){return e?.target?`target`in e.target?e.target.target.oid:e.target.oid:null}async function k({octokit:e,owner:t,repo:n,tempBranch:r,baseSha:i}){try{let a=(await e.rest.git.createRef({owner:t,repo:n,ref:`refs/heads/${r}`,sha:i})).data.node_id;if(!a)throw Error(`Failed to create temporary branch "${r}"`);return{tempRefId:a}}catch(a){if(!A(a))throw a;let o=(await e.rest.git.updateRef({owner:t,repo:n,ref:`heads/${r}`,sha:i,force:!0})).data.node_id;if(!o)throw Error(`Failed to force update temporary branch "${r}"`);return{tempRefId:o}}}function A(e){return typeof e==`object`&&!!e&&`status`in e&&`message`in e&&typeof e.status==`number`&&typeof e.message==`string`&&e.status===422&&e.message.includes(`Reference already exists`)}async function j({cwd:e,filterFiles:t,...n}){e=v.resolve(e??process.cwd());let r=E(n.base??{commit:`HEAD`}),i=await N(e,r);if(!i)throw Error(`Could not determine sha for ref ${r}`);return await D({...n,fileChanges:await M(e,i,t),base:{commit:i}})}async function M(e,t,n){let r=await P(e),i=[],a=[],o=async e=>{if(n&&!n(e))return;let t=v.join(r,e),a=await _.lstat(t);if(a.isSymbolicLink())throw Error(`Unexpected symlink at ${e}, GitHub API only supports files and directories. You may need to add this file to .gitignore`);if(a.mode&73)throw Error(`Unexpected executable file at ${e}, GitHub API only supports non-executable files and directories. You may need to add this file to .gitignore`);i.push({path:e,contents:await _.readFile(t,`base64`)})},s=e=>{n&&!n(e)||a.push({path:e})},[l,u]=await Promise.all([c(`git`,[`diff`,`--name-status`,`--diff-filter=ACDMRT`,t],{throwOnError:!0,nodeOptions:{cwd:r}}),c(`git`,[`ls-files`,`--others`,`--exclude-standard`],{throwOnError:!0,nodeOptions:{cwd:r}})]);for(let e of l.stdout.trim().split(`
|
||||||
|
`)){if(!e)continue;let[t,...n]=e.split(` `);if(t.startsWith(`R`)||t.startsWith(`C`)){let[e,t]=n;s(e),await o(t);continue}let r=n[0];t===`D`?s(r):await o(r)}for(let e of u.stdout.trim().split(`
|
||||||
|
`))e&&await o(e);return i.sort((e,t)=>e.path>t.path?1:-1),a.sort((e,t)=>e.path>t.path?1:-1),{additions:i,deletions:a}}async function N(e,t){try{let{stdout:n}=await c(`git`,[`rev-parse`,t],{throwOnError:!0,nodeOptions:{cwd:e}});return n.trim()}catch{return null}}async function P(e){try{let{stdout:t}=await c(`git`,[`rev-parse`,`--git-dir`],{throwOnError:!0,nodeOptions:{cwd:e}});return v.dirname(v.resolve(e,t.trim()))}catch{return e}}var F=e(p(),1),I=`0.0.0-development`,L=()=>Promise.resolve();function R(e,t,n){return e.retryLimiter.schedule(z,e,t,n)}async function z(e,t,n){let{pathname:r}=new URL(n.url,`http://github.test`),i=B(n.method,r),a=!i&&n.method!==`GET`&&n.method!==`HEAD`,o=n.method===`GET`&&r.startsWith(`/search/`),s=r.startsWith(`/graphql`),c=~~t.retryCount>0?{priority:0,weight:0}:{};e.clustering&&(c.expiration=1e3*60),(a||s)&&await e.write.key(e.id).schedule(c,L),a&&e.triggersNotification(r)&&await e.notifications.key(e.id).schedule(c,L),o&&await e.search.key(e.id).schedule(c,L);let l=(i?e.auth:e.global).key(e.id).schedule(c,t,n);if(s){let e=await l;if(e.data.errors!=null&&e.data.errors.some(e=>e.type===`RATE_LIMITED`))throw Object.assign(Error(`GraphQL Rate Limit Exceeded`),{response:e,data:e.data})}return l}function B(e,t){return e===`PATCH`&&/^\/applications\/[^/]+\/token\/scoped$/.test(t)||e===`POST`&&(/^\/applications\/[^/]+\/token$/.test(t)||/^\/app\/installations\/[^/]+\/access_tokens$/.test(t)||t===`/login/oauth/access_token`)}var V=[`/orgs/{org}/invitations`,`/orgs/{org}/invitations/{invitation_id}`,`/orgs/{org}/teams/{team_slug}/discussions`,`/orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments`,`/repos/{owner}/{repo}/collaborators/{username}`,`/repos/{owner}/{repo}/commits/{commit_sha}/comments`,`/repos/{owner}/{repo}/issues`,`/repos/{owner}/{repo}/issues/{issue_number}/comments`,`/repos/{owner}/{repo}/issues/{issue_number}/sub_issue`,`/repos/{owner}/{repo}/issues/{issue_number}/sub_issues/priority`,`/repos/{owner}/{repo}/pulls`,`/repos/{owner}/{repo}/pulls/{pull_number}/comments`,`/repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies`,`/repos/{owner}/{repo}/pulls/{pull_number}/merge`,`/repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers`,`/repos/{owner}/{repo}/pulls/{pull_number}/reviews`,`/repos/{owner}/{repo}/releases`,`/teams/{team_id}/discussions`,`/teams/{team_id}/discussions/{discussion_number}/comments`];function H(e){let t=`^(?:${e.map(e=>e.split(`/`).map(e=>e.startsWith(`{`)?`(?:.+?)`:e).join(`/`)).map(e=>`(?:${e})`).join(`|`)})[^/]*$`;return new RegExp(t,`i`)}var U=H(V),W=U.test.bind(U),G={},K=function(e,t){G.global=new e.Group({id:`octokit-global`,maxConcurrent:10,...t}),G.auth=new e.Group({id:`octokit-auth`,maxConcurrent:1,...t}),G.search=new e.Group({id:`octokit-search`,maxConcurrent:1,minTime:2e3,...t}),G.write=new e.Group({id:`octokit-write`,maxConcurrent:1,minTime:1e3,...t}),G.notifications=new e.Group({id:`octokit-notifications`,maxConcurrent:1,minTime:3e3,...t})};function q(e,t){let{enabled:n=!0,Bottleneck:r=F.default,id:i=`no-id`,timeout:a=1e3*60*2,connection:o}=t.throttle||{};if(!n)return{};let s={timeout:a};o!==void 0&&(s.connection=o),G.global??K(r,s);let c=Object.assign({clustering:o!=null,triggersNotification:W,fallbackSecondaryRateRetryAfter:60,retryAfterBaseValue:1e3,retryLimiter:new r,id:i,...G},t.throttle);if(typeof c.onSecondaryRateLimit!=`function`||typeof c.onRateLimit!=`function`)throw Error(`octokit/plugin-throttling error:
|
||||||
|
You must pass the onSecondaryRateLimit and onRateLimit error handlers.
|
||||||
|
See https://octokit.github.io/rest.js/#throttling
|
||||||
|
|
||||||
|
const octokit = new Octokit({
|
||||||
|
throttle: {
|
||||||
|
onSecondaryRateLimit: (retryAfter, options) => {/* ... */},
|
||||||
|
onRateLimit: (retryAfter, options) => {/* ... */}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
`);let l={},u=new r.Events(l);return l.on(`secondary-limit`,c.onSecondaryRateLimit),l.on(`rate-limit`,c.onRateLimit),l.on(`error`,t=>e.log.warn(`Error in throttling-plugin limit handler`,t)),c.retryLimiter.on(`failed`,async function(t,n){let[r,i,a]=n.args,{pathname:o}=new URL(a.url,`http://github.test`);if(!(o.startsWith(`/graphql`)&&t.status!==401||t.status===403||t.status===429))return;let s=~~i.retryCount;i.retryCount=s,a.request.retryCount=s;let{wantRetry:c,retryAfter:l=0}=await(async function(){if(/\bsecondary rate\b/i.test(t.message)){let n=Number(t.response.headers[`retry-after`])||r.fallbackSecondaryRateRetryAfter;return{wantRetry:await u.trigger(`secondary-limit`,n,a,e,s),retryAfter:n}}if(t.response.headers!=null&&t.response.headers[`x-ratelimit-remaining`]===`0`||(t.response.data?.errors??[]).some(e=>e.type===`RATE_LIMITED`)){let n=new Date(~~t.response.headers[`x-ratelimit-reset`]*1e3).getTime(),r=Math.max(Math.ceil((n-Date.now())/1e3)+1,0);return{wantRetry:await u.trigger(`rate-limit`,r,a,e,s),retryAfter:r}}return{}})();if(c)return i.retryCount++,l*r.retryAfterBaseValue}),e.hook.wrap(`request`,R.bind(null,c)),{}}q.VERSION=I,q.triggersNotification=W;const J=e=>n(e,{throttle:{onRateLimit:(e,t,n,a)=>{if(i(`Request quota exhausted for request ${t.method} ${t.url}`),a<=2)return r(`Retrying after ${e} seconds!`),!0},onSecondaryRateLimit:(e,t,n,a)=>{if(i(`SecondaryRateLimit detected for request ${t.method} ${t.url}`),a<=2)return r(`Retrying after ${e} seconds!`),!0}}},q),Y=async(e,n)=>{await t(`git`,[`push`,`origin`,`HEAD:${e}`,`--force`],n)},X=async(e,n)=>{let{stderr:r}=await s(`git`,[`checkout`,e],{ignoreReturnCode:!0,...n});r.toString().includes(`Switched to a new branch '${e}'`)||await t(`git`,[`checkout`,`-b`,e],n)},Z=async(e,n)=>{await t(`git`,[`reset`,`--hard`,e],n)},Q=async(e,n)=>{await t(`git`,[`add`,`.`],n),await t(`git`,[`commit`,`-m`,e],n)},te=async e=>{let{stdout:t}=await s(`git`,[`status`,`--porcelain`],e);return!t.length};var ne=class{#e;octokit;cwd;commitMode;constructor(e){this.#e=e.githubToken,this.cwd=e.cwd,this.commitMode=e.commitMode??`git-cli`,this.octokit=J(e.githubToken)}getToken(){return this.#e}#t(){let e=y.from(`x-access-token:${this.#e}`).toString(`base64`),t=(a.serverUrl??process.env.GITHUB_SERVER_URL??`https://github.com`).replace(/\/+$/,``),n=Number(process.env.GIT_CONFIG_COUNT??0);if(!Number.isInteger(n)||n<0)throw Error(`Invalid GIT_CONFIG_COUNT value: ${process.env.GIT_CONFIG_COUNT}`);return{GIT_CONFIG_COUNT:String(n+1),[`GIT_CONFIG_KEY_${n}`]:`http.${t}/.extraheader`,[`GIT_CONFIG_VALUE_${n}`]:`AUTHORIZATION: basic ${e}`}}async setupUser(){this.commitMode!==`github-api`&&(await t(`git`,[`config`,`user.name`,`"github-actions[bot]"`],{cwd:this.cwd}),await t(`git`,[`config`,`user.email`,`"41898282+github-actions[bot]@users.noreply.github.com"`],{cwd:this.cwd}))}async pushTag(e){if(this.commitMode===`github-api`)return this.octokit.rest.git.createRef({...a.repo,ref:`refs/tags/${e}`,sha:a.sha}).catch(t=>{i(`Failed to create tag ${e}: ${t.message}`)});await t(`git`,[`push`,`origin`,e],{cwd:this.cwd,env:{...process.env,...this.#t()}})}async prepareBranch(e){this.commitMode!==`github-api`&&(await X(e,{cwd:this.cwd}),await Z(a.sha,{cwd:this.cwd}))}async pushChanges({branch:e,message:t}){if(this.commitMode===`github-api`){await j({octokit:this.octokit,...a.repo,branch:e,message:t,base:{commit:a.sha},cwd:this.cwd});return}await te({cwd:this.cwd})||await Q(t,{cwd:this.cwd}),await Y(e,{cwd:this.cwd,env:{...process.env,...this.#t()}})}};const re=async(e,{pkg:t,tagName:n})=>{let r;try{r=await _.readFile(x.join(t.dir,`CHANGELOG.md`),`utf8`)}catch(e){if(g(e,`ENOENT`))return;throw e}let i=l(r,t.packageJson.version);if(!i)throw Error(`Could not find changelog entry for ${t.packageJson.name}@${t.packageJson.version}`);await e.rest.repos.createRelease({name:n,tag_name:n,body:i.content,prerelease:t.packageJson.version.includes(`-`),...a.repo})};function $(e){return typeof e==`object`&&!!e}function ie(e){return $(e)&&`type`in e&&e.type===`git-tag`&&`tag`in e&&typeof e.tag==`string`&&`packageName`in e&&typeof e.packageName==`string`}async function ae(e){let t;try{t=await _.readFile(e,`utf8`)}catch(t){throw Error(`Failed to read changesets output at ${e}`,{cause:t})}let n=[],r=0;for(;r<=t.length;){let e=t.indexOf(`
|
||||||
|
`,r);e===-1&&(e=t.length);let i=t.slice(r,e);if(r=e+1,/^\s*$/.test(i))continue;let a;try{a=JSON.parse(i)}catch(e){throw Error(`Failed to parse changesets output event: ${i}`,{cause:e})}ie(a)&&n.push(a)}return n}async function oe({script:e,fromPackDir:t,github:n,createGithubReleases:r,pushGitTags:i,cwd:a}){let{octokit:c}=n,l,u=x.join(process.env.RUNNER_TEMP??await _.realpath(S.tmpdir()),`changesets-output-${b()}.ndjson`),d={cwd:a,ignoreReturnCode:!0,env:{...process.env,GITHUB_TOKEN:n.getToken(),CHANGESETS_OUTPUT:u}};if(e)l=await s(e,void 0,d);else{let e=[`publish`];t&&e.push(`--from-pack-dir`,t),l=await h(e,d)}let{packages:f,tool:p}=await o(a),m=new Map(f.map(e=>[e.packageJson.name,e])),g=(await ae(u)).map(e=>{let t=m.get(e.packageName);if(t===void 0)throw Error(`Package "${e.packageName}" not found.This is probably a bug in the action, please open an issue`);return{pkg:t,tag:e.tag}});if(p.type===`root`&&f.length===0)throw Error(`No package found.This is probably a bug in the action, please open an issue`);return(r||i)&&await Promise.all(g.map(async({pkg:e,tag:t})=>{i&&await n.pushTag(t),r&&await re(c,{pkg:e,tagName:t})})),g.length?{published:!0,publishedPackages:g.map(({pkg:e})=>({name:e.packageJson.name,version:e.packageJson.version})),exitCode:l.exitCode}:{published:!1,exitCode:l.exitCode}}async function se({hasPublishScript:e,preState:t,changedPackagesInfo:n,prBodyMaxCharacters:r,branch:i}){let a=`This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and ${e?`the packages will be published to npm automatically`:`publish to npm yourself or [setup this action to publish automatically](https://github.com/changesets/action#with-publishing)`}. If you're not ready to do a release yet, that's fine, whenever you add more changesets to ${i}, this PR will be updated.
|
||||||
|
`,o=t?`⚠️⚠️⚠️⚠️⚠️⚠️
|
||||||
|
|
||||||
|
\`${i}\` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run \`changeset pre exit\` on \`${i}\`.
|
||||||
|
|
||||||
|
⚠️⚠️⚠️⚠️⚠️⚠️
|
||||||
|
`:``,s=`# Releases`,c=[a,o,s,...n.map(e=>`${e.header}\n\n${e.content}`)].join(`
|
||||||
|
`);return c.length>r&&(c=[a,o,s,`
|
||||||
|
> The changelog information of each package has been omitted from this message, as the content exceeds the size limit.
|
||||||
|
`,...n.map(e=>`${e.header}\n\n`)].join(`
|
||||||
|
`)),c.length>r&&(c=[a,o,s,`
|
||||||
|
> All release information have been omitted from this message, as the content exceeds the size limit.`].join(`
|
||||||
|
`)),c}async function ce({script:e,github:n,cwd:i=process.cwd(),prTitle:o=`Version Packages`,commitMessage:s=`Version Packages`,hasPublishScript:c=!1,prBodyMaxCharacters:p=6e4,branch:h=a.ref.replace(`refs/heads/`,``),prDraft:g}){let{octokit:v}=n,y=`changeset-release/${h}`,{preState:b}=await ee(i);await n.prepareBranch(y);let S=await f(i),C={...process.env,GITHUB_TOKEN:n.getToken()};e?await t(e,void 0,{cwd:i,env:C}):await m([`version`],{cwd:i,env:C});let w=await d(i,S),T=Promise.all(w.map(async e=>{let t=l(await _.readFile(x.join(e.dir,`CHANGELOG.md`),`utf8`),e.packageJson.version);return{highestLevel:t.highestLevel,private:!!e.packageJson.private,content:t.content,header:`## ${e.packageJson.name}@${e.packageJson.version}`}})),E=`${o}${b?` (${b.tag})`:``}`,D=`${s}${b?` (${b.tag})`:``}`,O=await v.rest.pulls.list({...a.repo,state:`open`,head:`${a.repo.owner}:${y}`,base:h});r(`Existing pull requests: ${JSON.stringify(O.data,null,2)}`),await n.pushChanges({branch:y,message:D});let k=await se({hasPublishScript:c,preState:b,branch:h,changedPackagesInfo:(await T).filter(e=>e).sort(u),prBodyMaxCharacters:p});if(O.data.length===0){r(`creating pull request`);let{data:e}=await v.rest.pulls.create({base:h,head:y,title:E,body:k,draft:g!==void 0,...a.repo});return{pullRequestNumber:e.number}}else{let[e]=O.data;r(`updating found pull request #${e.number}`);let t=`
|
||||||
|
mutation UpdatePullRequest(
|
||||||
|
$pullRequestId: ID!
|
||||||
|
$title: String!
|
||||||
|
$body: String!
|
||||||
|
) {
|
||||||
|
${g===`always`?`
|
||||||
|
convertPullRequestToDraft(
|
||||||
|
input: {
|
||||||
|
pullRequestId: $pullRequestId
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
pullRequest {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}`:``}
|
||||||
|
|
||||||
|
updatePullRequest(
|
||||||
|
input: {
|
||||||
|
pullRequestId: $pullRequestId
|
||||||
|
title: $title
|
||||||
|
body: $body
|
||||||
|
state: OPEN
|
||||||
|
}
|
||||||
|
) {
|
||||||
|
pullRequest {
|
||||||
|
id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`;return await v.graphql(t,{pullRequestId:e.node_id,title:E,body:k}),{pullRequestNumber:e.number}}}export{ce as n,ne as r,oe as t};
|
||||||
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{m as e,p as t}from"./manypkg-get-packages-BoFCbqAx.js";import{n,p as r}from"./utils-DxGVktYo.js";import{t as i}from"./readChangesetState-wtnwjhXS.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()}`,`publish-plan.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
+82
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{f as e,m as t,p as n,u as r}from"./manypkg-get-packages-BoFCbqAx.js";import{n as i,r as a}from"./run-Bw2IS-rI.js";import{c as o,s}from"./utils-DxGVktYo.js";try{await c()}catch(e){n(e.message)}async function c(){let n=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=r(`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:n,commitMode:p});m&&(e(`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});t(`pr-number`,String(_))}export{};
|
||||||
+12
-11
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "@changesets/action",
|
"name": "@changesets/action",
|
||||||
"version": "2.0.0-next.2",
|
"version": "2.0.0-next.3",
|
||||||
|
"private": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
@@ -21,12 +22,12 @@
|
|||||||
"@actions/core": "^3.0.1",
|
"@actions/core": "^3.0.1",
|
||||||
"@actions/exec": "^3.0.0",
|
"@actions/exec": "^3.0.0",
|
||||||
"@actions/github": "^9.1.1",
|
"@actions/github": "^9.1.1",
|
||||||
"@changesets/get-release-plan": "^4.0.16",
|
"@changesets/get-release-plan": "^5.0.0-next.7",
|
||||||
"@changesets/ghcommit": "^2.1.1",
|
"@changesets/ghcommit": "^3.0.0-next.1",
|
||||||
"@changesets/git": "^3.0.4",
|
"@changesets/git": "^4.0.0-next.6",
|
||||||
"@changesets/pre": "^2.0.2",
|
"@changesets/pre": "^3.0.0-next.6",
|
||||||
"@changesets/read": "^0.6.7",
|
"@changesets/read": "^1.0.0-next.7",
|
||||||
"@manypkg/get-packages": "^1.1.3",
|
"@manypkg/get-packages": "^3.1.0",
|
||||||
"@octokit/core": "^7.0.6",
|
"@octokit/core": "^7.0.6",
|
||||||
"@octokit/plugin-throttling": "^11.0.3",
|
"@octokit/plugin-throttling": "^11.0.3",
|
||||||
"human-id": "^4.1.3",
|
"human-id": "^4.1.3",
|
||||||
@@ -35,10 +36,10 @@
|
|||||||
"tinyexec": "^1.2.4"
|
"tinyexec": "^1.2.4"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@changesets/changelog-github": "^0.7.0",
|
"@changesets/changelog-github": "^1.0.0-next.6",
|
||||||
"@changesets/cli": "^2.31.0",
|
"@changesets/cli": "^3.0.0-next.8",
|
||||||
"@changesets/types": "^6.1.0",
|
"@changesets/types": "^7.0.0-next.6",
|
||||||
"@changesets/write": "^0.4.0",
|
"@changesets/write": "^1.0.0-next.6",
|
||||||
"@tsconfig/node24": "^24.0.4",
|
"@tsconfig/node24": "^24.0.4",
|
||||||
"@types/node": "^24.12.4",
|
"@types/node": "^24.12.4",
|
||||||
"@types/semver": "^7.7.1",
|
"@types/semver": "^7.7.1",
|
||||||
|
|||||||
Generated
+275
-1046
File diff suppressed because it is too large
Load Diff
+17
-1
@@ -3,7 +3,23 @@ dedupePeers: true
|
|||||||
dedupePeerDependents: true
|
dedupePeerDependents: true
|
||||||
minimumReleaseAge: 10080
|
minimumReleaseAge: 10080
|
||||||
minimumReleaseAgeExclude:
|
minimumReleaseAgeExclude:
|
||||||
- "@changesets/ghcommit@2.1.1"
|
- "@changesets/apply-release-plan@8.0.0-next.7"
|
||||||
|
- "@changesets/assemble-release-plan@7.0.0-next.7"
|
||||||
|
- "@changesets/changelog-git@1.0.0-next.6"
|
||||||
|
- "@changesets/changelog-github@1.0.0-next.6"
|
||||||
|
- "@changesets/cli@3.0.0-next.8"
|
||||||
|
- "@changesets/config@4.0.0-next.6"
|
||||||
|
- "@changesets/get-dependents-graph@3.0.0-next.6"
|
||||||
|
- "@changesets/get-github-info@1.0.0-next.3"
|
||||||
|
- "@changesets/get-release-plan@5.0.0-next.7"
|
||||||
|
- "@changesets/ghcommit@3.0.0-next.1"
|
||||||
|
- "@changesets/git@4.0.0-next.6"
|
||||||
|
- "@changesets/parse@1.0.0-next.7"
|
||||||
|
- "@changesets/pre@3.0.0-next.6"
|
||||||
|
- "@changesets/read@1.0.0-next.7"
|
||||||
|
- "@changesets/should-skip-package@1.0.0-next.6"
|
||||||
|
- "@changesets/types@7.0.0-next.6"
|
||||||
|
- "@changesets/write@1.0.0-next.6"
|
||||||
|
|
||||||
overrides:
|
overrides:
|
||||||
lightningcss: "-" # we do not bundle any css
|
lightningcss: "-" # we do not bundle any css
|
||||||
|
|||||||
@@ -18,6 +18,12 @@ inputs:
|
|||||||
description: "Whether to create Github releases after publish"
|
description: "Whether to create Github releases after publish"
|
||||||
required: false
|
required: false
|
||||||
default: true
|
default: true
|
||||||
|
push-git-tags:
|
||||||
|
description: >
|
||||||
|
Whether to create git tags after publish. If `create-github-releases` is set to `true`,
|
||||||
|
this option will also always be `true`.
|
||||||
|
required: false
|
||||||
|
default: true
|
||||||
outputs:
|
outputs:
|
||||||
published:
|
published:
|
||||||
description: "A boolean value to indicate whether a publishing has happened or not"
|
description: "A boolean value to indicate whether a publishing has happened or not"
|
||||||
|
|||||||
+3
-1
@@ -1,12 +1,14 @@
|
|||||||
import fs from "node:fs";
|
import fs from "node:fs";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import { exec } from "@actions/exec";
|
import { exec } from "@actions/exec";
|
||||||
import pkgJson from "../package.json" with { type: "json" };
|
|
||||||
|
|
||||||
process.chdir(path.join(import.meta.dirname, ".."));
|
process.chdir(path.join(import.meta.dirname, ".."));
|
||||||
|
|
||||||
await exec("changeset", ["version"]);
|
await exec("changeset", ["version"]);
|
||||||
|
|
||||||
|
// read after versioning to get the new version
|
||||||
|
const pkgJson = (await import("../package.json", { with: { type: "json" } }))
|
||||||
|
.default;
|
||||||
const releaseLine = `v${pkgJson.version.split(".")[0]}`;
|
const releaseLine = `v${pkgJson.version.split(".")[0]}`;
|
||||||
|
|
||||||
const readmePath = path.join(import.meta.dirname, "..", "README.md");
|
const readmePath = path.join(import.meta.dirname, "..", "README.md");
|
||||||
|
|||||||
+8
-28
@@ -1,6 +1,6 @@
|
|||||||
import { Buffer } from "node:buffer";
|
import { Buffer } from "node:buffer";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import { exec, getExecOutput } from "@actions/exec";
|
import { exec } from "@actions/exec";
|
||||||
import pkgJson from "../package.json" with { type: "json" };
|
import pkgJson from "../package.json" with { type: "json" };
|
||||||
|
|
||||||
const tag = `v${pkgJson.version}`;
|
const tag = `v${pkgJson.version}`;
|
||||||
@@ -20,37 +20,17 @@ const gitEnv = {
|
|||||||
|
|
||||||
process.chdir(path.join(import.meta.dirname, ".."));
|
process.chdir(path.join(import.meta.dirname, ".."));
|
||||||
|
|
||||||
(async () => {
|
await exec("git", ["checkout", "--detach"]);
|
||||||
const { exitCode, stderr } = await getExecOutput(
|
await exec("git", ["add", "--force", "dist"]);
|
||||||
`git`,
|
await exec("git", ["commit", "-m", tag]);
|
||||||
["ls-remote", "--exit-code", "origin", "--tags", `refs/tags/${tag}`],
|
|
||||||
{
|
|
||||||
ignoreReturnCode: true,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
if (exitCode === 0) {
|
|
||||||
console.log(
|
|
||||||
`Action is not being published because version ${tag} is already published`,
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (exitCode !== 2) {
|
|
||||||
throw new Error(`git ls-remote exited with ${exitCode}:\n${stderr}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
await exec("git", ["checkout", "--detach"]);
|
await exec("changeset", ["git-tag"]);
|
||||||
await exec("git", ["add", "--force", "dist"]);
|
|
||||||
await exec("git", ["commit", "-m", tag]);
|
|
||||||
|
|
||||||
await exec("changeset", ["tag"]);
|
if (isPrerelease) {
|
||||||
|
|
||||||
if (isPrerelease) {
|
|
||||||
await exec("git", ["push", "origin", `refs/tags/${tag}`], {
|
await exec("git", ["push", "origin", `refs/tags/${tag}`], {
|
||||||
env: gitEnv,
|
env: gitEnv,
|
||||||
});
|
});
|
||||||
return;
|
} else {
|
||||||
}
|
|
||||||
|
|
||||||
await exec(
|
await exec(
|
||||||
"git",
|
"git",
|
||||||
[
|
[
|
||||||
@@ -64,4 +44,4 @@ process.chdir(path.join(import.meta.dirname, ".."));
|
|||||||
env: gitEnv,
|
env: gitEnv,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
})();
|
}
|
||||||
|
|||||||
+3
-10
@@ -2,7 +2,7 @@ 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 { context } from "@actions/github";
|
||||||
import { commitChangesFromRepo } from "@changesets/ghcommit/git";
|
import { commitChangesSinceBase } from "@changesets/ghcommit";
|
||||||
import { setupOctokit, type Octokit } from "./octokit.ts";
|
import { setupOctokit, type Octokit } from "./octokit.ts";
|
||||||
|
|
||||||
export type CommitMode = "git-cli" | "github-api";
|
export type CommitMode = "git-cli" | "github-api";
|
||||||
@@ -146,14 +146,7 @@ export class GitHub {
|
|||||||
|
|
||||||
async pushChanges({ branch, message }: { branch: string; message: string }) {
|
async pushChanges({ branch, message }: { branch: string; message: string }) {
|
||||||
if (this.commitMode === "github-api") {
|
if (this.commitMode === "github-api") {
|
||||||
/**
|
await commitChangesSinceBase({
|
||||||
* Only add files form the current working directory
|
|
||||||
*
|
|
||||||
* This will emulate the behavior of `git add .`,
|
|
||||||
* used in {@link commitAll}.
|
|
||||||
*/
|
|
||||||
const addFromDirectory = this.cwd;
|
|
||||||
return commitChangesFromRepo({
|
|
||||||
octokit: this.octokit,
|
octokit: this.octokit,
|
||||||
...context.repo,
|
...context.repo,
|
||||||
branch,
|
branch,
|
||||||
@@ -162,8 +155,8 @@ export class GitHub {
|
|||||||
commit: context.sha,
|
commit: context.sha,
|
||||||
},
|
},
|
||||||
cwd: this.cwd,
|
cwd: this.cwd,
|
||||||
force: true,
|
|
||||||
});
|
});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
if (!(await checkIfClean({ cwd: this.cwd }))) {
|
if (!(await checkIfClean({ cwd: this.cwd }))) {
|
||||||
await commitAll(message, { cwd: this.cwd });
|
await commitAll(message, { cwd: this.cwd });
|
||||||
|
|||||||
+50
-21
@@ -3,29 +3,46 @@ import * as core from "@actions/core";
|
|||||||
import { GitHub } from "./github.ts";
|
import { GitHub } from "./github.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,
|
||||||
|
getOptionalInput,
|
||||||
|
getRequiredInput,
|
||||||
|
throwOnRenamedInputs,
|
||||||
|
} from "./utils.ts";
|
||||||
|
|
||||||
(async () => {
|
(async () => {
|
||||||
// to maintain compatibility with workflows created before github-token input was introduced
|
throwOnRenamedInputs({
|
||||||
// it's important to prefer the explicitly set GITHUB_TOKEN over the default token coming from github.token
|
publish: "publish-script",
|
||||||
let githubToken = process.env.GITHUB_TOKEN || core.getInput("github-token");
|
version: "version-script",
|
||||||
|
commit: "commit-mesage",
|
||||||
|
title: "pr-title",
|
||||||
|
branch: "pr-base-branch",
|
||||||
|
prDraft: "pr-draft",
|
||||||
|
createGithubReleases: "create-github-releases",
|
||||||
|
commitMode: "commit-mode",
|
||||||
|
setupGitUser: "setup-git-user",
|
||||||
|
});
|
||||||
|
|
||||||
if (!githubToken) {
|
const githubToken = getRequiredInput("github-token");
|
||||||
core.setFailed("Please add the GITHUB_TOKEN to the changesets action");
|
if (process.env.GITHUB_TOKEN && process.env.GITHUB_TOKEN !== githubToken) {
|
||||||
return;
|
throw new Error(
|
||||||
|
'The GITHUB_TOKEN environment variable is set and does not match the "github-token" input. ' +
|
||||||
|
'Please pass the custom GitHub token to the "github-token" input and ' +
|
||||||
|
"remove the GITHUB_TOKEN environment variable to avoid conflicts.",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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 commitMode = getOptionalInput("commitMode") ?? "git-cli";
|
const commitMode = getOptionalInput("commit-mode") ?? "git-cli";
|
||||||
const prDraft = getOptionalInput("prDraft");
|
const prDraft = getOptionalInput("pr-draft");
|
||||||
if (commitMode !== "git-cli" && commitMode !== "github-api") {
|
if (commitMode !== "git-cli" && commitMode !== "github-api") {
|
||||||
core.setFailed(`Invalid commit mode: ${commitMode}`);
|
core.setFailed(`Invalid commit mode: ${commitMode}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (prDraft !== undefined && prDraft !== "always" && prDraft !== "create") {
|
if (prDraft !== undefined && prDraft !== "always" && prDraft !== "create") {
|
||||||
core.setFailed(`Invalid prDraft: ${prDraft}`);
|
core.setFailed(`Invalid pr-draft: ${prDraft}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const github = new GitHub({
|
const github = new GitHub({
|
||||||
@@ -34,7 +51,7 @@ import { fileExists, getOptionalInput } from "./utils.ts";
|
|||||||
commitMode,
|
commitMode,
|
||||||
});
|
});
|
||||||
|
|
||||||
let setupGitUser = core.getBooleanInput("setupGitUser");
|
let setupGitUser = core.getBooleanInput("setup-git-user");
|
||||||
|
|
||||||
if (setupGitUser) {
|
if (setupGitUser) {
|
||||||
core.info("setting git user");
|
core.info("setting git user");
|
||||||
@@ -43,7 +60,7 @@ import { fileExists, getOptionalInput } from "./utils.ts";
|
|||||||
|
|
||||||
let { changesets } = await readChangesetState(cwd);
|
let { changesets } = await readChangesetState(cwd);
|
||||||
|
|
||||||
let publishScript = core.getInput("publish");
|
let publishScript = core.getInput("publish-script");
|
||||||
let hasChangesets = changesets.length !== 0;
|
let hasChangesets = changesets.length !== 0;
|
||||||
const hasNonEmptyChangesets = changesets.some(
|
const hasNonEmptyChangesets = changesets.some(
|
||||||
(changeset) => changeset.releases.length > 0,
|
(changeset) => changeset.releases.length > 0,
|
||||||
@@ -51,8 +68,8 @@ import { fileExists, getOptionalInput } from "./utils.ts";
|
|||||||
let hasPublishScript = !!publishScript;
|
let hasPublishScript = !!publishScript;
|
||||||
|
|
||||||
core.setOutput("published", "false");
|
core.setOutput("published", "false");
|
||||||
core.setOutput("publishedPackages", "[]");
|
core.setOutput("published-packages", "[]");
|
||||||
core.setOutput("hasChangesets", String(hasChangesets));
|
core.setOutput("has-changesets", String(hasChangesets));
|
||||||
|
|
||||||
switch (true) {
|
switch (true) {
|
||||||
case !hasChangesets && !hasPublishScript:
|
case !hasChangesets && !hasPublishScript:
|
||||||
@@ -110,17 +127,29 @@ import { fileExists, getOptionalInput } from "./utils.ts";
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const createGithubReleases = core.getBooleanInput(
|
||||||
|
"create-github-releases",
|
||||||
|
);
|
||||||
|
const pushGitTags = core.getBooleanInput("push-git-tags");
|
||||||
|
if (createGithubReleases && !pushGitTags) {
|
||||||
|
throw new Error(
|
||||||
|
"The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. " +
|
||||||
|
"Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true " +
|
||||||
|
"or set 'create-github-releases' to false.",
|
||||||
|
);
|
||||||
|
}
|
||||||
const result = await runPublish({
|
const result = await runPublish({
|
||||||
script: publishScript,
|
script: publishScript,
|
||||||
github,
|
github,
|
||||||
createGithubReleases: core.getBooleanInput("createGithubReleases"),
|
createGithubReleases,
|
||||||
|
pushGitTags,
|
||||||
cwd,
|
cwd,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (result.published) {
|
if (result.published) {
|
||||||
core.setOutput("published", "true");
|
core.setOutput("published", "true");
|
||||||
core.setOutput(
|
core.setOutput(
|
||||||
"publishedPackages",
|
"published-packages",
|
||||||
JSON.stringify(result.publishedPackages),
|
JSON.stringify(result.publishedPackages),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -144,17 +173,17 @@ import { fileExists, getOptionalInput } from "./utils.ts";
|
|||||||
return;
|
return;
|
||||||
case hasChangesets: {
|
case hasChangesets: {
|
||||||
const { pullRequestNumber } = await runVersion({
|
const { pullRequestNumber } = await runVersion({
|
||||||
script: getOptionalInput("version"),
|
script: getOptionalInput("version-script"),
|
||||||
github,
|
github,
|
||||||
cwd,
|
cwd,
|
||||||
prTitle: getOptionalInput("title"),
|
prTitle: getOptionalInput("pr-title"),
|
||||||
commitMessage: getOptionalInput("commit"),
|
commitMessage: getOptionalInput("commit-message"),
|
||||||
hasPublishScript,
|
hasPublishScript,
|
||||||
prDraft,
|
prDraft,
|
||||||
branch: getOptionalInput("branch"),
|
branch: getOptionalInput("pr-base-branch"),
|
||||||
});
|
});
|
||||||
|
|
||||||
core.setOutput("pullRequestNumber", String(pullRequestNumber));
|
core.setOutput("pr-number", String(pullRequestNumber));
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as github from "@actions/github";
|
import * as github from "@actions/github";
|
||||||
import getReleasePlan from "@changesets/get-release-plan";
|
import { getReleasePlan } from "@changesets/get-release-plan";
|
||||||
import type {
|
import type {
|
||||||
ComprehensiveRelease,
|
ComprehensiveRelease,
|
||||||
ReleasePlan,
|
ReleasePlan,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { pathToFileURL } from "node:url";
|
import { pathToFileURL } from "node:url";
|
||||||
import type * as github from "@actions/github";
|
import type * as github from "@actions/github";
|
||||||
import getReleasePlan from "@changesets/get-release-plan";
|
import { getReleasePlan } from "@changesets/get-release-plan";
|
||||||
import { createFixture } from "fs-fixture";
|
import { createFixture } from "fs-fixture";
|
||||||
import { exec } from "tinyexec";
|
import { exec } from "tinyexec";
|
||||||
import { describe, expect, it } from "vitest";
|
import { describe, expect, it } from "vitest";
|
||||||
@@ -28,6 +28,7 @@ describe("getPullRequestWorktree", () => {
|
|||||||
private: true,
|
private: true,
|
||||||
workspaces: ["packages/*"],
|
workspaces: ["packages/*"],
|
||||||
}),
|
}),
|
||||||
|
"package-lock.json": "",
|
||||||
"packages/pkg-a/package.json": JSON.stringify({
|
"packages/pkg-a/package.json": JSON.stringify({
|
||||||
name: "pkg-a",
|
name: "pkg-a",
|
||||||
version: "1.0.0",
|
version: "1.0.0",
|
||||||
|
|||||||
@@ -20,6 +20,15 @@ async function main() {
|
|||||||
const script = getOptionalInput("script");
|
const script = getOptionalInput("script");
|
||||||
const packDirArtifactId = getOptionalInput("pack-dir-artifact-id");
|
const packDirArtifactId = getOptionalInput("pack-dir-artifact-id");
|
||||||
const createGithubReleases = core.getBooleanInput("create-github-releases");
|
const createGithubReleases = core.getBooleanInput("create-github-releases");
|
||||||
|
const pushGitTags = core.getBooleanInput("push-git-tags");
|
||||||
|
|
||||||
|
if (createGithubReleases && !pushGitTags) {
|
||||||
|
throw new Error(
|
||||||
|
"The input 'create-github-releases' is set to true, but 'push-git-tags' is set to false. " +
|
||||||
|
"Creating GitHub releases requires pushing git tags. Please set 'push-git-tags' to true " +
|
||||||
|
"or set 'create-github-releases' to false.",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
// 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();
|
||||||
@@ -39,6 +48,7 @@ async function main() {
|
|||||||
script,
|
script,
|
||||||
github,
|
github,
|
||||||
createGithubReleases,
|
createGithubReleases,
|
||||||
|
pushGitTags,
|
||||||
cwd,
|
cwd,
|
||||||
fromPackDir,
|
fromPackDir,
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { readPreState } from "@changesets/pre";
|
import { readPreState } from "@changesets/pre";
|
||||||
import readChangesets from "@changesets/read";
|
import { readChangesets } from "@changesets/read";
|
||||||
import type { PreState, NewChangeset } from "@changesets/types";
|
import type { PreState, NewChangeset } from "@changesets/types";
|
||||||
|
|
||||||
export type ChangesetState = {
|
export type ChangesetState = {
|
||||||
|
|||||||
+4
-2
@@ -1,6 +1,6 @@
|
|||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import type { Changeset } from "@changesets/types";
|
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 { GitHub } from "./github.ts";
|
||||||
@@ -20,7 +20,7 @@ vi.mock("@actions/github", () => ({
|
|||||||
graphql: mockedGraphql,
|
graphql: mockedGraphql,
|
||||||
}),
|
}),
|
||||||
}));
|
}));
|
||||||
vi.mock("@changesets/ghcommit/git");
|
vi.mock("@changesets/ghcommit");
|
||||||
|
|
||||||
let mockedGithubMethods = {
|
let mockedGithubMethods = {
|
||||||
pulls: {
|
pulls: {
|
||||||
@@ -56,6 +56,7 @@ function createSimpleProjectFixture() {
|
|||||||
private: true,
|
private: true,
|
||||||
workspaces: ["packages/*"],
|
workspaces: ["packages/*"],
|
||||||
}),
|
}),
|
||||||
|
"package-lock.json": "",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,6 +83,7 @@ function createIgnoredPackageFixture() {
|
|||||||
private: true,
|
private: true,
|
||||||
workspaces: ["packages/*"],
|
workspaces: ["packages/*"],
|
||||||
}),
|
}),
|
||||||
|
"package-lock.json": "",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+98
-49
@@ -1,4 +1,6 @@
|
|||||||
|
import { randomUUID } from "node:crypto";
|
||||||
import fs from "node:fs/promises";
|
import fs from "node:fs/promises";
|
||||||
|
import os from "node:os";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import {
|
import {
|
||||||
@@ -65,11 +67,17 @@ type PublishOptions = {
|
|||||||
script?: string;
|
script?: string;
|
||||||
fromPackDir?: string;
|
fromPackDir?: string;
|
||||||
createGithubReleases: boolean;
|
createGithubReleases: boolean;
|
||||||
|
pushGitTags: boolean;
|
||||||
github: GitHub;
|
github: GitHub;
|
||||||
cwd: string;
|
cwd: string;
|
||||||
};
|
};
|
||||||
|
|
||||||
type PublishedPackage = { name: string; version: string };
|
type PublishedPackage = { name: string; version: string };
|
||||||
|
type ChangesetsOutputEvent = {
|
||||||
|
type: "git-tag";
|
||||||
|
tag: string;
|
||||||
|
packageName: string;
|
||||||
|
};
|
||||||
|
|
||||||
type PublishResult =
|
type PublishResult =
|
||||||
| {
|
| {
|
||||||
@@ -82,19 +90,90 @@ type PublishResult =
|
|||||||
exitCode: number;
|
exitCode: number;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function isObject(value: unknown) {
|
||||||
|
return typeof value === "object" && value !== null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isChangesetsOutputEvent(
|
||||||
|
value: unknown,
|
||||||
|
): value is ChangesetsOutputEvent {
|
||||||
|
return (
|
||||||
|
isObject(value) &&
|
||||||
|
"type" in value &&
|
||||||
|
value.type === "git-tag" &&
|
||||||
|
"tag" in value &&
|
||||||
|
typeof value.tag === "string" &&
|
||||||
|
"packageName" in value &&
|
||||||
|
typeof value.packageName === "string"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function readChangesetsOutput(outputPath: string) {
|
||||||
|
let rawOutput: string;
|
||||||
|
try {
|
||||||
|
rawOutput = await fs.readFile(outputPath, "utf8");
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(`Failed to read changesets output at ${outputPath}`, {
|
||||||
|
cause: err,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const events: ChangesetsOutputEvent[] = [];
|
||||||
|
|
||||||
|
let lineStart = 0;
|
||||||
|
while (lineStart <= rawOutput.length) {
|
||||||
|
let lineEnd = rawOutput.indexOf("\n", lineStart);
|
||||||
|
if (lineEnd === -1) {
|
||||||
|
lineEnd = rawOutput.length;
|
||||||
|
}
|
||||||
|
const line = rawOutput.slice(lineStart, lineEnd);
|
||||||
|
lineStart = lineEnd + 1;
|
||||||
|
|
||||||
|
if (/^\s*$/.test(line)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let event: unknown;
|
||||||
|
try {
|
||||||
|
event = JSON.parse(line);
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(`Failed to parse changesets output event: ${line}`, {
|
||||||
|
cause: err,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isChangesetsOutputEvent(event)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
events.push(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
return events;
|
||||||
|
}
|
||||||
|
|
||||||
export async function runPublish({
|
export async function runPublish({
|
||||||
script,
|
script,
|
||||||
fromPackDir,
|
fromPackDir,
|
||||||
github,
|
github,
|
||||||
createGithubReleases,
|
createGithubReleases,
|
||||||
|
pushGitTags,
|
||||||
cwd,
|
cwd,
|
||||||
}: PublishOptions): Promise<PublishResult> {
|
}: PublishOptions): Promise<PublishResult> {
|
||||||
const { octokit } = github;
|
const { octokit } = github;
|
||||||
let changesetPublishOutput: ExecOutput;
|
let changesetPublishOutput: ExecOutput;
|
||||||
|
const outputFile = path.join(
|
||||||
|
process.env.RUNNER_TEMP ?? (await fs.realpath(os.tmpdir())),
|
||||||
|
`changesets-output-${randomUUID()}.ndjson`,
|
||||||
|
);
|
||||||
const execOptions: ExecOptions = {
|
const execOptions: ExecOptions = {
|
||||||
cwd,
|
cwd,
|
||||||
ignoreReturnCode: true,
|
ignoreReturnCode: true,
|
||||||
env: { ...process.env, GITHUB_TOKEN: github.getToken() },
|
env: {
|
||||||
|
...process.env,
|
||||||
|
GITHUB_TOKEN: github.getToken(),
|
||||||
|
CHANGESETS_OUTPUT: outputFile,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
if (script) {
|
if (script) {
|
||||||
@@ -115,66 +194,43 @@ export async function runPublish({
|
|||||||
}
|
}
|
||||||
|
|
||||||
let { packages, tool } = await getPackages(cwd);
|
let { packages, tool } = await getPackages(cwd);
|
||||||
let releasedPackages: Package[] = [];
|
|
||||||
|
|
||||||
if (tool !== "root") {
|
|
||||||
let newTagRegex = /New tag:\s+(@[^/]+\/[^@]+|[^/]+)@([^\s]+)/;
|
|
||||||
let packagesByName = new Map(packages.map((x) => [x.packageJson.name, x]));
|
let packagesByName = new Map(packages.map((x) => [x.packageJson.name, x]));
|
||||||
|
let output = await readChangesetsOutput(outputFile);
|
||||||
for (let line of changesetPublishOutput.stdout.split("\n")) {
|
let releases = output.map((event) => {
|
||||||
let match = line.match(newTagRegex);
|
let pkg = packagesByName.get(event.packageName);
|
||||||
if (match === null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
let pkgName = match[1];
|
|
||||||
let pkg = packagesByName.get(pkgName);
|
|
||||||
if (pkg === undefined) {
|
if (pkg === undefined) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`Package "${pkgName}" not found.` +
|
`Package "${event.packageName}" not found.` +
|
||||||
"This is probably a bug in the action, please open an issue",
|
"This is probably a bug in the action, please open an issue",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
releasedPackages.push(pkg);
|
return { pkg, tag: event.tag };
|
||||||
}
|
});
|
||||||
|
|
||||||
if (createGithubReleases) {
|
if (tool.type === "root" && packages.length === 0) {
|
||||||
await Promise.all(
|
|
||||||
releasedPackages.map(async (pkg) => {
|
|
||||||
const tagName = `${pkg.packageJson.name}@${pkg.packageJson.version}`;
|
|
||||||
await github.pushTag(tagName);
|
|
||||||
await createRelease(octokit, { pkg, tagName });
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (packages.length === 0) {
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
`No package found.` +
|
`No package found.` +
|
||||||
"This is probably a bug in the action, please open an issue",
|
"This is probably a bug in the action, please open an issue",
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
let pkg = packages[0];
|
|
||||||
let newTagRegex = /New tag:/;
|
|
||||||
|
|
||||||
for (let line of changesetPublishOutput.stdout.split("\n")) {
|
if (createGithubReleases || pushGitTags) {
|
||||||
let match = line.match(newTagRegex);
|
await Promise.all(
|
||||||
|
releases.map(async ({ pkg, tag }) => {
|
||||||
if (match) {
|
if (pushGitTags) {
|
||||||
releasedPackages.push(pkg);
|
await github.pushTag(tag);
|
||||||
|
}
|
||||||
if (createGithubReleases) {
|
if (createGithubReleases) {
|
||||||
const tagName = `v${pkg.packageJson.version}`;
|
await createRelease(octokit, { pkg, tagName: tag });
|
||||||
await github.pushTag(tagName);
|
|
||||||
await createRelease(octokit, { pkg, tagName });
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (releasedPackages.length) {
|
if (releases.length) {
|
||||||
return {
|
return {
|
||||||
published: true,
|
published: true,
|
||||||
publishedPackages: releasedPackages.map((pkg) => ({
|
publishedPackages: releases.map(({ pkg }) => ({
|
||||||
name: pkg.packageJson.name,
|
name: pkg.packageJson.name,
|
||||||
version: pkg.packageJson.version,
|
version: pkg.packageJson.version,
|
||||||
})),
|
})),
|
||||||
@@ -321,13 +377,6 @@ export async function runVersion({
|
|||||||
!!preState ? ` (${preState.tag})` : ""
|
!!preState ? ` (${preState.tag})` : ""
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetch any existing pull requests that are open against the branch,
|
|
||||||
* before we push any changes that may inadvertently close the existing PRs.
|
|
||||||
*
|
|
||||||
* (`@changesets/ghcommit` has to reset the branch to the same commit as the base,
|
|
||||||
* 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,
|
...context.repo,
|
||||||
state: "open",
|
state: "open",
|
||||||
|
|||||||
@@ -135,6 +135,25 @@ export function getRequiredInput(name: string) {
|
|||||||
return core.getInput(name, { required: true });
|
return core.getInput(name, { required: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function throwOnRenamedInputs(renames: Record<string, string>) {
|
||||||
|
const references: Record<string, string> = {};
|
||||||
|
|
||||||
|
for (const [oldInput, newInput] of Object.entries(renames)) {
|
||||||
|
if (core.getInput(oldInput)) {
|
||||||
|
references[oldInput] = newInput;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Object.keys(references).length > 0) {
|
||||||
|
const list = Object.entries(references)
|
||||||
|
.map(([oldInput, newInput]) => `- "${oldInput}" -> "${newInput}"`)
|
||||||
|
.join("\n");
|
||||||
|
throw new Error(
|
||||||
|
`The following inputs have been renamed:\n${list}\nPlease update your workflow file.`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
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],
|
||||||
|
|||||||
+3
-1
@@ -37,7 +37,9 @@ inputs:
|
|||||||
description: Sets up the git user for commits as `"github-actions[bot]"`. Default to `true`
|
description: Sets up the git user for commits as `"github-actions[bot]"`. Default to `true`
|
||||||
required: false
|
required: false
|
||||||
default: true
|
default: true
|
||||||
outputs: {}
|
outputs:
|
||||||
|
pr-number:
|
||||||
|
description: The pull request number that was created or updated
|
||||||
branding:
|
branding:
|
||||||
icon: package
|
icon: package
|
||||||
color: blue
|
color: blue
|
||||||
|
|||||||
Reference in New Issue
Block a user