diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 89e91b2..389f736 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,80 +1,52 @@ -name: Release Full +# This action will publish the package to npm and create a GitHub release. +name: Release on: - workflow_dispatch: - inputs: - version: - type: choice - description: 'Release Version Type' - required: true - default: 'patch' - options: - - major - - premajor - - minor - - preminor - - patch - - prepatch - - prerelease - - tag: - type: choice - description: 'Release Npm Tag' - required: true - default: 'latest' - options: - - canary - - nightly - - latest - - beta - - alpha + # Run `npm run bump` to bump the version and create a git tag. + push: + tags: + - 'v*' - dry_run: - type: boolean - description: 'DryRun release' - required: true - default: false + workflow_dispatch: permissions: contents: write - # To publish packages with provenance id-token: write jobs: - release: - name: Release + publish: runs-on: ubuntu-latest environment: npm steps: - name: Checkout uses: actions/checkout@v6 - - name: Setup Pnpm - run: | - npm install -g corepack@latest - corepack enable - - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: 20 - cache: 'pnpm' + node-version: 24.11.1 # Update npm to the latest version to enable OIDC - - name: Update npm + # Use corepack to install pnpm + - name: Setup Package Managers run: | npm install -g npm@latest npm --version + npm install -g corepack@latest --force + corepack enable - name: Install Dependencies run: pnpm install - - name: Run Test - run: pnpm run test + - name: Build + run: pnpm run build - - name: Try release to npm - run: pnpm run release - env: - DRY_RUN: ${{ inputs.dry_run }} - TAG: ${{ inputs.tag }} - VERSION: ${{ inputs.version }} + - name: Publish + uses: JS-DevTools/npm-publish@v4 + with: + token: empty + + - name: Create GitHub Release + uses: ncipollo/release-action@v1 + with: + generateReleaseNotes: 'true' diff --git a/package.json b/package.json index d8d3837..4f29a3f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "prettier:ci": "prettier --check .", "test:install": "cross-env ./node_modules/.bin/puppeteer browsers install chrome", "test": "pnpm run test:install && pnpm run build && cross-env NO_COLOR=1 node --expose-gc --max-old-space-size=8192 --experimental-vm-modules ./node_modules/jest-cli/bin/jest --colors", - "release": "node ./scripts/release.mjs" + "bump": "npx bumpp" }, "simple-git-hooks": { "pre-commit": "npx nano-staged" @@ -70,8 +70,6 @@ "cross-env": "^7.0.3", "css-loader": "^7.1.2", "connect": "^3.7.0", - "execa": "9.3.0", - "fs-extra": "11.2.0", "graceful-fs": "4.2.10", "http-proxy": "^1.18.1", "hono": "^4.6.8", @@ -84,7 +82,6 @@ "puppeteer": "^24.34.0", "react-refresh": "0.14.0", "require-from-string": "^2.0.2", - "semver": "7.6.3", "simple-git-hooks": "^2.11.1", "sockjs-client": "^1.6.1", "style-loader": "^4.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d959d4a..83afc8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,15 +63,9 @@ importers: css-loader: specifier: ^7.1.2 version: 7.1.2(@rspack/core@1.7.0-beta.0)(webpack@5.94.0) - execa: - specifier: 9.3.0 - version: 9.3.0 express: specifier: ^5.2.1 version: 5.2.1 - fs-extra: - specifier: 11.2.0 - version: 11.2.0 graceful-fs: specifier: 4.2.10 version: 4.2.10 @@ -108,9 +102,6 @@ importers: require-from-string: specifier: ^2.0.2 version: 2.0.2 - semver: - specifier: 7.6.3 - version: 7.6.3 simple-git-hooks: specifier: ^2.11.1 version: 2.11.1 @@ -599,16 +590,9 @@ packages: react-refresh: optional: true - '@sec-ant/readable-stream@0.4.1': - resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} - '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/merge-streams@4.0.0': - resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} - engines: {node: '>=18'} - '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -1448,10 +1432,6 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} - execa@9.3.0: - resolution: {integrity: sha512-l6JFbqnHEadBoVAVpN5dl2yCyfX28WoBAGaoQcNmLLSedOxTxcn2Qa83s8I/PA5i56vWru2OHOtrwF7Om2vqlg==} - engines: {node: ^18.19.0 || >=20.5.0} - exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -1498,10 +1478,6 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - figures@6.1.0: - resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} - engines: {node: '>=18'} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -1598,10 +1574,6 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} - get-stream@9.0.1: - resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} - engines: {node: '>=18'} - get-uri@6.0.3: resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} engines: {node: '>= 14'} @@ -1724,10 +1696,6 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} - human-signals@7.0.0: - resolution: {integrity: sha512-74kytxOUSvNbjrT9KisAbaTZ/eJwD/LrbM/kh5j0IhPuJzwuA19dWvniFGwBzN9rVjg+O/e+F310PjObDXS+9Q==} - engines: {node: '>=18.18.0'} - hyperdyperid@1.2.0: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} @@ -1834,10 +1802,6 @@ packages: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} @@ -1845,14 +1809,6 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-stream@4.0.1: - resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} - engines: {node: '>=18'} - - is-unicode-supported@2.1.0: - resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} - engines: {node: '>=18'} - is-url@1.2.4: resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} @@ -2251,10 +2207,6 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - object-inspect@1.13.2: resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} engines: {node: '>= 0.4'} @@ -2325,10 +2277,6 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} - parse-ms@4.0.0: - resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} - engines: {node: '>=18'} - parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -2345,10 +2293,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -2420,10 +2364,6 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - pretty-ms@9.1.0: - resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} - engines: {node: '>=18'} - process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -2660,10 +2600,6 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-git-hooks@2.11.1: resolution: {integrity: sha512-tgqwPUMDcNDhuf1Xf6KTUsyeqGdgKMhzaH4PAZZuzguOgTl5uuyeYe/8mWgAr6IBxB5V06uqEf6Dy37gIWDtDg==} hasBin: true @@ -2776,10 +2712,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - strip-final-newline@4.0.0: - resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} - engines: {node: '>=18'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -3105,10 +3037,6 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - yoctocolors@2.1.1: - resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} - engines: {node: '>=18'} - zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -3693,12 +3621,8 @@ snapshots: optionalDependencies: react-refresh: 0.14.0 - '@sec-ant/readable-stream@0.4.1': {} - '@sinclair/typebox@0.27.8': {} - '@sindresorhus/merge-streams@4.0.0': {} - '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -4591,21 +4515,6 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 - execa@9.3.0: - dependencies: - '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.3 - figures: 6.1.0 - get-stream: 9.0.1 - human-signals: 7.0.0 - is-plain-obj: 4.1.0 - is-stream: 4.0.1 - npm-run-path: 5.3.0 - pretty-ms: 9.1.0 - signal-exit: 4.1.0 - strip-final-newline: 4.0.0 - yoctocolors: 2.1.1 - exit@0.1.2: {} expect@29.7.0: @@ -4717,10 +4626,6 @@ snapshots: dependencies: pend: 1.2.0 - figures@6.1.0: - dependencies: - is-unicode-supported: 2.1.0 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -4837,11 +4742,6 @@ snapshots: get-stream@6.0.1: {} - get-stream@9.0.1: - dependencies: - '@sec-ant/readable-stream': 0.4.1 - is-stream: 4.0.1 - get-uri@6.0.3: dependencies: basic-ftp: 5.0.5 @@ -4988,8 +4888,6 @@ snapshots: human-signals@2.1.0: {} - human-signals@7.0.0: {} - hyperdyperid@1.2.0: {} iconv-lite@0.4.24: @@ -5068,16 +4966,10 @@ snapshots: is-plain-obj@3.0.0: {} - is-plain-obj@4.1.0: {} - is-promise@4.0.0: {} is-stream@2.0.1: {} - is-stream@4.0.1: {} - - is-unicode-supported@2.1.0: {} - is-url@1.2.4: {} is-wsl@3.1.0: @@ -5616,10 +5508,6 @@ snapshots: dependencies: path-key: 3.1.1 - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - object-inspect@1.13.2: {} object-inspect@1.13.4: {} @@ -5700,8 +5588,6 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 - parse-ms@4.0.0: {} - parseurl@1.3.3: {} path-exists@4.0.0: {} @@ -5710,8 +5596,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-to-regexp@0.1.12: {} @@ -5772,10 +5656,6 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - pretty-ms@9.1.0: - dependencies: - parse-ms: 4.0.0 - process-nextick-args@2.0.1: {} progress@2.0.3: {} @@ -6096,8 +5976,6 @@ snapshots: signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - simple-git-hooks@2.11.1: {} sisteransi@1.0.5: {} @@ -6232,8 +6110,6 @@ snapshots: strip-final-newline@2.0.0: {} - strip-final-newline@4.0.0: {} - strip-json-comments@3.1.1: {} style-loader@4.0.0(webpack@5.94.0): @@ -6575,6 +6451,4 @@ snapshots: yocto-queue@0.1.0: {} - yoctocolors@2.1.1: {} - zod@3.25.76: {} diff --git a/scripts/release.mjs b/scripts/release.mjs deleted file mode 100644 index 243ecfe..0000000 --- a/scripts/release.mjs +++ /dev/null @@ -1,70 +0,0 @@ -import path from 'node:path'; -import * as url from 'node:url'; -import { $ } from 'execa'; -import fs from 'fs-extra'; -import { inc } from 'semver'; - -const RELEASE_TAG = process.env.TAG || 'beta'; -const RELEASE_DRY_RUN = process.env.DRY_RUN || 'true'; -const RELEASE_VERSION_TYPE = process.env.VERSION || 'prerelease'; - -const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); -const PKG_PATH = path.resolve(__dirname, '../package.json'); -const pkg = fs.readJsonSync(PKG_PATH); -const currentVersion = pkg.version; -const nextVersion = inc(currentVersion, RELEASE_VERSION_TYPE); -if (!nextVersion) { - throw new Error( - `Failed to generate next version from "${currentVersion}" with type "${RELEASE_VERSION_TYPE}"`, - ); -} - -console.info(`Release ${RELEASE_TAG} version ${nextVersion}`); - -// Update pkg version -console.info(`Updating version from ${currentVersion} to ${nextVersion}`); -pkg.version = nextVersion; -fs.writeJsonSync(PKG_PATH, pkg, { spaces: 2 }); - -// Publish to npm -console.info(`Publishing to npm with tag ${RELEASE_TAG}`); -const dryRun = RELEASE_DRY_RUN === 'true' ? ['--dry-run'] : []; -try { - await $`pnpm publish ${dryRun} --tag ${RELEASE_TAG} --no-git-checks --provenance`; - console.info('Published successfully'); -} catch (e) { - console.error(`Publish failed: ${e.message}`); - process.exit(1); -} finally { -} - -// Push tag to github -if (RELEASE_DRY_RUN !== 'true') { - console.info('Pushing tag to github'); - const tagName = `v${nextVersion}`; - try { - await $`git config --global --add safe.directory /github/workspace`; - await $`git config --global user.name "github-actions[bot]"`; - await $`git config --global user.email "github-actions[bot]@users.noreply.github.com"`; - await $`git status`; - await $`git tag ${tagName}`; - await $`git push origin ${tagName}`; - console.info('Pushed tag successfully'); - } catch (e) { - console.error(`Push tag failed: ${e.message}`); - process.exit(1); - } - - try { - await $`git add --all`; - const commitMsg = `release ${tagName}`; - await $`git commit -m ${commitMsg}`; - await $`git push`; - console.info('Pushed branch successfully'); - } catch (e) { - console.error(`Update branch failed: ${e.message}`); - process.exit(1); - } -} - -console.info('Release completed');