diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90e93f48f..4c6014b3d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,12 +10,12 @@ on: push: branches: - - main + - stable - 'v[0-9]+*' # prior release branches (e.g. `v0.30.x` branch) tags: - 'v*' pull_request: - branches: [main] + branches: [stable] concurrency: group: ci-${{ github.head_ref || github.ref }} diff --git a/.github/workflows/publish-stable.yml b/.github/workflows/publish-stable.yml index d601f5248..de23c3fa3 100644 --- a/.github/workflows/publish-stable.yml +++ b/.github/workflows/publish-stable.yml @@ -8,10 +8,7 @@ on: workflow_dispatch: push: branches: - - main - -env: - VOLTA_FEATURE_PNPM: 1 + - stable concurrency: group: publish-stable-${{ github.head_ref || github.ref }} @@ -25,10 +22,10 @@ jobs: command: ${{ steps.check-release.outputs.command }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 0 - ref: 'main' + ref: 'stable' # This will only cause the `check-plan` job to have a result of `success` # when the .release-plan.json file was changed on the last commit. This # plus the fact that this action only runs on main will be enough of a guard @@ -42,18 +39,18 @@ jobs: if: needs.check-plan.outputs.command == 'release' steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - uses: ./.github/actions/setup with: use_pinned_node: "true" - - name: Install Node - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: # This creates an .npmrc that reads the NODE_AUTH_TOKEN environment variable registry-url: 'https://registry.npmjs.org' - name: npm publish - run: node ./test-packages/release/src/cli.js publish + run: pnpm release-plan publish + env: GITHUB_AUTH: ${{ secrets.GITHUB_TOKEN }} NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/release-plan-preview.yml b/.github/workflows/release-plan-preview.yml index 829578bab..71682c371 100644 --- a/.github/workflows/release-plan-preview.yml +++ b/.github/workflows/release-plan-preview.yml @@ -2,18 +2,45 @@ name: Release Plan Review on: push: branches: - - main + - stable + pull_request: + types: + - labeled + +concurrency: + group: plan-release # only the latest one of these should ever be running + cancel-in-progress: true jobs: + check-plan: + name: "Check Release Plan" + runs-on: ubuntu-latest + outputs: + command: ${{ steps.check-release.outputs.command }} + + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: 'stable' + # This will only cause the `check-plan` job to have a "command" of `release` + # when the .release-plan.json file was changed on the last commit. + - id: check-release + run: if git diff --name-only HEAD HEAD~1 | grep -w -q ".release-plan.json"; then echo "command=release"; fi >> $GITHUB_OUTPUT + prepare_release_notes: name: Prepare Release Notes runs-on: ubuntu-latest timeout-minutes: 5 + needs: check-plan outputs: explanation: ${{ steps.explanation.outputs.text }} + # only run on push event if plan wasn't updated (don't create a release plan when we're releasing) + # only run on labeled event if the PR has already been merged + if: (github.event_name == 'push' && needs.check-plan.outputs.command != 'release') || (github.event_name == 'pull_request' && github.event.pull_request.merged == true) steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # We need to download lots of history so that # lerna-changelog can discover what's changed since the last release with: @@ -21,17 +48,14 @@ jobs: - uses: ./.github/actions/setup with: use_pinned_node: true + - name: "Generate Explanation and Prep Changelogs" id: explanation run: | - # Print each command out to the terminal before running set -x - # For an unknown reason the `pnpm embroider-release` bin is not - # wired up as it is locally. - node ./test-packages/release/src/cli.js prepare - # Don't print this, because it can be very large - set +x - # Have to use this EOF syntax for multi-line strings. + + pnpm release-plan prepare + echo 'text<> $GITHUB_OUTPUT jq .description .release-plan.json -r >> $GITHUB_OUTPUT echo 'EOF' >> $GITHUB_OUTPUT @@ -40,15 +64,13 @@ jobs: - uses: peter-evans/create-pull-request@v5 with: - commit-message: "Prepare Release using 'embroider-release'" + commit-message: "Prepare Release using 'release-plan'" author: "github-actions[bot] " labels: "internal" - branch: embroider-release-preview + branch: release-preview-stable title: Prepare Release body: | - Preview of the Release. - - See `.github/workflows/release-plan-preview.yml` for how this PR was created. + This PR is a preview of the release that [release-plan](https://github.com/embroider-build/release-plan) has prepared. To release you should just merge this PR 👍 ----------------------------------------- diff --git a/RELEASE.md b/RELEASE.md index aca734ce0..30735591c 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -1,26 +1,27 @@ # Release Process -1. You need a github token as `GITHUB_AUTH` environment variable. +Releases in this repo are mostly automated using [release-plan](https://github.com/embroider-build/release-plan/). Once you label all your PRs correctly (see below) you will have an automatically generated PR that updates your CHANGELOG.md file and a `.release-plan.json` that is used prepare the release once the PR is merged. -2. Run `pnpm embroider-release explain-plan`. If there are unlabeled PRs that need to be released it will complain and show you a list of them. Each PR needs to be labeled with one of: - - breaking - - enhancement - - bug - - documentation - - internal +## Preparation -3. Once all the PRs are labeled, it will instead show you the release plan, explaining which packages are getting released, at which versions, and why. +Since the majority of the actual release process is automated, the remaining tasks before releasing are: -4. If you disagree with the plan, you can modify the list of changes before using it to `explain-plan` or `prepare` a release: +- correctly labeling **all** pull requests that have been merged since the last release +- updating pull request titles so they make sense to our users - - `pnpm embroider-release gather-changes > /tmp/changelog` - - edit `/tmp/changelog` - - `pnpm embroider-release explain-plan --from-stdin < /tmp/changelog` +Some great information on why this is important can be found at [keepachangelog.com](https://keepachangelog.com/en/1.1.0/), but the overall +guiding principle here is that changelogs are for humans, not machines. - For example, this can be necessary if a PR that's labeled `breaking` touches multiple packages and only one of those packages is actually a breaking change. In that case you can take the other package names out of the description of the PR. +When reviewing merged PR's the labels to be used are: -5. Once you're happy with the plan, run `pnpm embroider-release prepare`. This will edit CHANGELOG.md, bump the version numbers in package.json files, and create a file named `.release-plan.json`. Make a PR with these changes. +* breaking - Used when the PR is considered a breaking change. +* enhancement - Used when the PR adds a new feature or enhancement. +* bug - Used when the PR fixes a bug included in a previous release. +* documentation - Used when the PR adds or updates documentation. +* internal - Internal changes or things that don't fit in any other category. -6. Once the PR is merged, in a clean local repo at the merge commit, run `pnpm embroider-release publish`. +**Note:** `release-plan` requires that **all** PRs are labeled. If a PR doesn't fit in a category it's fine to label it as `internal` - \ No newline at end of file +## Release + +Once the prep work is completed, the actual release is straight forward: you just need to merge the open [Plan Release](https://github.com/embroider-build/embroider/pulls?q=is%3Apr+is%3Aopen+%22Prepare+Release%22+in%3Atitle) PR diff --git a/package.json b/package.json index d36b4f29b..92ed17395 100644 --- a/package.json +++ b/package.json @@ -36,7 +36,6 @@ } }, "devDependencies": { - "@embroider/release": "workspace:*", "@types/jest": "^29.2.0", "@typescript-eslint/eslint-plugin": "^5.59.5", "@typescript-eslint/parser": "^5.59.5", @@ -48,6 +47,7 @@ "eslint-plugin-prettier": "^4.2.1", "jest": "^29.2.1", "prettier": "^2.3.1", + "release-plan": "^0.4.1", "typescript": "^5.1.6" }, "publishConfig": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4edb36992..c97d6dfd5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,9 +13,6 @@ importers: .: devDependencies: - '@embroider/release': - specifier: workspace:* - version: link:test-packages/release '@types/jest': specifier: ^29.2.0 version: 29.5.10 @@ -49,6 +46,9 @@ importers: prettier: specifier: ^2.3.1 version: 2.8.8 + release-plan: + specifier: ^0.4.1 + version: 0.4.1 typescript: specifier: ^5.1.6 version: 5.3.2 @@ -1037,57 +1037,6 @@ importers: specifier: ^5.38.1 version: 5.89.0 - test-packages/release: - dependencies: - '@ef4/lerna-changelog': - specifier: ^1.0.4 - version: 1.0.4 - '@octokit/rest': - specifier: ^19.0.8 - version: 19.0.13 - '@types/fs-extra': - specifier: ^9.0.12 - version: 9.0.13 - '@types/js-yaml': - specifier: ^4.0.5 - version: 4.0.9 - '@types/semver': - specifier: ^7.3.6 - version: 7.5.6 - '@types/yargs': - specifier: ^17.0.3 - version: 17.0.32 - assert-never: - specifier: ^1.2.1 - version: 1.2.1 - chalk: - specifier: ^4.1.1 - version: 4.1.2 - cli-highlight: - specifier: ^2.1.11 - version: 2.1.11 - execa: - specifier: ^4.0.3 - version: 4.1.0 - fs-extra: - specifier: ^10.0.0 - version: 10.1.0 - globby: - specifier: ^11.0.3 - version: 11.1.0 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - latest-version: - specifier: ^5.0.0 - version: 5.1.0 - semver: - specifier: ^7.3.5 - version: 7.5.4 - yargs: - specifier: ^17.0.1 - version: 17.7.2 - test-packages/sample-transforms: dependencies: ember-cli-babel: @@ -3469,7 +3418,7 @@ packages: yargs: 11.1.1 transitivePeerDependencies: - supports-color - dev: false + dev: true /@ember-data/adapter@3.28.13(@babel/core@7.23.3): resolution: {integrity: sha512-AwLJTs+GvxX72vfP3edV0hoMLD9oPWJNbnqxakXVN9xGTuk6/TeGQLMrVU3222GCoMMNrJ357Nip7kZeFo4IdA==} @@ -5556,6 +5505,18 @@ packages: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} engines: {node: '>=8'} @@ -5865,10 +5826,48 @@ packages: '@nodelib/fs.scandir': 2.1.5 fastq: 1.15.0 + /@npmcli/git@5.0.3: + resolution: {integrity: sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/promise-spawn': 7.0.0 + lru-cache: 10.1.0 + npm-pick-manifest: 9.0.0 + proc-log: 3.0.0 + promise-inflight: 1.0.1(bluebird@3.7.2) + promise-retry: 2.0.1 + semver: 7.5.4 + which: 4.0.0 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/package-json@5.0.0: + resolution: {integrity: sha512-OI2zdYBLhQ7kpNPaJxiflofYIpkNLi+lnGdzqUOfRmCF3r2l1nadcjtCYMJKv/Utm/ZtlffaUuTiAktPHbc17g==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/git': 5.0.3 + glob: 10.3.10 + hosted-git-info: 7.0.1 + json-parse-even-better-errors: 3.0.1 + normalize-package-data: 6.0.0 + proc-log: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - bluebird + dev: true + + /@npmcli/promise-spawn@7.0.0: + resolution: {integrity: sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + which: 4.0.0 + dev: true + /@octokit/auth-token@3.0.4: resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} engines: {node: '>= 14'} - dev: false + dev: true /@octokit/core@4.2.4: resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} @@ -5883,7 +5882,7 @@ packages: universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: false + dev: true /@octokit/endpoint@7.0.6: resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} @@ -5892,7 +5891,7 @@ packages: '@octokit/types': 9.3.2 is-plain-object: 5.0.0 universal-user-agent: 6.0.1 - dev: false + dev: true /@octokit/graphql@5.0.6: resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} @@ -5903,11 +5902,11 @@ packages: universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: false + dev: true /@octokit/openapi-types@18.1.1: resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} - dev: false + dev: true /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} @@ -5918,7 +5917,7 @@ packages: '@octokit/core': 4.2.4 '@octokit/tsconfig': 1.0.2 '@octokit/types': 9.3.2 - dev: false + dev: true /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} @@ -5926,7 +5925,7 @@ packages: '@octokit/core': '>=3' dependencies: '@octokit/core': 4.2.4 - dev: false + dev: true /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} @@ -5936,7 +5935,7 @@ packages: dependencies: '@octokit/core': 4.2.4 '@octokit/types': 10.0.0 - dev: false + dev: true /@octokit/request-error@3.0.3: resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} @@ -5945,7 +5944,7 @@ packages: '@octokit/types': 9.3.2 deprecation: 2.3.1 once: 1.4.0 - dev: false + dev: true /@octokit/request@6.2.8: resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} @@ -5959,7 +5958,7 @@ packages: universal-user-agent: 6.0.1 transitivePeerDependencies: - encoding - dev: false + dev: true /@octokit/rest@19.0.13: resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} @@ -5971,23 +5970,30 @@ packages: '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) transitivePeerDependencies: - encoding - dev: false + dev: true /@octokit/tsconfig@1.0.2: resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} - dev: false + dev: true /@octokit/types@10.0.0: resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} dependencies: '@octokit/openapi-types': 18.1.1 - dev: false + dev: true /@octokit/types@9.3.2: resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} dependencies: '@octokit/openapi-types': 18.1.1 - dev: false + dev: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true /@pnpm/constants@7.1.1: resolution: {integrity: sha512-31pZqMtjwV+Vaq7MaPrT1EoDFSYwye3dp6BiHIGRJmVThCQwySRKM7hCvqqI94epNkqFAAYoWrNynWoRYosGdw==} @@ -6132,6 +6138,7 @@ packages: /@sindresorhus/is@0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} + dev: true /@sindresorhus/is@0.7.0: resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==} @@ -6158,6 +6165,7 @@ packages: engines: {node: '>=6'} dependencies: defer-to-connect: 1.1.3 + dev: true /@tootallnate/once@1.1.2: resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} @@ -6338,6 +6346,7 @@ packages: resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} dependencies: '@types/node': 15.14.9 + dev: true /@types/glob@7.2.0: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} @@ -6389,6 +6398,7 @@ packages: /@types/js-yaml@4.0.9: resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==} + dev: true /@types/jsdom@16.2.15: resolution: {integrity: sha512-nwF87yjBKuX/roqGYerZZM0Nv1pZDMAT5YhOHYeM/72Fic+VEqJh4nyoqoapzJnW3pUlfxPY5FhgsJtM+dRnQQ==} @@ -6409,6 +6419,7 @@ packages: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: '@types/node': 15.14.9 + dev: true /@types/lodash@4.14.202: resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} @@ -6487,6 +6498,7 @@ packages: resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} dependencies: '@types/node': 15.14.9 + dev: true /@types/rimraf@2.0.5: resolution: {integrity: sha512-YyP+VfeaqAyFmXoTh3HChxOQMyjByRMsHU7kc5KOJkSlXudhMhQIALbYV7rHh/l8d2lX3VUQzprrcAgWdRuU8g==} @@ -6500,6 +6512,7 @@ packages: /@types/semver@7.5.6: resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -7074,14 +7087,14 @@ packages: engines: {node: '>= 4.0.0'} dependencies: es6-promisify: 5.0.0 - dev: false + dev: true /agent-base@4.3.0: resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==} engines: {node: '>= 4.0.0'} dependencies: es6-promisify: 5.0.0 - dev: false + dev: true /agent-base@6.0.2(supports-color@8.1.1): resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} @@ -7096,7 +7109,7 @@ packages: engines: {node: '>= 4.0.0'} dependencies: humanize-ms: 1.2.1 - dev: false + dev: true /aggregate-error@3.1.0: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} @@ -7205,6 +7218,11 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles@2.2.1: resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} engines: {node: '>=0.10.0'} @@ -7225,6 +7243,11 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + /ansi-to-html@0.6.15: resolution: {integrity: sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==} engines: {node: '>=8.0.0'} @@ -7237,7 +7260,7 @@ packages: /any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - dev: false + dev: true /anymatch@2.0.0: resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} @@ -7263,7 +7286,7 @@ packages: /aproba@1.2.0: resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} - dev: false + dev: true /aproba@2.0.0: resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} @@ -8266,7 +8289,7 @@ packages: /before-after-hook@2.2.3: resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} - dev: false + dev: true /big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -9185,7 +9208,7 @@ packages: ssri: 6.0.2 unique-filename: 1.1.1 y18n: 4.0.3 - dev: false + dev: true /cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} @@ -9224,6 +9247,7 @@ packages: lowercase-keys: 2.0.0 normalize-url: 4.5.1 responselike: 1.0.2 + dev: true /calculate-cache-key-for-tree@2.0.0: resolution: {integrity: sha512-Quw8a6y8CPmRd6eU+mwypktYCwUcf8yVFIRbNZ6tPQEckX9yd+EBVEPC/GSZZrMWH9e7Vz4pT7XhpmyApRByLQ==} @@ -9255,7 +9279,7 @@ packages: /camelcase@4.1.0: resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} engines: {node: '>=4'} - dev: false + dev: true /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} @@ -9347,7 +9371,7 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false + dev: true /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -9433,7 +9457,7 @@ packages: parse5: 5.1.1 parse5-htmlparser2-tree-adapter: 6.0.1 yargs: 16.2.0 - dev: false + dev: true /cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} @@ -9473,7 +9497,7 @@ packages: string-width: 2.1.1 strip-ansi: 4.0.0 wrap-ansi: 2.1.0 - dev: false + dev: true /cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -9500,6 +9524,7 @@ packages: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} dependencies: mimic-response: 1.0.1 + dev: true /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} @@ -9554,7 +9579,7 @@ packages: /code-point-at@1.1.0: resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} engines: {node: '>=0.10.0'} - dev: false + dev: true /collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -9685,7 +9710,7 @@ packages: inherits: 2.0.4 readable-stream: 2.3.8 typedarray: 0.0.6 - dev: false + dev: true /concurrently@7.6.0: resolution: {integrity: sha512-BKtRgvcJGeZ4XttiDiNcFiRlxoAeZOseqUvyYRUp/Vtd+9p1ULmeoSqGsDA+2ivdeDFpqrJvGvmI+StKfKl5hw==} @@ -9968,7 +9993,7 @@ packages: mkdirp: 0.5.6 rimraf: 2.7.1 run-queue: 1.0.3 - dev: false + dev: true /copy-dereference@1.0.0: resolution: {integrity: sha512-40TSLuhhbiKeszZhK9LfNdazC67Ue4kq/gGwN5sdxEUWPXTIMmKmGmgD9mPfNKVAeecEW+NfEIpBaZoACCQLLw==} @@ -10186,7 +10211,7 @@ packages: /cyclist@1.0.2: resolution: {integrity: sha512-0sVXIohTfLqVIW3kb/0n6IiWF3Ifj5nm2XaSrLq2DI6fKIGa2fYAZdk917rUneaeLVpYfFcyXE2ft0fe3remsA==} - dev: false + dev: true /dag-map@2.0.2: resolution: {integrity: sha512-xnsprIzYuDeiyu5zSKwilV/ajRHxnoMlAhEREfyfTgTSViMVY2fGP1ZcHJbtwup26oCkofySU/m6oKJ3HrkW7w==} @@ -10242,7 +10267,7 @@ packages: optional: true dependencies: ms: 2.0.0 - dev: false + dev: true /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} @@ -10277,6 +10302,7 @@ packages: /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + dev: true /decamelize@5.0.1: resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==} @@ -10295,6 +10321,7 @@ packages: engines: {node: '>=4'} dependencies: mimic-response: 1.0.1 + dev: true /dedent@1.5.1: resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} @@ -10308,6 +10335,7 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} + dev: true /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -10324,6 +10352,7 @@ packages: /defer-to-connect@1.1.3: resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==} + dev: true /define-data-property@1.1.1: resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} @@ -10391,7 +10420,7 @@ packages: /deprecation@2.3.1: resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - dev: false + dev: true /dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} @@ -10506,6 +10535,7 @@ packages: /duplexer3@0.1.5: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} + dev: true /duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} @@ -10514,7 +10544,11 @@ packages: inherits: 2.0.4 readable-stream: 2.3.8 stream-shift: 1.0.1 - dev: false + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true /editions@1.3.4: resolution: {integrity: sha512-gzao+mxnYDzIysXKMQi/+M1mjy/rjestjg6OPoYTtI+3Izp23oiGZitsl9lPDPiTGXbcSIk1iJWhliSaglxnUg==} @@ -13804,6 +13838,10 @@ packages: /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + /emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} @@ -13816,7 +13854,7 @@ packages: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} dependencies: iconv-lite: 0.6.3 - dev: false + dev: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -13880,7 +13918,11 @@ packages: /err-code@1.1.2: resolution: {integrity: sha512-CJAN+O0/yA1CKfRn9SXOGctSpEM7DCon/r/5r2eXFMY2zCCJBasFhcM5I+1kh3Ap11FsQCX+vGHceNPvpWKhoA==} - dev: false + dev: true + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true /errlop@2.2.0: resolution: {integrity: sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw==} @@ -13972,13 +14014,13 @@ packages: /es6-promise@4.2.8: resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - dev: false + dev: true /es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} dependencies: es6-promise: 4.2.8 - dev: false + dev: true /esbuild@0.18.20: resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} @@ -14679,7 +14721,7 @@ packages: p-finally: 1.0.0 signal-exit: 3.0.7 strip-eof: 1.0.0 - dev: false + dev: true /execa@1.0.0: resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} @@ -14990,7 +15032,7 @@ packages: /figgy-pudding@3.5.2: resolution: {integrity: sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==} - dev: false + dev: true /figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} @@ -15301,7 +15343,7 @@ packages: dependencies: inherits: 2.0.4 readable-stream: 2.3.8 - dev: false + dev: true /focus-trap@6.9.4: resolution: {integrity: sha512-v2NTsZe2FF59Y+sDykKY+XjqZ0cPfhq/hikWVL88BqLivnNiEffAsac6rP6H45ff9wG9LL5ToiDqrLEP9GX9mw==} @@ -15327,6 +15369,14 @@ packages: resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} engines: {node: '>=0.10.0'} + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + /form-data@3.0.1: resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} engines: {node: '>= 6'} @@ -15363,6 +15413,7 @@ packages: dependencies: inherits: 2.0.4 readable-stream: 2.3.8 + dev: true /fs-extra@0.24.0: resolution: {integrity: sha512-w1RvhdLZdU9V3vQdL+RooGlo6b9R9WVoBanOfoJvosWlqSKvrjFlci2oVhwvLwZXBtM7khyPvZ8r3fwsim3o0A==} @@ -15498,7 +15549,7 @@ packages: iferr: 0.1.5 imurmurhash: 0.1.4 readable-stream: 2.3.8 - dev: false + dev: true /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -15553,7 +15604,7 @@ packages: /get-caller-file@1.0.3: resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - dev: false + dev: true /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} @@ -15589,6 +15640,7 @@ packages: /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} engines: {node: '>=4'} + dev: true /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} @@ -15646,6 +15698,18 @@ packages: /glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: true + /glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} dependencies: @@ -15837,6 +15901,7 @@ packages: p-cancelable: 1.1.0 to-readable-stream: 1.0.0 url-parse-lax: 3.0.0 + dev: true /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -15998,7 +16063,7 @@ packages: /highlight.js@10.7.3: resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} - dev: false + dev: true /home-or-tmp@2.0.0: resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} @@ -16038,6 +16103,13 @@ packages: lru-cache: 7.18.3 dev: true + /hosted-git-info@7.0.1: + resolution: {integrity: sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + lru-cache: 10.1.0 + dev: true + /html-encoding-sniffer@2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} @@ -16062,9 +16134,11 @@ packages: /http-cache-semantics@3.8.1: resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==} + dev: true /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: true /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} @@ -16096,7 +16170,7 @@ packages: debug: 3.1.0 transitivePeerDependencies: - supports-color - dev: false + dev: true /http-proxy-agent@4.0.1(supports-color@8.1.1): resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} @@ -16137,7 +16211,7 @@ packages: debug: 3.2.7 transitivePeerDependencies: - supports-color - dev: false + dev: true /https-proxy-agent@5.0.1(supports-color@8.1.1): resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} @@ -16168,7 +16242,7 @@ packages: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} dependencies: ms: 2.1.3 - dev: false + dev: true /iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} @@ -16196,7 +16270,7 @@ packages: /iferr@0.1.5: resolution: {integrity: sha512-DUNFN5j7Tln0D+TxzloUjKB+CtVu6myn0JEFak6dG18mNt9YkQ6lzGCdafwofISZ1lLF3xRHJ98VKy9ynkcFaA==} - dev: false + dev: true /ignore@4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} @@ -16381,7 +16455,7 @@ packages: /invert-kv@2.0.0: resolution: {integrity: sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==} engines: {node: '>=4'} - dev: false + dev: true /invert-kv@3.0.1: resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==} @@ -16390,7 +16464,7 @@ packages: /ip@1.1.5: resolution: {integrity: sha512-rBtCAQAJm8A110nbwn6YdveUnuZH3WrC36IwkRXxDnq53JvXA2NVQvB7IHyKomxK1MJ4VDNw3UtFDdXQ+AvLYA==} - dev: false + dev: true /ipaddr.js@1.9.1: resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} @@ -16499,7 +16573,7 @@ packages: engines: {node: '>=0.10.0'} dependencies: number-is-nan: 1.0.1 - dev: false + dev: true /is-fullwidth-code-point@2.0.0: resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} @@ -16600,6 +16674,7 @@ packages: /is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + dev: true /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -16712,6 +16787,11 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: true + /isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} @@ -16805,6 +16885,15 @@ packages: is-object: 1.0.2 dev: true + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -17355,6 +17444,7 @@ packages: /json-buffer@3.0.0: resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=} + dev: true /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} @@ -17366,6 +17456,11 @@ packages: /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + /json-parse-even-better-errors@3.0.1: + resolution: {integrity: sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -17437,6 +17532,7 @@ packages: resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==} dependencies: json-buffer: 3.0.0 + dev: true /keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -17491,14 +17587,14 @@ packages: engines: {node: '>=8'} dependencies: package-json: 6.5.0 - dev: false + dev: true /lcid@2.0.0: resolution: {integrity: sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==} engines: {node: '>=6'} dependencies: invert-kv: 2.0.0 - dev: false + dev: true /lcid@3.1.1: resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==} @@ -17793,10 +17889,17 @@ packages: /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} + dev: true /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} + dev: true + + /lru-cache@10.1.0: + resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} + engines: {node: 14 || >=16.14} + dev: true /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -17865,7 +17968,7 @@ packages: ssri: 6.0.2 transitivePeerDependencies: - supports-color - dev: false + dev: true /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -17877,6 +17980,7 @@ packages: engines: {node: '>=6'} dependencies: p-defer: 1.0.0 + dev: true /map-cache@0.2.2: resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} @@ -18014,7 +18118,7 @@ packages: map-age-cleaner: 0.1.3 mimic-fn: 2.1.0 p-is-promise: 2.1.0 - dev: false + dev: true /mem@5.1.1: resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==} @@ -18150,6 +18254,7 @@ packages: /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} + dev: true /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} @@ -18184,6 +18289,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist-options@4.1.0: resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} engines: {node: '>= 6'} @@ -18205,6 +18317,11 @@ packages: safe-buffer: 5.2.1 yallist: 3.1.1 + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + /mississippi@3.0.0: resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} engines: {node: '>=4.0.0'} @@ -18219,7 +18336,7 @@ packages: pumpify: 1.5.1 stream-each: 1.2.3 through2: 2.0.5 - dev: false + dev: true /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} @@ -18280,7 +18397,7 @@ packages: mkdirp: 0.5.6 rimraf: 2.7.1 run-queue: 1.0.3 - dev: false + dev: true /mr-dep-walk@1.4.0: resolution: {integrity: sha512-UaDUqkLsd0ep3jAx2+A7BIpfw8wKxhthDj3yPNLBnevipK1CUFJJiz24jRVLw18q7R2aEiRq13WwUBlnwfbQqQ==} @@ -18321,7 +18438,7 @@ packages: any-promise: 1.3.0 object-assign: 4.1.1 thenify-all: 1.6.0 - dev: false + dev: true /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} @@ -18379,7 +18496,7 @@ packages: encoding: 0.1.13 json-parse-better-errors: 1.0.2 safe-buffer: 5.2.1 - dev: false + dev: true /node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} @@ -18423,7 +18540,7 @@ packages: /normalize-git-url@3.0.2: resolution: {integrity: sha512-UEmKT33ssKLLoLCsFJ4Si4fmNQsedNwivXpuNTR4V1I97jU9WZlicTV1xn5QAG5itE5B3Z9zhl8OItP6wIGkRA==} - dev: false + dev: true /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -18444,6 +18561,16 @@ packages: validate-npm-package-license: 3.0.4 dev: true + /normalize-package-data@6.0.0: + resolution: {integrity: sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + is-core-module: 2.13.1 + semver: 7.5.4 + validate-npm-package-license: 3.0.4 + dev: true + /normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -18467,15 +18594,28 @@ packages: /normalize-url@4.5.1: resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==} engines: {node: '>=8'} + dev: true /npm-git-info@1.0.3: resolution: {integrity: sha512-i5WBdj4F/ULl16z9ZhsJDMl1EQCMQhHZzBwNnKL2LOA+T8IHNeRkLCVz9uVV9SzUdGTbDq+1oXhIYMe+8148vw==} dev: true + /npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.5.4 + dev: true + /npm-normalize-package-bin@2.0.0: resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + /npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: true + /npm-package-arg@10.1.0: resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -18486,6 +18626,16 @@ packages: validate-npm-package-name: 5.0.0 dev: true + /npm-package-arg@11.0.1: + resolution: {integrity: sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + hosted-git-info: 7.0.1 + proc-log: 3.0.0 + semver: 7.5.4 + validate-npm-package-name: 5.0.0 + dev: true + /npm-package-arg@8.1.5: resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} engines: {node: '>=10'} @@ -18504,6 +18654,16 @@ packages: validate-npm-package-name: 4.0.0 dev: true + /npm-pick-manifest@9.0.0: + resolution: {integrity: sha512-VfvRSs/b6n9ol4Qb+bDwNGUXutpy76x6MARw/XssevE0TnctIKcmklJZM5Z7nqs5z5aW+0S63pgCNbpkUNNXBg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 11.0.1 + semver: 7.5.4 + dev: true + /npm-run-all@4.1.5: resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} engines: {node: '>= 4'} @@ -18563,7 +18723,7 @@ packages: /number-is-nan@1.0.1: resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} engines: {node: '>=0.10.0'} - dev: false + dev: true /nwsapi@2.2.7: resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} @@ -18751,7 +18911,7 @@ packages: execa: 1.0.0 lcid: 2.0.0 mem: 4.3.0 - dev: false + dev: true /os-locale@5.0.0: resolution: {integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==} @@ -18780,10 +18940,12 @@ packages: /p-cancelable@1.1.0: resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==} engines: {node: '>=6'} + dev: true /p-defer@1.0.0: resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==} engines: {node: '>=4'} + dev: true /p-defer@3.0.0: resolution: {integrity: sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==} @@ -18805,6 +18967,7 @@ packages: /p-is-promise@2.1.0: resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==} engines: {node: '>=6'} + dev: true /p-limit@1.3.0: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} @@ -18863,7 +19026,7 @@ packages: /p-map@1.2.0: resolution: {integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==} engines: {node: '>=4'} - dev: false + dev: true /p-map@3.0.0: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} @@ -18895,6 +19058,7 @@ packages: registry-auth-token: 4.2.2 registry-url: 5.1.0 semver: 6.3.1 + dev: true /parallel-transform@1.2.0: resolution: {integrity: sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==} @@ -18902,7 +19066,7 @@ packages: cyclist: 1.0.2 inherits: 2.0.4 readable-stream: 2.3.8 - dev: false + dev: true /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} @@ -18911,6 +19075,10 @@ packages: callsites: 3.1.0 dev: true + /parse-github-repo-url@1.4.1: + resolution: {integrity: sha512-bSWyzBKqcSL4RrncTpGsEKoJ7H8a4L3++ifTAbTFeMHyq2wRV+42DGmQcHIrJIvdcacjIOxEuKH/w4tthF17gg==} + dev: true + /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} @@ -18945,11 +19113,11 @@ packages: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} dependencies: parse5: 6.0.1 - dev: false + dev: true /parse5@5.1.1: resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} - dev: false + dev: true /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} @@ -19011,6 +19179,14 @@ packages: dependencies: path-root-regex: 0.1.2 + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.1.0 + minipass: 7.0.4 + dev: true + /path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -19178,6 +19354,7 @@ packages: /prepend-http@2.0.0: resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==} engines: {node: '>=4'} + dev: true /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} @@ -19232,6 +19409,7 @@ packages: /process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true /process-relative-require@1.0.0: resolution: {integrity: sha512-r8G5WJPozMJAiv8sDdVWKgJ4In/zBXqwJdMCGAXQt2Kd3HdbAuJVzWYM4JW150hWoaI9DjhtbjcsCCHIMxm8RA==} @@ -19241,6 +19419,7 @@ packages: /progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} + dev: true /promise-inflight@1.0.1(bluebird@3.7.2): resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} @@ -19251,7 +19430,7 @@ packages: optional: true dependencies: bluebird: 3.7.2 - dev: false + dev: true /promise-map-series@0.2.3: resolution: {integrity: sha512-wx9Chrutvqu1N/NHzTayZjE1BgIwt6SJykQoCOic4IZ9yUDjKyVYrpLa/4YCNsV61eRENfs29hrEquVuB13Zlw==} @@ -19268,7 +19447,15 @@ packages: dependencies: err-code: 1.1.2 retry: 0.10.1 - dev: false + dev: true + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true /promise.hash.helper@1.0.8: resolution: {integrity: sha512-KYcnXctWUWyVD3W3Ye0ZDuA1N8Szrh85cVCxpG6xYrOk/0CttRtYCmU30nWsUch0NuExQQ63QXvzRE6FLimZmg==} @@ -19316,7 +19503,7 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: false + dev: true /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} @@ -19330,7 +19517,7 @@ packages: duplexify: 3.7.1 inherits: 2.0.4 pump: 2.0.1 - dev: false + dev: true /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} @@ -19450,6 +19637,7 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 + dev: true /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -19504,6 +19692,7 @@ packages: safe-buffer: 5.1.2 string_decoder: 1.1.1 util-deprecate: 1.0.2 + dev: true /readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} @@ -19638,12 +19827,14 @@ packages: engines: {node: '>=6.0.0'} dependencies: rc: 1.2.8 + dev: true /registry-url@5.1.0: resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==} engines: {node: '>=8'} dependencies: rc: 1.2.8 + dev: true /regjsgen@0.2.0: resolution: {integrity: sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==} @@ -19660,6 +19851,34 @@ packages: dependencies: jsesc: 0.5.0 + /release-plan@0.4.1: + resolution: {integrity: sha512-aZ/dQCPnv1XksqhTk4wlhFTDbKpOry6pQrsUYINXYXecGE8DE3Wk6/UV5J9lpJeF7KbssA3dZsw28+ZItmmLlw==} + hasBin: true + dependencies: + '@ef4/lerna-changelog': 1.0.4 + '@npmcli/package-json': 5.0.0 + '@octokit/rest': 19.0.13 + '@types/fs-extra': 9.0.13 + '@types/js-yaml': 4.0.9 + '@types/semver': 7.5.6 + '@types/yargs': 17.0.32 + assert-never: 1.2.1 + chalk: 4.1.2 + cli-highlight: 2.1.11 + execa: 4.1.0 + fs-extra: 10.1.0 + globby: 11.1.0 + js-yaml: 4.1.0 + latest-version: 5.1.0 + parse-github-repo-url: 1.4.1 + semver: 7.5.4 + yargs: 17.7.2 + transitivePeerDependencies: + - bluebird + - encoding + - supports-color + dev: true + /remote-git-tags@3.0.0: resolution: {integrity: sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w==} engines: {node: '>=8'} @@ -19704,7 +19923,7 @@ packages: /require-main-filename@1.0.1: resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - dev: false + dev: true /require-relative@0.8.7: resolution: {integrity: sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==} @@ -19805,6 +20024,7 @@ packages: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: lowercase-keys: 1.0.1 + dev: true /restore-cursor@2.0.0: resolution: {integrity: sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==} @@ -19827,7 +20047,7 @@ packages: /retry@0.10.1: resolution: {integrity: sha512-ZXUSQYTHdl3uS7IuCehYfMzKyIDBNoAuUblvy5oGO5UJSUTmStUUVPXbA9Qxd173Bgre53yCQczQuHgRWAdvJQ==} - dev: false + dev: true /retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} @@ -19954,7 +20174,7 @@ packages: resolution: {integrity: sha512-ntymy489o0/QQplUDnpYAYUsO50K9SBrIVaKCWDOJzYJts0f9WH9RFJkyagebkw5+y1oi00R7ynNW/d12GBumg==} dependencies: aproba: 1.2.0 - dev: false + dev: true /rx-lite-aggregates@4.0.8: resolution: {integrity: sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==} @@ -20281,7 +20501,7 @@ packages: /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - dev: false + dev: true /snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} @@ -20358,7 +20578,7 @@ packages: dependencies: agent-base: 4.2.1 socks: 2.3.3 - dev: false + dev: true /socks@2.3.3: resolution: {integrity: sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==} @@ -20366,7 +20586,7 @@ packages: dependencies: ip: 1.1.5 smart-buffer: 4.2.0 - dev: false + dev: true /sort-keys@2.0.0: resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} @@ -20517,7 +20737,7 @@ packages: resolution: {integrity: sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==} dependencies: figgy-pudding: 3.5.2 - dev: false + dev: true /stable@0.1.8: resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} @@ -20558,11 +20778,11 @@ packages: dependencies: end-of-stream: 1.4.4 stream-shift: 1.0.1 - dev: false + dev: true /stream-shift@1.0.1: resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==} - dev: false + dev: true /strict-uri-encode@1.1.0: resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==} @@ -20587,7 +20807,7 @@ packages: code-point-at: 1.1.0 is-fullwidth-code-point: 1.0.0 strip-ansi: 3.0.1 - dev: false + dev: true /string-width@2.1.1: resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} @@ -20613,6 +20833,15 @@ packages: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + /string.prototype.matchall@4.0.10: resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} dependencies: @@ -20633,6 +20862,7 @@ packages: call-bind: 1.0.5 define-properties: 1.2.1 es-abstract: 1.22.3 + dev: true /string.prototype.trim@1.2.8: resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} @@ -20663,6 +20893,7 @@ packages: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} dependencies: safe-buffer: 5.1.2 + dev: true /string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -20693,6 +20924,13 @@ packages: dependencies: ansi-regex: 5.0.1 + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + /strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -20726,6 +20964,7 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} + dev: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -21155,13 +21394,13 @@ packages: engines: {node: '>=0.8'} dependencies: thenify: 3.3.1 - dev: false + dev: true /thenify@3.3.1: resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} dependencies: any-promise: 1.3.0 - dev: false + dev: true /thread-loader@3.0.4(webpack@5.89.0): resolution: {integrity: sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==} @@ -21182,7 +21421,7 @@ packages: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - dev: false + dev: true /through2@3.0.2: resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} @@ -21265,6 +21504,7 @@ packages: /to-readable-stream@1.0.0: resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==} engines: {node: '>=6'} + dev: true /to-regex-range@2.1.1: resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==} @@ -21531,7 +21771,7 @@ packages: /typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - dev: false + dev: true /typescript-memoize@1.1.1: resolution: {integrity: sha512-GQ90TcKpIH4XxYTI2F98yEQYZgjNMOGPpOgdjIBhaLaWji5HPWlRnZ4AeA1hfBxtY7bCGDJsqDDHk/KaHOl5bA==} @@ -21606,13 +21846,13 @@ packages: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: unique-slug: 2.0.2 - dev: false + dev: true /unique-slug@2.0.2: resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} dependencies: imurmurhash: 0.1.4 - dev: false + dev: true /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} @@ -21622,7 +21862,7 @@ packages: /universal-user-agent@6.0.1: resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} - dev: false + dev: true /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -21686,6 +21926,7 @@ packages: engines: {node: '>=4'} dependencies: prepend-http: 2.0.0 + dev: true /url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -22073,7 +22314,7 @@ packages: /which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - dev: false + dev: true /which-typed-array@1.1.13: resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} @@ -22098,6 +22339,14 @@ packages: dependencies: isexe: 2.0.0 + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 3.1.1 + dev: true + /wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} dependencies: @@ -22139,7 +22388,7 @@ packages: dependencies: string-width: 1.0.2 strip-ansi: 3.0.1 - dev: false + dev: true /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} @@ -22158,6 +22407,15 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -22249,11 +22507,11 @@ packages: /y18n@3.2.2: resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - dev: false + dev: true /y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} - dev: false + dev: true /y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} @@ -22284,7 +22542,7 @@ packages: resolution: {integrity: sha512-CswCfdOgCr4MMsT1GzbEJ7Z2uYudWyrGX8Bgh/0eyCzj/DXWdKq6a/ADufkzI1WAOIW6jYaXJvRyLhDO0kfqBw==} dependencies: camelcase: 4.1.0 - dev: false + dev: true /yargs@11.1.1: resolution: {integrity: sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==} @@ -22301,7 +22559,7 @@ packages: which-module: 2.0.1 y18n: 3.2.2 yargs-parser: 9.0.2 - dev: false + dev: true /yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} diff --git a/test-packages/release/.gitignore b/test-packages/release/.gitignore deleted file mode 100644 index 2e2f15e2e..000000000 --- a/test-packages/release/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/node_modules -/src/**/*.js -/src/**/*.d.ts -/src/**/*.map - diff --git a/test-packages/release/package.json b/test-packages/release/package.json deleted file mode 100644 index f7cff1d2e..000000000 --- a/test-packages/release/package.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "@embroider/release", - "version": "0.0.0", - "private": true, - "bin": { - "embroider-release": "./src/cli.js" - }, - "dependencies": { - "@ef4/lerna-changelog": "^1.0.4", - "@octokit/rest": "^19.0.8", - "@types/fs-extra": "^9.0.12", - "@types/js-yaml": "^4.0.5", - "@types/semver": "^7.3.6", - "@types/yargs": "^17.0.3", - "assert-never": "^1.2.1", - "chalk": "^4.1.1", - "cli-highlight": "^2.1.11", - "execa": "^4.0.3", - "fs-extra": "^10.0.0", - "globby": "^11.0.3", - "js-yaml": "^4.1.0", - "latest-version": "^5.0.0", - "semver": "^7.3.5", - "yargs": "^17.0.1" - } -} diff --git a/test-packages/release/src/change-parser.ts b/test-packages/release/src/change-parser.ts deleted file mode 100644 index 325df7ded..000000000 --- a/test-packages/release/src/change-parser.ts +++ /dev/null @@ -1,123 +0,0 @@ -export type Impact = 'major' | 'minor' | 'patch'; -export type UnlabeledSection = { unlabeled: true; summaryText: string }; -export type LabeledSection = { packages: string[]; impact: Impact; heading: string }; -export type Section = LabeledSection | UnlabeledSection; -export interface ParsedChangelog { - sections: Section[]; -} - -const knownSections: Record = { - ':boom: Breaking Change': { - impact: 'major', - }, - ':rocket: Enhancement': { - impact: 'minor', - }, - ':bug: Bug Fix': { - impact: 'patch', - }, - ':memo: Documentation': { - impact: 'patch', - }, - ':house: Internal': { - impact: 'patch', - }, - ':question: Unlabeled': { - unlabeled: true, - }, -}; - -const ignoredSections = [/Committers: \d+/]; - -function sectionHeading(line: string): string | undefined { - if (line.startsWith('#### ')) { - return line.slice(5); - } -} - -function stillWithinSection(lines: string[]): boolean { - return lines.length > 0 && !sectionHeading(lines[0]); -} - -function consumeSection(lines: string[]) { - let matchedLines = []; - while (stillWithinSection(lines)) { - matchedLines.push(lines.shift()); - } - return matchedLines; -} - -function parseSection(lines: string[]): Section | undefined { - let line = lines.shift(); - const heading = line ? sectionHeading(line) : undefined; - if (!heading) { - return; - } - - let sectionConfig = knownSections[heading]; - if (!sectionConfig) { - if (ignoredSections.some(pattern => pattern.test(heading))) { - consumeSection(lines); - return; - } - throw new Error(`unexpected section: ${heading}`); - } - - if ('unlabeled' in sectionConfig) { - return { unlabeled: true, summaryText: consumeSection(lines).join('\n') }; - } - - let packages = new Set(); - while (stillWithinSection(lines)) { - let packageList = parsePackageList(lines); - if (packageList) { - for (let pkg of packageList) { - packages.add(pkg); - } - } - } - return { - packages: [...packages], - impact: sectionConfig.impact, - heading, - }; -} - -function parsePackageList(lines: string[]): string[] | undefined { - let line = lines.shift(); - if (!line) { - return; - } - if (line === '* Other') { - return; - } - if (line.startsWith('* `')) { - let parts = line.slice(2).split(/,\s*/); - if (!parts.every(p => p.startsWith('`') && p.endsWith('`'))) { - throw new Error(`don't understand this line: ${line}.`); - } - return parts.map(p => p.slice(1, -1)); - } -} - -export function parseChangeLog(src: string): ParsedChangelog { - let lines = src.split('\n'); - let sections = []; - while (lines.length > 0) { - let section = parseSection(lines); - if (section) { - sections.push(section); - } - } - return { sections }; -} - -export function parseChangeLogOrExit(src: string): ParsedChangelog { - try { - return parseChangeLog(src); - } catch (err) { - console.error(err); - console.error(`the full changelog that failed to parse was:\n${src}`); - process.exit(-1); - } -} diff --git a/test-packages/release/src/cli.ts b/test-packages/release/src/cli.ts deleted file mode 100644 index 5a2869290..000000000 --- a/test-packages/release/src/cli.ts +++ /dev/null @@ -1,104 +0,0 @@ -import yargs from 'yargs/yargs'; -import type { Argv } from 'yargs'; - -import { readFileSync } from 'fs'; -import { parseChangeLogOrExit } from './change-parser'; -import { publish } from './publish'; - -yargs(process.argv.slice(2)) - .usage( - `Most of the subcommands in here exist so you can easily test parts of the release process by themselves. To do an actual release, see RELEASE.md.` - ) - .scriptName('release') - .command( - 'prepare', - `Edits the package.json and changelog files to prepare for release.`, - yargs => fromStdin(yargs), - async function (opts) { - let { prepare } = await import('./prepare'); - let solution = await prepare(await newChangelogContent(opts)); - let { explain } = await import('./plan'); - process.stdout.write(explain(solution)); - process.stdout.write(`\nSuccessfully prepared released\n`); - } - ) - .command( - 'publish', - `Publishes an already-prepared released by tagging, pushing tags, creating GitHub release, and publishing to NPM.`, - yargs => - yargs - .option('skipRepoSafetyCheck', { - type: 'boolean', - description: - 'Allows you to run "publish" even if there are uncommitted changes in your repo. Useful only for developing "publish" itself.', - }) - .option('otp', { - type: 'string', - description: 'This is an OTP that will be passed to npm publish', - }) - .option('dryRun', { - type: 'boolean', - description: 'Run through the release, but log to stdout instead of tagging/pushing/publishing', - }), - async function (opts) { - await publish(opts); - } - ) - .command( - 'gather-changes', - `Uses lerna-changelog to build a description of all the PRs in the release.`, - yargs => yargs, - async function (/* opts */) { - let { gatherChanges } = await import('./gather-changes'); - process.stdout.write(await gatherChanges()); - } - ) - .command( - 'parse-changes', - `Parse the summary of changes into a structured format`, - yargs => fromStdin(yargs), - async function (opts) { - let { parseChangeLogOrExit } = await import('./change-parser'); - console.log(JSON.stringify(parseChangeLogOrExit(await newChangelogContent(opts)), null, 2)); - } - ) - .command( - 'discover-deps', - `Summarizes how all our published packages relate to each other`, - yargs => yargs, - async function (/* opts */) { - let { publishedInterPackageDeps } = await import('./interdep'); - console.log(publishedInterPackageDeps()); - } - ) - .command( - 'explain-plan', - `Explains which packages need to be released at what versions and why.`, - yargs => fromStdin(yargs), - async function (opts) { - let { planVersionBumps, explain } = await import('./plan'); - let solution = planVersionBumps(parseChangeLogOrExit(await newChangelogContent(opts))); - console.log(explain(solution)); - } - ) - .demandCommand() - .strictCommands() - .help().argv; - -function fromStdin(yargs: Argv) { - return yargs.option('fromStdin', { - type: 'boolean', - description: 'Read the summary of changes from stdin instead of building them from scratch.', - }); -} - -async function newChangelogContent(opts: { fromStdin: boolean | undefined }) { - let content: string; - if (opts.fromStdin) { - content = readFileSync(process.stdin.fd, 'utf8'); - } else { - let { gatherChanges } = await import('./gather-changes'); - content = await gatherChanges(); - } - return content; -} diff --git a/test-packages/release/src/gather-changes.ts b/test-packages/release/src/gather-changes.ts deleted file mode 100644 index 06c2d3f34..000000000 --- a/test-packages/release/src/gather-changes.ts +++ /dev/null @@ -1,6 +0,0 @@ -import execa from 'execa'; - -export async function gatherChanges() { - let result = await execa('pnpm', ['lerna-changelog', '--next-version', 'Release'], { cwd: __dirname }); - return result.stdout; -} diff --git a/test-packages/release/src/highlight.ts b/test-packages/release/src/highlight.ts deleted file mode 100644 index 957314907..000000000 --- a/test-packages/release/src/highlight.ts +++ /dev/null @@ -1,13 +0,0 @@ -import highlight from 'cli-highlight'; -import chalk from 'chalk'; - -export function highlightMarkdown(md: string): string { - return highlight(md, { - language: 'Markdown', - theme: { - section: chalk.blueBright, - string: chalk.hex('#0366d6'), - link: chalk.dim, - }, - }); -} diff --git a/test-packages/release/src/interdep.ts b/test-packages/release/src/interdep.ts deleted file mode 100644 index b5e1f06cf..000000000 --- a/test-packages/release/src/interdep.ts +++ /dev/null @@ -1,58 +0,0 @@ -import glob from 'globby'; -import { resolve, join } from 'path'; -import { readFileSync, readJSONSync } from 'fs-extra'; -import yaml from 'js-yaml'; - -export type Range = `workspace:${string}`; - -export interface PkgEntry { - version: string; - pkgJSONPath: string; - isDependencyOf: Map; - isPeerDependencyOf: Map; -} - -export function publishedInterPackageDeps(): Map { - let rootDir = resolve(__dirname, '..', '..', '..'); - let packages: Map = new Map(); - - let pkgJSONS: Map = new Map(); - - for (let pattern of (yaml.load(readFileSync(resolve(__dirname, '../../../pnpm-workspace.yaml'), 'utf8')) as any) - .packages) { - for (let dir of glob.sync(pattern, { cwd: rootDir, expandDirectories: false, onlyDirectories: true })) { - let absolutePkgJSONPath = resolve(rootDir, dir, 'package.json'); - let pkg = readJSONSync(absolutePkgJSONPath); - if (pkg.private) { - continue; - } - pkgJSONS.set(pkg.name, pkg); - packages.set(pkg.name, { - version: pkg.version, - pkgJSONPath: join(dir, 'package.json'), - isDependencyOf: new Map(), - isPeerDependencyOf: new Map(), - }); - } - } - - for (let [consumerName, consumerPkgJSON] of pkgJSONS) { - // no devDeps because changes to devDeps shouldn't ever force us to - // release - for (let section of ['dependencies', 'peerDependencies'] as const) { - if (consumerPkgJSON[section]) { - for (let [depName, depRange] of Object.entries(consumerPkgJSON[section] as Record)) { - if (depRange.startsWith('workspace:')) { - let dependency = packages.get(depName); - if (!dependency) { - throw new Error(`broken "workspace:" reference to ${depName} in ${consumerName}`); - } - let field = section === 'dependencies' ? ('isDependencyOf' as const) : ('isPeerDependencyOf' as const); - dependency[field].set(consumerName, depRange as Range); - } - } - } - } - } - return packages; -} diff --git a/test-packages/release/src/plan.ts b/test-packages/release/src/plan.ts deleted file mode 100644 index 1ad68b507..000000000 --- a/test-packages/release/src/plan.ts +++ /dev/null @@ -1,241 +0,0 @@ -import type { Impact, ParsedChangelog } from './change-parser'; -import { publishedInterPackageDeps } from './interdep'; -import assertNever from 'assert-never'; -import { inc, satisfies } from 'semver'; -import { highlightMarkdown } from './highlight'; -import chalk from 'chalk'; -import { resolve } from 'path'; -import { existsSync, readJSONSync, writeJSONSync } from 'fs-extra'; - -export type Solution = Map< - string, - | { impact: undefined; oldVersion: string } - | { - impact: Impact; - oldVersion: string; - newVersion: string; - constraints: { impact: Impact; reason: string }[]; - pkgJSONPath: string; - } ->; - -class Plan { - #constraints: Map; - #pkgs: ReturnType; - - constructor() { - this.#pkgs = publishedInterPackageDeps(); - - // initialize constraints for every published package - let constraints = new Map(); - for (let pkg of this.#pkgs.keys()) { - constraints.set(pkg, []); - } - this.#constraints = constraints; - } - - addConstraint(packageName: string, impact: Impact, reason: string): void { - let pkgConstraints = this.#constraints.get(packageName); - if (!pkgConstraints) { - let err = new Error(`unknown package "${packageName}"`); - (err as any).unknownPackage = true; - throw err; - } - if (!pkgConstraints.some(existing => existing.impact === impact && existing.reason === reason)) { - pkgConstraints.push({ impact, reason }); - this.#propagate(packageName, impact); - } - } - - solve(): Solution { - let solution: Solution = new Map(); - for (let [pkgName, entry] of this.#pkgs) { - let constraints = this.#constraints.get(pkgName)!; - let impact = this.#sumImpact(constraints); - if (!impact) { - solution.set(pkgName, { impact: undefined, oldVersion: entry.version }); - } else { - let newVersion = inc(entry.version, impact)!; - solution.set(pkgName, { - impact, - oldVersion: entry.version, - newVersion, - constraints, - pkgJSONPath: entry.pkgJSONPath, - }); - } - } - return solution; - } - - #expandWorkspaceRange(range: `workspace:${string}`, availableVersion: string): string { - // this implements PNPM's rules for how workspace: protocol dependencies get - // expanded into proper semver ranges. - switch (range) { - case 'workspace:*': - return availableVersion; - case 'workspace:~': - return `~${availableVersion}`; - case 'workspace:^': - return `^${availableVersion}`; - default: - return range.slice(10); - } - } - - #propagate(packageName: string, impact: Impact) { - let entry = this.#pkgs.get(packageName)!; - let minNewVersion = inc(entry.version, impact)!; - for (let [consumerName, workspaceRange] of entry.isDependencyOf) { - this.#propagateDep(packageName, minNewVersion, 'dependencies', consumerName, workspaceRange); - } - for (let [consumerName, workspaceRange] of entry.isPeerDependencyOf) { - this.#propagateDep(packageName, minNewVersion, 'peerDependencies', consumerName, workspaceRange); - } - } - - #propagateDep( - packageName: string, - minNewVersion: string, - section: 'dependencies' | 'peerDependencies', - consumerName: string, - workspaceRange: `workspace:${string}` - ) { - let entry = this.#pkgs.get(packageName)!; - - let oldRange = this.#expandWorkspaceRange(workspaceRange, entry.version); - if (!satisfies(minNewVersion, oldRange)) { - switch (section) { - case 'dependencies': - this.addConstraint(consumerName, 'patch', `Has dependency ${'`'}${workspaceRange}${'`'} on ${packageName}`); - break; - case 'peerDependencies': - this.addConstraint( - consumerName, - 'major', - `Has peer dependency ${'`'}${workspaceRange}${'`'} on ${packageName}` - ); - break; - default: - throw assertNever(section); - } - } - } - - #sumImpact(impacts: { impact: Impact }[]): Impact | undefined { - if (impacts.some(i => i.impact === 'major')) { - return 'major'; - } - if (impacts.some(i => i.impact === 'minor')) { - return 'minor'; - } - if (impacts.some(i => i.impact === 'patch')) { - return 'patch'; - } - } -} - -function impactLabel(impact: Impact | undefined, text?: string) { - switch (impact) { - case undefined: - return chalk.gray(text); - case 'patch': - return chalk.blueBright(text); - case 'minor': - return chalk.greenBright(text); - case 'major': - return chalk.redBright(text); - } -} - -function capitalize(s: string): string { - return s[0].toUpperCase() + s.slice(1); -} - -export function explain(solution: Solution) { - let output: string[] = []; - - for (let priority of ['major', 'minor', 'patch'] as const) { - if ([...solution].some(entry => entry[1].impact === priority)) { - output.push(impactLabel(priority, capitalize(priority))); - output.push(''); - - for (let [pkgName, entry] of solution) { - if (entry.impact === priority) { - output.push(` ${impactLabel(entry.impact, pkgName)} from ${entry.oldVersion} to ${entry.newVersion}`); - for (let constraint of entry.constraints) { - if (constraint.impact === entry.impact) { - output.push(` - ${constraint.reason}`); - } - } - } - } - output.push(''); - } - } - - if ([...solution].some(entry => entry[1].impact === undefined)) { - output.push(impactLabel(undefined, 'Unreleased')); - output.push(''); - for (let [pkgName, entry] of solution) { - if (entry.impact === undefined) { - output.push(`## ${pkgName}`); - output.push(` ${impactLabel(entry.impact, pkgName)} unchanged`); - } - } - output.push(''); - } - - return output.join('\n'); -} - -export function planVersionBumps(changed: ParsedChangelog): Solution { - let plan = new Plan(); - for (let section of changed.sections) { - if ('unlabeled' in section) { - process.stderr.write( - highlightMarkdown( - `# Unlabeled Changes\n\n${section.summaryText}\n\n*Cannot plan release until the above changes are labeled*.\n` - ) - ); - process.exit(-1); - } - - for (let pkg of section.packages) { - plan.addConstraint(`@embroider/${pkg}`, section.impact, `Appears in changelog section ${section.heading}`); - } - } - - return plan.solve(); -} - -function solutionFile(): string { - return resolve(__dirname, '..', '..', '..', '.release-plan.json'); -} - -export function saveSolution(solution: Solution, description: string): void { - writeJSONSync(solutionFile(), { solution: Object.fromEntries(solution), description }, { spaces: 2 }); -} - -export function loadSolution(): { solution: Solution; description: string } { - try { - if (!existsSync(solutionFile())) { - let err = new Error(`No such file ${solutionFile()}`); - (err as any).code = 'ENOENT'; - throw err; - } - let json = readJSONSync(solutionFile()); - return { - solution: new Map(Object.entries(json.solution)), - description: json.description, - }; - } catch (err) { - process.stderr.write( - `Unable to load release plan file. You must run "embroider-release prepare" first to create the file.\n` - ); - if (err.code !== 'ENOENT') { - console.error(err); - } - process.exit(-1); - } -} diff --git a/test-packages/release/src/prepare.ts b/test-packages/release/src/prepare.ts deleted file mode 100644 index 3bd7a10e5..000000000 --- a/test-packages/release/src/prepare.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { parseChangeLogOrExit } from './change-parser'; -import { readFileSync, writeFileSync } from 'fs'; -import { resolve } from 'path'; -import type { Solution } from './plan'; -import { planVersionBumps, saveSolution } from './plan'; -import { readJSONSync, writeJSONSync } from 'fs-extra'; -import { relativeToAbsolute } from './utils'; - -const changelogPreamble = `# Embroider Changelog -`; - -function updateChangelog(newChangelogContent: string, solution: Solution): string { - let targetChangelogFile = resolve(__dirname, '..', '..', '..', 'CHANGELOG.md'); - let oldChangelogContent = readFileSync(targetChangelogFile, 'utf8'); - if (!oldChangelogContent.startsWith(changelogPreamble)) { - process.stderr.write(`Cannot parse existing changelog. Expected it to start with:\n${changelogPreamble}`); - process.exit(-1); - } - oldChangelogContent = oldChangelogContent.slice(changelogPreamble.length); - - let [firstNewLine, ...restNewLines] = newChangelogContent.trim().split('\n'); - - let newOutput = firstNewLine + '\n\n' + versionSummary(solution) + '\n' + restNewLines.join('\n') + '\n'; - writeFileSync(targetChangelogFile, changelogPreamble + '\n' + newOutput + oldChangelogContent); - return newOutput; -} - -function versionSummary(solution: Solution): string { - let result: string[] = []; - for (let [pkgName, entry] of solution) { - if (entry.impact) { - result.push(`${pkgName} ${entry.newVersion} (${entry.impact})`); - } - } - return result.join('\n'); -} - -function updateVersions(solution: Solution) { - for (let entry of solution.values()) { - if (entry.impact) { - let pkg = readJSONSync(relativeToAbsolute(entry.pkgJSONPath)); - pkg.version = entry.newVersion; - writeJSONSync(relativeToAbsolute(entry.pkgJSONPath), pkg, { spaces: 2 }); - } - } -} - -export async function prepare(newChangelogContent: string) { - let changes = parseChangeLogOrExit(newChangelogContent); - let solution = planVersionBumps(changes); - updateVersions(solution); - let description = updateChangelog(newChangelogContent, solution); - saveSolution(solution, description); - return solution; -} diff --git a/test-packages/release/src/publish.ts b/test-packages/release/src/publish.ts deleted file mode 100644 index 410e1ea81..000000000 --- a/test-packages/release/src/publish.ts +++ /dev/null @@ -1,243 +0,0 @@ -import execa from 'execa'; -import type { Solution } from './plan'; -import { loadSolution } from './plan'; -import { Octokit } from '@octokit/rest'; -import { absoluteDirname } from './utils'; -import latestVersion from 'latest-version'; - -async function hasCleanRepo(): Promise { - let result = await execa('git', ['status', '--porcelain=v1'], { cwd: __dirname }); - return result.stdout.length === 0; -} - -function tagFor(pkgName: string, entry: { newVersion: string }): string { - return `v${entry.newVersion}-${pkgName.replace(/^@embroider\//, '')}`; -} - -function info(message: string) { - process.stdout.write(`\n ℹī¸ ${message}`); -} - -function success(message: string) { - process.stdout.write(`\n 🎉 ${message} 🎉\n`); -} - -class IssueReporter { - hadIssues = false; - reportFailure(message: string): void { - this.hadIssues = true; - process.stderr.write(message); - } -} - -async function doesTagExist(tag: string) { - let { stdout } = await execa('git', ['ls-remote', '--tags', 'origin', '-l', tag]); - - return stdout.trim() !== ''; -} - -async function makeTags(solution: Solution, reporter: IssueReporter, dryRun: boolean): Promise { - for (let [pkgName, entry] of solution) { - if (!entry.impact) { - continue; - } - try { - let tag = tagFor(pkgName, entry); - let cwd = absoluteDirname(entry.pkgJSONPath); - - let preExisting = await doesTagExist(tag); - - if (preExisting) { - info(`The tag, ${tag}, has already been pushed up for ${pkgName}`); - return; - } - - if (dryRun) { - info(`--dryRun active. Skipping \`git tag ${tag}\``); - continue; - } - - await execa('git', ['tag', tag], { - cwd, - stderr: 'inherit', - stdout: 'inherit', - }); - } catch (err) { - console.error(err); - reporter.reportFailure(`Failed to create tag for ${pkgName}`); - } - } -} - -async function pushTags(reporter: IssueReporter, dryRun: boolean) { - if (dryRun) { - info(`--dryRun active. Skipping \`git push --tags\``); - return; - } - - try { - await execa('git', ['push', '--tags'], { cwd: __dirname }); - } catch (err) { - reporter.reportFailure(`Failed to git push`); - } -} - -function chooseRepresentativeTag(solution: Solution): string { - for (let [pkgName, entry] of solution) { - if (entry.impact) { - return tagFor(pkgName, entry); - } - } - process.stderr.write('Found no releaseable packages in the plan'); - process.exit(-1); -} - -async function doesReleaseExist(octokit: Octokit, tagName: string, reporter: IssueReporter) { - try { - let response = await octokit.repos.getReleaseByTag({ - owner: 'embroider-build', - repo: 'embroider', - tag: tagName, - }); - - return response.status === 200; - } catch (err) { - if (err.status === 404) { - return false; - } - console.error(err.message); - reporter.reportFailure(`Problem while checking for existing GitHub release`); - } -} - -async function createGithubRelease( - octokit: Octokit, - description: string, - tagName: string, - reporter: IssueReporter, - dryRun: boolean -): Promise { - try { - let preExisting = await doesReleaseExist(octokit, tagName, reporter); - - if (preExisting) { - info(`A release with the name '${tagName}' already exists`); - return; - } - - if (dryRun) { - info(`--dryRun active. Skipping creating a Release on GitHub for ${tagName}`); - return; - } - - await octokit.repos.createRelease({ - owner: 'embroider-build', - repo: 'embroider', - tag_name: tagName, - body: description, - }); - } catch (err) { - console.error(err); - reporter.reportFailure(`Problem while creating GitHub release`); - } -} - -async function doesVersionExist(pkgName: string, version: string, reporter: IssueReporter) { - try { - let latest = await latestVersion(pkgName, { version }); - return Boolean(latest); - } catch (err) { - if (err.name === 'VersionNotFoundError') { - return false; - } - - console.error(err.message); - reporter.reportFailure(`Problem while checking for existing npm release`); - } -} - -async function pnpmPublish(solution: Solution, reporter: IssueReporter, dryRun: boolean, otp?: string): Promise { - for (let [pkgName, entry] of solution) { - if (!entry.impact) { - continue; - } - - let preExisting = await doesVersionExist(pkgName, entry.newVersion, reporter); - - if (preExisting) { - info(`${pkgName} has already been publish @ version ${entry.newVersion}`); - return; - } - - if (dryRun) { - info( - `--dryRun active. Skipping \`pnpm publish --access=public${ - otp ? ' --otp=*redacted*' : '' - }\` for ${pkgName}, which would publish version ${entry.newVersion}` - ); - continue; - } - - try { - const args = ['publish', '--access=public']; - - if (otp) { - args.push(`--otp=${otp}`); - } - - await execa('pnpm', ['publish', '--access=public'], { - cwd: absoluteDirname(entry.pkgJSONPath), - stderr: 'inherit', - stdout: 'inherit', - }); - } catch (err) { - reporter.reportFailure(`Failed to pnpm publish ${pkgName}`); - } - } -} - -export async function publish(opts: { skipRepoSafetyCheck?: boolean; dryRun?: boolean; otp?: string }) { - let dryRun = opts.dryRun ?? false; - - if (!opts.skipRepoSafetyCheck) { - if (!(await hasCleanRepo())) { - process.stderr.write(`You have uncommitted changes. -To publish a release you should start from a clean repo. Run "embroider-release prepare", then commit the changes, then come back and run "embroider-release publish. -`); - process.exit(-1); - } - } - - let { solution, description } = loadSolution(); - - if (!process.env.GITHUB_AUTH) { - process.stderr.write(`\nYou need to set GITHUB_AUTH.`); - process.exit(-1); - } - - let octokit = new Octokit({ auth: process.env.GITHUB_AUTH }); - - let representativeTag = chooseRepresentativeTag(solution); - - // from this point forward we don't stop if something goes wrong, we just keep - // track of whether anything went wrong so we can use the right exit code at - // the end. - let reporter = new IssueReporter(); - - await makeTags(solution, reporter, dryRun); - await pnpmPublish(solution, reporter, dryRun, opts.otp); - await pushTags(reporter, dryRun); - await createGithubRelease(octokit, description, representativeTag, reporter, dryRun); - - if (reporter.hadIssues) { - process.stderr.write(`\nSome parts of the release were unsuccessful.\n`); - process.exit(-1); - } else { - if (dryRun) { - success(`--dryRun active. Would have successfully published release!`); - return; - } - - success(`Successfully published release`); - } -} diff --git a/test-packages/release/src/utils.ts b/test-packages/release/src/utils.ts deleted file mode 100644 index 17e33c6d3..000000000 --- a/test-packages/release/src/utils.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { dirname, join, resolve } from 'path'; - -export const root = resolve(__dirname, '../../../'); - -export function relativeToAbsolute(repoRelative: string) { - return join(root, repoRelative); -} - -export function absoluteDirname(repoRelative: string) { - return dirname(relativeToAbsolute(repoRelative)); -}