From 67c9c7bcc5c5cc5b67cc3f70758718042c2b52a4 Mon Sep 17 00:00:00 2001 From: Brooooooklyn Date: Tue, 27 Aug 2024 03:01:54 +0000 Subject: [PATCH] ci: send slack message to channel after deploy (#7889) --- .github/actions/cluster-auth/action.yml | 36 +++ .github/actions/deploy/action.yml | 24 +- .github/workflows/deploy.yml | 133 +++++++++ tools/bump-blocksuite/package.json | 2 +- tools/changelog/index.js | 140 +++++++++ tools/changelog/markdown.js | 25 ++ tools/changelog/package.json | 19 ++ yarn.lock | 364 +++++++++++++++++++++++- 8 files changed, 710 insertions(+), 33 deletions(-) create mode 100644 .github/actions/cluster-auth/action.yml create mode 100644 tools/changelog/index.js create mode 100644 tools/changelog/markdown.js create mode 100644 tools/changelog/package.json diff --git a/.github/actions/cluster-auth/action.yml b/.github/actions/cluster-auth/action.yml new file mode 100644 index 0000000000..3fa3c61852 --- /dev/null +++ b/.github/actions/cluster-auth/action.yml @@ -0,0 +1,36 @@ +name: 'Auth to Cluster' +description: 'Auth to the GCP Cluster' +inputs: + gcp-project-number: + description: 'GCP project number' + required: true + gcp-project-id: + description: 'GCP project id' + required: true + service-account: + description: 'Service account' + cluster-name: + description: 'Cluster name' + cluster-location: + description: 'Cluster location' + +runs: + using: 'composite' + steps: + - id: auth + uses: google-github-actions/auth@v2 + with: + workload_identity_provider: 'projects/${{ inputs.gcp-project-number }}/locations/global/workloadIdentityPools/github-actions/providers/github-actions-helm-deploy' + service_account: '${{ inputs.service-account }}' + token_format: 'access_token' + project_id: '${{ inputs.gcp-project-id }}' + + - name: 'Setup gcloud cli' + uses: 'google-github-actions/setup-gcloud@v2' + with: + install_components: 'gke-gcloud-auth-plugin' + + - id: get-gke-credentials + shell: bash + run: | + gcloud container clusters get-credentials ${{ inputs.cluster-name }} --region ${{ inputs.cluster-location }} --project ${{ inputs.gcp-project-id }} diff --git a/.github/actions/deploy/action.yml b/.github/actions/deploy/action.yml index 668f082bdc..a5c62b2470 100644 --- a/.github/actions/deploy/action.yml +++ b/.github/actions/deploy/action.yml @@ -24,24 +24,14 @@ runs: shell: bash run: | echo "GIT_SHORT_HASH=$(git rev-parse --short HEAD)" >> "$GITHUB_ENV" - - uses: azure/setup-helm@v4 - - id: auth - uses: google-github-actions/auth@v2 + - name: 'Auth to cluster' + uses: './.github/actions/cluster-auth' with: - workload_identity_provider: 'projects/${{ inputs.gcp-project-number }}/locations/global/workloadIdentityPools/github-actions/providers/github-actions-helm-deploy' - service_account: '${{ inputs.service-account }}' - token_format: 'access_token' - project_id: '${{ inputs.gcp-project-id }}' - - - name: 'Setup gcloud cli' - uses: 'google-github-actions/setup-gcloud@v2' - with: - install_components: 'gke-gcloud-auth-plugin' - - - id: get-gke-credentials - shell: bash - run: | - gcloud container clusters get-credentials ${{ inputs.cluster-name }} --region ${{ inputs.cluster-location }} --project ${{ inputs.gcp-project-id }} + gcp-project-number: '${{ inputs.gcp-project-number }}' + gcp-project-id: '${{ inputs.gcp-project-id }}' + service-account: '${{ inputs.service-account }}' + cluster-name: '${{ inputs.cluster-name }}' + cluster-location: '${{ inputs.cluster-location }}' - name: Deploy shell: bash diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ace56587ef..4e7706fe7b 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -21,6 +21,47 @@ permissions: packages: 'write' jobs: + output-prev-version: + name: Output previous version + runs-on: ubuntu-latest + environment: ${{ github.event.inputs.flavor }} + outputs: + prev: ${{ steps.print.outputs.version }} + namespace: ${{ steps.print.outputs.namespace }} + steps: + - uses: actions/checkout@v4 + - name: Auth to Cluster + uses: './.github/actions/cluster-auth' + with: + gcp-project-number: ${{ secrets.GCP_PROJECT_NUMBER }} + gcp-project-id: ${{ secrets.GCP_PROJECT_ID }} + service-account: ${{ secrets.GCP_HELM_DEPLOY_SERVICE_ACCOUNT }} + cluster-name: ${{ secrets.GCP_CLUSTER_NAME }} + cluster-location: ${{ secrets.GCP_CLUSTER_LOCATION }} + - name: Output previous version + id: print + run: | + namespace="" + if [ "${{ github.event.inputs.flavor }}" = "canary" ]; then + namespace="dev" + elif [ "${{ github.event.inputs.flavor }}" = "beta" ]; then + namespace="beta" + elif [ "${{ github.event.inputs.flavor }}" = "stable" ]; then + namespace="production" + else + echo "Invalid flavor: ${{ github.event.inputs.flavor }}" + exit 1 + fi + + echo "Namespace set to: $namespace" + + # Get the previous version from the deployment + prev_version=$(kubectl get deployment -n $namespace affine-graphql -o=jsonpath='{.spec.template.spec.containers[0].image}' | awk -F '-' '{print $3}') + + echo "Previous version: $prev_version" + echo "version=$prev_version" >> $GITHUB_OUTPUT + echo "namesapce=$namespace" >> $GITHUB_OUTPUT + build-server-image: name: Build Server Image uses: ./.github/workflows/build-server-image.yml @@ -193,3 +234,95 @@ jobs: STRIPE_API_KEY: ${{ secrets.STRIPE_API_KEY }} STRIPE_WEBHOOK_KEY: ${{ secrets.STRIPE_WEBHOOK_KEY }} STATIC_IP_NAME: ${{ secrets.STATIC_IP_NAME }} + + deploy-done: + needs: + - output-prev-version + - build-frontend-image + - build-server-image + - deploy + if: always() + runs-on: ubuntu-latest + name: Post deploy message + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/checkout@v4 + with: + repository: toeverything/blocksuite + path: blocksuite + fetch-depth: 0 + fetch-tags: true + - name: Setup Node.js + uses: ./.github/actions/setup-node + with: + extra-flags: 'workspaces focus @affine/changelog' + electron-install: false + - name: Output deployed info + if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }} + id: set_info + run: | + if [ "${{ github.event.inputs.flavor }}" = "canary" ]; then + echo "deployed_url=https://affine.fail" >> $GITHUB_OUTPUT + elif [ "${{ github.event.inputs.flavor }}" = "beta" ]; then + echo "deployed_url=https://insider.affine.pro" >> $GITHUB_OUTPUT + elif [ "${{ github.event.inputs.flavor }}" = "stable" ]; then + echo "deployed_url=https://app.affine.pro" >> $GITHUB_OUTPUT + else + exit 1 + fi + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} + - name: Post Success event to a Slack channel + if: ${{ always() && !contains(needs.*.result, 'failure') && !contains(needs.*.result, 'cancelled') }} + run: node ./tools/changelog/index.js + env: + CHANNEL_ID: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }} + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + DEPLOYED_URL: ${{ steps.set_info.outputs.deployed_url }} + PREV_VERSION: ${{ needs.output-prev-version.outputs.prev }} + NAMESPACE: ${{ needs.output-prev-version.outputs.namespace }} + DEPLOYMENT: 'SERVER' + FLAVOR: ${{ github.event.inputs.flavor }} + BLOCKSUITE_REPO_PATH: ${{ github.workspace }}/blocksuite + - name: Post Failed event to a Slack channel + id: failed-slack + uses: slackapi/slack-github-action@v1.26.0 + if: ${{ always() && contains(needs.*.result, 'failure') }} + with: + channel-id: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }} + payload: | + { + "blocks": [ + { + "type": "section", + "text": { + "text": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Backend deploy failed `${{ github.event.inputs.flavor }}`>", + "type": "mrkdwn" + } + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} + - name: Post Cancel event to a Slack channel + id: cancel-slack + uses: slackapi/slack-github-action@v1.26.0 + if: ${{ always() && contains(needs.*.result, 'cancelled') && !contains(needs.*.result, 'failure') }} + with: + channel-id: ${{ secrets.RELEASE_SLACK_CHNNEL_ID }} + payload: | + { + "blocks": [ + { + "type": "section", + "text": { + "text": "<${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Backend deploy cancelled `${{ github.event.inputs.flavor }}`>", + "type": "mrkdwn" + } + } + ] + } + env: + SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }} diff --git a/tools/bump-blocksuite/package.json b/tools/bump-blocksuite/package.json index b49852cf69..af37ffbd64 100644 --- a/tools/bump-blocksuite/package.json +++ b/tools/bump-blocksuite/package.json @@ -7,7 +7,7 @@ "description": "Generate changelog from blocksuite version change", "dependencies": { "@napi-rs/clipboard": "^1.1.2", - "@napi-rs/simple-git": "^0.1.16", + "@napi-rs/simple-git": "^0.1.18", "chalk": "^5.3.0" } } diff --git a/tools/changelog/index.js b/tools/changelog/index.js new file mode 100644 index 0000000000..7220d6e7e2 --- /dev/null +++ b/tools/changelog/index.js @@ -0,0 +1,140 @@ +import { readFile } from 'node:fs/promises'; +import { join } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { Repository, Sort } from '@napi-rs/simple-git'; +import { WebClient } from '@slack/web-api'; +import { + generateMarkdown, + parseCommits, + resolveAuthors, + resolveConfig, +} from 'changelogithub'; + +import { render } from './markdown.js'; + +const { + DEPLOYED_URL, + NAMESPACE, + CHANNEL_ID, + SLACK_BOT_TOKEN, + PREV_VERSION, + DEPLOYMENT, + FLAVOR, + BLOCKSUITE_REPO_PATH, +} = process.env; + +const slack = new WebClient(SLACK_BOT_TOKEN); +const rootDir = join(fileURLToPath(import.meta.url), '..', '..', '..'); +const repo = new Repository(rootDir); + +/** + * @param {import('@napi-rs/simple-git').Repository} repo + * @param {string} previousCommit + * @param {string | undefined} currentCommit + * @returns {Promise} + */ +async function getChangeLog(repo, previousCommit, currentCommit) { + const prevCommit = repo.findCommit(previousCommit); + if (!prevCommit) { + console.log( + `Previous commit ${previousCommit} in ${repo.path()} not found` + ); + return ''; + } + /** @type {typeof import('changelogithub')['parseCommits'] extends (commit: infer C, ...args: any[]) => any ? C : any} */ + const commits = []; + + const revWalk = repo.revWalk(); + + if (currentCommit) { + const commit = repo.findCommit(currentCommit); + revWalk.push(commit.id()); + } else { + revWalk.pushHead(); + } + + for (const commitId of revWalk.setSorting(Sort.Time & Sort.Topological)) { + const commit = repo.findCommit(commitId); + commits.push({ + message: commit.message(), + body: commit.body() ?? '', + shortHash: commit.id().substring(0, 8), + author: { + name: commit.author().name(), + email: commit.author().email(), + }, + }); + if (commitId.startsWith(previousCommit)) { + break; + } + } + + const parseConfig = await resolveConfig({ + token: process.env.GITHUB_TOKEN, + }); + + const parsedCommits = parseCommits(commits, parseConfig); + await resolveAuthors(parsedCommits, parseConfig); + return generateMarkdown(parsedCommits, parseConfig) + .replaceAll(' ', ' ') + .replaceAll('', '') + .replaceAll('', ''); +} + +let blockSuiteChangelog = ''; +const pkgJsonPath = 'packages/frontend/core/package.json'; + +const content = await readFile(join(rootDir, pkgJsonPath), 'utf8'); +const { dependencies } = JSON.parse(content); +const blocksuiteVersion = dependencies['@blocksuite/block-std']; + +const previousPkgJsonBlob = repo + .findCommit(PREV_VERSION) + .tree() + .getPath(pkgJsonPath) + .toObject(repo) + .peelToBlob(); +const previousPkgJson = JSON.parse( + Buffer.from(previousPkgJsonBlob.content()).toString('utf8') +); +const previousBlocksuiteVersion = + previousPkgJson.dependencies['@blocksuite/block-std']; +if (blocksuiteVersion !== previousBlocksuiteVersion) { + const current = blocksuiteVersion.split('-').pop(); + const previous = previousBlocksuiteVersion.split('-').pop(); + const blockSuiteRepo = new Repository( + BLOCKSUITE_REPO_PATH ?? join(rootDir, '..', 'blocksuite') + ); + console.log(`Blocksuite ${previous} -> ${current}`); + blockSuiteChangelog = await getChangeLog(blockSuiteRepo, previous, current); +} + +const messageHead = + DEPLOYMENT === 'server' + ? `# Server deployed in ${NAMESPACE} + +- [${DEPLOYED_URL}](${DEPLOYED_URL}) +` + : `# AFFiNE Client ${FLAVOR} released`; + +let changelogMessage = `${messageHead} + +${await getChangeLog(repo, PREV_VERSION)} +`; + +if (blockSuiteChangelog) { + changelogMessage += ` + +# Blocksuite Changelog + +${blockSuiteChangelog}`; +} + +const { ok } = await slack.chat.postMessage({ + channel: CHANNEL_ID, + text: `Server deployed`, + blocks: render(changelogMessage), +}); + +console.assert(ok, 'Failed to send a message to Slack'); diff --git a/tools/changelog/markdown.js b/tools/changelog/markdown.js new file mode 100644 index 0000000000..0c1774e492 --- /dev/null +++ b/tools/changelog/markdown.js @@ -0,0 +1,25 @@ +import { jsxslack } from 'jsx-slack'; +import { marked, Renderer } from 'marked'; + +export const render = markdown => { + const rendered = marked(markdown, { + renderer: new (class CustomRenderer extends Renderer { + heading({ tokens }) { + return ` + +
${tokens[0].text}
+ +
`; + } + + list(token) { + return `
${super.list(token)}
`; + } + + hr() { + return ``; + } + })(), + }); + return jsxslack([`${rendered}`]); +}; diff --git a/tools/changelog/package.json b/tools/changelog/package.json new file mode 100644 index 0000000000..881dd1b8f9 --- /dev/null +++ b/tools/changelog/package.json @@ -0,0 +1,19 @@ +{ + "name": "@affine/changelog", + "version": "0.16.0", + "type": "module", + "main": "index.js", + "private": true, + "description": "Generate changelog from version changes", + "dependencies": { + "@napi-rs/simple-git": "^0.1.18", + "@slack/web-api": "^7.3.4", + "chalk": "^5.3.0", + "changelogithub": "^0.13.9", + "jsx-slack": "^6.1.1", + "marked": "^14.0.0" + }, + "devDependencies": { + "@types/node": "^20.14.12" + } +} diff --git a/yarn.lock b/yarn.lock index a790ec7b7b..9122c7e7ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -216,11 +216,25 @@ __metadata: resolution: "@affine/bump-blocksuite@workspace:tools/bump-blocksuite" dependencies: "@napi-rs/clipboard": "npm:^1.1.2" - "@napi-rs/simple-git": "npm:^0.1.16" + "@napi-rs/simple-git": "npm:^0.1.18" chalk: "npm:^5.3.0" languageName: unknown linkType: soft +"@affine/changelog@workspace:tools/changelog": + version: 0.0.0-use.local + resolution: "@affine/changelog@workspace:tools/changelog" + dependencies: + "@napi-rs/simple-git": "npm:^0.1.18" + "@slack/web-api": "npm:^7.3.4" + "@types/node": "npm:^20.14.12" + chalk: "npm:^5.3.0" + changelogithub: "npm:^0.13.9" + jsx-slack: "npm:^6.1.1" + marked: "npm:^14.0.0" + languageName: unknown + linkType: soft + "@affine/cli@workspace:*, @affine/cli@workspace:tools/cli": version: 0.0.0-use.local resolution: "@affine/cli@workspace:tools/cli" @@ -934,6 +948,13 @@ __metadata: languageName: node linkType: hard +"@antfu/utils@npm:^0.7.10": + version: 0.7.10 + resolution: "@antfu/utils@npm:0.7.10" + checksum: 10/c8c2797aeab3e88f0095dea5736d2f16137a7213195e568246792b2cceecb184234f018346dc07c252c62e4d9085c09ce6bd180da833266cafa65133fb03e075 + languageName: node + linkType: hard + "@apollo/cache-control-types@npm:^1.0.3": version: 1.0.3 resolution: "@apollo/cache-control-types@npm:1.0.3" @@ -7589,7 +7610,7 @@ __metadata: languageName: node linkType: hard -"@napi-rs/simple-git@npm:^0.1.16": +"@napi-rs/simple-git@npm:^0.1.16, @napi-rs/simple-git@npm:^0.1.18": version: 0.1.18 resolution: "@napi-rs/simple-git@npm:0.1.18" dependencies: @@ -12477,6 +12498,42 @@ __metadata: languageName: node linkType: hard +"@slack/logger@npm:^4.0.0": + version: 4.0.0 + resolution: "@slack/logger@npm:4.0.0" + dependencies: + "@types/node": "npm:>=18.0.0" + checksum: 10/dc79e9d2032c4bf9ce01d96cc72882f003dd376d036f172d4169662cfc2c9b384a80d5546b06021578dd473e7059f064303f0ba851eeb153387f2081a1e3062e + languageName: node + linkType: hard + +"@slack/types@npm:^2.9.0": + version: 2.12.0 + resolution: "@slack/types@npm:2.12.0" + checksum: 10/2b3a77523289d315aacf5dea690a02ebdcebd03bccc3eba90bf4f9032d4ecd0db98a24c8375178d323622b1b72aef53a21812e933d1e833e70b04282257d02be + languageName: node + linkType: hard + +"@slack/web-api@npm:^7.3.4": + version: 7.3.4 + resolution: "@slack/web-api@npm:7.3.4" + dependencies: + "@slack/logger": "npm:^4.0.0" + "@slack/types": "npm:^2.9.0" + "@types/node": "npm:>=18.0.0" + "@types/retry": "npm:0.12.0" + axios: "npm:^1.7.4" + eventemitter3: "npm:^5.0.1" + form-data: "npm:^4.0.0" + is-electron: "npm:2.2.2" + is-stream: "npm:^2" + p-queue: "npm:^6" + p-retry: "npm:^4" + retry: "npm:^0.13.1" + checksum: 10/8993090314c64860fe200dfaaf619e8bc770164dcd049caeb4e08c9ef3abe88089b6c36d63c14ba100ba3cad40f2f570b7d8085f38ab95a42164db5c8a206285 + languageName: node + linkType: hard + "@smithy/abort-controller@npm:^3.1.1": version: 3.1.1 resolution: "@smithy/abort-controller@npm:3.1.1" @@ -14646,12 +14703,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:>=13.7.0, @types/node@npm:>=8.1.0, @types/node@npm:^20.12.7, @types/node@npm:^20.14.9, @types/node@npm:^20.9.0": - version: 20.16.1 - resolution: "@types/node@npm:20.16.1" +"@types/node@npm:*, @types/node@npm:>=10.0.0, @types/node@npm:>=13.7.0, @types/node@npm:>=18.0.0, @types/node@npm:>=8.1.0": + version: 22.5.0 + resolution: "@types/node@npm:22.5.0" dependencies: undici-types: "npm:~6.19.2" - checksum: 10/9bae1dffd2094694147a91ebec51dc89a60a607d16d47a0d770320f1a75d3ba58663708fd93c37954a63acb701a4e0fd64245139c57ae810d3ad524e75481d4e + checksum: 10/89af3bd217b1559b645a9ed16d4ae3add75749814cbd8eefddd1b96003d1973afb1c8a2b23d69f3a8cc6c532e3aa185eaf5cc29a6e7c42c311a2aad4c99430ae languageName: node linkType: hard @@ -14664,6 +14721,15 @@ __metadata: languageName: node linkType: hard +"@types/node@npm:^20.12.7, @types/node@npm:^20.14.12, @types/node@npm:^20.14.9, @types/node@npm:^20.9.0": + version: 20.16.1 + resolution: "@types/node@npm:20.16.1" + dependencies: + undici-types: "npm:~6.19.2" + checksum: 10/9bae1dffd2094694147a91ebec51dc89a60a607d16d47a0d770320f1a75d3ba58663708fd93c37954a63acb701a4e0fd64245139c57ae810d3ad524e75481d4e + languageName: node + linkType: hard + "@types/nodemailer@npm:^6.4.14": version: 6.4.15 resolution: "@types/nodemailer@npm:6.4.15" @@ -14822,6 +14888,13 @@ __metadata: languageName: node linkType: hard +"@types/retry@npm:0.12.0": + version: 0.12.0 + resolution: "@types/retry@npm:0.12.0" + checksum: 10/bbd0b88f4b3eba7b7acfc55ed09c65ef6f2e1bcb4ec9b4dca82c66566934351534317d294a770a7cc6c0468d5573c5350abab6e37c65f8ef254443e1b028e44d + languageName: node + linkType: hard + "@types/retry@npm:0.12.2": version: 0.12.2 resolution: "@types/retry@npm:0.12.2" @@ -17003,6 +17076,13 @@ __metadata: languageName: node linkType: hard +"big-integer@npm:^1.6.44": + version: 1.6.52 + resolution: "big-integer@npm:1.6.52" + checksum: 10/4bc6ae152a96edc9f95020f5fc66b13d26a9ad9a021225a9f0213f7e3dc44269f423aa8c42e19d6ac4a63bb2b22140b95d10be8f9ca7a6d9aa1b22b330d1f514 + languageName: node + linkType: hard + "big.js@npm:^5.2.2": version: 5.2.2 resolution: "big.js@npm:5.2.2" @@ -17175,6 +17255,15 @@ __metadata: languageName: node linkType: hard +"bplist-parser@npm:^0.2.0": + version: 0.2.0 + resolution: "bplist-parser@npm:0.2.0" + dependencies: + big-integer: "npm:^1.6.44" + checksum: 10/15d31c1b0c7e0fb384e96349453879a33609d92d91b55a9ccee04b4be4b0645f1c823253d73326a1a23104521fbc45c2dd97fb05adf61863841b68cbb2ca7a3d + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -17350,6 +17439,15 @@ __metadata: languageName: node linkType: hard +"bundle-name@npm:^3.0.0": + version: 3.0.0 + resolution: "bundle-name@npm:3.0.0" + dependencies: + run-applescript: "npm:^5.0.0" + checksum: 10/edf2b1fbe6096ed32e7566947ace2ea937ee427391744d7510a2880c4b9a5b3543d3f6c551236a29e5c87d3195f8e2912516290e638c15bcbede7b37cc375615 + languageName: node + linkType: hard + "bundle-name@npm:^4.1.0": version: 4.1.0 resolution: "bundle-name@npm:4.1.0" @@ -17389,6 +17487,31 @@ __metadata: languageName: node linkType: hard +"c12@npm:^1.11.1, c12@npm:^1.4.2": + version: 1.11.1 + resolution: "c12@npm:1.11.1" + dependencies: + chokidar: "npm:^3.6.0" + confbox: "npm:^0.1.7" + defu: "npm:^6.1.4" + dotenv: "npm:^16.4.5" + giget: "npm:^1.2.3" + jiti: "npm:^1.21.6" + mlly: "npm:^1.7.1" + ohash: "npm:^1.1.3" + pathe: "npm:^1.1.2" + perfect-debounce: "npm:^1.0.0" + pkg-types: "npm:^1.1.1" + rc9: "npm:^2.1.2" + peerDependencies: + magicast: ^0.3.4 + peerDependenciesMeta: + magicast: + optional: true + checksum: 10/f836395ef3a3ec9b4d254f72ff9e92ab3dc0530193881a81f6d49506bcc8f41d8ba6613c6b776c7cabb996065b447f9a8822eff3f74d03af24c5cd7c067b9c92 + languageName: node + linkType: hard + "c8@npm:^10.0.0": version: 10.1.2 resolution: "c8@npm:10.1.2" @@ -17737,6 +17860,50 @@ __metadata: languageName: node linkType: hard +"changelogen@npm:0.5.5": + version: 0.5.5 + resolution: "changelogen@npm:0.5.5" + dependencies: + c12: "npm:^1.4.2" + colorette: "npm:^2.0.20" + consola: "npm:^3.2.3" + convert-gitmoji: "npm:^0.1.3" + execa: "npm:^8.0.1" + mri: "npm:^1.2.0" + node-fetch-native: "npm:^1.2.0" + ofetch: "npm:^1.1.1" + open: "npm:^9.1.0" + pathe: "npm:^1.1.1" + pkg-types: "npm:^1.0.3" + scule: "npm:^1.0.0" + semver: "npm:^7.5.4" + std-env: "npm:^3.4.2" + yaml: "npm:^2.3.1" + bin: + changelogen: dist/cli.mjs + checksum: 10/ed510181af7b749938fbf877ae85662da589ed5b54bf8bc44c679270192ecc35fa0fa221a9dba222ac1c77aa4891ae21887ccd3b406a6643ad5b3c43d312b068 + languageName: node + linkType: hard + +"changelogithub@npm:^0.13.9": + version: 0.13.9 + resolution: "changelogithub@npm:0.13.9" + dependencies: + "@antfu/utils": "npm:^0.7.10" + c12: "npm:^1.11.1" + cac: "npm:^6.7.14" + changelogen: "npm:0.5.5" + convert-gitmoji: "npm:^0.1.5" + execa: "npm:^8.0.1" + kolorist: "npm:^1.8.0" + ofetch: "npm:^1.3.4" + semver: "npm:^7.6.2" + bin: + changelogithub: cli.mjs + checksum: 10/78bfb18575baca3c6eb262c45a022ccddd717e37ff3f6fa805a5a4a96dfe61d7bd9287aaad83f9d10ab4a8e9e2711f72a83d67c42557e0c194a6d6f349ee5686 + languageName: node + linkType: hard + "character-entities-html4@npm:^2.0.0": version: 2.1.0 resolution: "character-entities-html4@npm:2.1.0" @@ -18622,6 +18789,13 @@ __metadata: languageName: node linkType: hard +"convert-gitmoji@npm:^0.1.3, convert-gitmoji@npm:^0.1.5": + version: 0.1.5 + resolution: "convert-gitmoji@npm:0.1.5" + checksum: 10/d24873ae8d9c363f5e23fbf8565a41df3c7d2024ca4408d6fe4ef2e31ee99a8abea4409e2ebe3215ec4ac1ab632350b20619ed9ea52cbabe6e9488e6ebb070ce + languageName: node + linkType: hard + "convert-source-map@npm:^1.5.0, convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" @@ -19391,6 +19565,16 @@ __metadata: languageName: node linkType: hard +"default-browser-id@npm:^3.0.0": + version: 3.0.0 + resolution: "default-browser-id@npm:3.0.0" + dependencies: + bplist-parser: "npm:^0.2.0" + untildify: "npm:^4.0.0" + checksum: 10/279c7ad492542e5556336b6c254a4eaf31b2c63a5433265655ae6e47301197b6cfb15c595a6fdc6463b2ff8e1a1a1ed3cba56038a60e1527ba4ab1628c6b9941 + languageName: node + linkType: hard + "default-browser-id@npm:^5.0.0": version: 5.0.0 resolution: "default-browser-id@npm:5.0.0" @@ -19398,6 +19582,18 @@ __metadata: languageName: node linkType: hard +"default-browser@npm:^4.0.0": + version: 4.0.0 + resolution: "default-browser@npm:4.0.0" + dependencies: + bundle-name: "npm:^3.0.0" + default-browser-id: "npm:^3.0.0" + execa: "npm:^7.1.1" + titleize: "npm:^3.0.0" + checksum: 10/40c5af984799042b140300be5639c9742599bda76dc9eba5ac9ad5943c83dd36cebc4471eafcfddf8e0ec817166d5ba89d56f08e66a126c7c7908a179cead1a7 + languageName: node + linkType: hard + "default-browser@npm:^5.2.1": version: 5.2.1 resolution: "default-browser@npm:5.2.1" @@ -19541,6 +19737,13 @@ __metadata: languageName: node linkType: hard +"destr@npm:^2.0.3": + version: 2.0.3 + resolution: "destr@npm:2.0.3" + checksum: 10/dbb756baa876810ec0ca4bcb702d86cc3b480ed14f36bf5747718ed211f96bca5520b63a4109eb181ad940ee2a645677d9a63d4a0ed11a7510619dae97317201 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -21204,7 +21407,7 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^4.0.0": +"eventemitter3@npm:^4.0.0, eventemitter3@npm:^4.0.4": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" checksum: 10/8030029382404942c01d0037079f1b1bc8fed524b5849c237b80549b01e2fc49709e1d0c557fa65ca4498fc9e24cff1475ef7b855121fcc15f9d61f93e282346 @@ -21264,7 +21467,7 @@ __metadata: languageName: node linkType: hard -"execa@npm:^7.0.0": +"execa@npm:^7.0.0, execa@npm:^7.1.1": version: 7.2.0 resolution: "execa@npm:7.2.0" dependencies: @@ -22479,7 +22682,7 @@ __metadata: languageName: node linkType: hard -"giget@npm:^1.0.0": +"giget@npm:^1.0.0, giget@npm:^1.2.3": version: 1.2.3 resolution: "giget@npm:1.2.3" dependencies: @@ -24165,6 +24368,13 @@ __metadata: languageName: node linkType: hard +"is-electron@npm:2.2.2": + version: 2.2.2 + resolution: "is-electron@npm:2.2.2" + checksum: 10/de5aa8bd8d72c96675b8d0f93fab4cc21f62be5440f65bc05c61338ca27bd851a64200f31f1bf9facbaa01b3dbfed7997b2186741d84b93b63e0aff1db6a9494 + languageName: node + linkType: hard + "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" @@ -24397,7 +24607,7 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^2.0.0": +"is-stream@npm:^2, is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" checksum: 10/b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 @@ -24796,7 +25006,7 @@ __metadata: languageName: node linkType: hard -"jiti@npm:^1.17.1, jiti@npm:^1.18.2, jiti@npm:^1.19.1, jiti@npm:^1.20.0, jiti@npm:^1.21.0": +"jiti@npm:^1.17.1, jiti@npm:^1.18.2, jiti@npm:^1.19.1, jiti@npm:^1.20.0, jiti@npm:^1.21.0, jiti@npm:^1.21.6": version: 1.21.6 resolution: "jiti@npm:1.21.6" bin: @@ -25134,6 +25344,15 @@ __metadata: languageName: node linkType: hard +"jsx-slack@npm:^6.1.1": + version: 6.1.1 + resolution: "jsx-slack@npm:6.1.1" + dependencies: + "@slack/types": "npm:^2.9.0" + checksum: 10/358819a8e1423f5dc68ab26d7f8c9468958c68c0d76bf45e68c3105d93e8eed724ea4be59156ce01dc61f5eaf337282b28134c1364c39f5cf3ce62a97be2c717 + languageName: node + linkType: hard + "jszip@npm:^3.10.1": version: 3.10.1 resolution: "jszip@npm:3.10.1" @@ -26181,6 +26400,15 @@ __metadata: languageName: node linkType: hard +"marked@npm:^14.0.0": + version: 14.0.0 + resolution: "marked@npm:14.0.0" + bin: + marked: bin/marked.js + checksum: 10/5f69e58e177bde75fb6145127c939c096d05494c5dff92d73af8a550097d6631c82e919f8a375e3743379a2623418151086b925a902a2be123590b887716f2bb + languageName: node + linkType: hard + "matcher@npm:^3.0.0": version: 3.0.0 resolution: "matcher@npm:3.0.0" @@ -27246,7 +27474,7 @@ __metadata: languageName: node linkType: hard -"mlly@npm:^1.4.2, mlly@npm:^1.7.0": +"mlly@npm:^1.4.2, mlly@npm:^1.7.0, mlly@npm:^1.7.1": version: 1.7.1 resolution: "mlly@npm:1.7.1" dependencies: @@ -27272,6 +27500,13 @@ __metadata: languageName: node linkType: hard +"mri@npm:^1.2.0": + version: 1.2.0 + resolution: "mri@npm:1.2.0" + checksum: 10/6775a1d2228bb9d191ead4efc220bd6be64f943ad3afd4dcb3b3ac8fc7b87034443f666e38805df38e8d047b29f910c3cc7810da0109af83e42c82c73bd3f6bc + languageName: node + linkType: hard + "mrmime@npm:^2.0.0": version: 2.0.0 resolution: "mrmime@npm:2.0.0" @@ -27615,7 +27850,7 @@ __metadata: languageName: node linkType: hard -"node-fetch-native@npm:^1.6.3, node-fetch-native@npm:^1.6.4": +"node-fetch-native@npm:^1.2.0, node-fetch-native@npm:^1.6.3, node-fetch-native@npm:^1.6.4": version: 1.6.4 resolution: "node-fetch-native@npm:1.6.4" checksum: 10/39c4c6d0c2a4bed1444943e1647ad0d79eb6638cf159bc37dffeafd22cffcf6a998e006aa1f3dd1d9d2258db7d78dee96b44bee4ba0bbaf0440ed348794f2543 @@ -28191,6 +28426,17 @@ __metadata: languageName: node linkType: hard +"ofetch@npm:^1.1.1, ofetch@npm:^1.3.4": + version: 1.3.4 + resolution: "ofetch@npm:1.3.4" + dependencies: + destr: "npm:^2.0.3" + node-fetch-native: "npm:^1.6.3" + ufo: "npm:^1.5.3" + checksum: 10/41630a6d8adeddb03fc9a9ae435d7da58a364e84df254640a3965ae5246fd627ef752ef46bc083996c2bfafa56837f1e8c6b69f07a97b5da4fa98f2c98119c0f + languageName: node + linkType: hard + "ohash@npm:^1.1.3": version: 1.1.3 resolution: "ohash@npm:1.1.3" @@ -28273,6 +28519,18 @@ __metadata: languageName: node linkType: hard +"open@npm:^9.1.0": + version: 9.1.0 + resolution: "open@npm:9.1.0" + dependencies: + default-browser: "npm:^4.0.0" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + is-wsl: "npm:^2.2.0" + checksum: 10/b45bcc7a6795804a2f560f0ca9f5e5344114bc40754d10c28a811c0c8f7027356979192931a6a7df2ab9e5bab3058988c99ae55f4fb71db2ce9fc77c40f619aa + languageName: node + linkType: hard + "openai@npm:^4.33.0, openai@npm:^4.53.2": version: 4.56.0 resolution: "openai@npm:4.56.0" @@ -28570,6 +28828,26 @@ __metadata: languageName: node linkType: hard +"p-queue@npm:^6": + version: 6.6.2 + resolution: "p-queue@npm:6.6.2" + dependencies: + eventemitter3: "npm:^4.0.4" + p-timeout: "npm:^3.2.0" + checksum: 10/60fe227ffce59fbc5b1b081305b61a2f283ff145005853702b7d4d3f99a0176bd21bb126c99a962e51fe1e01cb8aa10f0488b7bbe73b5dc2e84b5cc650b8ffd2 + languageName: node + linkType: hard + +"p-retry@npm:^4": + version: 4.6.2 + resolution: "p-retry@npm:4.6.2" + dependencies: + "@types/retry": "npm:0.12.0" + retry: "npm:^0.13.1" + checksum: 10/45c270bfddaffb4a895cea16cb760dcc72bdecb6cb45fef1971fa6ea2e91ddeafddefe01e444ac73e33b1b3d5d29fb0dd18a7effb294262437221ddc03ce0f2e + languageName: node + linkType: hard + "p-retry@npm:^6.2.0": version: 6.2.0 resolution: "p-retry@npm:6.2.0" @@ -28581,6 +28859,15 @@ __metadata: languageName: node linkType: hard +"p-timeout@npm:^3.2.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: "npm:^1.0.0" + checksum: 10/3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c + languageName: node + linkType: hard + "p-try@npm:^1.0.0": version: 1.0.0 resolution: "p-try@npm:1.0.0" @@ -28971,6 +29258,13 @@ __metadata: languageName: node linkType: hard +"perfect-debounce@npm:^1.0.0": + version: 1.0.0 + resolution: "perfect-debounce@npm:1.0.0" + checksum: 10/220343acf52976947958fef3599849471605316e924fe19c633ae2772576298e9d38f02cefa8db46f06607505ce7b232cbb35c9bfd477bd0329bd0a2ce37c594 + languageName: node + linkType: hard + "pg-int8@npm:1.0.1": version: 1.0.1 resolution: "pg-int8@npm:1.0.1" @@ -30171,6 +30465,16 @@ __metadata: languageName: node linkType: hard +"rc9@npm:^2.1.2": + version: 2.1.2 + resolution: "rc9@npm:2.1.2" + dependencies: + defu: "npm:^6.1.4" + destr: "npm:^2.0.3" + checksum: 10/0694d2a80579983a5e4f0452092d9f6a06b785b104b32f48f3d6bb263f637e53d9ebd1fd77a41b157b84c1c7e8e4ecc87c3824907738653a296e6d2faf3d1844 + languageName: node + linkType: hard + "rc@npm:^1.0.1, rc@npm:^1.1.6, rc@npm:^1.2.7": version: 1.2.8 resolution: "rc@npm:1.2.8" @@ -31465,6 +31769,15 @@ __metadata: languageName: node linkType: hard +"run-applescript@npm:^5.0.0": + version: 5.0.0 + resolution: "run-applescript@npm:5.0.0" + dependencies: + execa: "npm:^5.0.0" + checksum: 10/d00c2dbfa5b2d774de7451194b8b125f40f65fc183de7d9dcae97f57f59433586d3c39b9001e111c38bfa24c3436c99df1bb4066a2a0c90d39a8c4cd6889af77 + languageName: node + linkType: hard + "run-applescript@npm:^7.0.0": version: 7.0.0 resolution: "run-applescript@npm:7.0.0" @@ -31611,6 +31924,13 @@ __metadata: languageName: node linkType: hard +"scule@npm:^1.0.0": + version: 1.3.0 + resolution: "scule@npm:1.3.0" + checksum: 10/f2968b292e33c0eddca4a68b5c70f08dfc8479e492461c248f72873deaf77ae87c9f27dde7a342b3cb6394d2fae9665890b07a2243f79cff5cba65c9525ccf7e + languageName: node + linkType: hard + "select-hose@npm:^2.0.0": version: 2.0.0 resolution: "select-hose@npm:2.0.0" @@ -31653,7 +31973,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.6, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.1.3, semver@npm:^7.2.1, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.6, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.2": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -32633,7 +32953,7 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.5.0": +"std-env@npm:^3.4.2, std-env@npm:^3.5.0": version: 3.7.0 resolution: "std-env@npm:3.7.0" checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 @@ -33624,6 +33944,13 @@ __metadata: languageName: node linkType: hard +"titleize@npm:^3.0.0": + version: 3.0.0 + resolution: "titleize@npm:3.0.0" + checksum: 10/71fbbeabbfb36ccd840559f67f21e356e1d03da2915b32d2ae1a60ddcc13a124be2739f696d2feb884983441d159a18649e8d956648d591bdad35c430a6b6d28 + languageName: node + linkType: hard + "tmp-promise@npm:^3.0.2": version: 3.0.3 resolution: "tmp-promise@npm:3.0.3" @@ -34536,6 +34863,13 @@ __metadata: languageName: node linkType: hard +"untildify@npm:^4.0.0": + version: 4.0.0 + resolution: "untildify@npm:4.0.0" + checksum: 10/39ced9c418a74f73f0a56e1ba4634b4d959422dff61f4c72a8e39f60b99380c1b45ed776fbaa0a4101b157e4310d873ad7d114e8534ca02609b4916bb4187fb9 + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.1.0": version: 1.1.0 resolution: "update-browserslist-db@npm:1.1.0"